KOSEN セキュリティ・コンテスト2018に参加しました(日記とWrite-Up) #kosensc
こんにちはセンス無いです。
今回KOSENSCに小山高専のチーム" 074m4K053n (おたまこうせん) "略称"074m4"として参加しました。
チーム構成は4年生な僕と、自作OSとかしちゃう系の同級生1人と、たしか専攻科1年のpythonできる系の先輩と数学ができる先輩でした。
前回の木更津高専さん主幹の大会はインテンシブ・イングリッシュとかいう教科のせいで行けるはずの会場に行けなかったうえ、参加すらもできなかったというクソ仕様でした。
今回はちゃんと大会に参加できました。よかったね。
今回は会場が福岡(だっけ?)なので、会場には行かずにリモート参加です。
学校のラウンジを借りてみんなでPC持ち寄って参加しました。
手前側がぼく達のチームで、奥が別のチーム" おやまようちえん(おやまどうぶつえん) "略称:"およ"です。毎回毎回チーム名なんなんですかね。
KOSENSCのslackのrandomに顔入り写真をアップロードしてしまう情報リテラシーのかけらもない学校ですうちは。(でかいポカリのペットボトル顔の前で持ってるのが僕です)
それで、そんな頭の悪い学校のチームの結果は、3250点で総合3位でした。
webに弱いのが見え見えですね。(というかwebの配点高くない????)
今回のチームは僕がちょっとwebの知識あるくらいな感じだったので、脆弱性名と攻撃方法ををpythonが書ける系のおにいさんにぶん投げるみたいなノリでweb問解いてました。
"およ"のほうも7位なのでだいぶ頑張れたと思います。拍手拍手!
全23問の中で僕が解いたのは、たしか
- 07 シンプルなQRコード [Binary 200]
- 08 旅行の写真 [Crypto 200]
- 10 Basic認証 [NetWork 100]
- 18 更新されたIoT対応デバイス [Misc 50]
- 20 サイトを見ていただけなのに [Misc 50]
- 21 謎のファイル [Misc 100]
- 23 攻撃ログ [Misc 300]
なはずです。
以上が間違っていなければ、僕がsubmitした分の得点は1000点分ですね。
他の人に解き方だけ教えて、解いてもらったものとかもあるのでもうちょっと貢献できているはず。
これからCTF始めそうな学校の低学年とかにも備えて、僕が解いたやつ以外にも解法を聞いてるやつもWrite-Upしていこうと思います。そこそこ丁寧めに書くつもりです。
00 Sample [Sample 100]
やるだけ。
01 まどわされるな! [Binary 100]
渡される問題ファイル"flag.out"をcatするなりfileなりするとELFであるとわかります。
とりあえず、stringsに突っ込むなり、catするなり、テキストエディタに突っ込むなりすると
flag is SCKOSEN{you_are_go... oops! I Forgot!
というテキストが見つかります。見つかるはずです。彼は脳内メモリが26bytesしか無いようです。ナメてますね。
(僕はこの問題を解いていないし、実行したらどうなるかとか知らないです。)
これが、"片方のフラグ"らしいです。
そして、このflag.outを、メモ帳に突っ込んでjpgのマジックナンバーFF D8 FF EE(.リ.)を目Grepするか、binwalk(win環境ならDataCutter.exeとか)に突っ込むとケツにjpgがくっついているとわかります。
そのバイナリを取り出すと
こんなのが出てきます。
これらを結合したらフラグです。
問題の"まどわされるな!"は、おそらくELFの解析のこととかでしょうね。
※マジックナンバー(ファイルの頭についてる識別コード的なもの)はいくらか覚えていると便利なので一回は目を通して見よう!!! マジックナンバーまとめ
02 ログインしたい! [Binary 100]
渡されるのはELFらしいですが、解いてないし、話も聞いてないので解法知らないです。
stringsとかltraceとかstraceすればフラグ出るんじゃないんですか(適当)
03 printf [Binary 100]
とりあえず、ncしてみます。
するとなんだか、
みたいなのが出てきます。接続毎にthe secret is in の値は変わるようです。
what do you want:
と聞かれるので
Money!!!
とか書いてEnterッタッーンってすると、
there is no Money!!!
って言われます。ナメてますね。
そして、この結果と問題名、からメタ推論すると、内部のコードは
printf("what do you want:");
scanf("%s",str);
printf("there is no %s",str);
みたいになっていると思われます。
そして、"%x %x %x"とか入力すると、
このようにアドレス値っぽいのが出力されます。
これらのことから、典型的なFormat String Attack(書式文字列攻撃)が効くやつとわかります。
さらに、" the secret is in "とか言っているあたりから、そこに表示されているアドレスにフラグがあると目星をつけます。
僕はコード書けない系なので、先輩に脆弱性と攻撃手法を伝えてコード書いてもらいました。先輩は脆弱性知らなかったっぽいのでぼくの間接的得点です。+100
とっても典型的な問題なので、解き方とかコードとかは調べればいくらでも出てくると思います。
04 XOR,XOR [Binary 200]
ぼくは何もしりません。
なんかプログラムの中でフラグを作っているらしいので、デバッガ使って適当なところで止めたりすると、フラグが出てくるそうです。しらんけど
05 Simple anti debugger [Binary 250]
これも知らないです。
先輩が
とか言ってました。
デバッガを弾いてるとこのコードを書き換えて、"Simple non anti debugger"にしてdgbぶん回して解いたって言ってましたよ。
06 exchangeable if [Crypto 100]
次のような画像が渡されます。
ナメてますね。
このファイルをstringsにかけるなりすると、
md5=2009d1c114ed83f57cf8adde69fd6ca8
という文字列を見つける事ができます。
ぼくが分かったのはここまででした。
しばらくしたら、数学のできるおにいさんが、
トイレ行ってたらなんかフラグでてたww
みたいなこと言っててsubmitしたらsuccessしてました。こわい
解法を聞いたところ、あのMD5はフラグのハッシュだったらしいです。
不明な文字がxxxxの4文字で、入りうる文字は大小英数字の計62文字っぽくて、全ケースは62^4=14776336です。
確かにトイレ行ってる間に出そうな数です。
コード書いて、ハッシュが一致したものがフラグです。
07 シンプルなQRコード [Crypto 200]
やる気なさすぎて手でQRデコードしてた pic.twitter.com/O7bU9X7L75
— センス無い (@N0n5ense) April 10, 2018
こんなことしてたので当然この問題はぼくに回ってきました。
はい。
問題では、次のようなQRコードが渡されます。
なんかすっごいみたことありますねこういう問題。
SECCON CTF 2013のonline予選[forensics 400]の問題ですね。
はい。ここのブログ様のようにやりましょう。
数学のできるお兄さんに、上のブログURLをぶん投げて、誤り訂正ビットから、マスクパターン指定子を計算してもらいました。
結果は0b011 = 3らしいです。
この結果を用いて、手でごちゃごちゃやろうとしてるところに同級生くんが強そうなツールを見つけてきてくれました。
めっちゃ強そうですね。(名前大好き)
このツールに文字列にしたQRの配置をぶん投げると、デコードしてくれます。
とりあえず問題のQRコードを文字列化するコードを適当に書きます。(ぼくはHSPで書いた)
そんでもって、このツールに突っ込みます。
すると、
不明なモード指定子
みたいな感じで怒られてしまいます。
デバックモードのオプションをつけて実行してみると、モード指定子が書いてある、右下のパターンを見ると、確かに存在しないモード指定子になっています。(確か0b1010)
ぼくは一回、数学のできるお兄さんに出してもらったマスクパターンでマスキングした画像を作っていて、そのパターンとは明らかに違っていたので、おそらく"ツールがはじき出したマスクパターンが間違っている"と予想立てしました。
このツールは-mオプションでマスクパターン指定子を指定することができるそうなので、計算してもらった"3"を指定して実行してあげると、フラグが出てきます。
08 旅行の写真 [Crypto 200]
次のような画像が渡されます。
何かを隠しているそうです。
とりあえず、中のデータを見てみましたが、特に怪しそうなところは見当たりません。
よくわかんないので
png ステガノ
でGooglingしました。
すると、トップでこんな記事が出てきました。
"うさみみハリケーン"の"青い空を見上げればいつもそこに白い猫"のヘルプっぽいです。
読み進めると、赤色数値のビット0を抽出するとフラグが出てくる例とかが書いてあります。
こういう系かなと思ってとりあえずソフトをDLして、突っ込んで"ステガノグラフィー解析"を押しました。
こんな感じの画面になります。
左上の"次候補"を押して行くと
いろいろなタイプの表示をすることができます。
こんな感じで。
とりあえず次候補をクリックしまくってみます。
こんな感じになります。
どうやら、緑と青のビット[3:0]に本来の画像ではないデータが入っているっぽいです。
そしたら、画面右上の"ビット抽出"を押します。
こんな画面になります。
そしたら、さっき見つけた怪しそうなビットに対応するとこにチェックを入れます。
そして、"バイナリデータ"表示を押すと、
フラグが出てきます。
いやぁ、マジで便利ですねうさみみさん。
コード書こうとしたらすごいめんどくさいし、そもそも兆候を見つけられない気がします。
ちなみに、この問題は僕がFirst Solverでした。
初日終了時点で " あの " insecureさんちも解けてなかったのでだいぶ浮かれてました。
09 CMA [Crypto 250]
数学のできるおにいさんが解いてました。
問題の.txtを読むとRSA暗号の問題っぽいです。
ファイルでは公開鍵n,eの組とそれに対応する暗号文cが2つづつ与えられています。
それらの値を見ると、
n1=n2
e1≠e2
であるとわかります。
そしてファイルには、
Dec(c1) == Dec(c2) == m?: True
と最後に書いてあります。
c1とc2を解読した結果が一致しているということでしょう。
このような場合には、Common Modulus Attackが有効です。
あとは適当に調べて書いてある通りに実行すれば解けるはずです。
ももテクさんめっちゃ参考になるはずです。
09 RSA? [Crypto 300]
これも数学のできるおにいさんが解いてました。
おにいさん曰く、問題文の
冪演算のない世界線に来てしまった。
から、ヒントを得たそうです。
通常のRSA暗号の仕組みは、
暗号化 : c = m^e mod n
復号 : m = c^d mod n
の式で表されます。
しかし、この問題では冪演算が存在しないそうなので、冪演算の代わりに掛け算を使っているのではないかという予想を立てたそうです。
そうすると、暗号化の式は c = m*e mod n となります。
これを復号する場合は m = c/e mod n となりそうです。
あとは計算して文字列化して終わりです。
10 Basic認証 [NetWork 100]
pcapが渡されるので、とりあえずWireSharkで開いてみます。
そして、適当なパケットを右クリして追跡でTCPストリームなりHTTPストリームなりを表示してみると
こういうのが出てきて、
Authorization: Basic am9objpzOG9YKnpsY3JvOD8jd2xibHByNA==
の最後のブロックをBase64でデコードすると、
john:s8oX*zlcro8?#wlblpr4
となります。
それで、ストリームの最後の方に
<p>flag is here
<a href="/flag.zip">flag.zip</a>.</p>
<p>(zip password is john's password.)</p>
と書いてあるのでflag.zipを取り出します。
ファイル -> オブジェクトをエクスポート -> HTTP でflag.zipがある行を選択して保存します。あとは書いてある通り、johnさんのパスを突っ込んで回答したらフラグが出てきます。
11 ログインしてフラグを入手せよ。 [NetWork 150]
ぼくは解いてないので知らないです。
これを解いたおにいさん曰く、akictfに同じような問題あるそうです。
そのWrite-Upを探せば解けるはずです。
12 サーバーから情報を抜き出せ!
問題で与えられているサーバーにアクセスするとこんな感じの画面が出てきます。
画像が頭おかしくて好きです。
このページは画像しか表示していないうえに、ソースコードにも怪しいところがありません。
わかんないので、画像を右クリして新しいタブとかで開いてみます。
するとURLがこのようになります。この状況からメタ推論して、このリクエストにはディレクトリトラサーバルちゃんトラバーサルの脆弱性があると考えます。
問題文で、フラグのファイルは"flag.txt"ということが分かっているので、とりあえず、filenameのパラメータに書いて見ます。
はい。このディレクトリにはそんなもの存在しないそうです。
僕はここで詰まったので、先輩に状況を投げたら、" ../flag.txt "指定したら行けた!!ってなってました。
そういうことらしいです。
これも僕の間接的得点ですねきっと。+100
14 アカウントを奪え [Web 300]
問題のサーバーにアクセスすると、
こんな表示になります。
kosenjohでログインしろとのことなので、Useridにそれ突っ込んでPasswordにpasswordとか1234とか弱そうなパスをとりあえず突っ込んで見ます。ただ、なんか違うっぽいのでSQLインジェクションとかできるんじゃね??とか思い始めます。
Useridにkosenjoh、Passwordに典型的なSQLiの'OR 1=1;-- を突っ込むと
こんなページに飛ばされます。
古戦場から逃げるな!!
さっきのフォームのphpコードですね。
この問題の最終目的は"kosenjoh"のパスワードを抜くことだそうです。
コードを読む感じでは、SQLのクエリの結果は成功か失敗かしかわからなそうです。
こういう場合はブラインドSQLを使います。1文字づつ調べて行くやつです。
僕はコード書けない人種なので、pythonのおにいさんにこのソースのページと参考になりそうな記事をぶん投げたら解いてくれました。
間接的得点+300
15 47405b599e22969295ebed486d7343cb [Web 300]
解けなかった問題その1
とりあえず問題名が謎なので調べて見ると、
はい。ヒントですね。
問題のサーバーにアクセスしてみます。
こんな表示です。SQLiしろってことらしいのでとりあえず上のNo.に'OR 1=1;-- を入れてみます。
こんな感じのデータの組が83件表示されますValueはなんだかAsciiコードっぽいですが、あんまり関係なさそうなのでスルーしました。
(insecureさんのWrite-upにデコードした結果が書いてありました。ここにはフラグないでwフラグはだれかのパスやぞwwみたいな感じになるらしいですよ。
スルーしたけど、あってもなくてもあんまり関係なさそうだったので良かったです。
んで、したのログインフォームっぽいとこも調べて見ます。
ぼくあんまりかじってないので、詳しく書けないんですが、IDにadmin突っ込んで、適当なインジェクション仕込むと、Welcomeとか表示されたそうです。
どうせadminのパスワードがフラグだろうと踏んでいたので、pythonのおにいさんにブラインドSQLのコード組んでもらってやってもらってたんですが、なぜか途中で404が吐かれるようになって結局解けずじまいでした。
相当悔しがってました。わかる。ちゃんとしたWrite-Up読みたければinsecureさんのとこ見に行くといいと思うよ。
16 進撃せよ [Web 300]
解けなかった問題その2です。
WAFの問題でした。
アクセスしてみます。
"test.txt"をクリックするとtestと表示されました。
URLを見ると、
となっていました末尾は明らかにBase64なのでデコードしたら"test.txt"になりました。
次に"flag.txt"をクリックすると、
ってなります。 わふ~~~
また、ファイル名はBase64でエンコードしなくても、アクセスできるみたいです。しかし、相変わらずflag.txtはわふ~~~ってなります。
つまりは、(平文にflagが含まれている) or (Base64でデコードした結果にflagが含まれている) っていうことですね。たぶん。
どうにかしてflagを含まずにflag.txtと表現するという方針でいろいろやってたんですけど、全部ダメでした。
例えば内部がshell的なものと想定してfl''ag.txtと入れてみたり、文字列連結のシェル芸とかしてみたりしてました。
途中やってて、../のb64エンコードを突っ込んだら、無が表示されたので、ディレクトリトラサーバルちゃんがいるって気づきはしました。気づきは。
他の人のWrite-Upみると../../../../../etc/passwdが成功するらしいです。ぼくも同じようなことやったんですけど多分../の数が違うのだけを入れていた可能性がとても高いです。残念。まあ見れていたところで、その先は絶対進められなかったとおもいますけどね。
この問題は"flag.txt"を2回b64エンコードすることでflagを取れたそうです。エスパー問題らしいです。
とても単純でした。エスパー力が足りませんでしたね。
これ解けていれば2位になれていたので、とっっってもくやしいです。くぁwせdrftgyふじこlp;@:「」あsdfあsdf
はい。まあ仕方ないですね。こういうこともあります。トランプの裏側から番号当てるゲームをしまくって10月のonline予選に備えます。どうせまたSECCON{STAR_WARS}とかでてくるから。
17 人大杉を見たくない [Misc 50]
KOSENSCのMisc問はほとんどがGoogling力を試される感じですね。
まあこれじゃないですか?
正解知らないんでわかんないですけど、たぶんavaliabilityです。
18 更新されたIoT対応デバイス [Misc 50]
Joke RFCですね。いつものって感じです。
Hyper Text Coffee Pot Control Protocol - Wikipedia
https://tools.ietf.org/html/rfc7168
コーヒーのやつを知ってればお茶のも知ってると思います。
コーヒーをお茶向けに拡張したやつらしいですよ。
19 君の名は2018 [Misc 50]
前回のKOSENSCで"君の名は"っていう問題が出たらしいですね。
これも調べるだけです。
これはだいぶ話題になったので知ってる人がほとんどだと思います。
20 サイトを見ていただけなのに [Misc 50]
気合で調べましょう。
pythonのおにいさんはハイフン区切りを見逃していたらしくて投げてました。いただき
21 謎のファイル [Misc 100]
とりあえずファイルをダウンロードします。
zipらしいです。よくわかんないのでとりあえず展開しましょう。
はい。分かる人は一瞬でわかると思うんですけど、Microsoft Wordのファイル構造です。(wordってディレクトリがあるからそれでも気づけるかも)
あとは、"rename_me.xml"とかいうファイルがありますね。
名前変えればよさそうです。
wordのファイル(.docx)を作って、拡張子を.zipに変えて展開してみましょう。
CTFやったことのある人ならば、オフィスのファイルは全部zipで展開できるってのを知ってると思います。知らなかった人はおぼえて。
さっきの問題のやつと比較してあげると、"rename_me.xml"は"[Content_Types].xml"にリネームしてあげればよさそうです。
名前を変えたら、zip圧縮して、拡張子を.docxに変えてWordとかで開いて見ましょう。
縦書きでフラグが出てきます。
22 ディスクが足りない! [Misc 100]
悲痛な叫びですね。
ファイルをダウンロードすると.gzのファイルをもらえます。
展開しまくるとフラグが出てくるそうです。
僕解いてないので知らないです。
圧縮しまくると1bitとかになっちゃうって思いこんでるやつですね。かわいい。
23 攻撃ログ [Misc 300]
ファイルを落っことしてくると、Apacheさんのアクセスログっぽいです。
生のテキストだとクソ見づらいので適当なビューワを落としてきました。
こんな感じ。生テキストよりずっといいです。
一応1万行ちょっと全部目を通した感じだと、セッションハイジャックしようとしてたり、windows\system.iniとか/etc/passwdとかを見ようとしたりファイルアップロードで書き換えようとしてるような感じでした。なんかゲームサーバーとか社員用のファイルエディタとかブラウザ、その他いろいろな機能を提供してるみたいですね。全く関係ないです。
技術的な観点からログを探すならば、攻撃が成功してるであろうログをピックアップしていく感じになるでしょう。やるなら、コードが200以外でファイルをいじっているようなログとか。
そういうのはめんどくさいので問題として成立するようなログを探す方向でやりました。このログは、ほとんどのログが重複していて、唯一のログというのが見当たりません。
つまり、他のログと重複していない唯一のログを探し出すのが目標になります。
落としてきたツールの機能をいろいろ使って調べてみたところ、ログの中にAgentが3種類登場することがわかりました。
- Content-type:-
- Content-type:application/x-www-form-urlencoded
- Content-type:multipart/form-data;
これらの3つです。そして、一番下のmultipart/form-data;は11039行のログの中でたった1つしか存在していませんでした。
192.168.10.26 - - [29/Aug/2018:20:56:37 -0700] "POST /fileupload/upload.action HTTP/1.1" 500 347 time:49 Content-type:multipart/form-data; boundary=---------------------------100000000000
このログですね。
これをsha-1でハッシュしたのを送って300点!かとおもったらなぜか、不正解。
結局sha-1ハッシュを大文字で書いていたのが悪かったみたいです。
小文字でsubmitしたら通りました。そこら辺2種類登録しといてほしいですね。
Content-type:multipart/form-data;はファイルアップロードのときに出るやつなので、これをアテにして解いていく感じなんですかね。
おそらくディレクトリトラバーサル経由のファイルアップロードでシステム書き換えられた!みたいな想定で。
以上、結局全問触れてしまいました(需要がなさそう)。自分が解いてないやつは詳しく書いてないですけど、多分調べれば全部解けるので、まあそういうことで。
今回もとても楽しめたので、来年も是非参加したいですね。
KOSENSCは難易度がSECCONの予選とかよりも学生向きで、解きやすいのが多くていいですね。(KoHやりたかった)
あとは要望というか、愚痴というかなんですけど、スコアグラフとかのページを公開してほしいなぁって思ったりしました。youtubeの配信だと切り替えの時間が早すぎてまともに見れなかったんですよね。
それと、ジャンル分けをもうちょっと詳しくしてほしいなぁって思いました。ステガノだとかreverseだとかそういう
次はSECCON online予選になるのでWebを解けるようにして挑みたいですね。
今回のKOSENSCはなんだかwebの1問あたりの配点すごく高かったですね。Webはぼくらのチームの弱点なので、とてもつらい感じでした。
でもまあ、全正答まで2問に迫れたのでだいぶ良かったと思います。
こんなかんじですかね。
わざわざここまで10,829文字も読んでくれてありがとうございました。
参加者、運営陣の方々おつかれさまでした。最後の方とかスコア白熱しててとってもいい大会でした!