jueves, 7 de julio de 2011

Windows, python y los ficheros pcap

Después de acabar de resolver las cuestiones planteadas en el Network Forensic Contest #8 de SANS y como todavía me quedaban ganas decidí intentar programar algo, por eso de seguir dándole a python y ver si salía algo decente. El resultado no es una maravilla, pero al menos hace lo que pretendía y me ha servido para aprender un poco más. Si quieres descargarlo directamente puedes hacerlo desde aquí.

El script lo desarrollé en Ubuntu utilizando Eclipse, Pylint, un repositorio bazaar privado y, como no, mi compañero Hilario, pero una vez terminado me encabezoné con utilizarlo en Windows y lo que sigue en estas líneas es un resumen de mis andanzas. Antes de empezar resaltar que el proceso es tal cual siempre que el sistema operativo sea de 32 bits; con x64 no he conseguido que me funcione :(

Primero Python y compañía

Resulta que el script utiliza la nueva librería de python argparse, la cual viene a sustituir a su predecesora optparse y cuya finalidad es la de facilitar el uso de argumentos desde la línea de comandos para nuestros scripts. Sea como fuere la conclusión es que, si quieres probar mi script, tienes que instalar Python 2.7.

El proceso es muy simple, primero descargamos el instalador para la ultima versión disponible (la 2.7.2 en el momento de escribir estas líneas) y lo lanzamos con la conocida sucesión Next, Next, Next, Finish; usease, lo que viene siendo Siguiente por 3 veces y Finalizar. Una vez instalado sólo nos queda agregarlo al PATH para no tener que recordar la ruta completa del binario. En Windows XP botón derecho sobre "Mi PC", Propiedades y en Vista y Windows 7 botón derecho sobre Equipo, Propiedades, Configuración avanzada del sistema. Una vez abierto el diálogo y en la pestaña de Opciones avanzadas pulsamos sobre Variables de entorno y en la parte inferior seleccionamos Path y el botón Modificar. Al final de la línea agregaremos:

;C:\Python27

siempre y cuando esa sea la ruta que hayas escogido para la instalación. Terminamos aceptando por 3 veces para cerrar la ventana de diálogo.

Ahora, y dado que vamos a compilar un par de librerías de python, necesitamos un compilador y para ello vamos a utilizar MinGW. Directos a sourceforge y nos aseguramos de descargar el paquete que reza "Automated MinGW Installer". Como antes lanzamos el proceso de instalación y como si estuviéramos locos pulsamos Next un par de veces, aceptamos las condiciones de licencia, y sólo nos detenemos en el diálogo de selección de componentes donde nos aseguramos de marcar "MinGW Compiler Suite" y "MSYS Basic System". Cuando el proceso de instalación termine de descargar e instalar los componentes agregaremos el binario al Path tal como hicimos antes con Python pero agregando en este caso:
;C:\MinGW\bin

virtualenv

Vamos ahora a utilizar esta utilidad extremadamente útil, valga la redundancia. Básicamente nos permitirá crear un entorno virtual para python separado del resto, de forma que nada nos impediría tener varios desarrollos cada uno con una versión de python diferente y con sus propias librerías. Como siempre, es más difícil decirlo que verlo así que comenzaremos descargándolo y desempaquetándolo en C:, por ejemplo.

Ahora, y desde nuestro querido cmd, nos desplazamos a la raíz del sistema y generamos una sandbox en C:\sandbox ejecutando:
C:\>python virtualenv-1.6.1\virtualenv.py --no-site-packages sandbox

New python executable in sandbox\Scripts\python.exe
Installing setuptools................done.
Installing pip...................done.

Si cotilleamos un poco dentro de dicho directorio veremos como se han copiado allí los binarios de python y sus librerías así como otras utilidades instaladas con virtualenv.

Ahora, y para que nuestro entorno virtual de Python utilice el compilador MinGW por defecto en los procesos de instalación de librerías, modificaremos el fichero C:\sandbox\Lib\distutils\distutils.cfg dejándolo como sigue:
# This is a config file local to this virtualenv installation

# You may include options that will be used by all distutils commands,
# and by easy_install. For instance:
#
# [easy_install]
# find_links = http://mylocalsite
#
[build]
compiler=mingw32

Ya lo tenemos casi todo listo.

Nuestra primera vez: instalando pcapy

El módulo pcapy nos permitirá interactuar con la librería de captura libpcap desde Python, ya sea para realizar sniffing desde nuestros scripts o para abrir y analizar ficheros de captura, caso éste el que nos ocupa. Pero para poder compilarlo correctamente primero tendremos que descargar y ubicar adecuadamente los ficheros de desarrollo de winpcap, que es el equivalente windowsero para la mencionada libpcap.

Descargaremos el paquete "WinPcap Developers Pack" y lo extraeremos. Ahora moveremos el contenido del directorio include a C:\MinGW\include y haremos lo propio con el contenido del directorio Lib, moviéndolo en este caso a C:\MinGW\lib.

Para realizar la instalación del módulo primero activaremos la sandbox:
C:\>sandbox\Scripts\activate.bat

(sandbox) C:\>

Y ahora instalaremos pcapy (obviamente he recortado la salida, pero debería quedar claro que se ha instalado correctamente):
(sandbox) C:\>pip install pcapy

Downloading/unpacking pcapy
Downloading pcapy-0.10.5.tar.gz
Running setup.py egg_info for package pcapy

Installing collected packages: pcapy
Running setup.py install for pcapy
building 'pcapy' extension
...

Successfully installed pcapy
Cleaning up...

(sandbox) C:\>

Instalando Impacket

Ya podemos abrir ficheros pcap pero todavía no podemos analizar los paquetes que contienen. Para eso utilizaremos el conjunto de clases Impacket en su última versión, disponible desde Google Code. No puede continuar sin agradecer la ayuda desinteresada que me prestó Gustavo Moreira a la hora de resolver mis dudas; él ya sabe que, si viene por Valencia, tiene unas cervecitas pagadas :)

Primero necesitaremos un cliente subversion y el más sencillo que conozco es TortoiseSVN. Una vez descargado el proceso de instalación es como los vistos hasta el momento con la diferencia que, en esta ocasión, tendremos que reiniciar el sistema al finalizar.

Ahora crearemos un directorio src dentro de C:\sandbox; desde el explorador de Windows y una vez situados dentro de dicho directorio haremos click con el botón derecho del ratón y seleccionaremos "SVN Checkout...". Completaremos la nueva ventana de diálogo con la siguiente información:
  • URL of repository: http://impacket.googlecode.com/svn/trunk/
  • Checkout directory: C:\sandbox\src\impacket

Dejaremos el resto de opciones por defecto y pulsaremos OK, con lo que aparecerá un log del proceso. Si todo ha ido bién tendremos un nuevo directorio, impacket, con el contenido de la librería descargado desde el servidor subversion de google code.

Sólo nos resta lanzar el proceso de instalación de impacket activando primero la sandbox y utilizando easy_install para que haga el trabajo sucio por nosotros:
C:\>sandbox\Scripts\activate.bat

(sandbox) C:\>easy_install sandbox\src\impacket
Processing impacket
...
Installed c:\sandbox\lib\site-packages\impacket-0.9.7.0-py2.7.egg
Processing dependencies for impacket==0.9.7.0
Finished processing dependencies for impacket==0.9.7.0

(sandbox) C:\>

Ya está, ya lo tenemos todo.

Y por fin el script

Puedes descargarlo desde aqui. Si lo ubicas en el directorio de la sandbox junto con el fichero de captura del contest podrás probarlo. Su uso, tal como muestra la ayuda, es muy simple:
(sandbox) C:\>python sandbox\analdump.py -h

usage: analdump.py [-h] [-v] [-s | -i NUM] pcapfile


Analyze a wlan pcap file. Without options show a summary for the pcap file.


positional arguments:
pcapfile wlan pcap file


optional arguments:
-h, --help show this help message and exit
-v, --version show program's version number and exit
-s, --show-aps show the list of APs present in the pcap file
-i NUM, --inject-pkts NUM
number of repetitions to consider a injection


Copyright (c) 2011 neosysforensics.es

Sin argumentos mostrará un pequeño sumario con información del fichero de captura:
(sandbox) C:\>python sandbox\analdump.py sandbox\evidence08.pcap

The mintocopy parameter cannot be set while reading from a file


Number of packets: 133068
Start time : Fri Sep 17 15:56:41 2010
End time : Fri Sep 17 16:03:34 2010
Capture Duration : 414 seconds

Utilizando el flag -s mostrará la lista de APs presentes en la captura, ya sea analizando los beacons o los frame probe response:
(sandbox) C:\>python sandbox\analdump.py -s sandbox\evidence08.pcap

The mintocopy parameter cannot be set while reading from a file


SSID : Ment0rNet
BSSID : 00:23:69:61:00:D0
Channel: 2


Number of packets: 133068
Start time : Fri Sep 17 15:56:41 2010
End time : Fri Sep 17 16:03:34 2010
Capture Duration : 414 seconds

Por último, utilizando el flag -i y el número mínimo de repeticiones que consideremos sintomática de un ataque de arp replay mostrará la MAC origen, destino, el IV y el número de veces que aparece repetida:
(sandbox) C:\>python sandbox\analdump.py -i 100 sandbox\evidence08.pcap

The mintocopy parameter cannot be set while reading from a file


WEP IV BSSID srcaddr dstaddr times
-------- ----------------- ----------------- ----------------- -----
0x46a9fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 272
0x0c98fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 276
0x288ffd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 270
0x1798fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 271
0x1398fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 267
0x1191fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 268
0x4aa7fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 268
0xaf9cfd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 274
0x1491fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 267
0x4ca7fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 276
0x2b8ffd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 266
0xae9cfd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 279
0xa39cfd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 278
0x49a7fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 272
0x2c8ffd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 272
0xb09cfd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 272
0x1591fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 270
0x1091fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 263
0x48a7fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 282
0x47a9fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 277
0x278ffd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 275
0x45a9fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 275
0x5987fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 175
0x0898fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 278
0x43a9fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 275
0x47a7fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 267
0x4ba7fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 274
0x298ffd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 273
0xa79cfd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 276
0x1691fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 269
0x1391fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 265
0x258ffd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 272
0x2a8ffd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 275
0x1791fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 265
0x1291fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 262
0x1598fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 273
0x0998fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 278
0x1498fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 275
0x44a9fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 276
0x4da7fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 277
0x3fa7fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 272
0xad9cfd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 270
0x42a9fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 275
0x48a9fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 277
0xac9cfd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 273
0x268ffd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 264
0x1898fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 279
0xab9cfd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 272
0x49a9fd 00:23:69:61:00:D0 1C:4B:D6:69:CD:07 FF:FF:FF:FF:FF:FF 269


Number of packets: 133068
Start time : Fri Sep 17 15:56:41 2010
End time : Fri Sep 17 16:03:34 2010
Capture Duration : 414 seconds

Sin ser una maravilla creo que cumple con su objetivo.

Y esto es todo por ahora.

3 comentarios:

Anónimo dijo...

Muy bueno. Muchas gracias

Unknown dijo...

Preparación del entorno de ejecución en linux para los que no usamos ni usaremos windows:


~$ cd /tmp

~$ virtualenv --no-site-packages sandbox

~$ source sandbox/bin/activate

~$ mkdir sandbox/src

~$ svn checkout http://impacket.googlecode.com/svn/trunk/ sandbox/src/impacket

~$ easy_install sandbox/src/impacket/

~$ cd sandbox/src/

~$ wget -O - http://oss.coresecurity.com/repo/pcapy-0.10.5.tar.gz | tar xvfz -
easy_install pcapy-0.10.5/

neofito dijo...

Ya llegaron los puristas ;) Gracias por el aporte!