#cybercamp17 · [in] prrp_unicode_string lpclass, ... • para hacer llamadas rpc seguras, se debe...
Post on 27-Sep-2018
215 Views
Preview:
TRANSCRIPT
• 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
¿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
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
• 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
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…
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
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
• 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
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!
¿Preguntas?shramos@protonmail.com
@santiagohramos
https://github.com/shramos/winregmitm
top related