
Requêtes LDAP sans prise de tête
Cet outil a été écrit pour résoudre bon nombre des problèmes que je rencontrais avec ldapsearch et l'interaction avec AD en général. En particulier, cet outil aborde les problèmes suivants que j'ai rencontrés :
Impossibilité de retourner plus d'un millier de résultats depuis AD. Cet outil prend en charge la pagination des enregistrements LDAP et contourne d'autres bugs d'AD pour permettre la récupération d'un nombre arbitraire d'enregistrements.
Impossibilité d'utiliser les identifiants NTLM de manière intuitive pour s'authentifier. Vous pouvez fournir le nom de domaine NETBIOS, le nom d'utilisateur et le mot de passe pour vous authentifier auprès d'un contrôleur de domaine Windows.
Impossibilité de contrôler précisément le nombre d'enregistrements retournés, la vitesse à laquelle ils sont retournés et le nombre d'enregistrements récupérés à la fois. Cet outil vous permet de contrôler tous ces éléments, y compris l'ajout de délais entre chaque appel paginé. De plus, plusieurs DC peuvent être spécifiés pour des requêtes en round-robin.
Impossibilité de retourner les résultats sous des formes facilement assimilables. Cet outil supporte actuellement trois formats :
Impossibilité de retourner uniquement les attributs qui vous intéressent. Cet outil vous permet soit de retourner tous les attributs, soit de retourner uniquement ceux que vous voulez.
Impossibilité d'avoir une liste de requêtes pré-établies et couramment utilisées sauvegardées.
git clone ...
pip install -r requirements.txt
# python3 ldapper.py
usage: ldapper.py [-h] --domain DOMAIN --user USER --password PASSWORD
--server SERVER [--basedn BASEDN] --search SEARCH
[--maxrecords MAXRECORDS] [--pagesize PAGESIZE]
[--delay DELAY] [--format {plain,json,json_tiny}]
[--encryption {1,2,3}]
[--advanced [ADVANCED [ADVANCED ...]]] [--outfile OUTFILE]
[--engine {ldap3,impacket}]
[attribute [attribute ...]]
Recherche en ligne de commande AD LDAP qui n'est pas nulle.
positional arguments:
attribute Attributs à retourner (par défaut tous pour une requête personnalisée. Pour les requêtes pré-définies, passez "*" pour obtenir tous les attributs au lieu de ceux par défaut.)
optional arguments:
-h, --help affiche ce message d'aide et quitte
--domain DOMAIN, -D DOMAIN
Domaine
--user USER, -U USER Nom d'utilisateur
--password PASSWORD, -P PASSWORD
Mot de passe ou hash au format LM:NTLM
--server SERVER, -S SERVER
IP du DC ou nom résoluble
--basedn BASEDN, -b BASEDN
Le DN de base doit généralement être "dc=", suivi du nom de domaine long avec les points remplacés par ",dc=". Tentera de le dériver du serveur LDAP s'il n'est pas fourni.
--search SEARCH, -s SEARCH
Chaîne de recherche LDAP ou nombre indiquant une recherche personnalisée depuis la liste « Recherches personnalisées ». Utilisez « - » pour lire depuis l'entrée standard.
--maxrecords MAXRECORDS, -m MAXRECORDS
Nombre maximal d'enregistrements à retourner (par défaut 100), 0 signifie tous.
--pagesize PAGESIZE, -p PAGESIZE
Nombre d'enregistrements à retourner à chaque extraction (par défaut 10). Doit être <= max records.
--delay DELAY, -d DELAY
Délai en millisecondes entre les requêtes de pagination (par défaut 0).
--format {plain,json,json_tiny}, -f {plain,json,json_tiny}
Format de sortie (par défaut « plain »), peut être : plain, json, json_tiny
--encryption {1,2,3}, -n {1,2,3}
3) Connexion au port 636 TLS (par défaut) ; 2) Connexion au port 389 sans TLS, mais tentative STARTTLS et repli si nécessaire (pas disponible avec impacket) ; 1) Connexion au port 389, texte clair forcé
--advanced [ADVANCED [ADVANCED ...]], -a [ADVANCED [ADVANCED ...]]
Manière avancée de passer des options pour les recherches pré-définies qui demandent une saisie supplémentaire (pour plusieurs invites, passez les arguments dans l'ordre des invites)
--outfile OUTFILE, -o OUTFILE
Fichier de sortie (si spécifié, la sortie sera redirigée ici au lieu de stdout [Peut éviter les erreurs d'encodage sous Windows])
--engine {ldap3,impacket}, -e {ldap3,impacket}
Choisir le moteur à utiliser (par défaut « ldap3 »). VOIR LES NOTES OPSEC !
Recherches personnalisées :
1) Obtenir tous les utilisateurs
1.1) Obtenir un utilisateur spécifique (Vous serez invité à saisir le nom d'utilisateur)
2) Obtenir tous les groupes (et leurs membres)
2.1) Obtenir un groupe spécifique (Vous serez invité à saisir le nom du groupe)
3) Obtenir toutes les imprimantes
4) Obtenir tous les ordinateurs
4.1) Obtenir un ordinateur spécifique (Vous serez invité à saisir le nom de l'ordinateur)
5) Obtenir les administrateurs du domaine/entreprise
6) Obtenir les approbations de domaine
7) Rechercher les délégations SPN non contraintes (Élévation potentielle de privilèges)
8) Rechercher les comptes où la pré-authentification n'est pas requise. (ASREPROAST)
9) Rechercher les SPN utilisateur (KERBEROAST)
9.1) Rechercher un SPN utilisateur spécifique (Vous serez invité à saisir le User Principal Name)
10) Afficher tous les mots de passe LAPS LA (que vous pouvez voir)
10.1) Rechercher un mot de passe LAPS de poste de travail spécifique (Vous serez invité à saisir le nom du poste de travail)
*11) Rechercher les attributs de mot de passe en texte clair courants (UserPassword, UnixUserPassword, unicodePwd et msSFU30Password)
12) Afficher toutes les graines double facteur Quest (si vous y avez accès)
13) Hachage de mot de passe SSO Oracle « orclCommonAttribute »
*14) Hachage de mot de passe SSO Oracle « userPassword »
15) Obtenir les serveurs SCCM
16) Rechercher les comptes où le mot de passe n'est pas requis. (PasswordNotRequired)
Les éléments marqués d'un astérisque n'ont jamais été testés dans un environnement où ils pouvaient être vérifiés, donc veuillez me faire savoir s'ils fonctionnent.
Pour les besoins de ces exemples, supposons ce qui suit :
NETBIOS NAME: EMP
NOM DE DOMAINE COMPLET : EXAMPLE.LOCAL
IP des DC : 10.0.0.2, 10.0.0.3
NOM D'UTILISATEUR : bob
MOT DE PASSE : password
Récupérer tous les enregistrements en ne retournant que l'attribut cn :
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(cn=*)' cn
Récupérer les détails d'un utilisateur spécifique (vous serez invité à saisir le nom d'utilisateur) :
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1'
Récupérer les détails d'un utilisateur spécifique (passer le nom d'utilisateur pour ne pas être invité) :
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1' -a 'alice'
Récupérer les 100 premiers SPN Kerberos utilisateur, pas plus de cinq à la fois, avec deux secondes entre chaque demande de page au format JSON compact :
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 100 -p 5 -d 2000 -f json_tiny -s '(&(objectcategory=user)(serviceprincipalname=*))' serviceprincipalname userprincipalname
Récupérer manuellement tous les enregistrements pour les imprimantes et afficher tous les attributs associés :
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(objectClass=printQueue)'
Rechercher les délégations SPN non contraintes sans effort :
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s 4
Lors de l'utilisation du moteur Impacket sans fournir de baseDN, l'outil tentera une authentification SMB et une connexion au contrôleur de domaine pour acquérir le nom NETBIOS du domaine, afin d'en déduire le baseDN. Ce comportement peut entraîner une détection dans un environnement hautement sensible. Soit n'utilisez pas Impacket dans un tel environnement, soit spécifiez toujours le baseDN.
Impacket effectuera soit une connexion LDAPS complète, soit une connexion entièrement non chiffrée. Il ne peut pas utiliser STARTTLS pour le moment, donc si une connexion LDAP en texte clair risque d'être détectée, soit tentez uniquement une connexion TLS complète, soit n'utilisez pas le moteur Impacket.
Impacket n'offre pas le meilleur contrôle sur la vitesse de récupération des enregistrements. Par conséquent, l'option « --delay » n'est que partiellement implémentée. Si le délai de récupération des enregistrements est critique, n'utilisez pas le moteur Impacket.
Kerberoast : https://adsecurity.org/?p=2293
ASREPRoast : http://www.harmj0y.net/blog/activedirectory/roasting-as-reps/
Abus de délégation non contrainte : http://www.harmj0y.net/blog/activedirectory/the-most-dangerous-user-right-you-probably-have-never-heard-of/
Oracle absurde : https://blogs.oracle.com/mwilcox/entry/clarifying_ovd-ad_eus_password et http://onlineappsdba.com/index.php/2014/03/03/what-hashing-algorithm-oid-uses-to-store-user-password-ssha-or-md5/
Données de jeton second facteur Qwest/Defender/Oneidentity : http://support-public.cfm.quest.com/43565_Defender_5.9_AdminGuide.pdf
Mots de passe en texte clair courants : https://www.blackhillsinfosec.com/domain-goodness-learned-love-ad-explorer/
Ajout d'Impacket comme alternative à LDAP3 car LDAP3 ne fonctionne pas toujours (et Impacket non plus).
Suppression de la sélection multiple de serveurs LDAP car cette fonctionnalité n'est pas vraiment nécessaire et n'existe pas vraiment dans Impacket.
Tout a été refactorisé.
Ajout de la fonctionnalité de recherche SCCM.
Ajout de l'option de fichier de sortie.
Correction de quelques problèmes de format de sortie.
Ajout de la possibilité de recevoir la requête LDAP depuis l'entrée standard.
Encadrement automatique de la requête entre parenthèses si l'utilisateur ne l'a pas déjà fait.
Correction d'un bug de support Python 2.
Si vous avez des énumérations de recherche courantes que vous utilisez, faites-le moi savoir afin que je puisse les ajouter à la liste.
...
Écrit par Shelby Spencer (shellster). Contactez-moi pour les bugs ou les demandes de fonctionnalités.