[Hack] Récupérer les Cnames d’un nom de domaine

Hello les z'amis !

J'espère que pour vous la semaine s'est bien passée, et surtout que cet article permettra de profiter d'un bon Weekend bien mérité !
En attendant je vous ai concocté un petit article aux petits oignons qui m'est venue suite à une petite expérience professionnelle que l'on pourrait qualifier de plutôt "border-line". (Cela dit ... je ne pourrais malheureusement pas vous en dire plus)

Le CNAME

C'est important de commencer par là ! Car tout le monde ne sait pas de quoi il s'agit !
Lorsque vous achetez un nom de domaine, par exemple dyrk.org
Vous souhaitez en exploiter tout le potentiel, et cela commence par la création d'un "sous-domaine".
Par exemple si je souhaite faire du versionning, je vais  utiliser un sous-domaine qui pourrait être :
git.dyrk.org
Je souhaite accéder à l'administration de mon site internet :
admin.dyrk.org

Je souhaite ...
Bref vous l'aurez compris vous pouvez créer des désignations de sous-domaine à l'infini et pour tout un tas de choses.

 

Quel est le rapport avec les Hackers ?

La plupart du temps les CNAME(S) ne sont pas affichés publiquement.
Il s'agit là d'une information que vous êtes libre de propager sur le monde de l'internet ou non.
Lorsque le CNAME ne touche à aucune données sensibles on peut se dire qu'il n'y a aucun risque ...

  • blog.dyrk.org
  • ecommerce.dyrk.org

Mais lorsqu'il s'agit pour une entreprise d'un cname permettant d'accéder à des informations critiques (gestion de source / versionning, déploiement de projet, ftp, mail, ...) ça peut être extrêmement grave :

  • webmail.dyrk.org
  • phpmyadmin.dyrk.org
  • jenkins.dyrk.org
  • ...

Si un Hacker ne parvient pas à pénétrer votre site par la porte d'entrée, il sera ravi de découvrir qu'il y a d'autres portes d'entrée et que potentiellement celles-ci donneraient des accès à des outils qui ne sont pas à jour et / ou vulnérables.

 

Récupération des CNAME(s) d'un nom de domaine.

Avant de vous parler des outils existants qui permettent par des moyens détournés d'obtenir ce genre d'information je vais vous parler des moyens conventionnels qui permettent d'y parvenir ...

 

Suis-je sur des dns qui autorisent les transferts de zone DNS ?

Il existe des dns qui affichent l'intégralité des informations de votre nom de domaine.
Ceux-ci sont peu nombreux mais il faut savoir qu'ils existent et que vous être peut-être concernés (principalement si les DNS de votre nom de domaine ont été créé par un administrateur système qui n'a jamais fait ça et qui n'est pas sensible à la sécurité).

Ainsi si votre nom de domaine dispose de DNS qui autorisent le transfert, la commande suivante devrait pouvoir vous retourner l'intégralité de vos cnames

dig axfr @dns.monDomain.fr monDomain.fr

Il faut préciser un des dns du domaine concerné.

Je vous invite à jeter un oeil sur cet article qui explique pourquoi ces DNS qui autorisent le transfert de zone sont le mal absolu : https://digi.ninja/projects/zonetransferme.php

Les moyens détournés qui existent pour récupérer les CNAMES

Il y a plusieurs façons de parvenir à vos fins et aucune n'est "rapide".

DNS / Proxy
Mettre en place un DNS passif ou un proxy ... et prier Dieu qu'une personne l'utilise pour accéder à un sous-domaine (cname), mais là ... vous allez mettre votre patience à très rude épreuve ...

Bruteforce

Le bruteforce est une méthode très très lente, mais qui vous permettra de découvrir des cas de sous-domaine que vous n'auriez jamais imaginé :
JeSuisUnePetiteFeeClochette.dyrk.org

 

Utilisation d'un dictionnaire

C'est très certainement la plus utilisée des méthodes, car nous ne sommes pas très imaginatifs en terme de sous-domaine ... et nous reprenons très souvent les mêmes ....
Ainsi une liste avec une cinquantaine de mots clés souvent utilisés dans le jargon informatique permettra de découvrir beaucoup de CNAME(s).

 

Les outils qui existent

 

Si vous êtes très pressée, j'ai l’outil de prédilection qu'il vous faut !

Security Trail

C'est une petite plateforme assez chouette qui a une énorme base de données de CNAME sur un ensemble de domaines appartenant à de petite ou grosse entreprise.
J'imagine qu'elle exploite une ferme de bot qui recherche des CNAME(s) toute la journée.

 

Mon Script à moi !!!!

 

Ba oui, rien n'est écrit, ni figé dans le marbre, et si "Security Trail" venait à disparaître, je vous donne un script que j'ai écrit qui permet de s'amuser un peu !
Il exploite une liste de mot clé sur 2 niveaux et y teste également l'ajout de chiffre.

Exemple :

  1. prod.dyrk.org
  2. prod1.dyrk.org
  3. perso.dev12.dyrk.org

 

Voici donc la petite onction divine que je vous offre

/*
*
*	Cname Extractor 
*	(c) Dyrk.org 2019 - 2020
*
*
*/

const request = require('request');
var collected = [], 
	/* Nom de domaine à fournir en paramètre
	*/
	domain = process.argv[2], 
	ext = [	
		/* 	
			Si l'extension du domain n'est pas précisé, 
			récupérer les sous domaines pour les extensions suivantes 
		*/
		'fr',
		'eu',
		'it',
		'es',
		'com',
	],
	/*
		liste de cname assez classique
	*/
	subDomain = [
	'ftp',
	'www',
	'w',
	'ww',
	'api',
	'mongodb',
	'phpmyadmin',
	'pgadmin',
	'scrum',
	'iscrum',
	'intranet',
	'backoffice',
	'information',
	'dev',
	'webmail',
	'roundcube',
	'wiki',
	'beta',
	'preprod',
	'cvs',
	'jenkins',
	'svn',
	'git',
	'ldap',
	'moodle',
	'printer',
	'admin',
	'jira',
	'demo',
	'test',
	'preprod',
	'prod',
	'production',
	'imap',
	'pop'
], tryDomain = (domain, sub) => {  
	['https', 'http'].map( protocol=> {
		request([protocol,'://', sub, '.', domain].join(''), { json: true }, (err, res, body) => {
  		if (err) { return -1;/*process.stdout.write("."); console.log(err);*/ }
  			if (collected.indexOf(res.client._host) != -1) return -1;
				 console.log(res.client._host);
				collected.push(res.client._host);
		});
	});
        return sub
};

/* Si aucun domaine renseigné dire Fuck ! */
if (!domain) return console.log('No Domain');

console.log('domain :', domain);

domains = domain.indexOf('.') == -1 ? ext.map( ext => [domain,'.',ext].join('') ) : [ domain ];

/*
	Concatenation des domaines avec des chiffres et des nombres de 1 à 99
*/
subDomain.map( e => { for (var i=0; i<=99;i++) { subDomain.push(e+i) } });

/* 
	Recherche sur 2 niveaux les cnames pour trouver des cnames :
	<mot cle>.domain.fr 
	et 
	<mot cle>.<mot cle>.domain.fr
*/
domains.map ( dom => subDomain.map( e=> tryDomain(dom, e)).map( e => tryDomain(dom, e)));

Il s'agit d'un script nodeJS donc ... si vous n'avez jamais fait de nodeJS voici les étapes à suivre depuis Linux (si vous n'êtes pas sur Linux, un peu de recherche Google fera faire du sport à vos petits doigts)

Étape 1 : Disposer de nodeJS

apt-get install nodejs

Étape 2 : Installer dans le répertoire ou vous aurez mis le script le module "request"

npm install request

Étape 3 : Lancement du script

nodejs nomDuScript.js  nomDeDomaine.fr

NB :
Mon script vérifie l'existence d'un CNAME en effectuant une requête sur les ports 80 et 443, il n'est pas impossible (très certainement possible) que certains CNAME qui ne répondent pas sur ces ports existent et ne soit pas affiché.

 

Conclusion

Je vous invite dans un premier temps à vérifier que vos DNS ne permettent pas le transfert de zone.
Dans un second temps, si vous hébergez des informations critiques, je vous propose de trouver des mots-clés qui sortent un peu de l'ordinaire en terme de cname.
J'espère que cet article vous aura permis de découvrir plein de nouvelles choses et je vous dis à bientôt pour un prochain article !

PS : N'hésitez pas à raconter en commentaire vos petites expériences sur le sujet et éventuellement apporter un peu de votre matière grise ;)

 

 

Partagez ce contenu

One comment

  • Salut à toi.

    Article vraiment intéressant, j’ai appris encore aujourd’hui.

    Merci pour c’est article claire et instructifs.

    Bon week-end

    @+

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *