修改PE文件隐藏IIS6的Banner

本文已发于《黑客X档案》2011.8、9月合刊

一般来说,渗透测试前,都需要做好信息收集的工作,比如探测对方的端口、开放的服务等等。针对web服务软件攻击时,确认对方所使用的web服务软件以及具体版本也非常重要的,特别是针对特定版本的0day攻击的时候,需要得到确凿的版本号。

如何确定对方所使用的web服务软件呢?最简单的是,根据HTTP1.1的标准中,服务器返回的HTTP消息头中Server字段中就包含了对方所使用的web服务软件,有些还包含了具体的版本号。我们可以利用nc来看一下。

192.168.0.111是我网段内安的一台web服务器,在命令提示符中运行nc以及带上参数:

nc.exe 192.168.0.111 80

然后可见光标闪烁,意味着需要输入信息,依次输入:

HEAD[空格]/ [空格]HTTP/1.1
HOST:192.168.0.11

上面中“[空格]”标识需要读者自行替换成空格来隔开。接着回车两下。HEAD字段代表只需要服务器返回HTTP头,不需要返回数据;后面的HTTP/1.1是具体的HTTP版本号,现在绝大多数都是HTTP1.1的,基本上不会存在1.0版本的了。不过要是提交HEAD / HTTP/1.0的话,就不需要HOST字段了;HOST字段指服务器的地址,在HTTP 1.1标准头中,HOST字段是必须存在的,而HTTP 1.0中是可选的,但是要是只提交HEAD / HTTP/1.0的话,会自动转换成HTTP 1.1的字段的,不过可以少输一行达到偷懒的效果。之所以要解释这一段,是为了解释为什么有些人疑惑输入HEAD / HTTP/1.0却返回的HTTP 1.1的消息。最后需要回车再回车也是跟HTTP1.1标准有关,前一个回车是HTTP 1.1消息头内需要一个回车结尾,后者回车是提交数据。

之后,服务器将返回HTTP消息,如下:

HTTP/1.1 200 OK
Content-Length: 11
Content-Type: text/html
Content-Location: http://192.168.0.111/index.htm
Last-Modified: Fri, 08 Jul 2011 09:31:48 GMT
Accept-Ranges: bytes
ETag: "20917dc513dcc1:392"
Server: Microsoft-IIS/6.0
Date: Sun, 10 Jul 2011 06:21:11 GMT
Connection: close

第一行响应的值是200,说明请求成功,其他字段在这里不需过多解释,详细的可以见HTTP协议方面的资料。关键字段是Server,冒号后面的值暴露出服务器使用的web软件以及具体版本了。根据这个版本很容易推测出对方使用的windows 2003操作系统。

我一直觉得Server头应该可以根据需求自己修改的,因为它很多时候它的弊端大于的利端,而Nginx、Apache这些开放源码的web服务软件都可以在编译前修改源码中的信息,IIS是闭源的,是没法通过源码修改的。

但是再闭源,这些信息也是在文件中存在的,可以直接硬修改文件中的信息来隐藏它,研究了许久,终于找到了方法。之后在网上看到IIS5.0的banner信息也通过类似的方法修改的,却没有找到针对IIS6.0的:)

思考一下,web服务软件和客户端浏览器是基于客户端(Client)/服务器(Server)模型的,客户端浏览器发出消息,服务端的web服务软件读取数据,然后传给客户端。所以,我们有两个办法来隐藏信息,一是在它传送给客户端的之前就劫持信息,修改后某些敏感信息后再传送,类似于代理,不过这样降低了不少的性能;二是干脆就修改了文件中的信息,让它传给客户端我们修改后的信息。

经过一番研究,终于发现这些信息是存在c:\windows\system32\inetsrv\w3core.dll文件中的,对于这样的二进制PE文件,只有通过修改二进制来了。下来咱们就开始修改。

默认下,windows 2003是开启了系统文件保护的,所以欲开刀,需删除c:\windows\system32\dllcache中备份的w3core.dll文件。若不删除,修改了文件后会被替换回来的。这个路径需要直接在地址栏中手动输入。

删除后,咱们用Uedit32打开c:\windows\system32\inetsrv\w3core.dll。在茫茫16进制代码中,咱们一个一个寻找关键信息是比较麻烦的。咱们直接搜索,点击菜单栏上的“搜索”——“查找”,至于搜索内容,咱们就从刚才用nc提交信息后服务器返回的消息中Server字段中提取关键字,我就用“6.0”为关键字。记得勾选“查找ASCII”,如图1所示:

%E5%9B%BE1.jpg

查找结果如图2:

%E5%9B%BE2.jpg

图2中刷黑部分就是查找的结果,就可以直接修改这里了。我把“36”直接改成“37”,后边的显示就成了7.0了,读者可以按自己的喜好修改,这里我伪造成IIS7.0,如图3:

%E5%9B%BE3.jpg

之后对修改后的文件进行保存,不过,因为IIS在运行,在保存时需要停止IIS的服务。在控制面板-管理工具-服务里,找到IIS Admin Service,然后停止它。之后保存对w3core.dll的修改。倘若还是无法保存,最直接的方法便是将它另存为其他名字,然后删除原w3core.dll,再将它重命名为w3core.dll。

保存后再启动IIS Admin Service服务,启动后再对它重启一次,保证全部依赖的服务都启动。

图4是我修改后抓的包,如图:

%E5%9B%BE4.jpg

图5是我用Nmap扫描的结果,如图5:

%E5%9B%BE5.jpg

不过修改后用httprint也容易猜测出版本,因为httprint采用了HTTP指纹识别和HTTP签名技术,再结合了统计学的原理。关于这些方面,以后再撰文述之。