16
Use After Free脆弱性攻撃を試す 東海道らぐ@豊橋 2016-04-23 @monochrojazz

Use After Free 脆弱性攻撃を試す

Embed Size (px)

Citation preview

Page 1: Use After Free 脆弱性攻撃を試す

Use After Free脆弱性攻撃を試す

東海道らぐ@豊橋 2016-04-23@monochrojazz

Page 2: Use After Free 脆弱性攻撃を試す

自己紹介のようなもの● @monochrojazz(27)● セキュリティに興味 が、初心者● 致命的な音ゲーマー

音ゲーコントローラを自作アプリも自作(Android)

Page 3: Use After Free 脆弱性攻撃を試す

前回

Page 4: Use After Free 脆弱性攻撃を試す

BOF攻撃でroot奪取

BOF実験で攻撃の考え方を習得(した気でいた)

Page 5: Use After Free 脆弱性攻撃を試す

しかし

Page 6: Use After Free 脆弱性攻撃を試す

BOF

UseAfterFree

脆弱性攻撃タイプの変遷

2006 2013

BOF 5%以下

http://www.atmarkit.co.jp/ait/articles/1409/22/news010.html

Page 7: Use After Free 脆弱性攻撃を試す

(; ^ω^)

Page 8: Use After Free 脆弱性攻撃を試す

BOF

UseAfterFree

脆弱性攻撃タイプの変遷

2006 2013

代わりにUseAfterFree 50%

http://www.atmarkit.co.jp/ait/articles/1409/22/news010.html

Page 9: Use After Free 脆弱性攻撃を試す

Use After Freeって?

・・・・・・0x084b018・・・・・・

1

ヒープに領域確保ポインタ型保存

2

・・・・・・0x084b018・・・・・・

領域解放

3

・・・・・・0x084b018・・・・・・

新たに領域確保

4・・・・・・0x41414141・・・・・・

領域に任意アドレスの書込

char *a

5・・・・・・0x41414141・・・・・・

ポインタ型を呼出任意アドレスへread/write

char *a

新規領域位置は一意

strcpy(a, argv[1])があれば任意アドレス書込など

Page 10: Use After Free 脆弱性攻撃を試す

Q.そんな都合のいい脆弱性ある?

A. ブラウザなど

Javascript攻撃コードサンプル

Javascriptは領域確保解放がユーザ側で自由に可能

ブラウザ脆弱性を利用し悪性コードを動かせば制御を奪える

もちろんブラウザ側もsandboxなどでいろいろ対策を講じています

Page 11: Use After Free 脆弱性攻撃を試す

今回の目的

UseAfterFreeで任意アドレス書込printfをsystemに書き換えシェル起動

参考ていうかコピペ:use-after-freeによるGOT overwriteをやってみる http://inaz2.hatenablog.com/entry/2014/06/18/215452

Page 12: Use After Free 脆弱性攻撃を試す

今回のプログラム

領域確保

領域解放

新規領域確保

新規領域書込

UseAfterFree

書き換えターゲット

argv[2] 領域位置調整用argv[3] 書きこみたいアドレスargv[4] 書き込む内容

DEP,SSP有効でコンパイル(デフォルト)ASLR無効環境で実行

Page 13: Use After Free 脆弱性攻撃を試す

まずぶっ壊す

新規領域書込

UseAfterFree

解放済のポインタを呼出0x42424242(=”BBBB”)アドレスに”EEEE”を書込

BBBBとEEEEを変えれば任意アドレスへの任意入力可能

注)新規領域サイズ次第で     解放済領域の上書きは不可に

BBBBより後

Page 14: Use After Free 脆弱性攻撃を試す

GOT Overwriteprintf → systemに書き換えGOT Overwriteの利用

printfのGOT領域

このアドレスの先(printfの実体)の書き換え

printf 実行時に書き換えたアドレスに飛ぶ= systemのアドレスに飛ばせる

systemのアドレスはgdb-pedaやnm -D /lib/i386-linux-gnu/libc.so.6 | grep " system"などで調査

Page 15: Use After Free 脆弱性攻撃を試す

シェル起動

printfのGOT領域 system関数アドレス

argv[3] 書きこみたいアドレス = printf GOT領域argv[4] 書き込む内容 = systemアドレス

シェル起動成功

Page 16: Use After Free 脆弱性攻撃を試す

制御奪えてないけど?

UseAfterFreeは任意アドレス読み書きの手段

制御奪取は追加でStack Pivot

任意アドレスが読めればASLR回避も可能(アドレスリーク)

スタックポインタをヒープ領域(任意入力可)へ

→何でもできる

ランダムなlibcベースアドレスを読取その値から計算したアドレスに飛ばす