Архивы: по дате | по разделам | по авторам

Объяснительная записка

Архив
автор : Андрей Соколов   22.03.2004

Самый простой и очевидный способ получения несанкционированного доступа к чужому компьютеру — лобовые атаки уязвимых сервисов ОС

Самый простой и очевидный способ получения несанкционированного доступа к чужому компьютеру — лобовые атаки уязвимых сервисов ОС1.

В количественном отношении именно такие атаки представляют наибольшую угрозу безопасности пользователям домашних компьютеров. Это основной способ размножения автономных сетевых червей вроде знаменитого MS Blast, принесшего многомиллиардные убытки. Лобовые атаки — первый (и, как правило, единственный) аргумент взломщика-любителя, которому по каким-либо причинам потребовалось получить несанкционированный доступ к чужому компьютеру.

Действительно, не нужно быть семи пядей во лбу, чтобы отыскать, скачать и скомпилировать повсеместно доступные эксплойты2, реализующие ту или иную лобовую атаку на открытый вовне уязвимый сервис ОС Windows. И даже этого часто не требуется: многие эксплойты доступны в виде уже скомпилированных программ класса «нажал кнопку — получил результат».

Стандартный набор сервисов и соответствующих им портов в дефолтной инсталляции ОС Windows XP таков (см. табл. выше).

Не мудрствуя лукаво я скачал из Интернета несколько эксплойтов, реализующих лобовые атаки на сервисы ОС Windows XP. Часть из них была сделана «под Linux», поэтому для их компиляции я использовал среду cygwin, позволяющую портировать ПО из Linux в Windows. Для компиляции «родных» Windows-эксплойтов применялся компилятор Microsoft Visual C++ 6.0.

Тест на проникновение

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

Цель теста на проникновение: обнаружить слабые места в защите, осуществив показательный взлом системы.

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

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

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

Илья Медведовский
[idm at dsec.ru]

В успехе первой атаки можно было не сомневаться: в дефолтной инсталляции ОС Windows XP имеется уязвимость, активно используемая пресловутым сетевым червем MS Blast. Суть ее заключается в возможности переполнения буфера в службе RPC DCOM сервиса SVCHOST3.
Итак, я компилирую программу:

privacy@tinyghost/
$gcc oc192-dcom.c -o oc192-dcom.c
запускаю ее:
D:\cygwin>a.exe -d XXX.X.XXX.XX -t 0 -p 135 -l 2000
RPC DCOM remote exploit — .:[oc192.us]:. Security
[+] Resolving host..
[+] Done.
– Target: [Win2k-Universal]:127.0.0.1:135, Bindshell:2000, RET=[0x0018759f]
и спустя пару секунд, получаю…
[+] Connected to bindshell..
– bling bling –
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\WINNT\system32>
…доступ к командной строке.

Рассматриваемую уязвимость можно, без сомнения, назвать академической. Поэтому рассмотрю эксплойт в подробностях.
-  Создается очередь пакетов для провокации сервиса RPC DCOM по какому-либо из доступных на удаленной системе TCP-портов (в моем случае был выбран дефолтный 135-й) по протоколу RPC DCOM. Подготавливается шеллкод4, который должен исполниться после успешной атаки сервиса (удачное исполнение шеллкода и есть условие успеха атаки).



1 Под сервисом операционной системы понимается особый системный процесс, работающий с правами администратора и находящийся в состоянии приема внешних сетевых соединений. «Вступив в особые взаимоотношения с сервисом», взломщик может добиваться исполнения атакуемым сервисом нужного машинного кода и таким образом получать несанкционированный доступ к системе. Результатом успешной лобовой атаки может быть возврат соединения с командной строкой удаленной системе или создание дополнительного пользователя, которым взломщик может воспользоваться для дальнейшего проникновения в систему.
2 Сообщения о найденных уязвимостях распространяются в двух видах: Proof of Concept Theory (доказательство уязвимости в теории) и Proof of Concept Code (доказательство уязвимости в виде реализующего ее использование программного кода). Под эксплойтом, как правило, понимают последнее.
3 RPC DCOM (Remote Procedure Calls Distributed Common Object Model) — основная служба ОС Windows XP, предоставляющая унифицированный интерфейс доступа к ресурсам операционной системы. Посредством сетевых взаимоотношений через эту службу (tcp- и udp-порты 135, 139 и 445) решается широкий спектр задач, начиная от доступа к файлам и заканчивая администрированием системы.
4 Термин «шеллкод» (англ. shell code), дословно «код оболочки», исторически означает машинный код, предоставляющий доступ взломщику к командной строке взламываемой системы. В настоящее время под ним понимают любой машинный код, отправленный взломщиком и исполняемый на атакуемой системе. Почти все современные шеллкоды «завернуты» в XOR/ROR-обертки, модифицирующие внешний вид кода (но не причиняющие ущерба его содержанию), чтобы избегать специальных символов, которые могут оказаться специальными символами-разделителями (символы NULL, CR/LF, etc.) и спровоцировать буквальное их восприятие функцией, обрабатывающей переполняемый буфер.

-  Вычисляется 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 Никаких действий, способных помешать взломщику, с нашей стороны не проводилось. Заметив, что Андрей что-то усердно качает на свою машину, мы решили признать первую попытку взлома удачной, пропатчились и перезагрузились. — Прим. ред.

© ООО "Компьютерра-Онлайн", 1997-2024
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.