○○大学の本当にあった怖い話
Upcoming SlideShare
Loading in...5
×
 

○○大学の本当にあった怖い話

on

  • 467 views

 

Statistics

Views

Total Views
467
Views on SlideShare
467
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

○○大学の本当にあった怖い話 ○○大学の本当にあった怖い話 Presentation Transcript

  • Auther:idkqh7
  • 自己紹介 }  脆弱性攻撃の基本 }  ○○大学の本当にあった怖い話 } 
  • 名前:idkqh7 経歴:ニートしてたら大学へ 専門:バイオインフォマティクス 趣味:プログラミングと解析
  • }  講義で共用のパソコンを使っていた }  保守契約の関係で放置され続ける脆弱 性があった }  $apt-get install ○○が使いたかった。 }  教授に許可だけはもらえた ※パソコンの入れ替えに伴い、バグはFixさ れています
  •   セキュリティホールを利用して 本来ならばありえない動作 をさせるコードのこと。   これらはセキュリティホールの検証コードとしてアプ リやソースコードの形で一般に配布されている。
  • ただのバグだから 「よく分からないけどアプリが強制終了する!」 ときには同じ原因によるときも…… 「サーバーのルートとられた!!!」
  • セキュリティホールを利用した攻撃 }  バッファオーバーフロー攻撃(バッファのバグ) }  フォーマット文字列攻撃(書式のバグ) }  ダングリングポインタ攻撃(ポインタのバグ) モニタリングによる攻撃 ¨  スニッフィング(パケットキャプチャリング) ¨  キーロガー(キーロギング)
  • CVE-2009-2692   The Linux kernel 2.6.0 through 2.6.30.4, and 2.4.4 through 2.4.37.4, does not initialize all function pointers for socket operations in proto_ops structures, which allows local users to trigger a NULL pointer dereference and gain privileges by using mmap to map page zero, placing arbitrary code on this page, and then invoking an unavailable operation, as demonstrated by the sendpage operation (sock_sendpage function) on a PF_PPPOX socket. } 
  • proto_ops構造体(プロセス同士で通信を行うための 構造体)に関数ポインタが存在するんだけど、ある方 法でアクセスするとポインタを初期化せずに(NULLポ インタ)使える(デリファレンス)らしいよ。  そこから mmap()関数でメモリの領域を取って(プロ グラムの書き込める領域をメモリ上に確保)その中に やばいコードを書くとrootとられちゃうよ。 NULLポインタの確認もしないクソ野郎は sock_sendpage関数です。本当にありがとうござい ました。
  • struct roto_ p ops { int f iy; am l struct odul m e *ow ner; int ( ease) *rel ( struct ocket sock) s * ; int ( nd) *bi (struct ocket sock, s * struct ockaddr m yaddr, s * int ockaddr_en) s l ; int ( *connect) ( struct ocket sock, s * struct ockaddr vaddr, s * int ockaddr_en,int l ; s l fags) int ( *socketpai (struct ocket sock1, r) s * struct ocket sock2) s * ; int ( *accept) (struct ocket sock, s * struct ocket new sock,int l ; s * fags) .. . } ;
  • }  rootを取るってどういうこと? }  NULLポインタデリファレンスでどうなるの?
  • #include <unistd.h> #include <stdlib.h> int main(void) { setuid(0); system("/bin/sh"); //ファイル所有者の権限でコマンドを実行 //シェルの呼び出し return 0; } System()はシステム・ コールであるexecve() のWrapper関数
  • ファイル所有者の権限でプログラムを実行する機能。 使い方 >chmod 4711 hogehoge user s-bit(4000) が立っているコマンドはそのファ イル所有者の権限で実行 (setuid) される。 →所有者をrootにすればrootの権限で実行できる! 普通SetUIDは一般ユーザーに一時的に特権を与 えるために使う物。
  • }  }  }  Linux のプロセスは、task 構造体で表現されている task 構造体にはプロセスが使用するさまざまな情報がある cred構造体はuid、gid、groups 等の資格情報を表す
  • struct cred { atom i c_t usage; ui d_t ui /* realU I of the task */ d; D gi d_t gi /* realG I of the task */ d; D ui d_t sui /* saved U I of the task */ d; D gi d_t sgi /* saved G I of the task */ d; D ui d_t eui /* effecti U I of the task */ d; ve D gi d_t egi /* effecti G I of the task */ d; ve D .. . struct user_struct *user; /* realuser I subscri on */ D pti struct group_i *group_i /* suppl entary groups for eui nfo nfo; em d/fsgi */ d .. . } ;
  • #include <unistd.h> #include <stdlib.h> int main(void) { setuid(0); system("/bin/sh"); //ファイル所有者の権限でコマンドを実行 //シェルの呼び出し return 0; } System()はシステム・ コールであるexecve() のWrapper関数
  • 前提:所有者がrootのとき、 SetUID(0)を実行 euid(effective uid) = 0(root) つまり、 SetUID(0)のやっていることは、自プロセス cred構造体のeuid部分を書き換えているだけ。 Credを操れるならば権限は無法地帯
  • return sock->ops->sendpage(sock, page, offset, size, flags); #include <unistd.h> #include <stdlib.h> int main(void) { setuid(0); //ファイル所有者の権限でコマンドを実行 system("/bin/sh"); //シェルの呼び出し return 0; } NULLポインタデリファレンスをうまく使うと、上記コードが実行できる!!!
  • sock_sendpage()関数は return sock->ops->sendpage(sock, page, offset, size, flags); といきなり書いていた。 if (unlikely(!sock->ops->sendpage))  return -EINVAL; このようにすれば関数ポインタの初期化はチェックされてい たはず。
  • NULLポインタ=どのアドレスも指していないポインタ 簡単に言うと、初期化していないポインタ。 ((void *)0) …NULLポインタ定数(定義) これをデリファレンスすると…… *((void*)0) ⇔ *0 アドレスの0番値を指定することになる 【デリファレンスとは】 }  ポインタが指し示す内容を得ること }  間接参照・参照外しとも訳される }  C言語でいうところのコイツ→* NULLポインタを用いると0番地のアドレス内容 にアクセス可能となる (アクセス違反などで強制終了する原因にも) バグの原因!
  • 1.  2.  mmap関数 を使って、 0 番地に権限昇格コード を仕込んでおく。 まちがって NULL ポインタを関数ポインタとして デリファレンス すると、その権限昇格コードが実行 される。 管理者権限でメシウマ状態!
  •  mmap関数を用いて新規アドレス空間を作成 ↓ 0 番地に権限昇格コードを仕込んでおく。 ↓ ヌルポインターでガッ! ↓ 特権プログラムからシェルを起動 実装するのは言うほど 簡単じゃない!
  • ソースコードが読解できなくても普通です。 Exploitのソースコードはかなり特殊(低レイヤー操作) な部類に入るので、初見ではまず理解できない。 }  AndroidOSのrootハックでも同じ脆弱性が使われた
  • ※繰り返しになりますが、パソコンの入れ替えに 伴いバグはFixされています 取り敢えず >sudo apt-get install sl }             ====                ________                                ___________      _D  _|    |_______/                __I_I_____===__|_________|        |(_)---    |      H________/  |      |                =|___  ___|            _________________          /          |    |      H    |    |          |      |                  ||_|  |_||          _|                                _____A      |            |    |      H    |__--------------------|  [___]  |      =|                                                |      |  ________|___H__/__|_____/[][]~_______|              |      -|                                                |      |/  |      |-----------I_____I  [][]  []    D      |=======|____|________________________|_   __/  =|  o  |=-~~    /~~    /~~    /~~  ____Y___________|__|__________________________|_    |/-=|___||        ||        ||        ||        |_____/~___/                    |_D__D__D_|    |_D__D__D_|      _/            __/    __/    __/    __/            _/                              _/      _/        _/      _/   A. ぬるぽ→ガッ!