NeverLAN CTF 2020 PCAP/Forensic writeup
今回は、2020/02/09 00:00 JST — 2020/02/12 08:00 JSTに行われた NeverLAN CTF 2020のPCAPとForensicジャンルのwriteupをお届けする。
とてもとっつき易く基本を学べるので、何も分からない状態で初めても大丈夫そうなCTF。今言っても意味ないけれど、オンラインCTFの入門としてとてもおススメ。
PCAP
このジャンルの問題は全て、writeupを書くほどのものか怪しいレベルの簡単さであったのでほんの少し触れるだけ。
FTP
FTPのパケットキャプチャファイルが与えられる。FTPはデフォルトで暗号化されていないので丸見えというお話。ストリームを眺めていればflag{*}が見える。
flag: flag{sftp_OR_ftps_not_ftp}
Teletype Network
問題のまんまtelnetのパケットキャプチャファイルが与えれる。こちらもデフォルトでは暗号化されていないので通信が見える。
flag: flag{telnet_1s_n0t_secur3}
Unsecured Login
httpの通信でログインしているので通信みえちゃうというお話。ストリームを眺めているとpassword入力にflagがある。
flag: flag{n0httpsn0l0gin}
Unsecured Login2
ちゃんとパケットの中身を見ていないので「Unsecured Login」と違いが分からなかった。同じようなところにflagがある。
flag: flag{ensure_https_is_always_used}
PCAPジャンルはパケットキャプチャファイルにstrings | grep でflag取れた。
Forensic
Forensicのキソのキソを学べる問題。
Listen to this
You hear that?
*Your flag will be in the normal flag{flagGoesHere] syntax
-ps This guy might be important
-ZestyFE
まず「HiddenAudio.mp3」が与えられる。このファイルは音声ファイルであり、「HiddenAuidio」という名であるからには何か音声が隠されているのだろうという推測でaudacityで開く。ただ波形をよく見ても分からなかったので、ctfでありがちな音声のスペクトログラム表示してみる。スペクトログラムを表示して一番初めのあたりを拡大してみると何か見える。
何かモールス信号ぽい気がするので、変換サイトで見てみる。
「FLA」とくれば、次は「G」となりそうな気がする。方向性は良さそうだが見づらいので、スペクトログラムを弄りたい。
波形を眺めたり、音を聞いているとボーカルを除去すればもう少し見やすくなる気がしてきた。
[エフェクト]->[Plug-in]->[ボーカルの低減と分離]を選択。そのまま「OK」を選択してみる。
凄い見やすくなったのでこれを変換にかける。変換してみると、flag{*}を何度も繰り返していることが分かる。
flag: flag{ditsanddahsforlife}
[メモ]もしかして、mp3はbinwalkに引っかからない?
Look into the past
We've captured a snapshot of a computer, but it seems the user was able to encrypt a file before we got to it. Can you figure out what they encrypted?
Your flag will be in the normal flag{flagGoesHere} syntax.
-N30
与えられた.tar.gzのファイルを解凍する。
$ ls look_into_the_past/ bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
マシンのルートディレクトリぽい。問題文から/home/Userに何かありそうな気がする。
$ ls * Desktop: Documents: flag.txt.enc libssl-flag.txt.enc Downloads: Music: Pictures: doggo.jpeg Public: Videos:
/home/User以下のディレクトリをみてみると、明らかに怪しい「flag.txt.enc」というファイルがある。.encとなっているということは暗号化されていそうな気がする。
$ file Documents/* # /home/User Documents/flag.txt.enc: openssl enc'd data with salted password Documents/libssl-flag.txt.enc: openssl enc'd data with salted password
やはりこのファイルは暗号化されている。opensslを使って復号するには、パスワードが必要になる。一瞬パスワードクラックを考えたが、このパスワードはどこかに在りそうな気がした。なぜならこの問題は「Look into the past」である。過去を見る。また、今回のような暗号化はコマンドラインで行われることが多い。よって「.bash_history」に何か手がかりがありそうな気がする。
$ ls -al 合計 52 drwxr-xr-x 9 1000 1000 4096 2月 9 01:24 . drwxr-xr-x 3 1000 1000 4096 2月 9 01:24 .. -rw-r--r-- 1 1000 1000 349 2月 7 03:33 .bash_history -rw-r--r-- 1 1000 1000 864 2月 7 03:34 .bashrc -rw-r--r-- 1 1000 1000 672 2月 7 03:34 .profile -rw-r--r-- 1 1000 1000 37 2月 7 03:33 .vimrc drwxr-xr-x 2 1000 1000 4096 2月 9 01:24 Desktop drwxr-xr-x 2 1000 1000 4096 2月 9 01:52 Documents drwxr-xr-x 2 1000 1000 4096 2月 9 01:24 Downloads drwxr-xr-x 2 1000 1000 4096 2月 9 01:24 Music drwxr-xr-x 2 1000 1000 4096 2月 9 01:24 Pictures drwxr-xr-x 2 1000 1000 4096 2月 9 01:24 Public drwxr-xr-x 2 1000 1000 4096 2月 9 01:24 Videos $ cat .bash_history cd Documents openssl enc -aes-256-cbc -salt -in flag.txt -out flag.txt.enc -k $(cat $pass1)$pass2$pass3 steghide embed -cf doggo.jpeg -ef $pass1 mv doggo.jpeg ~/Pictures useradd -p '$pass2' user sqlite3 /opt/table.db "INSERT INTO passwords values ('1', $pass3)" tar -zcf /opt/table.db.tar.gz /opt/table.db rm $pass1 unset $pass2 unset $pass3 exit
「.bash_history」に暗号化時のコマンドがしっかり残っていた。これに従って復号化すればいいのだが、パスワードは複数の場所に散りばめられているようである。なので一ずつ見つけていく。
まずは、「doggo.jpeg」に隠された「$pass1」から見ていく。「steghide」は画像ファイルにテキストなどを埋め込むステガノグラフィツールである。おそらく、「doggo.jpeg」さえあれば「$pass1」は見つけられる。
$ steghide extract -sf doggo.jpeg -xf pass1.txt $ cat pass1.txt JXrTLzijLb
展開時にパスワード入力が求められるが、パスワードは不要であった。
次に、追加したuserのパスワードが「$pass2」であるようなので、「/etc/shadow」をチェックする。
$ cat ../../etc/shadow # from /home/User (snip) user:KI6VWx09JJ:18011:0:99999:7:::
最後に、SQLiteのデータベースに「$pass3」が入っているようなので、「/opt/table.tar.gz」を解凍して「table.db」を「DB browser for SQLite」で確認する。 以上で、「flag.txt.enc」を復号するためのパスワードが揃った。
$ openssl enc -d -aes-256-cbc -salt -k JXrTLzijLbKI6VWx09JJnBNfDKbP5n -in Documents/flag.txt.enc -out flag.txt *** WARNING : deprecated key derivation used. Using -iter or -pbkdf2 would be better. $ cat flag.txt flag{h1st0ry_1n_th3_m4k1ng}
flag: flag{h1st0ry_1n_th3_m4k1ng}
Open Backpack
There's more to this picture
Your flag will be in the normal flag{flagGoesHere} syntax.
-NullB0n3s
まず次のようなファイル「openbackpack.jpg」が与えられる。 ここで、ファイル名や問題から「openbackpack.jpg」に他のファイルが含まれているような気がするのでbinwalkでチェックする。
$ binwalk openbackpack.jpg DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 JPEG image data, JFIF standard 1.01 30 0x1E TIFF image data, little-endian offset of first image directory: 8 328 0x148 JPEG image data, JFIF standard 1.01 9703 0x25E7 Copyright string: "CopyrightOwner> <rdf:Seq/> </plus:CopyrightOwner> <plus:Licensor> <rdf:Seq/> </plus:Licensor> </rdf:Description> </rdf:RDF> </x:" 9737 0x2609 Copyright string: "CopyrightOwner> <plus:Licensor> <rdf:Seq/> </plus:Licensor> </rdf:Description> </rdf:RDF> </x:xmpmeta> " 139267 0x22003 Zip archive data, at least v2.0 to extract, compressed size: 15928, uncompressed size: 695647, name: flag.png 155339 0x25ECB End of Zip archive, footer length: 22
思った通りいくつかファイルが含まれおり、それらのファイルの一つに「flag.png」を含むzipファイルを確認した。ここからファイルをカービングするのは、このままbinwalkでも、foremostでも宗教上の理由とかで色々あると思う。自分はddで。
$ dd if=openbackpack.jpg bs=1 skip=139267 of=output.zip 16094+0 レコード入力 16094+0 レコード出力 16094 bytes (16 kB, 16 KiB) copied, 0.0448263 s, 359 kB/s $ unzip output.zip Archive: output.zip inflating: flag.png
flag: flag{AlWaYs_cH3cK_y0ur_sTuFF}