f500 – Question 4

Home / Wiki / f500 – Question 4

f500 – Question 4

Revision for “f500 – Question 4” created on 12 de janeiro de 2015 às 19:29:12 [Salvamento automático]

Título
f500 - Question 4
Conteúdo
<blockquote>This image contains a pagefile. Can you tell the size of it (in bytes)? Password to open archive:Synergy@123 Flag format: flag{flag} <a href="https://s3.amazonaws.com/hackim-2015/Forensics/Image.rar">Image.rar</a></blockquote> <h1>Solução</h1> O objetivo é bem simples: identificar o tamanho do <a href="http://www.forensicswiki.org/wiki/Pagefile.sys">Pagefile.sys</a> (arquivo de paginação do Windows). O arquivo disponibilizado é um dump de memória, detectado como um ELF: <pre class="lang:sh decode:true">$ file Image Image: ELF 64-bit LSB core file x86-64, version 1 (SYSV)</pre> Esse formato é usado pela ferramenta <a href="http://www.rekall-forensic.com/docs/Tools/pmem.html">WinPMEM</a>, parte do <a href="http://www.rekall-forensic.com/docs/Manual/overview.html">Rekall Framework</a>. <pre class="lang:sh decode:true">$ strings Image | grep pmem pmem winpmem_1.6.2.exe winpmem_1.6.2.exe winpmem_1.6.2.exe winpmem_1.6.2.exe C:\Users\prince\Desktop\winpmem_1.6.2.exe (...)</pre> É possível usar o próprio framework do Rekall para fazer a análise de memória, mas para fins didáticos, vamos usar o <a href="https://github.com/volatilityfoundation/volatility">Volatility</a>. Primeiramente, vamos converter a imagem para o formato RAW com o comando <a href="https://github.com/volatilityfoundation/volatility/wiki/Command%20Reference#imagecopy">imagecopy</a>: <pre class="lang:default decode:true ">$ python vol.py -f Image imagecopy -O image.raw Volatility Foundation Volatility Framework 2.4 Writing data (5.00 MB chunks): |........................................</pre> Com a imagem no formato suportado pelo Volatility, prosseguimos identificando o profile do sistema operacional: <pre class="lang:default decode:true">$ python vol.py -f image.raw imageinfo Volatility Foundation Volatility Framework 2.4 Determining profile based on KDBG search... Suggested Profile(s) : Win7SP0x64, Win7SP1x64, Win2008R2SP0x64, Win2008R2SP1x64 AS Layer1 : AMD64PagedMemory (Kernel AS) AS Layer2 : FileAddressSpace (/home/bernardomr/volatility/image.raw) PAE type : No PAE DTB : 0x187000L KDBG : 0xf80002a590a0 Number of Processors : 1 Image Type (Service Pack) : 1 KPCR for CPU 0 : 0xfffff80002a5ad00L KUSER_SHARED_DATA : 0xfffff78000000000L Image date and time : 2015-01-07 10:27:33 UTC+0000 Image local date and time : 2015-01-07 15:57:33 +0530</pre> O sistema operacional da imagem é um Windows 7 SP1 64bits, com um sistema de arquivos <a href="http://www.forensicswiki.org/wiki/New_Technology_File_System_%28NTFS%29">NTFS</a>. Como nós estamos trabalhando com NTFS e só precisamos do tamanho do Pagefile.sys, basta seguir dois passos simples: <ol> <li>Identificar quantos arquivos de paginação existem e o seu caminho de sistema (baseado na hive de registro <a href="http://msdn.microsoft.com/pt-br/library/windows/desktop/ms724877%28v=vs.85%29.aspx">SYSTEM</a>);</li> <li>Extrair a <a href="http://ntfs.com/ntfs-mft.htm">MFT</a> e fazer um parsing dos atributos do Pagefile.sys.</li> </ol> Para identificar e extrair a hive do registro, vamos usar os comandos <a href="https://github.com/volatilityfoundation/volatility/wiki/Command%20Reference#hivelist">hivelist</a> e <a href="https://github.com/volatilityfoundation/volatility/blob/master/volatility/plugins/registry/dumpregistry.py">dumpregistry</a>: <pre class="lang:default decode:true">$ python vol.py -f image.raw --profile=Win7SP1x64 hivelist | grep SYSTEM 0xfffff8a000024010 0x2d3cd010 \REGISTRY\MACHINE\SYSTEM</pre> <pre class="lang:default decode:true">$ python vol.py -f image.raw --profile=Win7SP1x64 dumpregistry -D registry/ Volatility Foundation Volatility Framework 2.4 ************************************************** Writing out registry: registry.0xfffff8a001743010.NTUSERDAT.reg ************************************************** ************************************************** Writing out registry: registry.0xfffff8a000024010.SYSTEM.reg ************************************************** (...)</pre> Agora com a Hive extraída, conseguimos usar o <a href="http://regripper.wordpress.com/">RegRipper</a> com o plugin <a href="https://github.com/eoyslebo/regripper/blob/master/plugins/pagefile.pl">pagefile</a>: <pre class="lang:default decode:true">$ perl rip.pl -r ../registry.0xfffff8a000024010.SYSTEM.reg -p pagefile Launching pagefile v.20140505 pagefile v.20140505 (System) Get info on pagefile(s) PagingFiles = ?:\pagefile.sys ClearPageFileAtShutdown = 0 PagingFiles = ?:\pagefile.sys </pre> Só temos um arquivo de paginação, localizado no root do sistema operacional. Na segunda parte, precisamos extrair a MBR e fazer parsing dos metadados para identificar o tamanho do arquivo. Vamos começar localizando e extraindo a MBR no dump de memória: <pre class="lang:default decode:true">$ python vol.py -f image.raw --profile=Win7SP1x64 filescan | grep -i mft Volatility Foundation Volatility Framework 2.4 0x7f6bfc10 3 0 RW-rwd \Device\HarddiskVolume1\$MftMirr 0x7fb9d5d0 22 0 RW-rwd \Device\HarddiskVolume1\$Mft 0x7fba5440 33 0 RW-rwd \Device\HarddiskVolume1\$Mft</pre> <pre class="lang:default decode:true">$ python vol.py -f image.raw --profile=Win7SP1x64 dumpfiles -D mft/ -Q 0x7fb9d5d0 Volatility Foundation Volatility Framework 2.4 DataSectionObject 0x7fb9d5d0 None \Device\HarddiskVolume1\$Mft SharedCacheMap 0x7fb9d5d0 None \Device\HarddiskVolume1\$Mft $ python vol.py -f image.raw --profile=Win7SP1x64 dumpfiles -D mft/ -Q 0x7fba5440 Volatility Foundation Volatility Framework 2.4 DataSectionObject 0x7fba5440 None \Device\HarddiskVolume1\$Mft SharedCacheMap 0x7fba5440 None \Device\HarddiskVolume1\$Mft</pre> Esse é um bug conhecido do volatility, ele exibe duas entradas de MFT, mas só uma delas é válida. No nosso caso, o arquivo correto é o "file.None.0xfffffa8001d9d380.vacb", com 59MB. Vamos abri-lo com o <a href="https://github.com/williballenthin/INDXParse">MFTView.py</a>, que faz parte da suíte <a href="http://www.williballenthin.com/forensics/mft/indxparse/">INDXParse</a>: <a href="https://ctf-br.org/wp-content/uploads/2015/01/Screenshot-MFT-File-Viewer.png"><img class="aligncenter wp-image-902 " src="http://ctf-br.org/wp-content/uploads/2015/01/Screenshot-MFT-File-Viewer.png" alt="Screenshot-MFT File Viewer" width="566" height="395" /></a> Por alguma razão, o Pagefile.sys não está listado na MFT extraída. Vamos usar o plugin <a href="https://github.com/volatilityfoundation/volatility/wiki/Command%20Reference#mftparser">mftparser</a> do volatility para ver se encontramos alguma informação adicional: <pre class="lang:default decode:true">$ python vol.py -f image.raw --profile=Win7SP1x64 mftparser --output-file=mft.txt Volatility Foundation Volatility Framework 2.4 Scanning for MFT entries and building directory, this can take a while</pre> <pre class="lang:default decode:true ">$ cat mft.txt | grep -i pagefile.sys -n15 *************************************************************************** MFT entry found at offset 0x2b938c00 Attribute: In Use &amp; File Record Number: 59003 Link count: 1 $STANDARD_INFORMATION Creation Modified MFT Altered Access Date Type ------------------------------ ------------------------------ ------------------------------ -------- 2014-09-23 00:59:08 UTC+0000 2015-01-07 10:17:36 UTC+0000 2015-01-07 10:17:36 UTC+0000 2014-09-23 00:59:08 UTC+0000 Hidden &amp; System &amp; Archive $FILE_NAME Creation Modified MFT Altered Access Date Name/Path ------------------------------ ------------------------------ ------------------------------ -------- 09-23 00:59:08 UTC+0000 2014-09-23 00:59:08 UTC+0000 2014-09-23 00:59:08 UTC+0000 2014-09-23 00:59:08 UTC+0000 pagefile.sys $DATA $OBJECT_ID Object ID: 40000000-0000-0000-00e0-f77f00000000 Birth Volume ID: 00e0f77f-0000-0000-00e0-f77f00000000 Birth Object ID: 337eff07-9011-2500-ffff-ffff82794711 Birth Domain ID: 00000000-0000-0000-0000-000000000000 ***************************************************************************</pre> A MFT extraída não tinha as entradas no índice 59003. Para resolver o problema, vamos abrir a imagem com um editor hexadecimal, navegar até o offset 0x2b938c00 e extrair 1024 bytes contando a partir da string "FILE0" (tamanho da entrada na MFT): <a href="https://ctf-br.org/wp-content/uploads/2015/01/2.png"><img class=" size-medium wp-image-908 aligncenter" src="http://ctf-br.org/wp-content/uploads/2015/01/2-300x150.png" alt="2" width="300" height="150" /></a> <a href="https://ctf-br.org/wp-content/uploads/2015/01/3.png"><img class=" wp-image-909 size-large aligncenter" src="http://ctf-br.org/wp-content/uploads/2015/01/3-1024x372.png" alt="3" width="1024" height="372" /></a> Feito isto, basta fazer o parsing manual na entrada da MFT ou usar uma ferramenta como o <a href="https://github.com/williballenthin/INDXParse">MFTINDX</a> no arquivo extraído anteriormente (mftentry-59003): <pre class="lang:default decode:true">$ MFTINDX.py mftentry-59003 -l -s -m -d # [i] Auto-detected input file type: mft # [i] Assuming file system cluster size 4096 (0x1000) bytes # [i] Assuming volume offset 32256 (0x7e00) bytes # [i] Asked to list entries in INDX records # [i] Note, only resident INDX records can be processed with an MFT input file # [i] If you find an interesting record, use -i to identify the relevant INDX record clusters # [i] Asked to list slack entries in INDX records # [i] Note, this uses a scanning heuristic to identify records. These records may be corrupt or out-of-date. # [i] Asked to list active file entries in the MFT # [i] Asked to list deleted file entries in the MFT WARNING:root:Bad fixup at 0x1fe WARNING:root:Bad fixup at 0x3fe 0|\??\pagefile.sys|59003|0|763|0|2146951168|1411433948|1420625856|1420625856|1411433948 0|\??\pagefile.sys (filename)|59003|0|763|0|2146951168|1411433948|1411433948|1411433948|1411433948</pre> O sétimo campo (2146951168) identifica o tamanho lógico do Pagefile.sys (em bytes). Com isso, basta submeter a flag no formato definido pelo CTF. <img class=" wp-image-911 size-full aligncenter" src="http://ctf-br.org/wp-content/uploads/2015/01/1.png" alt="1" width="519" height="54" /> Agora que já aprendemos sobre MFT, Pagefile.sys e forense de memória, vamos resolver o challenge da maneira (menos interessante) esperada pelos organizadores do CTF: <pre class="lang:default decode:true ">$ strings Image | grep Pagefile | tail Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|PagefileUsage Win32API|Process Status|SYSTEM_PROCESS_INFORMATION|PeakPagefileUsage PagefileOffset: %#llx PagefileSize: %#llx AutomaticManagedPagefile AutomaticManagedPagefile AutomaticManagedPagefile AutomaticManagedPagefile PagefileOffset: 0x7ff7e1f5 PagefileSize: 0x7ff7e000</pre> <pre class="lang:default decode:true">$ printf "%d\n" 0x7ff7e000 2146951168</pre> <h3><a href="https://ctf-br.org/wp-content/uploads/2015/01/4.png"><img class=" wp-image-953 aligncenter" src="https://ctf-br.org/wp-content/uploads/2015/01/4.png" alt="4" width="698" height="271" /></a></h3> <h3>Flag:</h3> flag{2146951168} <h3>Criado por:</h3> TheGoonies
Resumo


OldNewDate CreatedAuthorActions
12 de janeiro de 2015 às 19:29:12 [Salvamento automático] Álisson Bertochi
12 de janeiro de 2015 às 19:27:16 Álisson Bertochi
11 de janeiro de 2015 às 23:56:17 Bernardo Rodrigues
11 de janeiro de 2015 às 23:53:01 Bernardo Rodrigues
11 de janeiro de 2015 às 23:52:09 Bernardo Rodrigues
11 de janeiro de 2015 às 23:51:54 Bernardo Rodrigues
11 de janeiro de 2015 às 20:27:13 Álisson Bertochi
11 de janeiro de 2015 às 20:26:59 Álisson Bertochi
11 de janeiro de 2015 às 20:12:45 Álisson Bertochi
11 de janeiro de 2015 às 19:59:32 Álisson Bertochi
11 de janeiro de 2015 às 19:55:08 Bernardo Rodrigues
11 de janeiro de 2015 às 19:38:33 Bernardo Rodrigues
11 de janeiro de 2015 às 19:37:45 Bernardo Rodrigues
11 de janeiro de 2015 às 19:36:14 Bernardo Rodrigues
11 de janeiro de 2015 às 19:33:08 Bernardo Rodrigues
11 de janeiro de 2015 às 19:32:31 Bernardo Rodrigues
11 de janeiro de 2015 às 19:31:58 Bernardo Rodrigues
11 de janeiro de 2015 às 19:30:39 Bernardo Rodrigues
11 de janeiro de 2015 às 19:27:55 Bernardo Rodrigues
11 de janeiro de 2015 às 19:26:52 Bernardo Rodrigues
11 de janeiro de 2015 às 19:26:21 Bernardo Rodrigues
11 de janeiro de 2015 às 19:25:23 Bernardo Rodrigues
11 de janeiro de 2015 às 19:24:58 Bernardo Rodrigues
11 de janeiro de 2015 às 19:23:57 Bernardo Rodrigues
11 de janeiro de 2015 às 19:23:30 Bernardo Rodrigues
11 de janeiro de 2015 às 19:22:52 Bernardo Rodrigues
11 de janeiro de 2015 às 19:21:02 Bernardo Rodrigues
11 de janeiro de 2015 às 19:20:29 Bernardo Rodrigues
11 de janeiro de 2015 às 19:19:31 Bernardo Rodrigues
11 de janeiro de 2015 às 19:18:35 Bernardo Rodrigues
11 de janeiro de 2015 às 19:13:26 Bernardo Rodrigues
11 de janeiro de 2015 às 18:38:03 Bernardo Rodrigues
11 de janeiro de 2015 às 18:02:55 Bernardo Rodrigues
11 de janeiro de 2015 às 18:01:49 Bernardo Rodrigues
11 de janeiro de 2015 às 18:01:39 Bernardo Rodrigues
11 de janeiro de 2015 às 17:50:59 Bernardo Rodrigues
11 de janeiro de 2015 às 17:50:13 Bernardo Rodrigues
11 de janeiro de 2015 às 17:35:07 Bernardo Rodrigues
11 de janeiro de 2015 às 17:33:37 Bernardo Rodrigues
11 de janeiro de 2015 às 17:13:59 Bernardo Rodrigues
11 de janeiro de 2015 às 16:49:18 Bernardo Rodrigues
11 de janeiro de 2015 às 16:47:02 Bernardo Rodrigues
11 de janeiro de 2015 às 16:39:29 Bernardo Rodrigues
11 de janeiro de 2015 às 16:36:36 Bernardo Rodrigues
Recent Posts