Upload
monochrojazz
View
1.437
Download
0
Embed Size (px)
Citation preview
ret2libcとpopretで初等的BOF攻撃東海道らぐ 2016-02-20
@monochrojazz
自己紹介のようなもの● @monochrojazz(27)● どこかの製造業でセキュリティっぽいことをやっているとかいないとか
● 致命的な音ゲーマー
● CTF(pwnable)を解いてみたい、が絶望的に初心者
コントローラをマイコンと導電布で自作アプリも自作(Android)
セキュリティ・・・。
● 「なぜ遠隔でPCを乗っ取ることができるのか」という原理に興味を持った
● 仕事でセキュリティっぽいことをしていることもありCTFなどを勉強(役には立たない模様)
● 「セキュリティコンテストチャレンジブック」がその勉強に割とよかった
● 今回はその内容を用いてUbuntuで簡単なBOF攻撃を実践。その内容を紹介。
個人的には良書
ltraceとstrace
● CTFにおいて遠隔でサーバの制御を奪う問題がpwnableと呼ばれるジャンル。
● 多くの場合攻撃先サーバで実行されているバイナリが配布される。
● 私の場合そのバイナリの種類をfileコマンドで特定してからltraceを実行する。
● ltraceで共有ライブラリの関数呼び出しをトレースする。
● 因みにstraceではシステムコールのトレースができる。
● ptraceというものもある。python東海で発表したので興味があれば。http://www.slideshare.net/monochrojazz/pythonptrace
ltraceとstracelsをltrace ライブラリ関数をトレース
-iオプションで実行中のアドレスを表示
libcライブラリ関数の引数と返値が表示される
ライブラリ関数を追うことでプログラムの動きが大雑把にわかる
BOF攻撃準備
● BOF脆弱性を持ったプログラムを自分で作る● リモートで攻撃するのは面倒なのでrootでsetuid属性を付与し、通常ユーザで実行してrootシェルを起動することを目的とする
BOF攻撃準備
スタック防護だけは外してコンパイル(スタック実行不能[NXbit]は継続)gcc -m32 -fno-stack-protector bof.c -o bof再現性のためASLRも外すecho 0 | sudo tee /proc/sys/kernel/randomize_va_space
実験用プログラム引数をstrcpyするだけ参考用にアドレスをprintfなどしている
まずぶっ壊す● 引数にAAAAAAA・・・・は当然の権利● ltraceで経過を追跡
実行アドレスが「AAAA」になっている→制御を任意のアドレスに飛ばせる
引数を用意してlibcのsystem関数のアドレスに飛ばせば攻撃成功
そして飛ばす
● system関数のアドレスをgdb-pedaで特定
ここへとばす
で、シェルを起動
strcpy引数のコピ一先アドレスからsystemの引数(/bin/sh)の位置を計算0x0804a025+28+12
system実行後リターンアドレス
system関数アドレス
奪うリターンアドレスの位置はAAAABBBBCCCC・・・と入力して計算
シェル起動成功注)ltraceしているとrootにはならないでも異常終了
popret
● 折角なのでシェル起動後exitを実行してクラッシュを回避してみる
● popretでさっき使った引数をpopしてから2つ目の関数を実行する
● rp++というpopret gadgetを探すツールを利用
使う引数分popする
これが最終形
system実行後popret
systemの引数:popされてスタックから消える
exitのアドレス
BBBB:exit実行後のリターンアドレス(不使用)CCCC:exitの引数(不使用)
root奪取に成功、クラッシュなし
systemのアドレス
ret2libcとpopretでlibc関数を複数実行可能つまりsocket→connect→dup2→systemでバックドアを作ることも可能なはず
可能なら実演やります
意気揚々とCTFに挑戦
● 即死● スタック防護を抜けられない
● そもそもlibcがリンクされていない
● CTF難しい(結論)静的リンクもされてない
最近困っていること
● RaspberyPi(B+)から2へ移行したい● upgradeしてカードを2へ差したが動かない● (虹色の画面表示から音沙汰なし)
● カードそのままで初代では動く、RaspberryPi基板を換えても動かない