В статье рассматривается вопрос сокрытия портов используемых
какими-либо программами или демонами. Подразумевается протокол
tcp, хотя некоторые выкладки применимы и к udp (даже еще и проще).
В принципе, сокрытие трояна и работа с ним может также осуществляться
и через icmp, но целью данной статьи было рассмотрение сокрытия
именно портов.
Предположим, мы поставили на хост-жертву руткит - вроде все круто,
система затроянена, и, находясь на данной машине, мы уже с трудом
сможем обнаружить этого трояна, а если еще и сам кернел затроянен,
то это достаточно не тривиальная задача. Но админ додумался просканировать
данную машину с других хостов и определить, что открыт порт, который
ранее не использовался на данной машине. Удостоверившись в отношении
того, что данный порт не должен быть здесь открыт, - он проводит
анализ системы и обнаруживает ваш руткит, патчит систему и все
больше у вас этого шела нет.
Теперь рассмотрим, как нам можно обмануть сканер, чтобы нас нельзя
было обнаружить. Как известно установка соединения происходит
в 3 этапа - это так называемое "three-way hand shake"
(rfc793).
Для начала рассмотрим стандартную установку соединения.
На первом этапе мы получаем запрос на соединения в форме - SYN.
Далее мы отправляем свой запрос на соединение и подтверждаем
прием последовательности - SYN, ACK.
И, наконец, мы получаем подтверждение приема нашей последовательности.
Таким образом, соединение успешно установлено.
Теперь посмотрим, что происходит в случае отказа сервера от соединения
(т.е. если, например, у нас порт не открыт).
Мы получили запрос на соединение - SYN.
Т.к. порт не слушается, то ядро отвечает ответом - RST, ACK.
Т.е. соединение не установлено - в общем случае это означает,
что порт не слушается, либо там установлен и грамотно настроен
межсетевой экран.
По спецификации TCP не оговаривается передача данных именно после
установления соединения, т.е. при желании можно подкрутить клиент
и сервер, чтоб первый отправлял данные в 1-ом SYN пакете, а второй
считал данные из этого SYN пакета. Т.е. таким образом, мы можем
произвести идентификацию (проверка доступности пользователю данного
ресурса) клиента. В случае если клиент не прошел идентификацию
- не верная строка или вообще данные отсутствуют, то сервер должен
послать ему RST. При таком раскладе, простой порт сканер не сможет
определить реально открытый порт, а специально подкрученный сканер
уязвимостей не сможет пройти идентификацию - что позволит нам
сохрани тмммь невид имость. Идентификация по адресу и порту не
рассматривается, в связи с возможностью компрометации - хотя бы
тем же самым spoofing'ом.
Для улучшения системы защиты нашего порта можно добавить еще
и аутентификацию (проверка пользователя на соответствие). Т.е.,
предположим, соединение осуществляется только при условии, что
строка идентифицирована. Для аутентификации клиента можно использовать
криптографию с открытым ключом. У клиента находится секретный
ключ, которым он зашифровывает строку для идентификации и некоторую
случайную последовательность. Получившуюся строку отправляем серверу
вместе со случайной последовательностью. На стороне сервера находится
публичный ключ (ну не будем же мы в тылу врага оставлять секретный
ключ) которым происходит расшифровка строки, которая затем разбивается
для проверки с внутренней строкой и полученной случайной последовательностью.
Таким образом, мы снижаем вероятность обнаружения нашего трояна
- даже если появится специализированный сканер (хотя в при условии
применения криптографии это сделать затруднительно) нашего руткита,
да и в трафике не будет видно реальной строки для идентификации.
В принципе, можно вообще весь трафик между клиентом и сервером
шифровать.
Итак, при соответствующем уровне "невидимости" нашего
руткита на хосте-жертве (сокрытие процессов, открытых портов и
т.п.) - путем сокрытия порта мы можем повысить его прозрачность
и для постороннего взгляда извне - получаем практически пожизненный
шел (пока кому-нить не вздумается переставить систему), или нас
не выдаст какой-нибудь IDS, обнаруживший подозрительный трафик
на неизвестный порт с условием того что он еще и закрыт.
автор - by D0minat0r
|