首页
社区
课程
招聘
[原创]Vigor3900固件仿真(CVE-2024-44844/CVE-2024-44845)
发表于: 2024-10-28 18:53 8973

[原创]Vigor3900固件仿真(CVE-2024-44844/CVE-2024-44845)

2024-10-28 18:53
8973

日常跟踪漏洞情报,看到 Vigor3900 最新版本固件 1.5.1.6 存在多处后台命令注入漏洞(CVE-2024-44844/CVE-2024-44845)[1]。正好最近看到几个固件仿真小工具,一并试试效果。

Vigor3900DrayTek 推出的一款高性能、多功能的企业级路由器,专为满足中大型企业、跨国公司及组织机构的网络需求而设计。支持多 WAN 冗余和负载均衡,具备强大的 VPN 功能和高级防火墙,适合复杂网络环境中的远程办公和分支机构互联,提供稳定、安全的网络解决方案。

DrayTek 官网提供固件下载[2]
(cf3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6X3N6#2)9J5k6h3c8J5j5i4W2@1k6h3E0Q4x3X3g2U0L8$3#2Q4x3X3g2@1N6#2)9J5c8W2)9J5z5b7`.`.

尝试 binwalk 提取压缩包中 .all 文件,只获取到一个 .ubi 文件。

一般情况下使用 ubireader 提取 .ubi 文件,可惜失败。

通过了解得知[3]ubi_reader 工具对于 ubi 文件要求较为严格,它并不能处理所有厂商定制的 UBI 镜像。ubidump 具备更强的兼容性,在处理特定固件格式时做了更多定制化处理。
使用 ubidump.py [4]进行提取。

判断架构为 32位arm 小端

firmwalker 简单扫一下找找 web 服务,发现 lighttpd 服务。

固件仿真可以尝试一下 Sevnup[5] (根据文件系统信息自动下载相关的内核文件、配置ip地址、打包上传文件系统等,懒狗福音了属于是)。


只需要在 qemu 里运行框中四条命令就行(qemu 里不能复制粘贴有些麻烦所以我运行完 ifconfig 后使用 ssh 连上去)。


执行完四条命令后直接进入 shell 并修改权限。

前文已经提到过 web 服务是 lighttpd,尝试运行 /etc/init.d/httpd,报错。

看看 /etc/init.d/lighttpd/etc/lighttpd/serverport.conflighttpd 如何解析 serverport.conf


可以看到 lighttpd 会根据当前 web_Port 变量的值(http 服务器端口) 向 serverport.conf 写入内容,配置 lighttpd 服务器的监听端口,看来并没有获取到 web_port 的值。

grep -r "web_port" 匹配关键字发现端口应该是 80

/etc/init.d/lighttpdweb_Port 改成 80 成功启动。


访问却出现 404

继续看看 /www 目录下都有什么文件,发现 /www/mobile 目录下存在 idnex.html 。并且访问 ip/mobile 即可访问到 /www/mobile/index.html


用户手册上说默认后台地址就是 192.168.1.1 (我仿真的环境是 10.10.10.2) 而不是 /www/mobile 目录下,所以 /www 目录下应该同样存在 idnex.html 文件。并且从用户手册得知默认账户密码 admin/admin

发现 /www/ajax.zip 包含 index.htmlunzip 解压得到 index.html 并成功访问。



接下来你就会发现,哈哈登陆又失败啦,因为是后台洞所以必须拿到 cookie ,抓包看看怎么个事。


登陆认证请求的 /www/cgi-bin/mainfunction.cgi 文件,拖进 ida 搜索关键字 fail(第一时间想的 patch 掉得了)。

Web UI Log-in Failure 应该就是这,交叉引用看看。

分析代码可知 sub_2BDE4 接收了用户名、密码、远程 IP 并返回登录状态 v30

进行跟进 sub_2C15C ,程序会将用户输入密码与系统中存储的密码进行匹配。

所以继续回到 shell,搜索 passwd 相关文件,find . -name "*passwd*"

系统中存了密码但是认证还是失败,证明可能有脚本操作 /etc/data-default/passwd,继续搜索关键字 grep -r /etc/data-default/passwd

运行 /etc/data-default/passwd 后成功登陆。


成了,可以复现漏洞了。


情报描述 name 参数通过 run_command 函数导致命令注入,我的 ida 并没有成功将 sub_21F28 识别为 run_command,我这里手动改了一下。
先来看看 run_commandrun_command 接收输入为 a1,代表一个字符串。并没有对 a1 进行任何的输入验证即调用 popen 执行。

漏洞触发在 sub_24764

函数 cgiGetValue(dword_44D3c,"name") cgiGetValue(dword_44D3C, "type") 从请求中获取参数 name typename 被传递给了 sub_ACD4 函数,返回值 v3 被作为证书文件的名字使用。因为 name 值用户可控且没有任何过滤,导致可能插入恶意系统命令。对type 进行验证,只有符合预期合法值才可通过。

漏洞复现


情报描述 option 参数通过filter_string 函数进行过滤,因为 filter_string 过滤不当并传入 system 导致命令注入,我的 ida 又没有成功将 sub_ACD4 识别为 filter_string,我这里手动改了一下。

先看看 filter_stringfilter_string 作用是将特定字符(; % | > ' " $ \t \n \r )替换为 + ,也会将 && 替换为 + 。但是并不会处理单独一个 &

漏洞触发在 sub_1DB3C

函数 cgiGetValue(dword_44D3C, "option") 从请求中获取参数,虽然 option 参数会先通过 filter_string 进行除了,但是前文已经提到黑名单中并不包含 & ,仍存在绕过可能,导致插入恶意系统命令。


固件仿真就这些招,以后学点新技术再来与诸君分享。

[1] 漏洞详情
5e7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2k6s2k6A6M7$3!0J5K9h3g2K6i4K6u0r3c8@1S2e0b7g2)9J5k6o6u0H3L8h3#2Q4x3X3b7#2y4i4k6^5i4K6u0V1M7i4u0^5N6R3`.`.
[2] 固件下载
7fcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6X3N6#2)9J5k6h3c8J5j5i4W2@1k6h3E0Q4x3X3g2U0L8$3#2Q4x3X3g2@1N6#2)9J5c8R3`.`.
[3] ubi文件解包
177K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6X3N6#2)9J5k6h3c8J5j5i4W2@1k6h3E0Q4x3X3g2U0L8$3#2Q4x3X3g2@1N6#2)9J5c8R3`.`.
[4] ubidump
385K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6@1K9r3g2Q4x3X3c8E0L8$3c8W2L8g2)9J5k6r3c8A6M7%4c8J5L8#2)9J5c8Y4m8A6L8X3g2H3K9r3!0F1k6g2)9#2k6X3#2G2k6r3g2E0i4K6g2X3M7$3c8C8i4K6u0r3j5X3I4G2j5W2)9J5c8X3b7#2j5h3j5@1y4e0q4S2y4$3k6S2x3$3x3%4z5e0q4S2z5e0V1J5j5e0u0V1y4U0f1^5x3e0x3I4j5$3t1$3k6r3t1I4k6U0V1$3k6o6g2Q4x3V1k6@1L8$3!0D9M7#2)9J5c8Y4g2T1K9h3c8#2L8i4m8Q4x3V1k6#2j5X3W2V1N6h3#2H3i4K6u0W2M7s2W2Q4x3U0y4x3y4l9`.`.
[5] Sevnup
f92K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6z5x3h3&6q4L8f1q4F1i4K6u0r3f1$3g2$3L8Y4g2H3

固件版本:Vigor3900 v1.5.1.6
https://fw.draytek.com.tw/Vigor3900/Firmware/v1.5.1.6/Vigor3900_v1.5.1.6.zip
固件版本:Vigor3900 v1.5.1.6
https://fw.draytek.com.tw/Vigor3900/Firmware/v1.5.1.6/Vigor3900_v1.5.1.6.zip
$ binwalk -e V3900_1516.all
 
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
131120        0x20030         UBI erase count header, version: 1, EC: 0x0, VID header offset: 0x200, data offset: 0x800
 
$ ls _V3900_1516.all.extracted/
20030.ubi
$ binwalk -e V3900_1516.all
 
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
131120        0x20030         UBI erase count header, version: 1, EC: 0x0, VID header offset: 0x200, data offset: 0x800
 
$ ls _V3900_1516.all.extracted/
20030.ubi
$ ubireader_extract_files _V3900_1516.all.extracted/20030.ubi
UBI Fatal: Less than 2 layout blocks found.
$ ubireader_extract_files _V3900_1516.all.extracted/20030.ubi
UBI Fatal: Less than 2 layout blocks found.
$ cd _V3900_1516.all.extracted/
$ python3 ubidump.py -s . 20030.ubi
==> 20030.ubi <==
1 named volumes found, 2 physical volumes, blocksize=0x20000
== volume b'rootfs' ==
saved 3402 files
$ ls rootfs/
bin   config_backup  dev  lib  proc  sbin  tmp  var
boot  data           etc  mnt  rom   sys   usr  www
$ cd _V3900_1516.all.extracted/
$ python3 ubidump.py -s . 20030.ubi
==> 20030.ubi <==
1 named volumes found, 2 physical volumes, blocksize=0x20000
== volume b'rootfs' ==
saved 3402 files

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

最后于 2025-2-10 16:02 被摆烂星君编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (7)
雪    币: 1231
活跃值: (481)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
1. Sevnup应各位师傅需求改成了无图形界面版本了
2. 仿真有个挺快的方法也可以参考下我一个文章
3. 这路由器我有十多个CVE,没复现我的,泪目了,哈哈哈
2024-10-29 10:28
0
雪    币: 2118
活跃值: (810)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3

以后想多写点其他智能设备的分析

最后于 2024-10-29 10:54 被摆烂星君编辑 ,原因:
2024-10-29 10:43
0
雪    币: 2118
活跃值: (810)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
N1nE 1. Sevnup应各位师傅需求改成了无图形界面版本了 2. 仿真有个挺快的方法也可以参考下我一个文章 3. 这路由器我有十多个CVE,没复现我的,泪目了,哈哈哈
你那个方法仿真也会遇到问题,固件来源不同吧可能
2024-10-29 10:46
0
雪    币: 1231
活跃值: (481)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
摆烂星君 你那个方法仿真也会遇到问题,固件来源不同吧可能
那个得需要配置我那个固件的conf文件,确实直接从官网下载不行哈哈
2024-10-29 12:31
0
雪    币: 2118
活跃值: (810)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
N1nE 那个得需要配置我那个固件的conf文件,确实直接从官网下载不行哈哈
那你这样还是有局限性,从官网下载的得自己修
2024-10-29 13:04
0
雪    币: 1231
活跃值: (481)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
摆烂星君 那你这样还是有局限性,从官网下载的得自己修

确实如此,我那个是比赛环境,然后可以复用到其他版本

最后于 2024-10-29 20:46 被N1nE编辑 ,原因:
2024-10-29 20:46
0
雪    币: 247
活跃值: (9289)
能力值: ( LV13,RANK:438 )
在线值:
发帖
回帖
粉丝
8
这设备是已经停产停服了吗?怎么2024年了还有这么多这种洞?
2024-10-29 21:11
0
游客
登录 | 注册 方可回帖
返回