Exploiting the Synology TC500 at Pwn2Own Ireland 2024
字数 2042 2025-11-07 08:41:54
Synology TC500 智能摄像头格式化字符串漏洞分析与利用教学
1. 漏洞概述
本教学文档详细分析Synology TC500智能摄像头中发现的格式化字符串漏洞,该漏洞存在于webd服务的线程名称设置功能中,可导致远程代码执行。
2. 环境准备
2.1 固件获取与解压
- 固件下载地址:https://archive.synology.com/download/Firmware/Camera/TC500
- 解压参考:https://blog.compass-security.com/2024/03/pwn2own-toronto-2023-part-1-how-it-all-started/
2.2 模拟环境搭建
- 使用user-mode模拟或Docker环境搭建
- 参考第六届Real World CTF的类似设置
3. 目标分析
3.1 攻击面识别
设备在局域网侧运行两个主要服务:
- webd:用于登录和管理摄像头的web服务
- streamd:RTSP管理进程
3.2 webd服务特性
- 32位ARM架构
- 基于开源web服务器civetweb的定制版本
- 安全防护机制:PIE、RELRO、ASLR和Canary
- 使用glibc v2.30
4. 漏洞分析
4.1 漏洞位置
漏洞存在于process_new_connection函数中,该函数是工作线程处理HTTP请求的入口点。
4.2 漏洞机制
- Synology新增全局调试信息表
worker_debug_table,用于记录线程状态 - 在
process_new_connection函数末尾,请求URI通过snprintf拼接到thread_name缓冲区 - 在
set_thread_name函数中,thread_name直接作为mg_snprintf的参数使用
漏洞代码逻辑:
// 存在漏洞的代码片段
snprintf(thread_name, sizeof(thread_name), "Worker: %s", req_uri);
set_thread_name(thread_name); // 内部直接使用mg_snprintf(thread_name)
4.3 漏洞验证
通过发送包含格式化字符串的URI进行测试:
http://target/%p%p%p%p
可观察到格式化字符串被解析执行。
5. 漏洞利用技术
5.1 信息泄露技术
5.1.1 泄露原理
- 栈中第7个参数是指向HTTP版本字符串的指针
- 利用格式化字符串漏洞覆盖该指针实现信息泄露
5.1.2 泄露格式
%*[some_stack_entry_index]$c%7$n
%*[some_stack_entry_index]$c:从栈中写入指定数量的字符%7$n:将已写入字节数写入第7个栈参数
5.1.3 技术限制
- 写入量不能超过~0x60000000字节
- 指针需位于0x50000000-0x60000000地址区间
5.2 堆栈写入技术
5.2.1 基本写入格式
%[value]c%[stack_index]$n
支持不同位宽的写入操作:
%n:32位写入%hn:16位写入%hhn:8位写入
5.2.2 指针链构建
- 在栈偏移3664处找到指向栈的反向指针p1
- 使p1指向另一个栈指针p2(位于栈内偏移0x10处)
- 通过p1更新p2,建立指针链
5.3 任意写入实现
5.3.1 指针链操作
p1 → p2 → p3 → 目标地址
5.3.2 8位任意写入代码逻辑
def arbitrary_write_8bit(address, value):
# 通过指针链逐步更新目标地址的字节
# 使用%hhn进行单字节写入
pass
5.4 任意读取实现
结合任意写入和信息泄露技术:
- 将http_version字符串指针更新为任意地址
- 发送请求,返回指定地址的内容
6. 远程SHELL获取
6.1 利用glibc 2.30的hook机制
- 覆盖
__free_hook为system函数地址 - 通过触发free调用执行system命令
6.2 地址泄露与计算
- 通过信息泄露获取PIE基址
- 计算.got段地址(包含glibc函数指针)
- 推导glibc基址和
__free_hook地址
6.3 触发机制
利用Cookie HTTP头部强制webd对可控字符串调用free(实际变为system):
攻击载荷:
Cookie: ;telnetd
代码分析:
// GetSessionIdFromCookie函数(地址0x34a54)
std::vector<std::string> split_cookie = split(cookie, ';'); // [1]
cookie.erase(0, cookie.find(';') + 1); // [2]
// 后续会释放处理后的字符串,触发system("telnetd")
7. 完整利用流程
7.1 阶段一:信息收集
- 泄露PIE基址通过格式化字符串漏洞
- 计算.got段和glibc基址
7.2 阶段二:内存操作
- 构建稳定的指针链
- 覆盖
__free_hook为system地址
7.3 阶段三:命令执行
- 发送特制Cookie触发telnetd服务启动
- 通过telnet连接获取shell
8. 漏洞修复
Synology在Pwn2Own Ireland 2024前发布了固件更新,修复了此格式化字符串漏洞。
9. 参考资料
- 原始技术报告:https://blog.infosectcbr.com.au/2025/08/01/exploiting-the-synology-tc500-at-pwn2own-ireland-2024/
- 替代利用技术:https://www.synacktiv.com/sites/default/files/2025-01/blind_fmtstr.pdf
10. 总结
本漏洞利用展示了格式化字符串漏洞在现实设备中的危害性,通过精巧的内存操作和glibc特性结合,实现了从信息泄露到远程代码执行的完整攻击链。此案例为IoT设备安全研究提供了重要参考价值。