Peter es un apasionado de la tecnología y trabaja como desarrollador de software en una empresa de renombre. Ha pasado innumerables horas creando programas innovadores y asegurándose de que los sitemas estén protegidos.
Sin embargo, Peter ha tenido un revés recientemente. Durante las últimas semanas, ha estado trabajando en un proyecto muy exigente y, debido al estrés y las largas horas de trabjo, ha olvidado por completo su contraseña. ¿Puedes ayudarle a recuperar la contraseña de su usuario?
FORMATO: contraseña
Con este writeup, podrás descargar el reto y realizarlo paso a paso. El volcado de memoria pesa 2.5gb comprimido. Si solo quieres ver como se resuelve, y no quieres descargar el fichero baja directamente a "ANÁLISIS INICIAL"
.
Clona el repositorio en tu máquina
git clone https://github.com/1ocho3/NATIONAL_CYBERLEAGUE
Entra en el directorio del volcado de memoria:
cd volcado
Descomprime el primer fichero de los zips segmentados:
7z e NCL-V-SEMIFINAL-TECNICO-02.zip.001
El resultado es un fichero llamado memory.dmp
Para este reto usaremos volatility. En este caso usaré volatility2, se puede conseguir el mismo resultado con volatility3.
Lo primero será realizar un kdbgscan
, en este reto me ha dado mejores resultados que imageinfo
.
vol.py -f memory.dmp kdbgscan
Desde ahora en adelante, especificaremos este perfil cada vez que ejecutemos un plugin.
Lo siguiente, podemos pensar que sería descargar inmediatamente los hashes NTLM del volcado pero pronto se descubre que no es el camino. Observar los procesos es un gran punto de salida cuando no sepamos por donde seguir. En este caso hay un proceso que destaca sobre el resto.
vol.py -f memory.dmp --profile=Win10x64_18362 pslist
Este es el output que recibimos, donde podemos observar el proceso KeePass
Volatility Foundation Volatility Framework 2.6.1
Offset(V) | Name | PID | PPID | Thds | Hnds | Sess | Wow64 | Start |
---|---|---|---|---|---|---|---|---|
0xffffae094467f358 | System | 4 | 0 | 139 | 0 | 0 | 2023-05-18 11:41:34 UTC+0000 | |
0xffffae094a7be1d8 | svchost.exe | 8964 | 696 | 9 | 0 | 0 | 2023-05-18 11:43:34 UTC+0000 | |
0xffffae094c27f498 | SgrmBroker.exe | 8856 | 696 | 8 | 0 | 0 | 2023-05-18 11:43:40 UTC+0000 | |
0xffffae094ccaf498 | svchost.exe | 7992 | 696 | 13 | 0 | 0 | 2023-05-18 11:43:40 UTC+0000 | |
0xffffae094ad0e1d8 | KeePass.exe | 4288 | 3420 | 8 | 0 | 1 | 2023-05-18 11:43:43 UTC+0000 | |
0xffffae094a6c83d8 | svchost.exe | 6988 | 696 | 10 | 0 | 0 | 2023-05-18 11:43:43 UTC+0000 | |
0xffffae094a2871d8 | wuauclt.exe | 1372 | 1436 | 5 | 0 | 0 | 2023-05-18 11:44:15 UTC+0000 |
Podemos tratar de descargar un dump, encontrar su versión y buscar algún tipo de vulnerabilidad.
No podemos hacer un procdump del archivo KeePass.exe debido a la paginación pero podremos realizar un memdump que además nos aportará más información, no solo el ejecutable como hace procdump.
vol.py -f memory.dmp --profile=Win10x64_18362 memdump --pid 4288 -D [DIRECTORIO DE SALIDA EXISTENTE]
Una vez tenemos la memoria del proceso volcada, antes de tratar de hacer nada más, lo mejor será investigar la información del programa.
Con strings
y grep
hacemos una búsqueda con el fin de averiguar la versión del programa.
strings 4288.dmp | grep KeePass
Devuelve lo siguiente:
Nos encontramos con la versión 2.53.1, en el momento de la competición la última versión es la 2.55
Sabemos que estamos trabajando con una versión anterior, desactualizada, podemos buscar alguna vulnerabilidad.
Entre las más prometedoras encontramos el CVE-2023-32784
:
Para ejecutar el PoC debemos proporcionar el volcado del porceso:
dotnet run 4288.dmp
Pero en una primera instancia descubrimos que no es capaz de extraer la contraseña:
Una investigación mas profunda del PoC descubre que podemos ejecutarlo sobre un volcado del proceso, o sobre el volcado de memoria COMPLETO de la máquina.
Con esto en mente, tratamos de hacer lo mismo.
dotnet run memory.dmp
Tenemos la contraseña a falta de discernir cuales son los caracteres inciales. La característica fundamental de esta vulnerabilidad es que el primer caracter no se puede extraer y algunos pueden tomar rangos de valores. Pero analicemos el output:
Si separamos lo que devuelve, encontramos lo siguiente:
● --> Primer caracter (desconocido)
{Ú, B, , à, 9, ¿, Ë, ½, , o, ß, =, k, À, Ó, Ì, Î, å, O, y, E, Ü, $, ,, 4, «, Á, g, ¬, ;, , , ê, M, æ, p, , ô, , , r, ¤, ¡, @, ¢, I, ®, ÿ, d, e, Ð, Â, w, ü, , !, t, º, <, ÷, Ñ, 7, S, Ô, ð, 3, , , T, G, ×, Æ, F, Q, Ä, %, `, L, ú, 1, , Ø, ., ), 8, ¨, 0, µ, , ø, z, °, {, É, , , H, 2, ', (, ·, s, h, , R, ç, , |, W, a, D, 5, , , , A, î, , C, "} --> Posibles 2º carácter
{ , °, µ, 1} --> Posibles 3er carácter
5_1S_4_sTr0ng --> Caracteres extraídos
{P, _} --> Posibles 17º carácter
s3cUrit1 --> Caracteres extraídos
{w, _} --> Posibles 26º carácter
PwD --> Caracteres finales extraídos
De este conjunto de posibilidades podemos intuir, en base a 5_1S_4_sTr0ng
que los caracteres 17 y 26 son un guión bajo _
:
5_1S_4_sTr0ng_s3cUrit1_PwD
Vemos que la contraseña en texto plano se asemeja a: S_IS_A_STRONG_SECURITY_PWD
Con esto conseguimos vislumbrar como será la contraseña al completo: THIS_IS_A_STRONG_SECURITY_PWD
Viendo que las i's y las S's se han cambiado por 1 y 5 la contraseña quedaría de la siguiente forma tomando las siguiente posibilidades:
TH15_1S_4_sTr0ng_s3cUrit1_PwD
tH15_1S_4_sTr0ng_s3cUrit1_PwD
Th15_1S_4_sTr0ng_s3cUrit1_PwD
th15_1S_4_sTr0ng_s3cUrit1_PwD
Enhorabuena!!!! Ya tenemos la contraseña de KeePass, tan solo son 4 posibilidades, estamos muy cerca. Pero ahora. ¿Cómo conseguimos la contraseña de Peter?
Necesitamos acceder a la base de datos de KeePass.
La base de datos por defecto se llama KeePass.kdbx. Con esto procedemos a buscar y dumpear el archivo.
vol.py -f memory.dmp --profile=Win10x64_18362 filescan | grep Database.kdbx
En este momento solo queda extraer el archivo.
Nos valdremos de la dirección virtual: 0x0000ae094c7aeb00
Volatility2 no me surtió resultado, por lo que acudí a volatility3 para este paso:
vol3 -f memory.dmp windows.dumpfiles --virtaddr 0x0000ae094c7aeb00
Ya tenemos todo lo que necesitamos, las 4 posibles Master Password
del KeePass de Peter y la base de datos.
Ahora en nuestra máquina descargaremos KeePass2 o KeePassxc y abriremos la base de datos extraída:
Probamos las contraseñas y descubrimos que ¡BINGO! la contraseña es la opción tH15_1S_4_sTr0ng_s3cUrit1_PwD
Una vez dentro de la base de datos vemos tres credenciales guardados:
El OnlyFans
de Peter.
El Usuario y contraseña de la plataforma de ajedrez de peter.
Y las credenciales de su ordenador:
Obviando todo lo que es OFbviamente prescindible y centrándonos en nuestros valores, sobre todo en el de CONFIDENCIALIDAD, entraremos directos en los credenciales que parecen apuntar al ordenador de peter
peter computer
...... ·.· Sin comentarios....
CONSEGUIDO!! Recuerda, al igual que un llavero sirve para perder todas las llaves a la vez, KeepPass sirve para filtrar todas tus contraseñas de un golpe.
No te olvides, los sistemas son seguros hasta que dejan de serlos.
________ ________ ________ ________ ________ ________ ________ ________
|\ ___ \|\ __ \|\ ____\|\ ___ \|\ __ \|\ ____\ |\_____ \ |\_____ \
\ \ \\ \ \ \ \|\ \ \ \___|\ \ \\ \ \ \ \|\ \ \ \___| \|____|\ /_ \|___/ /|
\ \ \\ \ \ \ \\\ \ \ \ \ \ \\ \ \ \ \\\ \ \ \ \|\ \ / / /
\ \ \\ \ \ \ \\\ \ \ \____\ \ \\ \ \ \ \\\ \ \ \____ __\_\ \ / / /
\ \__\\ \__\ \_______\ \_______\ \__\\ \__\ \_______\ \_______\ |\_______\/__/ /
\|__| \|__|\|_______|\|_______|\|__| \|__|\|_______|\|_______| \|_______||__|/