読者です 読者をやめる 読者になる 読者になる

煙と消えるその前に

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

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

ctf

前回の日本語予選に引き続き、今回も参加しました。
いつもの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!

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

ctf

昨年に続き、今年も参加しました!
昨年同様 Route9というチームで、計6名で参加しました。

結果は16位!
昨年よりいい成績で終えることができました。

今年は12時間と比較的短い(?)時間で、前回より気軽に参加できてよかったかなーという感じ。

今回も私が解けた問題をつらつらと書きます。

ネットワーク100 このパケットを解析せよ

pcapファイルの中身はFTPでやりとりしているらしき通信。
サイズが小さいので上からだーっと眺めると、露骨にflag.txtをリクエストしてるパケットが目に入ります。

f:id:paty_fakename:20140719130414p:plain

その直後に中身を取っているので、そこの部分を抜き出すと以下の文字列が。

RkxBR3tGN1AgMTUgTjA3IDUzQ1VSM30=

decodeすればいいのかなと思って、とりあえずBase64でデコードしたらビンゴ

FLAG{F7P 15 N07 53CUR3}

暗号100 decode me

問題のファイルを見ると、こんな文字列が "ebg13/47"
そういや、以前参加したpythonの勉強会で、rot-13encodeされたpythonファイルにこんなのがあったなーと思い出し、rot-13でdecodeしてみる。

...ASCII部分は読めたけど、他はバケバケorz

チームメンバーに教えてもらったところ、rot-13/47という暗号方式(?)があるとのこと
早速調べてみると、nkfに実装が入ってるみたい。

てなわけでnkfでdecodeしてみると、答えが出ました。
(nkfはCentos6.4で実行したため、SJISが読めませんでした。decoded.txtをwin環境に持っていって確認)

nkf -r encoded.txt > decoded.txt

FLAG{Have fun SECCON2014}

フォレンジック100 879,394bytes

与えられたFilesystem001.binから879,394バイトのファイルの名前を探す問題。
調べたところ、Filesystem001はFAT形式のようでした。

ファイルサイズが書かれているので、879,394を16進に変換して"0d6b22"を探します。
・・・が見つからない。
FATの仕様を見たところ、リトルエンディアンでしたorz

気を取り直して、"226b0d"を探したところ、CHRYSA~1で拡張子がJPGなファイルがヒット。
~1ってなんだっけと思っていたら、ファイル名のショートネームとのこと。
長いファイル名は省略されてこの形になるので、すぐ近くに埋まってるChrysanthemumがファイル名と推測。

Chrysanthemum.jpgが答えでした。

Web 300点 箱庭XSSリターンズ (途中まで)

exeで起動させたアプリでXSSをする問題
複数問で構成されていて、問題を解くたびに使った文字列が制限されていきました。

以下のような感じで手を変え品を変え進めましたが、ボキャブラリー不足で力尽きましたorz
6問解いたところで途中点がもらえたのでそこで終了。

(表示を良しなにされてしまうので、記号を一部全角にしてます。書き方どうやるんだっけ...)
"onkeydown="&#0000097lert('&#0000088SS')
"onkeypress="&#000097lert('&#000088SS')
"onselect="&#00097lert('&#00088SS')
"onclick="&#0097lert('&#0088SS')
"ondblclick="&#097lert('&#088SS')
"onfocus="&#97lert('&#88SS')
"><script>alert('XSS')</script><"

opensslを更新することで仕込んだ爆弾

apache

最近は Qiita の方に投稿が移ってる僕です。

ちょっと前からopensslがらみの話題が出ていますね。
HeartbleedBugとかCCS injectionとか。

で、うちのサーバもopenssl更新しておかないとなーと思って更新しました。
AWSを使っていて、クラ -> ELB(https) ELB -> EC2(http)という構成にしているので、apacheの再起動はしなくていいかーと放置してたんです。
更新作業した当初は特に何も問題なかったんですが、翌週月曜日に事件が・・・。

 apache が 落 ち て た


なんでだーと思ってエラーログ見てみたら、以下のようなエラーが
mod_sslが読めない!?

[notice] SIGHUP received. Attempting to restart
httpd: Syntax error on line 221 of /etc/httpd/conf/httpd.conf: Syntax error on line 12 of /etc/httpd/conf.d/ssl.conf: Cannot load /etc/httpd/modules/mod_ssl.so into server: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/lib64/libssl.so.10)


事件の引き金を引いたのはcrondで動いてるlogrotatedでした。
こいつがログローテの後にapacheをreloadかけていて、それが日曜の深夜でした。

でもって、mod_ssl使ってないはずなのにおかしいなーと思って見てみたら、
デフォルト設定だからmod_ssl読み込んでたわ!


なんでもデフォルトのままはいけないなってことと、
作業後に動いたから安心ってわけにはいかないって教訓でした。