0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「ハッキング・ラボのつくりかた」 #5

0
Last updated at Posted at 2026-08-06

Ravenマシンをハッキングする

今回もハッキング・ラボのつくりかたを使って、「Raven」マシンをハッキングしていきます!
ところどころ本のやり方とは違うやり方でやっている場合があります。
ご承知おきください。

1.環境構築

VirtualBoxの設定はこちら#2を参照してください。
Ravenのダウンロードページはこちらです。

2.IPアドレスを調べる

本ではip -4 addr show dev enp0s3でIPアドレスを調べていますが、私はip aで調べました。
お好みの方を選んでください。
スクリーンショット 2026-07-20 110836.png
私の場合192.168.56.108だということが分かります。
前回と同様にターゲットのIPアドレス(RavenマシンのIPアドレス)を調べてみましょう。
ところが、本に記載されているnmapのコマンドを実行したところ以下のようになってしまいました。
スクリーンショット 2026-07-27 121720.png
エラーの原因としては、nmap-Pオプション指定方法が間違っているからとのことでした。
Unknown -P option -PEPM.というメッセージが出ている通り、-PEPMとまとめて記述すると、nmapは「PEPMという1つの-Pオプション」として解釈しようとしてしまい失敗しています。
もし、このコマンドを実行する場合はそれぞれのオプションに個別にハイフンを付けて指定する必要があります。
よって、このように実行してください。

nmap -PE -PP -PM -sn -n 192.168.56.0/24
  • -sn
    • 意味:ポートスキャンを行わない
    • 効果:各ホストに対して「ポートが開いているか」は調べす、「ネットワーク上に存在して応答するかどうか(ホスト発見)」だけに特化するため、実行速度が非常に高速になる
  • -PE(ICMP Echo Request)
    • 意味:一般的な「Ping(Echo要求)」を送信する
  • -PP(ICMP Timestamp Request)
    • 意味:時刻情報(タイムスタンプ)を求める特殊なICMP要求を送信する
    • 効果:-PE(普通のPing)をファイアウォール等でブロックしている機器でも、-PPには応答してしまう設定になっているケースがあり、そうした機器を発見しやすくなる
  • -PM(ICMP Netmask Request)
    • 意味:サブネットマスクを求める特殊なICMP要求を送信する
    • 効果:-PE-PPをブロックしている機器でも、応答を引き出せる可能性がある
  • -n
    • 意味:IPアドレスからホスト名(ドメイン名)への名前解決を行わない
    • 効果:DNSサーバーへの問い合わせを省くことで、スキャン速度を大幅に向上させる

このコマンドを実行することで、対象ネットワーク内の「生きているホスト(稼働中の機器)」を、多様なICMP(Ping)リクエストを使って高速かつ静かに検出(ピン推進・ホスト発見)することができます。
スクリーンショット 2026-07-27 115036.png
この結果からRavenのIPアドレスは192.168.56.114であると分かります。

3.疎通確認を行う

Pingで疎通確認をします。

ping 192.168.56.114

スクリーンショット 2026-07-27 115052.png
ちゃんと通っていることが分かります。Ctrl+Cをして終了させます。

4.Raven専用のディレクトリを作成する

Raven用のディレクトリを作成します。
スクリーンショット 2026-07-27 115815.png

5.ポートスキャンする

Nmapを使ってポートスキャンをします。

sudo nmap -sS -A 192.168.56.114
  • -sS:TCP SYNスキャン(ステルススキャン)
    TCP接続を完全に確立(3ウェイ・ハンドシェイク)させず、接続要求(SYN)だけを送って応答を見る手法。ログに記録されにくく、かつ高速なため最も標準的に使われる
  • -A:アグレッシブ(詳細)スキャンを有効化
    以下の強力な検出機能をまとめて有効にする
    • OS検出:相手のOS(Linux, Windows等)を特定
    • バージョン検出:動いているサービス(Apache, OpenSSH等)の正確なバージョンを特定
    • スクリプトスキャン(-sC):既知の脆弱性や設定のチェック
    • トレースルート(--traceroute):経路の追跡

スクリーンショット 2026-07-27 115800.png
このことから3つのポートが開いていることが分かります。

ポートスキャン番号 サービス名 詳細バージョン/情報
22/tcp SSH OpenSSH 6.7p1 Debian 5+deb8u4
80/tcp http Apache httpd 2.4.10
111/tcp rpcbind rpcbind 2-4

6.HTTPにアクセスする

ブラウザでhttp://192.168.56.114/にアクセスします。
スクリーンショット 2026-07-27 142850.png
右上のHOMEからCONTACTまで順にソースやページ内を調べます。
すると、SERVICEのところのソース全体を見ると262行目にこのように記述されていたかと思います。
スクリーンショット 2026-07-27 144736.png
よってフラグの1個目はflag1{b9bbcb33e11b80be759c4e844862482d}だと分かります。
BLOGをクリックするとhttp://192.168.56.114/wordpress/が開かれました。
スクリーンショット 2026-07-27 145144.png
URLに/wordpress/と書かれていることから、WordPressで作られていることが分かります。

7.URLを環境変数に設定する

流石に手打ちは面倒だと思ったので環境変数を設定することにしました。

export URL="http://192.168.56.114:80/"

echoコマンドで表示されていることを確認します。

8.アクセスできるファイルやディレクトリを探す

私は前回と同様にgobusterを使ってファイルやディレクトリを探しました。本にはDIRBを使っていますが、お好みの方法で実行してください。

gobuster dir -u $URL -w /usr/share/wordlists/dirb/common.txt

実行した結果このようになりました。
スクリーンショット 2026-07-27 150439.png

9.ホスト名を解決する

ターゲットのブログサイト(http://192.168.56.114/wordpress)を探索すると、内部リソースへのアクセスにraven.localというドメイン名が使用されていることが分かりました。
このため、IPアドレスのままだと名前解決ができず、画面のレイアウト(CSS/画像など)が大きく崩れてしまいます。
見た目を整えるために、ParrotOS側でraven.localの名前解決が行えるよう/etc/hostsファイルを編集します。

sudo vi /etc/hosts

まず開くと挿入モードになっていないため、iを押してから以下の文を追加します。

192.168.56.114 raven.local

このままだと挿入モードのままなためEscを押し、:wqで設定を保存し閉じてください。
その後、http://192.168.56.114/wordpressのページをリロードするとこのようにページが整ったかと思います。

10.WordPressでユーザーを列挙する

WordPressには、外部アプリやシステムとデータ連携するためのREST API(/wp-json/)という仕組みが標準で備わっています。
このAPIが認証なしでアクセスできる状態になっていると、特定のURLへリクエストを送るだけで、サイトに存在するアカウント情報(ユーザー名など)を容易に取得できてしまいます。
今回はこの仕様(設定)を利用して、後続のログイン攻撃に使用するためのユーザー名を特定(ユーザー列挙)します。
ブラウザで以下のURLを打ち込んでアクセスします。
http://192.168.56.110/wordpress/index.php/wp-json/wp/v2/users
スクリーンショット 2026-07-27 153442.png
これにより、ターゲットサイトにmichaelというユーザーが存在すると分かりました。
michael以外にもユーザがいないかWPScanを使ってWordPressのユーザーをスキャンします。
以下のコマンドを実行します。

wpscan --url $URL/wordpress --enumerate u

コマンドのオプションの一覧

  • wpscan:WordPress専用のセキュリティスキャンツールを起動する
  • --url $URL/wordpress:スキャン対象のWebサイトのURLを指定している
  • --enumerate u:ユーザーを列挙(一覧表示)する
    スクリーンショット 2026-07-27 153946.png
    長いため重要な部分だけをピックアップすると、どうやらmichael以外にもstevenというユーザーがいることが分かります。
    この2つのユーザーを載せたユーザーリストを作成します。
cat > names.txt

ここにmichaelと入力した後Enterをして、次にstevenと入力した後Ctrl+Dをして閉じます。
書き込まれているか確認するためにcat`コマンドを使います。
スクリーンショット 2026-07-29 141637.png
このように書き込まれていることを確認してください。

11.Hydraを使ったSSHへのオンライン辞書攻撃

ターゲット端末でSSHが稼働しており、2つのユーザー名(michael, steven)が判明している状態から、Hydraを用いてSSHパスワードのクラッキングを行います。
私は今回rockyouファイルを使いました。時間が結構かかるためすぐ結果を知りたい方はpassword.lstを使うことをおすすめします。

hydra ssh://192.168.56.114 -L names.txt -P /usr/share/wordlists/rockyou.txt -v -t 4

スクリーンショット 2026-07-27 160936.png
待ってみたのですが、stevenのパスワードは分かりませんでした。michaelの方はmichaelというパスワードであることが分かりました。

12.michaelでSSHにアクセスします

以下のコマンドを実行してSSHにアクセスします。

ssh michael@192.168.56.114

スクリーンショット 2026-07-27 161106.png
Are you sure you want to continue connecting?yesと入力し、passwordは先ほど辞書攻撃して出たmichaelと入力します。
すると、ログインに成功したと思います。
色々調べた結果このようになりました。
スクリーンショット 2026-07-27 161332.png
試しにcdコマンドを使って、ルートディレクトリに移動し、lsコマンドを使って中身を調べます。
スクリーンショット 2026-07-27 161423.png
まずは、/varの中身を調べます。
スクリーンショット 2026-08-03 135159.png
次に、/wwwの中身を調べます。
スクリーンショット 2026-08-03 141616.png
すると、flag2.txtと書かれているテキストファイルがありました。catコマンドを使って、中身を調べてみます。
スクリーンショット 2026-08-03 141900.png
flag2が分かりました。まだ、他にflagがないか調べます。
本に記載されていたコマンドを用いて調べてました。

find ./ -type f -print | xargs grep 'flag1'

このコマンドで何が分かるかというと、現在のディレクトリ以下にあるすべてのファイルの中から、flag1という文字列が含まれている場所(ファイル名と該当行)を探して表示してくれます。
コマンドを分解して説明するとこのようになります。

  • find ./ -type f -print
    • find ./:カレントディレクトリ(現在のフォルダ)とその中にあるすべてのサブフォルダを検索対象にする
    • -type f:検索対象を「通常のファイルのみ」に絞り込む(フォルダ自身は除外)
    • -print:見つかったファイルパス一覧を出力する
  • xargs grep 'flag1'
    • xargs:前のコマンドから渡されたファイル一覧を受け取り、次のコマンド(grep)の引数としてまとめて渡す
    • grep 'flag1':渡された各ファイルの中身を読み込み、flag1という文字列が含まれる行を探して出力する

ヒットしましたが結果的に特に有益な情報を得ることができませんでした。
スクリーンショット 2026-08-03 144841.png

13.データベースの認証情報を調べる

WordPressが使われており、設定ファイルにデータベースの認証情報が載っているためデータベースから他に手がかりがないか調べてみます。

more wp-config.php

moreコマンドを用いることでwp-config.phpファイルの内容を画面にページ区切りで表示してくれます。
スクリーンショット 2026-08-03 151143.png
このことから、ユーザー名はroot、パスワードはR@v3nSecurityだと分かりました。
Linuxシステム上で現在開いているネットワーク接続や待機(Listen)中のポート、そしてそれらを動かしているプロセスを一覧表示するコマンドを使って、MySQLが動作しているか確認します。

netstat -antp
  • -a:接続中の通信だけでなく、接続待ち受け状態のポートもすべて表示する
  • -n:ドメイン名やサービス名に変換せず、IPアドレスとポート番号を数値で高速表示する
  • -t:Web閲覧やSSHなどで使われる TCP通信のみ に絞り込んで表示する
  • -p:プロセスを表示する
    スクリーンショット 2026-08-03 160803.png

MySQLのポートは3306なため、LISTENになっていることからポートが開いており動作していることが分かります。

14.MySQLサーバーにアクセスする

mysql --host localhost --user root --password=R@v3nSecurity
  • --host:接続先の指定
  • --user:接続するユーザー名
  • --password=[パスワード]:パスワードを指定

スクリーンショット 2026-08-03 163556.png
ログインに成功しました。データベースの中からフラグに繋がる情報がないか探します。
スクリーンショット 2026-08-03 165143.png
wordpressというデータベースにwp_usersというテーブルがあるため、テーブルの中身を表示させます。
スクリーンショット 2026-08-03 165518.png
これだと見づらいため、\Gで分かりやすくすると以下のようになりました。
スクリーンショット 2026-08-03 170913.png
michaelstevenのWordPressのハッシュ化されたパスワードがありました。
このハッシュ化されたパスワードを解析するために、ハッシュリストを作成します。今回はこの本に記載されていた方法に沿ってファイルを作成します。

select concat(user_login,":",user_pass) from wp_users into outfile '/tmp/hash.txt';
  • into outfile '/tmp/hash.txt':取得した結果を画面に表示するのではなく、サーバー上の/tmp/hash.txtというテキストファイルに直接書き出す

今分かっているユーザー情報をまとめると以下のようになります。

ユーザー名 SSHのパスワード WordPressのハッシュ化されたパスワード WordPressのパスワード
michael michael \$P\$BjRvZQ.VQcGZlDeiKToCQd.cPw5XCe0 ???
steven ??? \$P\$Bk3VD9jsxx/loJoqNsURgHiaB23j7W/ ???

15.他にも何かないかデータベースの中を調べる

WordPressの記事はwordpressのデータベースの中にwp_postsテーブルがあるため、その中身を調べます。

select * from wp_posts\G

スクリーンショット 2026-08-06 165602.png
スクリーンショット 2026-08-06 165812.png
新たにflag3flag4があると分かりました。
flag3flag3{afc01ab56b50591e7dccf93122770cd2}flag4flag4{715dea6c055b9fe3337544932f2941ce}だということが分かります。
最低限調べることができたため、quit;でMySQLを閉じます。

15.ハッシュ化されたパスワードを解析する

/tmp/hash.txtを開いて、コピー&ペーストでSSHを抜けてハッシュファイルを作成します。
まずは、コピペをするためにcatコマンドを使ってコピーします。
スクリーンショット 2026-08-03 195115.png
このプロンプトとは別にプロンプトを開きハッシュファイルを作成します。

cd vulnhub/raven/

catコマンドを使って、hash.txtというファイルを作り、先ほどコピーしたものを貼り付けます。

cat > hash.txt
michael:$P$BjRvZQ.VQcGZlDeiKToCQd.cPw5XCe0
steven:$P$Bk3VD9jsxx/loJoqNsURgHiaB23j7W/

Ctrl+Dを教えて閉じます。
John the Ripperはオフライン型のパスワードクラッカーであるため、大規模なワードリスト(辞書ファイル)の活用に適しています。ここではrockyouファイルを採用します。

john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

待っていたのですが、途中でParrotOSが急に落ちてしまって写真がなくてすみません…。
pink84 (steven)と書かれていればパスワードクラックできています。
よってstevenのWordPressのパスワードがpink84だと分かります。

john --show hash.txt

スクリーンショット 2026-08-03 224529.png

16.解読したパスワードを認証情報を用いてユーザーの切り替えを行う

su steven

先ほどクラックしたパスワードpink84を入力します。
すると、プロンプトが返ってきたのでidコマンドを使って調べます。
スクリーンショット 2026-08-03 230815.png

17.sudo -lコマンドを使って、権限昇格を行えるか検証する

sudo -lコマンドを実行すると、現在ログインしているユーザー(または指定したユーザー)が、sudoを使ってどのコマンドをどの権限で実行できるか分かります。

sudo -l

スクリーンショット 2026-08-06 172818.png
Pythonをパスワードなしで実行できることが分かりました。
Pythonのインタラクティブモードを起動し、その内部から/bin/bashを呼び出し、ルート権限を取得してみましょう。

sudo /usr/bin/python

または、こちらのコマンドを実行します。

sudo /usr/bin/python -c 'import pty; pty.spawn("/bin/bash")'

ここでこのコマンドを実行してどのようなことが行われているかを説明していきます。
1. sudoを使って管理者権限でPythonの対話シェル(インタラクティブシェル)を立ち上げる
2. Pythonの内部からos.system('/bin/bash')を呼び出し、/bin/bashを実行する
3. これにより、最高権限である root ユーザーとしてシェルを操作できるようになる
スクリーンショット 2026-08-06 174619.png
ルートのプロンプトに変わったことが分かります。よって、権限昇格が成功したことが分かります。
cdコマンドを使って、rootディレクトリを移動し、lsコマンドを使いファイルの一覧を表示します。
スクリーンショット 2026-08-06 175208.png
上記のことからflag4.txtというファイルがあると分かります。
あとはcatコマンドを使って内容を表示すればフラグが出ます。
スクリーンショット 2026-08-06 175400.png
flag4flag4{715dea6c055b9fe3337544932f2941ce}だということが分かりました。

これにて解説は以上となります。
ご覧いただきありがとうございました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?