Comment trouver les sous-domaines d'un site ?

24 février 2025 - 680 mots - astuces

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.

Laisser un commentaire

Merci. Votre message a bien été enregistré.