1. 概要
picoCTFの問題「Printer Shares」の解法を解説します。
こちらは、プリントサーバー上に保存されたファイルを特定し、取得する問題です。
問題内容
- 問題名: Printer Shares(Easy/General Skills)
-
説明:
Oops! Someone accidentally sent an important file to a network printer—can you retrieve it from the print server?
Additional details will be available after launching your challenge instance.
おっと!誰かが誤って重要なファイルをネットワークプリンターに送信してしまいました。プリントサーバーからそのファイルを取得できますか?
チャレンジインスタンスを起動すると、詳細情報が表示されます。 - 提供情報: インスタンスを起動すると、ターゲットのホスト名とポート番号、接続コマンドが表示されます。
使用ツール
WSL
smbclient
2. 解放の流れ
Step 1: ターゲットの疎通確認
まず、インスタンス起動時に表示されたnc (netcat) コマンドをwslで実行し、与えられたポートで通信が可能であることを確認しました。
nc -vz (ホスト名)(ポート番号)
#ホスト名とポート番号の間は半角スペース
実行結果:
Connection to ... succeeded! と表示され、TCPポートが開いていることが確認できました。
Step 2: SMB共有の列挙 (Enumeration)
「プリントサーバー」というヒントから、ファイル共有プロトコルである SMB (Server Message Block) を使うことにし、smbclient を使用して共有フォルダをリストアップしました。
※私は環境に smbclient が無かったため、sudo apt install smbclient でインストールした後に実行しました。
smbclient -L //(ホスト名) -p (ポート番号) -N
#//からスペースを入れずにホスト名を入力する
-
-L: 共有リストの表示 -
-p: ポート指定 -
-N: パスワードなし(アノニマスログイン)
実行結果:
shares と IPC$ という2つの共有フォルダが見つかりました。
Step 3: 共有フォルダへの接続
重要ファイルが置かれている可能性が高い shares フォルダへ接続を試みます。
smbclient //(ホスト名)/share -p (ポート番号) -N
#Try "help" to get a list of possible commands.
接続に成功すると、対話型プロンプト smb: \> が表示されます。
Step 4: ファイルの特定とダウンロード
共有フォルダ"share"内を探索すると、flag.txtというファイルがあったため、getコマンドでダウンロードしました。
smb: \> ls
# flag.txt が存在することを確認
smb: \> get flag.txt
#getting file \flag.txt of size 37 as flag.txt
# Downloadフォルダにダウンロードされた
Step 5: フラグの確認
ダウンロードしたファイルを開くと、flag文字列が書かれていました。
3. まとめ
初めてSMBプロトコルを使いました。
パスワードなしのアクセス許可が、情報の漏洩に直結することも学ぶことができました。