
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: