sandbox问题分类
大体上两类
1.binary的sandbox
- 绕过system call过滤机制
- 自定义过滤器,seccomp过滤器,混合过滤器等
- 基本上结合pwn问题
2.program的sandbox
- 绕过对函数,变量,语法,字符等的过滤机制
- 不能使用符号,import之类语句等
- python/php很常见,其他的go/JavaScript/ruby之类
- 不能使用符号,import之类语句等
- 大部分是misc类,也有pwn和web
- PWN相关问题会有最新的CVE
- Web问题与web服务一起发布
sandbox问题
特征
- 即使控制了EIP/RIP,也不能调用execve()之类的危险system call
- system()内部也是execve(),无法调用
- 大多数system call都不能使用
- 这取决于过滤了哪些
实现
实现大体上有三种方式
- 进程自身过滤
- 限制system call的调用地点和流程
- 实现方式最简单,也很容易绕过
- 父进程过滤
- pipe
- ptrace
- process_vm_readv,process_vm_writev
- 使用clone内存共享等来过滤传输系统调用代码参数
- 实现比较复杂,CTF中比较多
- 内核过滤
- seccomp
- 很强大,几乎不可绕过,问题实例较少,结合1和2时有很多问题
问题构成
普通pwn问题构成
- 控制EIP/RIP后,执行system(“sh”)就可以
- 或者创建一个RWX区域执行shellcode
sandbox问题构成
- 单纯控制EIP/RIP,并不能结束工作
- 调用禁止的system call的话,进程会停止(pwn失败)
- 因为sandbox过滤了execve(),所以无法获得shell
构成模式
- 在前段进行pwn,控制EIP/RIP后绕过sandbox过滤的模式
- 前段没有pwn,直接执行任意代码的模式
攻略方法
了解system call过滤处理
- 自定义过滤器,seccomp过滤器,混合过滤器等
在system call过滤处理中找到漏洞
- CTF题目中一定存在漏洞
绕过sandbox经常需要复杂的流程
首先,需要某种方式的”任意代码执行”,这里指的是发送的任意汇编代码可以像shellcode一样执行。(因为不能打开shell
创建RWX区域执行任意代码
RWX区域可以通过mmap/mprotect来生成,如果二进制本身没有NX就太好了
绕过之后通常是open(flag) -> read() -> write(),因为不能使用execve
如果不能使用mmap/mprotect,那么ROP