picoCTF 2022 Sleuthkit Apprentice writeup
コンテスト中に解けなかった問題の復習です。
問題文
Download this disk image and find the flag. Note: if you are using the webshell, download and extract the disk image into /tmp not your home directory. * Download compressed disk image
disk image (disk.flag.img
)がダウンロードできます。
ヒント
なし
解法
まず、問題のタイトルである「Sleuthkit Apprentice」ですが、「Sleuth kit」という、オープンソースのファイルシステムフォレンジックツールだよというヒントになっているとのことです。
ということで、インストール方法は、
apt install sleuthkit
で入ります。いろいろコマンドが入るようです。
参考サイト:デジタルフォレンジック Sleuth Kit sleuthkitのインストール
で、このコマンドで、何ができるようになるかがよくわからないのですが、ディスクイメージの中身をいろいろ確認できるツールらしい。
# mmls disk.flag.img DOS Partition Table Offset Sector: 0 Units are in 512-byte sectors Slot Start End Length Description 000: Meta 0000000000 0000000000 0000000001 Primary Table (#0) 001: ------- 0000000000 0000002047 0000002048 Unallocated 002: 000:000 0000002048 0000206847 0000204800 Linux (0x83) 003: 000:001 0000206848 0000360447 0000153600 Linux Swap / Solaris x86 (0x82) 004: 000:002 0000360448 0000614399 0000253952 Linux (0x83)
スタートの数字を読み取って、 -o
につけるだけで、flsとかで中身のディレクトリがわかったりする模様。
# fls -o 0000360448 disk.flag.img d/d 11: lost+found d/d 12: boot d/d 1985: etc d/d 1986: proc d/d 1987: dev d/d 1988: tmp d/d 1989: lib d/d 1990: var d/d 3969: usr d/d 3970: bin d/d 1991: sbin d/d 451: home d/d 1992: media d/d 1993: mnt d/d 1994: opt d/d 1995: root d/d 1996: run d/d 1997: srv d/d 1998: sys d/d 2358: swap V/V 31745: $OrphanFiles
tak_recover
をやってみると、
# tsk_recover -o 0000360448 disk.flag.img ./output Files Recovered: 1170
となり、1170個のファイルが出来上がる。findして、flagみたいなファイルがないか確認する。
# find output | grep flag output/root/my_folder/flag.txt
root/my_folder/flag.txt
がヒットした。これが答えかなと思ったら、
# fcat -o 0000360448 root/my_folder/flag.txt disk.flag.img 3.449677 13.056403
となり、答えじゃなかった。
わからないので、kusuwada先生の picoCTF2022 [Forensics] writeup - 好奇心の足跡 の解説を読む。同じディレクトリに違うあった。tsk_recoverだと出力されていなかった模様(なぜ??)。
で、順番に辿って行くには、 fls
した後の、数字を後ろにつけていけばよいらしい。つまり、 上のfls
の出力で、rootは、1995なので、
# fls -o 0000360448 disk.flag.img 1995 r/r 2363: .ash_history d/d 3981: my_folder
とすると、普段 ls /root
みたいなことと同じ感じの結果が見れるらしい。ということで、my_folderは3981なので、
# fls -o 0000360448 disk.flag.img 3981 r/r * 2082(realloc): flag.txt r/r 2371: flag.uni.txt
中身を見るには、fcat
コマンドを使って、
# fcat -o 0000360448 /root/my_folder/flag.uni.txt disk.flag.img picoCTF{by73_5urf3r_2f22df38}
とする模様。フラグゲット。
picoCTF 2022 St3g0 writeup
コンテスト中に解けなかった問題の復習です。
問題文
Download this image and find the flag.
で、imageにリンクがついていて、画像が一枚与えられる。
ヒント
We know the end sequence of the message will be $t3g0.
解法1
foremostをかけてみたりしましたが、いまいち、どのツールもピント来ずに、解けませんでした。で、kusuwadaさんのwriteup picoCTF2022 [Forensics] writeup - 好奇心の足跡 を読む。なんと、画像に埋め込む系のツール一式が入ったやつがあるとのこと(全然知らなかったー)
とは言いつつ、今回は、そのstego toolkitの中にもある zsteg
というツールだけでも解けるらしい。
(rubyの)gemがインストールするのに必要になる。(私のCTF環境は、macOSでDockerを利用)
apt -y install ruby-full
で、rubyをインストールして、
gem install zsteg
をする。これで、 zsteg
が使えるようになった。
Usage: zsteg [options] filename.png [param_string] -c, --channels X channels (R/G/B/A) or any combination, comma separated valid values: r,g,b,a,rg,bgr,rgba,r3g2b3,... -l, --limit N limit bytes checked, 0 = no limit (default: 256) -b, --bits N number of bits, single int value or '1,3,5' or range '1-8' advanced: specify individual bits like '00001110' or '0x88' --lsb least significant BIT comes first --msb most significant BIT comes first -P, --prime analyze/extract only prime bytes/pixels --invert invert bits (XOR 0xff) -a, --all try all known methods -o, --order X pixel iteration order (default: 'auto') valid values: ALL,xy,yx,XY,YX,xY,Xy,bY,... -E, --extract NAME extract specified payload, NAME is like '1b,rgb,lsb' --[no-]file use 'file' command to detect data type (default: YES) --no-strings disable ASCII strings finding (default: enabled) -s, --strings X ASCII strings find mode: first, all, longest, none (default: first) -n, --min-str-len X minimum string length (default: 8) --shift N prepend N zero bits -v, --verbose Run verbosely (can be used multiple times) -q, --quiet Silent any warnings (can be used multiple times) -C, --[no-]color Force (or disable) color output (default: auto) PARAMS SHORTCUT zsteg fname.png 2b,b,lsb,xy ==> --bits 2 --channel b --lsb --order xy
なんかいろいろあるけれども、 -a
オプションが、tray all known methodsなので、最強そう。
# zsteg -a pico.flag.png b1,r,lsb,xy .. text: "~__B>VG?G@" b1,g,lsb,xy .. file: dBase III DBT, version number 0, next free block index 3549684369 b1,g,msb,xy .. file: dBase III DBT, version number 0, next free block index 3418965897 b1,b,lsb,xy .. file: dBase III DBT, version number 0, next free block index 2623130757 b1,rgb,lsb,xy .. text: "picoCTF{7h3r3_15_n0_5p00n_a9a181eb}$t3g0" b1,abgr,lsb,xy .. text: "E2A5q4E%uSA" b2,b,lsb,xy .. text: "AAPAAQTAAA" b2,b,msb,xy .. text: "HWUUUUUU" b3,r,lsb,xy .. file: gfxboot compiled html help file
結構、長い出力が現れる。最初の方に書いてあった。
解法2
せっかくなので、 stego-toolkit
を使ってみる。Usageの手順に従う。
Docker pullする(結構時間かかる)。
docker pull dominicbreuker/stego-toolkit
イメージを起動。
docker run -it --rm -v /loca/path/to/picoCTF2022/stage/data:/data dominicbreuker/stego-toolkit /bin/bash
実行する。
check_png.sh pico.flag.png
大量に出力が出てくるのですが、結局、zstegしか、ヒットしてなかった模様。