狠狠撸

狠狠撸Share a Scribd company logo
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

More Related Content

MCC CTF講習会 pwn編