WebScout

Материал из hack4sec wiki
Перейти к: навигация, поиск

Содержание

Документация к WebScout

Общее описание

WebScout (далее WS) — набор утилит для сбора информации о веб-сайтах и веб-приложениях в процессе тестирования на проникновение. WS состоит из двух основных частей: рабочей части и части отвечающей за визуальное представление собранной информации. Рабочая часть представляет из себя консольное приложение написанное на Python v2.7. Визуальное представление собранной информации (хоть и присутствует в консольной части) происходит в веб-приложении написанном на PHP5 с использованием ZendFramework v1.12. Распространяется под лицензией MIT.

Системные требования

В работе WS не прихотлив, создавался он специально с учётом того, чтоб его можно было запускать на не дорогих маломощных VDS.

Для работы необходимо:

  • Любая nix-like ОС
  • RAM >= 256MB (желательно >= 512)
  • Python2 не ниже 2.7
  • PHP5
  • Любой веб-сервер с поддержкой PHP5 и url-rewrite
  • MySQL5
  • MongoDB
  • Xvfb

Установка WS (консольная часть)

Исходные коды можно взять на https://github.com/hack4sec/ws-cli

Установите следующие пакеты для Python2:

  • configparser
  • argparse
  • requests
  • selenium
  • dnspython
  • pyvirtualdisplay
  • pymongo
  • lxml
  • mysql-connector

Установка WS (web часть)

Исходные коды можно взять на https://github.com/hack4sec/ws-web

Разместите их так, чтоб директория /public/ была корневой директорией хоста на котором будет размещена веб-часть. Например, если вы распаковали ws-web в /var/www/, то DOCUMENT_ROOT вашего хоста должен иметь путь /var/www/public/. Отредактируйте файл application/configs/application.ini, а именно раздел «resources.db.» . Там должны быть те же данные для соединения с MySQL что и в консольной части. В директори /public/ находится файл .htaccess с правилами url-rewrite для Apache2. Для других веб-серверов нужно задать аналогичные правила. К примеру для nginx это

location / { 
	try_files $uri $uri/ /index.php$is_args$args; 
} 

В php.ini установите параметр «short_open_tag» в «On».

Общая схема работы WS

Основной единицей данных в WS является проект. Проект — это совокупность рабочей информации появляющейся при проведении тестирований на проникновение - IP-адресов, хостов, их URL`ов, и прочей информации. Следующей единицей данных, дочерней для проектов, являются IP-адреса. Это адреса серверов с которыми происходит работа. Они, в свою очередь, являются родителями для хостов — сущностей обозначающих сайт и его доменное имя связанное с конкретным IP-адресом. Хосты в виде дочерних элементов имеют два вида сущностей: URL`ы и Запросы. URL`ы — простые ссылки которые были получены при исследовании конкретного доменного имени или добавлены вручную пользователем. Запросы — HTTP-запросы представляющие какой-либо интерес. Например модуль FuzzerHeaders, предназначенный для фаззинга содержимого HTTP-заголовков, в качестве результатов записывает в БД именно запрос состоящий из пути, HTTP-заголовков и их значений, метода обращения. Эти два вида сущностей являются в WS конечными.

Ws.jpg

Файл конфигурации config.ini

Секция [main] (основные настройки)

version — номер текущей версии WS
max_size — максимальный размер принимаемого от веб-сервера ответа в байтах. Если ответ его превышает WS выводит в stdout информацию о запросе и соответствующее сообщение.
default_threads — количество рабочих потоков по умолчанию.
standart_msymbol — маркировочный символ по умолчанию. Используется в модулях Dafs*, DnsBrute*.
locale — локаль в соответствие с которой WS будет оформлять вывод. Например цифры в счётчиках прогресса. Перед указанием убедитесь что используемая локаль имеется в системе.
requests_per_proxy — сколько запросов выполняется через один прокси-сервер (после чего выбирается следующий)
proxies_died_limit — сколько под ряд должно встретиться «мёртвых» прокси-серверов чтоб работа WS была остановлена (в stdout будет выведено соответствующее сообщение).
сonfirm — если данный параметр установлен в «1», то при запуске рабочих модулей, после показа списка опций с которыми модуль запускается, от пользователя потребуется подтвердить начало работы.
mongo_data_load_per_once — число указанное в этом параметре означает количество объектов которые будут размещаться в RAM модулями работающими с MongoDB (на данный момент это только Spider). Чем меньше это число, тем медленнее будет происходить работа (чаще придётся обращаться к Mongo). Чем больше — тем больше RAM WS будет потреблять.
log_modules_items - этот параметр отвечает за включение/выключение логирования объектов запрашиваемых модулями. Смотрите секцию «Логирование». По-умолчанию 0.
kill_thread_after_secs — через сколько секунд простоя убивать рабочий поток (защита от непредвиденного зависания).
positive_limit_stop — при скольких позитивных срабатываниях работа модулей-переборщиков (Dafs, BackupsFounter, DnsBrute, FormBruter) будет остановлена. Данный параметр является защитой от массовых ложных срабатываний (false positive). Для модуля Cms это число увеличивается вдвое.
put_data_info_db — Сохранять или нет в БД результаты работы модулей. По-умолчанию 1. Вы можете отключить сохранение если используете WS для быстрого анализа, или если получаемые данные в будущем не нужны.

Секция [db] (основная база данных (MySQL))

host — хост для подключения
user — имя пользователя для подключения
pass — пароль для подключения
database — имя базы данных

Секция [mongo] (параметры MongoDB)

host — хост для подключения
user — имя пользователя для подключения
password — пароль для подключения
port — порт для подключения
collection — имя коллекции

Секция [spider] (модуль Spider)

denied_schemes — список запрещённых к сканированию схем (schema) (через запятую).
noscan_content_types — mime-типы запрещённые к сканированию (через запятую).
scan_content_types — mime-типы разрешённые к сканированию (через запятую).
allow_exts — расширения файлов разрешённых к сканированию (через запятую).
stat_slowest_links_count — сколько медленных ссылок выводить в конце работы паука
tags — теги и их параметры из которых Spider может получать ссылки для работы. Перечисляются через запятую в формате «тег»|«параметр».
requests_limit — количество запросов после которых работа модуля принудительно останавливается.

Секция [backups] (модуль BackupsFinder)

ignore_exts — какие расширения в ссылках стоит игнорировать при поиске резервных копий (через запятую).

Секция [cms] (модуль Cms)

percent — минимальный процент совпадения с сигнатурой при котором она показывается пользователю и вносится в БД.

Секция [dafs] (модули Dafs*)

retest_limit — максимальное количество перепроверок адресов чей код ответа попадает под список параметра --retest-codes (смотрите раздел Dafs* модулей)
retest_delay — сколько секунд ожидать перед перепроверкой адресов чей код ответа попадает под список параметра --retest-codes (смотрите раздел Dafs* модулей)

Секция [hosts_brute] (модули HostsBrute*)

retest_limit — максимальное количество перепроверок адресов чей код ответа попадает под список параметра --retest-codes (смотрите раздел Dafs* модулей)
retest_delay — сколько секунд ожидать перед перепроверкой адресов чей код ответа попадает под список параметра --retest-codes (смотрите раздел Dafs* модулей)

Секция [selenium] (настройки selenium-модулей)

max_threads — максимально допустимое количество потоков. Наличие этого параметра обусловлено потреблением RAM. Смотрите раздел «Selenium».
firefox_path — путь к Firefox.
virtual_display — использовать ли виртуальный дисплей. Если да («1»), то окна Firefox будут открываться в фоновом режиме и не будут видны пользователю.
timeout_page_load — сколько секунд ожидать ответа сервера прежде чем сбрасывать соединение. Помогает в ситуациях когда на открываемой странице имеются долго загружаемые элементы.
images_load — загружать ли изображения.
css_load — загружать ли css-стили
flash_load — загружать ли flash.

Запуск

Запуск WS происходит через скрипт /main.py . Первым аргументом указывается имя проекта с которым будет происходить работа. Вторым — имя рабочего модуля. Третьим — действие модуля. Далее следуют все необходимые действию аргументы. Если их не указывать, WS отобразит краткую справку о выбранном вами действии.

$ ./main.py test Hosts add #Проект test, модуль Hosts, действие add 
usage: ./main.py test Hosts add [-h] [--ip IP] --host HOST [--descr DESCR] 
./main.py test Hosts add: error: argument --host is required 

При указании параметра «--help» или «-h» WS отобразит полную справку:

$ ./main.py test Hosts add -h 
usage: ./main.py test Hosts add [-h] [--ip IP] --host HOST [--descr DESCR] 
 
optional arguments: 
  -h, --help     show this help message and exit 
  --ip IP        Custom IP for this host 
  --host HOST    Host for add 
  --descr DESCR  Description of host 

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

./main.py test Hosts add --host example.com --descr=description 
./main.py test Hosts add --host 'example.com' --descr "description"

У каждого параметра обязательно должно быть указанно значение. У многих утилит указание параметра при запуске (--param) подразумевает True в его значении, а отсутствие — False. В WS не так. «--param=1» означает True, «--param=0» означает False. Если параметр не указан WS берёт его значение по умолчанию.

Модуль Projects

Модуль используется для работы с записями проектов. Имеет следующие действия:
add — добавление проекта. Единственный необязательный параметр «--descr» может содержать описание проекта. Имя добавляемого проекта указывается при запуске WS как имя проекта с которым происходит работа.
list — вывод списка проектов с их описаниями. Имя указываемого при запуске проекта не имеет значения
delete — Удаление проекта. Целевое имя указывается при запуске WS как имя проекта с которым происходит работа.
Пример запуска:

# Создание проекта «testProject»
./main.py testProject Projects add
# Список проектов, проект «anyName» может не существовать, ошибки не будет
./main.py anyName Projects list
# Удаление проекта «testProject»
./main.py testProject Projects delete

Модуль IPs

Модуль для работы с IP-адресами. Имеет следующие действия:
add — добавление IP-адреса. Параметры:

  • --ip — обязательный, должен содержать добавляемый IP-адрес
  • --descr — не обязательный, может содержать комментарий к добавляемому адресу.

list — вывод списка имеющихся в проекте адресов с их описаниями.
delete — удаление IP-адреса. Параметры:

  • --ip — обязательный, должен содержать удаляемый IP-адрес

Пример запуска:

# Добавляем IP-адрес 127.0.0.1 с описанием «Local IP» в проект «testProject» 
./main.py testProject IPs add --ip 127.0.0.1  --descr "Local IP"
# Выводим список IP-адресов проекта «testProject»
./main.py testProject IPs list
# Удаляем IP-адрес 127.0.0.1 из проекта «testProject» 
./main.py testProject IPs delete --ip 127.0.0.1

Модуль Hosts

Модуль для работы с проверяемыми хостами. Имеет следующие действия:
add — добавление хоста. Параметры:

  • --host — обязательный, должен содержать имя добавляемого хоста. Может быть указан IP-адрес.
  • --ip — не обязательный, содержит IP-адрес добавляемого хоста. Указание его здесь заменяет отдельное выполнение действия add модуля IPs. Если IP-адрес не указывается, то он определяется автоматически средствами системы и добавляется в список адресов текущего проекта.
  • --descr — не обязательный, содержит описание добавляемого хоста.

list — вывод списка имеющихся в проекте хостов с их описаниями.
delete — удаление хоста. Параметры:

  • --host — обязательный, должен содержать имя удаляемого хоста

Пример запуска:

# В проект «testProject» добавляем хост example.com
./main.py testProject Hosts add --host example.com
# Выводим список хостов проекта «testProject»
./main.py testProject Hosts list
# Удаляем хост example.com из проекта «testProject»
./main.py testProject Hosts delete --host example.com

Модуль Urls

Модуль по работе с URL`ами хостов проекта. Имеет следующие действия: add — добавление URL. Параметры:

  • --url — обязательный, содержит добавляемый URL начинающийся с корня сайта (/).
  • --host — обязательный, имя хоста чей URL добавляется
  • --descr — не обязательный, содержит описание добавляемого URL.

list — вывод списка имеющихся в проекте URL с информацией по ним. Параметры:

  • --host — обязательный, имя хоста чей список URL нужно вывести
  • --like — не обязательный, выражение для SQL-LIKE отбора выводимых записей. Будет использовано в виде «LIKE '%выражение%'».

delete — удаление URL. Параметры:

  • --host — обязательный, должен содержать имя хоста чей URL удаляется
  • --url — обязательный, содержит удаляемый URL полностью, начинающийся с корня сайта (/).

Пример запуска:

# Добавляем корневой URL хоста example.com в проект «testName»
./main.py testProject Urls add --host example.com --url /
# Смотрим список URL`ов хоста example.com
./main.py testProject Urls list --host example.com
# Удаляем корневой URL хоста example.com проекта «testName»
./main.py testProject Urls delete --host example.com --url /

Pre

Модуль предварительного сбора информации о целевом хосте. Предназначен для запуска перед началом основной работы. Проводит следующие проверки:

  1. Ищет возможные резервные копии по собственному списку директорий (bases/pre-backups-dirs.txt) и файлов (bases/pre-backups-files.txt) формируя запросы по базам модуля BackupsFinder.
  2. Ищет поддомены по списку bases/pre-domain-names.txt. Найденные хосты не добавляются в БД, пользователь делает это на своё усмотрение.
  3. Определяет не настроена ли зона домена так, чтоб на запрос любого поддомена отвечать IP-адресом.
  4. Проверяет наличие на главной странице фразы «Powered by»
  5. Проверяет наличие /robots.txt. Ссылки из него помещаются в общий список URL в БД.
  6. Проверяет наличие карты сайта («Sitemap» в /robots.txt или наличие /sitemap.xml). Ссылки из неё помещаются в общий список URL в БД.
  7. Проверяет код ответа сайта на запрос несуществующей директории и несуществующего файла
  8. Производит поиск директорий и файлов модобно модулю DafsDict по словарям bases/pre-dafs-dirs.txt и bases/pre-dafs-files.txt
  9. Получает сайта кодировку из html-кода страниц и http-заголовков ответов сервера.
  10. Обращается к корню сайта и получает содержимое заголовка «Server» и всех начинающихся на «X-»

Вся полученная информация выводится в stdout и частично вносится в базу. Позже она может быть просмотрена в веб-части на вкладке «Информация».

Запуск

Единственное действие — scan. Параметры:

  • --host — Обязательный. Имя целевого хоста.
  • --http-proto — Не обязательный. Протокол работы для поиска файлов и директорий, резервных копий. Может принимать значения «http» и «https». По умолчанию «http».
  • --not-found-phrase — не обязательный, фраза для определения ответа 404. Может быть полезен тогда, когда веб-сервер отвечает на запросы несуществующих объектов кодом отличным от 404.
  • --not-found-codes — не обязательный, список кодов через запятую которые можно считать аналогами кода 404. Может быть полезен тогда, когда веб-сервер отвечает на запросы несуществующих объектов кодом отличным от 404.
  • --dns — DNS-сервер для поиска доменных имён. По умолчанию используется «8.8.8.8»
  • --headers-file — Не обязательный. Файл с http-заголовками в формате "Заголовок: значение" на строку. Они будут добавлены в каждый http-запрос. Не используется в selenium-режиме.

Пример запуска

# Предварительное сканирование хоста example.com с использованием протокола HTTPS для http-операций 
./main.py testProject Pre scan --host example.com --http-proto https

DnsBrute*

Модули DnsBruteDict и DnsBruteMask занимаются перебором поддоменов по словарю и маске соответственно. Отличаются они лишь источником для перебора (словарь/маска), в остальном же полностью совпадают.
Модуль DnsBruteCombine делает тоже самое, но по комбинации маски и словаря, по заданному вами шаблону.

Для работы по словарю вы можете использовать файл bases/dns-names.txt. Он представляет собой не большой словарь с часто встречающимися именами поддоменов.

В файле bases/dns-servers.txt хранится список серверов для перебора. Все сервера которые в него внесены участвуют в работе. Между рабочими потоками они распределяются по кругу. Т.е. если серверов в списке 5, а потоков 10, то первый поток возьмёт себе первый сервер, пятый поток — пятый сервер, шестой поток — первый сервер, седьмой поток — второй сервер и т. д. Такое решение полезно при работе с большим количеством потоков, когда один DNS справиться не может.

WS тестирует каждый DNS-сервер прежде чем передать его потоку в работу. Если в параметрах запуска не указан рабочий протокол (TCP/UDP), то WS пробует определить его самостоятельно, обращаясь сперва по TCP, затем по UDP. Сервера у которых определить протокол не удалось (служба DNS не запущена, сервер не отвечает и т. д.) пропускаются, выводится соответствующее сообщение.

Оба модуля могут работать с источниками больших объёмов (огромные словари, длинные маски) при малых объёмах памяти т. к. целиком в память они не вгружаются. В каждый момент работы в памяти находятся лишь текущие проверяемые фразы и указатели на следующие. Аналогично остальным модулям работающим с масками и словарями, с помощью отдельных параметров вы можете указывать с какой частью маски или словаря модуль должен работать в данный момент.

Найденные имена выводятся в stdout вместе с адресами серверов через которых они были обнаружены. Кроме того, найденные хосты вносятся в БД в список хостов текущего проекта.

Если в процессе работы найденных имён становится больше чем число в config.ini в опции «positive_limit_stop», то работа модуля останавливается. Список найденных доменных имён выводится в консоль, но они не вносятся в БД т. к. подразумеватся что что-то идёт не так.

Запуск

Действие у данного модуля только одно — brute. Параметры:

  • --host — Обязательный. Целевой хост.
  • --template — Шаблон хоста для перебора имён с использованием маркировочного символа (см. ниже). Например шаблон «@» означает что подбираемые имена будут подставляться перед «.example.com» («aaa.example.com», «bbb.example.com», ...).
  • --dict — Обязательный для модулей DnsBruteDict и DnsBruteCombine. Словарь с которым будет происходить работа.
  • --mask — Обязательный для модулей DnsBruteMask и DnsBruteCombine. Маска с которой будет происходить работа.
  • --msymbol — Не обязательный. Маркеровочный символ подстановки в шаблон. По умолчанию «@» (можно изменить в config.ini, секция «[main]», параметр «standart_msymbol»).
  • --parts — Не обязательный. Параметр используется при работе с частями словарей или масок. В нём нужно указать на сколько частей необходимо разбить словарь или маску перед началом работы.
  • --part — Не обязательный. Параметр используется при работе с частями словарей или масок. В нём указывается с какой конкретно частью сейчас нужно работать.
  • --delay — Не обязательный. Параметр обозначающий задержку в секундах перед отправкой запросов к цели. Обратите внимание на то, что задержка осуществляется не для всех отправляемых запросов в целом, а для каждого рабочего потока в отдельности.
  • --ignore-words-re — Не обязательный. Регулярное выражение для пропуска слов из словаря или маски.
  • --threads — Не обязательный. Количество рабочих потоков. По умолчанию 10. Эту цифру можно изменить в config.ini, в опции «default_threads».
  • --protocol — Не обязательный. Протокол общения с DNS-серверами. Может принимать значения «tcp», «udp», «auto». Регистр указания не важен. По умолчанию «auto», что означает автоматическое определение протокола для каждого сервера. Сперва происходит проверка на работу по TCP, затем по UDP.
  • --ignore-ip — Не обязательный. IP-адрес обнаружаемых хостов который следует игнорировать. Параметр может помочь в случаях когда запрос любого поддомена возвращает какой-то IP-адрес по-умолчанию (WildCard DNS запись). С его использованием вы сможете увидеть хосты, чей IP отчается от IP-адреса по-умолчанию.
  • --combine-template — Обязательный только для модуля DnsBruteCombine. Содержит шаблон подбираемого выражения с маркерами "%m%" (вхождение из маски) и "%d%" (вхождение из словаря). К примеру шаблон "%d%%m%" приведёт к перебору всех вариантов фраз из словаря, справа к которым будут подставлены все варианты фраз из маски.
  • --http-not-found-re — Не обязательный. Регулярное выражение на проверку не существования домена по ответу на http(s)-запрос. Иногда можно встретить DNS-зоны отвечающие положительно на запрос любого под-домена. При этом не существующие домены возвращают стандартную страницу при запросе их по http(s). В этом параметре вы можете указать регулярное выражение для определения таких страниц. Если он задан, модули брута при каждом найденном под-домене будут запрашивать его по http(s) и в ответе искать совпадение с данным выражением. Если совпадений нет - найден действующий под-домен.
  • --headers-file — Не обязательный. Файл с http-заголовками в формате "Заголовок: значение" на строку. Они будут добавлены в каждый http-запрос. Не используется в selenium-режиме.

Пример запуска

# Перебор доменных имён у хоста example.com по словарю names.txt располагающемся в корне директории WS. Работа с DNS-сервером по протоколу UDP
./main.py testProject DnsBruteDict scan --host @.example.com --dict names.txt --protocol udp
# Перебор доменных имён у хоста example.com по маске ?l?d,2,2. Работа с DNS-сервером по протоколу UDP
./main.py testProject DnsBruteMask scan --host @.example.com --mask ?l?d,2,2 --protocol udp

Известные баги

При работе с некоторыми публичными DNS-серверами был замечен баг при котором парсинг ответа DNS-сервера вызывает поедание CPU в 100% и зависание потока. Найти точную причину пока не удалось, определить какие-то условия возникновения бага тоже. Решается методом исключения проблемного сервера из bases/dns-servers.txt.

При работе с некоторыми публичными DNS-серверами был замечен баг при котором сервер отвечал положительно на рандомные не существующие доменные имена, создавая много «false positive». Найти точную причину пока не удалось, определить какие-то условия возникновения бага тоже. Решается методом исключения проблемного сервера из bases/dns-servers.txt.

HostsBrute*

Модули HostsBruteDict и HostsBruteMask занимаются перебором виртуальных хостов веб-севера (http-заголовок "Host") по словарю и маске соответственно. Отличаются они лишь источником для перебора (словарь/маска), в остальном же полностью совпадают.
Модуль HostsBruteCombine делает тоже самое, но по комбинации маски и словаря, по заданному вами шаблону.

Для работы по словарю вы можете использовать файл bases/dns-names.txt. Он представляет собой не большой словарь с часто встречающимися именами поддоменов.
Оба модуля могут работать с источниками больших объёмов (огромные словари, длинные маски) при малых объёмах памяти т. к. целиком в память они не вгружаются. В каждый момент работы в памяти находятся лишь текущие проверяемые фразы и указатели на следующие. Аналогично остальным модулям работающим с масками и словарями, с помощью отдельных параметров вы можете указывать с какой частью маски или словаря модуль должен работать в данный момент.

Найденные имена выводятся в stdout. В БД проектов найденные хосты не помещаются, это делает пользователь на своё усмотрение.

Если в процессе работы найденных имён становится больше чем число в config.ini в опции «positive_limit_stop», то работа модуля останавливается. Список последних найденных имён выводится в консоль, но они не вносятся в БД т. к. подразумеватся что что-то идёт не так.

Запуск

Действие у данного модуля только одно — brute. Параметры:

  • --host — Обязательный. Целевой хост для перебора.
  • --template — Обязательный. Шаблон хоста для перебора имён с использованием маркировочного символа (см. ниже). Например шаблон «@.example.com» означает что подбираемые имена будут подставляться перед «.example.com» («aaa.example.com», «bbb.example.com», ...).
  • --false-phrase - Обязательный. Фраза, по наличию которой в ответе (полном, заголовки+тело) модуль поймёт что запрашиваемый хост не обнаружен.
  • --dict — Обязательный для модулей HostsBruteDict и HostsBruteCombine. Словарь с которым будет происходить работа.
  • --mask — Обязательный для модулей HostsBruteMask и HostsBruteCombine. Маска с которой будет происходить работа.
  • --msymbol — Не обязательный. Маркеровочный символ подстановки в шаблон. По умолчанию «@» (можно изменить в config.ini, секция «[main]», параметр «standart_msymbol»).
  • --parts — Не обязательный. Параметр используется при работе с частями словарей или масок. В нём нужно указать на сколько частей необходимо разбить словарь или маску перед началом работы.
  • --part — Не обязательный. Параметр используется при работе с частями словарей или масок. В нём указывается с какой конкретно частью сейчас нужно работать.
  • --delay — Не обязательный. Параметр обозначающий задержку в секундах перед отправкой запросов к цели. Обратите внимание на то, что задержка осуществляется не для всех отправляемых запросов в целом, а для каждого рабочего потока в отдельности.
  • --ignore-words-re — Не обязательный. Регулярное выражение для пропуска слов из словаря или маски.
  • --threads — Не обязательный. Количество рабочих потоков. По умолчанию 10. Эту цифру можно изменить в config.ini, в опции «default_threads».
  • --protocol — Не обязательный. Протокол работы с веб-сервером. Может принимать значения «http» или «https». По умолчанию «http». Регистр указания не важен.
  • --combine-template — Обязательный только для модуля HostsBruteCombine. Содержит шаблон подбираемого выражения с маркерами "%m%" (вхождение из маски) и "%d%" (вхождение из словаря). К примеру шаблон "%d%%m%" приведёт к перебору всех вариантов фраз из словаря, справа к которым будут подставлены все варианты фраз из маски.
  • --headers-file — Не обязательный. Файл с http-заголовками в формате "Заголовок: значение" на строку. Они будут добавлены в каждый http-запрос. Не используется в selenium-режиме.

Пример запуска

# Перебор виртуальных хостов/поддоменов у хоста example.com по словарю names.txt располагающемся в корне директории WS. Фраза "Forbidden" в ответе означает что запрошенный хост на сервере отсутствует.
./main.py testProject HostsBruteDict scan --host example.com --template @.example.com --dict names.txt --false-phrase Forbidden

# Перебор виртуальных хостов/поддоменов у хоста example.com по маске ?l?d,2,2. Фраза "Forbidden" в ответе означает что запрошенный хост на сервере отсутствует.
./main.py testProject HostsBruteMask scan --host example.com --template @.example.com --mask ?l?d,2,2 --false-phrase Forbidden

Dafs*

Модули DafsMask и DafsDict используются для обнаружения на веб-ресурсах скрытых файлов, директорий и URL (фраза «dafs» является аббривиатурой от directories and files search). Работают они очень просто. Пользователь задаёт шаблон URL в который будут подставляться варианты из источника (маски или словаря) и выбранный модуль проверяет все имеющиеся варианты на существование.

Результаты вносятся в БД и могут быть просмотрены в веб-интерфейсе (вкладка «Карта URL»).

Модуль учитывает параметр «positive_limit_stop» из config.ini, секция «[main]». Как только количество найденных результатов достигает этого числа, модуль прекращает работу (подразумевается наличие массовых ложных срабатываний).

Запуск

Действие у данного модуля только одно — scan. Параметры:

  • --host — Обязательный. Имя хоста проекта с которым будет происходить работа.
  • --template — Обязательный. Шаблон URL с маркировочным символом (см. ниже) в который будут подставляться искомые объекты. Например «/@/» (/aaa/, /bbb/, …)
  • --dict — Обязательный для DafsDict. Словарь с которым будет происходить работа.
  • --mask — Обязательный для DafsMask. Маска с которой будет происходить работа.
  • --threads — Не обязательный. Количество рабочих потоков. По умолчанию 10. Эту цифру можно изменить в config.ini, в опции «default_threads». При использовании Selenium необходимо подобрать оптимальное для вашего случая количество потоков. Каждый из них будет являться полноценно запущенным процессом Firefox (а не отдельными окнами единого процесса), что приводит к серьёзному потреблению RAM. В config.ini, в секции «[selenium]», есть опция «max_threads» - максимальное количество потоков для selenium модулей. По умолчанию она равна 5.
  • --protocol — Не обязательный. Протокол работы с веб-сервером. Может принимать значения «http» или «https». По умолчанию «http». Регистр указания не важен.
  • --method — Не обязательный. Метод обращения к веб-серверу при работе. Может принимать значения «get», «post», «head». Регистр указания не важен. По умолчанию «head». Если указана опция --not-found-re, а данный параметр либо не указан либо указан как «head», то его значение становится «get» т. к. в данном случае WS необходимо получать тело страницы.
  • --msymbol — Не обязательный. Маркеровочный символ подстановки в шаблон. По умолчанию «@» (можно изменить в config.ini, секция «[main]», параметр «standart_msymbol»).
  • --parts — Не обязательный. Параметр используется при работе с частями словарей или масок. В нём нужно указать на сколько частей необходимо разбить словарь или маску перед началом работы.
  • --part — Не обязательный. Параметр используется при работе с частями словарей или масок. В нём указывается с какой конкретно частью сейчас нужно работать.
  • --delay — Не обязательный. Параметр обозначающий задержку в секундах перед отправкой запросов к цели. Обратите внимание на то, что задержка осуществляется не для всех отправляемых запросов в целом, а для каждого рабочего потока в отдельности.
  • --not-found-codes — Не обязательный. Коды ответов веб-сервера которые необходимо принимать за 404. Указываются через запятую. Например «302,301». К ним автоматически добавляется 404.
  • --not-found-size — Не обязательный. Определяет ответ 404 по размеру тела ответа в байтах. Не работает в Selenium-режиме.
  • --not-found-re — В данном параметре указывается регулярное выражение. Если в теле или заголовках ответа веб-сервера найдётся совпадение с ним, то ответ будет считаться аналогом 404. Для работы с selenium этот параметр обязателен.
  • --ignore-words-re — Не обязательный. Регулярное выражение для пропуска слов из словаря или маски.
  • --retest-codes — Не обязательный. Коды ответов веб-сервера при получении которых нужно перепроверять запрошенный объект. Указываются через запятую. Например «500,502». Встретив такой код в ответе веб-сервера WS подождёт 5 секунд и повторит запрос. Это время редактируется в config.ini в секции «[dafs]» в параметре retest_delay. Там же присутствует параметр retest_limit обозначающий количество раз перепроверки. По умолчанию 30.

Данная функция может быть полезна в том случае когда веб-сервер из-за нагрузки время от времени отвечает кодом ошибки. К примеру многие веб-сервера работающие на nginx при перегрузке могут на запрос несуществующего объекта вместо 404 отвечать 502. В случае долгого сканирования это создаёт огромный список ложных найденных объектов.

  • --proxies — Не обязательный. Текстовый файл со списком прокси-серверов в формате «ip:port» на строку.
  • --selenium — Не обязательный. Включение selenium-режима.
  • --ddos-detect-phrase — Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS ожиданием или какой-то JS-проверкой не требующей действий пользователя. При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (проверка закончится и будет показан реальный контент).
  • --ddos-human-action — Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS требующая действий человека (например решение капчи). При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (человек прошёл проверку и теперь показан реальный контент).
  • --browser-recreate-re — Не обязательный. В данном параметре указывается регулярное выражение. Используется только с selenium. Если в теле ответа веб-сервера найдётся совпадение с ним, то браузер рабочего потока будет пересоздан.
  • --headers-file — Не обязательный. Файл с http-заголовками в формате "Заголовок: значение" на строку. Они будут добавлены в каждый http-запрос. Не используется в selenium-режиме.

Пример запуска

# Поиск файлов и директорий на хосте example.com по словарю dirs.txt и шаблону «/@/». Протокол обращений https, количество потоков — 3, задержка между запросами в каждом потоке — 1 секунда. 

./main.py testProject DafsDict scan --host example.com --dict dirs.txt --url /@/ --protocol https --delay 1 --threads 3

# Поиск файлов и директорий на хосте example.com по словарю dirs.txt и шаблону «/@». Сканирование с использованием Selenium в 4 потока. Определение страницы с DDoS-защитой по фразе «DDoS protection by Cloud». Для определения ответов аналогичных 404 в них ищется фраза «<h1>404 Not Found</h1>».

./main.py testProject DafsDict scan --host example.com --selenium=1 --ddos-detect-phrase "DDoS protection by Cloud" --threads 4 --dict dirs.txt --not-found-re '<h1>404 Not Found</h1>' --url /@

# Поиск файлов и директорий по маске ?l,1,3 и шаблону «/@/». Код ответа 302 считается за 404.

./main.py testProject DafsMask scan --host example.com --mask ?l,1,3 --url /@/ --protocol http --not-found-codes 302 

CMS

Данный модуль предназначен для сигнатурного поиска распространяемых скриптов (cms, форумов, галерей и пр.). Работает он достаточно просто. В БД содержатся структуры каталогов многих распространяемых скриптов. Модуль извлекает их все и начинает проверять наличие по указанному вами URL. Перебрав все имеющиеся варианты WS проверяет проверяет процент совпадений с каждой имещейся в БД сигнатурой. Если он превышает цифру из config.ini [cms] percent, то пользователю сообщается об этом. Результаты работы выводятся в stdout (имя скрипта и процент совпадения) и вносятся в табличку hosts_info (вкладка «Информация» в веб-части). Все обнаруженные в ходе сканирования ссылки (без исключения) добавляются в БД.

Базы

Базы для модуля CMS хранятся в БД в таблицах cms, cms_paths, cms_paths_hashes. В cms хранятся имена скриптов чьи сигнатуры внесены в базу. В cms_paths_hashes хранятся пути директорий этих скриптов с их md5-хешами для уникальности. В cms_paths хранится связка id-сигнатуры+id-хеша. Каждый внесённый в базу путь уникален, что позволяет за минимальное количество запросов проверить совпадение с максимальным количеством сигнатур.

Запуск

Действие у данного модуля только одно — scan. Параметры:

  • --host — Обязательный. Имя хоста проекта с которым будет происходить работа.
  • --url — Не обязательный. Путь по которому нужно провести сканирование. По умолчанию это корень сайта (/).
  • --threads — Не обязательный. Количество рабочих потоков. По умолчанию 10. Эту цифру можно изменить в config.ini, в опции «default_threads». При использовании Selenium необходимо подобрать оптимальное для вашего случая количество потоков. Каждый из них будет являться полноценно запущенным процессом Firefox (а не отдельными окнами единого процесса), что приводит к серьёзному потреблению RAM. В config.ini, в секции «[selenium]», есть опция «max_threads» - максимальное количество потоков для selenium модулей. По умолчанию она равна 5.
  • --protocol — Не обязательный. Протокол работы с веб-сервером. Может принимать значения «http» или «https». По умолчанию «http». Регистр указания не важен.
  • --method — Не обязательный. Метод обращения к веб-серверу при работе. Может принимать значения «get», «post», «head». Регистр указания не важен. По умолчанию «head». Если указана опция --not-found-re, а данный параметр либо не указан либо указан как «head», то его значение становится «get» т. к. в данном случае WS необходимо получать тело страницы.
  • --not-found-re — В данном параметре указывается регулярное выражение. Если в теле или заголовках ответа веб-сервера найдётся совпадение с ним, то ответ будет считаться аналогом 404. Для работы с selenium этот параметр обязателен.
  • --not-found-size — Не обязательный. Определяет ответ 404 по размеру тела ответа в байтах. Не работает в Selenium-режиме.
  • --not-found-codes — Не обязательный. Коды ответов веб-сервера которые необходимо принимать за 404. Указываются через запятую. Например «302,301». К ним автоматически добавляется 404.
  • --delay — Не обязательный. Параметр обозначающий задержку в секундах перед отправкой запросов к цели. Обратите внимание на то, что задержка осуществляется не для всех отправляемых запросов в целом, а для каждого рабочего потока в отдельности.
  • --selenium — Не обязательный. Включение selenium-режима.
  • --ddos-detect-phrase — Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS ожиданием или какой-то JS-проверкой не требующей действий пользователя. При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (проверка закончится и будет показан реальный контент).
  • --ddos-human-action — Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS требующая действий человека (например решение капчи). При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (человек прошёл проверку и теперь показан реальный контент).
  • --browser-recreate-re — Не обязательный. В данном параметре указывается регулярное выражение. Используется только с selenium. Если в теле ответа веб-сервера найдётся совпадение с ним, то браузер рабочего потока будет пересоздан.
  • --proxies — Не обязательный. Текстовый файл со списком прокси-серверов в формате «ip:port» на строку.
  • --headers-file — Не обязательный. Файл с http-заголовками в формате "Заголовок: значение" на строку. Они будут добавлены в каждый http-запрос. Не используется в selenium-режиме.

Пример запуска

# Поиск распространяемых скриптов на хосте example.com. Ответы сервера с фразой «Sorry, page not found» считаются аналогами кода 404.
./main.py testProject Cms scan --host example.com --not-found-re "Sorry, page not found"

Замечания

У некоторых CMS есть директории в которые запрещается любой доступ на уровне веб-сервера. На любое обращение к ним (к существующему или не существующему файлу) сервер отвечает кодом 403. Работа с такими скриптами у модуля Cms будет заканчиваться прерыванием с сообщением «Many positive detections...». Во избежание этого используйте параметр «--not-found-codes» со значением 403.

Spider

Модуль представляет собой веб-паука который старается обойти и сохранить все ссылки на целевом сайте. Его главная цель — составить для пользователя как можно более точную карту сайта и собрать как можно больше ссылок для работы остальных модулей.

Запуск

Действие у данного модуля только одно — scan. Параметры:

  • --host — Обязательный. Имя хоста проекта с которым будет происходить работа.
  • --ignore-re — Не обязательный. Регулярное выражение для игнорирования ссылок.
  • --only-one — Не обязательный. Одно или несколько регулярных выражений разделённых двумя прямыми слешами («||») для поиска ссылок которые нужно просканировать только один раз. К примеру, это могут быть ссылки на календарь генерируемый сайтом до бесконечной даты, на котором spider может застрять навсегда. Первая ссылка на него будет внесена в БД, а остальные прогнорированы.
  • --full-new — Не обязательный. Полностью повторить сканирование указанного хоста. При сканировании паук будет помечать в БД ссылки которые он уже проверил. Установка данного параметра в 1 снимет такие пометки со всех имеющихся ссылок и они будут проверены заново.
  • --not-found-re — В данном параметре указывается регулярное выражение. Если в теле ответа веб-сервера найдётся совпадение с ним, то ответ будет считаться аналогом 404. Для работы с selenium этот параметр обязателен.
  • --delay — Не обязательный. Параметр обозначающий задержку в секундах перед отправкой запросов к цели. Обратите внимание на то, что задержка осуществляется не для всех отправляемых запросов в целом, а для каждого рабочего потока в отдельности.
  • --selenium — Не обязательный. Включение selenium-режима.
  • --ddos-detect-phrase — Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS ожиданием или какой-то JS-проверкой не требующей действий пользователя. При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (проверка закончится и будет показан реальный контент).
  • --ddos-human-action — Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS требующая действий человека (например решение капчи). При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (человек прошёл проверку и теперь показан реальный контент).
  • --browser-recreate-re — Не обязательный. В данном параметре указывается регулярное выражение. Используется только с selenium. Если в теле ответа веб-сервера найдётся совпадение с ним, то браузер рабочего потока будет пересоздан.
  • --proxies — Не обязательный. Текстовый файл со списком прокси-серверов в формате «ip:port» на строку.
  • --headers-file — Не обязательный. Файл с http-заголовками в формате "Заголовок: значение" на строку. Они будут добавлены в каждый http-запрос. Не используется в selenium-режиме.

Схема работы

Очень важно понимание схемы работы паука. В качестве промежуточного хранилища он использует MongoDB. В неё складываются все данные о ссылках от начала работы и до самого конца. Когда не проверенных ссылок не остаётся, паук сообщает об этом и начинает перекладывать имеющуюся информацию из MongoDB в MySQL. Только на этом этапе полученные им данные становятся видны в веб-части WS. Следует учитывать что MySQL сам по себе значительно медленнее MongoDB, а ссылок на сайте может быть найдено огромное множество, поэтому процесс помещения данных в MySQL может затянуться. На этот случай WS будет отображать прогресс и время которое планируется затратить на размещение данных в MySQL.

Любая найденная ссылка будет разбиваться на максимальное количество частей, каждая из которых будет считаться отдельной ссылкой. То есть при нахождении ссылки «/home/forum/index.php» будет добавлено в очередь на проверку 3 адреса: «/home/», «/home/forum/» и «/home/forum/index.php».

Работа через Selenium в пауке на данный момент имеет следующие недостатки и ограничения:

  • Ссылки получаются только парсингом исходного кода страниц, как и при обычном сканировании. Интерактивность (имитация кликов по ссылкам, запись ссылок всего загружаемого на странице контента) полностью отсутствует. Она обязательно будет реализована, но в данный момент её нет.
  • Не работает парсинг ссылок из CSS-файлов
  • Не работает парсинг XML-файлов с ошибками синтаксиса
  • Если страница А перебрасывает пользователя на страницу Б, то адрес страницы Б не будет внесён в общий список ссылок, а содержимое Б будет считаться содержимым А. В отличие от простого сканирования, где в таком случае адрес Б записывается отдельно и содержимое Б считается именно содержимым этой страницы, а не А.

Замечания

Если на момент старта модуля в базе у целевого хоста нет ни одного URL, то WS автоматически добавит ссылку на корень сайта (/). Используя Spider лучше указывать хоть какое-то значение в requests_limit в config.ini. Если вдруг паук «забуксует» на ссылках которые генерируются бесконечно (например даты календарей) то это значение остановит его и позволит вам посмотрев результат работы составить выражение для параметра «--ignore» на будушее.

Примеры запуска

# Сканирование хоста example.com с игнорированием ссылок попадающих под регулярное выражение «calendar(\d+)» 
./main.py testProject Spider scan --host example.com --ignore "calendar(\d+)" --threads 2


BackupsFinder

Модуль BackupsFinder (далее BF) предназначен для поиска резевных копий на целевом сайте. За основу он берёт список имеющихся в БД ссылок по указанному хосту. Кандидаты на проверку формируются по каждой из выбранных ссылок и шаблонам из файлов bases/bf-dirs.txt (для директорий) и bases/bf-files.txt (для файлов).

Файлы с шаблонами имеют простую структуру — по шаблону на строку. Шаблон представляет из себя вхождение маркера |name|, на место которого будет подставлено имя проверяемого объекта, и дополнительные символы ожидаемые в имени резервной копии. К примеру ссылка «/index.php» попавшая под шаблон «|name|.zip» будет иметь вид «/index.php.zip».

Обнаруженные резервные копии выводятся в stdout и добавляются в таблицу requests БД (вкладка «Запросы» в веб-части).

Модуль учитывает параметр «positive_limit_stop» из config.ini, секция «[main]». Как только количество найденных результатов достигает этого числа, модуль прекращает работу (подразумевается наличие массовых ложных срабатываний).

Запуск

Действие у данного модуля только одно — scan. Параметры:

  • --host — Обязательный. Имя хоста проекта с которым будет происходить работа.
  • --threads — Не обязательный. Количество рабочих потоков. По умолчанию 10. Эту цифру можно изменить в config.ini, в опции «default_threads». При использовании Selenium необходимо подобрать оптимальное для вашего случая количество потоков. Каждый из них будет являться полноценно запущенным процессом Firefox (а не отдельными окнами единого процесса), что приводит к серьёзному потреблению RAM. В config.ini, в секции «[selenium]», есть опция «max_threads» - максимальное количество потоков для selenium модулей. По умолчанию она равна 5.
  • --protocol — Не обязательный. Протокол работы с веб-сервером. Может принимать значения «http» или «https». По умолчанию «http». Регистр указания не важен.
  • --method — Не обязательный. Метод обращения к веб-серверу при работе. Может принимать значения «get», «post», «head». Регистр указания не важен. По умолчанию «head». Если указана опция --not-found-re, а данный параметр либо не указан либо указан как «head», то его значение становится «get» т. к. в данном случае WS необходимо получать тело страницы.
  • --not-found-re — В данном параметре указывается регулярное выражение. Если в теле или заголовках ответа веб-сервера найдётся совпадение с ним, то ответ будет считаться аналогом 404. Для работы с selenium этот параметр обязателен.
  • --not-found-size — Не обязательный. Определяет ответ 404 по размеру тела ответа в байтах. Не работает в Selenium-режиме.
  • --not-found-codes — Не обязательный. Коды ответов веб-сервера которые необходимо принимать за 404. Указываются через запятую. Например «302,301». К ним автоматически добавляется 404.
  • --delay — Не обязательный. Параметр обозначающий задержку в секундах перед отправкой запросов к цели. Обратите внимание на то, что задержка осуществляется не для всех отправляемых запросов в целом, а для каждого рабочего потока в отдельности.
  • --selenium — Не обязательный. Включение selenium-режима.
  • --ddos-detect-phrase — Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS ожиданием или какой-то JS-проверкой не требующей действий пользователя. При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (проверка закончится и будет показан реальный контент).
  • --ddos-human-action — Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS требующая действий человека (например решение капчи). При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (человек прошёл проверку и теперь показан реальный контент).
  • --browser-recreate-re — Не обязательный. В данном параметре указывается регулярное выражение. Используется только с selenium. Если в теле ответа веб-сервера найдётся совпадение с ним, то браузер рабочего потока будет пересоздан.
  • --proxies — Не обязательный. Текстовый файл со списком прокси-серверов в формате «ip:port» на строку.
  • --headers-file — Не обязательный. Файл с http-заголовками в формате "Заголовок: значение" на строку. Они будут добавлены в каждый http-запрос. Не используется в selenium-режиме.

Примеры запуска

# Поиск резервных копий на хосте example.com, запросы отправляются методом POST 
./main.py testProject BackupsFounder scan --host example.com --method post

Замечания

Может сильно расходовать RAM т. к. хранит в ней все варианты проверок адресов предварительно генерируя их в начале работы. В будущих версиях это будет исправлено.

У некоторых CMS есть директории в которые запрещается любой доступ на уровне веб-сервера. На любое обращение к ним (к существующему или не существующему файлу) сервер отвечает кодом 403. Работа с такими скриптами у модуля Cms может вызывать наполнение БД большим количеством URL с кодом 403. А BF, в свою очередь, генерируя на их основе возможные адреса резервных копий, будет получать очень большое количество положительных ответов и его работа будет заканчиваться прерыванием с сообщением «Many positive detections...». Во избежание этого используйте параметр «--not-found-codes» со значением 403.

Fuzzer*

В WS существует 2 модуля фаззинга — FuzzerUrls и FuzzerHeaders. Первый занимается фаззингом URL, второй — фаззингом заголовков.

Фаззинг URL происходит следующим образом. Модуль получает из БД ссылки целевого хоста с параметрами. Для каждой ссылки генерируется несколько её вариаций с использованием шаблонов из bases/fuzzer-templates.txt для каждого из параметров в отдельности. То есть, если у ссылки 3 параметра, то фаззер сгенерирует 3 проверочных URL в каждом из которых один из параметров будет изменён в соответствии с шаблоном, а остальные останутся не тронутыми, со своими первоначальными значениями. К примеру, в bases/fuzzer-tempates.txt у нас лежит один шаблон «|name|[]=|value|» (здесь «|name|» - маркер для имени параметра, а |value| - для его значения). И в БД у нас одна ссылка - «/index.php?a=1&b=2&c=3». Тогда FuzzerUrl сгенерирует для проверки следующие адреса:

  • /index.php?a[]=1&b=2&c=3
  • /index.php?a=1&b[]=2&c=3
  • /index.php?a=1&b=2&c[]=3

Каждый из которых будет запрошен. В теле ответа WS будет искать любые выражения из файла bases/bad-words.txt. Если любое из них будет найдено, модуль запишет ссылку в результат сканирования вместе со словом(словами).

FuzzerHeaders действует похожим образом, но с HTTP-заголовками. Он извлекает из БД все ссылки целевого хоста и начинает запрашивать каждую из них, помещая в запрос заголовок из bases/fuzzer-headers.txt (по очереди). В качестве значения проверяемого заголовка используется строка из bases/fuzzer-evil-value.txt. Тело каждого ответа проверяется на наличие фраз из bases/bad-words.txt. Если любое из них будет найдено, модуль запишет ссылку и заголовок в результат сканирования вместе со словом (словами).

В конце работы все результаты будут выведены в stdout, а также внесены в БД в таблицу requests (вкладка «Запросы» в веб-части).

Запуск

Действие у данного модуля только одно — scan. Параметры:

  • --host — Обязательный. Имя хоста проекта с которым будет происходить работа.
  • --threads — Не обязательный. Количество рабочих потоков. По умолчанию 10. Эту цифру можно изменить в config.ini, в опции «default_threads». При использовании Selenium необходимо подобрать оптимальное для вашего случая количество потоков. Каждый из них будет являться полноценно запущенным процессом Firefox (а не отдельными окнами единого процесса), что приводит к серьёзному потреблению RAM. В config.ini, в секции «[selenium]», есть опция «max_threads» - максимальное количество потоков для selenium модулей. По умолчанию она равна 5.
  • --protocol — Не обязательный. Протокол работы с веб-сервером. Может принимать значения «http» или «https». По умолчанию «http». Регистр указания не важен.
  • --method — Не обязательный. Метод обращения к веб-серверу при работе. Может принимать значения «get», «post», «head». Регистр указания не важен. По умолчанию «head». Если указана опция --not-found-re, а данный параметр либо не указан либо указан как «head», то его значение становится «get» т. к. в данном случае WS необходимо получать тело страницы.
  • --delay — Не обязательный. Параметр обозначающий задержку в секундах перед отправкой запросов к цели. Обратите внимание на то, что задержка осуществляется не для всех отправляемых запросов в целом, а для каждого рабочего потока в отдельности.
  • --proxies — Не обязательный. Текстовый файл со списком прокси-серверов в формате «ip:port» на строку.
  • --selenium — Только FuzzerUrls. Не обязательный. Включение selenium-режима.
  • --ddos-detect-phrase — Только FuzzerUrls. Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS ожиданием или какой-то JS-проверкой не требующей действий пользователя. При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (проверка закончится и будет показан реальный контент).
  • --ddos-human-action — Только FuzzerUrls. Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS требующая действий человека (например решение капчи). При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (человек прошёл проверку и теперь показан реальный контент).
  • --browser-recreate-re — Только FuzzerUrls. Не обязательный. В данном параметре указывается регулярное выражение. Используется только с selenium. Если в теле ответа веб-сервера найдётся совпадение с ним, то браузер рабочего потока будет пересоздан.
  • --headers-file — Не обязательный. Файл с http-заголовками в формате "Заголовок: значение" на строку. Они будут добавлены в каждый http-запрос. Не используется в selenium-режиме.

Пример запуска

# Сканирование хоста example.com 
./main.py testProject FuzzerHeaders scan --host example.com
# Сканирование хоста example.com с использованием Selenium в 4 потока. Определение страницы с DDoS-защитой по фразе «DDoS protection by Cloud». 
./main.py testProject FuzzerHeaders scan --host example.com --selenium=1 --ddos-detect-phrase "DDoS protection by Cloud" --ddos-bypass-delay 7 --threads 4

Замечания

Может сильно расходовать RAM т. к. хранит в ней все варианты проверок адресов предварительно генерируя их в начале работы. В будущих версиях это будет исправлено.

FormBruter

Модуль FormBruter предназначен для подбора паролей к формам POST-методом. Как и другие модули работающие с web он имеет обычную и selenium реализации. Главным их отличием друг от друга является использование разных источников конфигурации. В первом случае это конфигурационная строка с передаваемыми POST-параметрами и их значениями. Во втором — файл с css-селекторами элементов страницы. Это разделение сделано потому, что css-селекторы могут содержать символы которые могут быть неправильно интерпретированы оболочкой командной строки и восприниматься ею как её рабочие символы.

Модуль учитывает параметр «positive_limit_stop» из config.ini, секция «[main]». Как только количество найденных результатов достигает этого числа, модуль прекращает работу (подразумевается наличие массовых ложных срабатываний).

Конфигурация перебора

При работе с обычным, не selenium, перебором модуль в качестве настроек использует строку передаваемую в параметре «--сonfstr». Представляет она из себя обычную строку POST-параметров, т.е. состоит из имён параметров и их значений с разделением символом «&». На место логина ставится фраза «^USER^», на место пароля ставится «^PASS^». Они являются маркерами для модуля обозначающими на какое место какие фразы помещать. К примеру, у нас есть форма в которой имя пользователя пишется в поле с именем «login», а пароль в поле с именем «password». Тогда строка конфигурации будет выглядеть следующим образом: «login=^USER^&password=^PASS^». И модуль уже будет отправлять на сервер POST-запросы вида «login=root&password=1111», «login=root&password=abcd» и т. д.

В случае с selenium реализацией используется файл конфигурации. Это текстовый многострочный файл в котором каждая строка отвечает за отдельное поле формы и имеет синтаксис «обозначение[TAB]css-селектор». Обозначения бывают трёх видов - «^USER^» для логина, «^PASS^» для пароля, «^SUBMIT^» для кнопки при нажатии на которую форма отправляется на сервер. За обозначением идёт символ табуляции (\t). Будьте внимательны с редакторами которые вместо табуляции вставляют несколько пробелов — такое решение работать не будет. И в конце строки располагается css-селектор для выбора элемента который нужно заполнить или нажать. Если под него попадает несколько элементов, то использован будет первый из них.

Пример:

^USER^	#input_username 
^PASS^	#input_password 
^SUBMIT^	#input_go

Запуск

Действие у данного модуля только одно — brute. Параметры:

  • --host — Обязательный. Имя хоста проекта с которым будет происходить работа.
  • --dict — Обязательный. Словарь с которым будет происходить работа.
  • --url — Обязательный. Адрес по которому находится целевая форма.
  • --login — Обязательный. Имя пользователя к которому будет осуществляться подбор.
  • --conffile — Только при работе с selenium. Обязательный. Файл с конфигурацией перебора.
  • --confstr — При работе с обычным перебором (не selenium). Обязательный. Строка с конфигурацией перебора
  • --true-phrase — Обязательный если не указан --false-phrase. Фраза по наличию которой в теле ответа можно считать что пароль подобран.
  • --false-phrase — Обязательный если не указан --true-phrase. Фраза по наличию которой в теле ответа можно считать что пароль не подобран.
  • --first-stop — Не обязателен. Останавливаться ли после обнаружения первого пароля. По умолчанию 0 (нет).
  • --protocol — Не обязательный. Протокол работы с веб-сервером. Может принимать значения «http» или «https». По умолчанию «http». Регистр указания не важен.
  • --parts — Не обязательный. Параметр используется при работе с частями словарей. В нём нужно указать на сколько частей необходимо разбить словарь или маску перед началом работы.
  • --part — Не обязательный. Параметр используется при работе с частями словарей. В нём указывается с какой конкретно частью сейчас нужно работать.
  • --threads — Не обязательный. Количество рабочих потоков. По умолчанию 10. Эту цифру можно изменить в config.ini, в опции «default_threads». При использовании Selenium необходимо подобрать оптимальное для вашего случая количество потоков. Каждый из них будет являться полноценно запущенным процессом Firefox (а не отдельными окнами единого процесса), что приводит к серьёзному потреблению RAM. В config.ini, в секции «[selenium]», есть опция «max_threads» - максимальное количество потоков для selenium модулей. По умолчанию она равна 5.
  • --delay — Не обязательный. Параметр обозначающий задержку в секундах перед отправкой запросов к цели. Обратите внимание на то, что задержка осуществляется не для всех отправляемых запросов в целом, а для каждого рабочего потока в отдельности.
  • --selenium — Не обязательный. Включение selenium-режима.
  • --ddos-detect-phrase — Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS ожиданием или какой-то JS-проверкой не требующей действий пользователя. При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (проверка закончится и будет показан реальный контент).
  • --ddos-human-action — Не обязательный. Фраза, нахождение которой в теле ответа означает что сработала защита от DDoS требующая действий человека (например решение капчи). При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (человек прошёл проверку и теперь показан реальный контент).
  • --browser-recreate-re — Не обязательный. В данном параметре указывается регулярное выражение. Используется только с selenium. Если в теле ответа веб-сервера найдётся совпадение с ним, то браузер рабочего потока будет пересоздан.
  • --proxies — Не обязательный. Текстовый файл со списком прокси-серверов в формате «ip:port» на строку.
  • --retest-codes — Не обязательный. Коды ответов веб-сервера при получении которых нужно перепроверять запрошенный пароль. Указываются через запятую. Например «500,502». Встретив такой код в ответе веб-сервера WS подождёт 5 секунд и повторит запрос. Это время редактируется в config.ini в секции «[form_bruter]» в параметре retest_delay. Там же присутствует параметр retest_limit обозначающий количество раз перепроверки. По умолчанию 30.
  • --headers-file — Не обязательный. Файл с http-заголовками в формате "Заголовок: значение" на строку. Они будут добавлены в каждый http-запрос. Не используется в selenium-режиме.
  • --min-pass-len — Не обязательный. Минимальная длина пароля для работы. Если меньше - модуль пропускает пароль и берёт следующий.
  • --max-pass-len — Не обязательный. Максимальная длина пароля для работы. Если больше - модуль пропускает пароль и берёт следующий.

Пример запуска

# С помощью selenium брутим форму по адресу example.com/auth.php. Логин root, словарь с паролями pass.txt, файл конфигурации перебора form-bruter.txt. Успех определяем по фразе «Success!» в ответе сервера, останавливаем работу после первого найденного пароля. Определяем защиту от ботов по фразе PROTECTION. 
 
./main.py test FormBruter brute --host example.com --url /auth.php --threads=1 --conffile form-bruter.txt --login root --dict pass.txt --true-phrase Success! --selenium=1 --ddos-detect-phrase=PROTECTION —first-stop=1 

# Брутим в 10 потоков форму по адресу example.com/auth.php. Логин root, словарь с паролями pass.txt, строка отправляемых post-параметров «user=^USER^&password=^PASS^». Успех определяем по отсутствию фразы «password» в ответе сервера, останавливаем работу после первого найденного пароля.
 
./main.py test FormBruter brute --host example.com --url /auth.php --threads=10 --confstr 'user=^USER^&password=^PASS^' --login root --dict pass.txt --false-phrase password —first-stop=1 

Базы

Базы всех модулей кроме Cms находятся в директории bases. Вы можете свободно их редактировать, а также использовать свои собственные словари и списки. Указывая любому модулю путь к файлу баз учитывайте что он указывается из корня WS, а не из директории bases.

bad-words.txt — список «плохих» слов, наличие которых в ответе означает о произошедшей ошибке. Используется модулями Fuzzer* и Spider

bf-dirs.txt — список шаблонов для директорий для модуля BackupsFinder

bf-files.txt — список шаблонов для файлов для модуля BackupsFinder

dns-names.txt — не большой словарь имён для поиска поддоменов модулем DnsBruteDict

dns-servers.txt — список dns-серверов которые будут использованы для работы модулей DnsBrute*

fuzzer-evil-value.txt — выражение используемое как payload модулем FuzzerUrls с целью вызвать ошибку на целевом сервере.

fuzzer-headers.txt — список заголовков которые проверяет модуль FuzzerHeaders.

fuzzer-templates.txt — список шаблонов для модификации параметров в ссылках модулем FuzzerUrls.

pre-backups-dirs.txt — список директорий для быстрого поиска резервных копий модулем Pre.

pre-backups-files.txt — список файлов для быстрого поиска резервных копий модулем Pre.

pre-dafs-dirs.txt — список для быстрого поиска директорий модулем Pre.

pre-dafs-files.txt — список для быстрого поиска файлов модулем Pre.

pre-domain-names.txt — список для поиска поддоменов модулем Pre.

В директори bases/dafs находятся несколько словарей для модуля DafsDict.

dirs_all_wor.txt — словарь директорий без верхнего регистра (фраза «wor» от «without register»)

dirs_all_wr.txt — словарь директорий в именах которых есть буквы в верхнем регистре (фраза «wr» от «with register»)

dirs_all.txt — смешанный вариант двух предыдущих словарей.

files_all_wor.txt — словарь файлов без верхнего регистра

files_all_wr.txt — словарь файлов в именах которых есть буквы в верхнем регистре

files_all.txt — смешанный вариант двух предыдущих словарей.

files_arch.txt — словарь файлов с расширениями архивов

files_php_wor.txt — словарь php-файлов без верхнего регистра

files_php_wr.txt — словарь php-файлов в именах которых есть буквы в верхнем регистре

files_php.txt — смешанный вариант двух предыдущих словарей.

bases/useragents.txt — Список вариантов User-Agent для HTTP-запросов отправляемых WS. Конкретный User-Agent выбирается случайно в начале работы.

Базы для модуля CMS хранятся в БД в таблицах cms, cms_paths, cms_paths_hashes. В cms хранятся имена скриптов чьи сигнатуры внесены в базу. В cms_paths_hashes хранятся пути директорий этих скриптов с их md5-хешами для уникальности. В cms_paths хранится связка id-сигнатуры+id-хеша. Каждый внесённый в базу путь уникален, что позволяет за минимальное количество запросов проверить совпадение с максимальным количеством сигнатур.

Маски

В модулях DafsMask и DnsBruteMask как источник для перебора можно указывать символьные маски. Наборы символов для них используются стандартные:

  •  ?l — все буквы английского алфавита, нижний регистр
  •  ?u — все буквы английского алфавита, верхний регистр
  •  ?d — все цифры

Набор ?s отсутствует из-за неиспользования данных символов в именах директорий/файлов, а также доменных имён.

Существует два варианта указаний масок.

  1. Простая маска с указанием каждого символа. Например «?l?l?d?d» - все фразы длиною в 4 символа где первые два — буквы английского алфавита в нижнем регистре, а последние 2 — цифры.
  2. Маска с диапазоном длинны. Например «?l?d,1,4» - все фразы длиною от 1 до 4 символов, состоящие из букв английского алфавита нижнего регистра и чисел.

В версии 0.1a работа с масками была очень требовательна к памяти, однако теперь это исправлено. Теперь в каждый момент сканирования в памяти находится лишь текущая фраза из маски которую WS должен проверить и указатель на следующую. Таким образом, можно запускать работу с масками любого объёма на VDS любой мощности не привязываясь к RAM.

Логирование работы

У WS существует механизм логирования рабочего процесса предназначенный для более эффективного проведения сканирований.

В директории logs для каждого рабочего модуля существует своя директория. Внутри неё WS создаёт папки с датами в которые работал модуль. Внутри них есть папки со временем работы. В каждой такой папке находится файл run.log — в нём сохраняется копия всего выводимого модулем кроме счётчика прогресса.

У модулей BackupsFinder, Dafs* и FormBruter также присутствует директория items. В неё WS помещает текстовые файлы имя которых — проверяемый объект, а содержимое — ответ сервера. Расширение у таких файлов может быть .bin (если ответ был бинарным) и .txt (если ответ был текстовым). Таким образом, вы всегда можете посмотреть что сервер ответил на запрос того или иного файла, директории, пароля и пр. При необходимости эту функцию можно отключить в config.ini, секции «[main]», параметре «log_modules_items» установив его в 0.

Прокси-сервера

На данный момент WS поддерживает работу с http(s) прокси-серверами без авторизации. У каждого рабочего модуля есть параметр «--proxies» в котором можно указать файл со списком прокси-серверов в формате «адрес:порт» на строку.

В начале работы каждый поток получает свой индивидуальный, выбираемый случайным образом, прокси-сервер из указанного пользователем списка. Далее поток совершает количество запросов указанное в config.ini, секции «[main]», параметре «requests_per_proxy». После чего берётся следующий прокси-сервер также случайным образом. При работе с selenium смена прокси-сервера происходит вместе с пересозданием окна браузера.

Прежде чем выдать потоку очередной прокси, WS проверяет его работоспособность. До версии 0.2a включительно, это делалось запросом ссылки http://google.com. После 0.2a это делается запросом целевого хоста. Если запрос не проходит, выбирается следующий прокси из списка.

В config.ini, секции «[main]», параметре «proxies_died_limit» находится лимит встретившихся под ряд «мёртвых» прокси (именно один за другим). Как только он будет достигнут WS останавливает работу.

Selenium

Сканирование с использованием Selenium применяется для обхода защит от ботов. Как правило, при первом посещении, прежде чем допустить пользователя до реального содержимого сайта, такие системы защиты сперва отображают JavaScript-код совершающий особые действия. Например записывающий что-нибудь в cookies или выжидающий определённое количество времени. Если к такой странице обращается примитивный бот, не способный обработать JavaScript, то он не сможет уйти дальше страницы проверки и таким образом не будет допущен до целевого сайта. Selenium позволяет все необходимые действия совершать с помощью настоящего браузера, а значит и успешно обходить подобные проверки.

Selenium-режим реализован во всех рабочих модулях кроме FuzzerHeaders и включается параметром «--selenium=1» указываемом при запуске. Вместе с ним можно (но не обязательно) задавать ещё «--ddos-detect-phrase» и «--ddos-human-action».

В «--ddos-detect-phrase» указывается фраза, нахождение которой в теле ответа означает что сработала защита от ботов ожиданием или какой-то JS-проверкой не требующей действий пользователя. При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (проверка закончилась и будет показан реальный контент).

В «--ddos-human-action» указывается фраза, нахождение которой в теле ответа означает что сработала защита от ботов требующая действий человека (например решение captcha). При её обнаружении WS просто будет ждать пока она не исчезнет из тела страницы (человек прошёл проверку и теперь показан реальный контент).

Содержимое этих параметров вы можете определить очень просто. Запросите любую страницу целевого сайта с помощью консольного curl, wget или другим примитивным способом (не браузером). В случае наличия защиты вы увидите страничку содержащую код проверки браузера. Возьмите из неё любую уникальную фразу и поместите в нужный параметр.

Используя Selenium следует помнить что работа через браузер занимает значительно больше времени и ресурсов в отличие от простого сканирования стандартными средствами. Обычная работа по сырому HTTP(S) в 10 потоков врятли «съест» много ресурсов, однако 10 потоков Selenium могут потреблять несколько гигабайт оперативной памяти (каждый поток — не просто отдельное окно, а отдельный полноценный экземпляр браузера). По этой причине в WS на данный момент стандартное ограничение на максимальное кол-во потоков для Selenium — 5. Вы можете изменить эту цифру в config.ini в параметре «max_threads» раздела «[selenium]» .

В работе с Selenium используется браузер Firefox, путь к которому можно указать в config.ini (раздел «[selenium]», параметр «firefox_path»). По-умолчанию это «/usr/bin/firefox». В вашей ОС он может быть другим.

По умолчанию работа браузеров видна т. к. в config.ini параметр «virtual_display» имеет значение «0». Это позволяет следить за ходом сканирования и при необходимости останавливать и корректировать его. Если установить данный параметр в «1», то окна браузеров будут открываться в виртуальном дисплее и вам будут не видны. Это же решение позволяет запускать selenium-сканирования на VDS не имеющих графической оболочки. Однако помните о том что данный вид сканирования очень «капризный» и не до конца протестирован/отлажен. Лучше если он будет работать в видимом режиме и под вашим присмотром.

Неприятной особенностью работы с Selenium на данный момент является то, что загружая целевую страницу браузер обращается к массе других адресов содержащихся в ней (иконки, js-скрипты, шрифты и пр.). Иногда такие обращения виснут на стадии ожидания ответа или передачи данных. Пока что эта проблема частично решена тем что в создаваемых браузерах отключается загрузка CSS, картинок и Flash с помощью config.ini (смотрите раздел конфигурации). Тем не менее, проблема встречается. Для её решения в config.ini можно использовать параметр «timeout_page_load» в котором указывается максимальное время ожидания загрузки страницы. По умолчанию это 15 секунд. Однако если каждая страничка будет грузиться по 15 секунд (предположим что зависающее обращение есть на всех страницах сайта) то скорость сканирования значительно упадёт. В этом случае можно проблемный хост внести в /etc/hosts с IP 127.0.0.1. Если конечно он не является целевым и вы не используете прокси.

Остерегайтесь также загрузки больших объёмов данных. Например обращение к большому архиву по ссылке Spider`ом откроет диалоговое окно его загрузки, но в основном окне работа продолжится. Загрузки в Firefox устроены так, что они происходят даже если пользователь не нажал «ОК» в диалоге сохранения. То есть пока окно будет работать архив будет загружаться во временную директорию и занимать место на HDD. Помните об этом и лучше не убирайте из настроек паука игнорирование расширений архивов, видео и прочих файлов которые могут быть громоздкими. В будущих релизах эти недочёты будут исправляться.

И ещё один важный момент. При работа с Selenium не работают ограничения по загружаемому содежимому — т. е. ограничения по объёму (config.ini max_size) и mime-типам.

Web-часть

Веб-часть WS используется для просмотра результатов его работы. На главной её странице выводится список проектов. На странице каждого из них — список внесённых в базу хостов. Страница хоста содержит 3 вкладки:

  • Карта URL (структура сайта в древовидной форме)
  • Информация (результаты работы модулей Pre и Cms)
  • Запросы (результаты работы модулей BackupsFounder и FuzzerHeader)

На данный момент в веб-части более ничего нет. Вносить изменения в базу через неё нельзя.

Wws-1.png

Wws-2.png

Wws-3.png

Важные предупреждения

WS предназначен для проведения именно легальных тестов на проникновение. Его использование для совершения противоправных действий строго запрещено. Помните об УК и об ответственности которая может наступить в следствии нарушения его статей.

Программа распространяется на условиях «как есть» («as is»). Авторы WS не несут ответственности за прямой или косвенный ущерб причинённый кому-либо в следствие использования WS.

Авторы / Контакты

Антон Кузьмин (anton.kuzmin.russia@gmail.com) http://anton-kuzmin.ru (ru) http://anton-kuzmin.pro (us)

Алексей Мещеряков (tank1st99@gmail.com)


Будем благодарны за любые советы, идеи, баг-репорты и просто содержательные комментарии.

Форум проекта: http://hack4sec.pro/forum/viewforum.php?f=4
Видео-обзор: https://www.youtube.com/watch?v=NcJpjZ7AesA

http://hack4sec.pro
https://github.com/hack4sec