[ECW] - DumpCyber
Sommaire
ECW 2023 - Cet article fait partie d'une série.
Enoncé #
Identification du type de fichier #
On nous donne un fichier nommé task.raw
, au vu de la taille du fichier (1Go) et des résultats des commandes file
et strings
:
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ file task.raw
task.raw: Windows Event Trace Log
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ strings task.raw | head -n100
FACP
VBOX VBOXFACP
ASL a
DSDTS#
!VBOX VBOXBIOS
INTL(
DBG0
DBG0
DHE1
DBG0
DHE2
DBG0
DHE4 [
DBG0
DCHR
HEX_
phDHE1
HEX2
phDHE2
HEX4
phDHE4
SLEN
$S2BF ph`rSLEN`
BUFF
`phBUFF
BUFF
MIN_
SCMP
ph`pS2BF``pS2BFiap
dpSLENhepSLENifpMIN_efg
MTCH
ph`piapSCMP`ab
*DBG_
ph`pS2BF`ap
a`v`p
`v`p
DCHRub
MSWV
A$MSWN
MSWV
MSWVp
MSWVDBG_
_OS:
DBG__OS_DBG_
_OSI
DBG_
_OSI exists
_OSI
Windows 2001
MSWV
_OSI
Windows 2001.1
MSWV
_OSI
Windows 2006
MSWV
_OSI
Windows 2009
MSWV
_OSI
Windows 2012
MSWV
_OSI
Windows 2013
MSWV
_OSI
Windows 2015
MSWV
>_OSI
Windows 2006 SP2
DBG_
Windows 2006 SP2 supported
MSWV
&MTCH_OS_
Microsoft Windows NT
MSWV
9MTCH_OS_
Microsoft WindowsME: Millennium Edition
MSWV
_REV
DBG_
_REV:
HEX4_REV
MSWV
_REV
MSWV
DBG_
ACPI rev mismatch, not a Microsoft OS
MSWVDBG_
Determined MSWV:
HEX4MSWV
MSWV
PICM
!_PIC
DBG_
Pic mode:
HEX4hphPICM[
SYSI
SYSI
IDX0 DAT0 [
On peut facilement supposer qu’il s’agit d’une capture de la mémoire vive d’une VM Windows dans VirtualBox (car on voit la mention “VBOX” et “Windows” dans les headers du fichier)
Pour en être certain je vais utiliser l’outil volatility3
:
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ python3 ~/Desktop/Tools/volatility3/vol.py -f task.raw windows.info
Volatility 3 Framework 2.5.2
Progress: 100.00 PDB scanning finished
Variable Value
Kernel Base 0xf8000260c000
DTB 0x187000
Symbols file:///home/kali/Desktop/Tools/volatility3/volatility3/symbols/windows/ntkrnlmp.pdb/3844DBB920174967BE7AA4A2C20430FA-2.json.xz
Is64Bit True
IsPAE False
layer_name 0 WindowsIntel32e
memory_layer 1 FileLayer
KdDebuggerDataBlock 0xf800027fd0a0
NTBuildLab 7601.17514.amd64fre.win7sp1_rtm.
CSDVersion 1
KdVersionBlock 0xf800027fd068
Major/Minor 15.7601
MachineType 34404
KeNumberProcessors 1
SystemTime 2023-08-17 16:20:26
NtSystemRoot C:\Windows
NtProductType NtProductWinNt
NtMajorVersion 6
NtMinorVersion 1
PE MajorOperatingSystemVersion 6
PE MinorOperatingSystemVersion 1
PE Machine 34404
PE TimeDateStamp Sat Nov 20 09:30:02 2010
La commande windows.info
aurait renvoyée une erreur si le fichier n’était pas une capture de la mémoire vive d’un système Windows (en anglais RAM Dump —> ce qui fait penser au nom du challenge)
Investigation dans la RAM #
Processus lancés #
L’une des premières choses à faire lorsque l’on investigue sur un dump de RAM est de chercher quels sont les processus qui ont été lancés par la machine avant la capture.
Pour cela, on utilise la commande pstree
de volatility3 :
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ python3 ~/Desktop/Tools/volatility3/vol.py -f task.raw windows.pstree
Volatility 3 Framework 2.5.2
Progress: 100.00 PDB scanning finished
PID PPID ImageFileName Offset(V) Threads Handles SessionId Wow64 CreateTime ExitTime
4 0 System 0xfa8000c3d990 86 471 N/A False 2023-08-17 16:13:27.000000 N/A
* 272 4 smss.exe 0xfa8001ddbb30 2 29 N/A False 2023-08-17 16:13:27.000000 N/A
432 412 csrss.exe 0xfa800397d060 9 212 1 False 2023-08-17 16:13:42.000000 N/A
* 568 432 conhost.exe 0xfa8001032060 2 51 1 False 2023-08-17 16:20:19.000000 N/A
524 412 winlogon.exe 0xfa8003dc9740 5 113 1 False 2023-08-17 16:13:42.000000 N/A
1160 1140 explorer.exe 0xfa80041c8510 36 969 1 False 2023-08-17 16:13:47.000000 N/A
* 1280 1160 WinRAR.exe 0xfa8001000b30 6 188 1 False 2023-08-17 16:20:22.000000 N/A
* 2880 1160 notepad.exe 0xfa8000f8fb30 1 61 1 False 2023-08-17 16:20:23.000000 N/A
* 2144 1160 WinRAR.exe 0xfa8001025b30 6 188 1 False 2023-08-17 16:20:21.000000 N/A
* 2624 1160 WinRAR.exe 0xfa8000e2cb30 6 188 1 False 2023-08-17 16:20:25.000000 N/A
* 1320 1160 DumpIt.exe 0xfa8000dc4b30 2 45 1 True 2023-08-17 16:20:19.000000 N/A
* 2792 1160 notepad.exe 0xfa8000fe8b30 1 61 1 False 2023-08-17 16:20:24.000000 N/A
* 1428 1160 VBoxTray.exe 0xfa8004480b30 13 137 1 False 2023-08-17 16:13:48.000000 N/A
On trouve plusieurs processus :
smss.exe
/csrss.exe
/conhost.exe
/winlogon.exe
sont des processus utilisés pour le démarrage de Windows (gestion des sessions, interface utilisateur …)explorer.exe
est le processus pour la navigation des applications fichiersWinrar.exe
est un programme pour compresser et décompresser des archives (.zip / .7zip / .rar …)notepad.exe
est le programme Bloc-notesDumpIt.exe
est le programme qui a permis d’extraire la RAM de cette machine (très probablement utilisé par le créateur du challenge pour générer le fichier task.raw )VBoxTray.exe
est un fichier exécutable relatif au bon fonctionnement de l’application VirtualBox
On peut donc conclure que l’utilisateur s’est connecté à la machine Windows, puis à ouvert l’explorateur de fichier (explorer.exe
) avant d’exécuter plusieurs fois Winrar.exe
et notepad.exe
, ces 2 derniers processus sont intéressants !
Commandes exécutées #
Pour avoir plus d’informations sur ce qu’ont fait ces processus on va chercher les commandes exécutées sur la machine, pour cela on utilise la commande cmdline
de volatility3 :
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ python3 ~/Desktop/Tools/volatility3/vol.py -f task.raw windows.cmdline
Volatility 3 Framework 2.5.2
Progress: 100.00 PDB scanning finished
PID Process Args
4 System Required memory at 0x20 is not valid (process exited?)
272 smss.exe \SystemRoot\System32\smss.exe
368 csrss.exe %SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,768 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16
420 wininit.exe wininit.exe
432 csrss.exe %SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,768 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16
496 services.exe C:\Windows\system32\services.exe
504 lsass.exe C:\Windows\system32\lsass.exe
512 lsm.exe C:\Windows\system32\lsm.exe
524 winlogon.exe winlogon.exe
644 svchost.exe C:\Windows\system32\svchost.exe -k DcomLaunch
708 VBoxService.ex C:\Windows\System32\VBoxService.exe
764 svchost.exe C:\Windows\system32\svchost.exe -k RPCSS
816 svchost.exe C:\Windows\System32\svchost.exe -k LocalServiceNetworkRestricted
924 svchost.exe C:\Windows\System32\svchost.exe -k LocalSystemNetworkRestricted
972 svchost.exe C:\Windows\system32\svchost.exe -k netsvcs
360 svchost.exe C:\Windows\system32\svchost.exe -k LocalService
1020 svchost.exe C:\Windows\system32\svchost.exe -k NetworkService
1148 dwm.exe "C:\Windows\system32\Dwm.exe"
1160 explorer.exe C:\Windows\Explorer.EXE
1232 spoolsv.exe C:\Windows\System32\spoolsv.exe
1264 taskhost.exe "taskhost.exe"
1288 svchost.exe C:\Windows\system32\svchost.exe -k LocalServiceNoNetwork
1428 VBoxTray.exe "C:\Windows\System32\VBoxTray.exe"
944 SearchIndexer. C:\Windows\system32\SearchIndexer.exe /Embedding
1948 WmiPrvSE.exe C:\Windows\system32\wbem\wmiprvse.exe
1364 svchost.exe C:\Windows\system32\svchost.exe -k LocalServiceAndNoImpersonation
1984 sppsvc.exe C:\Windows\system32\sppsvc.exe
1412 svchost.exe C:\Windows\System32\svchost.exe -k secsvcs
1916 audiodg.exe C:\Windows\system32\AUDIODG.EXE 0x178
376 SearchProtocol "C:\Windows\system32\SearchProtocolHost.exe" Global\UsGthrFltPipeMssGthrPipe3_ Global\UsGthrCtrlFltPipeMssGthrPipe3 1 -2147483646 "Software\Microsoft\Windows Search" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT; MS Search 4.0 Robot)" "C:\ProgramData\Microsoft\Search\Data\Temp\usgthrsvc" "DownLevelDaemon"
2496 SearchFilterHo "C:\Windows\system32\SearchFilterHost.exe" 0 504 508 516 65536 512
1320 DumpIt.exe "\\VBoxSvr\windows-windows\DumpIt.exe"
568 conhost.exe \??\C:\Windows\system32\conhost.exe
2144 WinRAR.exe "C:\Program Files\WinRAR\WinRAR.exe" "C:\Users\vboxuser\Desktop\file.txt.rar"
1280 WinRAR.exe "C:\Program Files\WinRAR\WinRAR.exe" "C:\Users\vboxuser\Desktop\generator.rar"
2880 notepad.exe "C:\Windows\system32\NOTEPAD.EXE" C:\Users\vboxuser\Desktop\deesktop.ini
2792 notepad.exe "C:\Windows\system32\NOTEPAD.EXE" C:\Users\vboxuser\Desktop\dessktop.ini
2624 WinRAR.exe "C:\Program Files\WinRAR\WinRAR.exe" "C:\Users\vboxuser\Desktop\file.rar"
Les dernières lignes sont très intéressantes, en effet on peut voir 4 fichiers qui ont été utilisés par les processus Winrar.exe
et notepad.exe
:
- file.txt.rar
- generator.rar
- deesktop.ini
- dessktop.ini
(⚠️ attention au nommage ce sont bien 2 fichiers différents)
Extraction des fichiers #
On aimerait récupérer ces fichiers afin de les analyser, pour cela on va d’abord devoir récupérer leurs adresses physique car volatility3 ne peut pas extraire de fichiers si on ne précise pas où ils se trouvent.
On utilise alors la commande filescan
:
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ python3 ~/Desktop/Tools/volatility3/vol.py -f task.raw windows.filescan | grep -E "file.txt.rar|generator.rar|deesktop.ini|dessktop.ini"
0x3fab94a0 \Users\vboxuser\Desktop\generator.rar 216
0x3fabd070 \Users\vboxuser\Desktop\file.txt.rar 216
0x3fcd2430 \Users\vboxuser\Desktop\dessktop.ini 216
0x3fd737b0 \Users\vboxuser\Desktop\deesktop.ini 216
On peut maintenant extraire les fichiers avec la commande dumpfiles
:
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ python3 ~/Desktop/Tools/volatility3/vol.py -f task.raw windows.dumpfiles --physaddr 0x3fab94a0
Volatility 3 Framework 2.5.2
Progress: 100.00 PDB scanning finished
Cache FileObject FileName Result
DataSectionObject 0x3fab94a0 generator.rar file.0x3fab94a0.0xfa8003fc9160.DataSectionObject.generator.rar.dat
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ python3 ~/Desktop/Tools/volatility3/vol.py -f task.raw windows.dumpfiles --physaddr 0x3fabd070
Volatility 3 Framework 2.5.2
Progress: 100.00 PDB scanning finished
Cache FileObject FileName Result
DataSectionObject 0x3fabd070 file.txt.rar file.0x3fabd070.0xfa800487b860.DataSectionObject.file.txt.rar.dat
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ python3 ~/Desktop/Tools/volatility3/vol.py -f task.raw windows.dumpfiles --physaddr 0x3fcd2430
Volatility 3 Framework 2.5.2
Progress: 100.00 PDB scanning finished
Cache FileObject FileName Result
DataSectionObject 0x3fcd2430 dessktop.ini file.0x3fcd2430.0xfa8000c7d9e0.DataSectionObject.dessktop.ini.dat
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ python3 ~/Desktop/Tools/volatility3/vol.py -f task.raw windows.dumpfiles --physaddr 0x3fd737b0
Volatility 3 Framework 2.5.2
Progress: 100.00 PDB scanning finished
Cache FileObject FileName Result
DataSectionObject 0x3fd737b0 deesktop.ini file.0x3fd737b0.0xfa8003e37b10.DataSectionObject.deesktop.ini.dat
On obtient des archives .dat
, j’extrais les fichiers et voici le résultat :
Analyse des fichiers #
Les fichiers en .ini
et .txt.enc
ne sont pas interprétables, on va donc devoir s’intéresser au fichier generator.exe
, comme ce fichier est un exécutable déjà compilé il va falloir le reverse.
Pour cela j’utilise IDA, je ne vais pas rentrer dans les détails du reverse ici car c’est un challenge de forensics, voici ce que l’on obtient :
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[16]; // [esp+10h] [ebp-20h] BYREF
char Buffer[16]; // [esp+20h] [ebp-10h] BYREF
__main();
generate_key_iv(Buffer, v4);
write_key_iv_to_file(Buffer, v4, "dessktop.ini", "deesktop.ini");
puts("Key and IV written to files.");
return 0;
}
int __cdecl write_key_iv_to_file(void *Buffer, void *a2, char *FileName, char *a4)
{
FILE *v5; // [esp+18h] [ebp-10h]
FILE *Stream; // [esp+1Ch] [ebp-Ch]
Stream = fopen(FileName, "wb");
if ( !Stream )
{
puts("Failed to open key file for writing.");
exit(1);
}
v5 = fopen(a4, "wb");
if ( !v5 )
{
puts("Failed to open IV file for writing.");
exit(1);
}
fwrite(Buffer, 1u, 0x10u, Stream);
fwrite(a2, 1u, 0x10u, v5);
fclose(Stream);
return fclose(v5);
}
On voit que le fichier generator.exe
écrit une clé dans dessktop.ini
et un IV dans deesktop.ini
L’algorithme de chiffrement utilisant une clé et un IV est AES !
Il suffit donc d’extraire la clé contenu dans le fichier dessktop.ini
et l’IV dans le fichier deesktop.ini
pour déchiffrer le contenu du fichier file.txt.rar
via l’algorithme AES
Flag #
On a désormais tout ce qu’il nous faut pour retrouver le flag. On va extraire les données des différents fichiers en hexadécimal grâce à la commande xxd
:
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ xxd -p deesktop.ini
e609874a80d1b27efd46cc0a131a4dcd
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ xxd -p dessktop.ini
1b54ee420bd5b8396e15fc9fe01055f8
┌──(kali㉿kali)-[~/Desktop/CTF/ECW/DumpCyber]
└─$ xxd -p file.txt.enc
e609874a80d1b27efd46cc0a131a4dcd01a866f5e31a99ae56ed91d8c517
5c8b88a0d8d8c6412889bac60d5999cf61517bfdbf7f9fc6e2fa530e4263
bd92af6a
Grâce à l’outil CyberChef on peut retrouver le flag en précisant les bons paramètres :
- Algorithme : AES Decrypt
- Key : 1b54ee420bd5b8396e15fc9fe01055f8 (format hexadécimal)
- IV : e609874a80d1b27efd46cc0a131a4dcd (format hexadécimal)
- Mode : CBC/No Padding
- Input : Hex (car les valeurs de la clé et de l’IV sont en hexadécimal)
- Output : Raw (pour obtenir le résultat en texte brut)
đźš© Flag : flag{82a30fadcfc07d634fbed1bffe4a2aa1}