Ravenマシンをハッキングする
今回もハッキング・ラボのつくりかたを使って、「Raven」マシンをハッキングしていきます!
ところどころ本のやり方とは違うやり方でやっている場合があります。
ご承知おきください。
1.環境構築
VirtualBoxの設定はこちら#2を参照してください。
Ravenのダウンロードページはこちらです。
2.IPアドレスを調べる
本ではip -4 addr show dev enp0s3でIPアドレスを調べていますが、私はip aで調べました。
お好みの方を選んでください。

私の場合192.168.56.108だということが分かります。
前回と同様にターゲットのIPアドレス(RavenマシンのIPアドレス)を調べてみましょう。
ところが、本に記載されているnmapのコマンドを実行したところ以下のようになってしまいました。

エラーの原因としては、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)リクエストを使って高速かつ静かに検出(ピン推進・ホスト発見)することができます。

この結果からRavenのIPアドレスは192.168.56.114であると分かります。
3.疎通確認を行う
Pingで疎通確認をします。
ping 192.168.56.114

ちゃんと通っていることが分かります。Ctrl+Cをして終了させます。
4.Raven専用のディレクトリを作成する
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):経路の追跡
| ポートスキャン番号 | サービス名 | 詳細バージョン/情報 |
|---|---|---|
| 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/にアクセスします。

右上のHOMEからCONTACTまで順にソースやページ内を調べます。
すると、SERVICEのところのソース全体を見ると262行目にこのように記述されていたかと思います。

よってフラグの1個目はflag1{b9bbcb33e11b80be759c4e844862482d}だと分かります。
BLOGをクリックするとhttp://192.168.56.114/wordpress/が開かれました。

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
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

これにより、ターゲットサイトにmichaelというユーザーが存在すると分かりました。
michael以外にもユーザがいないかWPScanを使ってWordPressのユーザーをスキャンします。
以下のコマンドを実行します。
wpscan --url $URL/wordpress --enumerate u
コマンドのオプションの一覧
-
wpscan:WordPress専用のセキュリティスキャンツールを起動する -
--url $URL/wordpress:スキャン対象のWebサイトのURLを指定している -
--enumerate u:ユーザーを列挙(一覧表示)する

長いため重要な部分だけをピックアップすると、どうやらmichael以外にもstevenというユーザーがいることが分かります。
この2つのユーザーを載せたユーザーリストを作成します。
cat > names.txt
ここにmichaelと入力した後Enterをして、次にstevenと入力した後Ctrl+Dをして閉じます。
書き込まれているか確認するためにcat`コマンドを使います。

このように書き込まれていることを確認してください。
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

待ってみたのですが、stevenのパスワードは分かりませんでした。michaelの方はmichaelというパスワードであることが分かりました。
12.michaelでSSHにアクセスします
以下のコマンドを実行してSSHにアクセスします。
ssh michael@192.168.56.114

Are you sure you want to continue connecting?はyesと入力し、passwordは先ほど辞書攻撃して出たmichaelと入力します。
すると、ログインに成功したと思います。
色々調べた結果このようになりました。

試しにcdコマンドを使って、ルートディレクトリに移動し、lsコマンドを使って中身を調べます。

まずは、/varの中身を調べます。

次に、/wwwの中身を調べます。

すると、flag2.txtと書かれているテキストファイルがありました。catコマンドを使って、中身を調べてみます。

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という文字列が含まれる行を探して出力する
-
ヒットしましたが結果的に特に有益な情報を得ることができませんでした。

13.データベースの認証情報を調べる
WordPressが使われており、設定ファイルにデータベースの認証情報が載っているためデータベースから他に手がかりがないか調べてみます。
more wp-config.php
moreコマンドを用いることでwp-config.phpファイルの内容を画面にページ区切りで表示してくれます。

このことから、ユーザー名はroot、パスワードはR@v3nSecurityだと分かりました。
Linuxシステム上で現在開いているネットワーク接続や待機(Listen)中のポート、そしてそれらを動かしているプロセスを一覧表示するコマンドを使って、MySQLが動作しているか確認します。
netstat -antp
-
-a:接続中の通信だけでなく、接続待ち受け状態のポートもすべて表示する -
-n:ドメイン名やサービス名に変換せず、IPアドレスとポート番号を数値で高速表示する -
-t:Web閲覧やSSHなどで使われる TCP通信のみ に絞り込んで表示する -
-p:プロセスを表示する
MySQLのポートは3306なため、LISTENになっていることからポートが開いており動作していることが分かります。
14.MySQLサーバーにアクセスする
mysql --host localhost --user root --password=R@v3nSecurity
-
--host:接続先の指定 -
--user:接続するユーザー名 -
--password=[パスワード]:パスワードを指定

ログインに成功しました。データベースの中からフラグに繋がる情報がないか探します。

wordpressというデータベースにwp_usersというテーブルがあるため、テーブルの中身を表示させます。

これだと見づらいため、\Gで分かりやすくすると以下のようになりました。

michaelとstevenの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


新たにflag3とflag4があると分かりました。
flag3はflag3{afc01ab56b50591e7dccf93122770cd2}、flag4はflag4{715dea6c055b9fe3337544932f2941ce}だということが分かります。
最低限調べることができたため、quit;でMySQLを閉じます。
15.ハッシュ化されたパスワードを解析する
/tmp/hash.txtを開いて、コピー&ペーストでSSHを抜けてハッシュファイルを作成します。
まずは、コピペをするためにcatコマンドを使ってコピーします。

このプロンプトとは別にプロンプトを開きハッシュファイルを作成します。
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
16.解読したパスワードを認証情報を用いてユーザーの切り替えを行う
su steven
先ほどクラックしたパスワードpink84を入力します。
すると、プロンプトが返ってきたのでidコマンドを使って調べます。

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

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 ユーザーとしてシェルを操作できるようになる

ルートのプロンプトに変わったことが分かります。よって、権限昇格が成功したことが分かります。
cdコマンドを使って、rootディレクトリを移動し、lsコマンドを使いファイルの一覧を表示します。

上記のことからflag4.txtというファイルがあると分かります。
あとはcatコマンドを使って内容を表示すればフラグが出ます。

flag4はflag4{715dea6c055b9fe3337544932f2941ce}だということが分かりました。
これにて解説は以上となります。
ご覧いただきありがとうございました。



