Объяснительная записка
 
23.03.2004
Андрей Соколов


 
<< стр. 1
стр. 2

-  Вычисляется 32-разрядное число (указатель на адрес памяти в контексте сервиса SVCHOST), которое содержит машинный код, соответствующий команде JMP ESP процессора x86. Используемый мною эксплойт заботливо снабжен универсальными (соответствующими любой локализации ОС) константами для Windows 2000 (0x0018759F) и Windows XP (0x0100139d). Как видим, JMP ESP лежит непосредственно в коде процесса SVCHOST5 (код dll6 обычно начинается с семерок). Тот факт, что код, соответствующий JMP ESP, принадлежит процессу SVCHOST, делает эксплойт универсальным и не зависящим от dll, которые могут быть заменены вследствие установки каких-либо патчей или апгрейдов. Только изменение кода SVCHOST может нарушить работу эксплойта.

- Найденное число помещается в то место, где должен находиться адрес возврата из функции, принимающей данные извне. При выходе из функции (это должно произойти после приема данных и выполнения каких-то небольших связанных с этим вычислений) исполнится команда RET, и управление будет передано на наше число, которое содержит указатель на JMP ESP. Далее управление прыгнет по адресу, содержащему машинный код JMP ESP. Эта инструкция исполнится, и управление будет передано на адрес, содержащийся в регистре ESP, то есть в самое начало переполненного буфера.

Это общий принцип работы эксплойтов, ориентированных на переполнение буфера. Вместо JMP ESP может использоваться JMP EBP (значение базового регистра при переполнении буфера также может быть предсказуемым), последовательность инструкций POP REG/POP REG/RET и многие другие опкоды процессора x86, с помощью которых можно получить управление на код, внедряемый эксплойтом в переполняемый буфер удаленного процесса.

- Подготовленный нами шеллкод исполнится и повиснет процессом, ожидающим соединение на порт, который я задал при запуске эксплойта (2000/tcp). Эксплойт совершает соединение на порт 2000 удаленной системы и получает доступ к командной строке.

Надо сказать, что любая неточность в этой операции приведет к отказу в обслуживании сервиса RPC DCOM, и для следующей попытки нужно дожидаться перезагрузки системы.

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

Я тут же попытался соединиться со своим персональным ftp-сервером, чтобы взять троянскую программу, но то ли внимательный специалист из PT Security заметил мои манипуляции и начал перегружать компьютер, то ли я допустил какую-то неточность, и попытка не удалась7. После перезагрузки на удаленной стороне установили патч от MS Blast, а я получил задание прочитать файл extra1.txt в папке extras и продолжил.

Следующий эксплойт, вторая версия уязвимости сервиса RPC DCOM, использует более сложную технику исполнения шеллкода. Уязвимость основана на переполнении кучи. Это событие провоцирует вызов обработчика исключительных ситуаций для фиксирования и правильной обработки ошибки. Эксплойт формирует группу пакетов, которая, аналогично предыдущему случаю, отправляется на уязвимый сервис и выходит за пределы отведенного ей пространства. Указатель на дефолтный обработчик исключительных ситуаций (который находится рядом в переполняемой куче) замещается адресом вызова функции SetUnhandledExceptionFilter() — она устанавливает общий обработчик исключений для всех потоков процесса, и в качестве аргумента к ней выставляется адрес, по которому доступен код JMP ESP.

Таким образом, при переполнении кучи управление передается на JMP ESP и оттуда — на шеллкод. Шеллкод для второго эксплойта прописывает пользователя с именем «a» и пустым паролем в группе «Администраторы». Адрес JMP ESP в эксплойте был прописан значением 0x00081EEB, соответствующим пропатченному сервису SVCHOST, а вот значение обработчика исключений не подошло к моему случаю. Методом проб и ошибок, я нашел константу, ею оказалось число 0x77ED63B4 из kernel32.dll.

Итак, атака прошла успешно, пользователь с именем «а» и пустым паролем в группе «Администраторы» был создан, специалист из PT Security это моментально увидел и перезагрузил машину: прочитать заданный файл мне не удалось.

Все последующие атаки привели лишь к отказу в обслуживании. Сервис Messenger, применяющийся для доставки сообщений на экран пользователя, уязвим аналогичным предыдущему случаю способом, однако подыскать корректный адрес функции SetUnhandledExceptionFilter() я не смог. Парсер SSL-сертификатов ASN.1 тоже не устоял перед атакой в обслуживании, но, cудя по информации из Интернета, с помощью этой атаки исполнить шеллкод возможным не представляется.

Одна интересная DoS-атака, которую я применял, заключается в исчерпании ресурсов сервисом UPnP на порту 1900/udp. Отправив особый udp-пакет

NOTIFY * HTTP/1.1\n
HOST: 239.255.255.250:1900\n
CACHE-CONTROL: max-age=1\n
LOCATION: http://XX.XX.XX.XX:19/\n
NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1\n
NTS: ssdp:alive\n
SERVER: QB0X/201 UPnP/1.0 prouct/1.1\n
USN: uuid:QB0X\n

в порт 1900 уязвимой машины, можно заставить сервис UPnP соединиться с адресом XX.XX.XX.XX по порту 19, на котором, как правило, крутится юниксовый сервис chargen (он занимается лишь тем, что отправляет бесконечное число ASCII-символов с максимально доступной в пределах соединения скоростью). Chargen не разрывает соединение и будет накачивать клиента трафиком до тех пор, пока тот не отсоединится, а уязвимый UPnP, в свою очередь, не намерен отсоединяться самостоятельно. Таким образом, имеет место возможность неограниченного заполнения памяти компьютера с уязвимым UPnP, что приведет к исчерпанию ресурсов и неконтролируемому свопингу системы. Вместо XX.XX.XX.XX я ввел адрес одного из крупных роутеров в Рунете, имеющего открытым 19-й tcp-порт, и специалист из PT Security подтвердил быстрое заполнение памяти компьютера.

После этого на удаленной машине были деинсталлированы все заплатки, специалист из PT Security настроил компьютер-жертву вручную, а я прогнал все свои эксплойты заново. Ни разу мне не удалось ни получить доступа, ни даже спровоцировать отказ в обслуживании (DoS).

Попытка резюме

Скептикам:
- Windows XP (если не брать в расчет IE, который только Microsoft считает частью операционной системы) защищена гораздо лучше, чем кажется.

Параноикам:
- Самое уязвимое место системы — Internet Explorer, и отказ от использования дефолтного браузера может значительно повысить устойчивость системы к взлому.
- Для собственного успокоения следует установить первый сервис-пак и все необходимые апдейты (на прорехи в реализации RPC DCOM и UPnP). Если лень качать — отключите соответствующие сервисы руками. Провайдеры частенько закрывают «опасные» порты, но лучше подстраховаться.
- Поставить файрволл (стандартный файрволл Windows XP, увы, не лучший вариант, поскольку обращает внимание только на входящие пакеты; но есть несколько очень приличных бесплатных файрволлов: Kerio Personal Firewall (www.kerio.com), Agnitum Outpost (www.agnitum.com), Zone Alarm (www.zonelabs.com) и др.

Ленивым:
- Отказаться от использования Outlook (Express) в качестве почтовой программы.
- И вообще, при выборе ПО — ориентироваться на менее распространенный вариант (вместо ICQ — Miranda, вместо Outlook — TheBat! и т. п.). Правило не универсальное, но полезное.

Оптимистам:
- Если на вашей машине есть что-то действительно ценное, то, что бы вы ни делали, ее все равно взломают. В крайнем случае — ломом.


5 Имеется в виду svchost.exe. — Прим. ред.
6 DLL (Dinamic Link Library) — динамически подключаемая библиотека. Библиотечный файл в Windows, содержащий набор исполняемых модулей, компоновка с которыми выполняется не до загрузки файла, а при появлении ссылки на модуль во время исполнения программы.
7 Никаких действий, способных помешать взломщику, с нашей стороны не проводилось. Заметив, что Андрей что-то усердно качает на свою машину, мы решили признать первую попытку взлома удачной, пропатчились и перезагрузились. — Прим. ред.



 
<< стр. 1
стр. 2

<<Трое в лодке (не считая эксплойта)
Все материалы номера
Моя ХРепость >>