
Marco de Fingerprinting de Herramientas de Seguridad Pasivas
¿Alguna vez has querido un bypass simple, fácil y sigiloso para múltiples clases de productos de seguridad? pstf^2 (se pronuncia pstf-square) es una implementación de un servidor HTTP capaz de realizar fingerprinting pasivo de navegadores, y podría ser justo lo que estás buscando. Cuando los atacantes intentan entregar un payload a través de internet, necesitan superar múltiples herramientas capaces de escanear enlaces entrantes. Filtros de correo electrónico, motores de escaneo e incluso el envío a un sandbox a través de URL: todo puede ser evadido una vez que pstf2 los detecta de forma pasiva. Una vez detectados, la herramienta permite diferenciar entre servicios de seguridad y víctimas potenciales y entregar una respuesta maliciosa o benigna.
Esta herramienta se presentó durante BlackHat EU 2020: https://www.blackhat.com/eu-20/arsenal/schedule/#pstf2-link-scanners-evasion-made-easy-21763
Los detalles de la investigación están disponibles en esta entrada de blog: https://blogs.akamai.com/sitr/2020/12/evading-link-scanning-security-services-with-passive-fingerprinting.html
La verdadera pregunta es: ¿cómo funcionan los escáneres de enlaces? Inspeccionar un enlace malicioso es una acción que implica que un cliente web envíe una solicitud HTTP GET. Cada proveedor utiliza una implementación interna diferente, la mayoría intentando imitar una interacción de usuario real hasta cierto punto. pstf^2 es un servidor HTTP simple basado en Python que aplica tácticas bien conocidas de detección de bots para determinar si una solicitud entrante proviene de una herramienta de seguridad automatizada. El operador del servidor puede personalizar las respuestas, por ejemplo: si se detecta un escáner, redirigir a Google; de lo contrario, enviar contenido malicioso.
A continuación se presentan las principales tácticas implementadas como parte de pstf^2:
Las herramientas de seguridad intentan ocultarse como clientes legítimos, haciéndose pasar por navegadores reales, sin embargo, normalmente este no es el caso. Es común ver herramientas que no se mantienen adecuadamente usando cabeceras de user-agent falsas para versiones de navegador que tienen una década de antigüedad. pstf^2 te permite establecer un umbral mínimo para lo que consideras una versión real no obsoleta.
Hay muchos tipos de implementaciones extrañas que la herramienta es capaz de detectar. Un par de ejemplos que se presentaron en la charla de BlackHat fueron:
via: que revelaba la naturaleza del host virtual utilizado para el sandboxing.referer: que sugería que el enlace se había alcanzado desde Google, por ejemplo, referer: google.com/search?q=specific.site.com.
en los escenarios que probamos no tenía sentido ya que este producto escanea correos electrónicos y cuando alguien hace clic en un correo (no desde una interfaz web) esta cabecera está ausente.Múltiples parámetros TCP pueden implicar una versión específica de SO o una variante específica. Algunos clientes falsifican la cabecera user-agent pero se ejecutan sobre un SO diferente al que declaran.
Los clientes alojados en redes de proveedores de nube específicos tienen un MTU diferente al valor estándar de 1500 bytes.
En algunos casos, la solicitud se envía desde un ASN asociado explícitamente con un proveedor de seguridad específico. En otros, el origen de la solicitud es un proveedor de hosting en la nube, y aunque no incrimina a un proveedor específico, es poco probable que sea un usuario típico.
En casos raros, la dirección IP del cliente tiene un registro PTR, asociándola con una URL relacionada con un proveedor de seguridad.
Suponiendo que ya tienes Docker instalado, es tan simple como esto:
docker-compose up
En caso de que quieras evitar Docker, sigue estos pasos.
ejecuta:
pip install requirements.txt
Esto instalará cualquier módulo externo de Python requerido.
Antes de desplegar pstf^2, descarga e instala p0f. Actualmente está disponible en:
https://lcamtuf.coredump.cx/p0f3/
Ahora, configura correctamente lib/servers/server_config.yml para que apunte a la ruta correcta, por ejemplo:
p0f_config:
# change your username at the very least, remember to change in both paths
p0f_bin_path: '/Users/$your_user_name/$more_folders/web_fp/p0f-3.09b/p0f'
p0f_fp_path: '/Users/$your_user_name/$more_folders/web_fp/p0f-3.09b/p0f.fp'
iface: 'lo0'
p0f_named_socket: '/tmp/p0f_socket'
También verifica que iface sea la misma interfaz que ejecuta tu servidor HTTP Python. En el ejemplo anterior, es la interfaz de loopback.
Una vez que se cumplan los requisitos, ejecuta:
python driver.py
Puedes usar cualquiera de las siguientes banderas:
--p0f_bin_path P0F_BIN_PATH
--p0f_fp_path P0F_FP_PATH
--p0f_iface P0F_IFACE
Todas se usan para ajustar parámetros relacionados con p0f: el binario en sí, el archivo de fingerprinting y la interfaz que usamos, que por defecto es eth0.
Deberías ver una salida similar a la siguiente:
2020-04-15 17:37:06,896 - pstf2_logger - INFO - Starting p0f...
2020-04-15 17:37:06,896 - pstf2_logger - INFO - Running command:
/Users/gbitensk/work/web_fp/p0f-3.09b/p0f -i lo0 -s /tmp/p0f_socket -f /Users/gbitensk/work/web_fp/p0f-3.09b/p0f.fp
2020-04-15 17:37:06,898 - pstf2_logger - INFO - p0f started!
2020-04-15 17:37:06,898 - pstf2_logger - INFO - Starting HTTP server...
2020-04-15 17:37:06,898 - pstf2_logger - INFO - HTTP server started!
2020-04-15 17:37:06,899 - pstf2_logger - INFO - If you wish to terminate the server press CTRL+C
Termina el servidor presionando Ctrl+C, esto matará tanto la instancia HTTP como la de p0f. Deberías ver algo similar a:
2020-04-15 17:37:48,263 - pstf2_logger - INFO - HTTP server stopped!
2020-04-15 17:37:48,263 - pstf2_logger - INFO - Killing p0f...
2020-04-15 17:37:48,263 - pstf2_logger - INFO - p0f killed!
2020-04-15 17:37:48,263 - pstf2_logger - INFO - exiting...
Ten en cuenta que configurar un registro DNS que apunte una URL a tu servidor está fuera del alcance de pstf^2 y es bajo tu propia responsabilidad.
pstf^2 tiene payloads predeterminados que se definen dentro de server_config.yml y se pueden personalizar fácilmente.
Hay dos modos, que se cambian alterando la variable rickroll_mode a YES o NO. Si está habilitada, la herramienta de seguridad será redirigida a una página de YouTube con la famosa película de Rickrolling; de lo contrario, servirá una cadena definida en el mismo archivo YAML.
Por defecto, la respuesta "maliciosa" se estableció en la cadena de prueba estándar EICAR.
Opté por publicar esta herramienta como un proyecto de código abierto porque:
Como parte de la construcción de la herramienta, se probó contra 15 productos diferentes, y todos fallaron. Si bien divulgué responsablemente los detalles sobre el ataque, todavía tenemos un largo camino por recorrer y mi expectativa es que al hacer pública la herramienta aumentaremos la conciencia sobre esas tácticas que ya están siendo abusadas por los "malos".
@Den1al por brindar asesoramiento al construir esta herramienta específicamente, y por escribir Python correctamente en general, así como por ayudar a crearla como una imagen Docker.