すらすと’s 生活の跡

不真面目な元高専生によるなにか

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の時間帯に運営として参加してたが居るだけな状況.

結果

f:id:thrust2799:20190120223302p:plain
終結

総合
  • 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やるときは必ずWindowsLinuxが要るイメージ
  • 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にする.

入れたら立ち上げ

起動・動作確認

初回の立ち上げで名前を聞かれるので入力. その後,画面をタップしてゲーム開始.

f:id:thrust2799:20190120225849p:plain:h300
play画面

ゲームを進めて,gameoverになるとこの画面になる.

f:id:thrust2799:20190120225927p:plain:h300
GameOver

タップするともう一回できる.

解析開始 (ネットワーク)

とりあえず通信していないか確認. エミュレータを使ってる人ならそのままWiresharkを使ってもらう. 今回はAndroid Studio縛りで.

設定

実機の場合は,開発者向けオプション(端末情報のビルド番号を8回くらい押したら有効化される)からWi-Fi詳細ログの有効化をOnにする.

f:id:thrust2799:20190120230040p:plain:w300
開発者向けオプション

あと,スマホWi-Fi接続にする. データ通信回線ではパケットキャプチャできない.

パケットキャプチャ開始

で,Playストアから tPacketCapture をDL. 起動してCAPTUREを選択.これでパケットキャプチャが開始される.

f:id:thrust2799:20190120230203p:plain:w300
tPacketCapture

停止するときはVPN設定から. 歯車アイコンを押して削除を選択すると自動的に.pcapファイルが生成される.

f:id:thrust2799:20190120230800p:plain:w300
VPN

キャプチャ中,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から直接アクセスできるのでこれをコピーして解析する.

解析結果

f:id:thrust2799:20190120233533p:plain:w500
解析結果

なんかあった.

この回のユーザー名はhogehogehoge,gameover画面は以下.

f:id:thrust2799:20190120225927p:plain:h300
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極めてみると楽しいと思います.

参加者各位,本当にありがとうございました