task4233のめも

書きたいことをつらつらと

CpawCTF Level2 メモ

問題一覧

CpawCTF - Main page

Q13. [Stego] 隠されたフラグ

問題文に書かれている通り、隅を見ると.と-の文字列を発見。
トンツーだと思い、モールス信号の変換サイトに打ち込んでみるとビンゴだった。
しかし、cpaw{変換した文字列}を打ち込むものの何故か通らない……
色々と打ち込んで見ると、変換した文字列の頭についているcpawを消したら通った。
どうやら頭のcpawは除去して良いらしい。

Q15. [Web] Redirect

とりあえずデベロッパーツールを開く。
案の定、NetworkのHeadersにX-flagがあった。
余談だが、Firebugって開発終了してたのね。
知らなかった。

Q16. [Network + Forensic] HTTP Traffic

.pcapファイルなので、Level1で使用したwiresharkで開いてみる。 すると、ところどころにhtmlの断片らしきものが確認できた。
しかし、肝心のflagが見つからないため解法を調べる。
すると、wiresharkにはオブジェクトをエクスポートできる機能があるので、それを使用すればよいとのこと1
エクスポートしてファイルを1つずつ見ていくと、network100(1)のファイルの中に

フラグが欲しかったら下のボタンを押すんだ!!

とある。
そのため、拡張子を.htmlにして開いてみると、ボタンが表示されていない。
ソースコードを確認すると、OnButtonClickの処理が ./js/button2.js に書かれているようなので、button2.jsを指定された場所に配置。
クリックするとcpaw{***}が描画されている画像が表示されるため、終了。

Q17. [Recon] Who an I?

書かれている情報をググって、画像を見て終了。

Q19. [Misc] Image

対象のzipファイルを解凍すると、いくつかのファイルが出てきた。
その中の meta.xml を開くと、

LibreOffice/4.2.8.2$Linux_X86_64 LibreOffice_project/420m0$Build-2

との記述があるため、LibreOfficeで開くと黒い長方形で隠された画像が表示された。
それをずらし、解答をコピーして終了。

Q20. [Crypto] Block Cipher

提示されたCファイルを見ると2つ目の引数の値によって復号が変わるようだったので、
ソースコードを以下の通りに書き換えた。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]){
  int h, i, j;
  const char* flag = argv[1];
  for (h = 0; h < 40; ++h) {
    printf("cpaw{");
    for(i = h - 1; i <= strlen(flag); i+=h)
      for(j = i; j>= i - h + 1; j--)
    printf("%c", flag[j]);
    printf("}\n");
    
  }
  
  return 0;
}

コンパイルして実行し、意味の通るものを見つけて終了。

Q21. [Reversing] reversing easy!

fileコマンドで調べると、32bitのLinux実行ファイルらしい。
実行できないので、バイナリエディタで見てみると、cpawの文字はあるものの、その先が見れない……
解法をググるstrings コマンドというものを使用するらしい[^1]。
先ほどcpawという文字列を見つけたので、
$ strings | grep -A 20 cpaw
を実行してflagを取得し、終了。

Q22. [Web] Baby's SQLi - Stage 1 -

提示されたページにアクセス。
SQL文を入れろとのことなので、調べて打ち込んで終了。
SELECT * FROM palloc_home

SELECT * (全ての行を表示)
FROM palloc_home (palloc_homeというテーブルにおける)

Q28. [Network] Can you login?

また.pcapファイルか……
と思いつつwiresharkで開き、一行ずつ目を通していく。
その中で、

USER cpaw_user

という記述を見つけたものの、
何をすれば良いのか分からず、解説を見る。 解説によると、
1. .pcapファイルからユーザ名とPASSを取得
2. それらを使用し、FTPサーバに接続
3. サーバ内にあるflagを取得
という流れのようだ。

順を追って試してみる。
1. .pcapファイルからユーザ名とPASSを取得
どうやら、USERの記述の後にPASSの記述もあったらしい。
ランダムな文字列だったので見逃していた。
2. それらを使用してFTPサーバに接続
FTPサーバへは$ ftp コマンドを使用するとのこと。
以下、接続の流れである。

ftp> open 157.7.52.186    
Connected to 157.7.52.186.  
220 Welcome to Cpaw CTF FTP service.  
Name (157.7.52.186:user_name): cpaw_user  
331 Please specify the password.  
Password:  
230 Login successful.  
Remote system type is UNIX.  
Using binary mode to transfer files.  

このように、ユーザ名とPASSを入力して接続する。
3. サーバ内にあるflagを取得
接続できたようなので、早速ls -aを叩いてみる。
しかし、500 Illegal PORT commandと表示されてしまう。
解説を見ると、active modeからpassive modeというモードに変更する必要があるようだ。 ちなみに、active modeとpassive modeの違いはどちらが主導権を握っているからし2

名称 主導権
active mode サーバ側
passive mode クライアント側

それはさておき、passve modeにするためには単にpassiveと入力するだけで良いとのこと。
そして、ls -aを叩くと

227 Entering Passive Mode (157,7,52,186,234,111)
150 Here comes the directory listing.
drwxr-xr-x 2 ftp ftp 42 Sep 03 2017 .
drwxr-xr-x 2 ftp ftp 42 Sep 03 2017 ..
-rw-r--r-- 1 ftp ftp 39 Sep 01 2017 .hidden_flag_file
-rw-r--r-- 1 ftp ftp 36 Sep 01 2017 dummy

と表示された。
.hidden_flag_fileを開こうとcatコマンドを使用したが、何故か開けない……
仕方がないので、getコマンドでダウンロード。
ローカル環境で見るとflagが見つかり、終了。

感想

Level1と比べて、難しくなったというよりかは専門的になってきたという印象が強い。
具体的には、wiresharkの使用法やstringsコマンド、ftpサーバへの繋ぎ方など様々だ。
だが、まだ理解できるレベルなので問題は無さそう。
明日はLevel3をやろう。