提交需求
*
*

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

logo

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

    申请试用
      Tenda 系列路由器CVE-2018-16333栈溢出漏洞复现
      发布时间:2023-04-28 阅读次数: 1227 次

      漏洞简述




      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系列路由器固件中存在缓冲区溢出漏洞,在处理 POST 请求传输过来的 ssid 参数时,ssid 参数的值直接复制到栈上的一个局部变量中,这会覆盖函数的返回地址,从而导致了缓冲区溢出漏洞。


      固件模拟



      首先从https://github.com/Snowleopard-bin/pwn/tree/master/IOT/Tenda_CVE-2018-16333下载存在漏洞的固件
      图片
      解压固件


      binwalk -Me US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin --run-as=root
      图片
      解压后在_US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin.extracted/目录下存在squashfs-root文件系统
      图片
      接下来进行固件模拟,在本文中主要进行qemu user级调试
      首先安装qemu-user-static


      sudo apt install qemu-user-static
      图片
      然后执行下面的两条命令进行qemu用户级调试


      cp $(which qemu-arm-static) .
      sudo chroot ./ ./qemu-arm-static ./bin/httpd
      此时会发现会一直卡在如下图所示的启动进度
      图片
      /bin/httpd文件拖进IDA中
      使用alt+t组合键搜索WeLoveLinux关键字,查询资料发现此处存在check_network、ConnectCfm会进行网络连接方面的确认,需要对这两个方法的返回值进行patch才能绕过此处的判断逻辑让程序正常执行下去
      图片
      通过以下的链接和命令下载和安装IDA插件keypatch



      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目录即可
      值得注意的是,在IDA7.5及更新的版本中,keypatch仓库的主分支文件在导入到IDA中时可能会报错无法正常使用,这个时候可以使用这个分支的keypatch.py文件:

      https://github.com/keystone-engine/keypatch/blob/08e743b841be90c99554b7fa4a6f5e11c6b1d8f8/keypatch.py


      安装完成后,右键即可看到Keypatch插件的工具栏


      图片


      接下来我们通过Keypatch->Patcher将check_network、ConnectCfm的
      MOV R3, R0
      都修改为
      MOV R3, #1
      图片
      patch后的程序逻辑如下
      图片
      点击Edit->Patch->Apply patches to input file,即可让上面的patch生效
      图片
      将patch后的httpd替换掉原本的/bin/httpd文件(注意进行备份)


      mv ./bin/httpd ./bin/httpd.bak
      chmod 777 ./bin/httpd
      查询资料发现除了要对httpd文件patch之外,还需要建立虚拟网桥br0,因为程序是从名为br0的网卡获取网络地址


      apt-get install bridge-utils
      apt-get install uml-utilities
      sudo brctl addbr br0
      sudo brctl addif br0 ens32
      sudo ifconfig br0 172.16.1.1/24
      sudo ifconfig br0 up
      完成br0的创建后,执行下面的命令在此进行固件模拟

      sudo chroot ./ ./qemu-arm-static ./bin/httpd
      图片
      使用浏览器访问http://172.16.1.1
      此时可能还是不能正常访问路由器后台界面,如下图,这时因为程序无法找到部分文件导致的
      图片
      这时只需要执行下面的命令拷贝web程序所需文件到/webroot/目录即可


      cp -rf ./webroot_ro/* ./webroot/
      图片
      此时再访问http://172.16.1.1,发现已能正常访问路由器管理界面


      图片




      漏洞复现




      存在漏洞的接口地址为/goform/fast_setting_wifi_set

      当通过GET方式直接请求http://172.16.1.1/goform/fast_setting_wifi_set时,可以发现响应是跳转到登录页面


      图片


      此时将请求修改为POST方式,并在请求body中加入ssid参数,此时ssid=aaa,发送请求后,程序返回了一个errCode的响应,此时程序仍正常运行


      图片


      我们将ssid参数修改为较长的脏数据,再次发送请求包,这个时候程序不再返回任何响应,刷新路由器页面发现已经不能正常访问


      图片
      查看模拟路由器的启动命令窗口,可以看到模拟固件进程已经退出,并提示“段错误”,溢出漏洞复现成功


      图片




      漏洞分析




      根据漏洞原作者的描述,漏洞出现在路由器的web服务器--httpd文件中


      https://github.com/ZIllR0/Routers/blob/master/Tenda/oob1.md
      图片


      使用IDA打开_US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin.extracted/bin目录下的httpd文件


      图片


      使用alt+t组合键搜索"ssid"关键字


      图片


      定位到调用了ssid的fast_setting_wifi_set函数,程序获取ssid参数后,没有经过检查就直接使用strcpy函数复制到栈变量中,造成了栈溢出漏洞。

      图片


      免费试用
      服务热线

      马上咨询

      400-811-3777

      回到顶部