はじめに
この記事で出来るようになること
- DC-2の起動
- ターゲットのIPアドレスの特定/ポートスキャン
- Webサイトの確認
- WordPressのユーザー列挙
- 総当たりでWordPressの認証突破
- SSH接続/rbashからの脱出
- 権限昇格/最終フラグのゲット
対象読者
- セキュリティやハッキングの学習を始めたい方
今回のゴール
初心者向けペネトレーションテスト環境であるDC-2を攻撃し、隠されている5つのフラグを確認すること
Step1: DC-2の起動
1-1. DC-2のダウンロード
下のリンクからDC-2をダウンロードしていきます。
URL:https://www.vulnhub.com/entry/dc-2,311/

ダウンロードが失敗する方は、Download (Mirror) のほうを試してみてください。
ダウンロードに成功したら、DC-2のファイルが圧縮されているので解凍しておきます。
1-2. VirtualboxにDC-2の仮想マシン作成
VirtualBoxを起動し、メニューのファイル > 仮想アライアンスのインポートを選びます。

ファイルにダウンロードしたDC-2のファイルを指定して、次に進みます。
設定画面では、仮想マシンの名前とMACアドレスのポリシーがすべてのアダプターのMACアドレスを含むを選択して、完了ボタンを押します。
これでDC-2の仮想マシンが作成されました。
1-3. DC-2の仮想マシンの起動
作成したDC-2の仮想マシンを起動してください。
注意 (仮想マシンのネットワーク設定)
アダプター1がブリッジアダプターになっているとvirtualbox内のマシン同士で通信が取れなくなるため、必ずホストオンリーアダプターにしてください。
Step2: ターゲットIPアドレスの特定/ポートスキャン
2-1. 自身のIPアドレスの特定
今回もPotatoの時と同様にまず最初に、自分のIPアドレスを確認していきます。
$ ip a
実行結果

ParrotOS自身のアドレスは192.168.56.104であることが分かりました。
2-2. ターゲットIPアドレスの特定
自分のIPアドレスが192.168.56.104だと分かったので、同じネットワークにいるターゲットIPアドレスを探します。
# 192.168.56.0/24のネットワークにあるIPアドレスの一覧を表示する
$ sudo netdiscover -i enp0s3 -r 192.168.56.0/24
DC-2のアドレスは、192.168.56.105だと分かりました。
💡 IPアドレス特定についての詳しい解説
ネットワークの仕組みや、表示される3つのIPアドレスの正体については、前回の記事
ゼロから始めるハッキング・ラボの作り方 No.2 で詳細に解説しています。
「どれがターゲットか見分けがつかない!」という方はぜひそちらも参考にしてください。
2-3. ポートスキャン
ターゲットIPアドレスが特定できたので、ポートスキャンを実行していきます。
$ sudo nmap -sV -Pn -p- 192.168.56.105 -oN nmap.txt
実行結果

ポート80:HTTPサービスとポート7744:SSHサービスが開いていることが分かります。
Step3: Webサイトの確認 / 不正ログイン
ポートスキャンで HTTP(80番ポート) が開いていたので、Webサイトを確認します。
3-1. Webサイトの確認(リダイレクトの罠)
ParrotOSでFirefoxを開き、URLバーに http://192.168.56.105 を入力してアクセスしてみます。

すると、自動的にURLが http://dc-2/ に書き換わり(リダイレクト)、画面に「We can’t connect to the server」というエラーが表示されてページが開きません。
💡 なぜエラーになるの?(WordPressの仕組み)
この現象は、DC-2で使われている WordPress というWebシステムの仕様が原因です。
裏側では以下のようなすれ違いが起きています。
[あなた]
http://192.168.56.105 へアクセス!
│
▼
[DC-2]
「アクセスありがとう!でも私の正式名は『dc-2』なんだ。
URLを http://dc-2/ に転送(リダイレクト)するからアクセスし直してね!」
│
▼
[ブラウザ]
「了解!じゃあ『dc-2』に繋ぐね!……ところで『dc-2』のIPアドレスって何番だっけ?
インターネット上の電話帳(DNS)を探しても載ってないぞ…諦めよう(エラー)」
DC-2は仮想環境内のプライベートなマシンなので、インターネットのDNSサーバーには登録されていません。そのため、ブラウザが「dc-2」という名前からIPアドレスを見つけられず(名前解決に失敗し)、エラーになってしまいます。
🛠️ 解決策: hostsに登録する
ブラウザに「dc-2のIPアドレスはこれだよ!」と教えてあげるために、hosts ファイル を書き換えます。
📌 hostsファイルとは?
PCの内部にある「世界で一番優先される、自分専用のローカル電話帳」です。
ここに手動で登録することで、インターネットに載っていないマシンでも名前でアクセスできるようになります。
hostsファイルに以下の設定を追加することで、ブラウザが迷わずにDC-2へアクセスできるようになります。
hostsファイルを開く
$ sudo nano /etc/hosts
開いたら、以下の文字を追加する
192.168.56.105 dc-2
hostsファイルを書き換えたら、もう一度、Webサイトを開いてみましょう!

無事、サイトを開くことができました。
3-2. フラグ1の確認
Webサイトを開くと、flagタブがあるので選択すると、flag1が表示されました。

これでまずは1つ目のフラグを見つけることができました。
3-3. アクセスできるファイルの列挙
Gobusterというブルートフォースツールを使って、アクセスできるファイルやディレクトリーを列挙します。
💡 Gobusterについて
Gobuster は、Go言語で作られた非常に高速なブルートフォースツールです。
今回はWebサイト内にある「アクセスできる隠しファイルやディレクトリ」を列挙するために使用しますが、実はWeb以外にも以下のような多彩なスキャンモードを持っています。
| モード | 主な役割 |
|---|---|
dir |
ディレクトリやファイルの探索 |
dns |
サブドメインの列挙(隠れたサーバーの発見) |
vhost |
仮想ホスト(同一IP上の別サイト)の特定 |
s3 |
AWS S3などクラウドストレージのバケット探索 |
📌 なぜGobusterを使うの?
前回のPotato編で使った dirbに比べ、Gobusterは実行結果がとても見やすいからです。
dirbを使って検証していたのですが、検索結果が整理されておらず、見えずらかったためGobusterを採用しました。
今回は dirモードを使って、以下のようにコマンドを組み立てて実行していきます。
また、dirbの時と同様に辞書ファイルを使用して総当たりするため、使用する辞書ファイルのパスを後ろに指定します。
| オプション | 役割 |
|---|---|
dir |
ディレクトリやファイルの探索 |
-u |
攻撃対象のURLを指定する |
-w |
辞書ファイルを指定する |
gobuster dir -u http://192.168.56.105:80 -w /usr/share/wordlists/dirb/common.txt
実行結果

複数のディレクトリが表示されましたが、その中でもadminが含まれている /wp-adminに
アクセスしてみます。

すると、WordPressのダッシュボードの認証ページが出てきました。
Step4: WordPressのユーザー列挙
認証ページが表示されましたが、現時点ではアカウント情報がひとつもありません。
そこで、まずはWebサイト内にどんなユーザーが存在するのかを特定していきます。
4-1. ログインエラーの挙動チェック
試しに、適当なユーザー名とパスワードを入力してみます。
ユーザー名: hoge / パスワード: hoge

👉 エラー文: 「無効なユーザー名です」というエラーが表示されます。
次に、定番の管理者名(admin)を入力してみます。
ユーザー名: admin / パスワード: hoge

👉 エラー文: 「ユーザー名 admin のパスワードが間違っています」という、先ほどとは
違うエラー文が表示されました!
💡 ここがポイント!
エラーメッセージが変わったということは、「hogeというユーザーは存在しないが、adminというユーザーはシステム内に実在する」 という証明になります。この仕様(情報の漏洩)を利用して、他のユーザーも探していきます。
4-2. 投稿者アーカイブ(?author=)を使ったユーザー列挙
WordPressには、投稿者ごとに記事をまとめる「投稿者アーカイブ」という機能が標準で
備わっています。
特別な対策がされていない限り、URLの末尾に /?author=[数字] というパラメーターをつけてアクセスすると、その数字に対応した個人のページへ自動的にリダイレクトされ、URLからユーザー名が丸見えになります。
実際にブラウザのURLバーに入力して、隠れたユーザーをあぶり出してみましょう!
http://dc-2/?author=1
👉 http://dc-2/index.php/author/admin/ に転送! ➔ admin を特定
http://dc-2/?author=2
👉 転送されない ➔ 対応するユーザーがいない
http://dc-2/?author=3
👉 http://dc-2/index.php/author/jerry/ に転送! ➔ jerry を特定
これで、jerryユーザーを洗い出すことができました!
4-3. nmapのNSE機能を使った調査
jerry以外にユーザーがいないか調査を行うため、nmapのNSE機能を使用します。
💡 NSE(Nmap Scripting Engine)
NSEは、Lua言語で記述されたスクリプトを使って、ネットワーク探査や脆弱性スキャンなどのタスクを自動化・拡張できる強力な機能です。
使用する際は、Nmapの実行時に --script オプションを使用します。
$ nmap -p80 --script http-wordpress-users 192.168.56.105
実行結果

新たにtomというユーザーを発見しました。
以上で、admin・jerry・tomの合計3名のユーザーの存在が確定しました。
特定した上記のデータをこのあと、総当たりで認証を突破する際に使用するためユーザーのリストを作ります。
ユーザーリストのファイルを作成
$ sudo nano users.txt
ファイルの中にadmin,jerry,tomを書き込んだら、保存しcatコマンドで確認
$ cat users.txt
Step5: 総当たりでWordPressの認証突破
WordPressのユーザー名が特定できたので、あとはパスワードが分かれば総当たりすることができます。
5-1. CeWLを使った辞書ファイルの作成
ここでflag1を思い出してほしいのですが、flag1にはCeWLを利用するというヒントが記載されていました。
💡 CeWL
CeWLはRubyで作成された辞書ファイル生成ツールです。
指定したWebサイトをスクレイピングして、パスワードとして使われそうなキーワードを
辞書ファイル化することができます。
まず、CeWLを実行するコマンドがあるかどうかを確認していきます。
$ cewl --h
実行結果

オプションが沢山表示されたら、cewlがすでに実行できる状態になっています。
CeWLがインスト―スされていない場合
CeWLが謎にプリインストールされていないことがあるので、インストール作業を行っていきます。
CeWLをインストールする
$ sudo apt install cewl -y
インストールが完了したら、正常に動作するか確認
$ cewl --help
実行結果

オプションが沢山表示されたら、cewlのインストール成功です。
CeWLが実行できるかどうかを確認出来たら、辞書ファイルを作成していきます。
辞書ファイル生成するもとのWebサイトを指定し、作成したファイルをカレントディレクトリに保存するように指定します。
$ cewl http://dc-2 -w ./cewl.txt
💡 なぜ、-wオプションをつけるのか?
- w オプションを付けずにcewlを実行すると、Webサイトから収集した大量のキーワードがターミナルの画面上にズラズラズラッ!と一瞬で流れて終わってしまいます。
Linuxの標準機能であるリダイレクトを使ってファイルに保存することも可能ですが、実はそれだとツール起動時に表示される「バナー」まで一緒に保存されてしまうという問題が発生します。

▲ 画像の一番上に表示されているロゴのような文字列が「バナー」です。
❌ リダイレクトで保存した場合
バナーテキストがファイルの一番上に混入してしまいます。
このまま次のツール(Hydraなど)に読み込ませると、バナーの文字まで「パスワードの候補」として無駄にテストされてしまい、エラーや効率低下の原因になります。
- w オプションで保存した場合
ツールの機能として、バナーを除外した 「Webサイトから集めた純粋な単語リストだけ」 の綺麗なファイルを自動で生成してくれます。
📌 まとめ
後続のハッキングツールで不具合を起こさないためにも、ワードリストを作成する際は必ず
-w [ファイル名] を指定して、余計な文字を含めないようにしましょう!
5-2. WordPressの認証突破
ユーザー名のリストとパスワードの候補リストが揃ったので、認証を突破していきます。
今回はオンラインパスワードクラッカーであるHydraを使って解読していきます。
💡 Hydra
高速なパスワードクラックツールを指します。
SSH、FTP、Telnet、HTTP(Webフォーム)などのネットワーク認証サービスに対して、
ユーザー名とパスワードを総当たり(ブルートフォース攻撃)または辞書攻撃で試行し、
突破できるか検証するツール。
| パラメーター | 役割・意味 |
|---|---|
-L users.txt |
ユーザー名が大量に載ったファイルを指定します。 |
-P cewl.txt |
パスワード候補が載ったファイルを指定します。 |
dc-2 |
ターゲットとなるサーバー名(またはIPアドレス)を指定します。 |
http-form-post |
攻撃対象の形式(WebサイトのPOSTフォーム)を指定します。 |
'/wp-login.php:...' |
ログインページの 「URL」「送信データ」「判定条件」 を指定します。 |
⚠️ 初心者が間違えやすいポイント!
-
大文字 と 小文字 の使い分け
- ファイルを読み込ませる場合は、大文字の -L / -P を使います。
- ユーザー名やパスワードを直接1つだけ指定する場合は、小文字の -l ユーザー名 / -p パスワード を使います。
(※今回はファイルを読み込ませるため、必ず大文字で入力してください)
$ hydra -L users.txt -P cewl.txt dc-2 http-form-post '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=log In&testcookie=1:S=Location'
jerryのパスワードはadipiscing、tomのパスワードはparturientであることが分かりました。
5-3. 不正ログイン
まず、jerryユーザーでログインし、Pages > All Pagesを開きます。7つのページがあり、
2番目にflag2というタイトルの記事があります。

次に、tomユーザーでログインしましたが、これといった情報は何もありませんでした...
flag2の文面によると、WordPressの脆弱性を攻撃できないなら、別の侵入口を見つけるべきと書いてあります。
現在は、jerryユーザーでログインしており、管理者ではないためWordPressのダッシュボードを利用した攻撃を行うことができません。
Step6: SSH接続/rbashからの脱出
別の侵入経路として、SSH接続を行っていきます。
6-1. SSH接続
ポートスキャンの際にSSHのポート(7744番)が開いていたのでSSH接続をしてみます。
まず、jerryユーザーで試します。
$ ssh jerry@192.168.56.105 -p 7744
途中でパスワードを聞かれるので、adipiscingを入力しましたが、ログインできませんでした。
次に、tomユーザーで試すと、ログインが成功しました。
tomのパスワードはparturientです。
$ ssh tom@192.168.56.105 -p 7744
6-2. 現状把握
tomユーザーが何をできるのか把握するため、whoamiコマンドとidコマンドを実行しました。
指定されたユーザーのシステム識別 (ID) を含むメッセージを表示
$ id
現在システムにログインして操作しているユーザーのユーザー名を表示するコマンド
$ whoami
実行結果

なぜかうまくいきませんでした。
原因を特定するため、echoコマンドで現在のシェルを確認してみました。
$ echo $SHELL
実行結果

すると、現在のシェルがrbashになっていることが分かります。
rbash(制限シェル)の主な特徴
rbash環境では、攻撃者や一般ユーザーがシステムを悪用できないよう、以下のような厳しい制限がかけられています。
- 環境変数PATHが読み取り専用: コマンドを探すパスを勝手に変更できません。
- フルパスでのコマンド実行不可: /bin/shのように直接実行ファイルを指定して動かすことができません。
- リダイレクトの禁止: > や >>を使ってファイルへの書き込みや出力変更ができません。
- 機能制限モードの解除不可: 途中で通常の bashへ切り替える操作が拒否されます。
一応、lsコマンドを使用できるか確認すると無事実行され、flag3.txtとusrディレクトリがありました。
試しにcatコマンドでflag3.txtを確認すると、catコマンドが使えないため失敗します。

6-3. 現在使えるコマンドの調査
lsコマンドでを使用して、usrディレクトリの中身を確認していきます。
※cdコマンドで移動して開こうとすると、cdコマンドも使えないため失敗します。

その結果、less,ls,scp,viのシンボリックリンクがありました。
先ほどlsコマンドが普通に使用できたので、もしかしたら上記のいくつかのコマンドにはパスが通っているかもしれないため、調べていきます。
環境変数のリストを表示する
$ export -p
実行結果

環境変数PATHには /home/tom/usr/bin だけが設定されています。
これで先ほどの4つのコマンドを直接実行することができるということが分かります。
6-4. flag3.txtの確認
viコマンドが直接実行できるので、flag3.txtの中身を確認していきます。
$ vi flag3.txt
実行結果

これで無事、flag3までを確認することができました。
6-5. rbashからの脱出
rbashによってほとんどのコマンド実行や環境変数の操作が制限されていますが、システム内に用意されているお馴染みのテキストエディタ vi を利用することで、この不自由な制限シェルから脱出することができます。
このように、Linuxの標準コマンドやバイナリの「仕様」を突いて制限を迂回・特権昇格する手法は GTFObins という有名なサイトにまとめられており、今回の vi を使った手法もそこから引用しています。
手順は非常にシンプルで、viの内部から直接新しいシェルを呼び出します。
1. まずは通常通り vi を起動します
$ vi
実行結果

そしたら、:set shell=/bin/shを入力してEnterキーを押します。

最後に、:shellを入力して、Enterキーを押すと、プロンプトが返ってきます。

rbashから脱出できているか確認するため、現在のシェルをechoを使って調べます。
$ echo $SHELL
変化が分からなかったため、現在のシェルを格納している $0 を使って調べてみます。
$ echo $0
実行結果

rbashからshへの切り替えに成功しています!
これにより、rbashの機能制限を回避し、環境変数を変更することができるようになります。
6-6. 環境変数PATHの変更
まだ、catコマンドが使えないため、環境変数PATHを変更しほかのコマンドが使えるようにしていきます。
$ export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
変更が反映されているかechoを使って確認
$ echo $PATH
これで、catコマンドなども使用可能になりました。
Step7: 権限昇格/最終フラグのゲット
7-1. jerryとしてログイン
現在、tomユーザーとしてログインしているため、suコマンドを使ってjerryユーザーとしてログインします。
$ su jerry
実行結果

無事、jerryとしてログインができましたが、現在いるディレクトリがtomになっているので、jerryユーザーはコマンドを使うことができません。
そこで、cdコマンドを使ってjerryユーザーのディレクトリに移動します。

lsコマンドを使うとflag4.txtがあるので、catコマンドで中身を確認していきます。

flag4.txtには、まだ最後のflagが残されており、そのヒントはここになしと書いてあります。
jerryユーザーの中には最終フラグがないことが分かったので、管理者でログインしていきます。
7-2. 管理者権限でログイン
管理者としてログインするために、sudoコマンドの設定を確認していきます。
$ sudo -l
実行結果

最後の行に、/usr/bin/gitについてはパスワードなしで実行できると書いてあります。
ここから、sudoコマンドをつければgitコマンドをパスワードなしで実行できてしまうことが判明しました。
GTFObinsにはgitコマンドを利用した管理者権限のシェルを奪う方法があります。
様々な方法がありますが、今回はgit -p help configコマンドを使用します。
$ sudo git -p help config
実行結果

ずらずらとヘルプが表示され、最後に : が表示されるので、!/bin/shと入力するとルート(管理者権限)のプロンプトが返ってきます。

7-3. 最終フラグの確認
ルートユーザーとしてのログインは成功しているので、ルートユーザーだけがアクセスできる /root に移動します。
移動したら、最終フラグがあるのでcatコマンドで開くと中身を確認することができます。










