linuxCastor

Enumeration

Vamos a empezar con un escaneo nmap:

┌──(pylon㉿kali)-[~]
└─$ nmap -p- --open -sS -n -Pn --min-rate=5000 192.168.74.133
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-14 20:28 +0100
Nmap scan report for 192.168.74.133
Host is up (0.00056s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
MAC Address: 00:0C:29:96:AB:F3 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.95 seconds

Vamos a realizar un segundo escaneo nmap para obtener más información de los protocolos:

┌──(pylon㉿kali)-[~]
└─$ nmap -p22,80 -sCV 192.168.74.133
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-14 20:29 +0100
Nmap scan report for 192.168.74.133
Host is up (0.00016s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey:
|   256 af:79:a1:39:80:45:fb:b7:cb:86:fd:8b:62:69:4a:64 (ECDSA)
|_  256 6d:d4:9d:ac:0b:f0:a1:88:66:b4:ff:f6:42:bb:f2:e5 (ED25519)
80/tcp open  http    Apache httpd 2.4.62 ((Debian))
|_http-title: CastorTech | Madera Sostenible
|_http-server-header: Apache/2.4.62 (Debian)
MAC Address: 00:0C:29:96:AB:F3 (VMware)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.05 seconds

Vamos a ver la aplicación web:

Vamos a realizar fuzzing para ver que directorios y archivos existen en la estructura de la aplicación:

Vemos un upload.php , vamos a acceder a el:

Shell as castorcin

Vemos que esta esperando a que se le de un XML en el cuerpo. Vamos a interceptar está misma petición e indicarle cualquier contenido XML:

Vemos que nos lo devuelve, así que vamos a probar a explotar XXE para leer archivos internos del servidor:

Vemos el usuario castorcin si intentamos leer su id_rsa no podremos. Así que vamos a intentar hacer fuerza bruta a castorcin para ver si tiene una contraseña debil:

Obtuvimos las credenciales! Vamos a probar:

Shell as root

Si vemos los permisos SUDOERS podremos ver lo siguiente:

Tenemos permisos para usar el binario sed como cualquier usuario existente del sistema sin necesidad de contraseña. Así que con esto aprovecharemos para escalar como root . Para ello podemos ir a GTFOBinsarrow-up-right:

Vamos a probarlo:

root! ;)


Code Review

upload.php (XXE)

Vamos a verlo por partes:

Con init_set('display_errors',1) lo que hacemos es cambiar la configuración de PHP para mostrar los errores en pantalla (1). Luego con error_reporting(E_ALL) indicamos que nos notifique de todos los errores,advertencias y avisos (E_ALL).

Con libxml_use_internal_errors(true); indica que los errores que ocurran en XML no los muestre si no que se los guarde internamente.

Creamos una variable llamada xml donde usamos la función file_get_contents para obtener el contenido de lo que devuelva el wrapper php://input que se encarga de obtener todo el cuerpo de la petición HTTP. Luego realiza un condicional donde si la variable xml está vacia o no existe entonces devuelva xml not provided (error que nos devolvía cuando no dabamos ningún XML en el cuerpo de la solicitud).

Creamos un nuevo objeto en el DOM que nos permitirá trabajar con XML. Luego intentaremos parsear el XML en la variable xml. Si devuelve true significa que XML se cargó correctamente, si devuelve false entonces a ocurrido un error y se guardará en la variable loaded .

Ahora con un condicional indicamos que si loaded no se ha podido cargar (que ha devuelvo false) entonces iteramos por lo errores para imprimirlos y ver los posibles errores. Si loaded a cargado (a devuelto true) entonces modificamos la cabecera Content-Type de la respuesta indicando que serrá un SVG basado en XML. Luego converiremos el DOMDocument a texto XML y lo devolveremos como respuesta.