
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
Wenn eine Subdomain gefunden wird, zeigt sub.Monitor die folgende Meldung in der Ausgabe an:
➜ python3 monitor.py -D ibm.com -H 8 # Um die Subdomains zu filtern, die im aktuellen Scope sind, von denen, die out of scope sind, kannst du:
# 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
Es ist auch möglich, mehr als eine Domain zu überwachen, mit folgendem Befehl:
python3 monitor.py -df root-domains.txt -H 8
python3 monitor.py -df roots.txt -H 8 --out-scope outscope.txt
Nachdem diese Meldungen gemeldet wurden, erhält der Benutzer gleichzeitig die Benachrichtigungen auf Telegram.

Wie verwalte ich die Benachrichtigungen? Ich habe einen ziemlich einfachen (und einfach zu verwaltenden) Weg gefunden, um alle neu entdeckten Domains mit Discord zu sehen. Ich habe das so eingerichtet (verpixelt, da es sich um private Programme handelt):

Die Idee ist, zuerst eine Kategorie für den Programmnamen zu erstellen:
> Yahoo
--- yahoo.com
--- yahoo.net
--- usw.
> IBM
--- ibm.com
--- whateverdomain.com
--- usw.
So sieht meine Notify-Konfigurationsdatei aus:

Ich empfehle, dies für jede Domain zu tun (es mag mühsam sein, dies einzurichten, aber es ist eine großartige Möglichkeit, die Ergebnisse zu verwalten). Das Skript monitor.py sendet die Ergebnisse an den gegebenen Webhook basierend auf der ID (die mit dem zu scannenden Domainnamen übereinstimmen muss).
Angenommen, das Skript läuft seit 2 Monaten und du möchtest alle Ergebnisse (alte Subdomains und neu entdeckte) abrufen. Mit sub.Monitor ist das möglich, indem du die --dump-Flag verwendest:
python3 monitor.py -D ibm.com --dump
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
Subdomains for ibm.com:
subdomain1.ibm.com
subdomain2.ibm.com
...
Du kannst auch folgenden Befehl verwenden, um das Datum anzuzeigen, an dem die Domain entdeckt wurde:
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]
Da es sehr wahrscheinlich ist, dass einige Domains mit python3 monitor.py -d ibm.com --dump --info als out of scope markiert sind, kann man mit der --inscope-Flag nur die Domains im Scope anzeigen:
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]
Danke an:
Wenn du eine Idee für eine neue Funktion hast, erstelle einen PR unter https://github.com/e1abrador/sub.Monitor/pulls.
Viel Erfolg und gute Jagd! Wenn du das Tool (oder andere) wirklich liebst, oder sie dir geholfen haben, eine tolle Prämie zu ergattern, denk darüber nach, MIR EINEN KAFFEE ZU KAUFEN! ☕ (Ich könnte das Koffein gebrauchen!)
⚪ e1abrador
Twitter: https://twitter.com/e1abrador