
Outil auto-hébergé de surveillance passive continue des sous-domaines.
Outil de surveillance de sous-domaines rapide et convivial pour une gestion continue de la surface d'attaque.

Pourquoi opter pour sub.Monitor ? Ce programme offre une installation facile grâce à l'utilisation de SQLite pour stocker tous les domaines identifiés (supprimant la nécessité d'une gestion préalable de la base de données). De plus, il est hautement personnalisable, les utilisateurs n'ayant besoin d'ajouter que quelques lignes de code au script en utilisant leurs outils choisis. Contrairement à d'autres solutions existantes reposant sur des bases de données telles que MySQL ou MongoDB, l'initialisation du script peut devenir une tâche fastidieuse.
Indicateurs sub.Monitor :
options:
--add ADD Domaine à analyser
--out-scope OUT_SCOPE
Fichier avec les domaines hors périmètre
--file FILE Fichier avec les sous-domaines connus
-D DOMAIN, --domain DOMAIN
Domaine à analyser
-H HOURS, --hours HOURS
Heures entre les analyses
--dump Vider tous les sous-domaines pour un domaine spécifique
--list Lister tous les domaines racine dans la base de données
-df DF Fichier avec les domaines à analyser
--inscope Vider uniquement les domaines dans le périmètre
--notinscope Vider uniquement les domaines hors périmètre
--dumpall Vider tous les sous-domaines avec leurs détails
--info Afficher la date de découverte des sous-domaines
-help, -? Afficher ce message d'aide et quitter
Vous devez écrire les chemins des fichiers de configuration (api) dans le fichier config.ini.
pip3 install -r requirements.txtVous pouvez facilement implémenter vos propres outils dans le script, modifiez simplement les lignes de code :
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}'
Il est important de noter que si vous ajoutez un outil personnalisé, la dernière sortie doit être les résultats du domaine afin que sub.Monitor les enregistre dans la base de données. Par exemple, la manière de l'utiliser serait :
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
Ajoutez également le nom de votre outil ici :
for tool in ['subfinder', 'amass', 'assetfinder', 'my-custom-tool-name']:
run_tool(tool, domain, output_file)
Enfin, bien sûr, vous devez ajouter l'outil dans le fichier sub.monitor-config.ini pour que le script python puisse obtenir le binaire à partir de ce fichier de configuration.
La seule chose nécessaire est qu'une fois la commande terminée, elle doit afficher en sortie tous les domaines découverts afin que l'outil puisse les enregistrer dans le fichier de logs et dans la base de données.
Tout d'abord, sub.Monitor a besoin d'une liste de domaines déjà scannés :
➜ cat ibm_sorted_subdomains.txt
test1.ibm.com
test2.ibm.com
test3.ibm.com
subtest.testX.ibm.com
...
Maintenant, le fichier contenant les sous-domaines peut être passé à sub.Monitor avec la commande suivante :
python3 monitor.py --add ibm.com --file ibm_sorted_subdomains.txt
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
[2023-06-06 18:16:26.002521] - 538 sous-domaines ont été ajoutés à la base de données locale.
Il est également possible d'ajouter un indicateur hors périmètre. Par exemple, disons qu'un programme de Bug Bounty a la politique suivante :
*.ibm.com - dans le périmètre
super-admin.ibm.com - hors périmètre
*.super-admin.ibm.com - hors périmètre
Il est possible de créer un fichier avec ces éléments :
cat outscope.txt
super-admin.ibm.com
*.super-admin.ibm.com
Maintenant, vous pouvez ajouter manuellement tous vos domaines découverts à la base de données (en filtrant ceux qui sont dans le périmètre) :
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 sous-domaines ont été ajoutés à la base de données locale.
Cela ajoutera tous vos sous-domaines à la base de données, mais marquera ceux qui sont hors périmètre avec le drapeau [Hors périmètre] (nous verrons comment filtrer les domaines dans le périmètre depuis la base de données dans la section de vidage des domaines).
Pour confirmer que le domaine a été ajouté à la base de données, exécutez :
python3 monitor.py --list
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
ibm.com [9 sous-domaines ajoutés manuellement] [2 sous-domaines découverts] [11 uniques totaux dans la base de données]
Une fois qu'il a été correctement chargé, le processus de surveillance peut commencer. Il est recommandé d'utiliser TMUX sur un VPS et de le laisser tourner longtemps. Avec la commande suivante, le script exécutera les outils d'énumération de sous-domaines et comparera les nouveaux résultats avec les anciens. Si un nouveau sous-domaine est trouvé, sub.Monitor l'ajoutera d'abord à la base de données locale (afin de ne plus notifier cette découverte), puis notifiera l'utilisateur via slack/telegram/discord.
python3 monitor.py -D ibm.com -H 12 --out-scope outscope.txt
Si un sous-domaine est trouvé, sub.Monitor affichera le message suivant dans la sortie :
➜ python3 monitor.py -D ibm.com -H 8 # Pour filtrer les sous-domaines qui sont dans le périmètre actuel parmi ceux hors périmètre, vous pouvez utiliser :
# python3 monitor.py -D ibm.com -H 8 --out-scope outscope.txt
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
[2023-06-06 18:07:25.191169] - Nouveau sous-domaine xxxx.ibm.com découvert
[2023-06-06 18:07:25.353156] - Nouveau sous-domaine xyxyxyxyxyx.ibm.com découvert
[2023-06-06 18:07:25.641082] - Nouveau sous-domaine x1.xxxx.ibm.com découvert
Il est également possible de surveiller plus d'un domaine, avec la commande suivante :
python3 monitor.py -df root-domains.txt -H 8
python3 monitor.py -df roots.txt -H 8 --out-scope outscope.txt
Après que ces messages sont signalés, en même temps l'utilisateur recevra les notifications sur Telegram.

Comment gérer les notifications ? J'ai trouvé un moyen assez simple (et facile à gérer) de voir tous les nouveaux domaines découverts avec Discord. J'ai cela (flouté car ce sont tous des programmes privés) :

L'idée est d'abord de créer une catégorie selon le nom du programme :
> Yahoo
--- yahoo.com
--- yahoo.net
--- etc ...
> IBM
--- ibm.com
--- whateverdomain.com
--- etc ...
Voici à quoi ressemble mon fichier de configuration notify :

Je recommande de faire cela pour chaque domaine (cela peut être assez fastidieux à configurer mais c'est un excellent moyen de gérer les résultats). Le script monitor.py enverra les résultats au webhook donné en fonction de l'ID (qui doit être le même que le nom de domaine à analyser).
Supposons que le script ait tourné pendant 2 mois et que vous souhaitiez obtenir tous les résultats (anciens sous-domaines et nouveaux découverts). Avec sub.Monitor, c'est possible en utilisant l'indicateur --dump :
python3 monitor.py -D ibm.com --dump
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
Sous-domaines pour ibm.com :
subdomain1.ibm.com
subdomain2.ibm.com
...
Vous pouvez également utiliser la commande suivante pour voir le jour où le domaine a été découvert :
python3 monitor.py -D ibm.com --dump --info
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
Sous-domaines pour ibm.com :
test.ibm.com [découvert le 06/08/2023]
test2.ibm.com [découvert le 08/08/2023] [Hors périmètre]
Comme il est fort probable que certains domaines soient marqués comme hors périmètre en utilisant la commande python3 monitor.py -d ibm.com --dump --info, pour n'afficher que les domaines dans le périmètre, il est possible d'utiliser l'indicateur --inscope :
python3 monitor.py -D ibm.com --dump --info --inscope
_ ___ ___ _ _
| | | \/ | (_) |
___ _ _| |__ | . . | ___ _ __ _| |_ ___ _ __
/ __| | | | '_ \| |\/| |/ _ \| '_ \| | __/ _ \| '__|
\__ \ |_| | |_) | | | | (_) | | | | | || (_) | |
|___/\__,_|_.__/\_| |_/\___/|_| |_|_|\__\___/|_|
github.com/e1abrador/sub.Monitor
Sous-domaines pour ibm.com :
test.ibm.com [découvert le 06/08/2023]
test3.ibm.com [découvert le 08/08/2023]
Merci à :
Si vous avez une idée de nouvelle fonctionnalité, ouvrez une PR sur https://github.com/e1abrador/sub.Monitor/pulls.
Bonne chance et bonne chasse ! Si vous aimez vraiment l'outil (ou d'autres), ou s'il vous a aidé à trouver une prime géniale, envisagez DE M'OFFRIR UN CAFÉ ! ☕ (Je pourrais avoir besoin de caféine !)
⚪ e1abrador
Twitter : https://twitter.com/e1abrador