MCC CTF講習会
ー pwn編 ー
2017/07/04
@TUAT
hama (@hama7230)
⾃⼰紹介
´hama (@hama7230)
´CTFは趣味
´TokyoWesterns
l pwn担当
´最近、pwnの基礎基本
が分かってきような気
がする程度の実⼒
1
最初に注意
今⽇の内容を、許可されていないシ
ステムに対して実⾏は犯罪です
やるならCTFでやりましょう
2
今⽇と来週の内容
´今⽇の予定
1. 簡単なCTFの説明
2. 簡単なpwnの説明
3. pwnのやり⽅
4. 軽く実践
´来週 ?
1. ひたすら実践
2. とにかく実践
3
CTFとは
´Capture The Flag
l 情報技術を絡めた旗取り合戦
l 幅広い分野から出題される
l セキュリティと絡めやすい競技
´個⼈的にCTFとセキュリティは別物だと思ってる
´世界全国で開催されている
l ⽇本だとSECCON CTF、Trend Micro CTF
l 初⼼者向けのSECCON Beginners(ctf4b)
4
CTFのジャンル
´ジャンルは様々
l Web
l http使えば全てweb
l Forensic
l ⼀番現実のセキュリティ業務で役に⽴ちそう
l Reversing
l 総合格闘技
l Crypto
l 頭の良い⼈しか出来ない
l Pwnable (Exploit)
l 今⽇のお題
l Misc
l なんでもアリ
5
pwnとは
´脆弱性を突いて制御を奪うジャンル
l 実⾏バイナリの解析
l エクプロイト考案
´pwnの語源
l ownのtypo?
´実⾏バイナリと脆弱性、攻撃⼿法に対す
る理解が求められる
6
過去に出題されたpwn
´glibc malloc
´Linux Kernel Exploit
´Windows
´Browser Exploit
´JavaScript Engine Exploit
´QEMU Escape
´難化しているが⾮常に(個⼈的には)⾯⽩
いジャンル
7
諸注意
´今回は初⼼者向け
l Linuxのstackベースの問題をやります
l Slackに書いたツールがあれば何とかなりま
す
´動作環境
l Ubuntu 16.04
l glibc 2.23
8
pwnの基本的な流れ(個⼈的なパター
ン)
1. 表層解析
2. 静的解析
3. 動的解析
4. エクスプロイトの検討
5. エクスプロイトの作成
6. エクスプロイトのデバッグ
7. エクスプロイトの実⾏
9
表層解析
´バイナリが、どのようなものなのか知る
ことが⽬的
l アーキテクチャは何か?
l セキュリティ機構はどうなっているか?
´まず初めの⼩⼿調べ
l しっかりした解析は動的解析と静的解析
10
1. 表層解析
´fileコマンド
l 基本的な情報はこれで取れる
´例の場合だと
l 32bit ELF
l アーキテクチャはx86
l dynamic linkでライブラリを使⽤している
l strippedなのでシンボル情報がない
% file ./my_sandbox
./my_sandbox: ELF 32-bit LSB executable, Intel 80386, version 1
(SYSV),
dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24,
BuildID[sha1]=44ab05f5782a9a5dbae69dd6acea3741c79f7b01,
stripped
11
1. 表層解析
´checksecコマンド
l セキュリティ機構を確認できる
´例の場合だと
l Full RELROなのでGOTの上書きはできない
l canaryは存在しないのでstack BOFが有効
l Nxbitがないのでシェルコードの実⾏が狙える
l PIEはないので、命令とデータは固定アドレス
% checksec ./my_sandbox
[*] '/home/hama/ctf/EDCTF/MySandbox/my_sandbox'
Arch: i386-32-little
RELRO: Full RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE
12
1. 表層解析
´stringsコマンド
l 実⾏バイナリにあるASCIIで読める⽂字列を
表⽰
l 使⽤している関数や固定⽂字列が分かる
´関数が分かれば、どのような問題かある
程度掴める
l printf()があればFSBがありそう
l malloc()/free()があればheap系の問題
´あまりやっている⼈はいない
13
1. 表層解析
´実際に動かしてみる
l マルウェアには注意
´ある程度動かしてバイナリの挙動を掴む
ことが⽬的
l 動きを理解していると後の解析が楽になる
´機能が複数ありそうなら全て試してみる
14
1. 表層解析
´file, checksecなどのコマンドを⽤いて
バイナリの表層部分を解析
l バイナリの基本情報
l セキュリティ機構
´これらのことに念頭に置きつつ、今後の
解析を⾏っていく
´セキュリティ機構についてはおまけ参照
15
2. 静的解析
´実⾏バイナリをディスアセンブルして実
⾏の流れを調べる
´objdumpコマンドでディスアセンブル
可能
l 今回はobjdumpでやります
´お⾦がある⼈はIDA Pro
l 試⽤版もあるので、そっちでもいい
16
ツールその他
´ディスアセンブラは⾊々あるので、お好き
なのを使ってください
l radare2
´インタラクティブな何か
´無料
´https://github.com/radare/radare2
l binary ninja
´IDAみたいな何か
´有料
´https://binary.ninja/
l Hopper
´Macで使える
´有料(試⽤版は無料ただし30分の時限式)
´https://www.hopperapp.com/
17
2. 静的解析
´⾒るべきポイント
l バイナリの流れ
l 使⽤している関数
l 関数の引数
´はじめのうちはC⾔語に直しながらでも
良いかもしれない
l 慣れてくると⾯倒なのでしない
18
2. 静的解析
´アセンブラを読むコツ
l 適当に読む
l 流れで読む
l 命令が分からなかったら調べる
´ローカル変数はebpからのオフセットで
指定するので、図を書きながらだと理解
しやすい
l heapの場合でも同じ。図を書くと良い
19
2. 静的解析
´関数の引数の渡し⽅
l アーキテクチャによって異なる
´x86
l 引数はスタックに積む
l 関数を呼ぶ前にpushやmov [esp+off],
val
´x64
l 引数はレジスタに格納する
l 関数を呼ぶ前にmov rdi, val
20
2. 静的解析
´使⽤している関数と引数が分かれば、あ
る程度の流れは掴める
´おかしな引数になっていないか確認する
l 確保している変数より⼤きく読み込んでい
る
l printf(input)でFSBがある
21
2. 静的解析
´ディスアセンブルしてバイナリを読んで
いく
´呼ばれる関数や引数、データの取り⽅に
注⽬して解析する
´怪しそうな関数の周りは注意深く読む
l printf()
l gets()
l などなど
22
3. 動的解析
´デバッガで動しながらメモリの内容を確
認する
´静的解析で当たりをつけたところを重点
的に確認する
´今回はgdbを使⽤
l 素のgdbは優しくないので拡張であるpeda
を使⽤
23
3. 動的解析
´読み込む⾏う関数の前にbreakpoint
l read()
l fgets()
l などなど
´FSBがあるならprintf()の前にも
breakpoint
24
3. 動的解析
´ここまでのまとめ
l デバッガを使⽤して、メモリを確認しなが
ら実⾏する
l 怪しそうな関数前で、breakpointを仕掛け
て解析する
25
4. エクプロイトの考案
´判明した脆弱性を使⽤して制御を奪う⽅
法を考える
l 具体的にはeip(rip)を任意の値にしたい
´最終的にはシェルを取ることが⽬標
l system(“/bin/sh”)の実⾏
l shellcodeの実⾏
l One Gadget RCEの呼び出し
26
5. エクスプロイトの作成
´やるだけ
l ここは本質ではない
´⽴てた⽅針をもとにエクスプロイトコー
ドを書く
´今回はpwntoolsを使⽤してエクスプロイ
トを書きます
l 便利ラッパーが多いので使っている⼈が多い
27
6. エクスプロイトのデバッグ
´書いたエクスプロイトが⼀発で期待通り
に動くはずがない
´gdb使いながらエクスプロイトの動きを
確認し、ダメなところは修正する
´⽅針が間違っていたら再度エクスプロイ
トの考案に戻る
28
7. エクスプロイトの実⾏
´フラグを読む
29
最後に
´pwnの流れ
l 表層解析
l 静的解析
l 動的解析
l エクスプロイトの検討、作成、デバッグ
´pwnはCTFで許される範囲でやりましょ
う!
l 現実のシステムに対しては犯罪です
30
では、やりましょう
´今回はEDCTFで出題されたMy
Sandboxをやります
l 作問者いわく、想定解法は複数存在
l バイナリのサイズは⼩さい
l 脆弱性もわかりやすい
31
以下、オマケ
32
参考になる本
´ Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論
と実際
l よく勧められている本
´ セキュリティコンテストチャレンジブック -CTF
で学ぼう! 情報を守るための戦い⽅
l 基本は載ってる
´ たのしいバイナリの歩き⽅
l サクッと読めるのでオススメ
33
参考になるサイト
´ももいろテクノロジー
(http://inaz2.hatenablog.com/)
l @inaz2⽒によるブログ
l 基本的なことがまとまっている
´しゃろの⽇記 (http://charo-
it.hatenablog.jp/)
l @Charo_IT⽒によるブログ
l 詳しいwriteupが載っているので参考になる
34
他の問題をやりたいなら…
´pwn challenges list
(https://pastebin.com/uyifxgPu)
l bata(@bata_24)さんによるpwnの良問集
´pwnable.kr (http://pwnable.kr)
l バイナリの基礎基本から学べる
´pwnable.tw (http://pwnable.tw)
l HITCON, 217のメンバーによる常設CTF
l 基本テクニックが学べる
35
セキュリティ機構
´NXbit
´Stack Smash Protection (SSP)
´ASLR
´RELRO
´PIE
36
NXbit
´Non eXecutable bit
l データ領域に不必要な実⾏権限を与えない
´ページ毎に各種権限が設定されている
l Read, Write, Exec
l 実⾏権限のない箇所を実⾏しようとすると
SEGV
´checksecで確認可能
37
NXbit
´vmmapで確認した結果
l ⾚い箇所は, RWXな空間
38
NXbit
´NXbitが無効だと何ができるのか?
l shellcodeが実⾏できる
l NXが無効な領域に機械語を配置して、実⾏
をそこに移せば任意の処理が実⾏可能
39
Stack Smash Protection
´stackでのBOFを検知するための機構
´関数の⼊り⼝でローカル変数とsaved
ebpの間に値を挟み、関数終了時に値を
確認し、書き換わっていたらBOFが発⽣
したとして終了する
´エクスプロイトを実⾏する上で厄介な存
在
40
Stack Smash Protection
´ただし、バイナリが起動してから
canaryの値は変わらない
l ⼀度リークできればSSPは突破可能
l master canaryはTLS(Thread Local
Storage)に存在
´fork-exec型のバイナリでは総当たりで
求めることができる
l 親プロセスと⼦プロセスのcanaryは同じ
41
Address Space Layout
Randomization
´アドレス空間配置のランダム化
l ライブラリやheap、stackが配置されるアドレ
スをバイナリの起動ごとにランダムにする
l アドレスが分からないとエクスプロイトの実⾏
が困難になる
´リークできれば問題はない
l GOTには解決されたライブラリ関数のアドレス
がある -> リークしたアドレスから関数のオフ
セットを引けばlibcのベースアドレス
l 最悪ブルートフォースで当てる
42
RELocation Read-Only
´ライブラリ関数のアドレスを解決して置
いておくのがGlobal Offset Table(GOT)
´GOTが書き換え可能か、どうかを⽰して
いるのがRELRO
l 正確に⾔うと、遅延バインドを有効にする
かどうか
´GOTを書き換えると、当該関数が呼ばれ
た時に制御を奪える
43
Position-Independent Executable
´位置独⽴実⾏形式
´ASLRでランダムになるのはstack,
heap, libcのアドレス
l バイナリの命令やbss, dataは固定アドレス
に存在する
´命令, bss, dataなど全て含めて配置す
るアドレスをランダムにする機構
l 攻撃をより困難にする
´ASLR同様、リークできれば問題ない
44

MCC CTF講習会 pwn編