Archive

Archive for the ‘Forense’ Category

Volatility Installer

May 3rd, 2011 No comments

Como ya sabréis, Volatility es un producto de código abierto de “Volatile Systems” escrito en Python orientado al análisis forense de memoria RAM en entornos Windows.

Una vez instalado es muy potente y sencillo de usar, pero tienes que dedicarle un “ratito” a la instalación… Con el objetivo de hacer más sencillo el proceso de instalación ha nacido un proyecto en Google Code de la mano de Juan Garrido llamado Volatility Installer, en el que he tenido la suerte de participar en la versión UNIX del script.

El proceso de instalación sería el siguiente:

[[email protected] ~]$ uname -a
FreeBSD hellforce1.hell.lan 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Fri Feb 18 02:24:46 UTC 2011     [email protected]:/usr/obj/usr/src/sys/GENERIC  i386
[[email protected] ~]$ wget http://volatility-installer.googlecode.com/files/install.volatility.tar.gz
--2011-05-03 01:42:29--  http://volatility-installer.googlecode.com/files/install.volatility.tar.gz
Resolviendo volatility-installer.googlecode.com (volatility-installer.googlecode.com)... 209.85.147.82
Connecting to volatility-installer.googlecode.com (volatility-installer.googlecode.com)|209.85.147.82|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 8935 (8,7K) [application/x-gzip]
Saving to: `install.volatility.tar.gz'

100%[===================================================================================================================================================================================================>] 8.935       --.-K/s   in 0s      

2011-05-03 01:42:29 (54,8 MB/s) - `install.volatility.tar.gz' saved [8935/8935]

[[email protected] ~]$ sha1 install.volatility.tar.gz | grep 51f4505f2ed2d53a724cfe4761fa7d45818fbcc4
SHA1 (install.volatility.tar.gz) = 51f4505f2ed2d53a724cfe4761fa7d45818fbcc4
[[email protected] ~]$ tar xf install.volatility.tar.gz
[[email protected] ~]$ cd install.volatility
[[email protected] ~/install.volatility]$ ./volatility.installer.sh 

##################################################
#     Volatility Installer UNIX Script v0.3b     #
# http://code.google.com/p/volatility-installer/ #
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
# Project leader: Juan Garrido (aka Silverhack)  #
# Script written by: Chema Garcia (aka sch3m4)   #
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
# Contact:                                       #
#           http://safetybits.net                    #
#           [email protected] #
#           [email protected] #
##################################################

Usage: ./volatility.installer.sh <options>

+ Options:
 -v -------> Install Volatility
 -p -------> Install plugins
 -r -------> Install PyCrypto
 -y -------> Install libyara
 -t -------> Install yara-python
 -d -------> Install Distorm
 -s -------> Install libdasm
 -f -------> Install pefile
 -A -------> * Install all above

[[email protected] ~/install.volatility]$ ./volatility-installer -A

##################################################
#     Volatility Installer UNIX Script v0.3b     #
# http://code.google.com/p/volatility-installer/ #
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
# Project leader: Juan Garrido (aka Silverhack)  #
# Script written by: Chema Garcia (aka sch3m4)   #
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
# Contact:                                       #
#           http://safetybits.net                    #
#           [email protected] #
#           [email protected] #
##################################################

[i] Installing: Volatility
 + Url: https://www.volatilesystems.com/volatility/1.3/Volatility-1.3_Beta.tar.gz
 + File: volatility.tar.gz
 + Folder: Volatility-1.3_Beta
 + MD5: 77d05a5e93ea77425379a306024b739b
 + SHA256: 7d4dd429a488671c559c6f5de0d3fae6d3d1f9eb67c19e399495a1b6aa31d392\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Extracting Volatility...
 OK
 - Installing...
Password:
 OK
 - Cleaning...
 OK

[i] Installing: PyCrypto
 + Url: http://www.amk.ca/files/python/crypto/pycrypto-2.0.1.tar.gz
 + File: pycrypto-2.0.1.tar.gz
 + Folder: pycrypto-2.0.1
 + MD5: 4d5674f3898a573691ffb335e8d749cd
 + SHA256: b08d4ed54c9403c77778a3803e53a4f33f359b42d94f6f3e14abb1bf4941e6ea\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Extracting PyCrypto...
 OK
 - Installing...
 OK
 - Cleaning...
 OK

[i] Installing: LibDASM
 + Url: http://www.klake.org/~jt/misc/libdasm-1.5.tar.gz
 + File: libdasm-1.5.tar.gz
 + Folder: libdasm-1.5
 + MD5: f166d83ba73ae7f7f260366ba7155787
 + SHA256: 34d6c17dbb318bf2e21c6a3ae7dcc53d918ce247f1bd422b123d5e41a730a676\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Extracting LibDASM...
 OK
 - Installing...
 OK
 - Cleaning...
 OK

[i] Installing: Distorm3
 + Url: http://distorm.googlecode.com/files/distorm3.zip
 + File: distorm3.zip
 + Folder: distorm3
 + MD5: eb80e8901d4c52965b0de9ea5b7dca91
 + SHA256: 4fba8606caab377d10646953a205507a1faa184047f869cc13e62b1ebf4a1b0e\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Extracting Distorm3...
 OK
 - Installing...
 OK
 - Cleaning...
 OK

[i] Installing: Yara
 + Url: http://yara-project.googlecode.com/files/yara-1.4.tar.gz
 + File: yara-1.4.tar.gz
 + Folder: yara-1.4
 + MD5: ecc744a67482dc9d717936ccd69dc39f
 + SHA256: c040cc139030e49f736200d3a951922d417fc660cf4c81484ff1ca1a06f83952\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Extracting Yara...
 OK
 - Installing...
 OK
 - Cleaning...
 OK

[i] Installing: Yara-Python
 + Url: http://yara-project.googlecode.com/files/yara-python-1.4a.tar.gz
 + File: yara-python-1.4a.tar.gz
 + Folder: yara-python-1.4a
 + MD5: 0754dcc834c7f69ed0382d895d9a10cc
 + SHA256: 0221b6b5178edc99584fb0e082ebbc454e3e33701112f7041349e547a8aabc66\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Extracting Yara-Python...
 OK
 - Installing...
 OK
 - Cleaning...
 OK

[i] Installing: PEFile
 + Url: http://pefile.googlecode.com/files/pefile-1.2.10-102.tar.gz
 + File: pefile-1.2.10-102.tar.gz
 + Folder: pefile-1.2.10-102
 + MD5: 0047429fbd7b8bad8f5c583291b598f9
 + SHA256: 29d8b6fb4d30b1b45b801526591e8f23fb539cc059ed79d5aa34be93a9734dfe\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Extracting PEFile...
 OK
 - Installing...
 OK
 - Cleaning...
 OK

[i] Installing plugin: DriverIRP
 + Url: http://mhl-malware-scripts.googlecode.com/files/driverirp.py
 + File: driverirp.py
 + Folder: memory_plugins
 + MD5: 0696eefa51362b71606337b8d04d886f
 + SHA256: 7edf7373260462b36ac985837f28c27623e229291d7a1550334fcb2f667fc0fc\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing DriverIRP...
 OK
 - Cleaning...
 OK

[i] Installing plugin: GetSIDs
 + Url: http://www.cc.gatech.edu/~brendan/volatility/dl/getsids.py
 + File: getsids.py
 + Folder: memory_plugins
 + MD5: 49353f0a48a1f9b2411439fb8a0973dc
 + SHA256: a403bfbb98d49d9a73cc0f9928994f5ed3bcbf9ef249627e1bb0b86f2c24e41b\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing GetSIDs...
 OK
 - Cleaning...
 OK

[i] Installing plugin: SSDT
 + Url: http://www.cc.gatech.edu/~brendan/volatility/dl/ssdt.py
 + File: ssdt.py
 + Folder: memory_plugins
 + MD5: c820f40174bd42e77608d0415ed021c6
 + SHA256: 5760e5fba87b5fb536c0ad80ec6621bd43fa28ded8b75055380a6ac83db7f187\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing SSDT...
 OK
 - Cleaning...
 OK

[i] Installing plugin: ModDump
 + Url: http://www.cc.gatech.edu/~brendan/volatility/dl/moddump.py
 + File: moddump.py
 + Folder: memory_plugins
 + MD5: a6a98d106793bf674d8276a7ca127f4c
 + SHA256: 93771efe555c99d720371a5f6556aa9c734a49d514e782e0d3ceaf097019e522\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing ModDump...
 OK
 - Cleaning...
 OK

[i] Installing plugin: VolShell
 + Url: http://www.cc.gatech.edu/~brendan/volatility/dl/volshell.py
 + File: volshell.py
 + Folder: memory_plugins
 + MD5: 0012136fdef54c479eec44b7f19b5bcc
 + SHA256: e0b0b23eb00bf25b160399916004afe34da1c8ae3ebb870e901d09147f310962\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing VolShell...
 OK
 - Cleaning...
 OK

[i] Installing plugin: MalFind2
 + Url: http://mhl-malware-scripts.googlecode.com/files/malfind2.py
 + File: malfind2.py
 + Folder: memory_plugins
 + MD5: b9212ae50a800ffabfa5889bb7e3766b
 + SHA256: 8ad794435ad7a3cda7e3ec12525c781b14f5f09d6e37ffc39e5923ac07c304ec\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing MalFind2...
 OK
 - Cleaning...
 OK

[i] Installing plugin: CryptoScan
 + Url: http://jessekornblum.com/tools/volatility/cryptoscan.py
 + File: cryptoscan.py
 + Folder: memory_plugins
 + MD5: 523f67f6c19fa5637c35accef492a04b
 + SHA256: c6d97346eefe7c27cda73ed711ea3225d509c5162ae346f8fa66c6159898c9c6\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing CryptoScan...
 OK
 - Cleaning...
 OK

[i] Installing plugin: Suspicious
 + Url: http://jessekornblum.com/tools/volatility/suspicious.py
 + File: suspicious.py
 + Folder: memory_plugins
 + MD5: d751b34f2ef1713a5f599ea7fae20c1b
 + SHA256: 7941afa01e6de182c8e7452a23908be86702fa9b691dea0d56ff0a6d2bcdda43\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing Suspicious...
 OK
 - Cleaning...
 OK

[i] Installing plugin: PsTree
 + Url: http://www.pyflag.net/volatility/pstree.py
 + File: pstree.py
 + Folder: memory_plugins
 + MD5: cabf40d8fc1fc52e1a89930dec1ccec9
 + SHA256: ef2f719a3213c6e637735ad9a4a6bd04e922fa177d7c8651f4d8bd75c8cfa2c9\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing PsTree...
 OK
 - Cleaning...
 OK

[i] Installing plugin: KeyboardBuffer
 + Url: http://computer.forensikblog.de/files/volatility_plugins/keyboardbuffer.py
 + File: keyboardbuffer.py
 + Folder: memory_plugins
 + MD5: fda30c99dc701dce7a039d3de19307a3
 + SHA256: 396e72ddbda2846b301fb97b5ccf06bd250bf81a7327e514e4821ca637d6e088\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing KeyboardBuffer...
 OK
 - Cleaning...
 OK

[i] Installing plugin: OrphanThreads
 + Url: http://mhl-malware-scripts.googlecode.com/files/orphan_threads.py
 + File: orphan_threads.py
 + Folder: memory_plugins
 + MD5: 82ad2b8b5dde35f68f9ac3e9687655d6
 + SHA256: 009239a031cd53a82378a815ce81803ad3b7d4e8bd6257f34e50a5833cc0bda9\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing OrphanThreads...
 OK
 - Cleaning...
 OK

[i] Installing plugin: UsermodeHooks
 + Url: http://mhl-malware-scripts.googlecode.com/files/usermode_hooks2.py
 + File: usermode_hooks2.py
 + Folder: memory_plugins
 + MD5: 253a6885e52e39002c770e77916e7e09
 + SHA256: fae684cb49922dbf0c7920c4195876805ed591887e1b34dd590472a2a5a55de1\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing UsermodeHooks...
 OK
 - Cleaning...
 OK

[i] Installing plugin: KernelHooks
 + Url: http://mhl-malware-scripts.googlecode.com/files/kernel_hooks.py
 + File: kernel_hooks.py
 + Folder: memory_plugins
 + MD5: 01dcde71e2878b8c04cace8acd4bd06c
 + SHA256: 5911d54bb2e4802feb9cc5915dbabde395a89cbf1fd0217626112646da04e055\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing KernelHooks...
 OK
 - Cleaning...
 OK

[i] Installing plugin: IDT
 + Url: http://mhl-malware-scripts.googlecode.com/files/idt.py
 + File: idt.py
 + Folder: memory_plugins
 + MD5: 1890882ec273bf0036e9fb1aa4ea17e5
 + SHA256: 4ea358826d4f284f8f669a7bbddf4a6048c0fe3e83f98f973525cd1172d28b35\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing IDT...
 OK
 - Cleaning...
 OK

[i] Installing plugin: Lists
 + Url: http://www.cc.gatech.edu/~brendan/volatility/dl/lists.py
 + File: lists.py
 + Folder: forensics/win32
 + MD5: 7d7e7cd7b9d8f12773c057b402f79650
 + SHA256: 793b9a77a6b04c941c870cb4d22f3d8a9447a0431aaa954da04b4fcdee5dc140\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing Lists...
 OK
 - Cleaning...
 OK

[i] Installing plugin: ThreadQueues
 + Url: http://www.cc.gatech.edu/~brendan/volatility/dl/threadqueues.py
 + File: threadqueues.py
 + Folder: forensics/win32
 + MD5: 1dc40cd5987dfd55f4146721d978416f
 + SHA256: 4e370bfb29f673373ea1cc36991b42457894d12a1eb8df720e8ef040484d9d0e\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing ThreadQueues...
 OK
 - Cleaning...
 OK

[i] Installing plugin: VolRIP
 + Url: http://www.cc.gatech.edu/~brendan/volatility/dl/volrip-0.1.zip
 + File: volrip-0.1.zip
 + Folder: ./
 + MD5: 96b15dc1bcd1bd1f2782d38645dc5af9
 + SHA256: dc1b6bd109e813c3bd831c53955ae1401e181221ce3ffcfacc4fffb3b964b820\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing VolRIP...
 OK
 - Cleaning...
 OK

[i] Installing plugin: VolREG
 + Url: http://www.cc.gatech.edu/~brendan/volatility/dl/volreg-0.6.zip
 + File: volreg-0.6.zip
 + Folder: ./
 + MD5: 75d5e4f686082799d961641ebcd17bbd
 + SHA256: b361f0d516baf5e60c1048b5416a899365ac1824631390a962d5d258c10585b4\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing VolREG...
 OK
 - Cleaning...
 OK

[i] Installing plugin: FileObjScan
 + Url: http://computer.forensikblog.de/files/volatility_plugins/volatility_fileobjscan-current.zip
 + File: volatility_fileobjscan-current.zip
 + Folder: ./
 + MD5: 11a0a12f5d6ed31872daa6660446eb1c
 + SHA256: d8963851b4286b7fda5e9902ab176c49e1afb107dac8629046db6dfaedfc3653\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing FileObjScan...
 OK
 - Cleaning...
 OK

[i] Installing plugin: SymLinkScan
 + Url: http://computer.forensikblog.de/files/volatility_plugins/volatility_symlinkobjscan-current.zip
 + File: volatility_symlinkobjscan-current.zip
 + Folder: ./
 + MD5: e62dac146336e6f79ca89ca07061730c
 + SHA256: 7215b1977d7a6e9bfc44056c1becf41a7dc230a8ef14df5d260026fb5e600518\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing SymLinkScan...
 OK
 - Cleaning...
 OK

[i] Installing plugin: MutantScan
 + Url: http://computer.forensikblog.de/files/volatility_plugins/volatility_mutantscan-current.zip
 + File: volatility_mutantscan-current.zip
 + Folder: ./
 + MD5: c0571785cdea36f40416594b6e6134e4
 + SHA256: 080a8aa43cbd445c716c1b46a9c97c326d92bf8c3953eadea65cd9b7e677285e\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing MutantScan...
 OK
 - Cleaning...
 OK

[i] Installing plugin: ObjTypeScan
 + Url: http://computer.forensikblog.de/files/volatility_plugins/volatility_objtypescan-current.zip
 + File: volatility_objtypescan-current.zip
 + Folder: ./
 + MD5: 6ae2673cdaf7a0f2249db6f9dcc4b0a3
 + SHA256: 00b5b98bc2d6449a2106d42f208176360488d0da2b203c14c4c6ad66ef3e46a0\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing ObjTypeScan...
 OK
 - Cleaning...
 OK

[i] Installing plugin: DriverScan
 + Url: http://computer.forensikblog.de/files/volatility_plugins/volatility_driverscan-current.zip
 + File: volatility_driverscan-current.zip
 + Folder: ./
 + MD5: 02da6e69c983a9c2d5f5334da60f9d68
 + SHA256: 4384bbf66af9169986bacca75fbaf75d15c7006f4250b187f9b7ef94ebcad095\n

 - Downloading...
 OK
 - Verifing checksums...
 OK
 - Installing DriverScan...
 OK
 - Cleaning...
 OK

[+] Finished! You can check installation logs in /usr/home/sch3m4/install.volatility/logs_martes.05-03-11.01-40-33
[[email protected] ~/install.volatility]$

Hecho esto se habrá creado el script /usr/bin/volatility con el que podemos invocar a volatility desde cualquier directorio:

[[email protected] /tmp]$ volatility 

 Volatile Systems Volatility Framework v1.3
 Copyright (C) 2007,2008 Volatile Systems
 Copyright (C) 2007 Komoku, Inc.
 This is free software; see the source for copying conditions.
 There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 usage: volatility cmd [cmd_opts]

 Run command cmd with options cmd_opts
 For help on a specific command, run 'volatility cmd --help'

 Supported Internel Commands:
 connections        Print list of open connections
 connscan           Scan for connection objects
 connscan2          Scan for connection objects (New)
 datetime           Get date/time information for image
 dlllist            Print list of loaded dlls for each process
 dmp2raw            Convert a crash dump to a raw dump
 dmpchk             Dump crash dump information
 files              Print list of open files for each process
 hibinfo            Convert hibernation file to linear raw image
 ident              Identify image properties
 memdmp             Dump the addressable memory for a process
 memmap             Print the memory map
 modscan            Scan for modules
 modscan2           Scan for module objects (New)
 modules            Print list of loaded modules
 procdump           Dump a process to an executable sample
 pslist             Print list of running processes
 psscan             Scan for EPROCESS objects
 psscan2            Scan for process objects (New)
 raw2dmp            Convert a raw dump to a crash dump
 regobjkeys         Print list of open regkeys for each process
 sockets            Print list of open sockets
 sockscan           Scan for socket objects
 sockscan2          Scan for socket objects (New)
 strings            Match physical offsets to virtual addresses (may take a while, VERY verbose)
 thrdscan           Scan for ETHREAD objects
 thrdscan2          Scan for thread objects (New)
 vaddump            Dump the Vad sections to files
 vadinfo            Dump the VAD info
 vadwalk            Walk the vad tree

 Supported Plugin Commands:
 cachedump          Dump (decrypted) domain hashes from the registry
 cryptoscan         Find TrueCrypt passphrases
 driverirp          Print driver IRP function addresses
 driverscan         Scan for driver objects
 fileobjscan        Scan for file objects
 getsids            Print the SIDs owning each process
 hashdump           Dump (decrypted) LM and NT hashes from the registry
 hivedump           Dump registry hives to CSV
 hivelist           Print list of registry hives
 hivescan           Scan for _CMHIVE objects (registry hives)
 idt                Print Interrupt Descriptor Table (IDT) entries
 kernel_hooks       Locate IAT/EAT/in-line API hooks in kernel space
 keyboardbuffer     Print BIOS keyboard buffer
 lsadump            Dump (decrypted) LSA secrets from the registry
 malfind2           Detect hidden and injected code
 moddump            Dump loaded kernel modules to disk.
 mutantscan         Scan for mutant (mutex) objects
 objtypescan        Scan for object type objects
 orphan_threads     Find kernel threads that don't map back to loaded modules
 printkey           Print a registry key, and its subkeys and values
 pstree            
 ssdt               Display SSDT entries
 suspicious         Find suspicious command lines and display them
 symlinkobjscan     Scan for symbolic link objects
 usermode_hooks     Locate IAT/EAT/in-line API hooks in user space
 volshell           Shell in the memory image

 Example: volatility pslist -f /path/to/my/file
[[email protected] /tmp]$

El archivo res.conf es el fichero del que lee los datos de las dependencias y plugins el script de instalación, por lo que para cambiar una versión por otra y/o agregar o eliminar plugins basta con editar este archivo.

Más información en el blog de Juan Garrido.

Solución al reto forense del SANS Institute – Puzzle #2

December 11th, 2009 6 comments

He leído hace poco una entrada en el blog de Jose Selvi que el SANS Institute propuso otro reto de análisis forense de red del que no había tenido constancia (es lo que tiene estar tanto tiempo “offline”), y es que esta gente proponen con regularidad una serie de retos al público para que sean resueltos y ofrecen premios a las soluciones más elegantes, claro que lo que ellos consideran elegante es crear herramientas para resolver sus retos, que posteriormente ofreceran a los alumnos de los trainings que realizan en Orlando y Baltimore (¿solo a mí me suena esto de más de uno?).

http://forensicscontest.com/2009/09/25/puzzle-1-solution-anns-bad-aim

What we considered “elegant” was the construction of some automated process for solving the puzzle which was easy to use, easy to understand, very portable, and would easily be able to scale to much larger and more difficult problems.

Los trainings de análisis forense de red del SANS Institute y más concretamente el SEC 558 y el SEC 560 cuestan respectivamente $3,845 y $4,295 así que poquitas ganas me dan de hacerles las herramientas y mucho menos enviárselas, pero ya sabemos cómo es esto de la formación, ¿verdad?.

Después de esta pequeña reflexión vamos a ver cómo podemos solucionar el reto.

La url del mismo es http://forensicscontest.com/2009/10/10/puzzle-2-ann-skips-bail donde nos dicen:

After being released on bail, Ann Dercover disappears! Fortunately, investigators were carefully monitoring her network activity before she skipped town.

“We believe Ann may have communicated with her secret lover, Mr. X, before she left,” says the police chief. “The packet capture may contain clues to her whereabouts.”

You are the forensic investigator. Your mission is to figure out what Ann emailed, where she went, and recover evidence including:

1. What is Ann’s email address?
2. What is Ann’s email password?
3. What is Ann’s secret lover’s email address?
4. What two items did Ann tell her secret lover to bring?
5. What is the NAME of the attachment Ann sent to her secret lover?
6. What is the MD5sum of the attachment Ann sent to her secret lover?
7. In what CITY and COUNTRY is their rendez-vous point?
8. What is the MD5sum of the image embedded in the document?

Please use the Official Submission form to submit your answers. Prize TBD. Prize will be a Lenovo IdeaPad S10-2 – just like the free netbooks Sec558 students will get in Orlando.

Here is your evidence file:

http://forensicscontest.com/contest02/evidence02.pcap
MD5 (evidence02.pcap) = cfac149a49175ac8e89d5b5b5d69bad3

Así que empezamos, nos descargamos el archivo de captura, comprobaremos la firma MD5 y corremos p0f con algunas que otras herramientas y expresiónes regulares para filtrar la salida y ver qué hosts mantienen conexiones TCP/IP en la captura:

$ p0f -s evidence02.pcap 2>/dev/null | egrep “^[0-9]{1,3}” | tr -s ‘:’ ‘-’ | awk -F\- ‘{print $1,$3}’ | sort -u

192.168.1.159 Windows XP SP1+, 2000 SP3

Y vemos actividad de la IP 192.168.1.159, así que vamos a abrir el archivo de captura con Wireshark y aplicamos el filtro: ip.addr == 192.168.1.159

Nos vamos al paquete nº 45 que según nos dice Wireshark usa el protocolo “BROWSER” (anuncio smb), y obtenemos algunos datos del apartado “Microsoft Windows Browser Protocol” dentro de la cabecera NetBIOS, como son:


  • Host Name
  • OS Major Version
  • OS Minor Version
  • Host Comment

Con los datos de “OS Major Version” y “OS Minor Version”, nos vamos a http://msdn.microsoft.com/en-us/library/cc246960%28PROT.10%29.aspx y vemos que al tratarse de Major = 5 y Minor = 1, Ann usa un Windows XP (cosa que nos había estimado p0f).

Ahora cojemos cualquier paquete con IP de origen 192.168.1.159 y cuyo destino no sea el broadcast, por ejemplo el paquete nº 49 que es una petición DNS, y vemos en la cabecera ethernet la dirección MAC de destino “00:0c:29:9b:ee:14”, lo que quiere decir que esa es la puerta de enlace que está usando el PC de Ann Dercover, así que aplicamos un simple filtro “arp and eth.src == 00:0c:29:9b:ee:14” y vemos que la dirección MAC corresponde a la IP 192.168.1.10, luego ya tenemos los datos de la puerta de enlace. A simple vista si filtramos por dirección IP de origen vemos que la puerta de enlace usa un servicio de NTP (Network Time Protocol), y un Firewall con logs en remoto a 192.168.1.30. Todos estos datos podrían servirnos para crear una línea temporal de la actividad del PC de Ann en caso de que los paquetes no tuviesen timestamp, pero vamos a centrarnos de momento en la actividad de Ann.

Con las dos direcciones MAC que tenemos, nos vamos a http://anonsvn.wireshark.org/wireshark/trunk/manuf y buscamos los tres primeros campos de la dirección MAC, y tenemos que Ann usa un portátil Dell y la puerta de enlace es un sistema virtualizado sobre VMWare.

Por tanto, los datos del PC de Ann Dercover recopilados hasta ahora son:


  • IP: 192.168.1.159
  • MAC: 00:21:70:4d:4f:ae
  • Portátil: Dell
  • Nombre del equipo: ANN-LAPTOP
  • Grupo de trabajo: WORKGROUP
  • Sistema Operativo: Windows XP
  • Comentario del e quipo: ann’s laptop
  • Protocolos: NETBIOS, SMB, DNS, SMTP, SYSLOG
  • Servidor DNS: 10.1.1.20
  • Puerta de enlace:
    • IP: 192.168.1.10
    • MAC: 00:0c:29:9b:ee:14 (VMWare)

Seguimos analizando la captura, y vemos que Ann realiza una consulta dns a 10.1.1.20 preguntando por “smtp.aol.com” y justo después inicia una sesión SMTP, así que obtenemos:

Servidor SMTP:


  • Host: smtp.aol.com
  • Nombre primario: smtp.cs.com
  • IP: 64.12.102.142
  • Puerto: 587

Ahora vamos a ver cuánto duró y cuándo se estableció la conexión con el servidor SMTP, para ello seleccionamos con un click el paquete nº 56 que es cuando el cliente de correo de Ann ha finalizado la sincronización de la conexión con el servidor SMTP, y en la ventana de detalles del paquete (donde aparecen todas las cabeceras) desplegamos los datos de “Frame”, vemos que en el campo “Arrival Time” nos dice la fecha y hora de la recepción del paquete: Oct 10, 2009 15:35:31.101734000. Ahora vamos al paquete nº 564 que es cuando el cliente envía el comando “QUIT” al servidor SMTP y realizando la misma operación tenemos la fecha y hora de envío del paquete: Oct 10, 2009 15:38:14.908571000, así que la sesión SMTP duró 4 minutos aproximadamente, así que vamos a ver qué hizo Ann durante la sesión SMTP.

NOTA: Los datos de fecha y hora también podríamos haberlos sacado leyendo los paquetes NTP entre 192.168.1.10 y 192.168.1.30, la fecha y hora enviada por el servidor SMTP en el paquete nº 56, estableciendo un paquete como referencia y haciendo los cálculos.

Ahora, para ver la sesión SMTP hacemos click sobre un paquete de la conexión y le damos a “Analize Follow TCP Stream”, y veremos:

220 cia-mc06.mx.aol.com ESMTP mail_cia-mc06.1; Sat, 10 Oct 2009 15:35:16 -0400

EHLO annlaptop

250-cia-mc06.mx.aol.com host-69-140-19-190.static.comcast.net

250-AUTH=LOGIN PLAIN XAOL-UAS-MB

250-AUTH LOGIN PLAIN XAOL-UAS-MB

250-STARTTLS

250-CHUNKING

250-BINARYMIME

250-X-AOL-FWD-BY-REF

250-X-AOL-DIV_TAG

250-X-AOL-OUTBOX-COPY

250 HELP

AUTH LOGIN

334 VXNlcm5hbWU6

c25lYWt5ZzMza0Bhb2wuY29t

334 UGFzc3dvcmQ6

NTU4cjAwbHo=

235 AUTHENTICATION SUCCESSFUL

MAIL FROM: <[email protected]>

250 OK

RCPT TO: <[email protected]>

250 OK

DATA

354 START MAIL INPUT, END WITH “.” ON A LINE BY ITSELF

Message-ID: <[email protected]>

From: “Ann Dercover” <[email protected]>

To: <[email protected]>

Subject: lunch next week

Date: Sat, 10 Oct 2009 07:35:30 -0600

MIME-Version: 1.0

Content-Type: multipart/alternative;

.boundary=”—-=_NextPart_000_0006_01CA497C.3E4B6020″

X-Priority: 3

X-MSMail-Priority: Normal

X-Mailer: Microsoft Outlook Express 6.00.2900.2180

X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180

This is a multi-part message in MIME format.

——=_NextPart_000_0006_01CA497C.3E4B6020

Content-Type: text/plain;

.charset=”iso-8859-1″

Content-Transfer-Encoding: quoted-printable

Sorry– I can’t do lunch next week after all. Heading out of town. =

Another time! -Ann

——=_NextPart_000_0006_01CA497C.3E4B6020

Content-Type: text/html;

.charset=”iso-8859-1″

Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>

<HTML><HEAD>

<META http-equiv=3DContent-Type content=3D”text/html; =

charset=3Diso-8859-1″>

<META content=3D”MSHTML 6.00.2900.2853″ name=3DGENERATOR>

<STYLE></STYLE>

</HEAD>

<BODY bgColor=3D#ffffff>

<DIV><FONT face=3DArial size=3D2>Sorry– I can’t do lunch next week =

after all.=20

Heading out of town. Another time! -Ann</FONT></DIV></BODY></HTML>

——=_NextPart_000_0006_01CA497C.3E4B6020–

250 OK

QUIT

221 SERVICE CLOSING CHANNEL

De donde podemos extraer los siguientes datos:


  • Usuario (Codificado en Base64) : c25lYWt5ZzMza0Bhb2wuY29t [email protected]
  • Clave (Codificado en Base64): NTU4cjAwbHo= 558r00lz
  • Cliente de correo: Microsoft Outlook Express 6.00.2900.2180
  • Emisor: “Ann Dercover” <[email protected]>
  • Destinatario: [email protected]
  • Asunto del email: lunch next week
  • Cuerpo del mensaje: Sorry I can’t do lunch next week after all. Heading out of town. Another time! Ann

A continuación, en el paquete nº 113 se establece otra conexión, así que volvemos a hacer lo mismo, seleccionamos el paquete, y le damos a “Analize Follow TCP Stream”, de donde podemos extraer la siguiente información:


  • Usuario (Codificado en Base64) : c25lYWt5ZzMza0Bhb2wuY29t [email protected]
  • Clave (Codificado en Base64): NTU4cjAwbHo= 558r00lz
  • Cliente de correo: Microsoft Outlook Express 6.00.2900.2180
  • Emisor: “Ann Dercover” <[email protected]>
  • Destinatario: [email protected]
  • Asunto del mensaje: rendezvous
  • Cuerpo del mensaje: Hi sweetheart! Bring your fake passport and a bathing suit. Address attached. love, Ann

Y a continuación, en el mismo email, vemos lo siguiente:

Content-Type: application/octet-stream;

.name=”secretrendezvous.docx”

Content-Transfer-Encoding: base64

Content-Disposition: attachment;

.filename=”secretrendezvous.docx”


Así que lo siguiente es el adjunto del mail, y ya que está codificado en base64, vamos a copiar todo el “texto” siguiente y decodificarlo. En mi caso lo he guardado como “adjunto_email.base64”, así que para decodificarlo basta con hacer:

$ openssl enc -d -base64 -in adjunto_email.base64 -out adjunto_email

Obtendremos el MD5 del documento:

$ md5sum adjunto_email

9e423e11db88f01bbff81172839e1923 adjunto_email

Y ya podremos leer el documento adjunto, que vemos que dice:

Meet me at the fountain near the rendezvous point. Address below. I’m bringing all the cash.

Y adjunta una imagen de Google Maps con la localización de “Playa del Carmen” en la Av. Constituyentes 1 Calle 10 por la quinta avenida, 77780, México.



Algo interesante que probablemente no sepa más de uno, es que la mayoría (si no todos) los documentos de Office (pptx, docx, etc.), en realidad son archivos comprimidos en ZIP donde se guardan todos los elementos del documento, así que vamos a verificarlo y extraer todos los elementos:

$ file adjunto_email

adjunto_email: Zip archive data, at least v2.0 to extract


$ unzip adjunto_email

Archive: adjunto_email

inflating: [Content_Types].xml

inflating: _rels/.rels

inflating: word/_rels/document.xml.rels

inflating: word/document.xml

extracting: word/media/image1.png

inflating: word/theme/theme1.xml

inflating: word/settings.xml

inflating: word/webSettings.xml

inflating: word/styles.xml

inflating: docProps/core.xml

inflating: word/numbering.xml

inflating: word/fontTable.xml

inflating: docProps/app.xml

Y vemos ahí la imagen adjunta en “word/media/image1.png” y el texto del documento en “word/document.xml”, así que obtenemos el MD5 de la imagen PNG:

$ md5sum word/media/image1.png

aadeace50997b1ba24b09ac2ef1940b7 word/media/image1.png

Así que aprovechando las fechas y horas obtenidas anteriormente, podemos decir que:


  • El sábado 10 de Octubre de 2009 a las 15:35:31, Ann Dercover envió un mail a “[email protected] desde la dirección de email [email protected]cancelando la cita para almorzar a la semana siguiente.
  • El sábado 10 de Octubre de 2009 a las 15:38:11, Ann Dercover envió un mail a [email protected] desde la dirección [email protected] para confirmar la cita.

Estas horas y fechas se extrayeron del timestamp de los paquetes, y coinciden con la fecha y hora en los paquetes enviados de 192.168.1.10 a 192.168.1.30 mediante NTP, sinembargo, en los emails enviados por Ann, ponía fechas y horas diferentes, y si extraemos los metadatos del documento enviado por Ann a [email protected] vemos que las fechas y horas de creación y modificación son:


  • Creación: 10 OCT 2009 17:58:00
  • Última modificación: 10 OCT 2009 18:29:00
  • Veces editado: 1

Por lo que al parecer la fecha y hora “real” difieren de la fecha y hora del PC de Ann, lo cual es posible si Ann no tiene debidamente configurada la fecha y hora en su PC o bien, si ha viajado y se encuentra en otra zona horaria.


Así que con toda la información de la que disponemos vamos a tratar de responder a las preguntas del reto:


  • ¿Cuál es la dirección de correo de Ann Dercover?
    • [email protected]
  • ¿Cuál es la clave del correo?
    • 558r00lz
  • ¿Cuál es la dirección de correo del amor secreto de Ann Dercover?
    • [email protected]
  • ¿Qué dos elementos le dijo Ann Dercover a su amor secreto que llevase?
    • Un pasaporte falso y un traje de baño
  • ¿Cuál es el nombre del adjunto que Ann Dercover le ha enviado a su amor secreto?
    • secretrendezvous.docx

  • ¿Cuál es el MD5 del adjunto enviado por Ann Dercover a su amor secreto?
    • 9e423e11db88f01bbff81172839e1923

  • ¿En qué ciudad y pais se encuentra el punto de encuentro?
    • Playa del Carmen, 77780, México

  • ¿Cuál es el MD5 de la imagen embebida en el documento?
    • aadeace50997b1ba24b09ac2ef1940b7

Y como soy el “tonto de los scripts” aquí os dejo uno para p0f y otro para saber la versión de Windows con los datos de  Major/Minor Version.

#!/bin/bash

if [ ! $# -eq 1 ]
then
echo -e “\nUso: $0 archivo_captura\n”
exit 1
fi

POF=`which p0f`

if [ -z "$POF" ]
then
echo -e “\np0f no encontrado!\n”
exit 1
fi

$POF -s $1 2>/dev/null | egrep “^[0-9]{1,3}” | tr -s ‘:’ ‘-’ | awk -F\- ‘{print $1,$3}’ | sort -u

unset POF
exit 0

#!/bin/bash

if [ ! $# -eq 2 ]
then
echo -e “\nUso: $0 os_major_version os_minor_version\n”
exit 0
fi

case $1 in
4)
if [ $2 -eq "0" ]
then
echo “Windows NT 4.0″
fi
;;

5)
case $2 in
0)
echo “Windows 2000″
;;

1)
echo “Windows XP”
;;

2)
echo “Windows Server 2003 / Windows Server 2003 R2″
;;
esac
;;

6)
case $2 in
0)
echo “Windows Vista / Windows Server 2008″
;;

1)
echo “Windows Vista / Windows Server 2008 R2″
;;

esac
;;
esac

exit 0

De donde podemos extraer los siguientes datos:

  • Usuario (Codificado en Base64) : c25lYWt5ZzMza0Bhb2wuY29t [email protected]

  • Clave (Codificado en Base64): NTU4cjAwbHo= 558r00lz

  • Cliente de correo: Microsoft Outlook Express 6.00.2900.2180

  • Emisor: “Ann Dercover” <[email protected]>

  • Destinatario: [email protected]

  • Asunto del email: lunch next week

  • Cuerpo del mensaje: Sorry I can’t do lunch next week after all. Heading out of town. Another time! Ann

A continuación, en el paquete nº 113 se establece otra conexión, así que volvemos a hacer lo mismo, seleccionamos el paquete, y le damos a “Analize Follow TCP Stream”, de donde podemos extraer la siguiente información:

  • Usuario (Codificado en Base64) : c25lYWt5ZzMza0Bhb2wuY29t [email protected]

  • Clave (Codificado en Base64): NTU4cjAwbHo= 558r00lz

  • Cliente de correo: Microsoft Outlook Express 6.00.2900.2180

  • Emisor: “Ann Dercover” <[email protected]>

  • Destinatario: [email protected]

  • Asunto del mensaje: rendezvous

  • Cuerpo del mensaje: Hi sweetheart! Bring your fake passport and a bathing suit. Address attached. love, Ann

Y a continuación, en el mismo email, vemos lo siguiente:

Categories: Forense, Retos Tags: