僕の世界観を変えてみる

文系男子が趣味でプログラミングを勉強していくブログです。他にも日常で起きたどうでもいいことや愚痴を書いていきたいです。座右の銘は和を以て貴しとなすです。仲良くやろうよ。

CTF初心者によるCpawCTF Lv2のWriteUp

f:id:htmllifehack:20180612201823j:plain

CpawCTF - Main page

Cpaw CTF Lv2のWriteUpを書こうかな。なんて。

偉そうに書いてるけど答え見てるからね(笑)

▼参考サイト
ctf_for_myself/Level2-cpawctf-20160919.md at master · wmrn/ctf_for_myself · GitHub
CpawCTF write up(Level2)


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

ステガノグラフィー(steganography)とは、データ隠蔽技術の一つであり、データを他のデータに埋め込む技術のこと、あるいはその研究を指す。クリプトグラフィー(cryptography)がメッセージの内容を読めなくする手段を提供するのに対して、ステガノグラフィーは存在自体を隠す点が異なる。
ステガノグラフィー - Wikipedia

画像の左上と右下にある・と-、これはモールス信号なんですって!

わかるかー

モールス信号を文字に変換するサービスがweb上にありますが、うまくいったのは下記サイトだけです。

Morse Code Translator by Various Words

" :) " が " :( " になっちゃうところもあったので注意です。

Q15.[Web] Redirect

このページでデベロッパツールを開きタグをElementsからNetworkに変更します。

f:id:htmllifehack:20180612203847j:plain

そんで問題のリンクをクリック。

ツール上にあるq15.ctf.cpaw.siteをクリックすると右側のウィンドウに詳細が表示されます。

フラグはそのなかにあります。

f:id:htmllifehack:20180612204716j:plain

Q16.[Network+Forensic]HTTP Traffic

wiresharkの出番です。

「Wireshark」ネットワークプロトコルアナライザー - 窓の杜ライブラリ

見ていたページを修復しろってことなのでHTTPを探します。

ファイル→オブジェクトをエクスポート→HTTPの順にクリック

f:id:htmllifehack:20180612205824j:plain

ウィンドウが開いたらすべて保存

f:id:htmllifehack:20180612205957j:plain

network100.htmlをテキストエディタで表示するとcssやjavascriptがどこにあったのかがわかります。

f:id:htmllifehack:20180612211002j:plain

最終的にはこんな感じでフォルダをまとめます。

f:id:htmllifehack:20180612211107j:plain

まとめたらnetwork100.htmlをブラウザで開くとフラグが現れます。

HTMLやっていたらわかりますね。

▼参考サイト
Wiresharkのコアな使い方|HTTPパケットからWebコンテンツ再生

Q17.[Recon]Who am I ?

@porisuteru スペシャルフォース2でググったらでてきた(笑)

TwitterAPI使って呼び出すのかと思ってひやひやした(笑)

Q18.[Forensic]leaf in forest

またしても拡張子のわからないファイルです。

fileコマンドで見るとtcpdumpファイルのようです。

僕はここでめちゃくちゃハマりました(笑)

tcpdumpというネットワークキャプチャツールらしいです。

ずっとtcpdump使うもんだと思ってたんですけど他の人のWriteUpを見たらふつうにテキストで開いてました(笑)

そういうもんなんですね(笑)

f:id:htmllifehack:20180612212921p:plain

loveliveという文字が沢山書かれているのですべて置換して消し去ります。

最終的に大文字だけ残るので、そうしたら答えに気付くはずです。

これもコード書けそうですよね。

Q19.[Misc]Image!

UbuntuやMacはunzipコマンドで展開できます。

オプションで-dを付けるとフォルダを指定して展開します。

フォルダがない場合は新規で作成されます。

toor@toor-VirtualBox:~/ダウンロード$ unzip misc100.zip -d test

この問題たまたまMacでやってて、content.xmlをたまたまテキストエディットで開いたら答えが書かれてました(笑)

本来はzipのままLibreofficeで開くらしいです。

f:id:htmllifehack:20180612214413j:plain

Q20.[Crypto]Block Cipher

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

タイトルを調べるとどうやらブロック暗号のコードらしい。

▼ブロック暗号とは
【第8回】暗号アルゴリズムについて|セキュリティコラム|シーアイシーシステムズ

シーザー暗号は文字を置き換える(換字)に対してブロック暗号は文字を並び替える(転字)というアルゴリズム。

とりあえず実行する

C言語の実行すらしらないのでググる。

Cはgccコマンドでコンパイルすることで実行ファイルが作成される。

toor@toor-VirtualBox:~/ダウンロード$ gcc crypto100.c

するとa.outというファイルが作成されるのでこれを実行してみる。

toor@toor-VirtualBox:~/ダウンロード$ ./a.out
Segmentation fault (コアダンプ)
toor@toor-VirtualBox:~/ダウンロード$ ./a.out cpaw{ruoYced_ehpigniriks_i_llrg_stae}
Segmentation fault (コアダンプ)

なんなんだこれ、Segmentation fault調べても理由は様々。

詰んだわわからん。

ソースコードを読み解く

Point
argc = argument count = パラメータの数。コマンドラインに入力された単語を数えmain関数に渡す。
argv = argument vector = 配列へのポインタ = 何言ってるのかわからん
key = キー入力
atoi = 文字列を数値に変換。iはint
const = 定数、書き換え不可。
for = for (初期化式; 継続条件式; 変化式)

int key = atoi(argv[2]) はコマンドライン2番目の引数
const char* flag = argv[1] はflagが1番目の引数
当然a.outが0番目の引数なので全部で3つ引数を与えないといけないということが分かった。

わからないので試しにaを与えてみるとcpaw{}と表示された。

次にaaaを与えてみたが結果は同じだった。

なので今度は数字を与えてみた。

するとどうだ、なんか多少変化するではないか。

つまりはそういうことなのだ。

toor@toor-VirtualBox:~/ダウンロード$ ./a.out ruoYced_ehpigniriks_i_llrg_stae a
cpaw{}toor@toor-VirtualBox:~/ダウンロード$ ./a.out ruoYced_ehpigniriks_i_llrg_stcpaw{}toor@toor-VirtualBox:~/ダウンロード$ ./a.out ruoYced_ehpigniriks_i_llrg_stcpaw{}toor@toor-VirtualBox:~/ダウンロード$ 
toor@toor-VirtualBox:~/ダウンロード$ ./a.out ruoYced_ehpigniriks_i_llrg_stae 1
cpaw{ruoYced_ehpigniriks_i_llrg_stae}toor@toor-VirtualBox:~/ダウンロード$ ./a.out ruoYced_ehpigniriks_i_llrg_stae 2
cpaw{urYoec_dheipngriki_s_illgrs_ate}toor@toor-VirtualBox:~/ダウンロード$ ./a.out ruoYced_ehpigniriks_i_llrg_stae 3
cpaw{ourecYe_diphingkiri_sll__grats}toor@toor-VirtualBox:~/ダウンロード$ ./a.out ruoYced_ehpigniriks_i_llrg_stae 4
cpaw{Your_deciphering_skill_is_great}toor@toor-VirtualBox:~/ダウンロード$ 

Q21.[Reversing]reversing easy!

前回同様fileコマンドでどんなファイルなのか調べてみる。

toor@toor-VirtualBox:~/ダウンロード$ file rev100
rev100: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=f94360edd84a940de2b74007d4289705601d618d, not stripped

問題文にあるようにELFファイルだわ。

これまた前回同様objdumpコマンドを使ってみる。

するとフラグらしき文字列が...

toor@toor-VirtualBox:~/ダウンロード$ objdump -s rev100
 80484b0 31c0c744 24466370 617766c7 44244a7b  1..D$Fcpawf.D$J{ ←ここ
 80484c0 00c74424 20790000 00c74424 24610000  ..D$ y....D$$a..
 80484d0 00c74424 286b0000 00c74424 2c690000  ..D$(k....D$,i..
 80484e0 00c74424 306e0000 00c74424 34690000  ..D$0n....D$4i..
 80484f0 00c74424 386b0000 00c74424 3c750000  ..D$8k....D$<u..
 8048500 00c74424 40210000 0066c744 24157d0a  ..D$@!...f.D$.}.
 8048510 c6442417 00c74424 1c050000 008d4424  .D$...D$......D$

この時点でなんとなく察することができる。

pythonで正規表現を使って余分な文字を消してみた。

import re
s = '''
 1..D$Fcpawf.D$J{
..D$ y....D$$a..
..D$(k....D$,i..
..D$0n....D$4i..
..D$8k....D$<u..
..D$@!...f.D$.}.
.D$...D$......D$    
'''
result = re.sub(r'[-\($,\n./:-@ +[-`-~A-Z0-9f]','',s)
print(result)

>>cpaw{yakiniku!}

!が入るから気を付けようね。

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

でたSQL、selectとfromしか知らない(笑)

select で呼び出し、*はすべての要素、fromでなんてテーブルを呼び出すのか指定する。

select * from palloc_home 

palloc_homeというテーブルからすべての要素を呼び出した。

するとフラグが表示されるが次のステージへ行くように促されるのでリンクをたどってみる。

Stage2. Palloc in in Wonderland

パスワードを探す問題のようだがまったくわからん。

pallocではダメ、Q17と同様に@porisuteru パスワードで検索したけどダメ

諦めてステージ1のフラグを入力してみるとまさかのクリアw

なんでやねーん。

SQLインジェクション

stage2に関してはWriteUpが少ないです。

検索するといくつかWriteUpがでてきますがだいたいstage1のみ。

唯一見つけたのがこの方。
CpawCTF-writeup/Baby's-SQLi---Stage-2-.md at master · caffeinhack/CpawCTF-writeup · GitHub

'  or 1=1 --

これがなんなのかわからないけど予想

  1. シングルクォーテーションで呼び出しの条件を文字に変換している?
  2. or 1+1ですべてTrueにしている?
  3. --で後の構文をコメントアウトしている?

というかこういう攻撃方法があるんですね、知らないことばかりだ。

Q28.[Network] Can you login?

パケットを読んでみる。

f:id:htmllifehack:20180613233643j:plain

今回はFTPだのTCPだのしかなくてまったくわからない。

▼FTPとは
いまさら聞けない「FTP」とは?基礎知識を徹底解説! | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

サーバにHTMLやcssのファイルをアップロードするときにFFFTPっての使った記憶がある。

要するにアップロードするためのプロトコルのことだよね?

問題に戻ろう、よくよく見るとUserとPassを発見。

157.7.52.186がそのアドレスのようなのでアクセスしてみる。

http://157.7.52.186だとcpawctfのサイトに飛んでしまう。

ftp://157.7.52.186とブラウザに入力するとFTPサーバに行けるのでログインしてみる。

ちなみにパスワードは右クリック→コピー→値を選択するとパスワードだけコピーできる。

f:id:htmllifehack:20180613234607j:plain

しかしそこにはdummyというファイルがあり、中を開くとFLAG file exists in this directory.と書かれていた。

わからんのでWriteUpを見てみた。
ctf_for_myself/Level2-cpawctf-20160919.md at master · wmrn/ctf_for_myself · GitHub

コマンドラインでもFTPサーバにアクセスできるようなのでやってみよう。

toor@toor-VirtualBox:~/ダウンロード$ 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:toor): cpaw_user
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -a
500 Illegal PORT command.

ftpコマンドでftpを起動。

open ipアドレスで接続。

nameにユーザ、あとはパスワードを入力してログインする。

ls -a ですべてのファイルを表示。

しかし500 Illegal PORT command.というエラーが現れた。

ググるとパッシブモードにするとコマンドが使えるようになるみたい。

ftp> passive
Passive mode on.
ftp> ls -a
227 Entering Passive Mode (157,7,52,186,234,125)
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
226 Directory send OK.

hidden_flag_fileを発見!

getコマンドでダウンロードできる。

一つ目の引数に欲しいファイル名を二つ目の引数でなんて名前で保存するか指定する。

ftp> get .hidden_flag_file Q28_flag
local: Q28_flag remote: .hidden_flag_file
227 Entering Passive Mode (157,7,52,186,234,118)
150 Opening BINARY mode data connection for .hidden_flag_file (39 bytes).
226 Transfer complete.
39 bytes received in 0.00 secs (20.4873 kB/s)
ftp>

ちなみに二つ目の引数に-を指定するとその場で開くことができるようです。

>|sh|
ftp> get .hidden_flag_file -
remote: .hidden_flag_file
227 Entering Passive Mode (157,7,52,186,234,100)
150 Opening BINARY mode data connection for .hidden_flag_file (39 bytes).
cpaw{f4p_sh0u1d_b3_us3d_in_3ncryp4i0n}
226 Transfer complete.
39 bytes received in 0.00 secs (23.8933 kB/s)
|

▼参考サイト
lsコマンドの使い方と覚えたい15のオプション【Linuxコマンド集】
FTPで「500 Illegal PORT command」と出た « Demence/Cup
ftpコマンドでアクティブモードを使う(Linux) - sheeplogh :: memo
ftpのgetコマンドでテキスト・ファイルの内容を素早く確認する − @IT

まとめ

いやCとかSQLとか難しいですね。

難しいっていうかやったことないからわからない。

バイナリはわけがわからない。

あ、バイナリで思い出したんですけど、Q21.[Reversing]reversing easy!の問題、

僕はobjdumpで無理やり探しましたけど、strings使うと簡単に見つかるらしいです(笑)

知らないって怖いですね、というかLv1で一回使ってるんですけどね(笑)

まあLv1のときは役に立たなかったので忘れてたってことで。

まだLv3はチャレンジしてないんですがまたクリアしたら書こうと思います。