ipTIME AX2004M (KVE-2023-0133)漏洞复现
漏洞概要:未授权远程代码执行
-
由于逻辑错误存在未授权访问漏洞,可以利用该漏洞进行账号密码修改,功能开启,进而进行远程命令执行
-
供应商: ipTIME
-
产品: AX2004M
-
版本: 14.19.0
-
固件链接:https://download.iptime.co.kr/online_upgrade/ax2004m_ml_14_190.bin
一、信息搜集
1.使用binwalk提取固件
binwalk -Me ax2004m_ml_14_190.bin
2.使用file命令查看固件文件信息
可以看出固件文件结构是32位MIPS架构,小端模式
3.使用checksec查看文件保护机制
只开启了NX保护
二、固件模拟
首先我们考虑使用FirmAE模拟固件,然后查看并分析固件运行的进程,如果FirmAE模拟不起来,再考虑分析启动项,并使用qemu模拟。
1.使用FirmAE模拟固件
输入以下命令进行固件模拟:
sudo ./run.sh -d AX2004M ./firmwares/ax2004m_ml_14_190.bin
浏览器访问:
固件模拟成功!
2.查看并分析进程
使用ps
命令查看进程
可以看到,由htppd提供web服务。
3.检查和分析路由器主要文件
通过观察路由器文件系统的顶层结构,以及web服务相关的文件,可以发现许多cgi文件,这些预先编译好的 cgi 文件会通过 HTTP 服务守护进程执行,并且根据路由器设置主页面的 URL(http://192.168.0.1/cgi-bin/timepro.cgi?tmenu=main_frame&smenu=main ) 以及其较大的文件容量,推测核心文件是timepro.cgi,并开始对其进行分析。
查看timepro.cgi文件所在的目录:
结合AI进行分析各cgi功能:
1.认证相关
captcha.cgi (5616 字节):可能用于生成验证码,防止登录页面的自动化攻击。
login.cgi -> /cgibin/login-cgi/login.cgi:登录页面入口,指向子目录中的脚本,负责显示登录界面。
login_handler.cgi (8300 字节):处理登录请求,可能负责验证用户名和密码。
login_session.cgi (12912 字节):管理用户会话,可能生成和验证会话令牌。
2.下载相关
download.cgi, download_easymesh.cgi, download_firewall.cgi, download_portforward.cgi (均为 7840 字节):大小相同,可能是同一功能的变种,用于下载配置文件、日志或特定模块的数据(如防火墙规则或端口转发设置)。
3.核心功能
m.cgi (51608 字节):多个符号链接(如 net_apply.cgi、sys_apply.cgi)指向此脚本,表明它是一个多功能核心脚本,可能处理网络、系统或无线配置的变更。
timepro.cgi (941724 字节):最大的脚本,d.cgi 链接到它,可能涉及高级管理功能。
mesh.cgi (10920 字节):与 Mesh 网络相关,可能与 easymeshd 进程配合,管理无线 Mesh 网络。
4.网络与硬件相关
txbf.cgi (8484 字节) 和 txbf_act.cgi -> /cgibin/txbf.cgi:可能与波束成形(Transmit Beamforming)相关,用于优化无线信号。
upgrade.cgi (13000 字节):处理固件升级,负责上传和应用新的固件文件。
5.符号链接
d.cgi, info.cgi, net_apply.cgi, sys_apply.cgi, wireless_apply.cgi, wol_apply.cgi:分别指向 timepro.cgi 或 m.cgi,表明这些是通用脚本的别名,用于特定功能(如网络应用、无线配置、唤醒局域网设备)。
6.子目录
ddns/ 和 login-cgi/:分别是动态 DNS 和登录相关的子目录,可能包含额外的配置文件或脚本。
三、漏洞分析
未授权访问
根据漏洞作者披露,该路由器固件在验证身份验证时存在逻辑错误,漏洞点在ftext
函数。
1.漏洞点分析
将timepro.cgi
文件导入IDA中进行分析,找到ftext
函数,分析该函数的功能作用,它的主要作用是处理 Web 请求(HTTP 请求),根据用户输入的参数(通过 a2
和 a3
传递)执行不同的操作,例如:
- 检查用户会话和认证。
- 处理特定的 Web 页面请求(如登录、固件状态、调试页面等)。
- 执行系统操作(如保存配置、重置设备)。
- 输出 HTML 或其他响应内容给浏览器。
简单来说,这是一个嵌入式设备 Web 界面的核心处理函数,根据 URL 参数(a2
)和 POST 数据(a3
)决定做什么,并返回相应的结果。
重点看这里:
这段代码主要用于初始化日志和进行会话认证检查,这里的处理逻辑是:
httpcon_check_session_url() == 1
(会话有效)且httpcon_auth(1, 1) == 0
(认证失败),条件成立,return 0 ,无法进行后续操作。httpcon_check_session_url() == 1
(会话有效)且httpcon_auth(1, 1) == 1
(认证成功),条件不成立,可以进行后续操作。
但这里存在一个逻辑错误,如果存在httpcon_check_session_url() == 0
(会话无效)的情况,那无论认证是否成功,都能进行后续操作。
所以,这里可能存在未授权漏洞,接下来要寻找会话无效
是什么情况。
2.寻找会话无效
情况
点进httpcon_check_session_url
函数,发现该函数是个外部引用函数。
使用grep -r "httpcon_check_session_url"
命令寻找该函数存在哪个二进制文件中。
因为是外部应用,所以我们将libsession.so
文件用IDA打开分析,通过搜索字符串httpcon_check_session_url
找到该函数。
这是一个用于检查 HTTP 请求会话的函数。它的主要作用是:
- 检查当前请求的 URL(通过环境变量
REQUEST_URI
获取)是否与会话管理相关。 - 返回一个布尔值(
true
或false
),表示请求是否需要会话检查。
简单来说,这个函数判断“这个请求是不是跟会话管理有关”。如果 URL 是空的,或者以 /sess-bin/
开头,它返回 true
;否则返回 false
。
也就是说,当url里面不是以/sess-bin/
开头,那它就是会话无效
情况。
3.验证漏洞
先正常登录进去,查看一下功能页面,同时打开burp抓包。
我们进入到了这样一个功能界面,接着查看抓包内容:
![14.p