ペネトレーションテスト&バグバウンティ
PwnCTFは、バイナリファイルの脆弱性を突いてシステムを制御することです。
Pwnとは
CTF(Capture The Flag)で、特にバイナリの解析や攻撃技術が求められるのが「Pwn(パウン)」です。Pwnは「own(乗っ取る)」の俗語であり、対象のバイナリプログラムを思い通りに制御できるようにすることを意味します。
Pwnでは、実行ファイルの脆弱性を見つけ、悪用してフラグを取得することが目的です。攻撃対象は、関数ポインタ、リターンアドレス、ヒープ構造など、システムのコア部分。Pwnはまさに"コンピュータの裏側を熟知する「ハッキングスキル」になります。
CTFでよく出題されるPwn
CTFでよく出題されるPwnを7つご紹介します。
・バッファオーバーフロー
「この箱には10文字まで」と決まっているのに、100文字送ると…箱の外の大事なデータまで上書きしてしまいます。これを使ってプログラムの動きを変えます。
・フォーマット文字列攻撃
printfなどに「%x」などの文字列をそのまま渡すと、パソコンの中の秘密の情報をのぞけたり、データを書き換えられたりする技です。
・Use-After-Free(解放後使用)
「このメモリはもう使わないよ」とシステムに返したあとに、もう一度使ってしまうと…中身が他の人のものに変わっているかもしれません!それを利用する攻撃です。
・Double Free(二重解放)
さっき返したメモリを、また返してしまうと混乱が起きます。これを使って、好きな場所にデータを書き込むように誘導します。
・ROP(リターン命令をつなげて攻撃)
プログラムの中にある「小さな命令セット(ガジェット)」をパズルのように並べて、自分の好きな動きをさせる高度な技です。
・レースコンディション
2人で同時に同じロッカーを使おうとすると、順番によって中身が変わることがあります。それと同じで、タイミングのズレを利用して本来できない操作を実現します。
・SROP(特別な命令を悪用)
パソコンがエラーから回復するときの仕組み(sigreturn)を悪用して、自由にレジスタの中身を書き換え、自分の好きなシステムコールを実行するという、超上級テクニックです。
攻略に必要な基本テクニック
1.プログラムの情報を見る
file ./vuln
checksec ./vuln
strings ./vuln
「./vuln」はCTFの問題で配られる実行ファイルの名前です。どんな種類のファイルか、安全装置(セキュリティ機能)があるか、どんな文字列が含まれているかを調べます。
2.プログラムの動きを観察する
gdb ./vuln
(gdb) run
(gdb) info registers
gdbというツールを使って、プログラムを一時停止させたり、中の情報を調べたりします。どこが壊れているのか、どのアドレスが使われているのかを見つけることができます。
3.Pythonで攻撃を自動化(pwntools)
from pwn import *
p = process("./vuln")
p.sendline(payload)
p.interactive()
pwntoolsというPythonライブラリを使うと、攻撃コードを自動で実行できます。
・プログラムの起動
・入力の送信
・その後の操作(対話)を一括でできます。 CTFで何度も試すとき、とても便利です!
よく使うツール
・gdb + pwndbg
プログラムを止めたり、中を見たりできるツール。 pwndbgを入れると、見やすくて便利に使えます。
・pwntools
Pythonで攻撃のコードを書くときの強力なライブラリ。 シンプルにプログラムへ入力を送ったり、ROPチェインを組んだりできます。
・ROPgadget / one_gadget
プログラムの中にある便利な命令(ガジェット)を探すツール。 ROP攻撃のときに大活躍します。
・Ghidra / IDA Free
バイナリの中身をC言語っぽく表示してくれるソフト。 プログラムが何をしているかを理解するのに便利です。
バグハンターがCTFで学ぶPwn入門(バイナリの裏をかくCTF技術とは)のまとめ
Pwnは最初とても難しそうに見えます。でも「パソコンってどう動いているの?」「中身って見えるの?」というワクワクを持って挑めば、どんどん世界が広がると思います。
はじめは「Aをいっぱい送ると壊れる!」から始まり、最終的には「ROPを組んで/bin/sh起動」までできるようになります。
あなたもPwnの世界で、コンピュータの仕組みを“攻略”してみませんか?