Массрутинг в локальной сети

Posted by admin On Сентябрь - 5 - 2009

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

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

МЕТАСПЛОЙТ —ХР— MS08_067 — DB_UT0PWN

В джентльменском наборе пентестера мета-сплойт занимает отнюдь не последнее место, позволяя быстро проверить машинки и, по возможности, их поломать. Конечно, не 0-day, но тем не менее. В общем-то, если не брать в расчет установку nmap и, соответственно, winpcap, проблем с созданием портативной сборки не было. Но тут я наткнулся на EasyHack otSKVOZ be за май 2009) - про реализацию массрутинга с помощью метасплойта. Тема меня дико заинтересовала, и я решил ее развить.
Честно сказать, с метасплойтом я до этого особенно и не работал. Так, баловался разными сплойтами, не дальше user guide. Но идея массрутинга реально зацепила. Более того, у меня было стойкое ощущение, что после эпидемии conficker найти тачки с юзабельной дыркой проблематично. Напомню, что SKVOZ предлагал использовать связку nmap и метасплойт как раз для массрутинга дыры MS08JD67. Ради интереса я повторил эксперимент в своей локалке и был приятно удивлен. Более четверти машин выбросили рутовые шеллы. Еще больше обрадовал тот факт, что сам эксплойт мог бы быть и другим. Только за 2009 год Microsoft уже опубликовала порядка 20 критических уязвимостей. Одна из них — ms09-001 — также связана с SMB. Эксплойта под нее пока нет, но, возможно, это только вопрос времени.

Однако не все так сладко. Нарисовалось несколько проблем, которые требовали решения. Допустим, у тебя есть шелл. Классика жанра требует создания нового пользователя и добавления его в локальную группу администраторов (или снятия хешей паролей, или просто замены пароля локального админа). В российских реалиях подавляющее большинство машин в локалке(я говорю о клиентских тачках под WinXP) работают под локализованной осью, а, значит, локальная группа носит название «Администраторы». Попробуй вбить в удаленной консоли «Администраторы» и тебя накроет глубочайшее чувство обиды. Да-да. извечная проблема с кодировками. Консоль работает под ср866, Windows — под ср1251, никсы и вовсе под KoiS-гили Unicode. Метасплойтже и нагрузки, типа meterpreter, в принципе не понимают русскую локаль. Отсюда на ровном месте мы получаем нехилую проблему. В сетке эта тема достаточно широко обсуждается. В конечном итоге все ссылаются на один и тот же патч (trac.metasploit.com/ticket/253]. Я накладывал патч, пробовал разные кодировки, но ни черта не получилось. Может, получится у тебя, но меня эта проблема окончательно добила, и я решил искать нормальное решение.

Итак, встала задача добавления пользователя в локальную группу администраторов посредством полученной консоли в условиях невозможности использовать символы кириллицы. План действий таков: пишем скрипт, реализующий необходимый функционал, каким-то образом заливаем его на подопытную тачку и исполняем. Скрипты я предпочитаю писать на AutolT, так что открываем SciTe из поставки AutolT и начинаем ваять. При этом хотелось бы сделать версию скрипта, независящую от локали, — то есть скрипт должен уметь автоматически определять название локальной группы администраторов. Известно, что системные группы в винде имеют предопределенные SID, в частности, SID группы администраторов имеет значение HneS-1-5-32-544. Для получения названия по SID предоставляется API-функция LookupAccountName, экспортируемая библиотекой AdvAPI32.dll. В автоит модуль Security. аиЗ предоставляет соответствующую функцию-обертку _5ecurity_LookupAccountName.
Этой функцией мы и воспользуемся (смотри файл user.au3 на DVD).

Вызов TraySetState с параметром 2 блокирует появление иконки AutolT в трее. Далее определяется имя группы администраторов, создается пользователь и добавляется в эту группу. Последний вызов модифицирует реестр, чтобы пользователь отсутствовал в списке интерактивного входа ХР.

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

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

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

Если доступен установочный дистрибутив (с CD или по сети), файлы будут автоматически заменены на оригинальные. Если нет, будет выброшено предупреждение о недоступности диска и предложение вставить диск либо принять новый файл. И хотя название файла не пишется, надо быть полным дауном, чтобы ответить «Да», на что я, естественно, полагаться не буду. Один из методов обхода заключается в необходимости загрузки в безопасном режиме, ноудаленно, к сожалению, этого не сделаешь. Поэтому все патчеры идут лесом, и мы будем ваять собственный, который подменял бы библиотеку из неинтерактивной сессии, да и еще как-то справлялся с защитой файлов.

Первая часть тривиальна, а вот со второй сложнее. Надо отследить появление окна и эмулировать нажатия на нужные кнопки. Положим, код для этого мы написали, но, запустив его из консоли metasploit. мы дико обломаемся, так как, не имея доступа к рабочему столу, окно он, естественно, не поймает, и никакие сигналы послать не сможет. На выручку, как обычно, приходит планировщик задач, позволяющий запускать проги в интерактивном режиме. Идея в том, чтобы поставить задачу эмуляции пользовательских действий на выполнение в интерактивном режиме. Далее — дождаться ее запуска и уже потом подменять нужные файлы. Смотри на DVD полный код скрипта под названием final.au3, а я тем временем поясню, что к чему. Я весь функционал засунул в один файл, поэтому сначала проверяю, с какими аргументами запущен бинарник. Если присутствует ключ fsp, значит, будем ждать появления окна и щелкать по кнопкам. Определить идентификационные данные окна и кнопок можно с помощью Au3lnfo из сборки AutolT. После этого я отправляю машину в перезагрузку, дав юзеру 2 минуты на сохранение результатов работы. Если ключ fsp не задан, скрипт выполняет свою основную задачу.

Сначала инициализируются необходимые переменные и осуществляется работа по созданию нового администратора. Затем производятся телодвижения касательно реестра и нетшелла, цель которых — открытие доступа к RDP. Дальше проверяется версия ОС и, если она не ХР, работа скрипта прекращается. Если же на узле установлена ХР, с помощью sc поднимается сервис планировщика, и на выполнение ставится наш же скрипт, но с ключом fsp. Подождав, пока планировщик запустит задачу, скрипт реализует подмену библиотеки. Для этого переименовывается текущая dll (если запущена служба TermService, библиотека будет заблокирована, и удалить ее не получится), а новая dll копируется в %systemroot%\ system32\DLLCache (чтобы невозможно было восстановить исходную версию из кэша), и, наконец, подменяется сама библиотека в %systemroot%\system32. После сборки я упаковал собранный экзешник и библиотеку в самораспаковывающийся архив. Архив настроил на распаковку в %temp%, автоматическую перезапись всех файлов (кстати, не перезаписывает — доказано), и запуск %temp%\final.exe по окончании распаковки. Хочешь протестировать? Бери psexec и запусти архив на удаленной машине. Через примерно три минуты подключайся по RDP. У меня все получилось, так что двигаемся дальше.

При всей своей простоте и удобстве использования SMB — жутко глючная штука. Ктомуже, из всехтехнологий, реализованных Microsoft, это наверное, одна из самых корявых (не считая осла). Тот же метасплойт несет в себе 1А сплойтов для smb; не за горами и новые дырки. Ну а мы пока воспользуемся ms08_067, как наиболее свежей и, пока еще, достаточно пробивной. Проблема кроется в библиотеке netapi32.dll, а точнее, в функции wcscat (по крайней мере, та к ее использовал conficker). Для удаленного доступа используется RPC-Bbi3OBcUUIDAb32Afc8-1670-01d3-1278-5a47bf6ee188, то есть — обращение к интерфейсу srvsvc. Чтобы не мучить пользователей локалки, было решено создать тестовый стенд. Я накатил образ винды на VmWare с обновлениями, вышедшими до октября 2008 года (тогда появился патч), немного его подстроил и клонировал в трех вариантах. Итак, получена локальная минисеть, на которой можно оттачивать мастерство автосплойта. Моим удивлению и досаде не было предела, когда попытка применить метасплойтовский ms08_067 окончилась неудачей! Та же история постигла и милвормовский вариант, причем последний выплюнул ошибку«Маке 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_ 0BJECT_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=162WordCount=0)». Уже другое, но все равно не то. В случае явного указания цели эксплойттакже не работал. Однако если сменить пайп с BROWSER на SRVSVC. можно получить заветный шелл. Конечно, здорово, но для реализации нужно заранее знать версию операционной системы на удаленной машине, что для автосплойта совсем не катит. Но ведь я пробовал сплойт на локалке, и он работал! Оставалась последняя надежда — расшарить какую-нибудь папку. Это ничуть не изменило картину. Я готов уже был рвать на себе волосы и крушить-ломать все подряд. От бессилия я стал гуглить и наткнулся на какой-то баглист, в котором парень писал о жутких терках с фаером. Тогда так. Запускаем и сразу же останавливаем чудо-мегафаер мелкомягких… Эксплойт работает, как миленький! Причем на обоих пайпах одинаково хорошо определяет версии сервис пака и создает любезные глазу сессии. Итак, с тестовой настройкой я определился, расклонировал систему и получил стенд из трех уязвимых машин.

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

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

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