2024 RWCTF群晖 BC500摄像头RCE--未授权+栈溢出
字数 1086 2025-08-20 18:18:39
2024 RWCTF群晖BC500摄像头RCE漏洞分析与利用
漏洞概述
本漏洞是在Real World CTF比赛中发现的群晖BC500摄像头远程代码执行漏洞,涉及未授权访问和栈溢出问题。漏洞存在于libjansson.so.4.7.0库的parse_object函数中,在JSON解析key时造成了栈溢出。
漏洞环境
- 受影响设备:群晖BC500摄像头
- 漏洞组件:
libjansson.so.4.7.0(版本4.7.0) - 漏洞类型:栈溢出 + 未授权访问
- 利用条件:网络可达目标设备
漏洞分析
1. 漏洞位置
漏洞位于libjansson.so.4.7.0库的parse_object函数中,具体是在解析JSON对象的key时发生的栈溢出。
2. 技术细节
2.1 栈溢出分析
在parse_object函数中,当处理JSON对象的key时,存在以下问题:
- 使用不安全的字符串拷贝操作(如
strcpy或类似函数) - 没有对key的长度进行充分验证
- 目标缓冲区位于栈上,且大小固定
2.2 溢出限制
虽然存在栈溢出,但直接覆盖返回地址存在困难,原因可能包括:
- 栈布局限制
- 溢出长度受限
- 栈保护机制
2.3 利用方法
通过劫持结构体控制执行流:
- 精心构造JSON数据,利用key的溢出覆盖关键结构体
- 控制结构体中的函数指针或其他关键数据
- 实现执行流劫持
3. 未授权访问
漏洞利用不需要任何认证,可以直接通过网络发送恶意请求。
漏洞利用步骤
1. 构造恶意JSON
创建特制的JSON数据,其中包含超长的key:
{
"AAAAAAAAAAAAAAAAAAAAAAAA...": "value",
...
}
2. 触发溢出
将恶意JSON发送到目标设备的特定接口(具体接口需要根据实际环境确定)。
3. 劫持结构体
通过溢出覆盖关键结构体,通常需要:
- 确定目标结构体在内存中的位置
- 计算精确的溢出长度
- 覆盖结构体中的函数指针或虚表
4. 控制执行流
一旦成功劫持结构体,可以通过以下方式之一实现RCE:
- 覆盖函数指针,指向shellcode或ROP链
- 修改虚表指针,控制虚函数调用
- 利用现有函数指针实现任意代码执行
利用代码示例
以下是概念验证代码框架(需根据实际环境调整):
import requests
import json
target_url = "http://target_ip:port/vulnerable_endpoint"
# 构造恶意JSON
evil_key = "A" * calculated_offset + struct.pack("<I", target_address)
evil_json = {evil_key: "trigger"}
# 发送请求
headers = {"Content-Type": "application/json"}
response = requests.post(target_url, data=json.dumps(evil_json), headers=headers)
# 检查利用是否成功
if response.status_code == expected_code:
print("Exploit likely succeeded")
缓解措施
- 更新到最新固件版本
- 实施网络访问控制,限制摄像头访问
- 使用Web应用防火墙(WAF)过滤异常JSON请求
- 禁用不必要的网络服务
总结
该漏洞展示了IoT设备中常见的安全问题:
- 使用存在漏洞的第三方库
- 缺乏输入验证
- 未授权访问风险
- 内存安全问题导致的RCE
通过精心构造的JSON数据,攻击者可以绕过常规的栈溢出防护机制,利用结构体劫持实现远程代码执行。