CTF初心者によるCpawCTF Lv2のWriteUp
Cpaw CTF Lv2のWriteUpを書こうかな。なんて。
偉そうに書いてるけど答え見てるからね(笑)
▼参考サイト
ctf_for_myself/Level2-cpawctf-20160919.md at master · wmrn/ctf_for_myself · GitHub
CpawCTF write up(Level2)
- Q13.[Stego]隠されたフラグ
- Q15.[Web] Redirect
- Q16.[Network+Forensic]HTTP Traffic
- Q17.[Recon]Who am I ?
- Q18.[Forensic]leaf in forest
- Q19.[Misc]Image!
- Q20.[Crypto]Block Cipher
- Q21.[Reversing]reversing easy!
- Q22.[Web]Baby's SQLi - Stage 1-
- Stage2. Palloc in in Wonderland
- Q28.[Network] Can you login?
- まとめ
Q13.[Stego]隠されたフラグ
ステガノグラフィー(steganography)とは、データ隠蔽技術の一つであり、データを他のデータに埋め込む技術のこと、あるいはその研究を指す。クリプトグラフィー(cryptography)がメッセージの内容を読めなくする手段を提供するのに対して、ステガノグラフィーは存在自体を隠す点が異なる。
ステガノグラフィー - Wikipedia
画像の左上と右下にある・と-、これはモールス信号なんですって!
わかるかー
モールス信号を文字に変換するサービスがweb上にありますが、うまくいったのは下記サイトだけです。
▼Morse Code Translator by Various Words
" :) " が " :( " になっちゃうところもあったので注意です。
Q15.[Web] Redirect
このページでデベロッパツールを開きタグをElementsからNetworkに変更します。
そんで問題のリンクをクリック。
ツール上にあるq15.ctf.cpaw.siteをクリックすると右側のウィンドウに詳細が表示されます。
フラグはそのなかにあります。
Q16.[Network+Forensic]HTTP Traffic
wiresharkの出番です。
▼「Wireshark」ネットワークプロトコルアナライザー - 窓の杜ライブラリ
見ていたページを修復しろってことなのでHTTPを探します。
ファイル→オブジェクトをエクスポート→HTTPの順にクリック
ウィンドウが開いたらすべて保存
network100.htmlをテキストエディタで表示するとcssやjavascriptがどこにあったのかがわかります。
最終的にはこんな感じでフォルダをまとめます。
まとめたらnetwork100.htmlをブラウザで開くとフラグが現れます。
HTMLやっていたらわかりますね。
Q17.[Recon]Who am I ?
@porisuteru スペシャルフォース2でググったらでてきた(笑)
TwitterAPI使って呼び出すのかと思ってひやひやした(笑)
Q18.[Forensic]leaf in forest
またしても拡張子のわからないファイルです。
fileコマンドで見るとtcpdumpファイルのようです。
僕はここでめちゃくちゃハマりました(笑)
tcpdumpというネットワークキャプチャツールらしいです。
ずっとtcpdump使うもんだと思ってたんですけど他の人のWriteUpを見たらふつうにテキストで開いてました(笑)
そういうもんなんですね(笑)
loveliveという文字が沢山書かれているのですべて置換して消し去ります。
最終的に大文字だけ残るので、そうしたら答えに気付くはずです。
これもコード書けそうですよね。
Q19.[Misc]Image!
UbuntuやMacはunzipコマンドで展開できます。
オプションで-dを付けるとフォルダを指定して展開します。
フォルダがない場合は新規で作成されます。
toor@toor-VirtualBox:~/ダウンロード$ unzip misc100.zip -d test
この問題たまたまMacでやってて、content.xmlをたまたまテキストエディットで開いたら答えが書かれてました(笑)
本来はzipのままLibreofficeで開くらしいです。
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調べても理由は様々。
詰んだわわからん。
ソースコードを読み解く
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 --
これがなんなのかわからないけど予想
- シングルクォーテーションで呼び出しの条件を文字に変換している?
- or 1+1ですべてTrueにしている?
- --で後の構文をコメントアウトしている?
というかこういう攻撃方法があるんですね、知らないことばかりだ。
Q28.[Network] Can you login?
パケットを読んでみる。
今回は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サーバに行けるのでログインしてみる。
ちなみにパスワードは右クリック→コピー→値を選択するとパスワードだけコピーできる。
しかしそこには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はチャレンジしてないんですがまたクリアしたら書こうと思います。