第八届“强网”拟态防御国际精英挑战赛 - WIN!致敬mt 复现
字数 2270 2025-11-08 10:04:01

第八届“强网”拟态防御国际精英挑战赛 IoT 题目 WIN! 漏洞复现教学文档

1. 题目概述

本教学文档详细分析第八届“强网"拟态防御国际精英挑战赛中的 IoT 题目"WIN!”的漏洞利用过程。该题目是一个典型的物联网设备安全挑战,涉及多个漏洞的组合利用,最终实现远程代码执行。

2. 环境基本信息

2.1 服务配置

  • 开放端口:仅开放 80 端口
  • Web 服务器:lighttpd
  • 启动命令/usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
  • 进程信息
    www-data 2226 1 0 Oct27 ? 00:00:01 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
    

2.2 文件结构

  • Web 根目录:根据 lighttpd.conf 配置确定
  • CGI 程序位置:包含 auth.cgi、manage.cgi、upload.cgi、lang.cgi 等关键文件

3. 漏洞分析流程

3.1 第一步:获取管理员凭证

3.1.1 认证机制分析

  1. 登录逻辑:通过分析 auth.cgi 发现认证流程
  2. 密码存储:账号密码存储在特定文件中,密码经过加密处理

3.1.2 加密算法分析

加密算法核心逻辑:

  1. 异或操作:对原始密码进行异或加密
  2. Base64 编码:将异或结果进行 Base64 编码

3.1.3 解密过程

通过逆向分析得出解密脚本,获取明文密码:

  • 用户名:admin
  • 密码8g323##a08h33zx33@!B!

3.2 第二步:栈溢出漏洞分析

3.2.1 漏洞位置

  • 文件:manage.cgi
  • 函数sub_9FD0 函数中的 shm_mem_dump 调用

3.2.2 漏洞触发条件

  1. rk 参数验证:需要传入与 /tmp/rootkey 内容一致的 rk 参数
  2. id 值控制:id 值需要为负数,触发整数溢出
  3. 共享内存操作:通过特定条件触发非常规 memcpy 操作

3.2.3 溢出机制

shm_mem_dump(..., (buf + (((unsigned int8)v16 ^ 0x13) & 1)), ...);

当 v16(id 值)为负数时,会导致栈缓冲区溢出。

3.3 第三步:前置条件突破

3.3.1 获取 niksessid(/tmp/rootkey 内容)

  1. 文件创建:通过 watch 二进制文件创建 /tmp/rootkey
  2. 目录遍历漏洞:利用 upload.cgi 的路径截断漏洞读取文件

路径截断漏洞细节

  • 漏洞位置:upload.cgi 的 download 功能
  • 利用方式:构造路径如 /tmp/./././xxxxxrootkeynik.gif
  • 绕过检查:通过路径构造绕过 check_suffix(filepath, "nik.gif") 检查
  • 文件读取:成功读取 64 字节的 /tmp/rootkey 内容

3.3.2 控制 id 值

  • 利用文件:lang.cgi
  • 参数:通过 setid 参数设置 id 值
  • 存储位置:id 值保存到 /tmp/store/id.txt

3.4 第四步:共享内存控制

3.4.1 字符逃逸漏洞

  • 文件:manage.cgi 的 setpkfunc 功能
  • 漏洞类型:off-by-one 错误 + 字符逃逸

关键代码逻辑

if (idx == 80) {
    final_data[81] = chunk[80]; // 直接赋值,绕过检查
    break;
}

3.4.2 利用方法

  1. 通过 cnt1 和 cnt2 参数控制写入位置
  2. 利用字符逃逸将特定字符写入共享内存
  3. 构造 ROP chain 和命令字符串

3.5 第五步:命令执行

3.5.1 利用条件

  • 防护机制:无 PIE 和 ASLR,地址固定
  • 稳定性:直接将 system 命令字符串写入共享内存

3.5.2 执行流程

  1. 通过栈溢出控制程序流程
  2. 跳转到 system 函数
  3. 执行共享内存中的命令
  4. 将 flag 重定向到 /tmp/store/logs.txt
  5. 通过日志查看功能获取 flag

4. 完整攻击链

4.1 攻击步骤

  1. 信息收集:分析服务配置和文件结构
  2. 认证绕过:解密获取管理员凭证
  3. 条件准备
    • 通过 watch 程序创建 /tmp/rootkey
    • 利用路径截断读取 niksessid
    • 通过 lang.cgi 设置负数的 id 值
  4. 内存操控:利用字符逃逸漏洞向共享内存写入 payload
  5. 漏洞触发:通过 manage.cgi 触发栈溢出,执行 ROP chain
  6. 结果获取:读取 flag 到日志文件并查看

4.2 关键技术点

  1. 多漏洞链式利用:将孤立漏洞组合成完整攻击链
  2. 条件竞争处理:确保各阶段条件满足
  3. 稳定性保证:通过固定地址和共享内存存储提高攻击稳定性

5. 漏洞修复建议

5.1 安全加固措施

  1. 输入验证:对所有输入参数进行严格验证和过滤
  2. 边界检查:加强缓冲区边界检查,防止溢出
  3. 路径处理:规范化路径处理,防止目录遍历
  4. 权限控制:加强文件访问权限控制
  5. 内存保护:启用 ASLR、PIE 等内存保护机制

5.2 代码审计重点

  1. CGI 程序安全:重点审计所有 CGI 程序的输入处理逻辑
  2. 文件操作:检查所有文件操作相关的安全风险
  3. 内存管理:审查动态内存分配和拷贝操作
  4. 整数溢出:检查数值计算中的整数溢出风险

6. 总结

本题目展示了 IoT 设备中典型的安全问题:

  • 微小的漏洞组合形成强大攻击链的重要性
  • 系统组件间相互信任带来的安全风险
  • 防御机制缺失导致的严重安全后果

通过本次复现,安全研究人员可以深入理解:

  1. 真实环境中漏洞链的构造方法
  2. IoT 设备特有的安全挑战
  3. 从信息收集到完整利用的完整渗透测试流程

该题目的难度适中,主要挑战在于对整体系统的把控能力和将孤立漏洞巧妙连接的技术思路。

第八届“强网”拟态防御国际精英挑战赛 IoT 题目 WIN ! 漏洞复现教学文档 1. 题目概述 本教学文档详细分析第八届“强网"拟态防御国际精英挑战赛中的 IoT 题目"WIN !”的漏洞利用过程。该题目是一个典型的物联网设备安全挑战,涉及多个漏洞的组合利用,最终实现远程代码执行。 2. 环境基本信息 2.1 服务配置 开放端口 :仅开放 80 端口 Web 服务器 :lighttpd 启动命令 : /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf 进程信息 : 2.2 文件结构 Web 根目录:根据 lighttpd.conf 配置确定 CGI 程序位置:包含 auth.cgi、manage.cgi、upload.cgi、lang.cgi 等关键文件 3. 漏洞分析流程 3.1 第一步:获取管理员凭证 3.1.1 认证机制分析 登录逻辑 :通过分析 auth.cgi 发现认证流程 密码存储 :账号密码存储在特定文件中,密码经过加密处理 3.1.2 加密算法分析 加密算法核心逻辑: 异或操作 :对原始密码进行异或加密 Base64 编码 :将异或结果进行 Base64 编码 3.1.3 解密过程 通过逆向分析得出解密脚本,获取明文密码: 用户名 :admin 密码 : 8g323##a08h33zx33@!B! 3.2 第二步:栈溢出漏洞分析 3.2.1 漏洞位置 文件 :manage.cgi 函数 : sub_9FD0 函数中的 shm_mem_dump 调用 3.2.2 漏洞触发条件 rk 参数验证 :需要传入与 /tmp/rootkey 内容一致的 rk 参数 id 值控制 :id 值需要为负数,触发整数溢出 共享内存操作 :通过特定条件触发非常规 memcpy 操作 3.2.3 溢出机制 当 v16(id 值)为负数时,会导致栈缓冲区溢出。 3.3 第三步:前置条件突破 3.3.1 获取 niksessid(/tmp/rootkey 内容) 文件创建 :通过 watch 二进制文件创建 /tmp/rootkey 目录遍历漏洞 :利用 upload.cgi 的路径截断漏洞读取文件 路径截断漏洞细节 : 漏洞位置 :upload.cgi 的 download 功能 利用方式 :构造路径如 /tmp/./././xxxxxrootkeynik.gif 绕过检查 :通过路径构造绕过 check_suffix(filepath, "nik.gif") 检查 文件读取 :成功读取 64 字节的 /tmp/rootkey 内容 3.3.2 控制 id 值 利用文件 :lang.cgi 参数 :通过 setid 参数设置 id 值 存储位置 :id 值保存到 /tmp/store/id.txt 3.4 第四步:共享内存控制 3.4.1 字符逃逸漏洞 文件 :manage.cgi 的 setpkfunc 功能 漏洞类型 :off-by-one 错误 + 字符逃逸 关键代码逻辑 : 3.4.2 利用方法 通过 cnt1 和 cnt2 参数控制写入位置 利用字符逃逸将特定字符写入共享内存 构造 ROP chain 和命令字符串 3.5 第五步:命令执行 3.5.1 利用条件 防护机制 :无 PIE 和 ASLR,地址固定 稳定性 :直接将 system 命令字符串写入共享内存 3.5.2 执行流程 通过栈溢出控制程序流程 跳转到 system 函数 执行共享内存中的命令 将 flag 重定向到 /tmp/store/logs.txt 通过日志查看功能获取 flag 4. 完整攻击链 4.1 攻击步骤 信息收集 :分析服务配置和文件结构 认证绕过 :解密获取管理员凭证 条件准备 : 通过 watch 程序创建 /tmp/rootkey 利用路径截断读取 niksessid 通过 lang.cgi 设置负数的 id 值 内存操控 :利用字符逃逸漏洞向共享内存写入 payload 漏洞触发 :通过 manage.cgi 触发栈溢出,执行 ROP chain 结果获取 :读取 flag 到日志文件并查看 4.2 关键技术点 多漏洞链式利用 :将孤立漏洞组合成完整攻击链 条件竞争处理 :确保各阶段条件满足 稳定性保证 :通过固定地址和共享内存存储提高攻击稳定性 5. 漏洞修复建议 5.1 安全加固措施 输入验证 :对所有输入参数进行严格验证和过滤 边界检查 :加强缓冲区边界检查,防止溢出 路径处理 :规范化路径处理,防止目录遍历 权限控制 :加强文件访问权限控制 内存保护 :启用 ASLR、PIE 等内存保护机制 5.2 代码审计重点 CGI 程序安全 :重点审计所有 CGI 程序的输入处理逻辑 文件操作 :检查所有文件操作相关的安全风险 内存管理 :审查动态内存分配和拷贝操作 整数溢出 :检查数值计算中的整数溢出风险 6. 总结 本题目展示了 IoT 设备中典型的安全问题: 微小的漏洞组合形成强大攻击链的重要性 系统组件间相互信任带来的安全风险 防御机制缺失导致的严重安全后果 通过本次复现,安全研究人员可以深入理解: 真实环境中漏洞链的构造方法 IoT 设备特有的安全挑战 从信息收集到完整利用的完整渗透测试流程 该题目的难度适中,主要挑战在于对整体系统的把控能力和将孤立漏洞巧妙连接的技术思路。