答え合わせ
スゴイ内輪でやってるCTF的なやつの答え合わせ的なやつ
自分が作ったのを自分でWriteup書くという自作自演感。
初心者以下の自分が初めての人用にと作ったのでしょうもない上にあまり面白くもないと思うので、身内用に。
1. ba_ev.zip
zipの中に
- auth.pcap
- password.txt
があって、
auth.pcapはBasic認証
GET /itc/syuku/ HTTP/1.1 Host: -mondaiurl- Connection: keep-alive Authorization: Basic Z29yaXJhOm5lbXV0YWk= Accept: text/html,application/xhtml+xml,application/ ...
Z29yaXJhOm5lbXV0YWk=
は普通にbase64なので
デコードするとgorira:nemutai
wiresharkなら勝手にデコードしてくれる。
実際にBasic認証のページ( -mondaiurl- /itc/syuku/)にアクセスしてみると、
サーバーからのメッセージ: password is Password.txt at line pcap's src ip or mac
と言われる。
英語が稚拙なのは作ってたのが真夜中という言い訳をしつつ、pcapのIPアドレスとかMacアドレスを見てみるとどっちも00:00:00:00:00:ffと0.0.0.255で255。
それでpassword.txtの255行目を見ると
253 flipper 254 franklin 255 takoyaki_tabetai 256 frodo 257 honda 258 horses
怪しい文字列takoyaki_tabetai
が
ちなみにwindowsのメモ帳で開くと改行コードが認識されず全部1行で出るのでsublimeとか他のエディタとかで…
というか何故メモ帳…
とりあえずbasic認証をgorira:takoyaki_tabetai
で入ると完全JSで出来た無理ゲーが出てくる。
Monsterをすべて倒せるPlayer nameをslackでavisに直接投げてね。
とあるのでとりあえずplayer nameのとこに何か突っ込めば良いとわかる。
ページのソースを表示でjsをちらっと見ると
func = "(function(){return new Player('" + name + "',400,20)})" return eval(func)();
文字列のfuncをevalで実行してる部分をなんとかすればいいことがわかる。
god',1000000,1000000)})//
こんな感じでnameにnewするパラメータを入れ、あとの文字列をコメントアウトすれば、
(function(){return new Player('god',1000000,1000000)})//',400,20)})
こんな感じになり、とりあえずクリア出来る。
ハードモードは挿入する文字列に100以上の数字を入れると適当な正規表現パターンに引っかかって強制的に10に書き換えられるので、
god',Infinity,Infinity)})//
とかgod',0xffff,0xffff)})///
とかで文字列使わずに強くするか、
god',NaN,99)})///
とかで不死身にするのが良いかなという感じです。
ちなみに最短は','a
の4文字
簡単解説すると
(function(){return new Player('','a',400,20)})
こうなって、3つ目以降の引数は無視されて、 'a'はNaNに、デフォルトのHP400が攻撃力に。
very HardはPlayer functionとかMonsterの配列いじったりすればなんとかなると。
おわり
2. pcapのやつ
解凍するとw_pcap.pcap
が出てくる。
中身はひたすらSMB2のCreate Requestとかが。
全部目grepしてもいいけど
wiresharkのフィルタで
smb2.write_data
とかするとファイル書き込みだけに絞れる。
するとhint.txtの中身が
imyb://◯◯◯◯◯.◯◯/xiu/alzdm9/xkav4.dyy 1,19,5,12,26,17,27,14,4,16,0,9,19,7,17,16,15,15,18,21,8,13,5,19,18,25,15,16,2,13,2,4,6,20,9,18
1行目imyb://◯◯◯◯◯.◯◯/xiu/alzdm9/xkav4.dyy
がurlっぽく、2行目の数字分戻していくとhttp〜になり、シーザー暗号っぽいとわかる。
全部戻すと
http:// -mondaiurl- /itc/syuku4/hint0.jpg
が出てくる
hint0.jpgをダウンロードして、EXIFを見ると
Make : ~ mj9qOzoaWj56Phob+j6aP0o+Ohv6Pzo/mj9aPro/WjtKG/o+ij6aPuo/ShpaPno+mj5g== Orientation : Horizontal (normal) Resolution Unit : inches Software : WklQpM6l0aW5pe+hvKXJpM/JxLv6pe2hvKXeu/o1yri7+go=
MakeとSoftwareにbase64っぽい文字列が。
デコードサイトとかでデコードすると文字化けするのでエンコードをEUC-JPとかにすると
Make :http:// -mondaiurl- /itc/syuku4/hint.gif Software :ZIPのパスワードは苗字ローマ字5文字
になる。
あとは1個目のgifアニメの途中に出てくる短縮urlにアクセスすればパスワードが出てくるのだけれども、そもそもZIPがない。
さっきのhint0.jpgをunzipとかしてもzipが入っていないのでとりあえずjpegの終端コードを探してみる。
$ hexdump hint0.jpg | grep "ff d9" 00012a0 92 49 24 94 a4 92 49 25 29 24 92 49 4f ff d9 00 00022a0 24 94 a4 92 49 25 29 24 92 49 4f ff d9 00 ff e2 0014cd0 38 45 ff d9 37 7a bc af 27 1c 00 03 c3 d6 67 1c
すると14cd0行目のff d9
のあとに37 7a bc af 27 1c 00 03
とある。
お分かりの通り、これは7zipのヘッダーなので、あとは
$ 7z x hint0.jpg
でanswer.zip
が出てくる。
それにさっきのパスワードを入れて解凍
unzip -P パスワード answer.zip
で答えの404お姉さんが出てくる。
おわり。
3. sql.zip
解凍すると
- answer.zip
- hint2.zip
- q.txt
が。zipにはパスワードがかかっている。
q.txtには
問題 答えを探して見つけてネ http://59.106.210.146:9999/ hint1 zipのpass = 答え テスト用 test:testes
とある。
http://59.106.210.146:9999/にアクセスしてみると、
ユーザー名、パスワードを求められる。
とりあえずユーザー名:'
、パスワード:a
を入力してみるとエラーが。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0cc175b9c0f1b6a831c399e269772661'' at line 1
SQLインジェクションっぽく、パスワードはmd5に変換されていることがわかる。
とりあえずSQLインジェクションのよくあるやつ1' or 1=1; -- '
をユーザー名に入力してログインしてみると
ログイン成功 id ユーザー名 パスワード(hashed) 8 root c0f7e2cc4e2c4fad6f9e1093e3c97088 9 ika 8242328498dc4ea53c5f624382484fc1 11 avis 7245253e24719ba66a84512838cd02f2 13 kotae 863c8bae7363efc4d998c81126048db0 15 test 6e7906b7fb3f8e1c6366c0910050e595
が出てくる。
大体のやつはググれば出てくる(ハズ
人のやつコピペ
8 root c0f7e2cc4e2c4fad6f9e1093e3c97088 gorira 9 ika 8242328498dc4ea53c5f624382484fc1 11 avis 7245253e24719ba66a84512838cd02f2 nemui 13 kotae 863c8bae7363efc4d998c81126048db0 15 test 6e7906b7fb3f8e1c6366c0910050e595 testes
ikaとkotaeは出てこないので、とりあえずkotaeの03cddbe6f50c559ab6073d5b9c78a450
を入れるとhint2.zipが解答できる。
解凍するとhint.txtが出てきて
md5 レインボーテーブル md5 逆変換 とかでググると…
とか書いてるのでそれっぽいサイトのレインボーテーブルとかでkotaeのパスワードがotukare
であることがわかる。
それでanswer.zipを解答するとans.txtが出てくる。
ちなみに、今回の問題は簡単すぎたと思い、隠し問題というか、唯一わからないikaユーザーのパスワードが隠し問題になっていて、
前回の問題の答えが404のおねえさんだったことから、http://5.106.210.146:9999/aaa
とかにアクセスして404ページを出してみると、sinatraのデフォルト404ページが出てくる。
ページのhtmlを見てみると、
<head> <meta hint="get /404 and login user'ika'"> <style type="text/css"> ...
metaタグにhint属性があり、http://5.106.210.146:9999/404
にアクセスしてみると、ユーザー登録ページが出てくる。
セカンドオーダーsqlインジェクションっぽいけど、ikaユーザーで適当なパスワードでsqlにinsertしてログインすると答えが出る。
おわり
sqlとかよくわからない人用説明
ログイン用のsqlは
query = "SELECT * from user where name like '" + name.to_s + "' and password = '" + mdpass + "';"
こんな感じに文字列で作られていて、それをexecute()で実行している。
mdpassはmd5に変換されてしまうので、nameの方に1' or 1=1; -- '
をすると、実行されるsqlは
SELECT * from user where name like '1' or 1=1; -- '' and password = '" + mdpass + "';"
--
以下はコメントアウトされ、or 1=1
がtrueになり、全ての行が選択されるという仕組み。