Seccomp Tools - Furnish Powerful Tools For Seccomp Analysis
Provide powerful tools for seccomp analysis.
This projection is targeted to (but non express to) analyze seccomp sandbox inwards CTF pwn challenges. Some features mightiness hold upwardly CTF-specific, exactly nonetheless useful for analyzing seccomp inwards real-case.
Features
- Dump - Automatically dumps seccomp-bpf from execution file(s).
- Disasm - Converts bpf to human readable format.
- Simple decompile.
- Display syscall names in addition to arguments when possible.
- Colorful!
- Asm - Write seccomp rules is therefore easy!
- Emu - Emulates seccomp rules.
- Supports multi-architectures.
Installation
Available on RubyGems.org!
$ jewel install seccomp-tools
If you lot failed when compiling, try:sudo apt install gcc ruby-dev
in addition to install seccomp-tools again.Command Line Interface
seccomp-tools
$ seccomp-tools --help # Usage: seccomp-tools [--version] [--help] [] # # List of commands: # # asm Seccomp bpf assembler. # disasm Disassemble seccomp bpf. # dump Automatically dump seccomp bpf from execution file(s). # emu Emulate seccomp rules. # # See 'seccomp-tools --help' to read nigh a specific subcommand. $ seccomp-tools dump --help # dump - Automatically dump seccomp bpf from execution file(s). # # Usage: seccomp-tools dump [exec] [options] # -c, --sh-exec Executes the given ascendance (via sh). # Use this selection if desire to overstep arguments or produce pipage things to the execution file. # e.g. purpose `-c "./bin > /dev/null"` to dump seccomp without existence mixed amongst stdout. # -f, --format FORMAT Output format. FORMAT tin solely hold upwardly 1 of . # Default: disasm # -l, --limit LIMIT Limit the number of calling "prctl(PR_SET_SECCOMP)". # The target procedure volition hold upwardly killed whenever its calling times reaches LIMIT. # Default: 1 # -o, --output FILE Output outcome into FILE instead of stdout. # If multiple seccomp syscalls convey been invoked (see --limit), # results volition hold upwardly written to FILE, FILE_1, FILE_2.. etc. # For example, "--output out.bpf" in addition to the output files are out.bpf, out_1.bpf, ...
dump
Dumps the seccomp bpf from an execution file. This operate is done past times the
ptrace
syscall.NOTICE: beware of the execution file volition hold upwardly executed.
$ file spec/binary/twctf-2016-diary # spec/binary/twctf-2016-diary: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.24, BuildID[sha1]=3648e29153ac0259a0b7c3e25537a5334f50107f, non stripped $ seccomp-tools dump spec/binary/twctf-2016-diary # line of piece of occupation CODE JT JF K # ================================= # 0000: 0x20 0x00 0x00 0x00000000 Influenza A virus subtype H5N1 = sys_number # 0001: 0x15 0x00 0x01 0x00000002 if (A != open) goto 0003 # 0002: 0x06 0x00 0x00 0x00000000 furnish KILL # 0003: 0x15 0x00 0x01 0x00000101 if (A != openat) goto 0005 # 0004: 0x06 0x00 0x00 0x00000000 furnish KILL # 0005: 0x15 0x00 0x01 0x0000003b if (A != execve) goto 0007 # 0006: 0x06 0x00 0x00 0x00000000 furnish KILL # 0007: 0x15 0x00 0x01 0x00000038 if (A != clone) goto 0009 # 0008: 0x06 0x00 0x00 0x00000000 furnish KILL # 0009: 0x15 0x00 0x01 0x00000039 if (A != fork) goto 001 1 # 0010: 0x06 0x00 0x00 0x00000000 furnish KILL # 0011: 0x15 0x00 0x01 0x0000003a if (A != vfork) goto 0013 # 0012: 0x06 0x00 0x00 0x00000000 furnish KILL # 0013: 0x15 0x00 0x01 0x00000055 if (A != creat) goto 0015 # 0014: 0x06 0x00 0x00 0x00000000 furnish KILL # 0015: 0x15 0x00 0x01 0x00000142 if (A != execveat) goto 0017 # 0016: 0x06 0x00 0x00 0x00000000 furnish KILL # 0017: 0x06 0x00 0x00 0x7fff0000 furnish ALLOW $ seccomp-tools dump spec/binary/twctf-2016-diary -f inspect # "\x20\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x01\x02\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x01\x01\x01\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x01\x3B\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x01\x38\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x01\x39\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x01\x3A\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x01\x55\x00\x00\x00\x06\x00 \x00\x00\x00\x00\x00\x00\x15\x00\x00\x01\x42\x01\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\xFF\x7F" $ seccomp-tools dump spec/binary/twctf-2016-diary -f raw | xxd # 00000000: 2000 0000 0000 0000 1500 0001 0200 0000 ............... # 00000010: 0600 0000 0000 0000 1500 0001 0101 0000 ................ # 00000020: 0600 0000 0000 0000 1500 0001 3b00 0000 ............;... # 00000030: 0600 0000 0000 0000 1500 0001 3800 0000 ............8... # 00000040: 0600 0000 0000 0000 1500 0001 3900 0000 ............9... # 00000050: 0600 0000 0000 0000 1500 0001 3a00 0000 ............:... # 00000060: 0600 0000 0000 0000 1500 0001 5500 0000 ............U... # 00000070: 0600 0000 0000 0000 1500 0001 4201 0000 ............B... # 00000080: 0600 0000 0000 0000 0600 0000 0000 ff7f ................
disasm
Disassembles the seccomp from raw bpf.
$ xxd spec/data/twctf-2016-diary.bpf | caput -n three # 00000000: 2000 0000 0000 0000 1500 0001 0200 0000 ............... # 00000010: 0600 0000 0000 0000 1500 0001 0101 0000 ................ # 00000020: 0600 0000 0000 0000 1500 0001 3b00 0000 ............;... $ seccomp-tools disasm spec/data/twctf-2016-diary.bpf # line of piece of occupation CODE JT JF K # ================================= # 0000: 0x20 0x00 0x00 0x00000000 Influenza A virus subtype H5N1 = sys_number # 0001: 0x15 0x00 0x01 0x00000002 if (A != open) goto 0003 # 0002: 0x06 0x00 0x00 0x00000000 furnish KILL # 0003: 0x15 0x00 0x01 0x00000101 if (A != openat) goto 0005 # 0004: 0x06 0x00 0x00 0x00000000 furnish KILL # 0005: 0x15 0x00 0x01 0x0000003b if (A != execve) goto 0007 # 0006: 0x06 0x00 0x00 0x00000000 furnish KILL # 0007: 0x15 0x00 0x01 0x00000038 if (A != clone) goto 0009 # 0008: 0x06 0x00 0x00 0x00000000 furnish KILL # 0009: 0x15 0x00 0x01 0x00000039 if (A != fork) goto 0011 # 0010: 0x06 0x00 0x00 0x00000000 furnish KILL # 0011: 0x15 0x00 0x01 0x0000003a if (A != vfork) goto 0013 # 0012: 0x06 0x00 0x00 0x00000000 furnish KILL # 0013: 0x15 0x00 0x01 0x00000055 if (A != creat) goto 0015 # 0014: 0x06 0x00 0x00 0x00000000 furnish KILL # 0015: 0x15 0x00 0x01 0x00000142 if (A != execveat) goto 0017 # 0016: 0x06 0x00 0x00 0x00000000 furnish KILL # 0017: 0x06 0x00 0x00 0x7fff0000 furnish ALLOW
asm
Assembles the seccomp rules into raw bytes. It's really useful when 1 wants to write custom seccomp rules.
Supports labels for jumping in addition to uses syscall names directly. See examples below.
$ seccomp-tools asm # asm - Seccomp bpf assembler. # # Usage: seccomp-tools asm IN_FILE [options] # -o, --output FILE Output outcome into FILE instead of stdout. # -f, --format FORMAT Output format. FORMAT tin solely hold upwardly 1 of . # Default: inspect # -a, --arch ARCH Specify architecture. # Supported architectures are . # Input file for asm $ truthful cat spec/data/libseccomp.asm # # depository fiscal establishment tally if arch is X86_64 # Influenza A virus subtype H5N1 = arch # Influenza A virus subtype H5N1 == ARCH_X86_64 ? side past times side : dead # Influenza A virus subtype H5N1 = sys_number # Influenza A virus subtype H5N1 >= 0x40000000 ? dead : side past times side # Influenza A virus subtype H5N1 == write ? ok : side past times side # Influenza A virus subtype H5N1 == unopen ? ok : side past times side # Influenza A virus subtype H5N1 == dup ? ok : side past times side # Influenza A virus subtype H5N1 == travel out ? ok : side past times side # furnish ERRNO(5) # ok: # furnish ALLOW # dead: # furnish KILL $ seccomp-tools asm spec/data/libseccomp.asm # " \x00\x00\x00\x04\x00\x00\x00\x15\x00\x00\b>\x00\x00\xC0 \x00\x00\x00\x00\x00\x00\x005\x00\x06\x00\x00\x00\x00@\x15\x00\x04\x00\x01\x00\x00\x00\x15\x00\x03\x00\x03\x00\x00\x00\x15\x00\x02\x00 \x00\x00\x00\x15\x00\x01\x00<\x00\x00\x00\x06\x00\x00\x00\x05\x00\x05\x00\x06\x00\x00\x00\x00\x00\xFF\x7F\x06\x00\x00\x00\x00\x00\x00\x00" $ seccomp-tools asm spec/data/libseccomp.asm -f c_source # #include # #include # #include # #include # # static void install_seccomp() { # static unsigned char filter[] = {32,0,0,0,4,0,0,0,21,0,0,8,62,0,0,192,32,0,0,0,0,0,0,0,53,0,6,0,0,0,0,64,21,0,4,0,1,0,0,0,21,0,3,0,3,0,0,0,21,0,2,0,32,0,0,0,21,0,1,0,60,0,0,0,6,0,0,0,5,0,5,0,6,0,0,0,0,0,255,127,6,0,0,0,0,0,0,0}; # struct prog { # unsigned curt len; # unsig ned char *filter; # } dominion = { # .len = sizeof(filter) >> 3, # .filter = filter # }; # if(prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) { perror("prctl(PR_SET_NO_NEW_PRIVS)"); exit(2); } # if(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &rule) < 0) { perror("prctl(PR_SET_SECCOMP)"); exit(2); } # } $ seccomp-tools asm spec/data/libseccomp.asm -f assembly # install_seccomp: # force rbp # mov rbp, rsp # force 38 # popular rdi # force 0x1 # popular rsi # xor eax, eax # mov al, 0x9d # syscall # force 22 # popular rdi # lea rdx, [rip + _filter] # force rdx /* .filter */ # force _filter_end - _filter >> three /* .len */ # mov rdx, rsp # force 0x2 # popular rsi # xor eax, eax # mov al, 0x9d # syscall # leave of absence # ret # _filter: # .ascii "\040\000\000\000\004\000\ 000\000\025\000\000\010\076\000\000\300\040\000\000\000\000\000\000\000\065\000\006\000\000\000\000\100\025\000\004\000\001\000\000\000\025\000\003\000\003\000\000\000\025\000\002\000\040\000\000\000\025\000\001\000\074\000\000\000\006\000\000\000\005\000\005\000\006\000\000\000\000\000\377\177\006\000\000\000\000\000\000\000" # _filter_end: # let's asm therefore disasm! $ seccomp-tools asm spec/data/libseccomp.asm -f raw | seccomp-tools disasm - # line of piece of occupation CODE JT JF K # ================================= # 0000: 0x20 0x00 0x00 0x00000004 Influenza A virus subtype H5N1 = arch # 0001: 0x15 0x00 0x08 0xc000003e if (A != ARCH_X86_64) goto 0010 # 0002: 0x20 0x00 0x00 0x00000000 Influenza A virus subtype H5N1 = sys_number # 0003: 0x35 0x06 0x00 0x40000000 if (A >= 0x40000000) goto 0010 # 0004: 0x15 0x04 0x00 0x00000001 if (A == write) goto 0009 # 0005: 0x15 0x03 0x00 0x00000003 if (A == close) goto 0009 # 0006: 0x15 0x02 0x00 0x00000020 if (A == dup) goto 0009 # 00 07: 0x15 0x01 0x00 0x0000003c if (A == exit) goto 0009 # 0008: 0x06 0x00 0x00 0x00050005 furnish ERRNO(5) # 0009: 0x06 0x00 0x00 0x7fff0000 furnish ALLOW # 0010: 0x06 0x00 0x00 0x00000000 furnish KILL
Emu
Emulates seccomp given
sys_nr
, arg0
, arg1
, etc.$ seccomp-tools emu --help # emu - Emulate seccomp rules. # # Usage: seccomp-tools emu [options] BPF_FILE [sys_nr [arg0 [arg1 ... arg5]]] # -a, --arch ARCH Specify architecture. # Supported architectures are . # -q, --[no-]quiet Run quietly, solely exhibit emulation result. $ seccomp-tools emu spec/data/libseccomp.bpf write 0x3 # line of piece of occupation CODE JT JF K # ================================= # 0000: 0x20 0x00 0x00 0x00000004 Influenza A virus subtype H5N1 = arch # 0001: 0x15 0x00 0x08 0xc000003e if (A != ARCH_X86_64) goto 0010 # 0002: 0x20 0x00 0x00 0x00000000 Influenza A virus subtype H5N1 = sys_number # 0003: 0x35 0x06 0x00 0x40000000 if (A >= 0x40000000) goto 0010 # 0004: 0x15 0x04 0x00 0x00000001 if (A == write) goto 0009 # 0005: 0x15 0x03 0x00 0x00000003 if (A == close) goto 0009 # 0006: 0x15 0x02 0x00 0x00000020 if (A == dup) goto 0009 # 0 007: 0x15 0x01 0x00 0x0000003c if (A == exit) goto 0009 # 0008: 0x06 0x00 0x00 0x00050005 furnish ERRNO(5) # 0009: 0x06 0x00 0x00 0x7fff0000 furnish ALLOW # 0010: 0x06 0x00 0x00 0x00000000 furnish KILL # # furnish ALLOW at line of piece of occupation 0009
Screenshots
Dump
Emu
Development
I recommend to purpose rbenv for your Ruby environment.
Setup
- Install bundler
$ jewel install bundler
- Clone the source
$ git clone https://github.com/david942j/seccomp-tools && cd seccomp-tools
- Install dependencies
$ package install
Run tests
$ package exec rake
I Need You
Any proposition or characteristic asking is welcome! Feel costless to file an number or post a draw request. And, if you lot similar this work, I'll hold upwardly happy to hold upwardly starred