seccomp-tools
2026/5/29工具工具seccomp沙箱大约 3 分钟
seccomp-tools
是什么
seccomp-tools 用来查看和分析 Linux seccomp 沙箱规则。
Pwn 题中如果程序限制系统调用,system("/bin/sh") 可能执行失败。此时要先看允许哪些 syscall,再决定利用目标。
常见场景:
- 只能
open/read/write - 禁止
execve - 只允许少数文件操作
- 需要 ORW 读取 flag
安装与配置
seccomp-tools 是 Ruby 工具:
sudo apt install ruby ruby-dev
sudo gem install seccomp-tools验证:
seccomp-tools --help如果遇到权限问题,可先确认 RubyGems 环境,或在 CTF 虚拟机中安装。
基本用法
查看程序 seccomp 规则
seccomp-tools dump ./vuln如果程序需要输入后才启用 seccomp,可能要用交互方式或脚本喂输入。
查看 syscall 名称和编号
seccomp-tools asm
seccomp-tools disasm filter.bpf反汇编 BPF
seccomp-tools disasm ./filter.bpf更多功能
输出为 JSON
seccomp-tools dump ./vuln --format json输出为 C 代码
seccomp-tools dump ./vuln --format c输出为 BPF 字节码
seccomp-tools dump ./vuln --format bpf从 core dump 分析
seccomp-tools dump -c core从内存中读取
seccomp-tools dump ./vuln --offset 0x12345使用脚本喂输入
echo "1" | seccomp-tools dump ./vuln自动检测输入点
seccomp-tools dump ./vuln --autoBPF 解析
BPF 指令结构
seccomp BPF 程序由以下指令组成:
LD: 加载数据
ST: 存储数据
ALU: 算术运算
JMP: 条件跳转
RET: 返回动作返回动作
SECCOMP_RET_KILL: 杀死进程
SECCOMP_RET_TRAP: 发送 SIGSYS
SECCOMP_RET_ERRNO: 返回错误码
SECCOMP_RET_TRACE: 跟踪
SECCOMP_RET_ALLOW: 允许调用规则示例
line CODE JT JF K
=================================
0000: 0x20 0x00 0x00 0x00000004 A = arch
0001: 0x15 0x00 0x05 0xc000003e if (A != ARCH_X86_64) goto 0007
0002: 0x20 0x00 0x00 0x00000000 A = sys_number
0003: 0x35 0x00 0x01 0x40000000 if (A < 0x40000000) goto 0005
0004: 0x15 0x00 0x03 0xffffffff if (A != 0xffffffff) goto 0008
0005: 0x15 0x02 0x00 0x0000003b if (A == execve) goto 0008
0006: 0x15 0x01 0x00 0x00000142 if (A == execveat) goto 0008
0007: 0x06 0x00 0x00 0x7fff0000 return ALLOW
0008: 0x06 0x00 0x00 0x00000000 return KILL这个规则禁止 execve 和 execveat,允许其他调用。
CTF常用技巧
先判断 execve 是否可用
execve 允许:
可以考虑 system("/bin/sh") 或 execve("/bin/sh")
execve 禁止:
通常改成 open/read/write 读取 flagORW 利用链
如果只允许文件读写,常见目标是:
open("/flag", 0)
read(fd, buf, size)
write(1, buf, size)ROP 或 shellcode 都可以组织 ORW,具体看 NX、可写段、gadget 是否充足。
注意 open 和 openat
新系统上 open 可能由 libc 转成 openat。如果沙箱只允许 open 或只允许 openat,要根据实际规则选择 syscall。
syscall 编号参考
x86_64 常见 syscall 编号:
0: read
1: write
2: open
3: close
9: mmap
10: mprotect
11: munmap
33: dup2
35: nanosleep
37: alarm
56: clone
57: fork
59: execve
60: exit
231: exit_group
257: openat
292: dup3分析流程
1. seccomp-tools dump 查看规则
2. 确认允许的 syscall
3. 确认禁止的 syscall
4. 设计利用链
5. 编写 ROP/shellcode
6. 测试利用使用 pwntools 构造 ORW
from pwn import *
# open("/flag", 0)
rop = ROP(elf)
rop.open(b"/flag", 0)
rop.read(3, bss_addr, 0x100)
rop.write(1, bss_addr, 0x100)shellcode ORW
from pwn import *
shellcode = shellcraft.open("/flag")
shellcode += shellcraft.read(3, 'rsp', 0x100)
shellcode += shellcraft.write(1, 'rsp', 0x100)常见问题
dump 不出来规则
可能程序运行到某个分支后才安装 seccomp,需要先满足菜单选项或输入条件。
本地能起 shell,远程没回显
检查远程是否启用了 seccomp。很多沙箱题本地附件和远程行为一致,但 shell 被禁后不会直接提示你。
只允许 read/write 怎么办
如果不能 open 文件,就要寻找程序已经打开的 fd、内存中已有 flag、或通过逻辑漏洞让程序替你打开。
规则太复杂看不懂
1. 只关注 RET KILL 和 RET ALLOW 的 syscall
2. 列出禁止的 syscall 列表
3. 列出允许的 syscall 列表
4. 根据列表设计利用安装失败
# 确保 Ruby 和开发工具已安装
sudo apt install ruby ruby-dev build-essential
# 使用 gem 安装
sudo gem install seccomp-tools
# 或使用 bundler
gem install bundler关联
- seccomp沙箱
- shellcode与syscall
- ROP基础
- SROP基础
- GDB+pwndbg
- checksec