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.