煙と消えるその前に

一服してるうちに忘れる、自分のための備忘録。とかとか

SECCON 2014 オンライン予選(英語)に参加してきた!

前回の日本語予選に引き続き、今回も参加しました。
いつものRoute9というチームで、計7名で参加しました。

結果は118位・・・。なんともコメントしずらい位置でした。

が、今大会にしてついに、チーム目標(?)の100点問題全回答!
少しずつ進歩してるようなしてないような・・・。次は200点問題まで全回答したいですね。

以下、解き方のわかった問題の回答を書こうと思います。

Network 100 Get the key

pcapの中身をみたところ、Basic認証してるのでヘッダを探します。
L21で Authorization: Basic c2VjY29uMjAxNDpZb3VyQmF0dGxlRmllbGQ= が見つかるので、
デコードしてサーバにアクセス。

Base64.decode64 "c2VjY29uMjAxNDpZb3VyQmF0dGxlRmllbGQ="
 => "seccon2014:YourBattleField"

f:id:paty_fakename:20141207191435p:plain

key.htmlが見つかるので、それを開いて回答。
SECCON{Basic_NW_Challenge_Done!}

Network 200 version2

問題文にあるsrvとはなんぞやと思ったら、DSNのSRVレコードのことのようです。
サービスとサーバの紐付けをしてるレコード?

ためしにhttpでDNSに問い合わせたところ、以下のレコードが返ってきます。

$ dig srv _http._tcp.h2o.pwn.seccon.jp.

;; ANSWER SECTION:
_http._tcp.h2o.pwn.seccon.jp. 120 IN    SRV     1 1 65080 h2o.pwn.seccon.jp.

65080ポートでhttpサービスがいるそうなので、アクセスすると、

$ curl http://h2o.pwn.seccon.jp:65080/
Plz access with version 2

version2・・・?まさかHTTP2.0か?!
調べたところ、Firefox Nightly Builds を使えばHTTP2.0でアクセスできるそうなので試してみるが・・・変わらない!
チームメンバーの曰く、httpsなんじゃね?とのこと。SPDYとの兼ね合いとかなんとか(時間なくて仕様調べてないやつ)

それならば、ということでhttpsのサービスを再度DNSで調べます。

$ dig srv _https._tcp.h2o.pwn.seccon.jp.
;; ANSWER SECTION:
_https._tcp.h2o.pwn.seccon.jp. 120 IN   SRV     2 0 65432 h2o.pwn.seccon.jp.

65432ポートでサービスしてるらしいので、そちらにアクセスするとPlz see your HPACKの文字が!
HPACKって何ぞや状態でしたが、ヘッダを見たら鍵っぽいのがあったのでそれを回答しておしまい。
f:id:paty_fakename:20141207174813p:plain

Web 200 REA-JUU WATCH

リア充て(笑
アカウント発行して、合計6つの質問に答えるとリア充ポイントを出してくれるサイトでした。
普通にやると400ポイントが最高らしい。
ポイント表示するページで、ポイント部分の表示が少し遅い。
何か通信してるのかなとソースを見たところ、こんなURLにリクエスト投げてました。

$.getJSON("/users/chk/2015", null, function(data){

2015はユーザIDかな?たぶん0か1が特別なんじゃないかと思い、直接アクセスしたところ・・・
ID=0は404 not found
ID=1はこんなのが返ってきました

{"username":"rea-juu","password":"way_t0_f1ag","point":99999}

リア充ポイントカンストしてるじゃん!
ユーザ名とパスがわかるので、そのユーザでログインして最後のページまで進むと、鍵が表示されました。
f:id:paty_fakename:20141207175704p:plain


以下、チームメンバが解いた問題も載せておきます

Forensics 100 Get the key.txt

ext2ファイルシステムのファイルが添付されていました。

$ file forensic100 
forensic100: Linux rev 1.0 ext2 filesystem data

linuxでマウントして中身を見てみます。

$ sudo mkdir /test && sudo mount -r -t ext2 forensic100 /test

中には1-244までの数字がファイル名になってる謎のバイナリ。
strings -aでざっと調べたところ、1にkey.txtの文字が入っていることがわかります。

$ strings -a /test/1
key.txt
  • 67u+r

1ってどんなファイルかと調べると

$ file /test/1
/test/1: gzip compressed data, was "key.txt", from Unix, last modified: Wed Oct  1 15:00:52 2014

gzipファイルらしい。なので中を見てみると鍵がありました。

$ gunzip -c /test/1
SECCON{@]NL7n+-s75FrET]vU=7Z}

Binary 100 Reverse it

ファイルの最後にjpegマジックナンバーが埋まっていることにメンバーが気づきました。(ffd8 ffe0)

$ xxd binary100_reverseit/Reverseit | tail -n 2
0001e00: 8400 8400 1010 1000 6494 64a4 0100 0eff  ........d.d.....
0001e10: 8dff 

つまり、ファイルを上位と下位ビットで反転させつつ、ファイル全体で反転させるとJPEGファイルができるはず。

rubyコードのサンプル

File.open("Reverseit", "rb"){|file|
  File.open("output2", "wb"){|output_file|
    output_file.write [file.read.unpack("H*")[0].reverse].pack("H*")
  }
}

開いてみるとこんな画像でした。
f:id:paty_fakename:20141207185107j:plain

Crypto 100 Easy Cipher

2進、8進、10進、16進数が混在したファイルとのこと。
それぞれを文字に直していけば解けました。

rubyコードのサンプル

string = "87 101 108 1100011 0157 6d 0145 040 116 0157 100000 0164 104 1100101 32 0123 69 67 0103 1001111 1001110 040 062 060 49 064 100000 0157 110 6c 0151 1101110 101 040 0103 1010100 70 101110 0124 1101000 101 100000 1010011 1000101 67 0103 4f 4e 100000 105 1110011 040 116 1101000 0145 040 1100010 0151 103 103 0145 1110011 0164 100000 1101000 0141 99 6b 1100101 0162 32 0143 111 1101110 1110100 101 0163 0164 040 0151 0156 040 74 0141 1110000 1100001 0156 056 4f 0157 0160 115 44 040 0171 1101111 117 100000 1110111 0141 0156 1110100 32 0164 6f 32 6b 1101110 1101111 1110111 100000 0164 1101000 0145 040 0146 6c 97 1100111 2c 100000 0144 111 110 100111 116 100000 1111001 6f 117 63 0110 1100101 0162 0145 100000 1111001 111 117 100000 97 114 0145 46 1010011 0105 0103 67 79 1001110 123 87 110011 110001 67 110000 1001101 32 55 060 100000 110111 0110 110011 32 53 51 0103 0103 060 0116 040 5a 0117 73 0101 7d 1001000 0141 1110110 1100101 100000 102 0165 0156 33"

string.split(" ").each{|c|
  res = " ! "
  case c
  when /[a-f]/
    res = c.to_i(16).chr
  when /^0/
    res = c.to_i(8).chr
  else
    begin 
      res = c.to_i(10).chr
    # `chr': 1100011 out of char range (RangeError)
    rescue
      res = c.to_i(2).chr
    end
  end
  print res
}
puts ""

実行結果

Welcome to the SECCON 2014 online CTF.The SECC is the biggest hacker contest in Japan.
ops, you want t know the flag, don't yu?Here you are.
SECCON{W31C0M 70 7H3 53CC0N ZOIA}Have fun!