Bastionado, seguridad en sistemas: Registro de windows con python-registry pre { background:#eeeeee; border:1px solid #A6B0BF; font-size:120%; line-height:100%; overflow:auto; padding:10px; color:#000000 } pre:hover { border:1px solid #efefef; } code { font-size:120%; text-align:left; margin:0;padding:0; color: #000000;} .clear { clear:both; overflow:hidden; }

Bienvenido al blog

Bienvenidos al blog de seguridad en sistemas

miércoles, 17 de abril de 2013

Registro de windows con python-registry

Dejando por unos días de lado la auditoría web, en esta entrada haré una pequeña introducción a la libreria python-registry programada por Willi Ballenthin.

La librería permite trabajar sobre los ficheros que constituyen el registro de Windows, de forma que, durante un análisis forense se pueda interactuar con el registro para la busqueda de evidencias. Es una libreria al estilo RegRipper pero escrita en Python básico y por tanto, se puede ejecutar tanto en Windows, Linux como Mac Os X.

La libreria esta formada por dos ficheros:
  • RegistryParse.py: bajo nivel de la librería. No es necesario conocerla si no se va a trabajar a muy bajo nivel del registro.
  • Registry.py: clases que componene la API de la librería y que emplean RegistryParse.py para el tratamiento del registro. 
Registry.py divide el registro windows en tres clases:
  • Registry: es el registro completo en si mismo, el arbol. Se usa para recorrer el registro.
  • RegistryKey: es la únida básica del registro. Éste puede estar constituida por otros RegistryKey y/o por los valores del registro asignado a dicha Key.
  • RegisterValue: valores que pueden estar asignados a un registro (Key). Cada valor está formado por tres partes: el nombre del valor, el tipo de valor y el dato que contiene dicho valor.  
Cada una de estas clases tiene una serie de metodos que recomiendo revisar en la API del proyecto. De todas formas, para la entrada en el blog veremos los más importantes.

Registry:
  • open(): abre un registro en cierta posición.
  • root(): abre el registro en la raiz del mismo. Útil para imprimir todo el registro por pantalla.
RegistryKey:
  • timestamp(): devuelve el timestamp del registro.
  • name(): nombre del registro.
  • path(): ruta hasta el registro.
  • parent(): padre del registro.
  • subkeys(): lista de todas los registros hijos que tiene el registro.
  • values(): lista de todos los valores que tiene este registro.
RegisterValue:
  • name(): obtiene el nombre del valor del registro.
  • value_type_str(): obtiene el nombre en ascii de tipo valor.
  • value_type(): obtiene el número hexadecimal de tipo valor.
  • value(): devuelve el dato asignado a ese valor del registro.
Una vez vista una pequeña introducción vamos a proceder a dar unos ejemplos de uso de la libreria. Dando por hecho que ya disponemos de un entorno con Python, lo primero que se debe hacer es descargarse la libreria desde el github del proyecto. Podemos pinchar sobre el icono de "zip" para descarganos el proyecto entero. Una vez descargado, tendremos que situarnos en la raiz del proyecto y ejecutar la siguiente orden para instalar la libreria:
# ./setup.py install
El siguiente paso necesario será descarganos un par de registros de ejemplo desde el proyecto de RegRipper donde poder usar la libreria. Con estos dos pasos ya tenemos el entorno listo y ejemplos con los que trabajar.

Para poder trabajar lo único que deberemos hacer es crear un fichero python con el siguiente código:
#!/usr/bin/python

import sys
from Registry import Registry

reg = Registry.Registry(sys.argv[1])
Con este código ya tendremos todo listo para trabajar sobre un fichero del registro, el cual será pasado como argumento al programa.

Como primer ejemplo vamos a crear un pequeño script que liste todos los valores de un registro donde se almacenan todos los programas que se ejecutan durante el arranque de Windows. El registro se encuentra en el fichero "SOFTWARE" en la key "Microsoft\\Windows\\CurrentVersion\\Run". Para ello solo se tendrá que añadir al final del fichero creado con anterioridad lo siguiente:
key = reg.open("Microsoft\\Windows\\CurrentVersion\\Run")
for value in key.values():
        print "\tName: " + value.name() + ", Path: " + value.value()
Como vemos, se indica al registro que habrá la key "Run" y que imprima todos los valores asociadas a esa Key. Siendo un poco princesitas deberíamos usar Try/Exception para evitar fallos futuros, con lo que el script quedaría tal que así:
#!/usr/bin/python
# -*- encoding: utf-8 -*-
"""
    Joaquín Moreno Garijo @moxilo
    Startup Windows Progams
"""
import sys
from Registry import Registry
reg = Registry.Registry(sys.argv[1])
print "\nStartup Programs (SOFTWARE FILE)..."
try:
    key = reg.open("Microsoft\\Windows\\CurrentVersion\\Run")
    for value in key.values():
            print "\tName: " + value.name() + ", Path: " + value.value()
except Registry.RegistryKeyNotFoundException:
    print "\t Nothing to do here"
Si lo ejecutamos contra el registro de ejemplo descargado con anterioridad, por ejemplo el de Vista, nos mostraría lo siguiente:


Otro ejemplo de la librería seria acceder a ciertos valores del registro para obtener solo la información que nos pudeira interesar, como por ejemplo la información del sitema operativo:
#!/usr/bin/python
# -*- encoding: utf-8 -*-
"""
    Joaquín Moreno Garijo @moxilo
    Info Windows
"""
import sys
from Registry import Registry
reg = Registry.Registry(sys.argv[1])
print "\nSystem information (SOFTWARE FILE)..."
try:
    key = reg.open("Microsoft\\Windows NT\\CurrentVersion")
    print "\tProduct name: " + key.value("ProductName").value()
    print "\tCurrentVersion: " + key.value("CurrentVersion").value()
    print "\tServicePack: " + key.value("CSDVersion").value()
    print "\tProductID: " + key.value("ProductId").value() + "\n"
except Registry.RegistryKeyNotFoundException:
    print "\tNothing in " + path
 Donde al ejecutarlo sobre el registro de ejemplo de un Windows 7 daría como resultado lo siguiente:


Como vemos la libreria es bastante sencilla de usar y puede servirnos para forense en Windows en caso que tengamos que revisar ciertos registros y nos sintamos más comodos usando Python que Perl.

Pra finalizar indicar que en el directorio samples de la librería tenemos varios ejemplos de uso de la misma para cosas realmente interesantes como busquedas de ciertas "Keys", "shellbags", incluso un lector gráfico del registro llamado "regview.py" que funciona de maravilla:


 Espero que os sirva para futuros forenses. 

¡Arriba Boston! ¡Copley aguanta!

No hay comentarios:

Publicar un comentario