Slide 1

Slide 1 text

Pwn入門 〜BoFからKernel Exploitまで〜 @megumish

Slide 2

Slide 2 text

Pwn入門 〜BoFからKernel Exploitまで〜 @megumish

Slide 3

Slide 3 text

Pwn入門 〜BoFとHouse of Orange〜 @megumish

Slide 4

Slide 4 text

自己紹介 ● @megumish ● 名古屋の学部生 ● CTF チーム: Harekaze ● 第 7 期 CybozuLabs Youth 研究生

Slide 5

Slide 5 text

自己紹介 ● CTF ではとくに Pwn ( Exploit )が好き ● 去年の SECCON2016 (12月)から本格的に始めた – それまでは中長期型の競プロをよくやっていた

Slide 6

Slide 6 text

自己紹介 ● 当初から Pwn カテゴリを頑張ろうと思っていた ● しかし、なかなか手をつけられずに 7 月に至る – この時点では BoF や FSA と言ったものも、よく分かっていな かった ● 7 月下旬からやる気 MAX ファイアーで頑張ったら、そこ そこできるようになった – pwnable.tw というサイトで 2467 人中 123 位( 9 月 19 日時点)

Slide 7

Slide 7 text

Pwn入門

Slide 8

Slide 8 text

Pwn (または Exploit )について ● サーバーを攻撃して、その制御を奪う部門 ● 制御を奪うとは – /bin/sh のようなシェルを実行 – Windows では cmd.exe や powershell.exe の実行 – 要は任意の OS コマンドを実行出来る状態にするのが Pwn

Slide 9

Slide 9 text

Pwn (または Exploit )について ● サーバーを攻撃して、その制御を奪う部門 ● 制御を奪うとは – 具体的には /bin/sh のようなシェルを実行 – Windows では cmd.exe や powershell.exe の実行 – 要は任意の OS コマンドを実行出来る状態にするのが Pwn

Slide 10

Slide 10 text

Pwn (または Exploit )について ● サーバーを攻撃して、その制御を奪う部門 ● 制御を奪うとは – 具体的には /bin/sh のようなシェルを実行 – Windows では cmd.exe や powershell.exe の実行 – 要は任意の OS コマンドを実行出来る状態にするのが Pwn ● この状態にどうやって持っていくかが重要

Slide 11

Slide 11 text

Pwn へのみちすじ ● OS コマンドをどうやって実行するか OS コマンドの実行

Slide 12

Slide 12 text

Pwn へのみちすじ ● OS コマンドをどうやって実行するか OS コマンドの実行 system(“/bin/sh”) 、 execve(“/bin/sh”,NULL,NULL)

Slide 13

Slide 13 text

Pwn へのみちすじ ● OS コマンドをどうやって実行するか OS コマンドの実行 system(“/bin/sh”) 、 execve(“/bin/sh”,NULL,NULL) 攻撃側が意図する命令の実行

Slide 14

Slide 14 text

Pwn へのみちすじ ● OS コマンドをどうやって実行するか OS コマンドの実行 system(“/bin/sh”) 、 execve(“/bin/sh”,NULL,NULL) 攻撃側が意図する命令の実行 ???

Slide 15

Slide 15 text

うごめくバイナリ ● そもそも実行ファイルはどのように実行されるか? – 命令単位で構成 – 上から下に実行 – レジスタ・メモリの状態によって続く命令が変わる

Slide 16

Slide 16 text

うごめくバイナリ ● そもそも実行ファイルはどのように実行されるか? – 命令単位で構成 – 上から下に実行 – レジスタ・メモリの状態によって続く命令が変わる

Slide 17

Slide 17 text

うごめくバイナリ ● そもそも実行ファイルはどのように実行されるか? – 命令単位で構成 – 上から下に実行 – レジスタ・メモリの状態によって続く命令が変わる

Slide 18

Slide 18 text

うごめくバイナリ ● そもそも実行ファイルはどのように実行されるか? – 命令単位で構成 – 上から下に実行 – レジスタ・メモリの状態によって続く命令が変わる

Slide 19

Slide 19 text

うごめくバイナリ ● そもそも実行ファイルはどのように実行されるか? – 命令単位で構成 – 上から下に実行 – レジスタ・メモリの状態によって続く命令が変わる ● 意図した命令を実行できそう

Slide 20

Slide 20 text

レジスタとメモリ ● 分岐を変えるにはレジスタ・メモリの値を変えればいい ● レジスタの値を変えるには? – レジスタ間の値のコピー – メモリからの値のロード

Slide 21

Slide 21 text

レジスタとメモリ ● 分岐を変えるにはレジスタ・メモリの値を変えればいい ● レジスタの値を変えるには? – レジスタ間の値のコピー – メモリからの値のロード ● read() などによってメモリは書き換え可能 ● メモリを書き換えることで意図した命令列を実行すること ができそう。

Slide 22

Slide 22 text

Pwn へのみちすじ ● OS コマンドをどうやって実行するか OS コマンドの実行 system(“/bin/sh”) 、 execve(“/bin/sh”,NULL,NULL) 攻撃側が意図する命令の実行 ???

Slide 23

Slide 23 text

Pwn へのみちすじ ● OS コマンドをどうやって実行するか OS コマンドの実行 system(“/bin/sh”) 、 execve(“/bin/sh”,NULL,NULL) 攻撃側が意図する命令の実行 メモリの書き換え

Slide 24

Slide 24 text

メモリの書き換え ● メモリ中には様々な領域がある ● どの領域を書き換えればいいか?

Slide 25

Slide 25 text

メモリの書き換え ● そもそも、命令そのものを書き換えてしまうのが簡単そう

Slide 26

Slide 26 text

メモリの書き換え ● そもそも、命令そのものを書き換えてしまうのが簡単そう ➔ しかし、これはできない ➔ 命令そのものは書き込み不可領域にあるため

Slide 27

Slide 27 text

メモリの書き換え ● 書き込み可能な領域は限られている ● 書き込み可能な領域すべてが必ずしも利用可能ではない – read() などで書き込むことが可能か ● 既知のアドレスであるか ● それを引数として指定できるか ● これらの問題を解決し、特定の領域に何らかの書き込みを行う ➔ そして、任意の命令を実行できるようにする ➔ これが Pwn の主目的となる

Slide 28

Slide 28 text

主な Pwn の手法 ● Buffer Over Flow ● Return Oriented Programming ● Format String Attack ● Heap テク – fastbins attack – unsafe unsorted bins attack – House of 〜系

Slide 29

Slide 29 text

攻撃手法ですること ● メモリの書き換え ● レジスタの書き換え ● PIE が有効である場合 – バイナリのアドレスのリーク ● ASLR が有効である場合 – Heap のアドレスのリーク – libc のアドレスのリーク ● SSP が有効である場合 – CANARY の値のリーク

Slide 30

Slide 30 text

今日紹介する攻撃手法 ● Buffer Over Flow ● House of Orange ● ( Kernel Exploit )

Slide 31

Slide 31 text

BufferOverFlow(BoF) 攻撃

Slide 32

Slide 32 text

攻撃の成立条件 ● プログラムが確保したバッファを上回る書き込みが出来る – ここでいうバッファはスタック領域に確保されたメモリ ● 具体的な例 – バッファ buf に 0x10byte 確保 – read(STDIN, buf, 0x100) で 0x100byte 書き込み可能

Slide 33

Slide 33 text

前提知識 ● スタック領域の一部のメモリがどのように確保されるか ● 確保されたメモリがどのように利用されるか

Slide 34

Slide 34 text

前提知識 ● スタック領域の一部のメモリがどのように確保されるか ● 確保されたメモリがどのように利用されるか

Slide 35

Slide 35 text

前提知識 ● スタック領域の一部のメモリがどのように確保されるか ● 確保されたメモリがどのように利用されるか ● スタック領域についての理解

Slide 36

Slide 36 text

スタック領域 ● 関数呼び出し時に、この領域の一部が次のような用途で 確保される – 呼び出し元の命令を指すレジスタ (EIP/RIP) のバックアップ – その他のレジスタのバックアップ – ローカル変数の使用領域の確保

Slide 37

Slide 37 text

スタック領域 ● 関数呼び出し時に、この領域の一部が次のような用途で 確保される – 呼び出し元の命令を指すレジスタ (EIP/RIP) のバックアップ – その他のレジスタのバックアップ – ローカル変数の使用領域の確保 呼び出し元関数の領域

Slide 38

Slide 38 text

スタック領域 ● 関数呼び出し時に、この領域の一部が次のような用途で 確保される – 呼び出し元の命令を指すレジスタ (EIP/RIP) のバックアップ – その他のレジスタのバックアップ – ローカル変数の使用領域の確保 確保! 呼び出し元関数の領域

Slide 39

Slide 39 text

スタック領域 ● 関数呼び出し時に、この領域の一部が次のような用途で 確保される – 呼び出し元の命令を指すレジスタ (EIP/RIP) のバックアップ – その他のレジスタのバックアップ – ローカル変数の使用領域の確保 呼び出し元関数の領域 呼び出し元命令アドレス RBPのバックアップ いくつかのローカル変数

Slide 40

Slide 40 text

スタック領域 ● 確保されたメモリ領域はどのように利用されるか? 呼び出し元命令アドレス RBPのバックアップ いくつかのローカル変数 上位 下位

Slide 41

Slide 41 text

スタック領域 ● RBP( もしくは RSP )によってローカル変数が管理される 呼び出し元命令アドレス RBPのバックアップ いくつかのローカル変数 RBP RSP 上位 下位

Slide 42

Slide 42 text

スタック領域 ● RBP はローカル変数の最下位の一つ下を指す(※) 呼び出し元命令アドレス RBPのバックアップ いくつかのローカル変数 RBP RSP 上位 下位 ※これはもしかしたらコンパイラの 実装によって異なるかも?

Slide 43

Slide 43 text

スタック領域 ● RSP は確保領域の最上位を指す 呼び出し元命令アドレス RBPのバックアップ いくつかのローカル変数 RBP RSP 上位 下位

Slide 44

Slide 44 text

スタック領域 ● ローカル変数が RBP で管理されている場合 呼び出し元命令アドレス RBPのバックアップ RBP 上位 下位 long long hoge char piyo[0x100] piyoの実体

Slide 45

Slide 45 text

スタック領域 ● 以下のように変数の領域が確保されているとする 呼び出し元命令アドレス RBPのバックアップ RBP 上位 下位 long long hoge char piyo[0x100] piyoの実体

Slide 46

Slide 46 text

スタック領域 ● RBP との差分で管理 呼び出し元命令アドレス RBPのバックアップ RBP 上位 下位 long long hoge char piyo[0x100] piyoの実体 RBP + 0x08 RBP - 0x100 RBP - 0x108 RBP - 0x110

Slide 47

Slide 47 text

スタック領域 ● ローカル変数に値がどのように格納されるか? 呼び出し元命令アドレス RBPのバックアップ RBP 上位 下位 long long hoge char piyo[0x100] piyoの実体 RBP + 0x08 RBP - 0x100 RBP - 0x108 RBP - 0x110

Slide 48

Slide 48 text

スタック領域 ● 例えば、 piyo の実体に文字列 ABCD を代入すると 呼び出し元命令アドレス RBPのバックアップ RBP 上位 下位 long long hoge char piyo[0x100] piyoの実体 RBP + 0x08 RBP - 0x100 RBP - 0x108 RBP - 0x110

Slide 49

Slide 49 text

スタック領域 ● リトルエンディアンの場合、右から順に入る 呼び出し元命令アドレス RBPのバックアップ RBP 上位 下位 long long hoge char piyo[0x100] piyoの実体 RBP + 0x08 RBP - 0x100 RBP - 0x108 RBP - 0x110 0x0000000044434241 AはASCIIコードで0x41 BはASCIIコードで0x42 CはASCIIコードで0x43 DはASCIIコードで0x44

Slide 50

Slide 50 text

スタック領域 ● 次に piyo の実体に A * 0x8 + B * 0x8 を入れてみる 呼び出し元命令アドレス RBPのバックアップ RBP 上位 下位 long long hoge char piyo[0x100] piyoの実体 RBP + 0x08 RBP - 0x100 RBP - 0x108 RBP - 0x110

Slide 51

Slide 51 text

スタック領域 ● 図のように 8byte 分入ると今度は下の方に進む(※) 呼び出し元命令アドレス RBPのバックアップ RBP 上位 下位 long long hoge char piyo[0x100] piyoの実体 RBP + 0x08 RBP - 0x100 RBP - 0x108 RBP - 0x110 0x4141414141414141 0x4242424242424242 AはASCIIコードで0x41 BはASCIIコードで0x42 ※ここでは64bitバイナリを例 にしているため8byteになるが 32bitバイナリでは4byteごとに なることに注意

Slide 52

Slide 52 text

スタック領域 呼び出し元命令アドレス RBPのバックアップ RBP 上位 下位 long long hoge(0x00000000CDAB) char piyo[0x100] piyoの実体 RBP + 0x08 RBP - 0x108 RBP - 0x110 0x4141414141414141 0x4242424242424242 AはASCIIコードで0x41 BはASCIIコードで0x42 ※ここでは64bitバイナリを例 にしているため8byteになるが 32bitバイナリでは4byteごとに なることに注意 ● 図のように 8byte 分入ると今度は下の方に進む(※) ● このことを理解して BoF 攻撃をする

Slide 53

Slide 53 text

再掲―攻撃の成立条件― ● プログラムが確保したバッファを上回る書き込みが出来る – ここでいうバッファはスタック領域に確保されたメモリ ● 具体的な例 – バッファ buf に 0x10byte 確保 – read(STDIN, buf, 0x100) で 0x100byte 書き込み可能

Slide 54

Slide 54 text

再掲―攻撃の成立条件― ● プログラムが確保したバッファを上回る書き込みが出来る – ここでいうバッファはスタック領域に確保されたメモリ

Slide 55

Slide 55 text

再掲―攻撃の成立条件― ● プログラムが確保したバッファを上回る書き込みが出来る – ここでいうバッファはスタック領域に確保されたメモリ ● さっきの図で言うと、ローカル変数 piyo の実体(以下 バッファ piyo と呼ぶ)

Slide 56

Slide 56 text

BoF 攻撃 ● バッファ piyo の下には“ RBP のバックアップ”や“呼び出 し元命令アドレス”が存在

Slide 57

Slide 57 text

BoF 攻撃 ● バッファ piyo の下には“ RBP のバックアップ”や“呼び出 し元命令アドレス”が存在

Slide 58

Slide 58 text

BoF 攻撃 ● バッファ piyo の下には“ RBP のバックアップ”や“呼び出 し元命令アドレス”が存在 ● バッファ piyo に 0x100byte 以上の書き込みをすると これらの上書きが可能

Slide 59

Slide 59 text

BoF 攻撃 ● 関数の最後には RBP のバックアップを RBP に戻す処理 や呼び出し元命令アドレスに戻る処理がある – 上書きすることでこれらの処理後の挙動を変更可能

Slide 60

Slide 60 text

RBP のバックアップを RBP に戻す処理 ● この処理を実行するための命令として leave 命令がある – この命令は以下の2つの命令と等価 – mov rsp, rbp; pop rbp; ● mov rsp, rbp; は RSP に RBP の値をコピーする命令 ● pop rbp; は現在の RSP が指す値を RBP にコピーし て、 RSP の値を 8 (※)だけ減算する命令 ● 実際のバイナリでは leave 命令を使わないこともある ※64bit バイナリの場合は 8 32bit バイナリの場合は 4

Slide 61

Slide 61 text

呼び出し元命令アドレスに戻る処理 ● この処理を実行するための命令として ret 命令がある – この命令は以下の命令と等価 – pop rip; ● RIP に現在 RSP が指す値をコピーし、 RSP を 8 (※)だけ 減算する命令 ※64bit バイナリの場合は 8 32bit バイナリの場合は 4

Slide 62

Slide 62 text

BoF 攻撃 ● RBP のバックアップを RBP に戻す処理への攻撃 – RBP の書き換えが可能 ➔ read() などによって書き込むアドレスを指定できるかも? ● 呼び出し元命令アドレスに戻る処理への攻撃 – RIP の書き換えが可能 ➔ 特定の命令列を実行できるかも?

Slide 63

Slide 63 text

BoF 攻撃 ● RBP のバックアップを RBP に戻す処理への攻撃 – RBP の書き換えが可能 ➔ read() などによって書き込むアドレスを指定できるかも? ● 呼び出し元命令アドレスに戻る処理への攻撃 – RIP の書き換えが可能 ➔ 特定の命令列を実行できるかも?

Slide 64

Slide 64 text

BoF 攻撃 ● RBP のバックアップを RBP に戻す処理への攻撃 – RBP の書き換えが可能 ➔ read() などによって書き込むアドレスを指定できるかも? ● 呼び出し元命令アドレスに戻る処理への攻撃 – RIP の書き換えが可能 ➔ 特定の命令列を実行できるかも? ● これらを組み合わせることで意図する命令を実行する

Slide 65

Slide 65 text

実例 ● 例えば以下のように BoF ができるプログラムがある

Slide 66

Slide 66 text

実例 ● char piyo[0x100] が宣言されているが、

Slide 67

Slide 67 text

実例 ● read() によってそのサイズを上回る書き込みが出来る

Slide 68

Slide 68 text

実例 ● このプログラムを以下のようなコマンドでコンパイルする ● gcc -o bof -fno-stack-protector -zexecstack bof.c ● またプログラムの実行環境では ASLR(Address Space Layout Randomization) が有効であるとす る。

Slide 69

Slide 69 text

Let's Pwn ● この場合次のような Exploit が考えられる。 a)BoF によって RBP が .bss 領域を指すようにし、 RIP は read() の直前を指すようにする。

Slide 70

Slide 70 text

Let's Pwn ● この場合次のような Exploit が考えられる。 a)BoF によって RBP が .bss 領域を指すようにし、 RIP は read() の直前を指すようにする。 b)read() で .bss 領域にシェルコードを書き込む

Slide 71

Slide 71 text

Let's Pwn ● この場合次のような Exploit が考えられる。 a)BoF によって RBP が .bss 領域を指すようにし、 RIP は read() の直前を指すようにする。 b)read() で .bss 領域にシェルコードを書き込む ● シェルコードとは、 execve(“/bin/sh”, NULL, NULL) を実行する命令列のこと ● ここで .bss 領域に書き込むようにするのは ASLR に よってスタック領域を特定できないため

Slide 72

Slide 72 text

Let's Pwn ● この場合次のような Exploit が考えられる。 a)BoF によって RBP が .bss 領域を指すようにし、 RIP は read() の直前を指すようにする。 b)read() で .bss 領域にシェルコードを書き込む c)BoF で RIP がシェルコードの先頭を指すようにす る d)execve(“/bin/sh”, NULL, NULL) が発動!

Slide 73

Slide 73 text

Let's Pwn ● この Exploit に次の注意点がある – スタック領域の場所の特定をしない ➔ASLR が効いているためその特定が面倒 ➔RIP は既知のアドレスにしか書き換えることが出来ない ➔そのため .bss 領域にシェルコードを書き込むようにする ➔この Exploit は以下の条件でしか使えない 1.PIE が無効である ➔バイナリのアドレスが randomize されない 2.NXbit ( DEP )が無効である ➔.bss 領域の命令が実行できる

Slide 74

Slide 74 text

Exploit コード ● python で書いた Exploit コード

Slide 75

Slide 75 text

Exploit コード ● pwntools というライブラリを使って書いた

Slide 76

Slide 76 text

BoF 攻撃のまとめ ● BoF 攻撃によって RBP 、 RIP を書き換えることが出来る ● またその組み合わせによって、書き込む場所を変えること も出来る ● 既知のアドレスにシェルコードを書き込めば、任意の OS コマンドが実行可能な状態に持っていける ● ここでは話さないが ROP ( Return Oriented Programming )という攻撃につなげることも可能 ➔これにより攻撃の幅が広がる

Slide 77

Slide 77 text

House of Orange (File Stream Oriented Programming)

Slide 78

Slide 78 text

注意! ● まだ理解できていない部分もあるため間違っているところ があるかもしれません – CTF で利用する場合は問題がないと思います – もし、ちゃんとした知識として利用したい場合、自分でソース コードを読むべきです

Slide 79

Slide 79 text

攻撃の成立条件 ● 任意のサイズの malloc() が可能 ● Heap Over Flow ができる – これは次のチャンクサイズが変更可能であれば十分

Slide 80

Slide 80 text

攻撃の成立条件 ● 任意のサイズの malloc() が可能 ● Heap Over Flow ができる – これは次のチャンクサイズが変更可能であれば十分 ● この攻撃には通常の Heap テクで必要な free() はいら ない ➔ 通常は free() することで fastbins や unsortbins などを作り 出してそれを利用する ➔ この方法では free() を使わずに bins を作り出す。

Slide 81

Slide 81 text

攻撃の成立条件 ● 任意のサイズの malloc() が可能 ● Heap Over Flow ができる – これは次のチャンクサイズが変更可能であれば十分 ● この攻撃には通常の Heap テクで必要な free() はいら ない ➔ 通常は free() することで fastbins や unsortbins などを作り 出してそれを利用する ➔ この方法では free() を使わずに bins を作り出す。 ● 具体例 – HITCONCTF2016 house of orange

Slide 82

Slide 82 text

前提知識 ● malloc に関するある程度の知識 ● abort() するときに _IO_flush_all_lockp() が呼び 出されるという知識 – これによって File Stream Oriented Programming が可 能である ● 実際にはこれらの知識がなくても頑張って調べればいける

Slide 83

Slide 83 text

前提知識 ● malloc に関するある程度の知識 ● abort() するときに _IO_flush_all_lockp() が呼び 出されるという知識 – これによって File Stream Oriented Programming が可 能である ● 実際にはこれらの知識がなくても頑張って調べればいける …かもしれない。

Slide 84

Slide 84 text

前提知識 ● malloc に関するある程度の知識 ● abort() するときに _IO_flush_all_lockp() が呼び 出されるという知識 – これによって File Stream Oriented Programming が可 能である ● 実際にはこれらの知識がなくても頑張って調べればいける …かもしれない

Slide 85

Slide 85 text

House of Orange のおおまかな流れ a)適当なサイズの chunk をとる。( malloc() ) b)Heap Overflow を用いて、 top chunk size を書き 換える c)書き換えた top chunk size より 0x30 程度小さいサ イズの chunk をとる。

Slide 86

Slide 86 text

House of Orange のおおまかな流れ a)適当なサイズの chunk をとる。( malloc() ) b)Heap Overflow を用いて、 top chunk size を書き 換える c)書き換えた top chunk size より 0x30 程度小さいサ イズの chunk をとる。 ➔このとき、 top chunk size は特定の条件を満たさない といけない…

Slide 87

Slide 87 text

House of Orange のおおまかな流れ a)適当なサイズの chunk をとる。( malloc() ) b)Heap Overflow を用いて、 top chunk size を書き 換える c)書き換えた top chunk size より 0x30 程度小さいサ イズの chunk をとる。 ➔このとき、 top chunk size は特定の条件を満たさない といけない… ➔が、正直調べるのは面倒。

Slide 88

Slide 88 text

House of Orange のおおまかな流れ a)適当なサイズの chunk をとる。( malloc() ) b)Heap Overflow を用いて、 top chunk size を書き 換える c)書き換えた top chunk size より 0x30 程度小さいサ イズの chunk をとる。 ➔例えばもともとの top chunk size 0x20f91 だった ら下位 3 桁をとって、 0xf91 にすると条件を満たしたり する。 ➔自分はこの条件を手探りで求めた。

Slide 89

Slide 89 text

House of Orange のおおまかな流れ a)適当なサイズの chunk をとる。( malloc() ) b)Heap Overflow を用いて、 top chunk size を書き 換える c)書き換えた top chunk size より 0x30 程度小さいサ イズの chunk をとる。 d)c により、新たに Heap 領域が確保され、もともとの余っ た領域が大きな unsorted bin になる。 e)さらに chunk をとることで large bin になる。

Slide 90

Slide 90 text

House of Orange のおおまかな流れ a)適当なサイズの chunk をとる。( malloc() ) b)Heap Overflow を用いて、 top chunk size を書き 換える c)書き換えた top chunk size より 0x30 程度小さいサ イズの chunk をとる。 d)c により、新たに Heap 領域が確保され、もともとの余っ た領域が大きな unsorted bin になる。 e)さらに chunk をとることで large bin になる。 ➔これにより libc と Heap のアドレスがリークできる。

Slide 91

Slide 91 text

House of Orange のおおまかな流れ f) 次のような偽の unsorted bin chunk を作る • main_arena が unsorted bin を指す位置に置く • fd は適当な値、 bk は _IO_list_all を指すようにする • サイズは 0x60 で prev_in_use のフラグを立てておく(つま り、 0x61 にする。) • このチャンク自体の prev_size は設定しなくてもよい ➔わざと abort() させ、 _IO_flush_all_lockp() を利用するた め。

Slide 92

Slide 92 text

House of Orange のおおまかな流れ g)また、 e の unsorted bin が FILE_plus 構造体にな るようにしておく • vtables 変数の値がその後に置く system() のアドレスを含む 、 vtables 構造体を指すようにしておく • 他の値は Heap+0x80 などにしておくと問題がない h)unsorted bin (かつ FILE_plus 構造体であるもの)の後に vtables 構造体を置く • vtables 構造体の 4 番目に system() のアドレスを置く。 i) malloc() をする と、 abort() 、 _IO_flush_all_lockp() 、 system() の順にうま く行くと実行される。

Slide 93

Slide 93 text

House of Orange の原理 ● f 以降の手法についての原理 ● まず f で unsorted bins attack の準備をしている – _IO_list_all は通常は stderr を指している – この攻撃で main_arena の unsorted bins のアドレスを指 すように上書きされる – また、 main_arena の small_bins[4] が偽のチャンクを指す ようになる ● これは次に説明する FILE Stream Oriented Programming に関係する

Slide 94

Slide 94 text

FILE Stream Oriented Programming ● abort() 中に _IO_flush_all_lockp() という関数が呼び出さ れる – 本来は stdin や stdout 、 stderr といった入出力をすべて flush するためのもの – これの先頭として _IO_list_all が指しているものがとられる – そのため _IO_list_all を任意の FILE 構造体(偽でも良い)を 指すようにするとこの関数の一部を適用できる

Slide 95

Slide 95 text

FILE Stream Oriented Programming – FILE 構造体には chain と呼ばれる変数がある – これによって繋がれているため、すべての FILE 構造体を flush することができる – さきほどの main_arena の small_bins[4] がちょうど chain にくる – つまり偽の unsorted bin に _IO_flush_all_lockp の一部 を適用することが出来る。

Slide 96

Slide 96 text

FILE Stream Oriented Programming – この関数中では FILE_plus 構造体の _IO_OVERFLOW(fp,EOF) が実行される – IO_OVERFLOW(fp,EOF) は vtables 構造体に設定されてい るものが呼び出される ➔ つまり偽の FILE_plus 構造体、 vtables 構造体を作ってお けば任意の関数を実行できる ➔ FILE Stream を使った攻撃なので、 FILE Stream Oritend Programming

Slide 97

Slide 97 text

実演 ● 図がなくて申し訳ないです。 – 補足として時間があったら実演します。 – Exploit コードを github に置いておいたので気になる方は見 てみてください。

Slide 98

Slide 98 text

House of Orange のまとめ ● House of Orange は FILE Stream と Heap をうまく使った 面白い手法 ● とくに FILE Stream の _IO_OVERFLOW() と類似の _IO_UFLOW() などは他の関数でも使われることがある – 別のバイナリで似たような手法で攻撃が出来るかもしれない

Slide 99

Slide 99 text

Kernel Exploit bypass SMEP – KASLR - KADR

Slide 100

Slide 100 text

注意! ● まだ理解できていない部分もあるため間違っているところ があるかもしれません – CTF で利用する場合は問題がないと思います – もし、ちゃんとした知識として利用したい場合、自分でソース コードなどを読むべきです

Slide 101

Slide 101 text

Kernel Exploit について ● Kernel Exploit は通常の Pwn とは異なる ● 目標はカーネルランドで root 権限昇格後 に“ /bin/sh” の実行 ● 下記の記事が面白いです ● 説明は以上になります。

Slide 102

Slide 102 text

Pwn入門〜おわりに〜

Slide 103

Slide 103 text

個人的なテクニック(?) ● とにかく時間を掛けること ● 分からない命令があったらすぐに調べること – Google で調べる – その命令の直前にブレイクポイントを仕込み、どのような挙動 をするのか確かめると良い ● 諦めること – ある程度時間をかけても(最低でも 3 時間はかけると良さそ う)脆弱性がひとつも見つけられなかった場合は諦めて writeup を見るのが良い ● writeup (過去問の解説)を手を動かしながら読むこと

Slide 104

Slide 104 text

おすすめのサイト ● pwnable.tw – 自分はここで育ったのでおすすめです – 単純な脆弱性が多い気がします ● batalist – これで hard の問題を writeup を見ながら解くと新しい知識 が得られてよいです。 – 何を解けばいいか迷った時はこのリストの中から選ぼう! ● bataさんのスライド – 主に batalist に載っている問題の丁寧な解説があります

Slide 105

Slide 105 text

おすすめのサイト ● ももいろテクノロジー – 通称ももテク – 個々に書かれているテクはないというぐらい様々なテクニック がまとめられています。 ● Kernel exploit集 – Kernel Exploit に関する記事・動画などがまとめられていま す ● Twitter – プロによる writeup 情報や PoC などが流れてきます。