Раздел: Документация
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
|