IIS6上用cmd.exe架CGI

最近无聊,忙了一个通宵,成功实现用cmd.exe作为CGI运行。可以用批处理来写server scripts,也可以作为一个微型免杀后门shell使用。

回顾

IIS的配置灰常复杂,先是在自己的Vista Ultimate+IIS7上配置CGI失败了,因为IIS7的界面和功能改动很大,跟网上全部的教程都不能对应;所以去Ph4nt0m提问,没人理;然后是满世界的Google,发现了cscript iisext.vbs /AddFile这个命令,最后灵机一动找到了IIS的配置文件。成功突破IIS6的限制实现了cmd.exe的CGI。

要点

IIS6上配置CGI有两个要点,我都背熟了。

  1. 在 Internet信息服务 -> Web服务扩展(简称WSE, Web Service Extension) -> 右键 添加一个新的Web服务扩展 -> 添加一个exe作为CGI的宿主程序。
  2. 在一个网站下 右键 属性 -> 主目录 -> 配置 -> -> 映射 -> 添加 -> 输入CGI的扩展名和命令行。

障碍

添加Web服务扩展(WSE)最大的障碍就是:指定可执行文件的命令行不能有 ,|<>?/* 几个特殊字符。如果是python的CGI,命令行是 C:\python25\python.exe -u "%s" "%s"。不幸的是cmd.exe作为CGI跑批处理需要一个开关参数 cmd.exe /c test.bat。而 / 是不允许的。于是我想了好多办法想绕过这个限制。首先是不加 /c 参数,不行。什么都不添加,发现CGI会尝试解析“Microsoft Windows [版本 5.2.3790] (C) 版权所有 1985-2003 Microsoft Corp.”这几行cmd.exe的输出文字,返回“CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers.”我用ResHacker修改cmd.exe去掉了这几行版权信息,CGI成功返回“C:\temp\iis>”但是观察后台进程发现cmd.exe并没有正常终止掉,原因很简单cmd.exe没有被执行exit命令,看来一个批处理来控制CGI是势在必行的。那么批处理的问题又来了,如何让批处理用一个echo输出多行?尝试了几遍,写出来了一个批处理脚本

@echo(HTTP/1.1 200 OK^
Date: Wed, 29 Aug 2007 21:04:22 GMT^
Server: Microsoft-IIS/6.0^
X-Powered-By: ASP.NET^
X-AspNet-Version: 2.0.50727^
Cache-Control: private^
Content-Type: text/html; charset=gb2312^
Content-Length: 13^
^
^<h2^>test^</h2^> ) @exit

每一行用^结束,转义一个回车,然后空一行,接着输出HTTP的返回头。好,那么剩下的问题是,没有 /c 参数,如何让这个批处理从优先于cmd.exe的版权信息输出?一个简单的想法是利用cmd.exe的AutoRun。通过修改HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun实现。实验结果:cmd.exe的版权信息还是在前面。那么可否添加一个@cls来清屏呢?其实cls命令也有向stdout的输出,输出的是0x0C,也算一个字符,不信可以用cls>D:\1.txt来查看。最后山穷水复疑无路的时候,想到了突破 Internet信息服务(IIS)管理器(简称inetmgr)的限制,直接修改IIS的配置文件。

MetaBase.xml

IIS6的配置文件保存在 %windir%\system32\inetsrv\MetaBase.xml。是一个文本格式化的XML文件。首先在inetmgr里添加一个CGI,可执行文件全部用用特殊的C:\temp\iis\est.exe。保存之后,用iisreset /stop停止IIS,再用记事本打开%windir%\system32\inetsrv\MetaBase.xml,搜索est.exe,全部替换成C:\windows\system32\cmd.exe /c &quot;%s&quot;。Ctrl+S保存配置。好了,我们再次iisreset /start,在inetmgr里重启网站和CGI模块,然后在浏览器打开我们的测试页面http://127.0.0.1:800/1.bat。好啊,成功了!截图纪念:
bat-cgi-it-works.jpg

后记

好困啊,吃个早饭睡觉去。开学补考看来又要挂了。

标签: , , ,

2 条评论 发表在“IIS6上用cmd.exe架CGI”上

  1. vkill 说到:

    后面的那?asd=1是什么意思那?

  2. electronixtar 说到:

    @vkill
    asd=1 是用来测试CGI回传参数的

留下回复