InterKosenCTF の運営に参加しきれなかった話 (spaceship Write Up)
論文とか書いてるからこういうことになるんですよ(なお卒業
こんなん見たくないわって人はこちら:
furutsuki.hatenablog.com 主催の運営記録 ptr-yudai.hatenablog.com 作問者の運営記録 furutsuki.hatenablog.com 運営のWrite Up bitbucket.org 問題跡
InterKosenCTFとは
insecureチームで運営した2019/1/18 21:00:00 ~ 2019/1/20 21:00:00で開いていたOnline CTF. 当初私を除いた3人でやってたところ,ptr-yudaiの「Windows7のインストーラ貸して」から参加した. すべては研究室が私だけ違うのが悪い.
参加しきれなかったって?
要は問題を全く作らず,テストプレイもほとんどせず. 一応開催中は21:00 ~ 03:30の時間帯に運営として参加してたが居るだけな状況.
結果
総合
- 1位: Stereo Sky Town (4050[pt])
- 2位: Hirota Sora (2550[pt])
- 3位: KimchiPower (2550[pt])
高専
- 1位: proelbtn (1650[pt]) (総合7位)
- 2位: Jyoken (1450[pt]) (総合9位)
- 3位: 074m4K053n (1350[pt]) (総合10位)
すごいと思う. おめでとうございます! お疲れさまでした!
運営の役得
なんでこれって,みんながsubmitするフラグ見れるんですよ. 貴重な体験でなかなか面白かったです.
例えばこんなのがありました.
KOSENCTF{[A-Za-z0-9_\+\-&!?]+}
lights out : フラグ文字列の定義持ち出さないでKOSENCTF{kosen}
attack log : 誰かがやってくれると信じていたflag.startswith("KOSENCTF")
strengthened : その気持ちはわかるwindowsマシン欲しい!w
lights out : CTFやるときは必ずWindowsとLinuxが要るイメージMOMOKO is very cute
Rolling Triangle: やっぱり運営ってFLAGのsubmit覗いてるんかね?FRAG{you_are_seeing_an_illusion_of_the_text}
attack log : 違うCTFのFLAGが飛んできてそう
全体的に「もっとルールにフラグ文字列の定義あるから読んで」って思っていたりいなかったり.
これ見てるだけでも相当面白かったですが,まぁ深夜起きてるのはつらい.
問題の公式見解(Write up)
一問はテストプレイした,ゆるして
[InterKosenCTF|Cheat 200]spaceship
AndroidのAPKファイルが渡される. チートすると良さそう.
インストール
今回は実機に入れる(後々のことを考えて).
インストールはAPKを実機のファイラーから選んでも, adb install
でもOK.
実機のファイラーからの場合は必ず 提供元不明のアプリ を設定からOnにする.
入れたら立ち上げ
起動・動作確認
初回の立ち上げで名前を聞かれるので入力. その後,画面をタップしてゲーム開始.
ゲームを進めて,gameoverになるとこの画面になる.
タップするともう一回できる.
解析開始 (ネットワーク)
とりあえず通信していないか確認. エミュレータを使ってる人ならそのままWiresharkを使ってもらう. 今回はAndroid Studio縛りで.
設定
実機の場合は,開発者向けオプション(端末情報のビルド番号を8回くらい押したら有効化される)からWi-Fi詳細ログの有効化をOnにする.
あと,スマホをWi-Fi接続にする. データ通信回線ではパケットキャプチャできない.
パケットキャプチャ開始
で,Playストアから tPacketCapture をDL.
起動してCAPTURE
を選択.これでパケットキャプチャが開始される.
停止するときはVPN設定から. 歯車アイコンを押して削除を選択すると自動的に.pcapファイルが生成される.
キャプチャ中,Spaceship.apkでやること
- 新規ユーザーでアプリを開始(既に起動した場合はアプリデータを設定から削除しておく)
- 新規スコアをたたき出す
- gameoverになったらキャプチャ終了
キャプチャ後,Wiresharkにぶち込む
私の場合は/storage/emulated/0/Android/data/jp.co.taosoftware.android/packetcapture/files
の中に生成されている.
PCからは内部ストレージ/Android/data/jp.co.taosoftware.android/packetcapture/files
に相当する.
PCから直接アクセスできるのでこれをコピーして解析する.
解析結果
なんかあった.
この回のユーザー名はhogehogehoge
,gameover画面は以下.
どうやら,gameover画面で情報を送っているようなので詳細を確認.
この時はSPST\x15\x00\x00\x00\x0chogehogehoge
が送信されていた.
\x0c
はユーザー名の長さ,\x15\x00\x00\x00
はスコアっぽい.
というわけで,このIPアドレスに向けてスコアをねつ造する.
import socket host = '13.230.13.190' # ここは動的っぽい port = 11200 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((host, port)) client.sendall(b'SPSTAAAA\x0chogehogehoge') print(client.recv(1024))
出力: b'{"response":"KOSENCTF{0nlin3_ch34t_by_f4k3_p4ck3t}"}'
FLAG: KOSENCTF{0nlin3_ch34t_by_f4k3_p4ck3t}
追記ここから
ここまでのWrite Upはinsecure内部用に書いたもの.
今回の問題は結局Wireshark問題で,.apkの解析ではなかった. で,問題のパケットも普通にやると埋もれます.
ところで,Wiresharkの「統計」メニューって使ったことありますか?
「対話」だとか「解決したアドレス」だとか,あれすごく便利ですよ.
今回は使わなかった「解決したアドレス」でもし*.kosenctf.com
を見つければまず間違いなく問題サーバーですし.
見つからなくても「対話」からどんどんIPアドレス辿っていけばすぐに見つかりますし.
一度Wireshark極めてみると楽しいと思います.