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

         

Find exploit или молчание брандмаузера


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

В частности, можно гарантировать, что на публичном WEB-сервере будет обязательно открыт 80-порт, иначе ни один пользователь внешней сети не сможет с ним работать. Поскольку, HTTP-протокол требует двухстороннего TCP/IP-соединения, атакующий может беспрепятственно отправлять shell-коду зловредные команды и получать назад ответы. Алгоритм атаки в общем виде выглядит приблизительно так: атакующий устанавливает с уязвимым сервером TCP/IP-соединение, притворясь невинной овечкой, мирно пасущейся на бескрайних просторах Интернета, но вместо честного запроса "GET" он подбрасывает серверу зловредный shell-код, переполняющий буфер и захватывающий управление. Брандмаузер, довольно смутно представляющий себе особенности программной реализации сервера, не видит в таком пакете ничего дурного и благополучно его пропускает.

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

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



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