Simple CTF

blog-image

Simple CTF

Configuración inicial

Recordemos que como primer paso debemos descargar nuestro archivo con extensión .ovpn para poder acceder a las máquinas de la plataforma Try Hack Me. Ya que contamos con nuestro archivo, lo utilizaremos para conectarnos por VPN a las máquinas. Una conexión VPN crea una conexión entre nuestra computadora y la red local en la que se encuentra la máquina, de este modo podemos interactuar con ella como si fueramos parte de esa red local (es por eso que al crear la conexión se asigna una dirección IP a nuestra computadora).

Ejecutamos el siguiente comando para conectarnos por VPN:

vpn

La IP que nos asigna la conexión VPN la podemos revisar en otra consola con el comando ifconfig y en este caso la visualizamos en la interfaz tun0:

ifconfig

Iniciamos la máquina y obtenemos la dirección IP de la misma:

ip

Escaneo de puertos

Dada la IP: 10.10.108.27 proporcionada por Try Hack Me. utilizamos el siguiente comando para hacer un escaneo de puertos:

sudo nmap -A 10.10.108.27

La bandera -A es utilizada principalmente para habilitar la detección de sistemas operativos y versiones. Esto nos dará más información que un escaneo sin esta bandera, sin embargo también tomará más tiempo.

El resultado fue el siguiente:

┌──(kali㉿kali)-[~]
└─$ sudo nmap -A 10.10.108.27 
[sudo] password for kali: 
Starting Nmap 7.91 ( https://nmap.org ) at 2022-01-27 19:32 EST
Nmap scan report for 10.10.108.27
Host is up (0.20s latency).
Not shown: 997 filtered ports
PORT     STATE SERVICE VERSION
21/tcp   open  ftp     vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_Can't get directory listing: TIMEOUT
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to ::ffff:10.2.101.155
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 4
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
80/tcp   open  http    Apache httpd 2.4.18 ((Ubuntu))
| http-robots.txt: 2 disallowed entries 
|_/ /openemr-5_0_1_3 
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
2222/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 29:42:69:14:9e:ca:d9:17:98:8c:27:72:3a:cd:a9:23 (RSA)
|   256 9b:d1:65:07:51:08:00:61:98:de:95:ed:3a:e3:81:1c (ECDSA)
|_  256 12:65:1b:61:cf:4d:e5:75:fe:f4:e8:d4:6e:10:2a:f6 (ED25519)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 3.10 - 3.13 (91%), Crestron XPanel control system (89%), HP P2000 G3 NAS device (86%), ASUS RT-N56U WAP (Linux 3.4) (86%), Linux 3.1 (86%), Linux 3.16 (86%), Linux 3.2 (86%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (86%), Linux 2.6.32 (85%), Linux 2.6.32 - 3.1 (85%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 4 hops
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 80/tcp)
HOP RTT       ADDRESS
1   57.01 ms  10.2.0.1
2   ... 3
4   197.76 ms 10.10.108.27

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 62.23 seconds
                                                                   

FTP (File Transfer Protocol)

La herramienta nmap nos indicó que cuenta con el servicio ftp en el puerto 22. Además dice que permite hacer login con Anonymous en el servidor. Así que se procede a conectarse:

ftp

En el servicio ftp se encontró un archivo siguiendo los siguientes comandos:

┌──(kali㉿kali)-[~]
└─$ ftp 10.10.108.27
Connected to 10.10.108.27.
220 (vsFTPd 3.0.3)
Name (10.10.108.27:kali): Anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x    2 ftp      ftp          4096 Aug 17  2019 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 ftp      ftp           166 Aug 17  2019 ForMitch.txt
226 Directory send OK.
ftp> get ForMitch.txt
local: ForMitch.txt remote: ForMitch.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for ForMitch.txt (166 bytes).
226 Transfer complete.
166 bytes received in 0.00 secs (72.5971 kB/s)
ftp> exit
221 Goodbye.
                                                                                                  
┌──(kali㉿kali)-[~]
└─$ cat ForMitch.txt 
Dammit man... you'te the worst dev i've seen. You set the same pass for the system user, and the password is so weak... i cracked it in seconds. Gosh... what a mess!

Gracias al ftp ahora sabemos que hay una contraseña fácil de crackear. Por lo mientras seguiremos explorando la máquina.

Servicio HTTP

La herramienta nmap nos indicó que tiene el puerto 80 abierto y corre un servicio http por lo que se verifica que haya una página web en la IP de la máquina. La página mostrada es la siguiente:

http

Como no hemos obtenido suficiente información para pensar en un posible ataque se hará uso de la herramienta dirbuster para hacer Brute Force de directorios y archivos sobre la página web. Esto con la finalidad de encontrar alguna carpeta o archivo que sea de nuestro interés. La configuración que se utilizó fue la siguiente:

dirbuster

Después de un tiempo de ejecución se mostró un directorio interesante (El directorio /simple):

dirbusterResultado

Exploit

En la página principal que muestra el directorio /simple encontramos un cms madesimple version 2.2.8.

Al interactuar más con la página encontramos que hay un login en la carpeta /admin. Así que procedemos a buscar más acerca del cms madesimple y tratar de encontrar algún exploit.

Se encontró un exploit en: https://www.exploit-db.com/exploits/46635 que es para versiones menores a 2.2.10 de cms madesimple. Este exploit es para realizar un sql injection que se encarga de obtener información de la base de datos de la página. El único detalle es que está esrito en python 2. Como primer intento tratamos de hacerlo funcionar con python 3 modificando las funciones print agregando los paréntesis () que son necesarios en python 3.

Una vez que se hicieron las modificaciones en el exploit se utilizó el siguiente comando para ejecutar el exploit tal cual se muestra en el ejemplo del exploit: python3 exploiy.py -u http://10.10.108.27/simple

El resultado fue el siguiente:

exploit

Concepto básico de función hash: Una función hash es una función que toma como entrada cualquier cantidad de datos y se encarga de transformarlos en una salida de tamaño fijo. Una función hash pretende ser sólo de ida, esto quiere decir que cuando a ciertos datos de le aplica una función hash es fácil ir pero ya no debe de ser reversible, es decir, ya no debe de ser intuitivo regresar.

Recordemos que en una base de datos en lugar de guardar las contraseñas en texto claro se guardan los resultados de aplicarles una función hash(). En este caso contamos con el resultado de esa función hash. Primero debemos encontrar el posible tipo de algoritmo que fue utilizado. Una herramienta para descubrir el posible algoritmo es hash-identifier. A continuación se muestra cómo usar la herramienta. Primero se ejecuta el comando hash-identifier y después se introduce la hash obtenida con el exploit de sql injection, así es como obtenemos el posible algoritmo de hash().

hash-identifier

Cuando se cuenta con la hash de una contraseña se puede intentar encontrar dicha contraseña. Es necesario uilizar una lista de contraseñas e iterar una por una comparando el resultado de la función hash() y en caso de que coincidan se puede decir que se ha encontrado la contraseña ya que dicha contraseña genera la hash con la que se está comparando.

Recordemos que en un inicio encontramos un mensaje que nos sugería que la contraseña era fácil de crackear, por lo que muy probable que podramos crackear la contraseña con una lista de contraseñas comunes. En Kali Linux se cuenta con un archivo llamado rockyou.txt.gz ubicado en la carpeta /usr/share/wordlists y se puede descomprimir con el comando gunzip rockyou.txt.gz . Cuando descomprimimos dicho archivo podemos obtener un archivo .txt que cuenta con las contraseñas más usadas y con ayuda de este podemos intentar encontrar la contraseña que nos permitirá acceder al sistema.

En este caso también debemos considerar que la hash de la contraseña incluye un salt que es un valor que se suma a la entrada (contraseña) y a este par se le aplica la función hash, esto se hace con la finalidad de que una contraseña no sea tan sencilla de crackear, ya que por muy simple que sea la contraseña se debe de encontrar la manera de probar cada contraseña con la salt correspondiente.

Se utilizará la herramienta hashcat para crackear la contraseña. Es necesario que se especifique el tipo de algoritmo hash, la hash que obtuvimos del sql injection, y la salt que también obtuvimos del sql injection.

Para intentar encontrar la contraseña se utilizó el siguiente comando:

hashcat

En este caso realizaremos un wordlist attack que consiste en utilizar una lista/diccionario de constraseñas e iterar una por una hasta encontrar la contraseña que al aplicarle la función hash de como resultado la hash que recibe como entrada hashcat. Este modo de ataque es el correspondiente al straight mode en hashcat el cual se indica con la bandera (a) de la siguiente manera: -a 0, además se debe de especificar el hash_type, este será el número correspondiente al tipo de hash que arrojó el hash-identifier. Por último, recordemos que contamos con una salt y una hash, estos valores se escribirán entre comillas con el siguiente formato: "hash:salt". Recordemos que tanto la hash como la salt fueron obtenidas previamente con el sql injection.

hashcatResultado

Obtener una shell

Una vez que obtuvimos la contraseña intentamos entrar por ssh con las credenciales que hemos encontrado hasta el momento. Debemos de tener en cuenta que el protocolo ssh suele estar en el puerto 22 pero en este caso se encuentra en el 2222 por lo que harémos una ligera variación en el comando para realizar la conexión, se indicará con la bandera -p el puerto por el que se conectará de la siguiente manera: ssh -p 2222 mitch@10.10.108.27 Nota: en caso de recibir el mensaje “Are you sure you want to continue connecting (yes/no/[fingerprint])?” deberemos de introducir “yes” + enter.

Logramos obtener una shell, sin embargo por el prompt ($) tan simple y que no podemos utilizar las flechas del teclado, nos damos cuenta que contamos con una shell sh por lo que intentamos utilizar /bin/bash para obtener una bash que es una versión mejorada de sh.

ssh

Ya que contamos con una bash incluso vemos mejor el prompt (mitch@Machine:~$ ). Primero probamos el comando: whoami para saber quiénes somos:

whoami

Si vemos los archivos que están en el directorio actual nos damos cuenta que tenemos la primera bandera:

bandera1

Escalamiento de privilegios

Aunque tengamos una shell eso no significa que tenemos permisos de superusuario, es por eso que proseguimos a encontrar una manera de obtener estos los privilegios. Ejecutamos el comando: sudo -l para saber qué es lo que podemos ejecutar como superusuario:

sudo-l

Ahora que sabemos que podemos ejecutar sin contraseña y como superusuario vim podemos buscar como hacer el escalamiento de privilegios con vim. Una opción es ejecutar vim indicandole un comando a ejecutar y conseguir una shell con privilegios de superusuario de la siguiente manera:

escalamiento

Como primer intento se trató de conseguir una bash sin embargo no obtuvimos ninguna shell por lo que se intentó con una sh.

Algunas veces resulta incómodo trabajar con shells sh por lo que intentamos obtener una bash con python3 :

pty

Finalmente obtenemos la última bandera que se encontraba en la carpeta /root:

bandera2