
Selbstgehostetes passives Tool zur kontinuierlichen Subdomain-Überwachung.
Schnelles und benutzerfreundliches Subdomain-Überwachungstool für kontinuierliches Attack-Surface-Management.

Warum sub.Monitor wählen? Dieses Programm bietet eine einfache Einrichtung, da es SQLite zur Speicherung aller identifizierten Domains verwendet (wodurch keine vorherige Datenbankverwaltung notwendig ist). Darüber hinaus ist es hochgradig anpassbar, da Benutzer nur wenige Zeilen Code zum Skript mit ihren ausgewählten Tools hinzufügen müssen. Im Gegensatz zu anderen bestehenden Lösungen, die auf Datenbanken wie MySQL oder MongoDB basieren, kann die Initialisierung des Skripts zu einer mühsamen Aufgabe werden.
sub.Monitor Flags:
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
Du musst die Pfade der Konfigurationsdateien (API) in der Datei config.ini eintragen.
pip3 install -r requirements.txt aus.Du kannst deine eigenen Tools einfach im Skript implementieren, indem du die folgenden Codezeilen modifizierst:
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}'
Wichtig zu beachten: Wenn du ein benutzerdefiniertes Tool hinzufügst, muss die letzte Ausgabe die Domain-Ergebnisse sein, damit sub.Monitor diese in der Datenbank speichern kann. Zum Beispiel wäre die Nutzungsweise:
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
Füge hier auch den Namen deines Tools hinzu:
for tool in ['subfinder', 'amass', 'assetfinder', 'my-custom-tool-name']:
run_tool(tool, domain, output_file)
Schließlich musst du das Tool natürlich in der Datei sub.monitor-config.ini hinzufügen, damit das Python-Skript die Binärdatei aus dieser Konfigurationsdatei abrufen kann.
Das Einzige, was benötigt wird, ist, dass nach Abschluss des Befehls in der Ausgabe alle entdeckten Domains angezeigt werden, damit das Tool sie in der Logdatei und in der Datenbank speichern kann.
Zunächst einmal benötigt sub.Monitor eine Liste bereits gescannter Domains:
➜ cat ibm_sorted_subdomains.txt
test1.ibm.com
test2.ibm.com
test3.ibm.com
subtest.testX.ibm.com
...
Die Datei mit den Subdomains kann nun mit folgendem Befehl an sub.Monitor übergeben werden:
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.
Es besteht auch die Möglichkeit, eine Out-of-Scope-Flag zu setzen. Angenommen, ein Bug-Bounty-Programm hat die folgende Richtlinie:
*.ibm.com - in scope
super-admin.ibm.com - out of scope
*.super-admin.ibm.com - out of scope
Es ist möglich, eine Datei mit diesen Informationen zu erstellen:
cat outscope.txt
super-admin.ibm.com
*.super-admin.ibm.com
Nun kannst du alle entdeckten Domains manuell zur Datenbank hinzufügen (wobei diejenigen gefiltert werden, die im Scope sind):
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.
Dadurch werden alle deine Subdomains zur Datenbank hinzugefügt, aber diejenigen, die out of scope sind, werden mit der Markierung [Out of scope] versehen (wie man im Abschnitt zum Ausgeben von Domains sehen kann, wie man In-Scope-Domains aus der Datenbank filtert).
Um zu bestätigen, dass die Domain zur Datenbank hinzugefügt wurde, führe folgenden Befehl aus:
python3 monitor.py --list
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
ibm.com [9 subdomains added manually] [2 subdomains discovered] [11 total unique in database]
Sobald es korrekt geladen wurde, kann der Überwachungsprozess gestartet werden. Es wird empfohlen, TMUX auf einem VPS zu verwenden und ihn für längere Zeit laufen zu lassen. Mit folgendem Befehl führt das Skript die Subdomain-Erkennungstools aus und vergleicht die neuen Ergebnisse mit den alten. Wenn eine neue Subdomain gefunden wird, fügt sub.Monitor sie zuerst zur lokalen Datenbank hinzu (damit sie bei dieser Entdeckung nicht mehr benachrichtigt wird) und benachrichtigt den Benutzer dann über Slack/Telegram/Discord.
python3 monitor.py -D ibm.com -H 12 --out-scope outscope.txt