macOS .Net Applications Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
これは投稿の要約です https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/。詳細はそちらをご覧ください!
.NETにおけるデバッガとデバッグ対象間の通信の処理は、dbgtransportsession.cppによって管理されています。このコンポーネントは、dbgtransportsession.cpp#L127に見られるように、各.NETプロセスごとに2つの名前付きパイプを設定します。これらはtwowaypipe.cpp#L27を介して開始されます。これらのパイプは**-in
と-out
**で接尾辞が付けられています。
ユーザーの**$TMPDIR
**を訪れることで、.Netアプリケーションのデバッグ用のFIFOが利用可能であることがわかります。
DbgTransportSession::TransportWorkerは、デバッガからの通信を管理する責任があります。新しいデバッグセッションを開始するには、デバッガはout
パイプを介してMessageHeader
構造体で始まるメッセージを送信する必要があります。この構造体の詳細は.NETのソースコードに記載されています:
新しいセッションをリクエストするために、この構造体は次のように設定され、メッセージタイプを MT_SessionRequest
に、プロトコルバージョンを現在のバージョンに設定します:
このヘッダーは、その後、write
システムコールを使用してターゲットに送信され、セッションの GUID を含む sessionRequestData
構造体が続きます:
out
パイプでの読み取り操作は、デバッグセッションの確立の成功または失敗を確認します:
デバッグセッションが確立されると、MT_ReadMemory
メッセージタイプを使用してメモリを読み取ることができます。関数 readMemory は詳細に説明されており、読み取り要求を送信し、応答を取得するために必要な手順を実行します:
完全な概念実証(POC)はこちらで入手できます。
同様に、writeMemory
関数を使用してメモリに書き込むことができます。このプロセスは、メッセージタイプをMT_WriteMemory
に設定し、データのアドレスと長さを指定し、データを送信することを含みます:
関連するPOCはこちらで入手できます。
コードを実行するには、rwx権限を持つメモリ領域を特定する必要があります。これはvmmap -pagesを使用して行うことができます。
関数ポインタを上書きする場所を特定することは必要であり、.NET Coreでは、**Dynamic Function Table (DFT)**をターゲットにすることでこれを行うことができます。このテーブルは、jithelpers.h
で詳述されており、JITコンパイルヘルパー関数のためにランタイムによって使用されます。
x64システムでは、シグネチャハンティングを使用してlibcorclr.dll
内のシンボル_hlpDynamicFuncTable
への参照を見つけることができます。
MT_GetDCB
デバッガ関数は、ヘルパー関数のアドレスm_helperRemoteStartAddr
を含む有用な情報を提供し、プロセスメモリ内のlibcorclr.dll
の位置を示します。このアドレスは、その後DFTの検索を開始し、関数ポインタをシェルコードのアドレスで上書きするために使用されます。
PowerShellへのインジェクションのための完全なPOCコードはこちらでアクセス可能です。
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)