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时,存在以下问题:

  1. 使用不安全的字符串拷贝操作(如strcpy或类似函数)
  2. 没有对key的长度进行充分验证
  3. 目标缓冲区位于栈上,且大小固定

2.2 溢出限制

虽然存在栈溢出,但直接覆盖返回地址存在困难,原因可能包括:

  • 栈布局限制
  • 溢出长度受限
  • 栈保护机制

2.3 利用方法

通过劫持结构体控制执行流:

  1. 精心构造JSON数据,利用key的溢出覆盖关键结构体
  2. 控制结构体中的函数指针或其他关键数据
  3. 实现执行流劫持

3. 未授权访问

漏洞利用不需要任何认证,可以直接通过网络发送恶意请求。

漏洞利用步骤

1. 构造恶意JSON

创建特制的JSON数据,其中包含超长的key:

{
    "AAAAAAAAAAAAAAAAAAAAAAAA...": "value",
    ...
}

2. 触发溢出

将恶意JSON发送到目标设备的特定接口(具体接口需要根据实际环境确定)。

3. 劫持结构体

通过溢出覆盖关键结构体,通常需要:

  1. 确定目标结构体在内存中的位置
  2. 计算精确的溢出长度
  3. 覆盖结构体中的函数指针或虚表

4. 控制执行流

一旦成功劫持结构体,可以通过以下方式之一实现RCE:

  1. 覆盖函数指针,指向shellcode或ROP链
  2. 修改虚表指针,控制虚函数调用
  3. 利用现有函数指针实现任意代码执行

利用代码示例

以下是概念验证代码框架(需根据实际环境调整):

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")

缓解措施

  1. 更新到最新固件版本
  2. 实施网络访问控制,限制摄像头访问
  3. 使用Web应用防火墙(WAF)过滤异常JSON请求
  4. 禁用不必要的网络服务

总结

该漏洞展示了IoT设备中常见的安全问题:

  1. 使用存在漏洞的第三方库
  2. 缺乏输入验证
  3. 未授权访问风险
  4. 内存安全问题导致的RCE

通过精心构造的JSON数据,攻击者可以绕过常规的栈溢出防护机制,利用结构体劫持实现远程代码执行。

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: 2. 触发溢出 将恶意JSON发送到目标设备的特定接口(具体接口需要根据实际环境确定)。 3. 劫持结构体 通过溢出覆盖关键结构体,通常需要: 确定目标结构体在内存中的位置 计算精确的溢出长度 覆盖结构体中的函数指针或虚表 4. 控制执行流 一旦成功劫持结构体,可以通过以下方式之一实现RCE: 覆盖函数指针,指向shellcode或ROP链 修改虚表指针,控制虚函数调用 利用现有函数指针实现任意代码执行 利用代码示例 以下是概念验证代码框架(需根据实际环境调整): 缓解措施 更新到最新固件版本 实施网络访问控制,限制摄像头访问 使用Web应用防火墙(WAF)过滤异常JSON请求 禁用不必要的网络服务 总结 该漏洞展示了IoT设备中常见的安全问题: 使用存在漏洞的第三方库 缺乏输入验证 未授权访问风险 内存安全问题导致的RCE 通过精心构造的JSON数据,攻击者可以绕过常规的栈溢出防护机制,利用结构体劫持实现远程代码执行。