はじめに
今回選んだのは DerpNStink: 1。難易度は前回同様 Beginner ですが、今回は boot2root かつフラグを 4 つ獲得するのが目的です。OVA ファイルで提供されているのでインポートが楽です。
DerpNStink: 1
・Type: boot2root
・Level: Beginner
・URL: https://www.vulnhub.com/entry/derpnstink-1,221/
詳細
いつものように IP アドレスの特定からなので netdiscover で見つけます。その後、nmap で開いているサービスポートを確認します。ここまでの流れは基本的には他と一緒ですね。ちなみに、どの記事から読んでも理解できるようにいちいちこのくだりは書きますよ。
netdiscover オプションの意味:
-r (IP address レンジの指定。指定しないと 192.168.0.0/16 になる。)
nmap オプションの意味:
-p- (ポート範囲。- を指定している場合は 1~65535。)
-n (名前解決をしない。Closed だし。)
-sV (バージョンスキャン。)
-A (OS とそのバージョン。)
ftp (21)、ssh (22)、http (80) が有効そうです。ftp と ssh はクレデンシャルが分かっていないとどうにもできないので、http からの確認がよさそうです。まずはトップページの確認から行いました。
ソースの後ろの方にコメントとしてフラグが書かれていました。ブラウザで見ていると気が付きにくい場所ですが、curl でソースで見ていたのですぐに分かりました。ラッキーです。次いでヒントを探すのですが、ひとまず dirb で他のディレクトリやファイルがないかを確認しました。
いくつかヒントとなりそうな情報が見つかっています。phpmyadmin が使用されていること (DB は MySQL)、temporary ディレクトリ、php ディレクトリ、weblog ディレクトリ (wp_xxxx が見えるので WordPress と推測できます)。temporary と php をサラッと確認しますが、有益な情報はありません。weblog は curl だと応答が見えなかったのでブラウザで確認したところ、、、
リダイレクトされてしまいました。このドメインの名前解決ができていないと中身を確認できなさそうだったので hosts に追加しています。
ただ、これでも有益な情報はブログからは見つからず。。。WordPress なので wpscan で色々と列記ができそうです。まずはユーザ名とパスワードを探しました。
wpscan オプションの意味:
-u (ターゲットの URL。)
-e (enumrate、列挙。u はユーザの列挙。)
--wordlist (パスワードの候補。これを指定している場合、まずユーザの列挙が自動的に行われてからパスワードの辞書攻撃が行われます。)
wordlist ではパスワード自体はヒットしていませんが、ERROR として気になる表示が出ています。この値を使用して WordPress の管理画面にログインしたところ成功しましたので、有効なパスワードと言えそうです。次いでWordPress サイトに潜む脆弱性を確認します。
wpscan オプションの意味:
-u (ターゲットの URL。)
-e (enumrate、列挙。vt は脆弱性のあるテーマ、vp は脆弱性のあるプラグインの列挙です。)
どうも Slideshow Gallery というプラグインにいくつかの脆弱性が見つかっているようです。特に CVE-2014-5460 の Arbitrary File Upload は WebShell などを置ける脆弱性といえるので何かと有用そうです。Metasploit でこのプラグインの exploit を検索してみたところちょうどありましたので、これを利用して reverse_tcp を送り込み、meterpreter を奪えると良いですね。
ビンゴです。Meterpreter セッションを獲得することができました。WordPress サイトでこのセッションが作れるということは、wp-config.php ファイルの中身をのぞけることを意味します。つまり、DB への接続設定も確認することが可能です。さいしょに端末のユーザを確認し、そのあとに wp-config.php を確認しました。
端末に 2 つのユーザがいることと MySQL サーバの wordpress DB のクレデンシャルが分かりました。シェルから MySQL に接続してテーブルの中身を確認してみましょう。(ちなみに phpMyAdmin が設置されているサイトなのでそれを利用して GUI から確認することも可能です。)
無事に接続はできました。テーブル一覧を確認し、まずはユーザ情報のテーブルを確認してみましょう。
パスワードはハッシュ値ですが取得できました。これは後でクラックするのでテキストファイルに保存しておきます。他にも情報がないか違うテーブルを select 文で丁寧に見ていくと、2 つ目のフラグを確認することができました。(見やすいように発見した後にフラグだけを表示する SQL 文にしていますが、実際は select * from wp_xxx でしらみつぶしに探しています。)
フラグが取れたので次は取得したハッシュ値のクラックを。これはこの手のツールでは最もメジャーな?john を使っています。ワードリストは kali に最初からついてくる rockyou.txt を使いました(これは gz で圧縮された状態で提供されているのであらかじめ解凍する必要がありました)。
john オプションの意味:
--wordlist (クラック用辞書ファイルの指定。)
無事にクラックが成功しています。新たにパスワードが判明したユーザは 端末のユーザと一致する名前があるので、現在の Meterpreter のシェルから su できるか確認してみたところ切り替えることができました。有効なクレデンシャルが取れています。
切り替えたユーザのホームディレクトリを列挙したところ気になるファイルがいくつかありました。
ssh のファイルは公開鍵認証用に ssh-keygen で作った時のデフォルトのファイル名です。flag.txt も見えますね。ftp の key ファイルは ssh のファイルと中身が同じでした。network-logs のファイルは気になるやり取りが書かれており、おそらくこれの sniff したパケットが同じファイル名の pcap ファイルなのでしょう。ssh のファイルを SimpleHTTPServer を使って手元にダウンロードし、ssh で接続しなおしてから、それぞれ他のファイルの中身を確認してみました。
ssh オプションの意味:
-i (公開鍵認証用のプライベートキーファイルを指定。)
3 つめのフラグが取れました。network-logs ではもう一人のユーザがアカウントを忘れた旨、ログオン試行するときのパケットを取った旨が書かれています。パケットファイルの中に入力したパスワードが書かれていたらうれしいのですが。。。WireShark で開き、フローグラフでやり取りを確認したところ、主に 127.0.0.1 と 127.0.1.1 のやり取りです。おそらくこれが上述のログのやり取りなのでしょう。
wp-login.php に POST しているパケットがいくつか見えるので、このプロトコル、メソッドでフィルタして他のログイン試行のパケットを探したところ、やはりありました。とても長いパスワードですね。
このクレデンシャルを使用して su する事は可能でしょうか?
出来ました!徐々に root に近づいている気がします。先ほどと同じようにホームディレクトリを列挙し、気になるファイルを探し、一つだけ気になるものがあったので中身を確認しました。ここに書かれている URL にもブラウザでアクセスしてみましょう。
指定された URL には sudoers の記述が書かれていました。binaries ディレクトリで特定のファイル名の sudo 実行が root として動く、と解釈できます。例えば「バッチファイルでシェルを起動する」を sudo で実行した場合どうなるでしょうか?root がバッチファイルを実行したことになるので、シェルが root で動くはずです。バッチファイルを自分で作成して sudo で実行してみます。
(バッチファイル derpy.sh の中身)
bash オプションの意味:
-i (インタラクティブモードで実行する。)
root でシェルを実行することができました。あとは最後の flag を取得すればすべてのフラグ奪取完了です。単純に root のホームディレクトリ配下にありました。
まとめ
ワークフロー
[偵察]
- netdiscover (IP アドレスの調査)
- nmap (サービスの調査)
★ GET flag 1 - dirb (Web サービスのディレクトリやファイル調査)
- hosts 変更 (リダイレクトされるので)
- wpscan (WordPress サイトのスキャン)
[侵入]
- CVE-2014-5460 の Arbitrary File Upload (Metersploit の Exploit あり)
- wpscan で取得したクレデンシャル
[内部探索1(www-data)]
[権限昇格1(www-data → stinky)]
- john (パスワードのクラック)
- su (クラックしたパスワード使用)
[内部探索2(stinky)]
- find (ホームディレクトリの列挙)
★ GET flag 3 - id_rsa (ssh-keygen のデフォルトのファイル名。SSH 公開鍵認証のファイル。)
- ssh -i (公開鍵認証で接続)
- WireShark (フローグラフ → パケットのフィルタリング → POST された認証情報の取得。)
[権限昇格2(stinky→mrderp)]
- su (パケットから発見したパスワード使用)
[内部探索3(mrderp)]
- find (ホームディレクトリの列挙)
- sudo -l (実際には URL からの誘導型ヒントがあった。)
[権限昇格3(mrderp→root)]
攻撃のポイント
- dirb による WordPress サイトの発見
- wpscan によるユーザ/パスワードの取得、脆弱なプラグインの列挙
- CVE-2014-5460 を使用した reverse_tcp 取得
- wp-config.php に書かれている MySQL 認証情報
- john によるパスワードのクラック
- WireShark での POST データの確認
- sudo -l などで sudo 可能なファイルを確認
- bash のバッチファイルを sudo で実行
防御のポイント
(もし、この VM を守るなら。パッチ適用以外で。)