关注我们
QRcode 邮件联系 新浪微博
首页 > 黑客攻防 » 正文

Use MSBuild To Do More(渗透中MSBuild的应用技巧)

     条点评
后台-系统设置-扩展变量-手机广告位-内容正文顶部

最近Casey Smith@subTee更新了一系列关于”MSBuild”的研究进展,对我有很大启发。

本文将基于他公开的POC,并结合我的研究心得,介绍以下MSBuild的应用技巧:

Execute PowerShell Commands

Execute PE file

Execute Shellcode

VisualStudio Persistence

0x01 简介

MSBuild是Microsoft Build Engine的缩写,代表Microsoft和Visual Studio的新的生成平台

MSBuild可在未安装Visual Studio的环境中编译.net的工程文件

MSBuild可编译特定格式的xml文件

更多基本知识可参照以下链接:

https://msdn.microsoft.com/en-us/library/dd393574.aspx

0x02 常规用法

1. 编译xml文件并执行代码

Default
123456 <?xml version="1.0" encoding="utf-8" ?><Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  <Target Name="PrintCurrentDateTime">    <Message Text="The current date and time is: $(&#91;System.DateTime&#93;::Now)." />  </Target></Project>

保存为test.csproj

cmd下执行:

Default
1 C:\Windows\Microsoft.Net\Framework\v4.0.30319\msbuild.exe test.csproj

在cmd下会输出显示当前时间,如图

1

2. 编译xml文件生成exe

Default
12345678 using System;class Test{    static void Main()    {        Console.WriteLine("Hello world");    }}

保存为hello.cs

Default
12345 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">    <Target Name="Compile">        <CSC Sources="hello.cs" OutputAssembly="hello.exe" />    </Target></Project>

保存为hello.csproj

hello.cs和hello.csproj放于同一目录

cmd下执行:

Default
1 C:\Windows\Microsoft.Net\Framework\v4.0.30319\msbuild.exe hello.csproj

可以编译生成hello.exe,如图

2

注:编译文件满足xml文件格式即可,后缀名任意

0x03 扩展用法

在.NET Framework 4.0中支持了一项新功能”Inline Tasks”,被包含在元素UsingTask中,可用来在xml文件中执行c#代码

详细介绍可参考如下链接:

https://msdn.microsoft.com/en-us/library/dd722601.aspx?f=255&MSPPError=-2147217396

1. HelloWorld示例

以下代码保存为helloworld:

Default
12345678910111213141516171819 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  <Target Name="Hello">   <HelloWorld />  </Target>  <UsingTask    TaskName="HelloWorld"    TaskFactory="CodeTaskFactory"    AssemblyFile="C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll" >    <ParameterGroup/>    <Task>      <Using Namespace="System" />        <Code Type="Fragment" Language="cs">        <![CDATA[                Console.WriteLine("Hello World");               ]]>      </Code>    </Task>    </UsingTask></Project>

注:保存的文件名任意

cmd下执行:

Default
1 C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe helloworld

cmd输出helloworld,如图

3

2. 执行powershell命令

可参照Casey分享的POC,地址如下:

https://gist.github.com/subTee/6b236083da2fd6ddff216e434f257614

该POC已将c#代码转换成xml文件的格式,编写需要注意的部分如下:

4

标记1TaskName可修改,但两个位置的名称需要对应

标记2为固定格式:TaskFactory=”CodeTaskFactory”

标记3的路径在不同系统可能会有区别,准确的为:

Default
1 "$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"

系统默认安装路径为:

Default
1 "C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll"

标记4为一个简单的输出helloworld实例

5

标记5为固定格式,定义为public class ClassExample : Task, ITask

实际测试POC如图,成功执行powershell命令

6

3. 执行PE文件

Casey分享的POC地址如下:

https://gist.github.com/subTee/ca477b4d19c885bec05ce238cbad6371

但是上传的文件被截断,导致部分代码无法查看,于是尝试自己实现

结合之前研究过的代码,地址如下:

https://gist.github.com/subTee/00cdac8990584bd2c2fe

对照上文提到的xml格式,编写代码实现在Inline Tasks中内存加载64位的mimikatz.exe,实现代码的下载地址为:

https://github.com/3gstudent/msbuild-inline-task/blob/master/executes%20mimikatz.xml

cmd下执行:

Default
1 C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe aa

报错,如图

7

解决方法:

需要换用64位的.net Framework,原代码无需修改,只需要使用64位的.net Framework加载就好

cmd下执行:

Default
1 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe aa

加载成功,如图

8

4. 执行shellcode

参考自https://gist.github.com/subTee/a06d4ae23e2517566c52

使用msf生成32位shellcode:

Default
1234 use windows/execset CMD calc.exeset EXITFUNC threadgenerate -t csharp

同样结合上文提到的xml格式,编写代码实现在Inline Tasks中执行shellcode,实现代码的下载地址为:

https://github.com/3gstudent/msbuild-inline-task/blob/master/executes%20shellcode.xml

保存为SimpleTasks.csproj,在cmd下执行:

Default
1 C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe SimpleTasks.csproj

如图,成功执行shellcode弹出计算器

9

在64位系统下,先将shellcode替换为64位,然后换用64位的.net Framework执行即可,代码下载地址为:

https://github.com/3gstudent/msbuild-inline-task/blob/master/executes%20×64%20shellcode.xml

如图,成功执行64位shellcode

10

5. VisualStudio Persistence

在 《Pay close attention to your download code——Visual Studio trick to run code when building》中介绍过利用VisualStudio的.csproj文件实现的代码执行,同样Inline Tasks也可用到此处,实现代码已上传,地址为:

https://github.com/3gstudent/msbuild-inline-task/blob/master/executes%20shellcode%20when%20visual%20studio%20is%20afterBuild.csproj

修改vs工程中的.csproj文件,添加上述代码,能够实现在vs工程编译过程中执行shellcode,如图

11

0x04 小结

利用MSBuild实现的代码执行,有如下特点:

1、可绕过应用程序白名单

2、提供一种直接执行shellcode的方法

3、在内存中执行PE文件

4、结合VisualStudio实现的钓鱼和后门

所以建议对系统中的msbuild.exe进行更多的监控和限制。

注: 文中相关POC代码已上传至github,地址为: https://github.com/3gstudent/msbuild-inline-task

【via 三好学生@安全客】

PS:用一个月的时间终于完成了备案,推荐大家扫这边二维码关注我们微信公众号,网站新动态都会及时推送。

后台-系统设置-扩展变量-手机广告位-内容正文底部
本文标签:
利用HTTP host头攻击的技术
实战Linux下三种不同方式的提权技巧
利用HTTP host头攻击的技术利用HTTP host头攻击的技术LNMP虚拟主机PHP沙盒逃逸LNMP虚拟主机PHP沙盒逃逸bug bounty – 绕过限制劫持Skype账号bug bounty &#8211; 绕过限制劫持Skype账号[MSSQL] 重建密碼一樣的帳號[MSSQL] 重建密碼一樣的帳號QQ邮箱反射型xss漏洞QQ邮箱反射型xss漏洞简单易用,用Powershell劫持Windows系统快捷键;含POC简单易用,用Powershell劫持Windows系统快捷反序列化漏洞的末日?JEP290机制研究反序列化漏洞的末日?JEP290机制研究如何通过EW做Socks5代理进行内网渗透如何通过EW做Socks5代理进行内网渗透

已有条评论,欢迎点评!