
RDP認証情報をAPIフッキング(Detours)とDLLインジェクションを介して盗み出し、ユーザー名とパスワードをファイルに記録する、レッドチームのポストエクスプロイテーション向けWindowsインプラント。
RDPCredentialStealerは、C++でDetoursを使用したAPIフックを利用して、RDPでユーザーが入力した資格情報を盗み出すインプラントです。
試してみましょう:
まず、GitHubリポジトリのDLLを C:\Users\Public\Music パスに転送します。

次に、RDPコネクタのWindowsアプリケーションを開きます。

そして、GitHubリポジトリ内のEXEを実行します。

RDPサーバーにアクセスしようとすると:

ユーザー名「s12User」、パスワード「passwdtest」を入力します。
次に、ファイルを確認します: C:\Users\Public\Music\RDPCreds.txt

RDPCredStealerDLL:
このコードは、Detoursライブラリを使用したC++でのフック技術の実装です。具体的には、credui.dllライブラリのCredUnPackAuthenticationBufferW関数をターゲットとしており、この関数は資格情報操作で使用される認証バッファを展開する役割を担います。 コードを段階的に説明します: 必要なヘッダーファイル(windows.h、wincred.h、detours.hなど)がインクルードされています。 元のCredUnPackAuthenticationBufferW関数のシグネチャを表す関数ポインタ型CredUnPackAuthenticationBufferW_tが定義されています。 元の関数のアドレスを格納するための関数ポインタpCredUnPackAuthenticationBufferWが宣言されています。
MyCredUnPackAuthenticationBufferW関数が実装されており、これは元の関数のフックとして機能します。フックされた関数が呼び出されたときに実行されます。この関数はまず、格納された関数ポインタpCredUnPackAuthenticationBufferWを使用して元の関数を呼び出します。次に、取得したユーザー名とパスワードをワイド文字列(LPWSTR)からUTF-8エンコードされた文字列(std::string)に変換します。
最後に、ファイルを追記モードで開き、ユーザー名とパスワードを書き込みます。 DllMain関数は、フックDLLのエントリポイントとして機能します。DLLがロードまたはアンロードされるときに呼び出されます。ul_reason_for_callがDLL_PROCESS_ATTACHの場合(DLLがロードされていることを示す)、LoadLibraryAを使用してcredui.dllライブラリをロードします。
次に、GetProcAddressを使用して元の関数CredUnPackAuthenticationBufferWのアドレスを取得します。成功すると、DetourTransactionBegin、DetourUpdateThread、DetourAttachを呼び出してフック処理を開始します。 ul_reason_for_callがDLL_PROCESS_DETACHの場合(DLLがアンロードされていることを示す)、DetourTransactionBegin、DetourUpdateThread、DetourDetachを呼び出してフック処理を元に戻します。
このコードの目的は、CredUnPackAuthenticationBufferW関数をフックし、それに渡される資格情報を傍受して、フックコードがユーザー名とパスワードをファイルに抽出・記録できるようにすることです。この手法は、RDP資格情報などの機密情報をキャプチャするために悪用される可能性があり、重大なセキュリティ上の懸念事項です。
Inject.h
このコードは、Windowsオペレーティングシステム上のターゲットプロセスにDLL(ダイナミックリンクライブラリ)を注入するための関数を提供します。コードを分解してその機能を理解しましょう:
必要なヘッダーファイル(windows.h、stdio.h、tlhelp32.hなど)がインクルードされています。これらのヘッダーは、Windows APIとやり取りするための必要な関数とデータ型を提供します。
getPIDbyProcName関数は、プロセス名を入力として受け取り、対応するプロセスID(PID)を返します。CreateToolhelp32Snapshot関数を使用して現在のプロセスのスナップショットを作成し、Process32FirstW関数とProcess32NextW関数を使用してスナップショットを反復処理し、一致する名前のプロセスを見つけます。見つかった場合はプロセスIDを返し、それ以外の場合は0を返します。
DLLinjector関数は、プロセスID(pid)とDLLパスを入力として受け取ります。指定されたDLLをターゲットプロセスに注入します。動作は次のとおりです:a. OpenProcessを使用してPROCESS_ALL_ACCESSフラグでターゲットプロセスを開きます。b. GetModuleHandleWを使用してKernel32モジュールのハンドルを取得します。c. GetProcAddressを使用してKernel32内のLoadLibraryW関数のアドレスを取得します。d. VirtualAllocExを使用してターゲットプロセス内にメモリを割り当てます。e. WriteProcessMemoryを使用してDLLパスをターゲットプロセスの割り当てられたメモリに書き込みます。f. CreateRemoteThreadを使用してターゲットプロセス内にリモートスレッドを作成し、LoadLibraryWのアドレスと割り当てられたメモリをパラメータとして渡します。g. スレッドの作成が成功した場合、DLL注入が成功したことを示すtrueを返します。 main関数はこのコードスニペットには含まれていません。これらの関数を独自のアプリケーション内で使用して、プロセス名とDLLパスを入力として提供することで、ターゲットプロセスにDLLを注入できます。
DLL注入は、デバッグや機能の拡張といった正当なユースケースから、マルウェアの注入やプロセスの動作の無許可な変更といった悪意のある目的まで、さまざまな用途がある技術であることに注意してください。このような技術を使用する前に、適切な権限と法的権利があることを確認し、注意を払ってください。