君子藏器于身待时而动,安全不露圭角覆盂之安。
——AnonySec
分析HTTP扫描模块
分析的模块位于/modules/auxiliary/scanner/http/http_version.rb
首先来看模块头的引入与类的定义:
| 1 | ## | 
- require 'rex/proto/http'表示该模块将要引入这个- rex库文件目录下的所有- http协议方法,所有的模块都可以被调取使用。包括用于设置连接的函数,get和post的请求和响应处理等。
- Msf::Auxiliary定义了该代码的类为辅助模块。
如下为/lib/rex/proto/http目录下的内容:

[注:继承有助于重用代码和快速执行,不幸的是,Ruby不支持多继承,但是Ruby支持mixins。mixin就像是多继承的一个特定实现,在多继承中,只有接口部分是可继承的。]
| 1 | # Exploit mixins should be called first(首先调用渗透模块mixins类) | 
上面代码所必需库文件中涵盖了编写模块所需要的所有方法,这些库文件的详细信息如下:
| 语句 | 引入路径 | 用途 | 
|---|---|---|
| Msf::Exploit::Remote::HttpClient | /lib/msf/core/exploit/http/client.rb | 这个库文件提供了大量方法,例如连接到目标计算机、发送请求、切断与客户端的连接等。 | 
| Msf::Auxiliary::WmapScanServer | /lib/msf/core/auxiliary/wmapmodule.rb | wmap是一款基于Metasploit的通用Web应用程序扫描框架,有助于完成Metasploit的Web渗透测试。 | 
| Msf::Auxiliary::Scanner | /lib/msf/core/auxiliary/scanner.rb | 这个文件包含了基于扫描模块的所有函数,提供了模块运行、模块初始化、扫描进度等各种方法。 | 
- 这个initialize方法是Ruby编程语言中的默认构造方法。它定义了名称Name、描述Description、作者Author、许可License等。许可就是'License' => MSF_LICENSE,最后用一个end结束。
| 1 | def initialize | 
最后这段代码才是真正干活做事的:
| 1 | def run_host(ip) | 
先来解释下在本段代码中所使用的重要函数:
| 函数 | 引入库文件 | 用途 | 
|---|---|---|
| run_host | /lib/msf/core/auxiliary/scanner.rb | 使用IP与所需主机建立连接 | 
| connect | /lib/msf/core/exploit/http/client.rb | 与目标服务器建立一个HTTP类型的连接 | 
| send_request_raw | /lib/msf/core/exploit/http/client.rb | 用来向目标发送原始的HTTP请求 | 
| http_fingerprint | /lib/msf/core/exploit/http/client.rb | 将HTTP响应解析为可以使用的变量 | 
在这里会产生疑问,就是从代码上下文中根本不清楚函数的具体定义,该如何解决?这时就需要查询Metasploit API官方文档。
下面来具体查询分析下:
- run_host 在run方法中,作用是与所需主机建立连接。

- begin意味着代码块的开始。
- 如果连接成功,就进行到connect方法,用于与目标服务器建立一个HTTP类型的连接。 

- 之后使用send_request_raw方法,连接到服务器,创建请求,发送请求,读取响应。并将这个方法的参数URI的值设置为/,参数method的值设置为GET,将这个响应保存在res变量。
res = send_request_raw({ 'uri' => '/', 'method' => 'GET' })

- 如果连接成功,使用http_fingerprint方法,记录和过滤信息。如:Set-cookie、Powered-by等。


- 接着再把收到的响应信息赋值给res,意味着将根据之前发送请求的响应数据进行特征匹配。
fp = http_fingerprint(:response => res)
- 之后对这些响应数据进行输出打印。 
- 最后, - rescue ::Timeout::Error, ::Errno::EPIPE将会在模块超时的情况下处理程序的异常。

可见,输出的格式对应print_good("#{ip}:#{rport} #{fp}") if fp
References
- 《Mastering Metasploit - Third Edition》 
