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