0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Operation Oni picoCTF (Writeup)

0
Posted at

【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}


お疲れさまでした!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?