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 漏洞机制

  1. Synology新增全局调试信息表worker_debug_table,用于记录线程状态
  2. process_new_connection函数末尾,请求URI通过snprintf拼接到thread_name缓冲区
  3. 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 指针链构建

  1. 在栈偏移3664处找到指向栈的反向指针p1
  2. 使p1指向另一个栈指针p2(位于栈内偏移0x10处)
  3. 通过p1更新p2,建立指针链

5.3 任意写入实现

5.3.1 指针链操作

p1 → p2 → p3 → 目标地址

5.3.2 8位任意写入代码逻辑

def arbitrary_write_8bit(address, value):
    # 通过指针链逐步更新目标地址的字节
    # 使用%hhn进行单字节写入
    pass

5.4 任意读取实现

结合任意写入和信息泄露技术:

  1. 将http_version字符串指针更新为任意地址
  2. 发送请求,返回指定地址的内容

6. 远程SHELL获取

6.1 利用glibc 2.30的hook机制

  • 覆盖__free_hooksystem函数地址
  • 通过触发free调用执行system命令

6.2 地址泄露与计算

  1. 通过信息泄露获取PIE基址
  2. 计算.got段地址(包含glibc函数指针)
  3. 推导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 阶段一:信息收集

  1. 泄露PIE基址通过格式化字符串漏洞
  2. 计算.got段和glibc基址

7.2 阶段二:内存操作

  1. 构建稳定的指针链
  2. 覆盖__free_hook为system地址

7.3 阶段三:命令执行

  1. 发送特制Cookie触发telnetd服务启动
  2. 通过telnet连接获取shell

8. 漏洞修复

Synology在Pwn2Own Ireland 2024前发布了固件更新,修复了此格式化字符串漏洞。

9. 参考资料

  1. 原始技术报告:https://blog.infosectcbr.com.au/2025/08/01/exploiting-the-synology-tc500-at-pwn2own-ireland-2024/
  2. 替代利用技术:https://www.synacktiv.com/sites/default/files/2025-01/blind_fmtstr.pdf

10. 总结

本漏洞利用展示了格式化字符串漏洞在现实设备中的危害性,通过精巧的内存操作和glibc特性结合,实现了从信息泄露到远程代码执行的完整攻击链。此案例为IoT设备安全研究提供了重要参考价值。

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 的参数使用 漏洞代码逻辑: 4.3 漏洞验证 通过发送包含格式化字符串的URI进行测试: 可观察到格式化字符串被解析执行。 5. 漏洞利用技术 5.1 信息泄露技术 5.1.1 泄露原理 栈中第7个参数是指向HTTP版本字符串的指针 利用格式化字符串漏洞覆盖该指针实现信息泄露 5.1.2 泄露格式 %*[some_stack_entry_index]$c :从栈中写入指定数量的字符 %7$n :将已写入字节数写入第7个栈参数 5.1.3 技术限制 写入量不能超过~0x60000000字节 指针需位于0x50000000-0x60000000地址区间 5.2 堆栈写入技术 5.2.1 基本写入格式 支持不同位宽的写入操作: %n :32位写入 %hn :16位写入 %hhn :8位写入 5.2.2 指针链构建 在栈偏移3664处找到指向栈的反向指针p1 使p1指向另一个栈指针p2(位于栈内偏移0x10处) 通过p1更新p2,建立指针链 5.3 任意写入实现 5.3.1 指针链操作 5.3.2 8位任意写入代码逻辑 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): 攻击载荷: 代码分析: 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设备安全研究提供了重要参考价值。