Recogiendo datos para Analisis Forense de sistemas Windows

1.- Introduccion

Tradicionalmente los forenses vienen dividiendo los datos en 2 tipos:

-Datos volatiles.
-Datos no volatiles.

Los datos volatiles son aquellos que al apagar la maquina a analizar se pierden. Esto no es del todo exacto, pues tal y como debatimos aqui es posible recuperar datos almacenados en RAM _tras apagar_ el equipo.

Los datos no volatiles por el contrario son aquellos que permanecen en el disco duro tras apagar la maquina.

Tipicamente, un forense adquiriria una imagen del disco mediante herramientas tipo dd o cualquiera de sus evoluciones. Nunca con herramientas tipo Ghost, pues perderiamos la información a mas bajo nivel como en que clusters o sectores estaba almacenada la informacion, espacio particionado y libre (unallocated), espacio slack o espacio sin particionar.

Y como una imagen vale mas que mil palabras, como dice el refran, a continuacion muestro una imagen donde se ve mas claro lo que son estos conceptos:

slack

Sobre el espacio slack me gustaria hacer un inciso, enlazando un video algo viejo pero interesante titulado Look for deleted data on the slack space of a disk.

Tambien comentar la existencia de la genial utilidad slacker, sobre la que hablamos, quizas muy por encima para lo que se merece, en un hilo llamado Anti-Forensics.

Asi que los que querais iniciaros en el uso de dicha herramienta, podeis consultar un paper bautizado con el atrayente titulo de catch me, if you can… presentado en la Blackhat 2005 por James Foster y el crack Vinnie Liu, que no se si a dia de hoy sigue implicado en el Proyecto Metasploit.

Y por ultimo, para los que querais profundizar sobre sistemas de archivos a bajo nivel, os recomiendo el _excelente_ libro File System Forensic Analysis, de Brian Carrier; ademas de los talleres de Vic_Thor sobre FATxx y NTFS.

“Cualquier contacto, deja un trazo”
Locard’s Exchange Principle

2.- Obteniendo datos volatiles

Sobre todo lo que comentare, decir que lo ideal es utilizar siempre binarios llevados por nosotros a ser posible en un CD personalizado por nosotros mismos con binarios limpios y DLLs limpias, _nunca_ usar los binarios del sistema por razones evidentes.

Tal y como comentan Steve Anson y Steve Bunting en su libro Mastering Windows Network Forensics and Investigation, lo ideal es disponer de un CD para cada S.O. que tengamos que analizar. Tambien explican el proceso de creacion de CDs personalizados.

Lo primero que obtendremos en la maquina presuntamente comprometida sera un volcado de la memoria fisica del sistema, mediante herramientas como dd, windd o mdd.

Mediante dd, familiar para los que venimos de UNIX, podemos obtener un completo volcado de la memoria fisica, mediante una sintaxis tal que asi:

Código: dd if=\\.\PhysicalMemory of=%DIR%\fecha.bin bs=4096 -localwrt

Nota: El 4096 viene de multiplicar 1024*4 (4KB).

Sobre la adquisicion de volcados de memoria por SW, el principal problema es que al hacerlos en caliente es bastante probable que sean inconsistentes, por lo que existen evoluciones de estas utilidades como ADplus que puede operar en modo crash o modo hang.

Podemos encontrar info sobre esta herramienta por ejemplo en el KB de Microsoft titulado Como utilizar ADPlus para solucionar bloqueos.

Tambien disponemos de la utilidad Dumpchk, de la que podemos encontrar mas informacion en un KB de Microsoft titulado How to use Dumpchk.exe to check a memory dump file.

Es por todos estos problemas, que existen aparatos especificos que permiten adquirir volcados de memoria por HW.

El primero que me consta es uno que bautizaron con el nombre de Tribble, anunciado en 2004 en el siguiente paper:

A Hardware-Based Memory Acquisition Procedure for Digital Investigations, Carrier & Grand

De todas formas, aunque se sale un poco del tema, comentar que la idea no es nueva, pues en plataformas SPARC (I’m lovin’ it ) podemos pasar a la Openboot mediante un init 0 o pulsando la combinacion de teclas STOP + A.

Una vez el firmware nos presenta el prompt ok, señal de que ya estamos en la linea de comandos de la Openboot, mediante el comando sync sincronizariamos los sistemas de archivos y el sistema escribiria un crash dump a disco para finalmente reiniciar la maquina.

Y termino el inciso en UNIX recomendadoos un libro relativamente viejo (1995) titulado PANIC! UNIX System Crash Dump Analysis Handbook, de Chris Drake y Kimberley Brown.

No me entretendre mas sobre la adquisicion de volcados de memoria, pues nuestro compañero neofito hablo de ello en este hilo.

Un tema relacionado con esto, tambien por neofito aqui, donde se habla de obtener hashes a partir de un volcado de memoria.

Tambien añadir, y con esto si que realmente termino, si no hay mas sugerencias claro, que via Conexion Inversa me acabo de enterar de una interesante manera de obtener un volcado de memoria de una maquina sin tener acceso _fisico_ a ella.

Una practica comun entre forenses es definir una variable de entorno _externa_ al disco duro de la maquina comprometida. Recordemos que debemos ser lo menos intrusivos posible.

En los ejemplos siguientes, se ha definido la variable de entorno %DIR%, apuntando, a ser posible a la disketera del equipo, ya que debemos ser lo menos intrusivos posible, y la insercion de una llave USB “hace saltar” el servicio de deteccion de HW de windows. El problema es que hoy en dia cada vez es menos comun que los equipos dispongan de una disketera, lo cual dificulta en cierto modo nuestro trabajo.

Bien, podemos empezar nuestra adquisicion de datos estableciendo un listener _en una maquina remota_ que vaya capturando paquetes enviados por la maquina sospechosa a traves de la red, mediante la mitica utilidad netcat:

Código: nc -L -p 7777 >\datos_listener.txt

Tras establecer el listener en la maquina remota, podemos pasarle informacion a traves de la red desde la maquina sospechosa de haber sido comprometida:

Código: tlist.exe -c |nc <ip_remota> 7777 -w 5
tlist.exe -t |nc <ip_remota> 7777 -w 5
tlist.exe -s |nc <ip_remota> 7777 -w 5
tcpvcon -can |nc <ip_remota> 7777 -w 5
netstat -naob |nc <ip_remota> 7777 -w 5

Sobre los 2 ultimos comandos, comentar que resulta de gran ayuda en nuestras investigaciones comparar la salida de dichos comandos.

Tambien comentar que tcpconv, con los parametros que hemos especificado, obtiene info en formato .csv sobre conexiones TCP/UDP sin resolucion inversa (IPs a nombres), lo cual aumenta su velocidad.

Bien, pasemos a obtener mas datos.

Fecha y hora actual del sistema:

Código: ((date /t) & (time /t)) >%DIR%\SystemTime.txt

Uptime de la maquina:

Código: (systeminfo | find “Boot Time”) >%DIR%\uptime.txt

Tambien es habitual recoger parametros de red que puedan mostrar evidencias de botnets para realizar por ejemplo SPAM, etc.

Código: ipconfig /all >%DIR%\ipconfigNICs.txt
netstat -rn >%DIR%\TablaEnrutamiento.txt
nbtstat -c >%DIR%\CacheNombresNetbios.txt

Deteccion de NICs en modo promiscuo, señal de que se ha instalado un sniffer en la maquina:

Código: promqry >%DIR%\promiscuo.txt

Esta utilidad puede descargarse del sitio web de Microsoft.

Tambien disponemos de la utilidad PromiscDetect

Tambien pueden sernos utiles utilidades que muestren los usuarios logeados en el sistema al estilo de who en UNIX, o conocer los intentos OK/KO de conexiones al sistema. Los genios de SysInternals tienen utilidades CLI de este estilo llamadas psloggedon y logonsession.

Info sobre procesos en ejecución:

Podemos usar tasklist /svc , que creo recordar que recoge los datos de svchost.exe , pero yo personalmente prefiero usar psservice de SysInternals, que ofrece resultados mas detallados, y que me consta que recoge los datos basandose en el registro de Win. Lo ideal es usar las 2 herramientas para poder comparar. Nunca sabemos a priori que puede haber sido troyanizado.

Arbol de procesos en ejecución (SysInternals):

Código: pslist -t >%DIR%\ArbolProcesos.txt

Descubrir DLLs maliciosas cargadas por procesos en ejecucion, por ejemplo un keylogger:

Código: listdlls >%DIR%\DLLs.txt

De SysInternals para variar. De estos cracks tambien disponemos de la utilidad handle, muy similar a la maravillosa y ya mitica utilidad lsof de *nix.

Código: handle -a >%DIR%\handles.txt

Con el parametro -a conseguimos obtener toda la información que esta utilidad nos puede ofrecer sobre todos los recursos que un proceso dado tiene abiertos: archivos, claves de registro, puertos, etc.

Una practica comun del malware en sistemas windows es ingenierselas para que el malware se ejecute al arrancar el S.O., o cuando un usuario inicia sesion en el sistema. Los chicos de SysInternals tienen una utilidad llamada autorunsc que crea un informe exhaustivo de ejecutables que se cargan al inicio:

Código: autorunsc -a >%DIR%\autorun.txt

Tambien disponemos de utilidades de serie en win para obtener informacion sobre tareas programadas.

Código: at >%DIR%\at.txt
schtasks /query >%DIR%\tasks.txt

Para los que quieran profundizar sobre el analisis de tareas programadas, os recomendaria la entrada Windows Scheduler (at job) Forensics, publicada recientemente en SANS Computer Forensics.

Contenidos del Portapapeles:

Podemos llegar a encontrar info interesante previamente copiada o cortada.

Existe una utilidad llamada pclip que nos puede servir para este fin en scripts por ejemplo.

Podemos encontrarla en .

Por otra parte, os animo a que os leais el siguiente KB en support de Microsoft:

How to prevent web sites from obtaining access to your contents of your windows clipboard

Es aplicable a IE, desde las versiones 4 a la 6 al menos.

Historial de comandos:

Código: doskey /history >%DIR%\historial.txt

Puede sernos util enumerar los recursos compartidos, ademas de los archivos que han sido abiertos de forma remota.

Código: net share >%DIR%\shares.txt
psfile >%DIR%\remote_open_files.txt

Metodicamente, lo siguiente que suelen hacer los forenses, es un escaneo de puertos de la maquina sospechosa de haber sido comprometida, desde una maquina limpia.

Código: nmap -sS <IP_maquina_comprometida>

Para los que quieran profundizar sobre el uso de nmap, os recomiendo el libro sobre dicha herramienta que recientemente publico su autor, Fyodor, titulado nmap Network Scanning

Tambien os animo a que os leais el resumen que sobre dicho libro hizo nuestro compañero Sor_Zitroën en su blog, ademas de en este hilo, donde podreis encontrar tambien el enlace al esquema que se preparo para una charla que dio.

Comentar que existe un interesante proyecto denominado The Volatility Framework: Volatile memory artifact extraction utility framework, especializado precisamente en obtener datos volatiles.

Una vez recolectada toda esta informacion, es _muy importante_ desconectar el cable de red inmediatamente.

-¡Mira! una estrella fugaz, pide un deseo cariño.
-Quiero ser invisible mamá.

3.- Obteniendo datos no volatiles

Una vez desconectado el cable de red, podemos estar seguros de que no hay ninguna _persona_ interfiriendo en la maquina sospechosa de haber sido comprometida.

Fijaos que subrayo persona, pues es posible, y puede que probable, que la maquina se encuentre infectada de backdoors, troyanos, rootkits, etc.

Obtener info del SW instalado (psinfo de SysInternals) y de los parches instalados (systeminfo) en la maquina:

Código: psinfo -s >%DIR\sw.txt
systeminfo >%DIR%\parches.txt

Una practica comun que suele hacer un atacante es crearse un usuario en el sistema.

Debemos ser muy cuidadosos con esto, pues un atacante inteligente crearia un usuario similar a alguno de los que existen en el sistema por defecto. Por ejemplo, crear un usuario llamado TsInternetUser puede pasarnos desapercibido haciendonos creer que se trata de un usuario por defecto utilizado por los servicios de Terminal Server.

Enumeremos usuarios y grupos.

He aqui un script en VBS que enumera las cuentas de usuario existentes en el sistema:

Código: Set objNetwork = CreateObject(“Wscript.Network”)
strComputer = objNetwork.ComputerName

Set colAccounts = GetObject(“WinNT://” & strComputer & “”)
colAccounts.Filter = Array(“user”)

For Each objUser In colAccounts
Wscript.echo objUser.Name
Next

Y a continuacion otro script, en VBS tambien, que enumera los grupos que existen en el sistema:

Código: strComputer = “.”
Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonat e}!\\” & strComputer & “\root\cimv2”)
Set colItems = objWMIService.ExecQuery (“SELECT * FROM Win32_Group WHERE LocalAccount = True”)

For Each objItem In colItems
Wscript.Echo “Caption: ” & objItem.Caption
Wscript.Echo “Description: ” & objItem.Description
Wscript.Echo “Domain: ” & objItem.Domain
Wscript.Echo “Local Account: ” & objItem.LocalAccount
Wscript.Echo “Name: ” & objItem.Name
Wscript.Echo “SID: ” & objItem.SID
Wscript.Echo “SID Type: ” & objItem.SIDType
Wscript.Echo “Status: ” & objItem.Status
Wscript.Echo
Next

Ambos scripts los he sacado del libro The Rootkit Arsenal. Escape and Evasion in the Dark Corners of the System, de Bill Blunden.

Bien, ejecutemos los scripts. Al primero lo hemos llamado users.vbs y al segundo groups.vbs

Código: cscript //H:cscript
cscript /nologo users.vbs >%DIR%\users.txt
cscript /nologo groups.vbs >%DIR%\groups.txt

A continuacion, ejecutamos el siguiente bucle

Código: for /F “delims=” %%i in (users.txt) do net user “%%i” >%DIR%\users_detalis.txt

Lo que hace basicamente es recorrer todos los usuarios que previamente el script users.vbs guardo en el archivo users.txt, y para cada uno de ellos ejecuta el comando net user, lo cual nos ofrece una informacion mas exhaustiva, por ejemplo la ultima vez que un usuario dado se logueo en el sistema.

Obtener info sobre Event logs:

Código: auditpol /get /category:* >%DIR%\Logs_auditpol.txt
wevutil el >%DIR%\Logs_event_names.txt

Obtener info del registro de win:

Mediante los siguientes comandos obtenemos una copia de las partes mas relevantes del registro, tanto en texto plano como en binario.

Código: reg save HKLM\SYSTEM system.dat
reg save HKLM\SOFTWARE software.dat
reg save HKLM\SECURITY security.dat
reg save HKLM\SAM sam.dat
reg save HKLM\COMPONENTS components.dat
reg save HKLM\BCD00000000 bcd.dat

reg export HKLM hklm.reg
reg export HKU hku.reg

Disponemos en nuestro foro de un borrador sobre el analisis del registro de windows, publicado por neofito, y que debo reconocer que aun no me he leido (sorry no he tenido tiempo )

Obteniendo marcas de tiempo (timestamps):

Podriamos obtener un listado de todos los archivos de la unidad C: con sus respectivos timestamps de la siguiente forma:

Código: dir c:\ /a /o:d /t:w /s

En el siguiente KB de support de Microsoft podemos encontrar mas informacion al respecto.

Tambien aqui y alli.

Ah, decir que para un analisis minucioso de windows a bajo nivel, ademas de otros muchos aspectos (es un buen “tocho” ), os recomiendo por ejemplo la 5a Edicion del libro Windows Internals, apasionante para los que gustamos de llegar al mas bajo nivel posible del sistema.

Es bastante reciente, y cubre hasta Windows Server 2008 o Vista.

“I can clone a human being”
Dr Zavos

“This affair shows a complete lack of responsibility. If true, Zavos has again failed to observe the universally-accepted ban on human cloning,”
Professor Surani

4.- Clonando el disco

No sabia muy bien si llegar hasta aqui, pues ciertamente, todos los autores que he leido vienen separando esta parte de las anteriores.

Sin embargo al final he decidido incluirlo, pues es un aspecto estrechamente relacionado con la adquisicion de datos tanto volatiles como no volatiles.

De todas formas, esta sera la tercera y ultima parte de esta serie de posts.

Como dije en el primer post, _nunca_ debemos obtener un clon del disco mediante herramientas como Ghost o Acronis. Cuidado, no es que sean malas herramientas, de hecho son geniales en otros ambitos. Es solo que simplemente no han sido diseñadas para el Analisis Forense, pues no almacenan la informacion a mas bajo nivel, que es precisamente lo que buscan los forenses.

Existen diversas posibilidades. Podemos usar aparatos diseñados especificamente para clonar discos. Podemos usar dd o cualquiera de sus evoluciones. Podemos usar SW como EnCase arrancando por ejemplo desde una Live-CD.

Decir que para los que quieran iniciarse en el manejo de EnCase, os recomiendo el excelente Taller de FATxx

(…)

(…)

Una vez hemos recolectado la informacion, es cuando llega la hora de realizar realmente un Analisis Forense en el laboratorio. Y es ahi donde en mi opinion empieza lo realmente apasionante, esto es, la labor de investigacion.


Para los que quieran ver ejemplos practicos, os recomendaria por ejemplo los Retos de Analisis Forense iniciados por kamsky de elhacker.net

Fuente

__________________

Mi web:
http://www.seifreed.org
Asociación cultural y tecnológica:
http://www.badiatech.org
Cursos de informática:
aula.badiatech.org
Wikipedia asociación:
wiki.badiatech.org

Via Dragonjar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *