DockerLabs StrongJenkins

DockerLabs StrongJenkins

Esta es una máquina de DockerLabs de nivel medio

·

4 min read

Para poder hacer uso de esta máquina primero debemos descargar los archivos y así desplegarlo con Docker.

Descargamos el archivo de la página dockerlabs.es/#

Al momento de descargar esta máquina y descomprimir el archivo, en este caso observamos 2 archivos.

Para desplegar el laboratorio ejecutamos de la siguiente manera, así también podemos ver que nos indica la dirección que tendremos, así también el que hacer cuando terminemos este.

Escaneamos la dirección IP y podemos observar que solo encontró un puerto abierto.

Ingresamos a la dirección desde nuestro navegador y podemos observar que nos sale el login del servicio de Jenkins.

Tratamos de escanear en busca de algún directorio, pero no podemos realizarlo.

Usando whatweb podemos observar que la versión de Jenkins es la 2.440.2

Ya que no podemos listar algún directorio tratamos de buscar uno de manera manual como alguno que conocemos que sería /people, pero no da ningún resultado, nos redirige a login.

Probamos con algunas credenciales por defecto pero no funcionan. Como tenemos la versión de Jenkins probaremos por ese lado. Buscando encontramos este CVE.

Buscando un POC encontramos el siguiente CVE-2024-23897, el cual nos permite leer archivos del sistema. Al Ejecutar el script podemos observar que nos da un error.

Como no podemos ingresar abusando de la versión o algún directorio probaremos un ataque de fuerza bruta al login de Jenkins usando el usuario por defecto admin. Para ello primero haremos uso de Burpsuite. Enviamos la petición y en burpsuite podemos observar.

Enviamos al repeater y enviamos la petición y en response podemos observar que al ser erróneo el password redirige a /loginError.

Lo que necesitamos es realizar clic derecho y seleccionamos change request.

Una vez echo ello, observarnos la cabecera y podemos observar la siguiente línea que es lo que nos interesa y lo copiamos.

/j_spring_security_check?j_username=admin&j_password=admin123&from=%2F&Submit=

Probamos realizarlo con hydra, pero no nos da un resultado.

Y para usar el archivo de rockyou junto con burpsuite mediante la opción de intruder nos resulta muy pesado cargar ese archivo lo que imposibilita su uso. Por ello lo haremos de manera personalizada. Primero probaremos con curl para tener una idea clara de que hacer con lo que obtenemos.

Luego de revisar las repuestas que obteníamos pudimos realizar este código en Python para realizar fuerza bruta.

import requests

# archivo de diccionario con los passwords
PASSWORDS_FILE = "/usr/share/wordlists/rockyou.txt"

# url de autenticación
URL = "http://172.17.0.2:8080/j_spring_security_check"

# usuario fijo
USERNAME = "admin"

# leer el archivo del diccionario
with open(PASSWORDS_FILE, 'r', encoding='utf-8') as file:
    for line in file:
        password = line.strip()  # elimina espacios en blanco

        # hacer la solicitud con la contraseña actual
        response = requests.post(
            URL,
            data={
                'j_username': USERNAME,
                'j_password': password,
                'from': '/',
                'Submit': ''
            },
            headers={
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            allow_redirects=False  # no seguir redirecciones 
        )

        # imprimir el password que se esta probando
        print(f"Probando el password: {password}")

        # Comprueba si se da con exito
        if response.headers['Location'] != 'http://172.17.0.2:8080/loginError':
            print(f"Password Encontrada!!!!!!: {password}")
            break

print("Se finalizo los intentos.")

Luego de ejecutar nuestro script podemos observar que el password es rockyou.

Una vez encontrado ingresamos las credenciales en el login y podemos observar que pudimos acceder con éxito.

admin:rockyou

Revisando podemos observar que hay una sección donde podemos ejecutar código.

Notemos que indica, groovy script y buscando sobre ello encontramos el siguiente comando que nos permite obtener una shell: revshell. Antes de enviar iniciamos nuestro listener.

Y luego enviamos el comando de la siguiente manera.

Una vez enviado podemos observar que ya tenemos acceso en nuestra máquina.

Para facilitar las cosas en este punto migraremos la shell porque en este caso nos ocurre que no podemos hacer uso de las flechas o subir y bajar al comando anterior. Para ello primero hacemos

script /dev/null -c bash

luego un ctrl+z, regresaremos a nuestra consola, luego de ello ingresaremos los siguientes comandos para recuperar la shell usamos stty

stty raw -echo; fg
                reset xterm

para obtener más características usamos

export TERM=xterm

para la variable de entorno

echo $SHELL

y para pasar a bash usamos

export SHELL=/bin/bash

para establecer el tamaño adecuado de la consola ingresamos

stty rows 59 cols 236

Ya que tenemos una mejor consola realizamos un sudo-l y podemos observar que no podemos hacer uso de este.

Cambiamos de directorio y realizamos un escaneo de permisos SUID y podemos observar que tenemos al binario de Python.

Buscando en la página de GFOBins observamos como hacerlo.

Ingresamos el comando y podemos observar que obtuvimos acceso como root. De esta manera culminando exitosamente la máquina.