KernelのExploit楽しいな

E07887f3d78b19948b0585bcedfc15a2?s=47 megumish
October 29, 2017

 KernelのExploit楽しいな

KernelのExploitについてちょっと調べてみたよという話。

E07887f3d78b19948b0585bcedfc15a2?s=128

megumish

October 29, 2017
Tweet

Transcript

  1. 3.

    自己紹介 • CTF ではとくに Pwn ( Exploit )が好き – Pwn

    はそこそこできる。 • 去年の SECCON2016 (12月)から本格的に始めた – それまでは中長期型の競プロをよくやっていた • 低レイヤは Pwn 以外何もわからないので頓珍漢なことを 言っていたら指摘してください
  2. 5.

    Pwn(Exploit) とは? • サーバーを攻撃して、その制御を奪う部門 • 制御を奪うとは – /bin/sh のようなシェルの実行 –

    Windows では cmd.exe や powershell.exe の実行 – 要は任意の OS コマンドを実行できる状態にするのが Pwn
  3. 6.

    Pwn(Exploit) とは? • サーバーを攻撃して、その制御を奪う部門 • 制御を奪うとは – /bin/sh のようなシェルの実行 –

    Windows では cmd.exe や powershell.exe の実行 – 要は任意の OS コマンドを実行できる状態にするのが Pwn
  4. 7.

    Pwn(Exploit) とは? • サーバーを攻撃して、その制御を奪う部門 • 制御を奪うとは – /bin/sh のようなシェルの実行 –

    Windows では cmd.exe や powershell.exe の実行 – 要は任意の OS コマンドを実行できる状態にするのが Pwn • これをするためにユーザーランドでのメモリ改変を行う
  5. 8.

    Kernel Exploit とは? • root 権限に昇格した後に制御を奪う。 • root 権限に昇格するには –

    カーネルランドの関数の実行 – commit_creds(prepare_kernel_cred(NULL)) を実行す ると root 権限が手に入る
  6. 9.

    Kernel Exploit とは? • root 権限に昇格した後に制御を奪う • root 権限に昇格するには –

    カーネルランドの関数の実行 – commit_creds(prepare_kernel_cred(NULL)) を実行す ると root 権限が手に入る • カーネルランドでのメモリ改変を行う
  7. 11.

    ユーザーランドとカーネルランド • ユーザーランドはカーネルランドの機能を利用 – システムコールを使用 – read 、 write 、

    ioctl など • カーネルランドはユーザーランドのメモリをコピー – _copy_from_user() を使用
  8. 12.

    ユーザーランドとカーネルランド • ユーザーランドはカーネルランドの機能を利用 – システムコールを使用 – read 、 write 、

    ioctl など • カーネルランドはユーザーランドのメモリをコピー – デバイスでは _copy_from_user() を使用
  9. 13.

    ユーザーランドとカーネルランド • ユーザーランドはカーネルランドの機能を利用 – システムコールを使用 – read 、 write 、

    ioctl など • カーネルランドはユーザーランドのメモリをコピー – デバイスでは _copy_from_user() を使用 • これらを利用すればカーネルランドのメモリを改変するこ とが出来そう
  10. 15.

    Exploit! • どうやって Exploit コードを送り込むか( CTF ) • 何らかの方法で実行ファイルを送る –

    利用できる port がありそうなら nc コマンドで送り込む • nc -lp 10024 > exploit • cat exploit | nc remote 10024 – gunzip と base64 が使えそうなら gzip 圧縮した後 base64 エンコードして送り込む • gzip -kf exploit && base64 exploit.gz • cat << EOF | base64 -d | gunzip - > exploit
  11. 16.

    Exploit 時の注意点 • 実行ファイルは static なバイナリにすること • ただし glibc などを使ったバイナリにしてしまうと巨大になって

    しまい扱いにくい – C 言語とアセンブラ(システムコール呼び出しなど)を駆使する • カーネルランドのセキュリティ機構 – SMEP • カーネルランドでユーザーランドのコードが実行できない – KADR • カーネルランドのアドレスが表示されない – KASLR • カーネルランドのアドレスがランダマイズされる
  12. 17.

    おわりに • 現在 Kernel Exploit の問題を作成中 – カーネルの設定・ビルドとかカーネルモジュールの作成とか未 経験のことばかりで難しい –

    でも基本は普通の Pwn と変わらない感じがします • バッファーオーバーフローはそのまま ROP につなげそうで すし • kmalloc は glibc の malloc と比べると単純そう(本当 か?) – Kernel の Exploit 楽しいな (575)