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

3846ctf q4

知り合いが主催している#3846ctfというのがありまして,Amazonギフトコードがフラグになってるプチ賞金付きCTFとなっています. 今回は4回目の出題.幸運にも初めにフラグをとることができたようなので,備忘録ついでにwriteupを.

問題概要

問題ページをクリックするとquestions.htmlに飛び,以下のようなことが書かれています.

YUKI.N > This question was already given.

RYOKO.A > Right now, I have the control of the flow of the data in this space.
RYOKO.A > Nothing can enter.

これだけ.

writeup

※writeupというよりかは自分の思考過程を記したものです.適宜読み飛ばして下さい.

最初全く見当もつかず,ページのソースを眺めるも特に何かが隠されてるわけでもなし.

ChromeのWeb Inscpectorで通信を追っかけてみると,/questions/04で302が返ってきていて,49152ポートにリダイレクトされた後に/questions/04/question.htmlにリダイレクトされてることがわかりました.

ヘッダ部分を見ると X-Hint:YUKI.N > Access via terminal console.とあるので telnet ctf.mikumiku.moe 49152をしてみたところ,(curlではうまく動きませんでした)

YUKI.N > Can you see this?(yes)
You > yes<Enter>

YUKI.N > Bye.
Connection closed by foreign host.

すぐに閉じられてしまいました.

10分ほど頭をひねって,改行コードが悪さしてるのではと思いつく.

You > yes<Ctrl-d>

YUKI.N > 3846CTF CTF #004 : Ryoko Asakura 
 
- - - - - - - - - - - - - - - - - - - - -

何か出てきました.

しばらく観察してると,最後に以下の文が.

Mission 
  - Delete "Ryoko Asakura" from SQL until your connection is killed. 
  - DO NOT delete other data. 
  - Your connection will be killed after 3 minutes by Ryoko Asakura. 
  - SQL returns only 1 line per 1 query. 
  - SQL can use "SELECT" and "DELETE". 
  - SQL query cannot be included "WHERE" 

要は

  • DBから"Ryoko Asakura"を削除する
  • 他のデータを消してはいけない
  • SQL文ではSELECTとDELETEを使用することができるがWHEREは使えない
  • 実行されたSQL文は結果の1行目しか表示しない

を達成しろ,ということです.(はじめ太字の所を忘れててハマりました) 自分はSQLをほぼ使ったことがないので適当に調べながらやりました.
まずはデータベースの情報がほしいので適当にSQL文を打つ.

select * from

": syntax error SQLITE_ERROR: near "

sqliteということがわかったので,

select * from sqlite_master

|table|database|database|2|CREATE TABLE database (serial_code INTEGER PRIMARY KEY, personal_name TEXT)|

これでテーブル名とDB名もわかりました.


あとは1行ずつしか表示されないことを考慮して,group_concat()を使うのが良さそうです.

select group_concat(personal_name) from database

|Kouichi Yoshizaki,Kanae Yura,The Computer Research Society President,Ayano Narusaki,Mikuru Asahina,Mizuki
 Okajima,Mizuho Saeki,Nanaka Oonogi,Haruhi Suzumiya,Masaki Uematsu,Keiji Yamatsuchi,Arakawa,Mai Zenzai,Yoshimi
 Sakanaka,Keigo Matsushiro,John Smith,Kyon,Shoya Kakinouchi,Sumire Yanagimoto,Keichi Tamaru,Sakuha Hinata,Kyoko
 Tachibana,Sonou Mori,Ryoko Asakura,Tsuruya,Reiko Hayama,Kotone Kenmochi,Akihiro Nakajima,Itsuki Koizumi,Miyoko
 Yoshimura,Emiri Kimidori,Kennosuke Arakawa,Yui Nishijima,Ippei Tejima,Eijiro Oomori,Okamoto,Daichi Sakaki,Outa
 Hanaze,Kyosuke Gotou,Sasaki,Noboru Toyohara,Miyuki Enomoto,Yutaka Tamaru,Fujiwara,Miharu Suzuki,Yukihiro
 Yamane,Kiyosumi Morimura,Kunikida,Kuyou Suou,Kaori Senou,Yukina Takatou,Yusuke Suzuki,Takako Nakanishi,Yuki
 Nagato,Taniguchi|


問題はwhereが使えないので,手動でデータを選択する必要があります. 適当にググったら結果出力のオフセットをlimitとoffsetで指定できることがわかったので,これが利用できそうです.(limitがないとoffsetは働きません)

select personal_name from database limit 1 offset 20

|Sakuha Hinata|

目で"Ryoko Asakua"の位置を数えても大丈夫ですが,3分過ぎてしまうと接続を切られてしまうため適当なスクリプトを書いて計算させました.(再接続するのに時間がかかります)

先ほどのgroup_concat()の結果を用いて,

s.find(",", 0, s.find("Ryoko Asakura"))
>> 23

select personal_name from database limit 1 offset 23
|Ryoko Asakura|

23番目にあることが確認できたのでdeleteします.

delete from database limit 1 offset 23

そうするといろいろメッセージが出てきて,

** Congratulation! **
Please re-access with Header as above.
X-Key: GLASSES

X-KeyヘッダにGLASSESを指定してアクセスしろ,とのことなのでアクセスするとフラグが出てきます.

icchy@kali:~$ telnet ctf.mikumiku.moe 49152
Trying 157.7.234.216...
Connected to ctf.mikumiku.moe.
Escape character is '^]'.
GET /
X-Key: GLASSES

HTTP/1.1 307 Temporary Redirect
Location: http://ctf.mikumiku.moe/questions/04/question.html
Server: YUKI.N Server
Content-type: application/x-YUKI.N; charset=UTF-8
X-Hint: YUKI.N > Access via terminal console.

YUKI.N > AMZN{4PJP-3NR2B5-F5C9}
Connection closed by foreign host.

余談

本文を適当にググる涼宮ハルヒの憂鬱の一節の英訳ということがわかりました. (元の文)http://animetranscripts.wikispaces.com/Haruhi%3E04.+The+Melancholy+of+Haruhi+Suzumiya+%E2%85%A3と照らし合わせると

Asakura:
It's useless.
Right now, I have the control of the flow of the data in this space.
Nothing can enter, nothing can leave.

とあり,"nothing can leave"が抜けてるなーと思いながらいろいろ試してました.結果的に全く意味はなかったです.