38
#CyberCamp17 WinregMITM Simple Injection and Remote Fileless Payload Execution

#CyberCamp17 · [in] PRRP_UNICODE_STRING lpClass, ... • Para hacer llamadas RPC seguras, se debe construir un contexto de seguridad • El alcance es la conexión • Intercambio

Embed Size (px)

Citation preview

#CyberCamp17

WinregMITMSimple Injection and Remote Fileless

Payload Execution

• Santiago Hernández

• Security Researcher en 11paths

• ToorCon SanDiego, Navaja Negra, No cON Name,

Black Hat Europe…

@santiagohramos

About me

• Gestión remota de almacenes jerárquicos de datos: Registro de Windows

• Protocolo cliente/servidor

• Dependiente de RPC y SMB en el transporte de paquetes

Protocolo de Registro Remoto de Windows

IP/TCP/NetBIOS/SMB2/DCE-RPC/WINREG

Relación con otros protocolos

¿Cómo es una sesión?

1. El cliente inicia una petición de conexión al servidor

2. El servidor autoriza la petición

3. El cliente solicita la apertura de una clave en el servidor

4. El servidor responde con un RPC context handleque referencia la clave

5. El cliente utiliza el handle para operar en la clave

6. El cliente envía la operación que desea realizar y los parámetros asociados

7. El servidor responde a la petición con la información solicitada

¿Cómo es una sesión?

Operación OpnumBaseRegCreateKey 6

BaseRegDeleteKey 7

BaseRegOpenKey 15

BaseRegDeleteValue 8

BaseRegSetValue 22

BaseRegFlushKey 11

Métodos RPC

El servidor abre una clave y envía el handle al cliente

error_status_t BaseRegOpenKey( [in] RPC_HKEY hKey, [in] PRRP_UNICODE_STRING lpSubKey, [in] DWORD dwOptions, [in] REGSAM samDesired, [out] PRPC_HKEY phkResult);

BaseRegOpenKey

error_status_t BaseRegSetValue( [in] RPC_HKEY hKey, [in] PRRP_UNICODE_STRING lpValueName, [in] DWORD dwType, [in, size_is(cbData)] LPBYTE lpData, [in] DWORD cbData);

El servidor establece los datos enviados para un determinado valor de una clave de registro

BaseRegSetValue

error_status_t BaseRegCreateKey([in] RPC_HKEY hKey,[in] PRRP_UNICODE_STRING lpSubKey,[in] PRRP_UNICODE_STRING lpClass,…

El servidor crea la clave y retorna un handle que la referencia

BaseRegCreateKey

Integridad del protocolo

Apertura de HKEY_CURRENT_USER

https://msdn.microsoft.com/en-us/library/cc243713.aspx

• Para hacer llamadas RPC seguras, se debe construir un contexto de seguridad

• El alcance es la conexión

• Intercambio de mensajes bind/bind_ack con info de autorización entre el cliente RPC y el servidor

• Si hay un error: Fault PDU y cierre de conexión

• Cuando el contexto esta construido puede ser utilizado por RPC y otros protocolos para tomar decisiones de autorización

https://msdn.microsoft.com/en-us/library/cc243630.aspx#gt_8a7f6700-8311-45bc-af10-82e10accd331

Contexto de seguridad

https://msdn.microsoft.com/en-us/library/cc243724.aspx

Contexto de seguridad

• El cliente comienza solicitando al proveedor de seguridad (NTLM) un token de autorización

• Este token representa la identidad del cliente y puede ser utilizado para tomar decisiones de autorización

• Adicionalmente RPC puede utilizar el contexto de seguridad para crear una cadena lógica de información protegida contra la manipulación y divulgación de la misma.

https://msdn.microsoft.com/en-us/library/cc243630.aspx#gt_05fd3925-0672-4f24-9dd9-2b9d441eb333

Proveedor de seguridad

http://pubs.opengroup.org/onlinepubs/9629399/chap13.htm

Nivel de protección Descripción

dce_c_auth_level_none (1) No se establece ninguna protección

Dce_c_auth_level_connect (2) Proporciona una verificación de las identidades del cliente y del servidor, protege contra ataques de “reply”, pero no se aplican las medidas por PDU

Dce_c_auth_level_call (3) Proporciona integridad para el primer fragmento de cada llamada

Dce_c_auth_level_pkt (4) Proporciona protección contra ataques “reply” y de desorden a nivel de PDU pero no protege contra modificación a nivel PDU.

Dce_c_auth_level_pkt_integrity (5) Proporciona integridad (firma) a nivel de PDU

Dce_c_auth_level_pkt_privacy (6) Proporciona integridad (firma) y confidencialidad (cifrado) por PDU

Niveles de autenticación

Apertura de HKEY_CURRENT_USER

Integridad del protocolo

Nivel autenticación PDU

Nivel autenticación PDU

https://msdn.microsoft.com/en-us/library/cc243713.aspx

Nivel autenticación PDU

Nivel autenticación PDU

The dce_c_authn_level_none Protection LevelThe auth_value is null; the entire authentication verifier may be omitted.http://pubs.opengroup.org/onlinepubs/9629399/chap13.htm

Nivel autenticación PDU

1. Cuando el cliente inicia la conexión con el servidor mediante el Protocolo de Registro Remoto, se le asocia un contexto de seguridad con un nivel de auth 6 (Dce_c_auth_level_pkt_privacy)

2. En la primera interacción con el registro de la máquina remota se produce un error que fuerza a desechar el contexto de seguridad

3. El cliente inicia una nueva conexión esta vez solicitando al proveedor de seguridad un nivel de autenticación 1(dce_c_auth_level_none) lo que provoca que no haya ninguna protección de integridad ni confidencialidad sobre los PDU.

Recapitulando…

WinregMITMhttps://github.com/shramos/winregmitm

Ataque

1. Interceptar la comunicación entre el cliente y el servidor

2. Interceptar los paquetes y reenviarlos a espacio de usuario para que puedan ser filtrados y modificados por nuestra herramienta.

3. Filtrar algunos paquetes específicos e interpretar sus bytes

4. Modificar los campos que nos interesen

5. Recalcular todos los campos de control de la capa WINREG y las capas anteriores

6. Reconstruir el paquete y reenviarlo

USER SPACE

Cliente ServidorAtacante

WinregMITM

WinregMITM workflow

FIELD PACKET BYTESNETBIOS_LENGTH (1, 4)SMB2_DATA_LENGTH

(96, 100)

DCE_FRAG_LENGTH (132, 134)

NAME_LEN (168, 170)ACCESS_MASK Depends on the

packet typeNAME_SIZE (170, 172)MAX_COUNT (176, 180)ACTUAL_COUNT (184, 188)RRS_MAX_COUNT (196, 200)RRS_SIZE (-4, 4)

Kernel space

Nfqueue + iptables Kernel

space

Nfqueue + iptables

Scapy

WinregMITM

https://github.com/shramos/winregmitmhttps://github.com/secdev/scapy/tree/master/scapyhttp://www.netfilter.org/projects/libnetfilter_queue/index.htmlhttps://pypi.python.org/pypi/NetfilterQueue

WinregMITM workflow

¿Me estoy dejando algo?

• Herramienta más popular para acceder al registro de una máquina remota

• Modifico un paquete, recalculo todos los campos, reenvio el paquete y la sesión se rompe ¿Por qué?

Regedit

Cliente ServidorSeq=126, ack=269, [next seq=294]

Seq=269, ack=294, [next seq=433]

Seq=294, ack=433, [next seq=462]

Seq=433, ack=482, [next seq=600]

Paquete modificadoTamaño incrementado

Expected ack: 462Received ack: 482La sesión se rompe

Manteniendo viva la sesión TCP/IP

Next sequence number = Actual sequence number + TCP payload length (*)

(*) TCP payload length = length(IP) – length(IP.header) – length(TCP.header)

Cliente ServidorSeq=294, ack=433, [next seq=462]

Seq=433, ack=482, [next seq=600]

Paquete modificado, Tamaño incrementado

Aplicamos la correcciónSeq=433, ack=462, [next seq=530]

Aplicamos la corrección

Manteniendo viva la sesión TCP/IP

1. ARP spoofing entre el Cliente y el Servidor

2. Ejecutamos WinreMITM y empezamos a monitorizar la actividad del usuario en la máquina remota

3. Interceptamos y modificamos un paquete OpenKey y otro SetValue para insertar un payload en un rama determinada del registro de la máquina remota, en este caso: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

4. Cuando el usuario reinicie la máquina, se ejecutará nuestropayload, que realizará un Fileless UAC bypass devolviendouna conexión remota con máximos privilegios a la máquinaatacante.

DEMO!!!

• No siempre el Protocolo de Registro Remoto de Windows va sin cifrar y firmar.

• Hay dos casos de uso en relación con el cifrado y el control de integridad del protocolo:

1. La autenticación se realiza con un usuario con un nombre o una contraseña distinta que el de la maquina remota: Se debe proporcionar usuario y contraseña El nivel de autenticación es 1 (sin cifrado ni firma)

2. La autenticación se realiza con un usuario con el mismo nombre y contraseña que el de la maquina remota: No se requiere proporcionar el usuario y la

contraseña El nivel de autenticación es 6 (cifrado y firmado)

Esta no es toda la verdad…

• Fallo en el primer acceso al registro remoto, en la siguiente conexión se construye un contexto de seguridad con nivel de autenticación 1.

• No se produce ningún fallo, el contexto de seguridad con nivel de autenticación 6 se mantiene.

Nivel autenticación 1 vs 6

https://msdn.microsoft.com/en-us/library/cc243713.aspx

Forzando el contexto de seguridad

1. Extraemos los bytes de la capa DCE/RPC del paquete Fault que envía el servidor al cliente en las sesiones sin cifrar ni firmar.

2. Reemplazamos la capa DCE/RPC “al vuelo” del paquete donde el servidor acepta el nivel de autenticación 6 en una sesión con cifrado y firmado.

Que pasa si…

• Forzando el contexto de seguridad de una sesión que debería firmar y cifrar los paquetes para que vayan sin ningún mecanismo de seguridad.

DEMO 2!!!

¡Muchas gracias!

¿[email protected]

@santiagohramos

https://github.com/shramos/winregmitm

Gracias por su atención