Upload
monochrojazz
View
609
Download
1
Embed Size (px)
Citation preview
Use After Free脆弱性攻撃を試す
東海道らぐ@豊橋 2016-04-23@monochrojazz
自己紹介のようなもの● @monochrojazz(27)● セキュリティに興味 が、初心者● 致命的な音ゲーマー
音ゲーコントローラを自作アプリも自作(Android)
前回
BOF攻撃でroot奪取
BOF実験で攻撃の考え方を習得(した気でいた)
しかし
BOF
UseAfterFree
脆弱性攻撃タイプの変遷
2006 2013
BOF 5%以下
http://www.atmarkit.co.jp/ait/articles/1409/22/news010.html
(; ^ω^)
BOF
UseAfterFree
脆弱性攻撃タイプの変遷
2006 2013
代わりにUseAfterFree 50%
http://www.atmarkit.co.jp/ait/articles/1409/22/news010.html
Use After Freeって?
・・・・・・0x084b018・・・・・・
1
ヒープに領域確保ポインタ型保存
2
・・・・・・0x084b018・・・・・・
領域解放
3
・・・・・・0x084b018・・・・・・
新たに領域確保
4・・・・・・0x41414141・・・・・・
領域に任意アドレスの書込
char *a
5・・・・・・0x41414141・・・・・・
ポインタ型を呼出任意アドレスへread/write
char *a
新規領域位置は一意
strcpy(a, argv[1])があれば任意アドレス書込など
Q.そんな都合のいい脆弱性ある?
A. ブラウザなど
Javascript攻撃コードサンプル
Javascriptは領域確保解放がユーザ側で自由に可能
ブラウザ脆弱性を利用し悪性コードを動かせば制御を奪える
もちろんブラウザ側もsandboxなどでいろいろ対策を講じています
今回の目的
UseAfterFreeで任意アドレス書込printfをsystemに書き換えシェル起動
参考ていうかコピペ:use-after-freeによるGOT overwriteをやってみる http://inaz2.hatenablog.com/entry/2014/06/18/215452
今回のプログラム
領域確保
領域解放
新規領域確保
新規領域書込
UseAfterFree
書き換えターゲット
argv[2] 領域位置調整用argv[3] 書きこみたいアドレスargv[4] 書き込む内容
DEP,SSP有効でコンパイル(デフォルト)ASLR無効環境で実行
まずぶっ壊す
新規領域書込
UseAfterFree
解放済のポインタを呼出0x42424242(=”BBBB”)アドレスに”EEEE”を書込
BBBBとEEEEを変えれば任意アドレスへの任意入力可能
注)新規領域サイズ次第で 解放済領域の上書きは不可に
BBBBより後
GOT Overwriteprintf → systemに書き換えGOT Overwriteの利用
printfのGOT領域
このアドレスの先(printfの実体)の書き換え
printf 実行時に書き換えたアドレスに飛ぶ= systemのアドレスに飛ばせる
systemのアドレスはgdb-pedaやnm -D /lib/i386-linux-gnu/libc.so.6 | grep " system"などで調査
シェル起動
printfのGOT領域 system関数アドレス
argv[3] 書きこみたいアドレス = printf GOT領域argv[4] 書き込む内容 = systemアドレス
シェル起動成功
制御奪えてないけど?
UseAfterFreeは任意アドレス読み書きの手段
制御奪取は追加でStack Pivot
任意アドレスが読めればASLR回避も可能(アドレスリーク)
スタックポインタをヒープ領域(任意入力可)へ
→何でもできる
ランダムなlibcベースアドレスを読取その値から計算したアドレスに飛ばす