HackMyVM - Stars
Creado
Máquina Linux nivel fácil. Fuzzing, gafas para encontrar llaves SSH y archivos con grupos traviesos usando el comando chgrp.
TL;DR (Spanish writeup)
Creada por: cromiphi.
Descargamos la máquina acá: HackMyVM - Stars.
A arreglar, hoy vinimos a arreglar!
Tendremos un sitio web con cosas escondidas, haremos una fase de fuzzing
profunda para encontrar una llave SSH privada corrupta 🙃 que debemos arreglar, haremos esto para iniciar sesión en el sistema como el usuario sophie
.
Finalmente, sophie puede ejecutar el comando chgrp
como cualquier usuario del sistema, usaremos esto para modificar el grupo del archivo /etc/shadow
e intentar crackear la contraseña de los usuarios. Con esto obtendremos la contraseña sin cifrar del usuario root
.
…
La idea inicial de esta locura es tener mis “notas” por si algun día se me olvida todo (lo que es muuuy probable), leer esto y reencontrarme (o talvez no) 😄 La segunda idea surgio con el tiempo, ya que me di cuenta que esta es una puerta para personitas que como yo al inicio (o simplemente a veces) nos estancamos en este mundo de la seguridad, por lo que si tengo la oportunidad de ayudarlos ¿por qué no hacerlo?
Un detalle es que si ves mucho texto, es por que me gusta mostrar tanto errores como exitos y tambien plasmar todo desde una perspectiva más de enseñanza que de solo pasos a seguir. Sin menos, muchas gracias <3
…
Synth please.
…
Reconocimiento #
Como es usual en esta plataforma, descargamos la VM, la cargamos en el virtualizador, la iniciamos y ahora viene la parte juguetona, encontrar su IP. En este caso usaremos la herramienta nmap
para ello.
Tengo una red NAT configurada para que toda máquina que agregue a esa red tome una IP entre el rango 192.168.100.0/24
(192.168.100.1
- 192.168.100.254
), así que hagamos un escaneo sobre ese rango a ver cuál suena llamativa:
nmap -sn 192.168.100.0/24
...
Nmap scan report for 192.168.100.7
Host is up (0.000097s latency).
Nmap scan report for 192.168.100.11
Host is up (0.00050s latency).
...
Vemos dos importantes, una que es la mía (.7
) y la otra por intuición debe ser la máquina víctima, así que ya tenemos un objetivo (: Lo confirmaremos ya con escaneos y detalles más profundos.
nmap -p- --open 192.168.100.11 -v -oG initScan
Parámetro | Descripción |
---|---|
-p- | Escanea todos los 65535 |
–open | Solo los puertos que están abiertos |
-v | Permite ver en consola lo que va encontrando |
-oG | Guarda el output en un archivo con formato grepeable para usar una función extractPorts de S4vitar que me extrae los puertos en la clipboard |
Y si, hay dos puertos juguetones:
Puerto | Descripción |
---|---|
22 | SSH: Permite obtener una terminal de forma segura. |
80 | HTTP: Mantiene un servidor web. |
+ ~ +(Usando la función extractPorts
(referenciada antes) podemos copiar rápidamente los puertos en la clipboard, en este caso no es necesario (ya que tenemos pocos puertos), pero si tuviéramos varios evitamos tener que escribirlos uno a uno
extractPorts initScan
[*] Extracting information...
[*] IP Address: 192.168.100.11
[*] Open ports: 22,80
[*] Ports copied to clipboard
)+ ~ +
Ahora, con nmap
le indicaremos que con cada puerto, pruebe unos scripts que él tiene por default y que extraiga la versión del software usado en ese servicio:
nmap -p 22,80 -sCV 192.168.100.11 -v -oN portScan
Parámetro | Descripción |
---|---|
-p | Escaneo de los puertos obtenidos |
-sC | Muestra todos los scripts relacionados con el servicio |
-sV | Nos permite ver la versión del servicio |
-oN | Guarda el output en un archivo |
Tenemos algunas versiones:
Puerto | Servicio | Versión |
---|---|---|
22 | SSH | OpenSSH 8.4p1 Debian 5 (protocol 2.0) |
80 | HTTP | Apache httpd 2.4.51 |
Bien, pues esto nos sirve de cara a buscar vulnerabilidades para esos software y versiones, por ahora no hay nada más, así que a darle!
Enumeración #
Empecemos por el servidor web…
Servidor web (puerto 80) 📌
Jmmm, es un sitio que sigue en desarrollo, peeero el comentario “but not empty” es muy llamativo y nos puede estar dando una pista, algo así como “escarba y profundiza, hay algo por acá”.
Lo primero en lo que pienso es en fuzzing, esto para ver si existen objetos que estén fuera de la vista, pero aun así alojados en el servidor web, emplearé ffuf
:
ffuf -c -w /opt/seclists/Discovery/Web-Content/common.txt -u http://192.168.100.11/FUZZ
Empezaremos con una wordlist de objetos comunes, todo esto del gran repositorio SecLists.
Nada interesante. Así estamos con algunas otras wordlists, hasta que pasamos a la siguiente fase de los trucos, hacer un fuzzeo doble.
Con esto probamos archivos y extensiones (o lo que queramos probar), así podemos buscar por ejemplo hola.txt
y hola.js
.
Primero armamos una wordlist (extensiones.txt
) con posibles extensiones:
py
php
txt
bak
js
css
html
Y con ffuf
le indicamos la segunda wordlist de esta manera:
ffuf -c -w /opt/seclists/Discovery/Web-Content/common.txt:FILE -w extensiones.txt:EXT -u http://192.168.100.11/FILE.EXT
Nos muestra falsos positivos con respuestas que tienen un patrón, hay 10 lineas en todas ellas, así que le indicamos con
-fl 10
que evite mostrarnoslas.
Vamos tirando la toalla de wordlist a wordlist, hasta queeeeeeeeee:
ffuf -c -w /opt/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FILE -w extensiones.txt:EXT -u http://192.168.100.11/FILE.EXT -fl 10,14
ENCONTRÓ UN ARCHIVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO! (Bastante CTF esto, peeeero que más da, ahí reforzamos sobre ffuf
)
El contenido del objeto es el siguiente:
Un mensaje bastante “críptico” (se entiende? e.ealskjjf).
Acá entiendo que debería de tener ya una llave RSA, ya que no tengo nada para construir una nueva más que el nombre de usuario sophie
… Así que lo más probable es que debamos seguir fuzzeando buscando ahora la llave RSA.
La cosa es que después de probar y probar ahí, no logre resultados, solo fue hasta que por cosas de la vida me puse a revisar si había cookies en el sitio y vi esto:
Existe una cookie con lo que parece ser una cadena en base64
(por los dos == del final en URL Encode), validemos:
Khe? KLjasdkl, hay un nombre de archivo y si validamos ese archivo en el sitio webbbbbb:
Ahí tenemos la llave de la que sophie
nos habló, ahora toma sentido la nota completa…
Nos pide ayuda a ver si podemos arreglar su llave privada, para ello nos dice que existen 3 letras EN MAYÚSCULA que fueron reemplazadas por ***
(que vemos en la imagen). Lo que indica que debemos jugar con todas las letras del abecedario e ir regenerando con cada combinación una llave e ir probando conexiones como sophie. Suena chévere y juguetón para scriptear, vamos a hacerlo con Bash.
Explotación #
Este sería el script:
Lo único que necesitamos es el archivo de sophie con la llave corrupta.
Lo ejecutamos, empezará a probar y a probar, finalmente llegamos a las llaves buenonas con tres letras que nos explotaran la cabeza:
Por lo que ya tenemos acceso al sistema como el usuario sophie
, una forma muy peculiar, pero me gusto el jugar con scripting para lograrlo, sigamos…
Escalada de privilegios #
Si listamos los permisos que tiene sophie para ejecutar acciones como otros usuarios en el sistema (sudo
) vemos que hay uno:
Notamos que sophie puede ejecutar como cualquier usuario el binario (comando en este caso) /usr/bin/chgrp
, que investigando en la web, nos permite modificar el dueño de un archivo o directorio, así que suena muuuuuuy prometedor… ¿Ya imaginas que podemos hacer?
Bueno, para aprovecharnos de esto, una de las cosas que podemos pensar es jugar con los objetos /etc/shadow, que se encarga de guardar las contraseñas cifradas para cada usuario, y /etc/passwd, que tiene la labor de contener todo lo relacionado con el entorno del usuario (nombre, shell, grupos…).
La idea es sencilla, unir el contenido de los dos objetos y usar la herramienta unshadow
a ver si logramos crackear la contraseña del usuario root (por lo general esto no sirve, ya que se usan contraseñas robustas, pero lo que siempre digo, hay que probar de todo, cero cosas obvias).
La vaina es que el objeto /etc/shadow
inicialmente no permite que cualquier persona lea su contenido, solo root y los que estén en el grupo shadow:
Tomada de tecadmin.net - Linux File Permissions.
sophie@debian:~$ ls -la /etc/shadow
-rw-r----- 1 root shadow 859 Oct 17 2021 /etc/shadow
Peeeero, contamos con el objeto travieso que modifica grupos, indiquémosle que ahora sophie
sea la dueña del grupo que puede leer, y no shadow
:
sudo -u root /usr/bin/chgrp sophie /etc/shadow
Validamoooooos:
sophie@debian:~$ ls -la /etc/shadow
-rw-r----- 1 root sophie 859 Oct 17 2021 /etc/shadow
PEEERRRFECTOOOO, y si ahora intentamos listar su contenidoooooo:
Tamos dentro mis reyes!
Ahora tomemos ese contenido, creemos un archivo en nuestra máquina de atacante llamado shadow (o como quieras) y peguemos la info ahí. Haremos lo mismo para el objeto passwd, finalmente tendremos:
ls
passwd shadow
Y ahora el truco, mediante la herramienta unshadow juntaremos los resultados en un solo archivo:
unshadow passwd shadow > file_to_crack
Y ahora, con ayuda de John The Ripper
le pasaremos dos cosas, una wordlist (que sería la lista de posibles contraseñas) y el archivo que acabamos de generar a ver si logra romper el hash:
john -w:/usr/share/wordlists/rockyou.txt file_to_crack
YyyyyyyyyYYYYY:
VEMOS LA CONTRASEÑA SIN CIFRAR DEL USUARIO root
!!! Validemos:
Y listos, somos root, chequeemos las flags:
…
Máquina juguetona, me gusto mucho el tema del scripting, el retarnos a aprender y mejorar. Y ya saben, no dejen archivos en cookies 🤣
Nos leemos en otra ocasión, siempre se aprende, SIEMPRE! A darle duro y a romper de todooooooooooo!
Comments