
Strumento di monitoraggio continuo passivo dei sottodomini auto-ospitato.
Strumento di monitoraggio dei sottodomini veloce e facile da usare per la gestione continua della superficie d'attacco.

Perché scegliere sub.Monitor? Questo programma offre una configurazione semplice grazie all'uso di SQLite per memorizzare tutti i domini identificati (eliminando la necessità di una gestione preliminare del database). Inoltre, vanta un'elevata personalizzabilità, con gli utenti che devono aggiungere solo poche righe di codice allo script utilizzando i propri strumenti. A differenza di altre soluzioni esistenti che si basano su database come MySQL o MongoDB, inizializzare lo script può diventare un compito noioso.
Flag di 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
Devi scrivere i percorsi dei file di configurazione (api) nel file config.ini.
pip3 install -r requirements.txtPuoi facilmente implementare i tuoi strumenti nello script, basta modificare le righe di codice:
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}'
È importante notare che se aggiungi uno strumento personalizzato, l'ultimo output deve essere i risultati dei domini affinché sub.Monitor li salvi nel database. Ad esempio, il modo di utilizzarlo sarebbe:
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
Aggiungi anche il nome del tuo strumento qui:
for tool in ['subfinder', 'amass', 'assetfinder', 'my-custom-tool-name']:
run_tool(tool, domain, output_file)
Infine, ovviamente, devi aggiungere lo strumento nel file sub.monitor-config.ini in modo che lo script Python possa ottenere il binario da quel file di configurazione.
L'unica cosa necessaria è che una volta terminato il comando, deve mostrare in output tutti i domini scoperti in modo che lo strumento possa salvarli nel file di log e nel database.
Prima di tutto, sub.Monitor necessita di una lista di domini già scansionati:
➜ cat ibm_sorted_subdomains.txt
test1.ibm.com
test2.ibm.com
test3.ibm.com
subtest.testX.ibm.com
...
Ora, il file contenente i sottodomini può essere passato a sub.Monitor con il comando seguente:
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.
Esiste anche la possibilità di aggiungere un flag out-of-scope, per esempio, supponiamo che un programma Bug Bounty abbia la seguente politica:
*.ibm.com - in scope
super-admin.ibm.com - out of scope
*.super-admin.ibm.com - out of scope
È possibile creare un file con questi dati:
cat outscope.txt
super-admin.ibm.com
*.super-admin.ibm.com
Ora, puoi aggiungere manualmente tutti i tuoi domini scoperti al database (filtrando quelli in scope):
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.
Questo aggiungerà tutti i tuoi sottodomini al database, ma contrassegnerà quelli fuori scope con il flag [Out of scope] (vedremo come filtrare i domini in scope dal database nella sezione di esportazione dei domini).
Per confermare che il dominio è stato aggiunto al database, esegui:
python3 monitor.py --list
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
ibm.com [9 subdomains added manually] [2 subdomains discovered] [11 total unique in database]
Una volta caricato correttamente, il processo di monitoraggio può iniziare. Si consiglia di usare TMUX in un VPS e lasciarlo in esecuzione per molto tempo. Con il seguente comando, lo script eseguirà gli strumenti di enumerazione dei sottodomini e confronterà i nuovi risultati con quelli vecchi. Se viene trovato un nuovo sottodominio, sub.Monitor lo aggiungerà prima al database locale (quindi non notificherà più quella scoperta) e poi notificherà l'utente tramite slack/telegram/discord.
python3 monitor.py -D ibm.com -H 12 --out-scope outscope.txt
Se viene trovato un sottodominio, sub.Monitor mostrerà il seguente messaggio nell'output:
➜ python3 monitor.py -D ibm.com -H 8 # To filter the subdomains that are in the current scope from the out-scope ones, you can use:
# 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
È anche possibile monitorare più di un dominio, con il seguente comando:
python3 monitor.py -df root-domains.txt -H 8
python3 monitor.py -df roots.txt -H 8 --out-scope outscope.txt
Dopo che questi messaggi vengono segnalati, contemporaneamente l'utente riceverà le notifiche su Telegram

Come gestisco le notifiche? Ho trovato un modo abbastanza facile (e facile da gestire) per vedere tutti i domini appena scoperti con Discord. Ho ottenuto questo (sfocato poiché sono tutti programmi privati):

L'idea è di creare prima una categoria relativa al nome del programma:
> Yahoo
--- yahoo.com
--- yahoo.net
--- ecc.
> IBM
--- ibm.com
--- whateverdomain.com
--- ecc.
Ecco come appare il mio file di configurazione di notify:

Raccomando di fare questo per ogni dominio (potrebbe essere piuttosto noioso da configurare, ma è un ottimo modo per gestire i risultati). Lo script monitor.py invierà i risultati al webhook specificato in base all'ID (che deve essere lo stesso del nome del dominio da scansionare).
Supponiamo che lo script sia stato in esecuzione per 2 mesi e tu voglia ottenere tutti i risultati (vecchi sottodomini e quelli scoperti di recente). Con sub.Monitor è possibile utilizzando il flag --dump:
python3 monitor.py -D ibm.com --dump
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
Subdomains for ibm.com:
subdomain1.ibm.com
subdomain2.ibm.com
...
Puoi anche usare il seguente comando per vedere il giorno in cui il dominio è stato scoperto:
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]
Poiché è molto probabile che alcuni domini siano contrassegnati come fuori scope usando il comando python3 monitor.py -d ibm.com --dump --info, per mostrare solo i domini in-scope è possibile usare il flag --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]
Grazie a:
Se hai qualche idea per nuove funzionalità apri una PR su https://github.com/e1abrador/sub.Monitor/pulls.
Buona fortuna e buona caccia! Se ami davvero lo strumento (o altri), o ti hanno aiutato a trovare una fantastica bounty, considera OFFRIMI UN CAFFÈ! ☕ (Potrei usare la caffeina!)
⚪ e1abrador
Twitter: https://twitter.com/e1abrador