14
ret2libcpopretで初等的BOF攻撃 東海道らぐ 2016-02-20 @monochrojazz

ret2libcとpopretで初等的BOF攻撃

Embed Size (px)

Citation preview

Page 1: ret2libcとpopretで初等的BOF攻撃

ret2libcとpopretで初等的BOF攻撃東海道らぐ 2016-02-20

@monochrojazz

Page 2: ret2libcとpopretで初等的BOF攻撃

自己紹介のようなもの● @monochrojazz(27)● どこかの製造業でセキュリティっぽいことをやっているとかいないとか

● 致命的な音ゲーマー

● CTF(pwnable)を解いてみたい、が絶望的に初心者

コントローラをマイコンと導電布で自作アプリも自作(Android)

Page 3: ret2libcとpopretで初等的BOF攻撃

セキュリティ・・・。

● 「なぜ遠隔でPCを乗っ取ることができるのか」という原理に興味を持った

● 仕事でセキュリティっぽいことをしていることもありCTFなどを勉強(役には立たない模様)

● 「セキュリティコンテストチャレンジブック」がその勉強に割とよかった

● 今回はその内容を用いてUbuntuで簡単なBOF攻撃を実践。その内容を紹介。

個人的には良書

Page 4: ret2libcとpopretで初等的BOF攻撃

ltraceとstrace

● CTFにおいて遠隔でサーバの制御を奪う問題がpwnableと呼ばれるジャンル。

● 多くの場合攻撃先サーバで実行されているバイナリが配布される。

● 私の場合そのバイナリの種類をfileコマンドで特定してからltraceを実行する。

● ltraceで共有ライブラリの関数呼び出しをトレースする。

● 因みにstraceではシステムコールのトレースができる。

● ptraceというものもある。python東海で発表したので興味があれば。http://www.slideshare.net/monochrojazz/pythonptrace

Page 5: ret2libcとpopretで初等的BOF攻撃

ltraceとstracelsをltrace ライブラリ関数をトレース

-iオプションで実行中のアドレスを表示

libcライブラリ関数の引数と返値が表示される

ライブラリ関数を追うことでプログラムの動きが大雑把にわかる

Page 6: ret2libcとpopretで初等的BOF攻撃

BOF攻撃準備

● BOF脆弱性を持ったプログラムを自分で作る● リモートで攻撃するのは面倒なのでrootでsetuid属性を付与し、通常ユーザで実行してrootシェルを起動することを目的とする

Page 7: ret2libcとpopretで初等的BOF攻撃

BOF攻撃準備

スタック防護だけは外してコンパイル(スタック実行不能[NXbit]は継続)gcc -m32 -fno-stack-protector bof.c -o bof再現性のためASLRも外すecho 0 | sudo tee /proc/sys/kernel/randomize_va_space

実験用プログラム引数をstrcpyするだけ参考用にアドレスをprintfなどしている

Page 8: ret2libcとpopretで初等的BOF攻撃

まずぶっ壊す● 引数にAAAAAAA・・・・は当然の権利● ltraceで経過を追跡

実行アドレスが「AAAA」になっている→制御を任意のアドレスに飛ばせる

引数を用意してlibcのsystem関数のアドレスに飛ばせば攻撃成功

Page 9: ret2libcとpopretで初等的BOF攻撃

そして飛ばす

● system関数のアドレスをgdb-pedaで特定

ここへとばす

Page 10: ret2libcとpopretで初等的BOF攻撃

で、シェルを起動

strcpy引数のコピ一先アドレスからsystemの引数(/bin/sh)の位置を計算0x0804a025+28+12

system実行後リターンアドレス

system関数アドレス

奪うリターンアドレスの位置はAAAABBBBCCCC・・・と入力して計算

シェル起動成功注)ltraceしているとrootにはならないでも異常終了

Page 11: ret2libcとpopretで初等的BOF攻撃

popret

● 折角なのでシェル起動後exitを実行してクラッシュを回避してみる

● popretでさっき使った引数をpopしてから2つ目の関数を実行する

● rp++というpopret gadgetを探すツールを利用

使う引数分popする

Page 12: ret2libcとpopretで初等的BOF攻撃

これが最終形

system実行後popret

systemの引数:popされてスタックから消える

exitのアドレス

BBBB:exit実行後のリターンアドレス(不使用)CCCC:exitの引数(不使用)

root奪取に成功、クラッシュなし

systemのアドレス

ret2libcとpopretでlibc関数を複数実行可能つまりsocket→connect→dup2→systemでバックドアを作ることも可能なはず

可能なら実演やります

Page 13: ret2libcとpopretで初等的BOF攻撃

意気揚々とCTFに挑戦

● 即死● スタック防護を抜けられない

● そもそもlibcがリンクされていない

● CTF難しい(結論)静的リンクもされてない

Page 14: ret2libcとpopretで初等的BOF攻撃

最近困っていること

● RaspberyPi(B+)から2へ移行したい● upgradeしてカードを2へ差したが動かない● (虹色の画面表示から音沙汰なし)

● カードそのままで初代では動く、RaspberryPi基板を換えても動かない