
Самостоятельно размещаемый инструмент непрерывного мониторинга пассивных поддоменов.
Быстрый и удобный инструмент мониторинга поддоменов для непрерывного управления поверхностью атаки.

Зачем выбирать sub.Monitor? Эта программа предлагает простую настройку благодаря использованию SQLite для хранения всех обнаруженных доменов (отпадает необходимость в предварительном управлении базой данных). Кроме того, она обладает высокой настраиваемостью: пользователю нужно лишь добавить несколько строк кода в скрипт, используя выбранные инструменты. В отличие от других существующих решений, основанных на базах данных, таких как MySQL или MongoDB, инициализация скрипта может превратиться в утомительную задачу.
sub.Monitor флаги:
options:
--add ADD Domain to scan
--out-scope OUT_SCOPE
File with out-of-scope domains
--file FILE File with known subdomains
-D DOMAIN, --domain DOMAIN
Domain to scan
-H HOURS, --hours HOURS
Hours between scans
--dump Dump all subdomains for a specific domain
--list List all root domains in the database
-df DF File with domains to scan
--inscope Dump only in-scope domains
--notinscope Dump only out-of-scope domains
--dumpall Dump all subdomains with their details
--info Show discovery date for subdomains
-help, -? Show this help message and exit
Вам нужно указать пути к файлам конфигурации (api) в файле config.ini.
pip3 install -r requirements.txtВы можете легко добавить собственные инструменты в скрипт, просто изменив строки кода:
def run_tool(tool, domain, output_file):
print(f'[{datetime.datetime.now()}] - Running {tool} on {domain}')
if tool == 'assetfinder':
assetfinder_binary = config.get('Binary paths', 'assetfinder')
cmd = f'echo {domain} | {assetfinder_binary} -subs-only | grep -E "{domain}$" |grep -v "*" | grep -v "@"'
elif tool == 'subfinder':
subfinder_binary = config.get('Binary paths', 'subfinder')
subfinder_api = config.get('Api', 'subfinder_api')
cmd = f'{subfinder_binary} -d {domain} -silent -pc {subfinder_api} -all'
elif tool == 'amass':
amass_binary = config.get('Binary paths', 'amass')
amass_api = config.get('Api', 'amass_api')
cmd = f'{amass_binary} enum -passive -norecursive -noalts -d {domain} -config {amass_api}'
elif tool == 'my-custom-tool':
my-custom-tool-binary = config.get('Binary paths', 'my-custom-tool-binary-or-script')
cmd = f'{my-custom-tool-binary} -d {domain}'
Важно отметить, что если вы добавляете любой пользовательский инструмент, последний вывод должен содержать результаты по доменам, чтобы sub.Monitor мог сохранить их в базе данных. Например, способ использования будет таким:
cmd = f'bash customtool.sh {domain}''
...
cat customtool.sh
mycustomtool -d $1 > /tmp/$1.txt &>/dev/null; cat /tmp/$1.txt | unfurl domains | anew; rm -r /tmp/$1.txt
Также добавьте название вашего инструмента здесь:
for tool in ['subfinder', 'amass', 'assetfinder', 'my-custom-tool-name']:
run_tool(tool, domain, output_file)
Наконец, конечно, вам нужно добавить инструмент в файл sub.monitor-config.ini, чтобы Python-скрипт мог получить бинарный файл из этого конфигурационного файла.
Единственное необходимое условие: после завершения команды она должна вывести все обнаруженные домены, чтобы инструмент мог сохранить их в файле логов и в базе данных.
Прежде всего sub.Monitor нужен список уже просканированных доменов:
➜ cat ibm_sorted_subdomains.txt
test1.ibm.com
test2.ibm.com
test3.ibm.com
subtest.testX.ibm.com
...
Теперь файл с поддоменами можно передать sub.Monitor следующей командой:
python3 monitor.py --add ibm.com --file ibm_sorted_subdomains.txt
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
[2023-06-06 18:16:26.002521] - 538 subdomains were added to the local database.
Также есть возможность добавить флаг out-of-scope. Например, предположим, что программа Bug Bounty имеет следующую политику:
*.ibm.com - в зоне
super-admin.ibm.com - вне зоны
*.super-admin.ibm.com - вне зоны
Можно создать файл с этими данными:
cat outscope.txt
super-admin.ibm.com
*.super-admin.ibm.com
Теперь вы можете вручную добавить все обнаруженные домены в базу данных (отфильтровав те, что в зоне):
python3 monitor.py --add ibm.com --file ibm_sorted_subdomains.txt --out-scope outscope.txt
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
[2023-06-06 18:16:26.002521] - 538 subdomains were added to the local database.
Это добавит все ваши поддомены в базу данных, но пометит те, что вне зоны, флагом [Out of scope] (мы увидим, как фильтровать домены в зоне из базы данных в разделе о выгрузке доменов).
Чтобы подтвердить, что домен добавлен в базу данных, выполните:
python3 monitor.py --list
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
ibm.com [9 subdomains added manually] [2 subdomains discovered] [11 total unique in database]
После того как он корректно загружен, можно начинать процесс мониторинга. Рекомендуется использовать TMUX на VPS и оставить его работать на длительное время. Следующей командой скрипт будет запускать инструменты перечисления поддоменов и сравнивать новые результаты со старыми. Если будет найден новый поддомен, sub.Monitor сначала добавит его в локальную базу данных (чтобы больше не уведомлять об этом обнаружении), а затем уведомит пользователя через Slack/Telegram/Discord.
python3 monitor.py -D ibm.com -H 12 --out-scope outscope.txt
Если будет найден какой-либо поддомен, sub.Monitor покажет следующее сообщение в выводе:
➜ python3 monitor.py -D ibm.com -H 8 # Для фильтрации поддоменов в текущей зоне от тех, что вне зоны, можно использовать:
# python3 monitor.py -D ibm.com -H 8 --out-scope outscope.txt
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
[2023-06-06 18:07:25.191169] - New subdomain xxxx.ibm.com discovered
[2023-06-06 18:07:25.353156] - New subdomain xyxyxyxyxyx.ibm.com discovered
[2023-06-06 18:07:25.641082] - New subdomain x1.xxxx.ibm.com discovered
Также можно мониторить более одного домена с помощью следующей команды:
python3 monitor.py -df root-domains.txt -H 8
python3 monitor.py -df roots.txt -H 8 --out-scope outscope.txt
После того как эти сообщения будут выведены, пользователь одновременно получит уведомления в Telegram

Как я управляю уведомлениями? Я нашёл довольно простой (и удобный в управлении) способ просматривать все новые обнаруженные домены с помощью Discord. У меня получилось так (размыто, так как все это частные программы):

Идея состоит в том, чтобы сначала создать категорию по имени программы:
> Yahoo
--- yahoo.com
--- yahoo.net
--- etc ...
> IBM
--- ibm.com
--- whateverdomain.com
--- etc ...
Вот как выглядит мой конфигурационный файл notify:

Я рекомендую делать так для каждого домена (настройка может быть довольно утомительной, но это отличный способ управлять результатами). Скрипт monitor.py будет отправлять результаты на указанный вебхук на основе ID (который должен совпадать с именем сканируемого домена).
Допустим, скрипт работал 2 месяца, и вы хотите получить все результаты (старые поддомены и новые). С sub.Monitor это возможно с помощью флага --dump:
python3 monitor.py -D ibm.com --dump
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
Subdomains for ibm.com:
subdomain1.ibm.com
subdomain2.ibm.com
...
Вы также можете использовать следующую команду, чтобы увидеть день, когда домен был обнаружен:
python3 monitor.py -D ibm.com --dump --info
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
Subdomains for ibm.com:
test.ibm.com [discovered on 06/08/2023]
test2.ibm.com [discovered on 08/08/2023] [Out of scope]
Поскольку вполне вероятно, что некоторые домены помечены как вне зоны, при использовании команды python3 monitor.py -d ibm.com --dump --info, чтобы показать только домены в зоне, можно использовать флаг --inscope:
python3 monitor.py -D ibm.com --dump --info --inscope
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
Subdomains for ibm.com:
test.ibm.com [discovered on 06/08/2023]
test3.ibm.com [discovered on 08/08/2023]
Спасибо:
Если у вас есть идея какой-либо новой функциональности, откройте PR на https://github.com/e1abrador/sub.Monitor/pulls.
Удачи и успешной охоты! Если вам действительно нравится инструмент (или любые другие), или они помогли вам найти отличный баунти, подумайте о ПОКУПКЕ МНЕ КОФЕ! ☕ (Кофеин мне бы не помешал!)
⚪ e1abrador
Twitter: https://twitter.com/e1abrador