車輪の再開発ブログ

Python & CTF Beginner!

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 - 好奇心の足跡 を読む。なんと、画像に埋め込む系のツール一式が入ったやつがあるとのこと(全然知らなかったー)

github.com

とは言いつつ、今回は、そのstego toolkitの中にもある zsteg というツールだけでも解けるらしい。

github.com

(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しか、ヒットしてなかった模様。

ブログ始めました

QiitaやZennなど、技術系の記事を書く場所はありましたが、わりとどうでもいい自分の記録みたいなものをつけようと思い、だったら、そういうサービスじゃなくてブログかなと思ったので、はてなブログを始めることにしました。

最近始めたCTFのwriteupを書くみたいなこともやっていきたいなと思っております。

よろしくお願いします。