CTFのwriteup的なやつ

33c3ctfにひっそりと参加してました。
今年はCODE BLUEだったり、FOCUS JAPANだったり、セキュリティのイベントに参加してたのですが、
いつも書くのが面倒になって。。。。

という感じで、今回も面倒くさかったのですが年末ですし、
ということで書きましたが不本意ながら長いです(汗)

といっても、CTFにはSECCON2016に初参戦してからの今回2度目で、まだFlag1個も取ったことがありません。
なので1個でも取れたらいいかなというぐらいの感じですが、
この辺はやっぱり家族というか子供がいるとなかなか時間が取れませんよね。
平日だったのもあって昼間仕事で夜とか朝だけ参戦しようと思ったらこういうときに限って子供が甘えてきたりするもので、
その辺ガチのチームには参加できないところですね。

と言い訳を含めた前置きが長くなりましたが、、、
今回初めてFlagが取れまして、それがpay2winという問題でした。

「Do you have enough money to buy the flag?」
というところで、
下のような画面が出てきます。

見て分かる通りflagの方を買えば、そこにflagがあるのだろうということは想像できます。
ということでcheapをまずは無視して、flagのbuyを押してみます。

するとこんな画面が出ました。
クレジットカード番号を入力しろといってきます。
安けりゃ買ってやるとは思いますが、それにしては高すぎます。

そこでURLを見てみます。
http://78.46.224.78:5001/pay?data=5e4ec20070a567e03f3adc378a6225b17b0f890df46b1edc4f75c9736d3b8e0641e7995bb92506da1ac7f8da5a628e19ae39825a916d8a2f

こんな感じです。
何かがここに隠されているんだろうということがわかりますね。

しかし、その前に普段からクレジットカード決済系のシステムを作っている私はテスト用のクレジットカードがあることを思い出します。
ということで4242424242424242なんかを入力してみます。

カードの金額の上限超えてるよ!
と言われます。
そしてURLは下記になりました。
http://78.46.224.78:5000/payment/callback?data=232c66210158dfb23a2eda5cc945a0a9650c1ed0fa0a08f62b96eb866f3f770d272d81aff52de2a52f7ef761e2bbe791

ここで、
ああなるほど、金額を安くしてカード決済すればいいのね
と気づきました。
おそらくdataパラメータの一部に金額に関係する部分があるのだろうと。

ということで、一旦cheapの方に移動します。

そこで同じようにテスト用のクレジットカードを入力すると、

こんな画面が出ます。
がしかし、画面に記載の内容にはあまり興味がなくて、
おそらく重要なのはURLです。
http://78.46.224.78:5000/payment/callback?data=5765679f0870f4309b1a3c83588024d7c146a4104cf9d2c890d2954c722d6d3828df361f896eb3c3706cda0474915040
こんな風になっていました。

で、dataパラメータ見比べて見ました、
// flag
232c66210158dfb23a2eda5cc945a0a9650c1ed0fa0a08f62b96eb866f3f770d272d81aff52de2a52f7ef761e2bbe791
// cheap
5765679f0870f4309b1a3c83588024d7c146a4104cf9d2c890d2954c722d6d3828df361f896eb3c3706cda0474915040

うーん、よくわかりません(爆)

嘘です。
長さが同じというのはかなりのヒントかと思います。
ということで文字数を調べて見ると96文字でした。

ということは、32文字が4ブロックに分かれていて、それぞれ意味をなしているのではと想像してみました。
(※他の人のwriteupを見ると実際はもう少し細かく分かれていました。。)
何度か決済を繰り返してみると、特定の部分だけ変化していることがわかり、
そこがタイムスタンプであるということが想像できましたので、
他のブロックをcheapとflagで入れ替えて見ました。

そうして色々な組み合わせを試していると、ドン!

とflagが出てきたわけです。

実際に渡すパラメータはこれでした。
5765679f0870f4309b1a3c83588024d74f75c9736d3b8e0641e7995bb92506da1ac7f8da5a628e19ae39825a916d8a2f

がしかし、このパラメータすぐにわかったのですが、
カード入力後の画面に入力しなきゃいけなかったみたいで、
カード入力前で必死に入力していた私はかなり時間を使ってしまいました。

外国の方の解き方を見ると、Pythonでコードちゃんと書いてて、
やってることは一緒でも、あーかっこいいな〜とか思いつつ、
それでも初めてFlagが取れたのでなんにしろ嬉しかったです。

他にもtryとyolovaultに挑戦して見ました。
tryはトラバーサルさせてくれなかったので、Haskellのコードをgifフォーマットの中に埋め込んで、
runで叩くんだろうな〜と思ったのですが、やる気がおきず、
yolovaultはContactから PhantomJSでアクセスしてもらって、そこでクッキーとか何かの情報抜くんだろうな〜
と思いながら、アクセスしてもらうとこまではやったのですが、何の変哲も無い情報しか抜けず、、、
アクセスしてもらうところに何を入力したらFlagに近づける情報が抜けるかわからず諦めました。

tryに関してはwriteup見るとやっぱりそうでしたが、
yolovaultはまだwriteupが見当たりません。

とまあ人生2度目のCTFはこんな感じでした。

色々と目標が出てきました。これは来年の課題といったところですが、
一度チームで参加してみたいなと思いました。でも、家族がある分フルではできないのでガチなチームは難しいかもですね。
あとはpwnの問題解いてみたい。
7~10年ぐらい前だったらCの仕事をしていたので、よくバイナリ見てたりGDBでデバッグしてたりしましたが、
残念ながら今はもうその頃の記憶がありません。。

でもやってたら何となく思い出す気がするので挑戦してみたいところです。
あと、Pythonと英語の勉強します。
その辺が来年の目標ですね。

そんなこんなでもう今年も終わりですね。
残りわずかですが、良いお年をお過ごしください。

カテゴリー: 未分類