Use After Free 脆弱性攻撃を試す

1,503 views

Published on

Use After Free 脆弱性攻撃をコピペで試す
セキュリティ初心者の備忘録ノート

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,503
On SlideShare
0
From Embeds
0
Number of Embeds
29
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Use After Free 脆弱性攻撃を試す

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

×
Save this presentationTap To Close