我目前正在尝试为 Metasploit 编写一个辅助模块。该模块基本上会尝试使用多个默认凭据来访问路由器的管理页面。身份验证是通过 Web 完成的,即 HTTP POST。
目前,该模块对普通 HTTP 连接(即不安全的连接)按预期工作,但是通过 HTTPS(端口 443)的每次连接尝试都返回 nil。下面是 Metasploit 类中用于检索登录页面的函数:
def get_login_page(ip)
begin
response = send_request_cgi(
'uri' => '/',
'method' => 'GET'
)
# Some models of ZyXEL ZyWALL return a 200 OK response
# and use javascript to redirect to the rpAuth.html page.
if response && response.body =~ /changeURL\('rpAuth.html'\)/
vprint_status "#{ip}- Redirecting to rpAuth.html page..."
response = send_request_cgi(
'uri' => '/rpAuth.html',
'method' => 'GET'
)
end
rescue ::Rex::ConnectionError
vprint_error "#{ip} - Failed to connect to Web management console."
end
return response
end
尝试通过 HTTPS 连接时,第一个send_request_cgi调用返回 nil。没有异常被捕获或抛出。我已经尝试使用 3 个不同的主机来确保问题不在于特定的端点。我所有的 3 次尝试都没有返回响应。每次尝试时,我都将 RPORT 选项设置为 443;
RHOSTS 0.0.0.0 yes The target address range or CIDR identifier
RPORT 443 yes The target port
请注意,我已将真实 IP 替换为 0.0.0.0。使用网络浏览器,我实际上可以毫无问题地通过 HTTPS 连接到路由器(除了必须添加一个例外,因为证书不受信任)并显示登录页面。使用 Wireshark,我尝试查看生成的流量。我可以清楚地看到路由器没有发送任何内容。我注意到 3 次握手已完成并发出 HTTP GET 请求:
GET / HTTP/1.1
Host: 0.0.0.0
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
之后有 3-4 个 ACK,然后是服务器发送的 FIN/PUSH。
基于 Metasploit 的 GitHub 上的这个页面,我的印象是到 HTTPS 网站的连接是由底层框架处理的。我没有看到任何文章/教程/资料让我不相信。关于send_request_cgi的文档没有指定建立 HTTPS 连接的任何特定要求。其他帖子没有我遇到的完全相同的问题。在这一点上,我怀疑操作系统、框架或我忘记启用某些东西。我看过的其他模块要么只针对 HTTP 网站——我对此表示怀疑——要么对 HTTPS 连接没有任何特殊处理。
任何帮助确定原因将不胜感激。
Metasploit 版本:框架:4.9.3-2014060501 控制台:4.9.3-2014060501.15168
操作系统版本:SMP Debian 3.14.5-1kali1 (2014-06-07)