SharkyCTF Writeup
2020/5/9~行なわれていたSharkyCTFのwriteup。
772ptで263位。 修行が足りなさすぎる(´;ω;`)
- Forensics - Romance Dawn (82pt)
- Stego - basic LSB (50pts)
- WEB - XXExternalXX (70pt)
- WEB - LOGS IN! PART 1 (155pt)
- Misc - Trolled (50pts)
- NETWORK - RattataTACACS (167pts)
- REVERSE - z 3 r o b o t w a v e s (188pts)
- まとめ
Forensics - Romance Dawn (82pt)
pngファイルが与えられますが、ファイルが壊れています。
pngcheckでファイルを確認します。
エラーが出てますね。
pngの必須チャンクである、IDATチャンクが存在せず、EASYという謎のチャンクが存在しています。
PNGのファイルフォーマットの一覧を見てもEASYというチャンクは存在しません。
EASYチャンク = IDATチャンクなのでは?という仮説を立て、検証しました。
IDATチャンクではチャンクタイプ前4バイトにチャンクデータのサイズが格納されているので、それをチェックしてみます。
最初に現れるEASYチャンクは0x88バイトです。
そこの前4バイトは2000という表記になっているので、0x2000バイトぶんイメージデータが格納されています。
起点をChunk Data Lengthとすると、
Chunk Data Length(4バイト) + Chunk Type(4バイト) + CunkData(0x2000バイト) + CRC(4バイト) = 0x200C
0x200Cバイト先を確認すると、ちょうどChunk Data Lengthが存在していたので、これがIDATっぽいです。
EASYとなっているChunk Typeを IDAT に変更します。
変更するとファイルが正常に見れるようになりフラグとなります。
Stego - basic LSB (50pts)
kawaiiねこちゃんの画像が渡されます。
とりあえずstegonlineにぶちこみます。
画像の各色のLSBイメージをチェックした後、文字列出力するとフラグがありました。
WEB - XXExternalXX (70pt)
なんかxmlを読み込んで画面に出すプラットフォームっぽいです。
説明文では /flag.txt にフラグが隠されてるとのこと。
名前からして怪しいのでXXEを試してみました。
まずは、表示しているxmlファイルの構造をチェックします。
rootの下にdata要素があってその中にコンテンツがありますね。OKです。
いろいろ調べてたらサイト自体の脆弱性としてRFIとかディレクトリトラバーサルがありました。
ここではflagを得る手段として、自分が保有するwebサーバー上にXXE用のxmlファイルを配置し、それをRFIで読み取らせ、XXEを成功させてみました。
XXEを用いてflag.txtを読み取り、その内容をdata要素にぶち込むようなxmlファイルを作成します。
<?xml version="1.0"?><!DOCTYPE root [<!ENTITY test SYSTEM 'file:///flag.txt'>]><root><data>&test;</data></root>
というファイルを作成し、自分のWEBサーバーに格納しました。
URLをGETパラメーターに入れてあげればフラグゲットです
WEB - LOGS IN! PART 1 (155pt)
symfonyの画面が見えちゃってますね。
管理パネルをいろいろ突っついてみます。
WEBフレームワークだったらルーティング用のファイル見つけたらいいな~って思ってたら速攻見つけました。
アクセスしたらフラグゲット。
Misc - Trolled (50pts)
burpで拾えるよ
NETWORK - RattataTACACS (167pts)
パケットキャプチャのデータが渡されます。
中を見てみると、TFTPでciscoルーターのコンフィグを転送しているものとTACACS+というプロトコルで通信していることがわかります。
TACACS+はシスコ独自のプロトコルで、RADIUSっぽく使えるらしいです。
詳しくは以下。 NW機器結構触ってたけど使ったことないなあ。
TACACS+ではパケット全体をクライアント - サーバ間で共有鍵を用いて暗号化しているっぽいですね。
CISCOのコンフィグレーションにTACACSの認証設定が書いてあるはずなので覗いてみましょう!
WireSharkでTFTPで通信してたコンフィグをダンプします。
89行目にTACACSの認証設定が入ってます。
当然ながら、暗号鍵はハッシュ化されてますね。
オンラインツールでハッシュの解読にチャレンジします。
見事に平文にできました。
平文をWireSharkに食わせてTACACS+の通信内容を解読していきます
WireSharkの編集タブ > 設定を開き、ProtocolsでTACACS+を選択し、
先ほどの暗号鍵を入力し、OKをクリックします。
するとWireShark上でTACACS+の通信の平文を見ることができます。
パケットを見てくとフラグゲット
NW系のネタ好きなので解いてて楽しかったです。
REVERSE - z 3 r o b o t w a v e s (188pts)
ghidraで中身を見てみる。
check_flag関数で入力を見てます。
check_flag関数はこちら。
こーれは無理じゃないですかね…?
困ったのでangrを使ってみました。
初めて使ったんですが、マジでちゃんと動いてビビりました。
まずmain関数のアドレスをチェック。0x1337ですね。
次に目標とする到達地点のアドレス、失敗とみなすアドレスをチェック。
目標到達地点のアドレスは0x1413です。
失敗とみなすアドレスは0x142dとします。
では、angrで動かしてみます。
コードは以下。
import angr base = 0x400000 main = base + 0x1337 proj = angr.Project("./z3_robot", auto_load_libs=False) state = proj.factory.entry_state(addr=main) simgr = proj.factory.simulation_manager(state) good = base + 0x1413 bad = base + 0x142d simgr.explore(find=good, avoid=bad) result = simgr.found[0] for i in range(3): print(result.posix.dumps(i))
なんか10秒くらいで結果が返ってきます。 凄過ぎだろ。
というわけで cl4ss1c_z3___t0_st4rt_:) を実際に入力してみましょう!
フラグゲットですね!
まとめ
angr凄すぎん? 結果帰ってきたとき声出たよ
もっと修行して最強のインフラエンジニアになります。