オレオレCTFツール akitools

CTF Advent Calendar 2015 - Adventar 16日目

CTFをやると副産物として一枚岩のスクリプトができたりします。いくつか便利ツールを公開しているので、ここで紹介します。 個人的には地味に便利と思っているのですが、万人受けするようなものではなさそうです。オレ得ツールですね。

github.com

exploit.py, exploit.pl

pwn問題を解くとき、まずはじめにテンプレートとして手元にコピーしてきます。 pwntoolsとか便利なライブラリがあったりしますが、どの環境でも動かせるといろいろとよいことがあるので、recvuntilやinteractのような関数を実装したものを用意しています。

d

socatのラッパーです。デフォルトでstraceで起動します。

d ./vuln-binary

gadgets

rp++のラッパーです。rp++単体だと目grepで主要gadgetを探したりして面倒だったりします。

% gadgets ./braincpy
... (snip)
int_80 = 0x805b5c0
leaveret = 0x80481d1
pop_eax = 0x80beb89
pop_eax_ebx_esi_edi = 0x809a67a
pop_ebp = 0x80483a8
pop_ebp_ebx_esi_edi = 0x80728dd
pop_ebp_esi_edi = 0x809aa75
pop_ebx = 0x80516cb
pop_ebx_ebp = 0x80483a7
pop_ebx_ebp_esi_edi = 0x809aa74
pop_ebx_edx = 0x805adeb
pop_ebx_esi_ebp = 0x804a56a
pop_ebx_esi_edi = 0x80515a7
pop_ebx_esi_edi_ebp = 0x80489db
pop_ecx = 0x80dbc2c
pop_ecx_ebx = 0x805ae16
pop_edi = 0x80515a9
pop_edi_ebp = 0x80489dd
pop_edi_ebx = 0x8076412
pop_edi_esi = 0x8073018
pop_edi_esi_ebx = 0x8055f9b
pop_edx = 0x805adec
pop_edx_ecx_ebx = 0x805ae15
pop_esi = 0x8073019
pop_esi_ebp = 0x804a561
pop_esi_ebx = 0x8051980
pop_esi_ebx_edx = 0x805adea
pop_esi_edi = 0x80515a8
pop_esi_edi_ebp = 0x80489dc
pop_esp = 0x80beb39
pop_esp_ebx_esi_edi_ebp = 0x804cf3c
...

libc-offsets

libcのバイナリから指定された関数のアドレスのオフセットを取得します。"/bin/sh"のような文字列も取得することができます。

% libc-offsets /lib/x86_64-linux-gnu/libc-2.19.so
offset = {
    '__libc_start_main': 0x21dd0,
    'system': 0x46640,
    '/bin/sh': 0x17ccdb, # str
}

mysqlc

mysqlコマンドのラッパーです。ユーザやテーブルのセットアップが簡単にできます。問題と同じ環境を手元に作るときによく使います。

tobin, tohex

渡されたバイト列を変換します。

% cat ~/tool/sc/x86/binsh | tohex
\x31\xc9\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc0\xb0\x0b\xcd\x80

rotn

rot1-rot26まで出力します。過去のCTFで1度だけ役立ちましたが、もうROT13ネタの問題なんてやることはないはず。

disas-seccomp-filter

libseccompにscmp_bpf_disasmというコマンドが付属していますが、そのコマンドの出力のsyscall番号にコメントを付けてくれます。CTFの過去問にはseccomp-bpfが利用されている問題は数えるほどしかないのですが、まあ便利です。

% disas-seccomp-filter ./bpf
 line  OP   JT   JF   K
=================================
 0000: 0x20 0x00 0x00 0x00000004   ld  seccomp_data.arch
 0001: 0x15 0x00 0x02 0xc000003e   jeq x86_64 true:0002 false:0004
 0002: 0x20 0x00 0x00 0x00000000   ld  seccomp_data.nr
 0003: 0x35 0x00 0x00 0x40000000   jge 1073741824 true:0004 false:0004
 0004: 0x06 0x00 0x00 0x00000000   ret KILL
 0005: 0x15 0x07 0x00 0x00000038   jeq SYS_clone   true:0013 false:0006
 0006: 0x15 0x06 0x00 0x00000039   jeq SYS_fork   true:0013 false:0007
 0007: 0x15 0x05 0x00 0x0000003a   jeq SYS_vfork   true:0013 false:0008
 0008: 0x15 0x04 0x00 0x0000003e   jeq SYS_kill   true:0013 false:0009
 0009: 0x15 0x03 0x00 0x0000009d   jeq SYS_prctl  true:0013 false:0010
 0010: 0x15 0x02 0x00 0x000000c8   jeq SYS_tkill  true:0013 false:0011
 0011: 0x15 0x01 0x00 0x000000ea   jeq SYS_tgkill  true:0013 false:0012
 0012: 0x06 0x00 0x00 0x7fff0000   ret ALLOW
 0013: 0x06 0x00 0x00 0x00000000   ret KILL

dirdiff.pl

ディレクトリ同士を比較します。

例題: CSAW 2014 for300 (https://github.com/ctfs/write-ups-2014/tree/master/csaw-ctf-2014/fluffy-no-more)

wordpressのファイルが大量に渡されるのでディレクトリ同士を比較することで改竄されたスクリプトが見つかります。

% perl dirdiff.pl 'var/www/html/**/*' 'wordpress-4.0/**/*'

disastobin

objdump -dの出力結果を食わせるとバイナリを出力します。

hopper-scripts/

12/18の記事で解説します。

まとめ

普段CTFをする上でよく使う自作ツールを紹介しました。(大半が書き捨てのようなスクリプトですが) 明日は「オレオレgdb拡張スクリプト pedal」です。お楽しみに。