Побег через брандмаузер

         

Fork exploit или брандмаузер продолжает молчать


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

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

В UNIX-системах есть замечательный системный вызов fork, расщепляющий текущий процесс и автоматически раздваивающий червя. В Windows9x/NT осуществить такую операцию намного сложнее, однако, все же не так сложно, как это кажется на первый взгляд. Один из возможных способы реализации выглядит приблизительно так: сначала вызывается функция CreateProcess с установленным флагом CREATE_SUSPENDED (создание процесса с его немедленным "усыплением"), затем из процесса выдирается текущий контекст (это осуществляется вызовом функции GetThreadContext) и значение регистра EIP устанавливается на начало блока памяти, выделенного функцией VirtualAllocEx. Вызов SetThreadContext обновляет содержимое контекста, а функция WriteProcessMemory внедряет в адресное пространство процесса shell-код, после чего процесс пробуждается, разбуженный функцией ResumeThread и shell-код начинает свое выполнение.

Против этого приема не существует никаких адекватных контрмер противодействий и единственное, что можно порекомендовать – это избегать использования уязвимых приложений вообще.



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