危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2289 浏览18790324

修改PE文件隐藏IIS6的banner

一般来说,渗透测试前,都需要做好信息收集的工作,比如探测对方的端口、开放的服务等等。针对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版本号,现在绝大多数都是FITTP1.1的,基本上不会存在1.O版本的了。不过要是提交HEAD/HTTP/1.0的话,就不需要HOST字段了;HOST字段指服务器的地址,在HTTP 1.1标准头中,HOST字段是必须存在的,而HTTP l.0中是可选的,但是要是只提交FIEAD/HTIP/1.0的话,会自动转换成HTTP 1.1的字段的,不过可以少输一行达到偷懒的效果。之所以要解释这一段,是为了解释为什么有些人疑惑输入HEAD/HTTP/l.O却返回的HTTP 1.1的消息。最后需要回车再回车也是跟HTTP1.1标准有关,前一个回车是HTTP 1.1消息头内需要一个回车结尾,后者回车是提交数据。

之后,服务器将返回HTTP消息。

第一行响应的值是200,说明请求成功,其他字段在这里不需过多解释,详细的可以见HTTP协议方面的资料。关键字段是Server,冒号后面的值暴露出服务器使用的web软件以及具体版本了。根据这个版本很容易推测出对方使用的操作系统。我一直觉得Server头应该可以根据需求自己修改的,因为它很多时候它的弊端大于的利端,而nginx、apache这些开放源码的web服务软件都可以在编译前修改源码中的信息,IIS是闭源的,是没法通过源码修改的。但是再闭源,这些信息也是在文件中存在的,可以直接硬修改文件中的信息来隐藏它,研究了许久,终于找到了方法。之后在网上看到IIS5.0的banner信息也通过类似的方法修改的,却没有找到针对IIS6.0的:)思考一下,web服务软件和客户端浏览器是基于客户端(Client)/服务器(Server)模型的,客户端浏览器发出消息,服务端的web服务软件读取数据,然后传给客户端。所以,我们有两个办法来隐藏信息,一是在它传送给客户端的之前就劫持信息,修改后某些敏感信息后再传送,类似于代理,不过这样降低了不少的性能;二是干脆就修改了文件中的信息,让它传给客户端我们修改后的信息。

危险漫步经过一番研究,终于发现这些信息是存在c:\windows\system32\inetsrv\w3core.dll文件中的,对于这样的二进制PE文件,只有通过修改二进制来了。下来咱们就开始修改。默认下,windows 是开启了系统文件保护的,所以欲开刀,需删除c:\windows\system32\dllcache中备份的w3core.dll文件。若不删除,修改了文件后会被替换回来的。这个路径需要直接在地址栏中手动输入。删除后,咱们用Uedit32打开c:\windowsYsystem32]inetsrv\w3core.dll。在茫茫16进制代码中,咱们一个一个寻找关键信息是比较麻烦的。咱们直接搜索,点击菜单栏上的“搜索”——“查找”,至于搜索内容,咱们就从刚才用nc提交信息后服务器返回的消息中Server字段中提取关键字,我就用“6.0”为关键字。记得勾选“查找ASCⅡ”。

刷黑部分就是查找的结果,就可以直接修改这里了。我把“36”直接改成“37”,后边的显示就成了7.0了,读者可以按自己的喜好修改,这里我伪造成IIS7.0。之后对修改后的文件进行保存,不过,因为IIS在运行,在保存时需要停止IIS的服务。在控制面板一管理工具一服务里,找到IIS Admin Service,然后停止它。之后保存对w3core.dll的修改。倘若还是无法保存,最直接的方法便是将它另存为其他名字,然后删除原w3core.dll,再将它重命名为w3core.dll。保存后再启动IIS Admm Service服务,启动后再对它重启一次,保证全部依赖的服务都启动。修改后抓的包。

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

相关推荐