sandbox问题分类

大体上两类

1.binary的sandbox

  • 绕过system call过滤机制
    • 自定义过滤器,seccomp过滤器,混合过滤器等
  • 基本上结合pwn问题

2.program的sandbox

  • 绕过对函数,变量,语法,字符等的过滤机制
    • 不能使用符号,import之类语句等
      • python/php很常见,其他的go/JavaScript/ruby之类
  • 大部分是misc类,也有pwn和web
    • PWN相关问题会有最新的CVE
    • Web问题与web服务一起发布

sandbox问题

特征

  • 即使控制了EIP/RIP,也不能调用execve()之类的危险system call
    • system()内部也是execve(),无法调用
  • 大多数system call都不能使用
    • 这取决于过滤了哪些

实现

实现大体上有三种方式

  1. 进程自身过滤
    • 限制system call的调用地点和流程
    • 实现方式最简单,也很容易绕过
  2. 父进程过滤
    • pipe
    • ptrace
    • process_vm_readv,process_vm_writev
    • 使用clone内存共享等来过滤传输系统调用代码参数
    • 实现比较复杂,CTF中比较多
  3. 内核过滤
    • seccomp
    • 很强大,几乎不可绕过,问题实例较少,结合1和2时有很多问题

问题构成

普通pwn问题构成

  • 控制EIP/RIP后,执行system(“sh”)就可以
  • 或者创建一个RWX区域执行shellcode

sandbox问题构成

  • 单纯控制EIP/RIP,并不能结束工作
  • 调用禁止的system call的话,进程会停止(pwn失败)
  • 因为sandbox过滤了execve(),所以无法获得shell

构成模式

  1. 在前段进行pwn,控制EIP/RIP后绕过sandbox过滤的模式
  2. 前段没有pwn,直接执行任意代码的模式

攻略方法

  • 了解system call过滤处理
    • 自定义过滤器,seccomp过滤器,混合过滤器等
  • 在system call过滤处理中找到漏洞

    • CTF题目中一定存在漏洞
  • 绕过sandbox经常需要复杂的流程

  • 首先,需要某种方式的”任意代码执行”,这里指的是发送的任意汇编代码可以像shellcode一样执行。(因为不能打开shell
  • 创建RWX区域执行任意代码
  • RWX区域可以通过mmap/mprotect来生成,如果二进制本身没有NX就太好了
  • 绕过之后通常是open(flag) -> read() -> write(),因为不能使用execve
  • 如果不能使用mmap/mprotect,那么ROP