
Более быстрый и эффективный сканер SYN без сохранения состояния и сборщик баннеров благодаря использованию пользовательского стека TCP/IP.
ОБЗОР
polarbearscan — это попытка выполнять захват баннеров и сканирование портов быстрее и эффективнее. Он объединяет две разные идеи, которые, надеюсь, сделают его достойным вашего внимания и времени.
Первая идея — использовать статическое SYN-сканирование с криптографически защищёнными cookie для разбора входящих подтверждений. Насколько известно автору, эта техника была впервые применена Дэном Камински в scanrand. Scanrand, в свою очередь, был частью Paketto Keiretsu — набора утилит для сканирования, выпущенного где-то в 2001-2002 годах. Зеркало этого кода можно найти на Packet Storm [1].
Вторая идея — использовать модифицированный пользовательский TCP/IP-стек, чтобы сканер мог немедленно восстановить состояние при получении криптографически проверенного пакета с установленными флагами SYN и ACK. Пользовательский стек, используемый в polarbearscan, называется libuinet [2]. В отличие от некоторых других пользовательских TCP/IP-стеков, этот очень зрелый, поскольку является просто портом стека FreeBSD.
Модифицируя стек libuinet, можно создать сокет и завершить стандартное трёхстороннее TCP-рукопожатие, ответив правильным ACK. При таком подходе сразу устанавливается полностью функциональное TCP-соединение. Это отличается от других сканеров (например, nmap), которые, после обнаружения открытого TCP-порта, должны выполнить полное TCP-подключение через ядро для таких действий, как захват баннеров или сканирование версий. Полное TCP-подключение приводит к выполнению нового трёхстороннего рукопожатия, полностью отбрасывая неявное состояние, накопленное при обмене первыми двумя пакетами между хостами. Избегая этого, можно уменьшить использование пропускной способности и сразу перейти от обнаружения открытого порта к подключению к нему. Затем это соединение может просто пассивно принимать данные в режиме захвата баннеров или отправить HTTP-запрос.
Обратите внимание: сканер в настоящее время поддерживает только IPv4-сканирование и будет корректно работать только через интерфейсы Ethernet-типа (проводные или беспроводные). В ближайшее время поддержка IPv6 или других интерфейсов не планируется.
УСТАНОВКА
Компиляция кода довольно проста. Нужно лишь рабочее интернет-соединение и установленный git, чтобы можно было загрузить необходимые зависимости. Помимо этого, требуются стандартные утилиты разработки (gcc, make, patch), а также версии библиотек для разработки (pthread, pcap, OpenSSL). В дистрибутивах на основе Debian можно просто установить все пакеты, перечисленные в файле DEPENDENCIES. После этого достаточно ввести make, и внешние зависимости будут загружены через git, а весь сканер будет собран. Полученный бинарник можно скопировать в /usr/bin, /usr/local/bin или аналогичную директорию.
Если компиляция завершится ошибкой, отправьте письмо автору (контакты ниже), включив вывод ошибок, версию ядра, версию libc и любую другую информацию, которая может помочь воспроизвести и исправить проблему. Заранее благодарю за помощь.
ИСПОЛЬЗОВАНИЕ
Запуск инструмента должен быть довольно простым. Потребуются права root. Опция -h выводит краткую справку и объяснение опций. В большинстве случаев не требуется ничего, кроме указания типа сканирования, списка портов для сканирования и целевого IP-адреса или диапазона IP. Для IP-диапазонов поддерживается нотация CIDR.
Существует четыре типа сканирования, которые задаются с помощью -s<аргумент>.
-sB: Стандартный захват баннера. Сканер не отправляет никаких данных, а просто ожидает и принимает данные, отображая их до первого полученного перевода строки или возврата каретки.
-sH: Этот режим отправляет запрос "GET / HTTP/1.1" на каждое успешно установленное соединение. Очень полезен для быстрой идентификации HTTP-серверов.
-sT: Режим TLS-сканирования отправляет зондирующий пакет TLS 1.0 без опций и без указания алгоритмов. Однако если на принимающей стороне находится корректный TLS-сервер, он попытается разобрать и определить, является ли это допустимым ответом об ошибке TLS, который затем будет отображён.
-sC: Пользовательское сканирование, которое загружает полезную нагрузку из файла (задаётся с помощью -d) и отправляет эту нагрузку на каждый успешно установленный сокет. Может быть полезно для быстрого зондирования специфических протоколов.
-p: Список TCP-портов для сканирования. Может быть диапазоном портов или отдельными портами с диапазонами, разделёнными запятыми. Примеры: -p22,80,8080-9000,143 сканирует порты 22, 80, 143 и диапазон от 8080 до 9000.
-b <лимит>: Лимит пропускной способности для исходящих зондов. Не применяется к данным, отправляемым и принимаемым через сокеты, а только к отправляемым SYN-зондам. Примеры: -b300k, -b67m, -b500b зададут лимиты 300 кбит/с, 76 Мбит/с и 500 бит/с соответственно.
-d <имя_файла>: Имя файла, содержащего полезную нагрузку для пользовательского сканирования. Весь файл будет отправлен до максимума в 128 кБ, что должно быть более чем достаточно для большинства целей.
-t<таймаут>: Указывает количество секунд, которое сканер будет ожидать после отправки всех зондов, принимая данные обратно через всё ещё подключённые сокеты. Предполагается, что такие сокеты существуют; в противном случае он завершит работу, как только не останется задач.
-x: Принуждает инструмент всегда выводить полученные данные в шестнадцатеричном формате. В противном случае данные выводятся в шестнадцатеричном формате только при обнаружении непечатаемых символов.
-v: Включает подробный вывод. В основном полезно для отладки.
-i <интерфейс>: Интерфейс для выбора исходного IP-адреса и настройки бэкенда pcap. Обычно не требуется на стандартных машинах с одним правильно настроенным сетевым интерфейсом, но может понадобиться при наличии нескольких сетевых карт.
-r <зерно>: Зерно случайных чисел для ГСЧ. В основном полезно для отладки и обеспечения воспроизводимости последовательности пакетов. Аргумент — целое число, может быть задано в шестнадцатеричной или десятичной записи.
-T : Переопределить значение TTL по умолчанию для SYN-зондов. В целом не нужно, но включено для полноты.
-W <окно>: Переопределить размер окна TCP по умолчанию для SYN-зондов. В целом не нужно, но включено для полноты.
-I : Переопределить значение IP ID по умолчанию для SYN-зондов. В целом не нужно, но включено для полноты.
-n: Эту опцию следует использовать только если вы знаете, что делаете. Она заставляет инструмент НЕ устанавливать правило брандмауэра для блокировки всех исходящих RST-пакетов. Если она используется, сканер не будет создавать дочерние процессы, и вам придётся вручную задать это правило, иначе ядро будет отправлять RST-пакеты в ответ на каждый полученный SYN/ACK-пакет. Это сделает инструмент неработоспособным. Правило, которое устанавливается на Linux, выглядит так:
$ /sbin/iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP
-o: Эта опция отключает перенаправление ввода/вывода, позволяя видеть больше вывода внутренностей uinet. Добавлена только для полноты или для отладки, так как в остальном не очень полезна.
-h: Информация об использовании.
Несколько примеров использования инструмента. Для захвата баннера на порту 22 в диапазоне /24 используйте:
./pbscan -sB -p22 x.x.x.x/24
Для HTTP-сканирования нескольких распространённых HTTP-портов на одном IP-адресе с выводом в шестнадцатеричном режиме используйте:
./pbscan -sH -x -p80,8080-9000 x.x.x.x
Во время сканирования при нажатии клавиши на стандартном вводе выводятся некоторые статистические данные, такие как количество идентифицированных открытых портов, количество полученных корректных TCP-подтверждений, количество активных соединений и сколько SYN-зондов из общего числа уже отправлено. Это выглядит примерно так:
sent: 1.97% (of 254), open: 0, active: 2, acks: 2
АВТОР
Этот инструмент написал Винсент Берг. Свяжитесь со мной по электронной почте [email protected] или посетите мой веб-сайт http://santarago.org для получения обновлённых версий/новостей об этом сканере.
БЛАГОДАРНОСТИ
Большая благодарность нескольким людям, которые помогали с тестированием, портированием и сообщением об ошибках. Спасибо Эхабу, Джозефу, Алехандро, Джулиану и Диего.
ССЫЛКИ
[1] http://packetstormsecurity.com/files/30489/paketto-1.10.tar.gz.html