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があったって噂マジ???