20 апреля, 2024

Как скрыть порт от сканирования?

В статье рассматривается вопрос сокрытия портов используемых какими-либо программами или демонами. Подразумевается протокол tcp, хотя некоторые выкладки применимы и к udp (даже еще и проще). В принципе, сокрытие трояна и работа с ним может также осуществляться и через icmp, но целью данной статьи было рассмотрение сокрытия именно портов.

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

Теперь рассмотрим, как нам можно обмануть сканер, чтобы нас нельзя было обнаружить. Как известно установка соединения происходит в 3 этапа — это так называемое «three-way hand shake» (rfc793).

Для начала рассмотрим стандартную установку соединения.
На первом этапе мы получаем запрос на соединения в форме — SYN.

Далее мы отправляем свой запрос на соединение и подтверждаем прием последовательности — SYN, ACK. И, наконец, мы получаем подтверждение приема нашей последовательности.

Таким образом, соединение успешно установлено.

Теперь посмотрим, что происходит в случае отказа сервера от соединения (т.е. если, например, у нас порт не открыт).

Мы получили запрос на соединение — SYN.

Т.к. порт не слушается, то ядро отвечает ответом — RST, ACK.
Т.е. соединение не установлено — в общем случае это означает, что порт не слушается, либо там установлен и грамотно настроен межсетевой экран.

Читать также:  Metasploit для начинающего хакера. Часть 13 (доставка полезных нагрузок под Windows)

По спецификации TCP не оговаривается передача данных именно после установления содинения, т.е. при желании можно подкрутить клиент и сервер, чтоб первый отправлял данные в 1-ом SYN пакете, а второй считал данные из этого SYN пакета. Т.е. таким образом, мы можем произвести идентификацию (проверка доступности пользователю данного ресурса) клиента. В случае если клиент не прошел идентификацию — не верная строка или вообще данные отсутствуют, то сервер должен послать ему RST. При таком раскладе, простой порт сканер не сможет определить реально открытый порт, а специально подкрученный сканер уязвимостей не
сможет пройти идентификацию — что позволит нам сохранить невидимость. Идентификация по адресу и порту не рассматривается, в связи с возможностью компрометации — хотя бы тем же самым spoofing’ом.

Для улучшения системы защиты нашего порта можно добавить еще и аутентификацию (проверка пользователя на соответствие). Т.е., предположим, соединение осуществляется только при условии, что строка идентифицирована. Для аутентификации клиента можно использовать криптографию с открытым ключом. У клиента находится секретный ключ, которым он зашифровывает строку для идентификации и некоторую случайную последовательность. Получившуюся строку отправляем серверу вместе со случайной последовательностью. На стороне сервера находится публичный ключ (ну не будем же мы в тылу врага оставлять секретный ключ) которым происходит расшифровка строки, которая затем разбивается для проверки с внутренней
строкой и полученной случайной последовательностью. Таким образом, мы снижаем вероятность обнаружения нашего трояна — даже если появится специализированный сканер (хотя в при условии применения криптографии это сделать затруднительно) нашего руткита, да и в трафике не будет видно реальной строки для идентификации. В принципе, можно вообще весь трафик между клиентом и сервером шифровать.

Читать также:  Как все контролировать с помощью беспроводного (Wi-Fi) управляющего реле, используя aRest

Итак, при соответствующем уровне «невидимости» нашего руткита на хосте-жертве (сокрытие процессов, открытых портов и т.п.) — путем сокрытия порта мы можем повысить его прозрачность и для постороннего взгляда извне — получаем практически пожизненный шел (пока кому-нить не вздумается переставить систему), или нас не выдаст какой-нибудь IDS, обнаруживший подозрительный трафик на неизвестный порт с условием того что он еще и закрыт.

Добавить комментарий