すらすと’s 生活の跡

不真面目な元高専生によるなにか

SECCON2017CTF 国内決勝 簡易WriteUP

得点が取れなかったから書くつもりなかったけど,今のところ公開情報で有用なものが見つからなかったので簡単(?)に府中サーバーのWriteUP書きます.わかりにくいのは私が弱いせい.(ちなみにinsecureではtheoldmoon0602氏,kyumina8376氏,miwpayou0808氏がそれぞれ強かった)

 ちなみに今回の感想ですが,「自分が弱すぎたしもっと強くなりたい」です.

"府中"鯖

音楽のランキングで上位になればディフェンスフラグが認識されるらしかったけど高速で高評価をつけまくったらいいらしいのにやってなかった件 (この時点でただのバカ

 

どうするかというと,"鯖/reviews?user_id=自分のユーザー番号"に対してPOSTリクエストを量産する.この時,所定のヘッダ情報,所定のJSON形式じゃないと失敗する.特にヘッダにはログイン時に取得するAPIキーが必要.

 

このAPIキー,どうやって特定したかというとWiresharkをぶん回し続けるという所業でプログラムが送ってるHTTPリクエストヘッダからどうにかなった.やはりパケット解析は最高である

 

こんな感じで色々やっていると,どうやら"鯖/users/1"に対してGETするとadminユーザーとして"nekumon"のパスワード以外はわかるよう.ここまで来たらSQLインジェクションかとも思ったけど,なんかやり方がわからないって言って3時間経過,終了.これ分かるやつに任せたかった.

 

余談かどうかは置いておくとして,高評価つけま来るときに,ずぼらして5より上の値を入れると500が返される.その上,PHPのエラーコードがわんさか出てくる.これで

"/var/www/"以下の.phpがわかる. (詳しいアドレスはもう覚えていない

動いていたのは"reviews.php""index.php""users.php"の3つが確認できた.

 

さらに,各phpファイルに対する内部リクエストはおそらく"localhost:対応するポート番号"に対して行われていた.おそらくSQLデータベースへの問い合わせは"?q=ユーザー/楽曲番号"でやっていた模様.これはプログラムが送ってるHTTPリクエストヘッダに載ってた.

 

ここからは完全に余談.動いてたのはNuxt.jsとnginxだった気がする.

あと,各リクエストは絶対にOPTIONSで送って許可されたリクエストメソッドを確認してた.

 

以下,色々とわかったうろ覚え仕様集.

 

ログイン時は"鯖/auth"に対して{"username":"ユーザー名","password":"パスワード"}のPOSTでログイン,この時にAPIキーが渡されるので,{"api-key":APIキー}でPOST,以降はリクエストヘッダにAPIキーを格納.

ログアウト時は同じところに対して{"api-key":APIキー}でDELETE.プログラムで使ってるAPIキーでやった後にプログラムを操作すると404になって,そこにあるNuxt.jsのリンクからブラウジングできるようになる(github.comまでは到達済み).

 

ユーザー検索は"鯖/users/filter?user_id=対象ユーザーの番号"に対してGET.帰ってくるのはJSON形式で,ユーザープロフィールとadminかどうかがboolで返ってくる.これはユーザー情報画面で使われる.

 

レビューの取得は"鯖/reviews/曲番号"に対してGET.

送信は同じところに対してPOST(どういうJSONだったかは覚えておらず...).このとき,0~5を外すとInternal Server Error

 

ユーザーの投稿した曲の取得は"鯖/songs/filter/?user_id=対象ユーザーの番号"に対してGET.

 

楽曲の情報自体は"鯖/songs/楽曲の固有番号"に対してGETすれば得られる.

楽曲の登録は”鯖/songs”(のはず...)にPOST(これも覚えておらず...).

楽曲の削除は登録と同じところに同じ情報でDELETE.するとプログラム上では変化が起きなかったが,ちゃんと500が返されてPHPのエラーコードも見れるようになってる.

 

ユーザー情報の登録は"鯖/users"(のはず...)にPOST(これも覚えておらず...).

ユーザー情報の変更は登録と同じところにPOST.データは上の情報から"password"と"is_admin"を除いたもの.ここで欲張って{...,"is_admin:true}としても400(Bad Request)が返されるだけ.

ユーザーの削除は登録と同じところに{"username":"ユーザー名","password":"パスワード"}でPOST.

 

 

 

 

 

 

*ところで,この後にpwnがあったって噂マジ???

学祭で音ゲーを作って展示した時の裏話や感想

レポート提出期限や試験が迫る中,忘れないうちに書いておこうと思ったから気にせずに駄文を書くという前置き......

 

今回,奈良高専の展示でWave-Toneを公開させていただきました."全部自分たちで作った音楽ゲーム"というテーマで,楽曲以外は全部自分たちで作りました.

譜面はクラスメイト10人くらいが睡眠時間を犠牲に作成してくれて,メニュー部の実装は師匠氏(クラスメイト)に委託.自分はプレーヤー本体を一からコーディングしました.

結果は上々,音ゲーマーの方々がリピーターになったりもして,展示スペースに人が居ない時間がありませんでした.プレーしてくださった方々,本当にありがとうございました!!

 

さてここから本題です.

このWave-Toneは"自分の今できる最大限を趣味全開で作ろう!"ということで今年の6月から作成し始めました.言語はC++,外部ライブラリはDirectX11,XAudio2,libogg / libvorbisで頑張りました.なお,Windows10向けです.

 

C++は独学でそれまでやってたC言語ベース,ライブラリに至っては全て初見という環境のなか,開発に励みました.(多分夏休みは平均8時間 / 日は開発していたはず)

周りからは「DXライブラリとか使えよ」「FMOD使えば?」と言われつつDirectX11とXAudio2でクソコードを量産し続けました.だって楽しいんだもん.

 

ちなみに,DirectX11を使ったのは,Windowsネイティブかつリファレンスやサンプルコードが比較的転がっている最新に近いライブラリだから選びました.9は負けた気がして,12はそもそも情報が集まりませんでした.11は最低限の情報しか集まらないなか,学校の図書館にリファレンス本が存在したので,これが大活躍.学校の図書館,恐るべし...!なお,これをものにした段階で1ヶ月消費して夏休み前でした.

 

XAudio2は,DirectSoundより推奨されてるからこっち使おう,みたいな感覚でした.こっちは比較的情報があって組みやすかったです.とはいえ,1つ生成すればいいMasteringVoiceを存在する音源分用意して処理と音を爆発させていたりもしましたが.

 

libogg / libvorbis は今回ほとんど使用せず.当初はOGGファイルに対応すればいいよねって思ってましたが,処理が時間かかるのとみんなWave形式で送ってくれたので,実装だけが残りました.けど,ちゃんと使えるようにはなっているんです.

 

その他,DirectX向けのスマートポインタやWaveファイルの読み込み,譜面ファイルの読み込みやメイン処理を実装.これらは,サイトにあるものを拾ってきて,半分は自分が思うように書き換えたり書き加えたり.結局はそのサイトの執筆者様が居なければ完全に詰みでした.本当に先人の方々,ありがとう!

 

ちなみに,譜面ファイルはBMSをそのまま流用しています.理由は,現在最も完成したPC向け音ゲーの譜面ファイルであると思うからです.実際,扱いやすかったです.

 

 

さて,実装した感想ですが,バグって怖いですね.

今回,いろいろなバグがあって,しかも原因が

が大多数を占めていました.己の愚かさを呪う....

なお,最終的には治ったんですが,最後の最後で変数の初期化を忘れて動かず,展示終了直後に体育館で後夜祭中にバグが修正できたという悲しいオチが付きました.あの時は崩れ落ちたね,えぇ.

 

あと,やっぱり好きなものを実装するって力になりますね,改めて実感しました.

今回,多分一人で数千行は書いたんですが,ポインタの概念やバグの発生しやすいポイントなんかがすごいよく理解できた気がします.

 

 

 

最後に,今回のコードがGitHubに上がっているので,コードを見て貶してやってください.もしかしたら今後の糧にするかもです.

github.com

SCKOSEN WriteUp (2017 / 10 / 21 - 2017 / 10 / 22)

奈良高専insecureで出場してました.theoldmoon0602氏,kyumina氏,miwpayou氏,thrust2799の4人で優勝できましたありがとうございます.

 

なお,活躍の中心はtheoldmoon0602氏の模様.やはりプロは強かった.

 

1日目は講義やら何やらで13:00 - 18:00,9:00でリモート会場まで走った意味とは.

2日目は9:00 - 12:00,警報でリモート会場である奈良高専が開かなかったので自宅出場部門に出場しました.

競技開始前はVPNに接続するのに時間が掛かってしまったArchユーザーの同志と,スコアサーバーのURLを間違えた2人がいた.私?バイナリが読めないって叫んでましたよ.

以下,解答に関与したもののWrite Upたち

画像がないのは仕様です

 

 00 サンプル

書いてあるフラグを入力するだけ

ある意味でCTFというものを一番表しているもので,いつもの.100[pt.].

 

04 OreNoFS

今大会で解けなかった問題.flag.zipがあって0x05fd000が開始クラスタの始点で0x183A000が最終クラスタの始点ってまでわかって,AllocationTableにはデータが存在するクラスタの情報があるまで分かったのに,順番が分からなかった...

結局theoldmoon0602氏が解いてかなり盛り上がった.優勝が決定した瞬間である. 

05 簡単な暗号化2

誰も解いてないじゃんで解き始めたもの.見たらアルファベットの羅列が.なんとなくそうっぽいでBase64Decodeかけると"4b500403...."って出てきたのでzipだって言ってました.pythonスクリプト組んで解読...できなかった.

ここからはtheoldmoon0602氏にやってもらって出てきたのはdocxファイル.中身がwordってファイルだったので一発でした.あとは縦にフラグ文字列が並んでたみたいです.

解けなかった原因ですが,多分デコードするときに改行文字読んじゃってノイズが混じったのが原因です.もっと確認すればよかった...

 

余談ですが,2007年以降のMS Officeファイルであるdocx・elsx・pptxとJava実行ファイルであるjarは全部zip形式なので解凍できます.覚えておきましょう.

あと,簡単って言う割にあまり誰も手を出してない印象だった.100[pt.].

17 ファイル送信pcap

私の得意なパケット解読ですやったね!

解析するとhtmlでlock.zipとLenna.pngがあって,さらにlock.zipにはLenna.pngが.この時点でPKCrackで既知平文攻撃をすることが確定しました.

 

が,なんかミスって動かない.理由はコマンド引数が間違ってたり平文.zip作ってなかったり.ほかのWrite Upでは平文.zipで問題が起こってたそうだけど何も考えずにzipしたら解けました.200[pt.]ですがほとんど私の成果って言っていいよね?

 

KoH2 通信を解析しろ

言われたので解析しました.すると10.201.1.101から10.201.1.102へのhttp通信にフラグが混ざってました.ボーナス100[pt.]です.

さて,本題はここから.フラグと一緒にあるのはどうやらサーバーで動いてるプログラムのバイナリに対するリンクっぽいのですが.その前にフラグが "p0rtkn0cking" って言うのでポートノッキングかなって思った(実はこの時点でチームメイトから言われたりもしてポートノッキングを調べてツールを入れた).

ここでtheoldmoon0602氏にノックしているポートをリストアップしてもらってノックした.するとサーバーの443ポートが開いてバイナリ露出.やったぜ.

バイナリ露出ということはつまりリバースエンジニアリングである.速攻でtheoldmoon0602氏に投げた.あの人はプロである.

投げて30 - 60分でサーバーにアクセス完了.チーム名を書き込んで継続取得のポイントです.これが決勝点となった.

 

ちなみに,私以外の人々も443ポートにアクセスできてたっぽいことを聞いてポートノッキングの必要性を疑ったけど,作成者曰く必要とのことなので多分IPアドレスの問題かとも思ったり.

 


 

 さて,これで500[pt.]取ったわけですが,実質300[pt.]となります.

ほかにもRSA問題を全部解いたkyuminaがいたりバイナリから当日のネットワーク設定まで担当したmiwpayouがいたりで私の存在価値が薄まっていてつらい....OreNoFSも解きたかったけどtheoldmoon0602氏強かったし.

ただパケットが読めるだけの弱者から早く脱却することが望まれる大会になりました.

 

そうそう,パケット読んでても内容がかなりわかるようになったし,ネットワークスペシャリスト試験は有能.みんなも受けよう!(ダイレクトマーケティング

 

最後に,いろいろ手伝ってくれた人のWrite-Upです->

高専セキュリティコンテスト #SCKOSEN で優勝した - ふるつき