日々のあれこれφ(..)

もっぱら壁打ち

CTF入門した

2週間くらい前からCTFを始めました。

CTFとは

Catcher The Flagの略で、相手の陣地にある旗を先取するゲームです。サバゲやeスポーツなどでも出てくる用語ですが私が始めたのはセキュリティ競技CTFです。

セキュリティ競技CTFでは、情報セキュリティの知識を駆使してお題を解いて解答(フラグ)を入手していきます。クイズ形式以外にもチームを組んで相手チームのサーバに侵入して旗を取るなど色々形式はあります。

興味を持ったはいいが周りでやっている人もいなかったので取っ掛かりが掴めなかった私ですが、きなこもちさんのブログが参考になりました!

CTF初心者が考えるCTF入門 - きなこもち。

入門としてやったこと

CpawCTF

  • 大学のプログラミングサークル運営
  • 問題数全23問ほど

少しのググり力で解けるLv.1の問題から、若干ひねってきたLv.2、自力で解けずに諦めて解説を探しにいくLv.3、といった感じでした。まさに入門者にはちょうどいい難易度で普通に楽しめました。

私が全問題解き終わった数日後くらいに証明書が切れてアクセスできない状態が続くようになったのですが、復活するといいな。

picoCTF

中高生向けといいつつ、難しい問題は普通に難しいです。 問題数が多いので今回はジャンルごとに解いていくことにし、今の時点で私はWebアプリケーションを題材にしたWeb Exploitionというジャンルの問題を全13問一通り解き終わったところです。ソース見ればパッと答えが分かるような簡単過ぎる問題から、ちょっとしたバイナリの知識が求められるやや難しいものまであり、とても充実していました。

入門〜初級レベルの問題で使えるテクニック

問題を解く中で知った小技を共有します。問題のネタバレはここでは含まないようにします。

Chrome Developper Tool

「右クリック > 拡張」 で開く、webサービスの開発には欠かせないデバッグツールです。

Cookieを編集する

やり方を調べると拡張機能を使ったものが多く紹介されていましたが、拡張機能を入れなくてもdevtoolでできました。

(写真は問題関係ないページを開いた時のものです)

f:id:reiichii:20201031230238p:plain

Networkの通信を確認する

この画面を開いた状態でページを開くと、他のサイトとどのような通信を行なっているのかが記録されるページです。ページ遷移の最中に実は一瞬だけ別のサイトにリダイレクトしていたり、リクエストヘッダーやボディの中を確認したりなど、何かと使いました。

f:id:reiichii:20201101114432p:plain

debugger

Web系の問題にはJavaScriptを用いた問題も多く出されます。debuggerで変数の中身を確認したり、コードをいじったりなどして調査するのに欠かせません。

f:id:reiichii:20201101115008p:plain

tshark

ネットワーク系の問題ではパケットキャプチャのファイルを渡されて、そこからフラグを探しに行くことが多いです。 tsharkかもしくはwebアプリ版のwiresharkを使ってパケットキャプチャを読めるようにしていきます。

$ tshark -r test.pcap
    1   0.000000 192.168.1.114 → 192.168.1.1  DNS 77 Standard query 0x504d A q28.ctf.cpaw.site
    2   0.001660  192.168.1.1 → 192.168.1.114 DNS 126 Standard query response 0x504d A q28.ctf.cpaw.site CNAME host1.ctf.cpaw.site A 157.7.52.186
    3   2.380278 192.168.1.114 → 157.7.52.186 TCP 78 52852 → 21 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=8 TSval=246798505 TSecr=0 SACK_PERM=1
    4   2.404144 157.7.52.186 → 192.168.1.114 TCP 74 21 → 52852 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=444760454 TSecr=246798505 WS=128
    5   2.404244 192.168.1.114 → 157.7.52.186 TCP 66 52852 → 21 [ACK] Seq=1 Ack=1 Win=131768 Len=0 TSval=246798529 TSecr=444760454

また対応するプロトコルでダウンロードしたファイルの復元も行えます。

問題の中ではパケットキャプチャからhtml,css,jsのファイルを復元してフラグを探すものなどもありました。

$ tshark -r hoge.pcap --export-objects http,/path/to/cpaw

fileコマンド

Binary Exploitation(バイナリ解析)系の問題ではよく分からないファイルを渡されるところから始まりますが、だいたい最初はfileコマンドで実行環境を確認するところから始めることが多かったです。

$ file hoge
hoge: tcpdump capture file (little-endian) - version 0.0, capture length 1869357413)

この場合hogeというファイルがtcpdump capture fileであることが分かります。

stringsコマンド

Binary Exploitation(バイナリ解析)入門その2。バイナリファイルの読める部分を抽出してくれるコマンドです。そんなコマンドあるのかと初めて知って驚きました。このコマンドを実行してうっすら答えが見えてくるような問題もあったのですが、本当に入門レベルの問題だけなんだろうなという気がしますね。

$ strings hoge
a``d
a``Pyr`5
~un6+
JGBFz
rd=h5
00pV
>7 n

一番有名なsqlインジェクション

' OR 1=1 --

例えばログイン名とパスワードを入力するフォームがあるとします。

サーバサイドで入力値を適切にエスケープ処理がされていない以下のようなコードがあった場合、裏側で意図しないsqlが発行されてしまいます。

サーバサイドのコード: SELECT * FROM user WHERE name='%s' AND password = '%s'

[本来のユースケース] ユーザー名: piyoko パスワード: hghghghghghg と入力した場合

SELECT * FROM user WHERE name='piyoko' AND password = 'hghghghghghg'

ユーザー名とパスワードで検索をかけ、該当するデータが存在した場合入力情報が適切とみなされてログインができます。

[悪用された場合] ユーザー名: ' OR 1=1 -- パスワード: (てきとうな文字列)

  • ' : 最初の閉じ括弧でname = '' を終わらせる
  • OR 1=1 : 任意のsqlを入れられる。この場合はpasswordの代わりにWHERE条件が必ずマッチするように1=1が入れられている
  • -- : これ以降のsqlをコメントとして無効にする。この例の場合 password一致が無効になる

SELECT * FROM user WHERE name='' OR 1=1 -- AND password =

と言った形でログイン情報を知らない人にもログインが行われてしまいます。

上記のような考え方を応用した問題がwebジャンルでは出題されます。

gdb

書いておいて何ですが、Reversing(リバースエンジニアリング)系の問題に関しては、知識が無さすぎて入門に立てていないです。 コマンドを実行しながら解説を辿っても、中々解説者と同じ思考回路を辿れません...。(そもそも逆アセンブリという言葉をはじめて知った。)

おわりに

ひとまずpicoCTFの他のジャンルに手を広げつつ、来年にはビギナーズコンテストなどにもチャレンジできたらいいなと思っています。