【picoCTF】[Operation Oni] Writeup
問題概要
- Category: Forensics
Description:
Download this disk image, find the key and log into the remote machine.
Note: if you are using the webshell, download and extract the disk image into /tmp not your home directory.
Additional details will be available after launching your challenge instance.
日本語訳:
このディスクイメージをダウンロードし、鍵を見つけてリモートマシンにログインしてください。
注意:Webシェルを使用する場合は、ホームディレクトリではなく/tmpにディスクイメージをダウンロードして展開してください。
追加の詳細は、チャレンジインスタンスを起動した後に利用可能になります。
解法のプロセス(アプローチ)
1. ファイルの解凍と初期調査
まずは配布された圧縮ファイル(disk.img.gz)を解凍します。
gunzip disk.img.gz
解凍して disk.img が得られましたが、今回はイメージファイルのため、そのまま開こうとしても中身を見ることはできません。
なぜなら、今回扱うイメージファイルは普通のファイルではなく、ハードディスクなどの記憶媒体の区画(パーティション)を**「1ビットの狂いもなく丸ごとコピーしたデータ(RAWイメージ)」**だからです。
OSの標準機能では単なる「巨大な謎のデータ」としてしか認識できないため、解析専用の強力なツールである 「The Sleuth Kit (TSK)」 が必要となります。
💡 コラム:The Sleuth Kit のインストール方法 (Linux環境の場合)
ターミナルから以下のコマンドを実行して、あらかじめインストールしておきましょう。
sudo apt update
sudo apt install sleuthkit
これを用いて、ディスクイメージの内部構造を解析していきます。
2. mmlsコマンドによるパーティションの確認
mmls コマンドを使用し、ディスクイメージ内のパーティション(区画)のレイアウトを表示します。
mmls disk.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 0000471039 0000264192 Linux (0x83)
2つのLinuxパーティション(Startオフセット 2048 と 206848)が存在することが分かります。このどちらかの中にフラグへの手がかりが隠れていそうです。
3. flsとicatコマンドによるファイルの探索と抽出
オフセット 206848 のパーティション内を fls コマンドで探索し、root 関連のディレクトリを探します。
fls -r -o 206848 disk.img | grep "root"
実行結果(抜粋):
++ r/r 423: root
++ r/r 551: root
++ l/l 155: chroot
+ l/l 311: pivot_root
+ l/l 369: switch_root
d/d 470: root
inode番号 470 が root ディレクトリだと分かったので、さらにその中身を確認します。
fls -r -o 206848 disk.img 470
実行結果:
r/r 2344: .ash_history
d/d 3916: .ssh
+ r/r 2345: id_ed25519
+ r/r 2346: id_ed25519.pub
.ssh ディレクトリ内に秘密鍵(id_ed25519:inode 2345)を発見しました。icat コマンドを使って中身を抽出します。
icat -o 206848 disk.img 2345
実行結果:
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACBgrXe4bKNhOzkCLWOmk4zDMimW9RVZngX51Y8h3BmKLAAAAJgxpYKDMaWC
gwAAAAtzc2gtZWQyNTUxOQAAACBgrXe4bKNhOzkCLWOmk4zDMimW9RVZngX51Y8h3BmKLA
AAAECItu0F8DIjWxTp+KeMDvX1lQwYtUvP2SfSVOfMOChxYGCtd7hso2E7OQItY6aTjMMy
KZb1FVmeBfnVjyHcGYosAAAADnJvb3RAbG9jYWxob3N0AQIDBAUGBw==
-----END OPENSSH PRIVATE KEY-----
4. SSH鍵を使用したサーバーへのログインとフラグの取得
今回は対象サーバーへのSSH接続で鍵が必要でしたが、上記の手順で無事に見つけることが出来ました。抽出した秘密鍵のテキストをコピーし、手元に key_file という名前で保存します。
ですが、これをそのまま使って以下のように接続しようとしても……
ssh -i key_file -p 54664 ctf-player@saturn.picoctf.net
実行結果:
ctf-player@saturn.picoctf.net's password:
このようにパスワードを聞かれてしまい、ログインに失敗します。ただ鍵ファイルを作成してコマンドに書いてよいわけではありません。ここから先は以下のように適切な権限設定を行います。
💡 解決策(ここから先の仕上げ)
SSHの仕様上、秘密鍵のファイルは「自分以外のユーザーから読めない状態」になっていないと、セキュリティリスクとして無視されてしまいます。そのため、chmod コマンドでパーミッションを 600 に変更してから接続する必要があります。
# 鍵ファイルの権限を厳格に変更
chmod 600 key_file
# 再度SSH接続を実行
ssh -i key_file -p 54664 ctf-player@saturn.picoctf.net
権限の設定が正しければ、パスワードを聞かれることなくサーバーへログインできます。サーバー内で ls 等で探索し、フラグの書かれたファイルを読み取ります。
実行結果:
picoCTF{k3y_5l3u7h_af277f77}
無事にフラグを獲得できました!
Flag:
picoCTF{k3y_5l3u7h_af277f77}
お疲れさまでした!