Buscar este blog

martes, 3 de septiembre de 2013

EnScrip para información de usuario local

Para los que quieran obtener la información que acabo de explicar en post Lance Mueller me ayudo a crear un Enscript para EnCase V6  que extrae esta información del archivo SAM y nos dice si hay o no hash LM o NT almacenado y cual es junto con información de la cuenta a la que pertenece. 
Si desean este Enscript solo contáctenme para que se los pueda enviar.

saludos  

La importancia del registro de Windows parte I

Como se dijo en el post anterior ahondaríamos mas en el tema del registro de Windows así que comencemos por definir breve mente que e el registro y  que partes de el nos interesan como parte del análisis forense,  el registro de Windows es una base de datos jerárquica  en la que se almacenan los ajustes de configuración y opciones de Windows  este registro es utilizado por el kernel, los controladores de dispositivos,los servicios, el SAM, la interfaz del usuario y las aplicaciones de terceros. El registro contiene dos elementos básicos: claves y valores:
Las claves son similares a carpetas: ademas de lo valores cada clave puede contener sub claves que pueden contener otras sub claves, en si dentro de estas claves y valores encontraremos configuraciones y opciones del sistema operativo y que el usuario ha realizado sobre el mismo. 
Dependiendo de la versión de sistema operativo que utilicemos las carpetas del sistema se almacenaran en distintas rutas de acceso sin embargo para Windows 2000, XP, Server 2003, Vista, Windows 7 y Windows 8, cuatro de los cinco ficheros que mas nos interesan en una investigación se encuentran en la soguiente ubicacion %SystemRoot%\System32\Config\:  en las siguientes sub llaves:

  • SAM - HKEY LOCAL MACHINE\SAM
  • SECURITY - HKEY LOCAL MACHINE\SECURITY
  • SOFTWARE- HKEY LOCAL MACHINE\SOFTWARE
  • SYSTEM- HKEY LOCAL MACHINE\SYSTEM

Es muy importante saber en donde están almacenados estos registros y que contienen, en el post anterior hablábamos acerca de forensic explorer y de sus geniales capacidades, esta herramienta no es la única que te da información importante del registro de forma automática esta EnCase, esta Regripper incluso el registro puede ser visto por medio de regedity  otras mas,sin embargo en la parte del registro de Windows así como en la mayoría de los procesos que nuestras herramientas de análisis nos entregan de forma automática es imperante saber de donde fue obtenida esa información, en que formato, de que forma, he estado en casos en que se le ha preguntado al examinador de donde vino esa información que esta presentando como evidencia y su respuesta es " ejecute un proceso en mi herramienta de análisis y eso fue lo que salio" es por eso que trataremos de ahondar un poco mas en cada una de estas subclaves del registros para entender que evidencia podemos encontrar y en que formato se encuentran, esto lo estaré presentando en la V7 de EnCase sin embargo las ubicaciones y formatos son los mismos sin importar la herramienta de su elección.

A continuación se muestra la información según es presentada en EnCase:
Imagen 1.1 se resaltan los elementos de interés del registro de Windows dentro de EnCase v7

Imagen 1.2 barra de GPS de EnCase muestra la ubicación de los archivos.

Si ven la imagen  debajo de cada elemento del registro resaltado en amarillo hay archivos como SAM.LOG, SAM.LOG1 etc... estos archivos son utilizados por el registro de Windows para almacenar rastros de algunos cambios que se le han hecho al registro y por lo general verán mas de uno, es decir por lo general verán un .LOG un .LOG1 y .LOG2 

Comencemos analizando el archivo SAM  en cual el principal componente que vamos a encontrar aqui es el SID de los usuarios de esta maquina, el SID o Securidty Identifier es un numero único e irrepetible que identifica a un usuario dentro de un sistema de Windows, esto ancla una cuenta de por vida con un SID y todas las propiedades de esa cuenta incluido el nombre de la cuenta, esto es importante conocerlo por que Windows da o niega acceso y privilegios dentro de un sistema basado  en ACL`s o listas de control de acceso, estos ACL`s utilizan los SID`s para identificar de manera única a un usuario y los privilegios asociados con esta cuenta y grupo. Cuando cualquier usuario ingresa al sistema se genera una llave de acceso o un token de acceso, esa llave contiene el SID y junto con ello el nivel de privilegios que con los que el usuario cuenta, cuando un usuario solicita acceso a algún recurso del sistema, la llave de acceso o token es comparada con el ACL para permitir o negar una la petición. 
Para definir la estructura del SID utilizare como ejemplo el siguiente valor:

S-1-5-21-3673799116-2244488351-3003903782-500

S- nos indica que es un string de SID
1- el nivel de revisión
5- el identificador de valor de autoridad o authority value no siempre sera 5 entre otros valores que se pueden encontrar están los siguientes:
       0- sin autoridad
       1- autoridad global
       2- autoridad local
       3- autoridad de creador
       4- autoridad no única
       5- autoridad NT
       9- autoridad de administrador de recursos
21-3673799116-2244488351-3003903782- el dominio en el que se encuentra el sistema  o el identificador local de la computadora.
500- un ID único para cada cuenta, aquí también podemos encontrar lo que se conoce como RID o relative identifier el cual es un numero que varia en su longitud, cualquier grupo o usuario que no se cree de manera predeterminada recibirá un RID de 1000 o mayor. en este caso es 500 esto se debe a que este SID representa la cuenta de un administrador, este valor de 500 sera SIEMPRE el mismo en cualquier cuenta de administrador así como también el valor 501 representa el SID de una cuenta Guest estos valores se encuentran en cada uno de nuestros sistemas y al momento de efectuar un análisis forense es de vital importancia conocer sobre que cuenta nos enfocares y a quien pertenece esa cuenta. en EnCase y otras herramientas podemos encontrar este valor representado en hexadecimal en la siguiente ruta:
SAM\Domains\Account|Users
En esta subllave podemos encontrar varios valores que están expresados en Hexadecimal  
Imagen 1.3 estructura de carpetas que muestra el SID de las cuentas en hexadecimal


Estos valores son fácilmente interpretados traduciendo de hexadecimal a decimal es decir el valor 1F4 en hexadecimal equivale al valor 500 decimal, es decir la cuenta que esta seleccionada representa la cuenta del administrador.Para comprobar la información que hemos descrito en cuanto a los SID`s  por linea de comando abran una terminal en su sistema de Windows e introduzcan el siguiente comando: "wmic useraccount get name,sid" ahora pueden visualizar los usuarios que has sido creados  y sus correspondientes SID`s.

imagen 1.4 terminal en el que se ven las cuentas y sus respectivos SID`s 

ya dentro de cada una de las cuentas encontraremos dos valores F y V tal y como se muestra a continuación:

imagen 1.5 se muestran los valores F y V dentro de la cuenta de administrador

  Estos valores contienen información importante de la cuenta y el usuario al cual están ligadas el valor F es un dump de C el cual tiene una longitud de 80 bytes y contienen información como: 
  • ultima fecha de logon
  • ultima fecha en que se estableció la contraseña
  • cuando expira la cuenta (en caso de que este definido este parámetro)
  • ultima vez que se introdujo la contraseña de forma errónea
  • numero de usuario (almacenado en reverse hex)
  • información de si la cuenta esta activa o no
  • código de país
  • conteo de las veces que se ha introducido la contraseña incorrecta
  • numero de veces que el usuario ha realizado un logon
Tomemos como ejemplo mi cuenta de administrador para revisar esta información, una vez dentro de la cuenta veamos en hexadecimal el valor F para identificar y decodificar la información antes mencionada:
imagen 1.6 valor F en vista hexadecimal
Comencemos identificando la ultima fecha de logon de este usuario para el caso de EnCase lo que haré sera seleccionar el valor de mi fecha/hora y lo decodificare con un formato de fecha/hora de Windows local time este valor comienza después de los primeros 8 bytes (los cuales aun no se que representan pero si alguien lo sabe con todo gusto dígame para actualizar el post y agradecerles) el valor que buscamos tiene una longitud de 8 bytes  :


Imagen 1.7 ultima fecha de Logon (8 bytes)

imagen 1.8 se muestra la fecha de ultimo ingreso al sistema  decodificada en EnCase

Después tenemos 8 bytes de padding, o relleno(\x00) y a continuación los siguientes 8 bytes representan la ultima ocasión en que se restableció la contraseña para esa cuenta, en un ambiente institucional encontraran fechas no muy antiguas, esto se debe a que la mayoría de las instituciones y compañías utilizan una política de active directory para restablecer al contraseña cada determinado tiempo. 
imagen 1.9 se muestran los 8 bytes que representan la ultima fecha/ hora en que se cambio la contraseña

imagen 1.10 se muestra la fecha/hora en que se cambio por ultima vez la contraseña

La diferencia de los 8 bytes siguientes es que estos no son de relleno, sino representan si esta cuenta que tenemos expira o no, lo confuso aquí es que si solo vemos valores de "00"  quiere decir que esta cuenta no esta configurada para expirar, cabe mencionar que este valor esta almacenado en formato NT 
imagen 1.11 se muestra el valor NULL para la expiracion de la cuenta

Los siguientes 8 bytes corresponden a la fecha/hora de la ultima vez en que una contraseña se introdujo incorrectamente. si los 8 bytes se encuentran representados por "00" significa que nunca se ha ingresado una contraseña errónea.
imagen 1.12 se muestran los 8 bytes que representan la fecha/hora de la ultima vez que una contraseña incorrecta fue introducida.

imagen 1.13 se muestra la hora/ fecha decodificada para la ultima contraseña errónea ingresada.

Los  siguientes 4 bytes representan nuevamente el identificador de la cuenta es decir 500 si es un administrador 501 si es la cuenta de guest  y 1000 en adelante para los usuarios creados en el sistema este valor se encuentra almacenado en reverse hex es decir, basta con invertir el orden de los bytes que se muestran para obtener el identificador de la cuenta.

imagen 1.14 aqui se muestra el valor de F4 01 00 00 para poder obtener el numero correcto es necesario invertir el orden de como aparecen los bytes.

imagen 1.15  al invertir los valores se obtiene el valor de 500 que es el valor de la cuenta que estamos utilizando como ejemplo

Los siguientes 4 bytes tienen el mismo valor "01 02 00 00" en todas las llaves F que he visto sin embargo aun no he podido definir ni encontrar una explicación de lo que estos bytes representan, sin embargo el siguiente byte es algo raro ya que en el mismo byte hay dos valores diferentes:

imagen 1.16 en la imagen se muestra el byte antes mencionado ubicado en el FO 56

El primer bit de ese byte describe algo que los examinadores forenses no estamos muy seguros, he tratado de investigar mas a fondo lo que yo había visto en mis casos o las pruebas que realizamos sin embargo la información sigue muy ambigua pero puede representar según el valor mostrado lo siguiente:

0/2/6/8/A/C/E= la contraseña o el usuario son inválidos 
1/3/4= logon okay
5/7/D/F= al tratar de iniciar sesión se mostrara un mensaje que dice < The system cannot log you on due to the following error: The account used is an interdomain trust account. Use your global usser account or local user account to access this server. Please try again or consult your system administrator.> 
9= al tratar de iniciar sesión se mostrara un mensaje que dice: < The systema cannot log you on due to the following error: The account used is a computer account. Use your global usser account or local user account to access this server. Please try again or consult your system administrator.>

El segundo bit de este byte representa si esta cuenta esta activa o no esto lo hace por medio de el valor "0" que representa que la cuenta esta activa o el valor "1" que marca a la cuenta como inactiva. en base a la imagen 1.16 y a los valores explicados podemos determinar que la cuenta tiene un logon okay y esta activa.

El siguiente byte (FO 57) contiene un único valor en el segundo bit que nos indica si la contraseña contiene alguna política de caducidad  o no, esto se representa con los siguientes valores:
0= Secpoltime (security policy time) esto es mas común en las empresas en donde se maneja un active directory y la política para cambiar la contraseña de forma periódica esta activa, 
2= La contraseña nunca expira.

imagen 1.17 se muestra que esta cuenta esta configurada para que la contraseña nunca expire esto representado por el valor "2" en el segundo bit del FO 57

Los siguientes dos bytes (FO 58 y 59) no contienen información alguna, los siguientes dos bytes (FO 60 Y 61) contienen el código de país almacenado en hexadecimal inverso. este valor puedo o no estar configurado en tal caso el valor sera  "00 00".
imagen 1.18 se muestra el valor "00 00" para el código de país en la cuenta ejemplo

Los dos siguientes bytes no contienen información alguna (FO 62 y 63), los dos siguientes bytes (FO 64 y 65) almacena un contador de las veces que una contraseña ha sido mal introducida, es importante recalcar que este contador es reseteado a "0" cuando se realiza un login correcto. 
imagen 1.19 se muestra el contador con el valor de "0"

Los dos siguientes bytes (FO 66 y 67) contienen información del numero total de veces que el usuario ha hecho login esta información esta almacenada en hex inverso. 
imagen 1.20 se muestra el numero de logins totales para la cuenta ejemplo. para obtener el valor total es necesario invertir el orden de los bytes y convertir de hexadecimal a deciamal.
imagen 1.21 se muestra la conversión de hex inverso a decimal para obtener el numero total de logins de la cuenta ejemplo.


De este conjunto de bytes hasta el final del archivo ya no existe información que sea de utilidad para nuestra investigacion. 

Así que como pueden ver la calidad y el tipo de evidencia que se puede obtener solo de este valor es mucha y muy valiosa, parte de nuestras metodologías de análisis deberían incluir el análisis del registro de Windows sobre todo un análisis profundo de la información del usuario que estemos analizando.

Pasando a la subllave V este es un registro mucho mas grande y nos llevaría mucho tiempo analizar cada una de las entradas que contiene este valor, así que mencionare la información que podrían encontrar dentro de este registro y nos enfocaremos únicamente a un valor en especifico que es el hash de la contraseña del usuario.
En este registro hay mucha información acerca de las cuentas como:
  • nombre de usuario 
  • nombre completo
  • homedir
  • scriptpath
  • permisos
  • nombre de grupo
Sin embargo en esta ocasión nos enfocaremos en que aquí esta almacenado el hash de la contraseña, es importante entender que Microsoft no almacena nunca contraseñas en texto plano, para obtener estos hashes Windows NT utiliza dos algoritmos, LM que se ha heredado de las redes de Lan Manger (ya no se almacena de forma predeterminada en Windows Vista, 7 y 8, para ello es necesario cambiar ciertas propiedades de seguridad) que esta basado en un cifrado DES y el segundo algoritmo es NT  que esta basado en una función de hasheo de MD4, en la cuenta que estamos utilizando como ejemplo podemos ver los hashes de contraseñas tanto el hash LM como el NT:
Empezando desde el inicio del archivo de la llave V contemos 156 bytes los siguientes 4 bytes marcan en hexadecimal el offset en el que se encuentra el hash de LM en nuestro ejemplo vemos que después de los 156 bytes tenemos el valor 70 01 00 00 que equivale a 368 en decimal, recordemos que estos valores están almacenados en un valor relativo a 204 así que al valor obtenido de 368 le sumamos 204 y esto debería darnos el FO en el que inicia el encabezado de nuestro hash LM, ahora los siguientes 4 bytes son muy importantes esto se debe a que nos indican la longitud del hash que esta almacenado, este valor sera 04 00 00 00 lo que indicaría que únicamente el encabezado esta almacenado en 4 bytes en cambio si el valor es 14 00 00 00 indicaría que  la longitud del hash es de 14 en hexadecimal, 20 en decimal esto es 4 bytes para el encabezado 04 00 01 00 mas los 16 bytes de longitud del hash. 

imagen 1.22 
En cuanto al Hash NT este comienza del inicio de la subllave V y despues de 168 bytes encontramos 4 bytes que indican el FO en donde comienza el encabezado del hash NT y 4 los siguientes 4 bytes en el caso de nuestro ejemplo encontramos el valor  14 lo que indica que la longitud del has sera de 20 bytes, en nuestro ejemplo  se muestra el valor 74 01 00 00 en hexadecimal lo que equivale a 372 este valor mas 204 nos da un total de  576 que es el FO en donde comienza el encabezado del  hash NT. 

imagen 1.23 

Si bien en nuestro ejemplo no existe un hash LM el cual es importante saber que este hash es el mas vulnerable y es sencillo descifrarlo hay muchas herramientas y tutoriales que muestran como descifrar este hash y como realizar un bypass de Windows. 

Quiero agradecer a un gran amigo y maestro, Lance Mueller por haberme ayudado a escribir esta parte de la subllave V gracias a su ayuda y experiencia es que pude entender y escribir esta parte.

Este es el final de la primera parte de este post en la que hablaremos de los elementos que componen el registro de Windows. espero les haya gustado y que les sea de ayuda en sus investigaciones, cualquier comentario como siempre es bienvenido.