Analisis forense de perfiles de usuario en Windows. Introducción a las Shellbags

Hola,

Tal y como comenté hace algunos días mismo con los amigos @loopback1984 y @pablo_burgos_sc hoy toca una entrada que tiene que ver con la estructura de los perfiles de usuario en sistemas Windows.

Desde el punto de vista del análisis forense, las plataformas Windows no son sencillas. Al contrario de lo que se suele creer, son sistemas con una complejidad manifiesta, donde por la naturaleza del sistema y su modelo de código existen funciones que no están documentadas y donde existen infinidad de artefactos de los que es posible recoger las evidencias que necesitamos en cada caso. Para añadir dificultad, muchas de estas evidencias pueden ser recogidas individualmente pero necesitarán posteriormente una correlación para poder establecer una línea temporal o un patrón comportamental. Uno de esos muchos artefactos, o conjunto de artefactos, son las llamadas shellbags.

El propósito de este articulo es ofrecer una visión introductoria a los perfiles de usuario y los procedimientos específicos para realizar un análisis sobre los artefactos relacionados. No pretende ser una revisión en profundidad del registro de Windows, para lo cual recomiendo Windows Registry Forensics de Harlan Carvey, ni tampoco la reinvención de la rueda en un tema que ya tiene suficiente prensa y que esta muy bien tratado en general. En este articulo hablaremos de shellbags y ejemplificaremos como analizarlas para obtener un conocimiento elemental que nos permita en un futuro realizar actividades similares en otros elementos del registro.

Nos centraremos en herramientas gratuitas y de código abierto que cualquier de vosotros puede probar en sus propias instalaciones aunque existen herramientas comerciales que ofrecen excelentes resultados igualmente. Nos centraremos en un ejemplo real de Windows XP, con lo que si estás en una plataforma distinta, acude a tu buscador y encuentra las diferencias para cada caso, especialmente si estás en Windows 7.

Shellbags. Definicion

El concepto de shellbags se puede resumir como aquellos lugares donde el sistema operativo almacena información relacionada con las preferencias de visualización de contenidos en Windows Explorer, tales como tamaño de la ventana, la posición de la misma en la pantalla, modo de visualización y elementos visibles por citar algunos ejemplos. SI quieres ver a las shellbags en acción, nada mas fácil que hace doble click en «Mi PC», cerrar la ventana y volver a abrir. Las preferencias de visualización se han guardado, y por ese motivo la ventana se abre en el mismo sitio, con el mismo tamaño y con los mismos modos de visualización (detalles, lista, iconos grandes, pequeños, etc)

El interés forense de las shellbags emana de su naturaleza. Solo existen si una ventana se ha abierto y cerrado al menos una vez, con lo que pueden ser utilizadas para trazar la actividad de los usuarios. Esto es debido a la información que almacenan, lo que incluye los timestamps temporales que pueden finalmente hacernos entender si un sujeto determinado abrió o no una determinada carpeta en una fecha y hora determinada.

En el caso de Windows XP, que es el sistema empleado en este artículo, las shellbags son principalmente dos:

HKEY_USERS\\Software\Microsoft\Windows\Shell
HKEY_USERS\
\Software\Microsoft\Windows\ShellNoRoam

Ambas son idénticas en estructura, siendo la única diferencia que la primera almacena información relacionada con carpetas remotas (roaming) y la segunda custodia información relacionada con contenidos locales (sin roaming)

Dentro de este esquema, el registro del perfil de usuario se almacena en un fichero llamado NTUSER.DAT, el cual se mapea a la porción del registro que existe en HKEY_CURRENT_USER cada vez que el usuario inicia sesión. El fichero NTUSER.DAT contiene multitud de datos útiles para el sistema que tienen que ver con el perfil del usuario que está en ese momento empleando una sesión, como por ejemplo, datos de configuración de Windows Explorer, conexiones de red persistentes, ajustes de la barra de tareas, conexiones de impresoras en red, ajustes realizados en el panel de control, ajustes de aplicaciones que empleen el registro y la información de configuración de ciertos accesorios, como la calculadora, el reloj, Paint, etc.

Veremos algunos ejemplos sobre cómo estudiar el fichero NTUSER.DAT a continuación. Primero una nota aclaratoria sobre este fichero

Obtención del fichero NTUSER.DAT

Cualquiera que haya intentado acceder a este fichero habrá notado que no es un fichero que podamos manipular con libertad. Este fichero, en Windows XP, reside bajo la carpeta del usuario en cuestión que se encuentra dentro de «Documents and settings» y existen dos modos principales de hacerse con él

  • Ejecución en vivo, con alguna herramienta como ERUNT o cualquier otra que permita parsearlo y guardarlo a fichero, como Windows ShellBag Parser
  • Obtención de una imagen forense, que será el procedimiento habitual, en el cual, al no estar el sistema en ejecución, es posible manipular y estudiar el fichero a nuestra conveniencia sin que el sistema lo impida.

Sea como fuere, el objetivo no es otro que poder acceder a los contenidos que se encuentran en dicho fichero, con lo que dependiendo del caso, optaremos por un método u otro.

Herramientas RegRipper

Otra de las utilidades más conocidas para acceder a los contenidos de cualquier elemento del registro es RegRipper, un conjunto de herramientas diseñadas específicamente para estos menesteres. Pueden ser obtenidas en http://code.google.com/p/winforensicaanalysis/downloads/list.

RegRipper es código abierto y es el estándar de facto a la hora de atacar análisis forense en cualquier porción del registro por su versatilidad, su foco en el análisis forense y su coste nulo. Las creó y mantiene Harlan Carvey, autor del libro que os recomiendo en la introducción, y están articuladas con una útil estructura de plugins que permitirán en cada caso seleccionar la tarea de análisis que más nos pueda interesar en una aproximación modular y repetible.

Empleando Perl para acceder a los contenidos de NTUSER.DAT

Una manera cómoda de acceder a NTUSER.DAT, una vez aislado del sistema, es emplear módulos Perl, como por ejemplo Parse::Win32Registry. Al tratarse de scripts es posible el procesamiento en lote y la construcción de patrones específicos que permitan analizar en poco tiempo gran cantidad de información. Existen dos scripts conocidos que resultarán especialmente útiles:

regdump.pl, que permite volcar los contenidos del fichero, y cuyo código es el siguiente:


use strict;
use warnings;

binmode(STDOUT, ':utf8');

use File::Basename;
use Getopt::Long;
use Parse::Win32Registry;

Getopt::Long::Configure('bundling');

GetOptions('quiet|q'   => \my $quiet,
           'recurse|r' => \my $recurse);

my $filename = shift or die usage();
my $initial_key_name = shift;

my $registry = Parse::Win32Registry->new($filename);
my $root_key = $registry->get_root_key;

if (defined($initial_key_name)) {
    $root_key = $root_key->get_subkey($initial_key_name);
    if (!defined($root_key)) {
        die "Could not locate the key '$initial_key_name' in '$filename'\n";
    }
}

traverse($root_key);

sub traverse {
    my $key = shift;

    # Put a gap between keys if we are displaying values
    print "\n" if !$quiet;

    print $key->as_string, "\n";
    
    # Display names of subkeys if we are not descending the tree
    if (!$recurse) {
        foreach my $subkey ($key->get_list_of_subkeys) {
            print "..\\", $subkey->get_name, "\n";
        }
    }
    
    # Display values unless this has been suppressed
    if (!$quiet) {
        foreach my $value ($key->get_list_of_values) {
            print $value->as_string, "\n";
        }
    }
    
    if ($recurse) {
        foreach my $subkey ($key->get_list_of_subkeys) {
            traverse($subkey);
        }
    }
}

sub usage {
    my $script_name = basename $0;
    return <  [subkey] [-r] [-q]
    -r or --recurse     traverse all child keys from the root key
                        or the subkey specified
    -q or --quiet       do not display values
USAGE
}

regfind.pl, que permite ejecutar búsquedas de cadenas en el registro. El código es el que se muestra:

use strict;
use warnings;
no warnings 'utf8';

binmode(STDOUT, ':utf8');

use File::Basename;
use Getopt::Long;
use Parse::Win32Registry;

Getopt::Long::Configure('bundling');

GetOptions('key|k'   => \my $search_keys,
           'value|v' => \my $search_values,
           'data|d'  => \my $search_data);

my $filename = shift or die usage();
my $regexp = shift or die usage();

if (!$search_keys && !$search_values && !$search_data) {
    warn usage();
    die "\nYou need to specify at least one of -k, -v, or -d\n";
}

my $registry = Parse::Win32Registry->new($filename);
my $root_key = $registry->get_root_key;

traverse($root_key);

sub traverse {
    my $key = shift;
    
    if ($search_keys) {
        foreach my $subkey ($key->get_list_of_subkeys) {
            if ($subkey->get_name =~ /$regexp/oi) {
                print "KEY\t", $subkey->get_path, "\n";
            }
        }
    }
    
    if ($search_values || $search_data) {
        foreach my $value ($key->get_list_of_values) {
            if ($search_values && $value->get_name =~ /$regexp/oi) {
                print "VALUE\t", $key->get_path, "\\", $value->as_string, "\n";
            }
            if ($search_data && $value->get_data =~ /$regexp/oi) {
                print "DATA\t", $key->get_path, "\\", $value->as_string, "\n";
            }
        }
    }
    
    foreach my $subkey ($key->get_list_of_subkeys) {
        traverse($subkey);
    }
}

sub usage {
    my $script_name = basename $0;
    return <  < search -string> [-k] [-v] [-d]
    -k or --key       search key names for a match
    -v or --value     search value names for a match
    -d or --data      search value data for a match
USAGE
}

Un ejemplo sobre análisis de perfil de usuario

Imaginemos que el investigador está tratando de localizar la posible visualización de un fichero llamado secretos.txt. Si lanzamos RegRipper contra el fichero NTUSER.DAT obtendremos un informe con todas las entradas del mismo. He aislado NTUSER.DAT en mi propia máquina, y he aislado las porciones relacionadas con este fichero. Son las siguientes:

regripper

En este informe vemos, y por orden, tres entradas de NTUSER.DAT que pueden posicionar al investigador. La primera hace referencia a los documentos recientes, con tres MRUs que indican el fichero que estamos tratando de posicionar, una copia del mismo y una tercera entrada que como veremos en el tercer registro, es la carpeta que contiene esas entradas. El segundo es una porción de los documentos recientes que tienen extensión .txt, y en tercer lugar tenemos una entrada de las carpetas dentro de los documentos recientes.

Con esta información el investigador puede obtener claridad sobre que es cierto que el usuario ha abierto la carpeta y los ficheros enumerados. Acompañan los timestamps, que pueden ser empleados para efectuar otras correlaciones, como por ejemplo, si estos ficheros se han movido a llaves USB, o si han sido enviados por Webmail.

¿Y con nuestros scripts Perl?

La información obtenida sería idéntica. Si empleamos regfind.pl sobre el fichero NTUSER.DAT, obtendríamos todas las entradas que contienen la cadena «secretos». Por simplificar adjunto dos de las mismas, que servirán para ejemplificar que como no podía ser de otro modo, la información es exactamente la misma, ya que procede de la misma fuente:

regfind

Esta última entrada (3) concuerda a la perfección con los datos que podríamos visualizar directamente en el registro, por ejemplo, empleando el editor del registro (Regedit)

regedit

También, como no podía ser de otro modo, la correlación con la información de RegRipper es idéntica. Para el caso de $$$PROTO.HIV\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs\.txt\3 tendríamos que acudir a la MRU enumerada como 3 en la ejecución de RegRipper, que es precisamente, 3 = Copy of mis_secretos.txt, Lo mismo sucede para $$$PROTO.HIV\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs\78, ya que la MRU 78 de los documentos recientes es en RegRipper, tal y como se puede comprobar, 78 = Copy of mis_secretos.txt

Recordemos que la información sólo se guarda si se han abierto los contenidos al menos una vez, con lo que el investigador tendría claro que la carpeta «Secretos» y los ficheros «mis_secretos.txt» y «Copy of mis_secretos.txt» han sido abiertos al menos una vez en la máquina del sospechoso. Como se han obtenido los timestamps, es posible localizar eventos de interés en las proximidades en el tiempo, tal y como se ha explicado anteriormente, como por ejemplo, transferencia vía Samba, envío a USB, carga en Webmail, etc.

Un saludo, y espero que esta información os sea útil.