Tenda AC15路由器漏洞分析
1726215822930452 历史精选 221浏览 · 2025-03-26 07:44



CVE-2018-5767

image.png
图片加载失败


配置一个虚拟桥接接口,加一个本地的br0网桥,桥接到ens32:

image.png
图片加载失败


1POC,大致测试是否存在漏洞:

image.png
图片加载失败
测试说明存在栈溢出的漏洞,后续再仔细利用这个栈溢出漏洞getshell。这里为什么是cookie,关系到函数中对http的解析:
image.png
图片加载失败
image.png
图片加载失败
image.png
图片加载失败


1 漏洞点在./bin/httpd程序中的R7WebsSecurityHandler函数里:sscanf函数:字符串 v37 中解析出 = 之后、; 之前的内容,并将该内容存储到变量 v30 中。但是临时变量v30的大小是固定,只有0x1C0。这里没有对用户的输入进行过滤也没又长度的限制,从而有机会覆盖栈劫持程序流。前提时要保证进入这个if语句中。
image.png
图片加载失败


2 利用栈溢出漏洞,前提需要满足if条件,需要满足url请求,只要不再这个字符串内选就行了:
image.png
图片加载失败
用"/goform/bkbqwq"即可,来到sscanf这里:
image.png
图片加载失败
再函数退出的时候,在栈上安排好pop_r0给r0寄存器传参,pop_pc衔接到system函数调用:
image.png
图片加载失败
这里将system改为put函数,看看是否能输出"/bin/sh":可以成功输出,栈溢出利用成功。
image.png
图片加载失败
使用"-strace" 可以看到详细的一些函数的调用信息:

-strace

作用:启用系统调用跟踪,显示程序运行过程中所有的系统调用

write输出/bin/sh是成功调用到了的:

image.png
图片加载失败


但是在执行system函数的时候,可能因为sh不存在,导致了报错,No such file or directory,但是确实是执行了。可能是因为chroot . 改变了目录的原因:

image.png
图片加载失败


本身在固件模拟之前就无法执行这个系统调用,似乎是因为/bin/sh这个shell不存在导致的。如果是在系统态下模拟的话可以成功:

image.png
图片加载失败


1exp,方便起见,可以将libc基地址提前算好(puts函数实际地址-libc库中的偏移):

不知道为什么,用户级的qemu在ubuntu上模拟执行命令能成功:

1 调试看一下,程序是如何通过url来定位到每一个函数,进而调用的:可以直接调试来定位,也可以请求一个不存在url,根据报错信息来定位:

image.png
图片加载失败
根据报错的字符串 is not defined 定位到这个函数websFormHandler:可以基本确定含有goform的请求例如("http://192.168.72.140/goform/SetPptpServerCfg"),都是通过websFormHandler函数利用**函数指针**进行调用。在ida里面无法直接看见:
image.png
图片加载失败
再引用一下,这里就非常明显:
image.png
图片加载失败
下面的sub_42378函数将对应的函数地址标签绑定,例如如果请求的是SysStatusHandle,那么就调用fromSysStatusHandle函数来处理这个请求,就直接分析这个函数即可。反过来分析也一样:
image.png
图片加载失败


CVE-2018-18727

image.png
图片加载失败


1 限定位到缺陷函数,在依次往上层函数调用找:这里复制给a2,a2时上层函数传进来的参数
image.png
图片加载失败
往上,发现v12是局部变量,所以sub_C24C0在复制发生溢出之后,可能会覆盖sub_C17A0的返回地址,利用点就在这里。
image.png
图片加载失败


2 确定我们控制的参数,sub_C24C0函数中复制的参数也是sub_C17A0传递进去的(num_deviceList):继续往上查找:
image.png
图片加载失败
继续往上:所以参数是由formSetMacFilterCfg函数中取出的 deviceList字段数据。由此可以判断,程序获取到HTTP请求中deviceList的值
image.png
图片加载失败
formSetMacFilterCfg函数被绑定在”setMacFilterCfg“上:
image.png
图片加载失败
找到,执行formSetMacFilterCfg函数的请求条件:在提取的文件系统中找到 ./webroot_ro/goform/setMacFilterCfg.txt 这样一条路径:
image.png
图片加载失败
请求goform/setMacFilterCfg路径调试一下,看看是否会进入formSetMacFilterCfg函数:
image.png
可以进入该函数
image.png
图片加载失败


3 漏洞利用,要进入到最后的溢出点,还要绕过前面的一些判断条件:所以,还需要加入一个macFilterType字段,参数设置为"black"或者"white" :
image.png
图片加载失败
image.png
图片加载失败
继续进入sub_C14DC(num_macFilterType, num_deviceList)函数,这里已经取出了deviceList的值。这里只需要deviceList的值不为空即可
image.png
图片加载失败
再进入sub_C17A0(a1, num_deviceList, v10)函数:没有限制,直接进入sub_C24C0(num_deviceList, v12);
image.png
图片加载失败
进入最后的溢出函数,这里只需要num_deviceList的值中包含"\r"即可,strcpy会从"\r"后面开始复制:
image.png
图片加载失败
复制结束后返回上层函数,在上层函数sub_C17A0中完成劫持。注意构造的payload中间不能被b"\x00"截断,否则无法覆盖。

4 exp构造:测试溢出长度:长度为176
image.png
图片加载失败
没开canary保护,直接溢出后,站上布局 ==> POP{r3,PC};system_addr;mov r0,sp;blx r3;cmd。
image.png
图片加载失败
gadget如下:
image.png
图片加载失败
提前拿到libc的基地址:puts_addr - puts_offset = 0x409f0000(我的)测试:
image.png
图片加载失败
退出返回到上层函数,成功衔接到gadget:
image.png
图片加载失败
调用到system,进行任意命令执行:
image.png
图片加载失败
成功执行命令:
image.png
图片加载失败


CVE-2018-18708

image.png
图片加载失败


1 fromAddressNat函数存在栈溢出:
image.png
图片加载失败


2 细致分析和上面一样,直接测试偏移:偏移为248 :这里记要检查下CPSR寄存器的T位,因为栈上内容弹出到PC寄存器时,其最低有效位(LSB)将被写入CPSR寄存器的T位,而PC本身的LSB被设置为0。如果T位值为1,需要在地址上加一还原。cpsr寄存器每bit位置如下
image.png
图片加载失败
image.png
图片加载失败


3exp,上面的一些gadget和函数偏移都不用改,修改url和请求的数据即可:

成功任意命令执行:

image.png
图片加载失败


CVE-2018-18730

image.png
图片加载失败


1 最后的溢出点选在这里:
image.png
图片加载失败


2 绕过的条件,满足条件3之后可自动绕过条件2:
image.png
图片加载失败
最后的sscanf只要不匹配4个即可是条件为真。

3 Poc测试,顺便测试偏移:startIp的偏移为 ==> 372
image.png
图片加载失败
endIp的偏移为 ==> 404
image.png
图片加载失败


4上面两个任意选择一个打即可,但是选endIp的时候startIp的值要为"xx.xx.xx.xx",exp如下:

单步调试:

image.png
图片加载失败


sscanf成功覆盖返回值:

image.png
图片加载失败


命令执行成功(中间肯可能需要等待一段时间)

image.png
图片加载失败


CVE-2018-18731

image.png
图片加载失败


1 ida中定位到addWifiMacFilter函数:到达溢出点只需要满足一个条件即可
image.png
图片加载失败


2 直接先测poc,看看偏移:走deviceId偏移为793
image.png
图片加载失败
走deviceMac偏移为 ==> 796
image.png
图片加载失败


3直接上exp:

单步调试看看溢出:

image.png
图片加载失败


成功覆盖:

image.png
图片加载失败


成功执行命令:

image.png
图片加载失败


CVE-2018-18732

image.png
图片加载失败


1 ida中定位到fromSetSysTime函数:满足这三个条件即可到达溢出点,条件一只需要加一个timeType字段将其设置为sync即可。
image.png
图片加载失败
条件2,查看CommitCfm函数的实现,可以发现一定会返回1:
image.png
图片加载失败
条件3这里理论上是一定可以满足的,只要SetValue函数和GetValue函数能条用成功,调试一下看看是否能调用成功:但是在SetValue函数退出的时候返回值设置为0,说明SetValue函数可能并没有调用成功
image.png
图片加载失败
看一下函数细节:
image.png
图片加载失败
在实际调试的时候发现在 第一个id条件判断的时候就进不去
image.png
图片加载失败
后续跟踪到这里,connect调用不成功。连接到服务器端套接字 /var/cfm_socket 失败导致的,可能有一些服务没启动,或者有些固件的依赖:
image.png
图片加载失败
查看还有哪些文件中存在 "/var/cfm_socket":
image.png
图片加载失败
在cfm中找到了InitServer函数,cfmd中也有这个函数,可能是用来初始化服务的,这里尝试启动这个程序,但是似乎失败了,报错一堆:
image.png
图片加载失败
这里为了复现漏洞方便,最快的方法就是直接修改条件三:
image.png
图片加载失败
最后顺利执行到溢出点位置:
image.png
图片加载失败


2 测试poc,和溢出范围:溢出的距离为572
image.png
图片加载失败
exp:

最后成功执行命令:
image.png
图片加载失败


CVE-2018-18729

image.png
图片加载失败


1 定位到GetParentControlInfo函数:strcpy没有限制复制的长度
image.png
图片加载失败


2给一个超长的值给mac字段,可能会造成拒绝服务:

image.png
图片加载失败
程序报错退出:
image.png
图片加载失败


CE-2018-18728

image.png
图片加载失败


1 定位到formSetSambaConf函数:只需要绕过一个条件即可,添加一个action字段赋值为"del"即可。
image.png
图片加载失败


2poc测试命令注入:

image.png
图片加载失败


CVE-2024-3906

image.png
图片加载失败


1 定位到formQuickIndex函数:函数赋值没有限制长度,导致上层函数产生栈溢出
image.png
图片加载失败
满足一个条件即可,mit_linktype这段给"2"
image.png
图片加载失败
qemu模拟的话这里要手动取否:
image.png
图片加载失败
测试偏移为104
image.png
图片加载失败
exp:

成功执行命令:
image.png
图片加载失败


CVE-2024-4171

image.png
图片加载失败


1 定位到fromWizardHandle函数:这个函数在循环赋值得到时候没有长度限制,导致溢出:
image.png
图片加载失败
只需要绕过一个条件即可,WANT赋值为"2"
image.png
图片加载失败
但是这个程序运行起来,会在这里报错调用atoi将字符串转化为数字的时候报错:
image.png
图片加载失败
看汇编如下,这里给atoi函数传参时只给了一个字节
image.png
图片加载失败
动调显示也只有一个字节。所以这里给的参数不正确(即使是在正常的请求下也会报错)
image.png
图片加载失败
正常情况如下,应该给的参数是指向字符串的地址
image.png
图片加载失败
image.png
图片加载失败
修改方法,将LDRB指令改为LDR即可:
image.png
图片加载失败


2 测试偏移为320:
image.png
图片加载失败
exp如下:

成功执行命令:

image.png
图片加载失败
在后面不远处还有一个位置同样调用了sub_4F9E4函数,也会产生栈溢出。偏移都相同,改一下data参数即可(上面CVE-2024-3906都是因为这个函数):data = {"WANT":"2","PPW": payload} ==> data = {"WANT":"3","pppl2_pwd": payload}

image.png
图片加载失败
同样可以执行命令:

image.png
图片加载失败


0 条评论
某人
表情
可输入 255

没有评论