Как ускорить сканирование большого количества сайтов. Ч. 1: Interlace для многопоточного сканирования веб-приложений

Ускорение сканирования сайтов

Типичные сканеры веб приложений, которые используются для оценки безопасности сайтов, потребляют довольно мало ресурсов: это относится к центрольному процессору, оперативной памяти и даже нагрузке на сеть. При этом они работают достаточно долго — узким местом является скорость ответа удалённого хоста. То есть получается, что мы особо не можем повлиять на скорость сканирования.

Если вам нужно с помощью, допустим, Nikto просканировать несколько сотен сайтов (хостов), то это гарантировано затянется очень надолго. Если каждое сканирование вы будете запускать после предыдущего, то вам для этого нужно будет взять месячный отпуск на работе. Если вы их будете запускать одновременно в разных окнах терминала, но вручную, то это тоже довольно утомительно и важно ещё не запутаться с сохранением полученных результатов — при таком объёме работ это очень легко.

В качестве «более лучшего» решения приходит идея написать скрипт для автоматизации процесса — и такое движение от экстенсивного к интенсивному подходу является правильным. Но не все умеют писать скрипты. К тому же, нужно не просто написать команды, которые одновременно запустятся (скорее всего, это просто приведёт к зависанию операционной системы) — нужен какой-то контроль количества выполняемых задач и «дозапуск» новых по мере завершения предыдущими их работы. То есть нужно не просто написать скрипт — нужно написать ХОРОШИЙ скрипт.

К счастью для нас, уже есть готовый инструмент который делает именно то, что нужно. Причём таких инструментов даже два:

  • Interlace — инструмент созданный тестером на проникновение для одновременного сканирования большого количества целей. Благодаря своему предназначению, очень прост в использовании именно для сканирований очень большого числа целей.
  • Parallel — универсальная программа для запуска в параллели любых утилит и инструментов. Является ещё более гибкой, но и требует чуть больше усилий на изучение её синтаксиса.

Эта инструкция разбита на две части — и первая часть посвящена Interlace. В ней мы научимся пользоваться Interlace, посмотрим примеры потребления ресурсов компьютера и рассмотрим несколько практически примеров сканирования во много потоков и последующего анализа собранных данных.

Инструкция по Interlace

Про установку программы смотрите здесь: https://kali.tools/?p=4717

Суть работы Interlace в том, что она запускает много раз команду используя заданный шаблон. В этом шаблоне указывается исполнимый файл, а также строки подстановки, которые в реальной команде будут заменены, например, на цель или на отдельный для каждой цели файл сохранения результатов.

Начнём со знакомства с переменными (строками подстановки), которые можно использовать в шаблоне команды. В левой колонке переменная, которая в реальной команде будет заменена. А в правой колонке её описание и откуда берутся её значения:

Переменная Замена
_target_ Заменяется на цели, которые указаны с опциями -t или -tL.
_host_ Полный синоним _target_ - можно использовать любой вариант написания.
_output_ Заменяется на строку вывода, которая указана с опцией -o.
_port_ Заменяется на порты, указанные с опцией -p.
_realport_ Заменяется на настоящий порт, указанный с опцией -rp.
_proxy_ Заменяется на прокси, указанные с опцией -pL.

Запуск сканеров веб-приложений во много потоков

Итак, с некоторыми опциями мы уже познакомились из таблицы, также для запуска interlace нам необходимо знать об опции -c (после которой идёт шаблон команды) и опции -cL (с которой указывается файл, содержащий много шаблонов команд).

Предположим, мы хотим запустить программу Nikto в отношении нескольких целей.

Синтаксис запуска самой nikto в один поток:

nikto --host САЙТ

Чтобы результаты не пропали, сохраним их для каждого сканирования в отдельный файл:

nikto --host САЙТ > ./САЙТ-nikto.txt

Для построения шаблона программы interlace нам нужно использовать строку замены _target_ (которая обозначает сайты из списка целей), получаем:

nikto --host _target_ > ./_target_-nikto.txt

Теперь собираем саму команду interlace:

interlace -tL ./targets.txt -threads 5 -c "nikto --host _target_ > ./_target_-nikto.txt" -v

Здесь

  • interlace — исполнимый файл Interlace
  • -tL ./targets.txt — список файлов с целями
  • -threads 5 — означает запустить сканирования в 5 потоков
  • -c "nikto --host _target_ > ./_target_-nikto.txt" — шаблон команды, который мы составили чуть ранее
  • -v — увеличивает вербальность вывода (показывается больше информации)

Допустим, в файле targets.txt у нас всего две цели:

bugcrowd.com
hackerone.com

Тогда в результате работы предыдущей команды будет запущено два сканирования:

nikto --host hackerone.com > ./hackerone.com-nikto.txt
nikto --host bugcrowd.com > ./bugcrowd.com-nikto.txt

Рассмотрим ещё один простой пример, а затем перейдём к более сложным случаям. В качестве программы для сканирования я буду использовать WhatWeb — просто чтобы не дожидаться очень медленной Nikto.

Начну с того, что составлю список из целей:

curl -s https://top.mail.ru/Rating/Computers-Programming/Today/Visitors/{1..10}.html | grep -E '><a class="t90.*</a>' | sed 's/<br \/><a class="t90 t_grey" href="//' | grep -E -o '>.*<' | sed 's/>//' | sed 's/<//' > prog.txt
cat prog.txt | sed 's/https:\/\///' | sed 's/http:\/\///' | sed 's/\///' > prog_sites.txt

Всего в моём списке целей 300 сайтов:

cat prog_sites.txt | wc -l
300

И я хочу каждый из этих сайтов проверить с помощью программы WhatWeb (собирает информацию об используемых технологиях). 

Результаты я хочу сохранить в отдельную папку whatweb-results. Создаю эту папку:

mkdir ./whatweb-results

Итак, моя команда запуска:

interlace -tL ./prog_sites.txt -threads 100 -c "whatweb _target_ --colour never > ./whatweb-results/_target_-whatweb.txt" -v

Я запускаю в 100 процессов, поэтому центральный процессор (наконец-то!) на моём компьютере тоже загружен полностью:

Очень быстро — менее чем за минуту всё готово!

Теперь в папке whatweb-results у нас находится 300 файлов — для ускорения анализа можно, например, использовать поиск определённых слов. Вообще анализ зависит от используемого для сбора информации инструмента. Например, если использовался WPScan, то можно искать слово vulnerability или identified.

Рассмотрим несколько примеров анализа с помощью с grep.

Найдём сервера со старыми версиями PHP:

grep -E -H 'PHP\[5.1' whatweb-results/*

Вывод:

whatweb-results/jedit.ru-whatweb.txt:http://jedit.ru [200 OK] Apache[2.2.3], Cookies[PHPSESSID], Country[RUSSIAN FEDERATION][RU], Email[--Rating@Mail.ru], HTTPServer[CentOS][Apache/2.2.3 (CentOS)], IP[188.127.229.153], PHP[5.1.6], PasswordField[edit[pass]], PoweredBy[-drupal,drupal], Script[text/javascript], X-Powered-By[PHP/5.1.6]

Сайтов с PHP 5.1 всего одна штука. А сколько с PHP 5.2?

grep -E -H 'PHP\[5.2' whatweb-results/*

Вывод:

whatweb-results/apps-oracle.ru-whatweb.txt:http://apps-oracle.ru [200 OK] Country[RUSSIAN FEDERATION][RU], Email[--Rating@Mail.ru,Rating@Mail.ru], Google-Analytics [UA-25693489-1], HTTPServer[nginx-reuseport/1.13.4], IP[5.101.152.75], JQuery[1.11.3], MetaGenerator[WordPress 4.4.4], Open-Graph-Protocol[blog], PHP[5.2.17], Script[text/javascript], Title[APPS-ORACLE.RU], UncommonHeaders[link], WordPress[4.4.4], X-Powered-By[PHP/5.2.17], X-UA-Compatible[IE=EmulateIE7]

whatweb-results/blog.webitdesign.ru-whatweb.txt:http://blog.webitdesign.ru [301 Moved Permanently] Country[RUSSIAN FEDERATION][RU], HTTPServer[Gentoo Linux][nginx/1.15.8], IP[77.222.56.7], PHP[5.2.17-pl0-gentoo], RedirectLocation[http://www.blog.webitdesign.ru/], X-Powered-By[PHP/5.2.17-pl0-gentoo], nginx[1.15.8]

whatweb-results/blog.webitdesign.ru-whatweb.txt:http://www.blog.webitdesign.ru/ [200 OK] All-in-one-SEO-Pack[2.3.13.2], Country[RUSSIAN FEDERATION][RU], Email[--Rating@Mail.ru,Rating@Mail.ru], Frame, HTML5, HTTPServer[Gentoo Linux][nginx/1.15.8], IP[77.222.56.7], JQuery[1.12.4], PHP[5.2.17-pl0-gentoo], Script[javascript,javascript1.1,javascript1.2,javascript1.3,text/javascript], Title[Блог разработчика | Разработка на Oracle, Python], UncommonHeaders[link], WordPress, X-Powered-By[PHP/5.2.17-pl0-gentoo], X-UA-Compatible[IE=edge], nginx[1.15.8]

whatweb-results/delphimaster.net-whatweb.txt:http://delphimaster.net [200 OK] Cookies[PHPSESSID], Country[RUSSIAN FEDERATION][RU], Email[Rating@Mail.ru,xayam@yandex.ru], HTTPServer[openresty/1.13.6.2], IP[195.208.1.104], JQuery[1.3.2], OpenSearch[http://delphimaster.net/opensearch.xml], PHP[5.2.17], Script[JavaScript,text/javascript], Title[DMSearch 2.9 - поиск на форумах delphimaster за период 2002.01.08 - 2019.03.10], X-Powered-By[PHP/5.2.17]

whatweb-results/delphisite.ru-whatweb.txt:http://delphisite.ru [200 OK] Cookies[SESS05472d46f4cbfa316697cfba96fb5b1d], Country[RUSSIAN FEDERATION][RU], probably Drupal, DublinCore, Email[--Rating@Mail.ru], HTTPServer[nginx], IP[195.114.3.241], PHP[5.2.17], Script[text/javascript], Title[Всё для программирования в среде Delphi | DelphiSite], X-Powered-By[PHP/5.2.17], nginx

whatweb-results/gamebox-alex.pp.ua-whatweb.txt:http://gamebox-alex.pp.ua [200 OK] Abyss-Web-Server[2.5.0.0-X2-Win32], Country[RUSSIAN FEDERATION][RU], Email[--Rating@Mail.ru], Google-Analytics[Universal] [UA-65855299-1], HTTPServer[Windows (32 bit)][Abyss/2.5.0.0-X2-Win32 AbyssLib/2.5.0.0], IP[37.61.183.193], PHP[5.2.6], Script[text/javascript], X-Powered-By[PHP/5.2.6]

whatweb-results/grafika.me-whatweb.txt:http://grafika.me [200 OK] Apache[2.2.9][mod_ssl/2.2.9], Cookies[SESSb8f3849a2a2de4b277ddee5ed791d52f], Country[ESTONIA][EE], Drupal, Email[Rating@Mail.ru], HTML5, HTTPServer[Debian Linux][Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny9 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g], IP[5.45.114.12], JQuery, OpenSSL[0.9.8g], PHP[5.2.6-1+lenny9][Suhosin-Patch], PasswordField[pass], Script[text/javascript], Title[Компьютерная графика и вычислительная геометрия | Компьютерная графика], X-Powered-By[PHP/5.2.6-1+lenny9]

whatweb-results/snakeproject.ru-whatweb.txt:http://snakeproject.ru [200 OK] Apache[2.2.22][mod_fcgid/2.3.8-dev], Cookies[PHPSESSID], Country[RUSSIAN FEDERATION][RU], Email[Rating@Mail.ru], Frame, Google-Analytics[Universal] [UA-36867057-1], HTML5, HTTPServer[Unix][Apache/2.2.22 (Unix) mod_fcgid/2.3.8-dev], IP[81.177.143.36], JQuery, PHP[5.2.17], Script[text/javascript], Title[snakeproject.ru - Python уроки, Python и Django, запросы SQL и T-SQL, настройка cisco, asterisk, freebsd, серверов], Via-Proxy[1.0 1gb-proxy-l24-aux7 (squid/3.1.16)], X-Cache[1gb-proxy-l24-aux7,1gb-proxy-l24-aux7:80], X-Powered-By[PHP/5.2.17]

whatweb-results/www.softcraft.ru-whatweb.txt:http://www.softcraft.ru [200 OK] Country[RUSSIAN FEDERATION][RU], Email[Rating@Mail.ru], HTTPServer[openresty/1.13.6.2], IP[195.208.1.100], PHP[5.2.17], Script[text/javascript], Title[SoftCraft: отправная точка], X-Powered-By[PHP/5.2.17]

Найдём все сайты с WordPress:

grep -E -H 'WordPress' whatweb-results/* | grep -o -E ':[a-z0-9.:/-]+ ' | sed 's/://'

Кстати… а давайте сохраним их в файл:

grep -E -H 'WordPress' whatweb-results/* | grep -o -E ':[a-z0-9.:/-]+ ' | sed 's/://' > wordpress.txt
cat wordpress.txt | sed 's/https:\/\///' | sed 's/http:\/\///' | sed 's/\///g' > wordpress_sites.txt

Посчитаем:

cat wordpress_sites.txt | wc -l
55

Создадим папку wordpress-results:

mkdir wordpress-results

Запустим сканирование WPScan в 20 потоков:

interlace -tL ./wordpress_sites.txt -threads 20 -c "wpscan --url _target_ > ./wordpress-results/_target_.txt" -v

Вначале пиковая нагрузка на процессор, но затем она падает. Оперативной памяти всегда достаточно:


Анализ:

grep -E -H -A 5 'vulnerab' wordpress-results/*

Некоторые результаты:

Примечательное не в том, что я что-то нашёл, а в том, что от момента запуска до получения результатов не проходит и минуты!

Сканирование множества сайтов и портов

Если кроме целей указано несколько портов, то будут составлены все возможные комбинации команд цель-порт. Например (в файле targets.txt две цели):

interlace -tL ./targets.txt -threads 5 -c "nikto --host _target_:_port_ > ./_target_-_port_-nikto.txt" -p 80,443 -v

Приведёт к запуску команд

nikto --host hackerone.com:80 > ./hackerone.com-80-nikto.txt
nikto --host bugcrowd.com:80 > ./bugcrowd.com-80-nikto.txt
nikto --host bugcrowd.com:443 > ./bugcrowd.com-443-nikto.txt
nikto --host hackerone.com:443 > ./hackerone.com-443-nikto.txt

Запуск нескольких команд в отношении нескольких целей

Во время тестирования на проникновение в отношении каждой цели может понадобиться выполнить несколько команд — и в этом также поможет interlace, которую достаточно запустить всего один раз!

Допустим список команд включает в себя testssl.sh, nikto и sslscan, тогда вы можете создать файл с шаблонами каждой команды, сохраним его в commands.txt:

nikto --host _target_:_port_ > _output_/_target_-nikto.txt
sslscan _target_:_port_ > _output_/_target_-sslscan.txt
testssl.sh _target_:_port_ > _output_/_target_-testssl.txt

Как обычно, можно указать файл с целями и для каждой цели будет выполнено сканирование каждой программой. В следующем примере указана только одна цель (example.com) и два порта — в результате будет запущено 6 процессов сканирования: по два для nikto, sslscan и testssl.sh на портах 80 и 443 в отношении цели example.com:

interlace -t example.com -o ~/Engagements/example/ -cL ./commands.txt -p 80,443

Результаты будут сохранены в папку ~/Engagements/example/.

Добавление поддержки CIDR в любую программу

Некоторые программы не поддерживают указание диапазонов IP адресов — это может быть очень неудобным. Благодаря Interlace эту проблему можно решить для любой программы!

Достаточно в качестве цели просто указать диапазон в виде 192.168.12.0/24 или 192.168.12.1-255 или 192.168.12.*. Interlace понимает эти записи и автоматически развернёт их в список IP адресов:

interlace -t 192.168.12.0/24 -c "vhostscan _target_ -oN _output_/_target_-vhosts.txt" -o ~/scans/ -threads 50

Сама программа VHostScan не поддерживает диапазоны (CIDR нотацию). Но поскольку Interlace развернёт запись диапазона и составит очередь из команд VHostScan, каждой из которых будет дан один из IP для сканирования, то это сделает возможным работу VHostScan на диапазоне адресов.

Добавление поддержки звёздочки в записи IP адресов

На английском языке это называется Glob notation. Допустим, нам нужно запустить сканирование виртуальных хостов в отношении каждой цели в 192.168.12.*, это можно сделать одной командой:

interlace -t 192.168.12.* -c "vhostscan _target_ -oN _output_/_target_-vhosts.txt" -o ~/scans/ -threads 50

Добавление поддержки записи диапазонов IP с помощью тире в любую программу

Да, опять. VHostScan не поддерживает запись диапазонов с помощью тире. Interlace действует аналогично описанным выше примерам, поэтому если вы хотите просканировать виртуальные хосты для всех целей в диапазоне 192.168.12.1-15, то это сделает следующая команда:

interlace -t 192.168.12.1-15 -c "vhostscan _target_ -oN _output_/_target_-vhosts.txt" -o ~/scans/ -threads 50

Как любую утилиту командной строки сделать многопоточной

Нужно уточнить, что имеется ввиду не многопоточность в отношении одной цели. На самом деле, такая многопоточность уже присутствует во многих сканерах и и программах для брут-форса. Как было сказано выше, скорость всё равно упирается в быстроту ответа удалённого сервера. Имеется ввиду многопоточность когда нужно просканировать несколько целей.

То есть если вам нужно просканировать одну цель, время сканирования которой 1 минута, то Interlace вам не поможет ускорить этот процесс. Но если вам нужно просканировать 10 целей, время сканирования каждой по 1 минуте, то Interlace вместо логично предполагаемых 1*10 = 10 минут сканирования может сделать так, что сканирование завершиться за 1 минуту.

Сколько именно будет запущено потоков устанавливается опцией -threads. Определённое значение вам нужно определить конкретно для вашего компьютера и для той программы, которую вы делаете многопоточной, — сделайте несколько тестов и посмотрите на потребление ресурсов.

Исключения хостов из сканирования

С помощью опций -e или -eL можно сделать так, что Interlace пропустит некоторые цели. Эти аргументы также совместимы с упомянутыми выше способами обозначения диапазонов (CIDR, звёздочка и тире).

Для запуска сканирования виртуальных хостов в отношении каждой цели внутри диапазона 192.168.12.0/24 кроме целей внутри диапазона 192.168.12.0/26 запустите команду так:

interlace -t 192.168.12.0/24 -e 192.168.12.0/26 -c "vhostscan _target_ -oN _output_/_target_-vhosts.txt" -o ~/scans/ -threads 50

Запуск одной команды одновременно на нескольких прокси

Сразу заметим: не имеется ввиду, что первый запрос будет отправлен через один прокси, второй запрос — через другой прокси и т. д. Имеется ввиду, что одни и те же запросы будут отправляться одной и той же цели, но через разные прокси. Такое тоже бывает нужным…

Допустим в следующем примере будет запущено несколько независимых сканирований через прокси в отношении одних и тех же цели:

interlace -tL ./targets.txt -pL ./proxies.txt -threads 5 -c "nikto --host _target_:_port_ -useproxy _proxy_ > ./_target_-_port_-nikto.txt" -p 80,443 -v

Обратите внимание, что каждое использование подстановочной строки (таких как _target_, _port_ и _proxy_ приводит к тому, что будут созданы команды со всеми возможными вариантами.

То есть общее количество запусков будет равно: количество целей (_target_) * количество портов (_port_) * количество прокси (_proxy_).

Поиск доменного имени на большом диапазоне IP

Такая скорость и комфорт запуска приводят к мысли об атаках и методах поиска, которые до этого казались невозможными.

К примеру, вполне жизненный случай. Ситуация: сайт за CloudFlare и методы поиска (1, 2, 3) не привели к раскрытию реального IP.

План действия такой:

1) Учитывая характер сайта можно предположить владельца и, зная его другие сайты, предположить выбранный хостинг. В самой плохой ситуации можно взять просто список «абузоустойчивых хостингов», либо (если сайт противозаконный) список хостингов используемых при противоправной деятельности.

2) (Опциональный этап) Если диапазоны очень большие, то можно выполнить предварительное простукивание хостов, которые находятся онлайн, чтобы только их использовать для сканирования

3) С помощью VHostScan с бустом от Interlace, просканировать все эти диапазоны в поисках нужного доменного имени

Допустим, таким методом мне нужно найти настоящий IP сайта hackware.ru (представим, что он спрятан за CloudFlare) и есть предположение, что в качестве хостинга используется Hostland LTD. С помощью сервиса Все IP Интернет-провайдера (достаточно знать любой его IP или просто адрес сайта) я получаю весь диапазон IP адресов хостера:

185.26.120.0/22
185.37.62.0/24
185.221.212.0/24

Их я копирую в файл hostland.txt.

У меня всего три небольших диапазона и второй этап можно пропустить. Но если IP очень много, то при желании вы можете просканировать и оставить только те, которые отвечают на 80й порт. Конечно, можно использовать Nmap, но чтобы вы задумались о других интересных способах применения Interlace, я пойду немного другим путём. В следующем примере я отобрал только хосты, которые ответили на пинги:

interlace -tL hostland.txt -c "timeout 5 ping -c 4 _target_ >/dev/null && echo _target_ >> hostland_live.txt 2>/dev/null" -threads 100

Смотрим сколько получилось:

cat hostland_live.txt | wc -l
391

О программе VHostScan я рассказывал в статье «Поиск виртуальных хостов веб-сервера». Самое важное, что нам нужно оттуда вспомнить — если нужно найти один конкретный хост, то в словаре также обязательно нужно указать несколько явно неверных хостов, чтобы у VHostScan был материал для самообучения.

Итак, я делаю такой файл vhosts.dic:

11111111fdsfghfghdfgjggh.ru
hackware.ru
dkdkgfg-df.com
hgjlk-hgmhgj-fdgdfgafdh.org
tttteessst435345.net
dddlsllstlsdfsdfsdhy.site
sssssssssssiiiiiiiitttttt-ru.ru

Создаю папку vhostscan-results — в неё я буду сохранять результаты:

mkdir vhostscan-results

Составляю команду VHostScan для поиска сайта по всем живым IP хостера:

interlace -tL hostland_live.txt -c "vhostscan -t _target_ -w vhosts.dic -oN _output_/_target_-vhosts.txt" -o ./vhostscan-results -threads 100

Если хост найден, то выводится примерно следующее:

[+] Most likely matches with a unique count of 1 or less:
	[>] hackware.ru

Я буду искать по ключевой фразе «Most likely matches»:

grep -E -H 'Most likely matches' vhostscan-results/*

Настоящий IP найден, хотя и было много ложных срабатываний.

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

Как конвертировать диапазон IP в список отдельных IP адресов

Допустим, у нас есть несколько диапазонов IP адресов:

  • 185.26.120.0/22
  • 185.37.62.0/24
  • 185.221.212.0/24

И нам просто нужно создать файл, в котором каждый IP адрес из этого диапазона будет записан на отдельной строке. С помощью Interlace это можно сделать очень просто:

interlace -t 185.26.120.0/22,185.37.62.0/24,185.221.212.0/24 -c "echo _target_ >> ip.txt" -threads 100

Проверим, не потерялся ли кто:

cat ip.txt | wc -l
1536

На этом про Interlace всё. Но применение программы не ограничено только показанными примерами. Наверняка вы сможете придумать даже более интересные случаи использования. В справке программы вы найдёте ещё несколько полезных опций и информацию о том, как указывать несколько портов: https://kali.tools/?p=4717

Продолжение в следующей статье, посвящённой программе Parallel: «Как ускорить сканирование большого количества сайтов. Ч. 2: Parallel для одновременного выполнения любых задач».

Рекомендуется Вам:

One Comment to Как ускорить сканирование большого количества сайтов. Ч. 1: Interlace для многопоточного сканирования веб-приложений

  1. Some hacker:

    Hello, can you help me? How i can use interlace with proxychains or another proxy randomizer for all my requests? And do you now alternatives for proxychains? Thanks for you job man.

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

Ваш e-mail не будет опубликован.