はじめに
みなさんこんにちは!
この挨拶は何回したことでしょう笑
今回は、「Raven」というマシンをハッキングしていきたいと思います!
それでは攻略していきましょう!;)
1. RavenマシンのIPアドレスを特定し、疎通確認を行う
まずは、Parrot OSマシンのIPアドレスを確認します。
ip -4 addr show dev enp0s3
Parrot OSマシンのIPアドレスは 192.168.56.106 でした。
コマンド解説
-
ip:ネットワークインターフェースの情報を表示・設定するコマンド -
-4:IPv4アドレスのみを表示 -
addr show:IPアドレス情報を表示 -
dev enp0s3:enp0s3インターフェースの情報のみ表示
次に、同じネットワーク内にあるRavenマシンのIPアドレスを特定します。
nmap -PE -PM -sn -n 192.168.56.0/24

(主の環境だと -PE -PM のコマンドは使用できませんでした。OSのバージョンが関係あるのだと思います。)
RavenマシンのIPアドレスは 192.168.56.110 でした。
コマンド解説
-
nmap:ネットワーク上のホストやポートを調査するツール -
-PE:ICMP Echo Request(Ping)を送信してホストの存在を確認 -
-PM:ICMP Timestamp Requestを送信してホストの存在を確認 -
-sn:ポートスキャンを行わず、生存ホストのみを調査 -
-n:DNS名前解決を行わず、IPアドレスのみ表示 -
192.168.56.0/24:192.168.56.0~192.168.56.255までの範囲をスキャン
続いて、特定したIPアドレスを環境変数へ登録します。
export IP=192.168.56.110
echo $IP
環境変数 IP にRavenマシンのIPアドレスが設定されていることを確認できました。
コマンド解説
-
export:環境変数を設定するコマンド -
IP=192.168.56.110:IPという名前でIPアドレスを保存 -
echo $IP:環境変数に保存された値を表示して確認
環境変数へ登録することで、以降はIPアドレスを直接入力する必要がなくなり、$IPだけで指定できます。
最後に、RavenマシンへPingを送信し、通信できることを確認します。
ping -c 1 $IP
Pingに応答が返ってきたため、Parrot OSマシンとRavenマシン間で正常に通信できることを確認できました。
コマンド解説
-
ping:指定したホストへ通信できるか確認するコマンド -
-c 1:Pingを1回だけ送信 -
$IP:環境変数に保存したIPアドレスを指定
2. 実験用ディレクトリを作成し、Ravenマシンのポートを調査する
まずは、実験用のディレクトリを作成し、作業ディレクトリへ移動します。
mkdir ./vulnhub/raven
cd ./vulnhub/raven
実験用ディレクトリ vulnhub/raven を作成し、作業ディレクトリへ移動できました。
コマンド解説
-
mkdir:新しいディレクトリ(フォルダ)を作成するコマンド -
./vulnhub/raven:現在のディレクトリ配下にvulnhub/ravenディレクトリを作成 -
cd:指定したディレクトリへ移動するコマンド
次に、Nmapを使用してRavenマシンのポートスキャンを実施します。
sudo nmap -sS -A $IP
Nmapのスキャン結果から、以下のTCPポートが開放されていることを確認できました。
- 22/tcp:SSHサービス
- 80/tcp:HTTPサービス
- 111/tcp:RPCBindサービス
コマンド解説
-
sudo:管理者権限でコマンドを実行 -
nmap:ネットワーク上のホストやサービスを調査するツール -
-sS:TCP SYNスキャンを実施し、開放されているポートを調査 -
-A:OSの推測、サービスのバージョン検出、スクリプトスキャン、経路情報の取得をまとめて実施 -
$IP:環境変数に設定したRavenマシンのIPアドレス
rpcbindとは
rpcbind は、RPC(Remote Procedure Call)サービスが利用するポート番号を管理するサービスです。NFS(Network File System)などのRPCを利用するサービスが通信を行う際に使用されます。CTFでは、NFS共有などの情報収集につながる場合があるため、111番ポートが開放されている場合は調査対象となります。
3. Webサイトを調査する
次に、Parrot OS上のブラウザからRavenマシンのWebサイトへアクセスします。
http://192.168.56.110
実行結果はこちら(スクリーンショット)
「Raven Security」というタイトルのWebサイトが表示されました。
続いて、メニューの SERVICE をクリックします。
このページでは、Raven Security社が提供しているサービス内容が紹介されていることを確認できました。
次に、Webページのソースコードを表示します。
ショートカットキー
Ctrl + U
ソースコード内を確認すると、flag1{...} が記載されており、1つ目のフラグを取得できました。
操作解説
-
Ctrl + U:現在表示しているWebページのHTMLソースを表示するショートカットキー
続いて、メニューの BLOG をクリックします。
ブログサイトへアクセスできました。
URLを確認すると、WordPress で構築されている可能性が高いことが分かります。
また、投稿記事は 「Hello world!」 のみであったことから、以下のように推測できます。
- WordPressを構築した直後である。
- WordPressを構築したまま、ほとんど運用されていない。
このことから、WordPressに関する脆弱性や設定不備が残っている可能性を考え、引き続き調査を進めます。
4. ディレクトリ探索とWordPressユーザーを列挙する
まずは、ターゲットのURLを環境変数へ設定します。
export URL="http://$IP:80/"
echo $URL
環境変数 URL にターゲットのURLが設定されていることを確認できました。
コマンド解説
-
export:環境変数を設定するコマンド -
URL="http://$IP:80/":ターゲットのURLをURLという名前で保存 -
echo $URL:設定した環境変数の内容を表示して確認
次に、アクセス可能なファイルやディレクトリを探索します。
今回は dirb を使用しました。
dirb $URL -r
Dirbによるディレクトリ探索を実施し、Webサーバー上の公開ディレクトリやファイルを調査しました。
コマンド解説
-
dirb:Webサーバーのディレクトリやファイルを総当たりで探索するツール -
$URL:環境変数に設定したターゲットURL -
-r:リダイレクトを追跡せずにスキャンを実施
次に、ブログサイトのレイアウト崩れを修正するため、ホスト名を設定します。
ブログサイトを確認すると、raven.local を含むURLへアクセスしようとしており、Parrot OSで名前解決できないためレイアウトが崩れていました。
この問題を解決するため、/etc/hosts ファイルへホスト名を追加します。
sudo vi /etc/hosts
/etc/hosts ファイルへ以下の内容を追加します。
192.168.56.110 raven.local
設定後にブログサイトを再度表示すると、レイアウトが崩れることなく正常に表示されました。
コマンド解説
-
sudo:管理者権限でコマンドを実行 -
vi:テキストエディタ -
/etc/hosts:ホスト名とIPアドレスの対応を記述する設定ファイル
次に、WordPressのREST APIを利用してユーザーを列挙します。
ブラウザから以下のURLへアクセスします。
http://192.168.56.110/wordpress/index.php/wp-json/wp/v2/users
michael ユーザーを確認できました。
他にもユーザーが存在する可能性があるため、WPScan を使用してWordPressユーザーを列挙します。
wpscan --url $URL/wordpress --enumerate u
WPScanによる列挙の結果、steven ユーザーも発見できました。
コマンド解説
-
wpscan:WordPressの脆弱性やユーザー情報などを調査するツール -
--url:調査対象のWordPressサイトを指定 -
--enumerate u:WordPressユーザーを列挙する
最後に、発見したユーザーをユーザーリストとして保存します。
cat > names.txt
michael
steven
names.txt にWordPressユーザーの一覧を保存できました。
コマンド解説
-
cat >:標準入力からファイルを作成する -
names.txt:ユーザー名を保存するファイル -
Ctrl + D:入力を終了してファイルを保存
5. SSHのパスワードを解析し、Ravenマシンへログインする
まずは、パスワードリストに登録されている単語数を確認します。
wc -w /usr/share/john/password.lst
wc -w /usr/share/wordlists/rockyou.txt
password.lst と rockyou.txt に登録されているパスワード候補数を確認できました。
コマンド解説
-
wc:ファイル内の文字数や行数、単語数を表示するコマンド -
-w:単語数を表示 -
/usr/share/john/password.lst:John the Ripperに付属するパスワードリスト -
/usr/share/wordlists/rockyou.txt:代表的な辞書攻撃用パスワードリスト
次に、Hydraを使用してSSHの認証を試行します。
hydra ssh://$IP -L names.txt -P /usr/share/john/password.lst -v -t 4
解析の結果、michael ユーザーのパスワードが michael であることが確認できました。
コマンド解説
-
hydra:さまざまなネットワークサービスの認証を検証できるツール -
ssh://$IP:SSHサービスを対象に指定 -
-L names.txt:ユーザー名リストを指定 -
-P /usr/share/john/password.lst:パスワードリストを指定 -
-v:詳細な実行結果を表示 -
-t 4:4スレッドで並列実行
取得した認証情報を使用して、SSHでRavenマシンへ接続します。
ssh michael@$IP
michael ユーザーとしてログインに成功し、Ravenマシンのシェルへアクセスできました。
コマンド解説
-
ssh:リモートホストへ安全に接続するコマンド -
michael@$IP:michaelユーザーで、環境変数IPに設定したRavenマシンへ接続
6. ユーザーフラグを取得し、データベースの認証情報を調査する
まずは、Webサーバーのディレクトリへ移動し、ユーザーフラグを探します。
cd /var/www
ls
cat flag2.txt
/var/www ディレクトリ内に flag2.txt が存在しており、2つ目のフラグを取得できました。
コマンド解説
-
cd /var/www:Webサーバーのファイルが保存されているディレクトリへ移動 -
ls:現在のディレクトリ内にあるファイルやディレクトリを表示 -
cat flag2.txt:flag2.txtの内容を表示
続いて、ほかにもフラグに関連するファイルや文字列が存在しないか調査します。
find ./ -type f -print | xargs grep 'flag1'
検索結果はいくつか表示されましたが、新たなフラグは見つかりませんでした。
コマンド解説
-
find ./:現在のディレクトリ以下を検索 -
-type f:ディレクトリではなく、ファイルのみを検索対象に指定 -
-print:見つかったファイルのパスを出力 -
|:左側のコマンドの実行結果を右側のコマンドへ渡す -
xargs:標準入力から受け取った内容をコマンドの引数として使用 -
grep 'flag1':各ファイルの中からflag1という文字列を検索
次に、WordPressの設定ファイルを確認し、データベースの認証情報を調査します。
cd wordpress/
more wp-config.php
wp-config.php の内容を確認すると、WordPressがMySQLへ接続するための認証情報が記載されていました。
確認できた認証情報は以下のとおりです。
ユーザー名:root
パスワード:R@v3nSecurity
コマンド解説
-
cd wordpress/:WordPressのファイルが保存されているディレクトリへ移動 -
more:テキストファイルの内容を画面単位で表示 -
wp-config.php:WordPressのデータベース接続情報などが記載された設定ファイル
wp-config.php には、データベース名、データベースユーザー名、パスワード、接続先ホストなどの重要な設定が保存されています。
続いて、Ravenマシン上で待ち受けているネットワークサービスを確認します。
netstat -antp
実行結果から、MySQLがRavenマシンのローカル環境で動作していることを確認できました。
コマンド解説
-
netstat:ネットワーク接続や待ち受けポートの状態を確認するコマンド -
-a:すべての接続と待ち受けポートを表示 -
-n:ホスト名やサービス名へ変換せず、IPアドレスとポート番号を数値で表示 -
-t:TCP通信のみを表示 -
-p:接続やポートを使用しているプロセス情報を表示
MySQLは通常、TCPポート 3306番 を使用します。待ち受けアドレスが 127.0.0.1 になっている場合は、外部のマシンから直接接続できず、Ravenマシンの内部からのみ接続できる設定になっています。
7. MySQLサーバーへアクセスし、WordPressのパスワードハッシュを取得する
まずは、先ほど wp-config.php から取得した認証情報を使用して、MySQLサーバーへアクセスします。
mysql -h localhost -u root -pR@v3nSecurity
コマンド解説
-
mysql:MySQLサーバーへ接続するコマンド -
-h localhost:接続先ホストを指定 -
-u root:rootユーザーでログイン -
-pR@v3nSecurity:パスワードを指定して接続
続いて、MySQLサーバー内に存在するデータベースを確認します。
show databases;
use wordpress;
show tables;
実行結果から、wordpress データベースが存在することを確認できました。
use wordpress; を実行してWordPressデータベースへ切り替え、その後 show tables; を実行すると、WordPressで使用されている複数のテーブルが表示されました。
コマンド解説
-
show databases;:MySQLサーバー内のデータベース一覧を表示 -
use wordpress;:wordpressデータベースへ切り替える -
show tables;:現在選択しているデータベース内のテーブル一覧を表示
次に、WordPressユーザー情報が保存されている wp_users テーブルを確認します。
今回は項目数が多いため、レコードごとに縦方向で表示します。
select * from wp_users\G
実行結果から、WordPressユーザーの情報が保存されていることを確認できました。
user_login にはユーザー名、user_pass にはパスワードハッシュが保存されています。
コマンド解説
-
select *:テーブル内のすべてのデータを取得 -
from wp_users:wp_usersテーブルを対象にする -
\G:検索結果をレコードごとに縦方向で表示
続いて、パスワードハッシュを解析するため、ユーザー名とパスワードハッシュをファイルへ出力します。
select concat(user_login, ":", user_pass) from wp_users into outfile '/tmp/hash.txt';
/tmp/hash.txt が作成され、ユーザー名とパスワードハッシュが保存されました。
コマンド解説
-
concat():文字列を連結する関数 -
user_login:ユーザー名を取得 -
":":ユーザー名とパスワードハッシュの区切り文字 -
user_pass:パスワードハッシュを取得 -
into outfile:検索結果をファイルへ出力する
8. データベースを探索し、WordPressのパスワードを解析する
続いて、データベース内の探索を継続します。
WordPressの記事は、wordpressデータベースのwp_postsテーブルに保存されています。
フラグが保存されていないか確認します。
select * from wp_posts\G
実行結果を確認すると、flag3とflag4を確認できました。
これらのフラグは、過去に作成されたWordPressのページ内に保存されており、通常のブログ画面からは直接閲覧できないことが分かりました。
コマンド解説
-
select *:テーブル内のすべてのデータを取得します。 -
from wp_posts:WordPressの記事が保存されているwp_postsテーブルを対象にします。 -
\G:検索結果をレコードごとに縦方向で表示します。
データベースの探索が完了したので、MySQLを終了します。
quit;
実行結果はこちら(スクリーンショット)
コマンド解説
-
quit;:MySQLを終了します。
次に、オフラインパスワードクラッカーを使用して、取得したパスワードハッシュを解析します。
Parrot OSで新しくターミナルを起動し、解析対象となるハッシュファイルを作成します。
cd vulnhub/raven/
cat > hash.txt
続いて、先ほど取得したハッシュを入力します。
michael:$P$BjRvZQ.VQcGZlDeiKToCQd.cPw5XCe0
steven:$P$Bk3VD9jsxx/loJoqNsURgHiaB23j7W
入力後は Ctrl + D を押して保存します。
コマンド解説
-
cd vulnhub/raven/:作業ディレクトリへ移動します。 -
cat > hash.txt:hash.txtというファイルを作成し、標準入力から内容を書き込みます。 -
Ctrl + D:入力を終了してファイルを保存します。
続いて、rockyou.txtを使用してJohn the Ripperでパスワードハッシュを解析します。
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
john --show hash.txt
解析結果から、WordPressユーザーstevenのパスワードはpink84であることが判明しました。
一方、michaelのパスワードは辞書攻撃では特定できませんでした。
このことから、WordPressの認証情報として利用できるのはstevenアカウントのみであり、michaelについては別の方法で認証情報を取得する必要があることが分かりました。
コマンド解説
-
john:John the Ripperを起動します。 -
--wordlist=/usr/share/wordlists/rockyou.txt:辞書ファイルrockyou.txtを使用して解析します。 -
hash.txt:解析対象のハッシュファイルを指定します。 -
john --show hash.txt:解析済みのパスワードを表示します。
9. stevenユーザーへ切り替え、root権限を取得する
取得した認証情報を使用して、michaelユーザーからstevenユーザーへ切り替えます。
su steven
パスワードの入力を求められるので、先ほど解析したパスワードを入力します。
認証に成功すると、stevenユーザーへ切り替えることができました。
コマンド解説
-
su steven:stevenユーザーへ切り替えます。
続いて、stevenユーザーが実行できるsudoコマンドを確認します。
sudo -l
実行結果を確認すると、pythonをパスワードなしで実行できることが分かりました。
コマンド解説
-
sudo:管理者権限でコマンドを実行します。 -
-l:現在のユーザーが実行可能なsudoコマンド一覧を表示します。
次に、許可されているpythonを利用して管理者権限のシェルを取得します。
sudo /usr/bin/python
Pythonの対話型シェルが起動したら、/bin/bashを実行することで管理者権限のシェルを取得できます。
コマンド解説
-
sudo /usr/bin/python:sudoでPythonを起動します。 - Pythonの対話型シェルから
/bin/bashを実行し、管理者権限のシェルを取得します。
最後に、rootユーザーのホームディレクトリへ移動し、フラグファイルを確認します。
cd /root
ls
cat flag4.txt
実行結果はこちら(スクリーンショット)
/rootディレクトリ内に保存されているflag4.txtを確認し、最後のフラグを取得できました。
コマンド解説
-
cd /root:rootユーザーのホームディレクトリへ移動します。 -
ls:ディレクトリ内のファイル一覧を表示します。 -
cat flag4.txt:flag4.txtの内容を表示します。
これで、Ravenマシンの攻略は完了です。
おわりに
いかがだったでしょうか!
新しいファイル列挙コマンドや、データベースを用いた攻略がありましたね!
理解が難しくて調べたりAIに聞いたりしたところもたくさんありましたが、無事に攻略できました!
次回も攻略がんばって行きます!:)
ご覧いただきありがとうございました!!


































