ステップ1: Pwn とは|Tech Book Zone Manatee

マナティ

セキュリティコンテストチャレンジブック

ステップ1: Pwn とは

書籍『セキュリティコンテストチャレンジブック』はCTFで戦うために必要となる情報技術の基本や注意点をわかりやすく解説しています。この連載では立ち読みとして、同書の2章「pwn」の記事を一部掲載します!

はじめに

セキュリティコンテストではどんな問題が出題されるのか、書籍セキュリティコンテストチャレンジブックではCTF:Capture The Flag、旗取り合戦と呼ばれるセキュリティ競技で戦うために必要となる情報技術の基本や注意点をわかりやすく解説しています。

この連載では同書の中から2章「pwn」の記事より2.1~2.3節を掲載していきます!

セキュリティコンテスト参加してみたいと思う方に朗報、日本時間の2016年12月10日(土)15時から11日(日)15時までSECCON 2016 オンライン予選が開催されます。

SECCON 2016 オンライン予選

SECCON 2016で唯一の社会人の方でも参加できる予選ですから、本連載や書籍で興味をもった方はぜひチャレンジしてみてください。

※SECCON 2016 オンライン予選は終了しました

書籍ではほかにも「バイナリ解析」「ネットワーク」「Web問題」「SQLインジェクション」の競技を取り上げています。

マナティで購入できる電子書籍は

「利便性の高いダウンロードPDF」「ソーシャルDRMを採用:個人利用の範囲内であればコピー可能」

です!興味ありましたらぜひお買い求めいただけますと幸いです。

ステップ1: Pwnable とは

1.1 "Pwnable" の由来と意味

"Pwnable" という言葉はオンラインゲームのユーザーが "own" を "pwn" にミスタイプしたことから生まれ、「勝つ」や「打ち負かす」といった意味のスラングとして定着しました。CTFにおいては、問題を攻略してサーバーの権限を得る、といった手順を踏んだ問題が "Pwnable", "Pwn", "Exploit" というジャンルに分類されています。以降本章では一番短く意味の伝わる "Pwn" という言葉を使って解説を進めます。

1.2 Pwn 問題の流れ

大まかに Pwn の問題は次の手順で取り組みます。

1. 環境を調べる (下調べ)
2. 脆弱性を探す
3. エクスプロイト
4. シェル奪取もしくはフラグ読み出し

本章でも、おおまかにこの流れに沿って進めていきます。

1.3 ツールの紹介

Pwn 問題は Reversing 問題の延長でもあるため、バイナリ解析の章で紹介したツールは Pwn の問題を解く上でも役立ちます。ここでは、それに加えて Pwn の問題を解くときによく用いられるツールを紹介します。

■ checksec.sh

slimm609/checksec.sh ( https://github.com/slimm609/checksec.sh )

checksec.sh は実行ファイルが備えているセキュリティ機構を読みやすい形式で表示してくれるシェルスクリプトです。

下調べのステップで行う RELRO, SSP, NX bit の確認に使います。

■ peda

longld/peda ( https://github.com/longld/peda )

pedaを使って解析を行っている様子
※掲載画像はクリックで拡大できます(以降の図も同様)

peda は、 gdb の機能を大幅に強化してくれる拡張スクリプトです。

デバッグ情報表示の強化、簡易 ROP Gadgets 検索、メモリ検索の強化など、 Pwn の問題を解くときにあると便利な機能が数多く実装されています。この章で Pwn の問題を解くために gdb を使うときは peda が導入されているものとして解説しますので、是非導入しておきましょう。

しかし残念ながら longld/peda は Python3 に対応していないため、最新の gdb 環境では利用することができません。一部動作が不完全ですが、 longld/peda を fork して Python3 に対応させた peda があるため本書ではそちらを利用します。執筆時点では一部機能がうまく動かず代替の手段を用いている箇所があるため、自身で gdb をコンパイルして Python2 と連携させることができる方はそちらをおすすめします。

Python3 対応の peda はいくつかありますが、本書では zachriggle/peda を使います。

zachriggle/peda ( https://github.com/zachriggle/peda )

peda の便利コマンド
pdissassemble (pdisas) コードハイライトされた逆アセンブル結果を出力します。
ropgadget ROP を行うときに便利な gadget を表示します。 (残念ながら執筆時点で zachriggle/peda ではうまく動きません)
pattern バッファオーバーフローしたときにどの部分がレジスタに代入されているか等を調べることができます。
vmmap 実行中のアプリケーションがメモリ領域をどのように確保しているかを表示します。

■ rp++

0vercl0k/rp ( https://github.com/0vercl0k/rp )

実行ファイル中に存在する ROP Gadget を表示します。逆アセンブル結果を見て探すのとは異なり、命令の一部分を切り取った gadget も表示してくれます。

rp++を実行したときの様子

■ socat

socat - Multipurpose relay ( http://www.dest-unreach.org/socat/ )

Pwn の問題の多くは指定されたホストとポートに接続して解くリモートエクスプロイトと呼ばれる形式になります。 socat はそのような環境を手元で再現するときに非常に強力なツールとなります。

socat を使って 4000 番ポートに接続した時に binary ファイルを立ち上げるには、

$ socat TCP-LISTEN:4000 EXEC:"./binary"

のようにします。あとは普通に netcat 等で localhost:4000 にアクセスすると接続先で binary が実行され、あたかも普通にバイナリを実行したかのように対話的に操作することができます。また多くの場合、ソケットの再利用と複数接続を許すために reuseaddrfork のオプションをつけて

$ socat TCP-LISTEN:4000,reuseaddr,fork EXEC:"./binary"

の形で実行します。

■ pwntools

Pwntools by Gallopsled ( http://pwntools.com/ )

Gallopsled という CTF チームが問題を解くときに使っている Python ライブラリを公開しています。簡単にリモートサーバに接続できる機能から ROP を簡単に構築できる機能まで、非常に多くの機能が実装されています。

1.4 実行環境

この章では次のような実行環境下で作業します。その他の環境で進める場合はコマンドを適宜読み替えてください。

・ OS: Ubuntu 14.04 LTS x86_64

[実行したコマンド]

$ sudo apt-get install build-essential gcc-multilib git gdb nasm libc6:i386
$ git clone https://github.com/zachriggle/peda.git ~/peda
$ echo "source ~/peda/peda.py" >> ~/.gdbinit
$ export PATH=$HOME/bin:$PATH
$ mkdir $HOME/bin
$ wget https://github.com/downloads/0vercl0k/rp/rp-lin-x64 -O $HOME/bin/rp
$ chmod +x $HOME/bin/rp
$ wget https://github.com/slimm609/checksec.sh/archive/1.6.tar.gz
$ tar zxvf 1.6.tar.gz
$ cp checksec.sh-1.6/checksec $HOME/bin/checksec.sh

著者プロフィール

SECCON実行委員会/CTF for ビギナーズ(著者)
コンピュータセキュリティ技術を競う競技であるCTF (Capture The Flag) の初心者を対象とした勉強会。CTFに必要な知識を学ぶ専門講義と実際に問題に挑戦してCTFを体験してもらう演習を行っている。