En esta entrada la solución a uno de los retos de la categoría 'Forense' de la edición de 2019 de CyberOlympics, competición en modalidad 'on-line', estilo 'Capture the Flag' y formato 'Jeopardy', dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.Este desafío lleva por título 'Broken Pad' y, en mi opinión, presenta un nivel de dificultad alto (★★★★☆).
Enunciado: Han solicitado tu ayuda en un caso forense y han puesto a tu disposición una imagen de disco y de memoria RAM. Sin embargo, parece ser que quien realizase la adquisición olvidó el detalle de que el disco está cifrado con Bitlocker.
Enunciado: Han solicitado tu ayuda en un caso forense y han puesto a tu disposición una imagen de disco y de memoria RAM. Sin embargo, parece ser que quien realizase la adquisición olvidó el detalle de que el disco está cifrado con Bitlocker.
Utiliza tus dotes de investigación para conseguir
acceder a los datos que contiene. Utiliza la herramienta volatility para el
análisis de RAM y cuando tengas la clave, utiliza el comando
"dislocker-fuse" desde tu Kali.
Busca algún recurso que te permita montar y desmontar
unidades con dicha utilidad.
#usethehelp #volatilityprofile #bitlockerrecovery
#bruteforceifincomplete #bashscripting #utf16strings
Recursos asociados al reto: archivo comprimido Broken Pad.tar.
Solución: Extraigo los archivos que se encuentran dentro del que se proporciona como recurso asociado al reto.
Aunque por el enunciado parece evidente que este reto está diseñado para ser resuelto con Kali, yo voy a resolverlo íntegramente en entorno Windows. Mi tocayo y amigo, al que dedico la solución de este reto, él ya sabe quién es, será plenamente consciente de que sólo hago esto por fastidiarle :). Él es un auténtico fan de Linux y le reto a que ponga la solución en ese entorno :).
En primer lugar ejecuto el comando volatility_2.6_win64_standalone -f dump.mem imageinfo para
conocer el tipo de perfil del volcado de memoria:
A continuación, obtengo los procesos en ejecución en
el momento del volcado de memoria, mediante la ejecución del comando volatility_2.6_win64_standalone --profile Win7SP1x64 -f dump.mem pslist:
De todos ellos, me llaman la atención los procesos del Bloc de notas ('notepad'), por lo que, en primer lugar, mediante el comando volatility_2.6_win64_standalone --profile=Win7SP1x64 -f dump.mem -p 264 memdump -D procesos, obtengo el volcado de todos los segmentos de
memoria asociados al proceso de 'notepad' (PID 264):
Abro el fichero de texto generado con el Bloc de notas ('notepad') y buscando "bitlocker" doy con la clave de
recuperación de BitLocker, o al menos parte de ella:Y digo que parte de ella porque una clave de recuperación de BitLocker está
compuesta por 48 dígitos (los caracteres ‘X’ que se indican a continuación
representan los dígitos que me faltan para completar la clave de recuperación):
305459-531696-060808-710622-6XXXX9-665797-244211-319924
Bueno, son sólo 4 dígitos, por lo que la fuerza bruta, tal y como se menciona en el enunciado del reto (#bruteforceifincomplete), es una opción factible para obtenerlos.
Para ello y siguiendo otra de las pistas que se dan en el enunciado (#bashscripting), busco en Internet un script bash que realice esto por mí, si no lo encuentro tendré que programarlo, pero doy con uno que cumple perfectamente lo que se requiere (añado como primera línea el sitio de donde se puede obtener):
# http://www.nogeekleftbehind.com/2018/01/19/mailbag-brute-forcing-a-missing-bitlocker-recovery-key/
# The PowerShell Script tries to determine the recovery key by brute-forcing an unlock
# of a BitLockered drive. This script only works if you’re missing one of the 6-digit
# groups of numbers in the recovery key.
# First group of Recovery Key characters, followed by a hyphen, in quotation marks
# Example: "630564-061798-390588-707146-"
$FirstGroup = "305459-531696-060808-710622-6"
# Last group of characters, preceded, in quotation marks
# Example: "-631521-598389-222321"
$LastGroup = "9-665797-244211-319924"
# Loop through the set of numbers
# Note: You can change the numbers from 1..100000 to a smaller range if you like
ForEach ($MiddleGroup in 0..9999)
{
# Adds Leading Zeros
$Leading = $MiddleGroup.ToString("0000")
# Concatenates the Recovery Key
$Key = "$FirstGroup$Leading$LastGroup"
# Try to unlock the drive
.\manage-bde.exe -unlock H: -recoverypassword $Key >$null
# Get the status of the drive
$Status = Get-BitlockerVolume -MountPoint "H:"
# Write the currently-guessed Recovery Key to Screen
Write-Host $Key
# Check disk space of drive, if capacity equals "0" that means drive is still locked
# If capacity is not equal to "0", that means the drive is now unlocked
If ($Status.CapacityGB -ne "0") {Break}
}
# Output when successful
Write-Host
Write-Host
Write-Host "Drive successfully unlocked with the following Recovery Key:"
Write-Host
Write-Host " 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 " -BackgroundColor "Yellow" -ForegroundColor "Black"
Write-Host $Key -Back "Yellow" -Fore "Black"
Write-Host
Write-Host "(You should write this down immediately!)"
Write-Host
Get-BitLockerVolume -MountPoint "H:"
En este script he puesto las partes conocidas de la 'Recovery Key' (grupos primero y último) y he cambiado la unidad donde voy a montar la imagen (H:) que se proporciona en el reto (drive.dd).
A partir de aquí:
1.- Monto la imagen del reto (drive.dd) en la unidad H:. Para ello utilizo la herramienta 'FTK Imager':
2.- Ejecuto como administrador el entorno de scripting integrado (ISE) de PowerShell, abro el script anterior y lo ejecuto.
Y ya puedo ver que la unidad (H:) se ha desbloqueado y que los cuatro dígitos que faltaban en la 'Recovery Key' son '0190':
Y finalmente, lo único que me queda por hacer es acceder a la unidad H: y ver que me encuentro:Abro el archivo flag.txt y ya puedo ver la solución a este reto:
Comentarios
Publicar un comentario