8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 55 56 57 58 59 60 61 ... 102

Глава 5. Побег через брандмаузер плюс терминала ----1111г5Ция

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

узел, пытаясь установить соединение каждый час или даже каждые i

секунд, однако это будет слишком заметно, и к тому же атакующему по CK0JIbl((>

ся постоянный IP, которым не так-то просто завладеть анонимно (т,г - У**-

VFHC. э 5j

Attack vulnerable service

Buffer Overflow

Reverse connect blocked by firewall

Server;: Shellcode creates a new socket

Рис. 5.5. Атакующий открывает на своем узле новый порт N, засылает shell-код на уязвимый сервер, откуда shell-код устанавливает с узлом атакующего исходящее соединение, безжалостно блокируемое правильно настроенным брандмауэром

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

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

«поползновения» в сторону узла хакера) так или иначе отображается

лога*

.................—...... -----f—j j—......-I--/ --...........-----

и к хакеру в срочном порядке отправляется бригада карателей быстра у

рования («нэхорошо паступаешь дарагой, да?»)

FIND EXPLOIT, ИЛИ МОЛЧАНИЕ БРАНДМАУЗЕРА

Если в процессе оперативно-воспитательной работы вместе с ушами хакеру оторвут еще кое-что, до него, может быть, наконец дойдет, что уставав-новые TCP/IP-соединепия с атакуемым сервером не нужно! Вместо эТ°г° 0in но воспользоваться уже существующим соединением, легальным ° I установленным с сервером!


Shellcode reuse current connection to spawn a shell

Buffer Overflow

Shellcode loops to find current socket descriptor

H"c S к .

ПеРеб АтакУюЩий засылает на уязвимый сервер shell-код, который методом «тупого» с уз °Ра находит сокет уже установленного соединения и связывается ЭТа<ующего, не вызывая никаких подозрений р°нь1 брандмаузера

тностн. можно гарантировать, что на публичном web-сервере будет обяза-ВЧ,1С оТКрыт 80-й порт, иначе ни один пользователь внешней сети не сможет П"ЧЬН°паботать. Поскольку HTTP-протокол требует двухстороннего TCP/IP- ""нения, атакующий может беспрепятственно отправлять shell-коду зловред-"С* команды и получать назад ответы. Алгоритм атаки в общем виде выглядит "гшзителыютак: атакующий устанавливаете уязвимым сервером TCP/IP-"чинйис- притворись невинной овечкой, мирно пасущейся на бескрайних 1 юсторах Интернета, но вместо честного запроса "GET" он подбрасывает серве-"уэчовредный shell-код, переполняющий буфер и захватывающий управление. Брандмаузер, довольно смутно представляющий себе особенности программной реализации сервера, не видит в таком пакете ничего дурного и благополучно его пропускает.

Между тем shell-код, слегка обжившись на атакованном сервере, вызывает функцию recv, передавая ей дескриптор уже установленного TCP/IP-соедипения, — того самого, через которое он и был заслан, — подтягивая свое основное тело. Совершенно ничего не подозревающий брандмаузер и эти пакеты пропускает тоже, ничем не выделяя их в логах (рис. 5.6).

Проблема в том, что shell-код не знает дескриптора «своего» соединения и потому не может этим соединением напрямую воспользоваться. Но тут на помощь приходит функция getpeername, сообщающая, с каким удаленным адресом и портом установлено соединение, ассоциированное с данным дескриптором (если дескриптор не ассоциирован ни с каким соединением, функция возвращает ошибку). Поскольку и в Windows 9x/NT, и в UNIX дескрипторы выражаются небольшим положительным целым числом, вполне реально за короткое время перебрать их все, после чего shell-коду останется лишь определить: какое из всех TCP/IP соединении «его». Это легко. Ведь IP-адрес в порт атакующего узла ему хорошо известны (ну должен же он помнить, откуда он только что пришел!), достаточно выполнить тривиальную проверку »а совпадение — вот и все.


184 Глава 5. Побег через брандмаузер плюс терминализация всей

Программная реализация головы червя в несколько упрощенном виде мсок выглядеть, например, так (листинг 5.3).

Листинг 5.3. Ключевой фрагмент shell-кода, осуществляющий поиск сокета «своего» соединения

// шаг 1: перебираем все дескрипторы сонетов один за другим

for (а = 0: а < MAX SOCKET: а++)

{

*buff =0: // очищаем имя сокета

// шаг 2: получаем адрес, связанный с данным дескриптором

// (конечно, при условии, что с ним вообще что-то связно)

if (getpeername((SOCKET) a. (struct sockaddr*) Sfaddr. (int *) buff) != -1)

{

// шаг 3: идентифицируем свое TCP/IP-соединение по своему порту if (htons(faddr.sin port) == HACKERS PORT)

sshelК(SOCKET) a. MAX BUF SIZE):

// шаг 4: подчищаем за собой следы с 1 osesocket(fsocket):

Откомпилировав демонстрационный пример find.c, запустите его на атакуемом узле, а на узле атакующего наберите: netcat "адрес атакуемого" 666. Убедитесь, что никакие, даже самые жесткие и недемократичные настройки брандмаузе-ра, не препятствуют нормальной жизнедеятельности червя. Внимательнейшим образом изучите все лога — вы не видите в них ничего подозрительного? Вот! Я тоже не вижу. И хотя IP-адрес атакующего в них исправно присутствует, он ничем не выделяется среди сотен тысяч адресов остальных пользователей, и разоблачить хакера можно лишь просмотром содержимого всех ТСР/1Р-пакетов. Пакеты, отправленные злоумышленником, будут содержать shell-код, который легко распознать на глаз. Однако, учитывая, что каждую секунду сервер перелопачивает не один мегабайт информации, просмотреть все пакеты становится просто нереально, а автоматизированный поиск требует вирусной сигнатур1*1 которой на латентной стадии эпидемии еще ни у кого нет.

REUSE EXPLOIT, ИЛИ МОЛЧАНИЕ БРАНДМАУЗЕРАII

Допустим, разработчики операционных систем исправят свой грубый ля» с скрипторами сокетов, равномерно рассеяв их по всему 32-битному пР°сТ0 ству, что сделает лобовой перебор довольно неэффективным, 0С°бенН° „й

в функции getpeername будет встроен детектор такого перебора, реагирУ в случае подозрения на атаку все возрастающим замедлением. И что тогда. чего! Опытные хакеры (и грамотно спроектированные черви) перейдут К ну «Б», насильно делая re-bind уже открытому порту.

Возможность повторного использования адресов — это вполне легальна*, можность и предусмотрена она не случайно. В противном случае проект ш



0 ... 55 56 57 58 59 60 61 ... 102