Dans le cadre d’un projet de growth hacking, j’ai eu besoin de lister la liste des sous-domaines d’un site spécifique.
dig
La première idée qui m’est venue : dig (Domain Information Groper). C’est un outil en ligne de commande qui permet de récupérer des informations DNS directement en interrogeant les serveurs de noms.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| $ dig prestashop-project.org
; <<>> DiG 9.18.30-0ubuntu0.22.04.2-Ubuntu <<>> prestashop-project.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42051
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;prestashop-project.org. IN A
;; ANSWER SECTION:
prestashop-project.org. 300 IN A 104.18.16.231
prestashop-project.org. 300 IN A 104.18.17.231
;; Query time: 64 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Mon May 19 06:55:17 CEST 2025
;; MSG SIZE rcvd: 83
|
Malheureusement, on peut voir qu’il ne liste pas les sous-domaines comme on le voudrait mais juste les informations du domaine principal.
crt.sh
Seconde solution : Utiliser les certificats lié aux domaines.
La Certificate Transparency (CT) est un projet dans le cadre duquel une autorité de certification (CA) doit publier chaque certificat SSL/TLS qu’elle émet dans un log public. Un certificat SSL/TLS contient la plupart du temps des noms de domaine, des noms de sous-domaine et des adresses électroniques.
Un des moteurs de recherche les plus connus sur ce sujet est crt.sh qui a un gros avantage : on peut l’interroger directement en SQL.
Il faut d’abord installer les dépendances que l’aura besoin pour se connecter à la base de données PostgreSQL :
1
| sudo apt install postgresql-client-common postgresql-client-14
|
Après cela, on se connecte à la base de données publique :
1
| psql -h crt.sh -p 5432 -U guest certwatch
|
A ce moment, on peut l’interroger :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| WITH ci AS (
SELECT min(sub.CERTIFICATE_ID) ID,
min(sub.ISSUER_CA_ID) ISSUER_CA_ID,
array_agg(DISTINCT sub.NAME_VALUE) NAME_VALUES,
x509_commonName(sub.CERTIFICATE) COMMON_NAME,
x509_notBefore(sub.CERTIFICATE) NOT_BEFORE,
x509_notAfter(sub.CERTIFICATE) NOT_AFTER,
encode(x509_serialNumber(sub.CERTIFICATE), 'hex') SERIAL_NUMBER
FROM (SELECT *
FROM certificate_and_identities cai
WHERE plainto_tsquery('certwatch', 'prestashop-project.org') @@ identities(cai.CERTIFICATE)
AND cai.NAME_VALUE ILIKE ('%%' || 'prestashop-project.org' || '%%')
) sub
GROUP BY sub.CERTIFICATE
)
SELECT array_to_string(ci.NAME_VALUES, chr(10)) NAME_VALUE
FROM ci
LEFT JOIN LATERAL (
SELECT min(ctle.ENTRY_TIMESTAMP) ENTRY_TIMESTAMP
FROM ct_log_entry ctle
WHERE ctle.CERTIFICATE_ID = ci.ID
) le ON TRUE,
ca
WHERE ci.ISSUER_CA_ID = ca.ID
GROUP BY NAME_VALUE
ORDER BY NAME_VALUE ASC;
|
Note : Utilisez \q pour quitter le terminal PostgreSQL
Et cela fonctionne :
1
2
3
4
5
6
7
8
9
10
11
12
| name_value
-----------------------------------------
contributors.prestashop-project.org
docs.prestashop-project.org
help.prestashop-project.org
integration-help.prestashop-project.org
preprod-help.prestashop-project.org
prestashop-project.org
*.prestashop-project.org +
prestashop-project.org
www.prestashop-project.org
(8 rows)
|
Malheureusement, j’ai trouvé quelque chose à redire : et si le sous-domaine que l’on cherchait n’utilisait pas de certificats SSL.
amass
Troisième solution : utiliser une autre base de données.
La suite d’outils OWASP Amass permet d’obtenir des noms de sous-domaines en scrapant différentes sources de données, en recourant à la force brute récursive, en parcourant des archives web, en permutant/altérant des noms et en effectuant un balayage DNS inversé. Et le tout est utilisable en ligne de commande.
On commence par l’installation :
1
| sudo snap install amass
|
Ensuite, on lance la ligne de commande suivante :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $ amass enum --passive -d prestashop-project.org
integration-help.prestashop-project.org
api-nightly.prestashop-project.org
docs.prestashop-project.org
preprod-help.prestashop-project.org
www.prestashop-project.org
nightly.prestashop-project.org
build.prestashop-project.org
prestashop-project.org
api.prestashop-project.org
devdocs.prestashop-project.org
contributors.prestashop-project.org
i18n.prestashop-project.org
The enumeration has finished
Discoveries are being migrated into the local database
|
En ajoutant l’option -o output.txt, cela envoie le contenu de l’analyse dans un fichier texte.
Comme on peut le voir, cela a renvoyé plus de domaines que via crt.sh, ce qui est logique car amass utilse plusieurs sources de données dont la Certificate Transparency.
Conclusion
Au final, je recommande amass pour lister les sous-domaines. L’utilisation de multiples bases de données permet d’avoir une vue assez complète des sous-domaines via différentes techniques.