I - Réalisez votre plan d’attaque du système d’information
1 - Organisez votre prise de notes
Pour attaquer un environnement Active Directory, vous aurez très probablement besoin de récolter les informations suivantes :
Cette liste n’est pas exhaustive, mais si déjà vous avez préparé un document avec ces quelques points, vous verrez que ça vous aidera grandement. Vous remplirez cette liste au fur et à mesure de votre attaque. Pour améliorer encore vos notes, vous pouvez les ranger dans des catégories correspondant aux différentes étapes de vos tests. Ces étapes s’apparentent à votre kill chain, ou chaîne d’attaque. C’est votre méthodologie d’intrusion. Ainsi, vous pourrez avoir les catégories suivantes :
Avoir les bons outils permet d’être bien plus efficace. Il existe beaucoup de logiciels facilitant la prise de notes (Evernote, Microsoft OneNote, Cherrytree, TreeNote et j’en passe), mais mon favori est l’outil Joplin. C’est un outil gratuit, open source, qui fonctionne sur tout type de plateforme (Linux, Windows, Mac, Android, iOS).
2 - Appuyez-vous sur le cycle de test d’intrusion
Méthodologie d’attaque
II - Identifiez les serveurs et postes vulnérables
1 - Identifiez les machines de l’environnement de travail
Afin d’identifier les machines vulnérables, il faut d’abord les découvrir sur le réseau. Le but est de chercher où se trouvent les machines. Même si le client sait où se trouvent la plupart de ses équipements, deux points restent intéressants :
Pour les débusquer, la technique principale est le scan réseau. On se place dans un contexte où vous ne vous souciez pas des problèmes de détection. Gardez toujours en tête que des scans peuvent être bruyants sur le réseau, et peuvent être perçus comme un comportement malveillant par d’autres équipes. Dans une démarche d’amélioration de la sécurité de votre environnement, faites en sorte que toutes les équipes réseau et systèmes soient prévenues avant de faire vos tests.
A - Nmap
Scan ICMP
Le scan ICMP, ou Ping-Scan permet d’envoyer une requête ICMP (un PING) à toutes les adresses IP que vous souhaitez découvrir, et si la machine répond, c’est qu’elle est allumée. Pour l’utiliser avec nmap, le paramètre -sP doit être fourni, puis les adresses à scanner.
nmap -sP 10.10.10.0/24
Scan TCP
Le scan le plus commun est le scan TCP. Le principe de ce scan est d’envoyer une demande de connexion TCP SYN aux différentes adresses IP sur différents ports. Si ces cibles répondent avec un SYN/ACK ou un RST/ACK, alors elles sont allumées. En cas d’absence de réponse, vous ne pouvez pas discuter avec cette adresse IP. Soit il n’y a pas de machine, soit elle est éteinte, soit il y a un filtre réseau qui bloque vos paquets. Si la réponse est un SYN/ACK, vous savez également que le port que vous avez testé est ouvert, un service est accessible sur celui-ci. C’est très intéressant car vous pourrez tenter d'interagir avec ce service, et peut-être l’exploiter !
Scan TCP
Ce type de scan est celui par défaut dans nmap. Ainsi, pour l’utiliser, il vous suffit de lancer la commande suivante :
nmap 10.10.10.0/24
Scan SYN
Il permet d’aller plus vite que le scan TCP. Dans le scan TCP, dès qu’un port est ouvert, l’outil ferme correctement la connexion en répondant avec le dernier ACK. Le scan SYN ne le fait pas. Il ne fait qu’envoyer un SYN, analyse la réponse comme précédemment, et passe à l’IP suivante. Ça permet d’économiser un peu de temps, et donc de scanner plus vite ! Il faut des droits administrateur pour effectuer un scan SYN. En effet, c’est un scan qui n’utilise pas les paramètres réseau par défaut, puisque les connexions TCP ne sont pas fermées.
nmap -sS 10.10.10.0/24
Faites attention avec les scans SYN, car vous ouvrez des connexions, mais vous ne les fermez pas. Certains systèmes risquent alors d’atteindre rapidement le nombre de connexions ouvertes autorisées, et ne répondront plus, ni à vous, ni aux utilisateurs. La plupart des systèmes récents savent gérer ce type de scan, mais de vieux systèmes peuvent être mis à mal. Un scan TCP sera alors plus adapté.
B - NBTscan
Scan NetBIOS
Plus limité que les scans précédents, mais extrêmement rapide, il repose sur le protocole NetBIOS, propre à Windows, qui permet de faire un lien entre adresse IP et nom de machine. L’outil NBTscan, lui aussi gratuit et open source, permet d’effectuer ce type de scan. Utile lorsque l'on doit scanner des très grandes plages réseau, et vraiment efficace. Pour l’utiliser, rien de plus simple, vous n’avez qu’à lui fournir les adresses à scanner.
nbtscan 10.10.0.0/16
Comme le protocole utilisé est propre à Windows, NBTscan ne découvrira la plupart du temps que des machines Windows. Comme il est extrêmement rapide, cela permet de voir où se trouvent les machines dans un très grand réseau, pour ensuite faire des scans plus complets dans ces sous-réseaux découverts. Une fois que vous avez identifié les machines présentes sur le réseau, une recherche de vulnérabilités peut vous permettre de prendre la main sur l’une d’entre elles.
2 - Énumérez les vulnérabilités
Vous savez maintenant quelles machines sont accessibles sur le réseau. L’objectif est d’aller un peu plus loin, et de découvrir les services proposés par ces machines pour peut-être en exploiter, et prendre la main sur quelques hôtes. La première étape cruciale est l’énumération de ports. Lorsque vous savez qu’une machine vous répond, vous pouvez effectuer un balayage de ports. Vous allez envoyer une requête TCP sur chaque port, et la réponse du serveur vous indiquera s’il y a un service en écoute sur ce port ou non. Avec l’outil nmap, voici comment balayer les ports 21, 22, 80 et 443 sur une adresse spécifique :
nmap -p 21,22,80,443 10.10.10.2
Généralement, à un port correspond un service. Cependant, il est tout à fait possible que ce ne soit pas le cas. Pour déterminer le service qui tourne derrière chaque port, l’option -sV de nmap sera d’une grande aide. L’outil tentera même de déterminer la version du service !
nmap -p 22 -sV 10.10.10.2
Starting Nmap 7.60 ( https://nmap.org )
Nmap scan report for 10.10.10.2
Host is up (0.58s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH for_Windows_8.1 (protocol 2.0)
Chercher des vulnérabilités pour toutes les versions de tous les services peut être assez fastidieux, c'est pourquoi il existe des solutions qui automatisent ce processus. Mais bien comprendre la démarche vous permet de comprendre comment fonctionnent ces outils. Et si un jour vous avez des besoins précis sur une machine, vous n’avez pas besoin de lancer un outil qui va remuer ciel et terre pour récupérer la seule petite information que vous cherchiez. Ces solutions automatisées sont les scanners de vulnérabilités. Ils embarquent souvent toutes les étapes dont nous avons parlé. Ils automatisent alors la découverte des hôtes sur le réseau, des services, des versions et des vulnérabilités associées. OpenVAS est un scanner de vulnérabilité gratuit et open source. Dans le monde professionnel, l’outil Nessus est très souvent utilisé (Rapid7 également).
III - Identifiez les points d’entrée
Vous avez maintenant connaissance des machines présentes sur le parc informatique, des services proposés par ces différentes machines, et potentiellement des vulnérabilités que vous pourrez exploiter pour commencer votre phase de compromission. Pour compléter cette reconnaissance, il est primordial de découvrir l’environnement Active Directory.
1 - Identifiez le domaine Active Directory
Active Directory évolue avec le temps, donc déterminer la version utilisée vous permet de connaître les fonctionnalités et mécanismes de sécurité présents dans la version implémentée dans l’entreprise. L’utilitaire ldapsearch permet d’effectuer des requêtes vers un serveur LDAP, et dans votre cas, il permet de demander anonymement à un contrôleur de domaine des informations sur le domaine.
$ ldapsearch -x -H ldap://dc01.medic.ex -s base -LLL
domainFunctionality: 7
forestFunctionality: 7
domainControllerFunctionality: 7
rootDomainNamingContext: DC=medic,DC=ex
[...]
subschemaSubentry: CN=Aggregate,CN=Schema,CN=Configuration,DC=medic,DC=ex
dnsHostName: DC01.medic.ex
[...]
Il est possible de fournir l’adresse IP d’un contrôleur de domaine plutôt que le nom de machine dans la ligne de commande. Beaucoup d’informations sont retournées par le contrôleur de domaine, notamment le niveau fonctionnel du domaine (domainFunctionality), de la forêt (forestFunctionality) et du contrôleur de domaine (domainControllerFunctionality). Voici la table de correspondance permettant de savoir à quelle version d’Active Directory vous avez affaire.
Table de correspondance des niveaux de fonctionnalité
La forêt correspond au plus haut niveau logique d’un Active Directory. Par défaut, quand on crée un tout premier domaine, ça crée également une forêt du même nom. Des domaines enfants peuvent ensuite être créés au sein de cette même forêt. Vous connaissez également le nom du contrôleur de domaine que vous avez sollicité grâce à l’entrée dnsHostName, DC01 dans cet exemple. Enfin, l’entrée rootDomainNamingContext vous indique le nom du domaine racine de la forêt. Il se peut qu’il soit similaire au domaine que vous auditez, ce qui signifie que vous êtes dans le domaine racine. Il y a de grandes chances pour que ce soit alors le seul domaine de la forêt.
2 - Découvrez les serveurs clés
Toujours dans la phase de découverte d’informations, énumérer les serveurs clés vous sera très utile pour préparer vos attaques. En effet, ces serveurs sont des cibles idéales puisqu’ils contiennent des données sensibles ou confidentielles, et que leur compromission vous permettra de bien avancer dans votre attaque. Ainsi, les serveurs que vous allez tenter d’inventorier sont les contrôleurs de domaine, les autorités racine de certification ou encore les serveurs DNS. Pour énumérer l’ensemble des contrôleurs de domaine, l’utilitaire nslookup sera d’une grande aide. Vous allez chercher les enregistrements DNS ayant en sous-domaine _kerberos._tcp qui est propre aux contrôleurs de domaine.
$ nslookup -type=SRV _kerberos._tcp.medic.ex
Server: 10.10.10.2
Address: 10.10.10.2#53
_kerberos._tcp.medic.ex service = 0 100 88 dc01.medic.ex.
Dans votre environnement, il y a un contrôleur de domaine, DC01. Si vous n’avez pas connaissance du nom de domaine, vous pouvez effectuer un scan nmap pour découvrir les serveurs avec le port 88 ouvert. Ce port est spécifique à Kerberos, donc aux contrôleurs de domaine.
nmap -p 88 10.10.10.0/24
En ce qui concerne les autorités de certification racine, vous pouvez les énumérer avec l’outil Certipy de la manière suivante :
$ certipy find 'medic.ex/pixis:P4ssw0rd@dc01.medic.ex'
Enfin, pour les serveurs DNS, l’utilitaire nslookup peut à nouveau être utilisé. Le nom du domaine est passé en paramètre, et l’outil retournera le nom des serveurs DNS qui font autorité :
$ nslookup medic.ex
Server: 10.10.10.2
Address: 10.10.10.2#53
Name: medic.ex
Address: 10.10.10.2
Ces commandes permettent de répertorier ces serveurs structurant dans un Active Directory. Avoir cette liste permet de faciliter les phases d’exploitation car chercher les noms ou les adresses IP des contrôleurs de domaine à chaque fois qu’une commande doit être passée, c’est très chronophage !
3 - Découvrez les serveurs d’intérêt
Les serveurs clés sont ceux qui permettent à un environnement Active Directory de fonctionner dans de bonnes conditions. Sur ce socle, il peut y avoir beaucoup d’autres services utilisés par les entreprises. Parmi ces services, certains vous intéressent plus particulièrement. Ceux que l’on recherche, une fois compromis, permettent très régulièrement de récolter des informations sensibles, ou de pivoter sur d’autres réseaux ou serveurs du domaine.
Serveurs d’impression
Les premiers serveurs d’intérêt sont les serveurs d’impression. D’une part, tout ce qui est imprimé peut être intéressant pour vous, donc si l’imprimante contient un historique des impressions, elle sera une cible de choix. D’autre part, une imprimante est très souvent enregistrée auprès de l’Active Directory afin d’avoir connaissance de l’ensemble des collaborateurs. Si vous la compromettez, vous aurez de grandes chances de découvrir les informations d’authentification de l’imprimante. Pour chercher les imprimantes sur le réseau, l’outil nmap peut être utilisé en scannant les ports classiques propres aux imprimantes.
nmap -p 9100,515,631 10.10.10.0/24
Serveurs SCCM
SCCM (System Center Configuration Manager) est une solution proposée par Microsoft, qui permet notamment de gérer les applications et mises à jour d’un parc. Parmi ses nombreuses fonctionnalités, SCCM permet de déployer des applications, des mises à jour, des configurations d’applications ou de services, et permet aussi d’avoir un inventaire du parc informatique. Pour que cela soit possible, SCCM doit avoir également une vue dégagée du réseau, et possède souvent des droits privilégiés sur les machines administrées. Si vous arrivez à prendre la main sur un serveur SCCM, vous pourrez découvrir de nouveaux sous-réseaux, et potentiellement compromettre de nouveaux postes.
Serveurs WSUS
Les serveurs WSUS (Windows Server Update Services) permettent aux administrateurs de déployer des mises à jour Microsoft sur l’ensemble des machines du parc. De par leur rôle, ces serveurs ont très souvent une visibilité complète sur l’ensemble du réseau. Compromettre un serveur WSUS vous permettra alors de rebondir sur le reste du réseau aisément.
Serveurs SCOM
Enfin, les serveurs SCOM (System Center Operations Manager) permettent de surveiller la performance et les événements de systèmes Windows. Ils permettent notamment de superviser un Active Directory, des bases de données MSSQL, ou encore des serveurs Exchange. De la même manière que les solutions précédentes, un serveur SCOM doit avoir une visibilité sur les serveurs supervisés pour parvenir à ses fins. Il peut également avoir des droits privilégiés sur certains d’entre eux. Lorsque vous voyez un serveur SCOM dans un réseau d’entreprise, il peut être ajouté à votre liste de cibles privilégiées.
4 - Cartographiez les partages réseau
Un autre élément intéressant à cartographier, ce sont les partages réseau. Ils contiennent très souvent des informations extrêmement sensibles pour l’entreprise. C’est très souvent via ces partages que l’ensemble des collaborateurs échangent des documents. Vous pouvez y trouver des secrets commerciaux, des informations personnelles, des données précises sur les projets de l’entreprise, ou encore des identifiants d’utilisateurs. Ces données vous seront très utiles pour les phases suivantes de votre plan d’attaque. Les partages réseau sous Windows utilisent le protocole SMB pour les échanges de fichiers. Ce service est en écoute sur le port 445. Ainsi, pour trouver les partages sur le réseau, vous pouvez scanner le port 445 sur les différentes machines que vous avez déjà découvertes. L’outil CrackMapExec est un outil open source qui vous permet d'interagir de nombreuses manières avec vos cibles, en utilisant entre autres le protocole SMB. Cet outil permet notamment de faire cette recherche de partages réseau. Il s’utilise de la manière suivante :
$ cme smb 10.10.10.0/24 -u pixis -p P4ssw0rd -d medic.ex --shares
Vous recevez ainsi la liste des partages réseau ouverts, et vous savez si vous y avez accès en lecture et/ou écriture, grâce à la colonne “Permissions”.
IV - Identifiez les faiblesses d’Active Directory
1 - Identifiez la politique de mot de passe
Une partie des attaques consiste à voler des crédentiels pour les réutiliser sur d’autres postes ou serveurs. Il se peut que ces identifiants aient été modifiés, et que vos tentatives soient infructueuses. Vous devrez être particulièrement vigilant à la politique de mot de passe mise en place dans l’entreprise. En effet, si vous vous trompez de mot de passe pour un compte, il est possible que vous bloquiez ce compte. La politique de mot de passe mise en place dans un environnement Active Directory permet plusieurs choses ; notamment :
Identifier la politique de mot de passe vous permettra alors de passer sous les radars en évitant de bloquer des comptes par inadvertance. Pour récupérer la politique de mot de passe par défaut, l’utilitaire Get-ADDefaultDomainPasswordPolicy peut être utilisé dans une console PowerShell.
PS C:\> Get-ADDefaultDomainPasswordPolicy
ComplexityEnabled : True
DistinguishedName : DC=medic,DC=ex
LockoutDuration : 00:10:00
LockoutObservationWindow : 00:30:00
LockoutThreshold : 3
MaxPasswordAge : 90.00:00:00
MinPasswordAge : 1.00:00:00
MinPasswordLength : 7
objectClass : {domainDNS}
objectGuid : dae14cb7-a84e-4d1d-8490-27399d6fbad5
PasswordHistoryCount : 24
ReversibleEncryptionEnabled : False
Cette politique de mot de passe impose un mot de passe d’au moins 7 caractères (MinPasswordLength) et une complexité minimale, via le paramètreComplexityEnabled. Dans un intervalle de 30 minutes (LockoutObservationWindow), le compte sera bloqué après 3 tentatives erronées d’authentification ( LockoutThreshold ). Il sera automatiquement débloqué après 10 minutes (LockoutDuration). Enfin, le mot de passe doit être modifié au moins tous les 90 jours (MaxPasswordAge).
2 - Cartographiez l’Active Directory
La dernière étape que vous devez absolument mener dans la phase de reconnaissance est la cartographie de l’environnement Active Directory lui-même. En effet, il regroupe un très grand nombre d’objets (utilisateurs, ordinateurs, groupes, conteneurs, GPO, etc.), et chacun d’entre eux peut avoir des droits très fins sur les autres. Or, par défaut, tous les utilisateurs du domaine peuvent lire l’ensemble des informations présentes dans Active Directory. Ainsi, avec un compte sans privilèges, vous pouvez lister l’ensemble des utilisateurs du domaine, les groupes auxquels ils appartiennent, les droits de ces utilisateurs et groupes, les attributs de toutes ces entités, et bien plus encore. De par cette complexité, il existe beaucoup de données parfois sensibles accessibles à tous, ou de chemins d’attaque cachés.
Informations sensibles dans l’AD
Chaque objet possède des attributs, et certains d’entre eux peuvent être utilisés par des administrateurs qui pensent être les seuls à y avoir accès. La première information importante pour vous, ce sont les noms des objets. Les serveurs sont souvent nommés de manière explicite pour faciliter la vie des administrateurs. Vous retrouverez souvent des noms tels que “SQLSRV”, “FILER01” ou encore “INTRANET”. Grâce à ces informations, vous serez en mesure d’identifier plus facilement les serveurs clés et les machines d’intérêt. Par ailleurs, plusieurs attributs sont parfois renseignés et peuvent contenir des informations sensibles, notamment les attributs “description” et “comment” dans lesquels vous trouverez potentiellement des informations plus détaillées sur certains éléments, voire des mots de passe temporaires ou non. Lors de mes tests d’intrusion, il m’arrive très fréquemment de trouver un mot de passe de compte de service dans le champ “description” de l’objet. Ainsi, la commande suivante que j’envoie dans une console PowerShell me permet de très rapidement avoir un aperçu des utilisateurs ou ordinateurs ayant un champ de description non vide :
PS C:\> Get-ADObject -LDAPFilter "(|(ObjectClass=user)(ObjectClass=computer))" -SearchBase "DC=MEDIC,DC=EX" -Property * | where description -ne $null | Select Name, Description, ObjectClass
Name Description ObjectClass
---- ----------- -----------
Administrateur Compte d’utilisateur d’administration user
Invité Compte d’utilisateur invité user
krbtgt Compte de service du centre de distribution de clés user
Lucie POIRIER Mot de passe temporaire: Welcome123 user
L’outil ldapdomaindump sur Linux permet également de récolter des informations sur l’Active Directory, et notamment la liste des utilisateurs et de leur description dans le fichier domain_users.html.
ldapdomaindump -u ‘medic.ex\pixis’ -p P4ssw0rd dc01.medic.ex
Groupes à privilèges
Dans un environnement Active Directory, il existe des groupes intégrés qui possèdent des privilèges élevés. Tous les membres de ces groupes héritent alors de ces privilèges. Il est donc important que vous connaissiez ces groupes pour identifier les utilisateurs à cibler dans vos attaques. Les trois principaux sont les suivants :
Il existe d’autres groupes privilégiés détaillés dans la documentation de Microsoft, que je vous conseille d’aller lire pour en avoir connaissance. Un outil qui a beaucoup fait évoluer la sécurité des environnements Active Directory, c’est BloodHound.
BloodHound est un outil vous permettant de cartographier un environnement Active Directory en le représentant sous forme de graphe. Cette représentation offre alors la puissance de la théorie des graphes pour découvrir des chemins d’attaque qui vous auraient été autrement difficiles, voire impossibles à détecter. L’idée de cet outil est d’analyser un environnement Active Directory en énumérant les différents objets de l’environnement (utilisateurs, ordinateurs, groupes, etc.), et en les liant avec des relations. Par exemple, si un utilisateur pdevaux est membre du groupe helpdesk, l’utilisateur sera lié par la relation MemberOf au groupe.
Appartenance à un groupe
C’est une visualisation assez claire d’une appartenance, mais l’outil ne s’arrête pas là. Il vous permet de voir également que le groupe helpdesk fait partie du groupe RDPUsers ; donc par héritage, le compte pdevaux en fait également partie.
Héritage des droits
Et en fait, ce n’est pas tout : si on demande de lister l’ensemble des groupes auxquels appartient pdevaux, on se rend compte qu’il appartient finalement à beaucoup d’autres groupes !
Ensemble des héritages de groupes
Il existe bien d’autres relations entre les objets, notamment des relations permettant de voir qu’un objet est administrateur d’un autre, le droit d’utiliser RDP, le fait qu’un utilisateur est connecté sur une machine, etc. Pour collecter les informations sur l’Active Directory, il faut utiliser SharpHound depuis une session authentifiée. Si vous êtes sur une machine du domaine, vous pouvez lancer l’outil sans argument. Si en revanche vous êtes sur votre machine d’attaque, il faudra dans un premier temps vous mettre dans le contexte d’un utilisateur du domaine avec l’utilitaire RunAs.
runas /netonly /user:medic.ex\pixis cmd.exe
Une fois la console ouverte en tant que l’utilisateur, vous pouvez utiliser SharpHound.
.\SharpHound.exe
Si vous rencontrez des problèmes lors de l’exécution de SharpHound depuis votre propre machine, veillez à ce que les paramètres réseau de votre machine virtuelle soient correctement configurés. Mettez l’adresse IP d’un contrôleur de domaine comme serveur DNS, et paramétrez le nom de domaine comme suffixe DNS. Vous pouvez également renseigner les paramètres --domain et --domaincontroller lors de l'exécution de SharpHound afin de lui préciser explicitement le nom du domaine que vous souhaitez analyser, ainsi qu'un contrôleur de domaine que vous avez identifié. Quand l’outil termine de récolter les informations, il produit un fichier ZIP qu’il est possible d’importer dans BloodHound. Il existe d’autres outils permettant de faire une première passe sur un environnement Active Directory, afin d’identifier les éléments que nous avons vus ensemble, et qui parfois vont plus loin. L’outil PingCastle est développé par un Français, et permet de générer des rapports complets sur l’état de santé de votre environnement Active Directory.