読者です 読者をやめる 読者になる 読者になる

眠気

戯言とメモ

答え合わせ

スゴイ内輪でやってる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.jpganswer.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になり、全ての行が選択されるという仕組み。