
Crawlector es un framework de caza de amenazas diseñado para explorar sitios web en busca de objetos maliciosos.
Crawlector (el nombre Crawlector es una combinación de Crawler & *Detector) es un framework de caza de amenazas diseñado para escanear sitios web en busca de objetos maliciosos.
Nota-1: El framework se presentó por primera vez en la conferencia No Hat en Bérgamo, Italia, el 22 de octubre de 2022 (Diapositivas, Grabación de YouTube). Además, se presentó por segunda vez en la conferencia AVAR, en Singapur, el 2 de diciembre de 2022.
Nota-2: La herramienta complementaria EKFiddle2Yara (es una herramienta que toma las reglas de EKFiddle y las convierte en reglas Yara) mencionada en la charla también fue publicada en ambas conferencias.
Nota-3: La versión 2.0 (Photoid Build:180923), un lanzamiento histórico, se publicó el 18 de septiembre de 2023.
Nota-4: La versión 2.1 (Universe-647 Build:031023) se publicó el 3 de octubre de 2023. Una adición importante es la funcionalidad de Notificación de Alertas por Slack.
Nota-5: La versión 2.2 (Hallstatt Build:051123) se publicó el 5 de noviembre de 2023. Una adición importante es la funcionalidad de Control Remoto por Slack.
Nota-6: La versión 2.3 (Munich Build:241123) se publicó el 24 de noviembre de 2023. Una adición importante es la funcionalidad de Servidores de Nombres DNS.
Nota-6: La versión 2.3.1 {Nero Build:131225} se publicó el 13 de diciembre de 2025. Esta es una versión de mantenimiento.
Esto es para comprobar la presencia de URLs maliciosas en cada página que se escanea. El framework puede consultar la lista de URLs maliciosas desde el servidor de URLHaus (configuración: url_list_web), o desde un archivo en disco (configuración: url_list_file). Si se especifica esta última, tiene prioridad sobre la primera.
Funciona buscando en el contenido de cada página todas las entradas de URL en url_list_web o url_list_file, verificando todas las ocurrencias. Además, ante una coincidencia, y si la opción de configuración check_url_api está configurada como true, Crawlector enviará una solicitud POST a la URL de la API establecida en la opción de configuración url_api, que devuelve un objeto JSON con información adicional sobre la URL coincidente. Dicha información incluye urlh_status (ej., online, offline, unknown), urlh_threat (ej., malware_download), urlh_tags (ej., elf, Mozi) y urlh_reference (ej., https://urlhaus.abuse.ch/url/1116455/). Esta información se incluirá en el archivo de registro cl_mlog_<fecha_actual><hora_actual><(am|pm)>.csv (ver más abajo), solo si check_url_api está configurado como true. De lo contrario, el archivo de registro incluirá las columnas urlh_url (lista de URLs maliciosas coincidentes) y urlh_hit (número de ocurrencias por cada URL maliciosa coincidente), condicionado a que check_url esté configurado como true.
La funcionalidad de URLHaus se puede deshabilitar por completo estableciendo la opción de configuración check_url como false.
Es importante tener en cuenta que esta característica puede ralentizar el escaneo, considerando la enorme cantidad de URLs maliciosas (~130 millones de entradas al momento de escribir esto) que deben verificarse, y el tiempo que lleva obtener información adicional del servidor de URLHaus (si la opción check_url_api está configurada como true).
Debe familiarizarse con el archivo de configuración cl_config.ini antes de ejecutar cualquier sesión. Todas las secciones y parámetros están documentados en el propio archivo de configuración.
La funcionalidad de escaneo fuera de línea de Yara es una opción independiente, lo que significa que, si está habilitada, Crawlector ejecutará solo esta característica, independientemente de otras características habilitadas. Y lo mismo ocurre con la funcionalidad de rastreo de certificados digitales de dominios/sitios. En cualquier caso, se recomienda deshabilitar todas las características no utilizadas en el archivo de configuración.
log_to_file o log_to_cons), si una regla Yara hace referencia solo a los atributos de un módulo (ej., PE, ELF, Hash, etc.), entonces Crawlector mostrará solo el nombre de la regla ante una coincidencia, excluyendo los datos de desplazamiento y longitud.Nota: para cualquier opción que requiera una ruta, proporcione siempre la ruta absoluta.
Para visitar/escanear un sitio web, la lista de URLs debe almacenarse en archivos de texto, en el directorio "cl_sites".
Crawlector acepta tres tipos de URLs:
[a-zA-Z0-9_-]{1,128} = <url><id>[depth:<0|1>-><\d+>,total:<\d+>,sleep:<\d+>] = <url>
Por ejemplo,
mfmokbel[depth:1->3,total:10,sleep:0] = https://www.mfmokbel.com
que es equivalente a:
mfmokbel[d:1->3,t:10,s:0] = https://www.mfmokbel.com
donde, <id> := [a-zA-Z0-9_-]{1,128}
depth, total y sleep también se pueden reemplazar con sus versiones abreviadas d, t y s, respectivamente.
40 (10 + (10*3)) URLs.Nota 1: Una URL de Tipo 3 se puede convertir en una URL de Tipo 1 estableciendo el parámetro de configuración live_crawler como false en el archivo de configuración, en la sección spider.
Nota 2: Las líneas vacías y las líneas que comienzan con ";", "#" o "//" se ignoran.
La funcionalidad de spider es lo que le da a Crawlector la capacidad de encontrar enlaces adicionales en la página objetivo. El spider admite las siguientes características:
Tipo 3 para que la funcionalidad de spider funcioneexclude_url. Por ejemplo, *.zip|*.exe|*.rar|*.zip|*.7z|*.pdf|.*bat|*.dbinclude_url. Por ejemplo, */checkout/*|*/products/*exclude_httpsadd_ext_links. Esta característica respeta las opciones de configuración exclude_url e include_url.ext_links_only. Esta característica respeta las opciones de configuración e .En la versión 2.0, los IDs tienen sus tipos asignados explícitamente añadiendo uno de los siguientes tipos al propio ID:
Tener cada ID con su tipo asociado facilita la navegación y el filtrado de los resultados. Además, esto se utiliza internamente por diversas razones.
site_ranking en el archivo de configuración proporciona algunas opciones para modificar la forma en que se lee el archivo CSVsite proporciona la capacidad de expandir un sitio dado intentando encontrar todos los dominios de nivel superior (TLD) y/o subdominios disponibles para el mismo dominio. Si se encuentran, los nuevos TLDs/subdominios se verificarán como cualquier otro dominiorapid_api_key en el archivo de configuraciónfind_tlds habilitado, además de los resultados de TLDs de la API de Omnisint Labs, el framework intenta encontrar otros dominios activos/registrados recorriendo cada entrada de TLD, ya sea en el tlds_file o en el tlds_urltlds_url, debe apuntar a una URL que contenga TLDs, cada uno en una nueva línea (las líneas que comienzan con los caracteres ';', '#' o '//' se ignoran)tlds_file contiene el nombre del archivo con la lista de TLDs (igual que tlds_url; solo está presente el TLD, excluyendo el '.', por ejemplo, "com", "org")tlds_file, tiene prioridad sobre La funcionalidad de redirección de URLs en versiones anteriores estaba rota. Esta versión proporciona una reescritura completa de la funcionalidad de redirección, con un alto grado de parametrización para controlar su operación. En la versión 2.0, la redirección tiene una sección dedicada en el archivo de configuración, llamada [redirect]. Toda la funcionalidad de redirección se puede activar/desactivar mediante la opción follow_redir, en la sección [default].
La función de redirección verifica los códigos de estado de respuesta HTTP: 301, 302, 303, 307 y 308. En caso de coincidencia, Crawlector analizará la cabecera Location para redirigir a la URL, teniendo en cuenta tanto las URLs de redirección absolutas como relativas. La funcionalidad de redirección en Crawlector fue diseñada para rendimiento y agilidad. La sección [redirect] proporciona la siguiente lista de opciones:
La opción depth acepta uno de los valores, last o all. Controla qué URLs de redirección encontradas visitar, dependiendo de si la opción visit está habilitada o no. all es para visitar todas las URLs de redirección encontradas. last es para visitar la última URL de redirección. La visita de esas URLs ocurre en la misma sesión actual. Tenga en cuenta que, independientemente del valor de depth, Crawlector registrará la lista de todas las redirecciones encontradas a URLs, junto con el número total, en forma absoluta. Se escribirán en el archivo CSV cl_mlog, en las columnas redirect_urls y redirect_total.
La opción max_redirect establece un límite superior en el número total de redirecciones de URL a descubrir.
La opción skip_similar se explica mejor mediante el siguiente ejemplo:
Suponga que la URL original dada a Crawlector para rastrear es "https://www.mfa.gov.law" y una de las redirect_urls encontradas es "https://mfa.gov.law/". Como puede ver, la única diferencia es la barra inclinada al final de la URL. Estas dos URLs son iguales, y el servidor responderá con la misma página. Si la opción visit está configurada como true, Crawlector rastreará ambas URLs, desperdiciando recursos y realizando la misma tarea dos veces. Esto puede no ser un problema para 1 o 2 URLs, pero si tiene miles de URLs para rastrear y la opción visit está habilitada, es muy probable que más de la mitad de ellas tengan una URL descubierta de este tipo, en cuyo caso, esto se convierte en un problema apremiante a considerar. Por lo tanto, establecer la opción skip_similar como true ayudará a resolver este problema saltándose la visita de URLs similares. Además del escenario de la barra inclinada, la opción skip_similar también considera los siguientes dos escenarios: si la URL de redirección difiere solo por uno o ambos prefijos, "https://" y "www.".
Una de las principales adiciones a la versión 2.0 es la capacidad de extraer diferentes tipos de objetos de la página, guardarlos en disco, escanearlos con Yara y URLHaus, y guardar los resultados en el archivo CSV. Para habilitar esta característica, configure la opción extract_obj como true, en la sección [page].La implementación de la función de extracción profunda de objetos funciona creando un archivo de archivo web MHT a partir de la página web, incluyendo scripts externos, imágenes y archivos CSS. Todos los archivos incrustados se extraerán en la ruta especificada por la opción obj_dir (ruta: obj_dir/objects/), donde se escaneará cada archivo. La implementación no debe confundirse con la funcionalidad del navegador sin cabeza. DOE es diferente y no implica cargar la página para recuperar todas las URL consultadas dinámicamente. Por lo tanto, tiene sus limitaciones.
Todos los objetos extraídos tendrán algunos de sus metadatos escritos en el archivo CSV. Cosas a tener en cuenta al leer el archivo CSV: el ID del dominio con el objeto extraído tiene un formato único, como sigue, <domain_id>_<type>_p_obj_<counter> (por ejemplo, _mfa_gov_cef40bc5-ba6a-41_t1_p_obj_0_). Y, la URL tendrá el siguiente formato, <url>__<object_filename> (por ejemplo, https://www.mfa.gov.law__bilmur.min.js).
Si la opción delete_obj está configurada como verdadera, todos los objetos extraídos que no sean detectados por Yara se eliminan del disco. Si la opción log_all_objs está configurada como verdadera, entonces registre todos los metadatos de objetos extraídos en el mismo archivo CSV cl_mlog. Si la opción check_urlhaus bajo la sección [page] está configurada como verdadera, entonces cada objeto extraído será escaneado por URLHaus. Tenga en cuenta que las opciones de esta opción se heredan de la sección [urlhaus].
Nota: si el dominio que se está rastreando redirige a otro dominio, entonces la última redirección a la URL debe pasarse a DOE para que funcione. Además, el dominio debe comenzar con "HTTP(S)://" para que DOE funcione.
A veces, es posible que desee ejecutar sesiones de Crawlector que pueden tardar días en completarse, por ejemplo, al rastrear el top 1 millón de sitios web de Alexa, y para tal escenario, necesita una forma de monitorear la operación y el progreso del marco de trabajo de forma remota. Por lo tanto, en la versión 2.1, agregué la función de notificación de alerta de Slack para proporcionar un mecanismo para monitorear la ejecución de Crawlector en tiempo real, enviando alertas de Yara, eventos std::exit() y advertencias y errores del proceso, a un canal de Slack de su elección. Además de eso, Crawlector instala un controlador de consola en un intento de monitorear ciertos tipos de eventos, incluyendo ctrl_c, ctrl_close, ctrl_break, ctrl_logoff y ctrl_shutdown. Es importante tener en cuenta que Crawlector no cambia/altera el comportamiento del controlador predeterminado; simplemente informa al canal de Slack la recepción de cualquiera de los eventos listados. Esto podría extenderse en el futuro para tener en cuenta otros tipos de eventos.
Esta función utiliza la API REST de Slack, y para la autenticación con el servidor, utiliza OAuth 2.0. Necesitará un token de API de Slack para usarlo, y un canal configurado con los permisos correctos. Esta función solo publica mensajes en el canal de Slack y no recibe ni procesa ningún mensaje entrante.
La sección [slack_alert] proporciona la siguiente lista de opciones:
Para deshabilitar o habilitar esta función, simplemente configure la opción alert en true o false. Además, debe especificar el api_token, con un nombre de channel.
Nota-1: En la fase de inicialización de Crawlector, prueba si el token de autenticación proporcionado es válido o no, o si el canal está configurado, y en caso de falla, esta función se deshabilita automáticamente.
Todas las alertas reportadas al canal de Slack se reportan bajo el nombre de usuario Crawlector v<version_number>, por ejemplo, Crawlector v2.1. El usuario tiene el icono de una telaraña. Además, todas las alertas están enhebradas, lo que significa que todas las alertas posteriores al primer mensaje de inicio se publican como respuestas. Esta fue una decisión de diseño y ayuda en caso de que esté ejecutando múltiples sesiones al mismo tiempo, todas reportando al mismo canal. Algunas alertas utilizan el lenguaje de marcado markdown para el formato.
Cuando el proceso ha finalizado con éxito y está a punto de salir, publica el siguiente mensaje:
Crawlector ha finalizado y se está cerrando correctamente
Nota-2: El límite de tasa de Slack en la API de mensajes de publicación es un mensaje por segundo, con margen para algunos picos. Crawlector no pone en cola mensajes para tener en cuenta más publicaciones por segundo. Esto podría cambiar en el futuro si es necesario; sin embargo, la opción sleep permite que el proceso duerma durante una cantidad de tiempo especificada después de cada mensaje publicado con éxito.
Con la versión 2.2 (nombre en clave Hallstatt), estoy introduciendo la capacidad de controlar remotamente Crawlector a través de un conjunto seleccionado de comandos de control especialmente diseñados. La razón para introducir esta funcionalidad es monitorear y controlar ciertos comportamientos de sesiones que se supone que deben ejecutarse durante horas o días. Por ejemplo, es posible que desee activar/desactivar la funcionalidad de alerta de Slack, terminar Crawlector y cargar un archivo de configuración, entre otros.
Esta función utiliza la API REST de Slack, y para la autenticación con el servidor, utiliza OAuth 2.0. Necesitará un token de API de Slack para usarlo, y un canal configurado con los permisos correctos. El token de API es el mismo que se utiliza en la sección [slack_alert], opción api_token.
La sección [slack_alert] proporciona la siguiente lista adicional de opciones para la funcionalidad de control remoto:
Para deshabilitar o habilitar esta función, simplemente configure la opción control en true o false. El nombre ctrl_channel tiene que ser el ID del canal y no el nombre del canal. Puede obtenerlo haciendo clic derecho en el nombre del canal -> Ver detalles del canal -> Desplácese hasta la parte inferior de la ventana, y verá el campo ID del canal: <channel_id>.
La opción ctrl_sleep determina la frecuencia de llamada al canal de control especificado en la opción ctrl_channel para recuperar comandos de control. También puede actualizar esta opción a través del comando de control cl_update_delay <time_in_ms>.
La lista de comandos de control admitidos es la siguiente:
Nota-1: En la fase de inicialización de Crawlector, prueba si el token de autenticación proporcionado es válido o no, o si el canal está configurado, y en caso de falla, esta función se deshabilita automáticamente.
Si esta funcionalidad está habilitada, y una vez que pasa la validación del token API, Crawlector envía el mensaje "Crawlector está listo para recibir comandos de control. Escriba el comando cl_help para obtener una lista de los comandos de control admitidos." al ctrl_channel designado.
Todas las respuestas a un comando de control dado están enhebradas. Además, los comandos de control se leen por sesión, desde el momento en que se inicia una sesión.
Nota-2: El límite de tasa de Slack en la API de recuperación (historial de conversación) de mensajes es una solicitud por segundo, con margen para algunos picos. Por lo tanto, si la opción ctrl_sleep está configurada en un valor menor a un segundo o mayor a un segundo, Crawlector sí pone en cola mensajes para tener en cuenta más comandos de control por segundo, y los ejecuta en el orden recibido.
Con la versión 2.3 (nombre en clave Munich), se introduce la capacidad de especificar una lista de servidores de nombres DNS para todas las consultas DNS y resoluciones DNS a IP realizadas por Crawlector con un alto nivel de control. Esto es importante en caso de que esté rastreando sitios web bloqueados o maliciosos. Esta función se aplica a cada función en Crawlector donde se realiza una consulta DNS o solicitud DNS a IP. Más importante aún, proporciona la capacidad de realizar DNS sobre TLS para cada servidor de nombres que lo soporte.
La sección [dns_ns] proporciona la siguiente lista de opciones para administrar esta funcionalidad:
La opción name_servers toma una lista parametrizada de servidores de nombres DNS a utilizar, separados por comas. El valor de esta opción tiene el formato: <IPv4_address>(<tls_option>) donde <tls_option> toma cualquiera de los valores "d_tls" o "e_tls". Las opciones "d_tls" o "e_tls" indican si el servidor de nombres en cuestión soporta DNS sobre TLS o no, respectivamente. Esta opción se aplicará dependiendo del valor establecido para la opción dns_tls. Por ejemplo, la entrada 8.8.8.8(e_tls) indica usar el servidor DNS de Google 8.8.8.8 con soporte TLS, mientras que la entrada 12.13.14.15(d_tls) indica usar el servidor DNS 12.13.14.15 sin soporte TLS.
La opción dns_tls especifica el nivel requerido de cumplimiento TLS. Esta opción toma cualquiera de los valores, "yes", "no" o "force".
La opción keep_default es para si agregar el(los) servidor(es) de nombres predeterminado(s) a la lista de servidores de nombres. Se asume que un servidor de nombres predeterminado no soporta TLS.
La opción conn_time_out especifica el tiempo en milisegundos para esperar una respuesta a una consulta DNS.
La opción enable activa o desactiva esta funcionalidad.
cl_sites.Abierto para solicitudes de extracción y problemas. Los comentarios y sugerencias son muy apreciados.
Mohamad Mokbel (@MFMokbel)
exclude_urlinclude_url| id_postfix (tipo) | descripción |
|---|
| _t1_p | tipo 1 simple sin id |
| _sd | subtipo para subdominios |
| _tld | subtipo para tlds |
| _t2_p | tipo 2 simple con id |
| _t3_s | tipo 3 dominios spidered |
| _t3_sc | tipo 3 dominios spidered con un nodo hijo |
| _t3_ss | tipo 3 cuando una URL tipo 3 (_t3_s) se convierte en URL tipo 1 |
| _t3_s_e | tipo 3 enlaces externos de dominios spidered |
| _obj_ | para escaneo profundo y extracción de objetos |
| _t4_ru | para URL de redirección (para todos los tipos) |
tlds_urltld_dl_time_out es para establecer el tiempo de espera máximo para la función de búsqueda DNS al intentar verificar si el dominio en cuestión se resuelve o notld_use_connect habilita la funcionalidad de conectarse al dominio en cuestión a través de una lista de puertos, definidos en la opción tlds_connect_portstlds_connect_ports acepta una lista de puertos, separados por comas, o una lista de rangos, como 25-40,90-100,80,443,8443 (el inicio y fin del rango son inclusivos)
tld_con_time_out es para establecer el tiempo de espera máximo para la función de conexióntld_con_use_ssl habilita/deshabilita el uso de SSL al intentar conectarse al dominiosave_to_file_subd está configurado como true, los subdominios descubiertos se guardarán en "\expanded\exp_subdominio_<am|pm>.txt"save_to_file_tld está configurado como true, los dominios descubiertos se guardarán en "\expanded\exp_tld_<am|pm>.txt"exit_here está configurado como true, entonces Crawlector sale después de ejecutar esta función [site], independientemente de otras opciones habilitadas. Esto significa que los sitios encontrados no serán rastreados/spidered| Comando de Control | Descripción |
|---|
| cl_get_date | Recupera la fecha y hora en que se inició Crawlector y la fecha y hora actuales. |
| cl_ping | Envía de vuelta el mensaje "Pong...". Esto es para comprobar que el canal C&C está funcionando. |
| cl_get_config | Sube el archivo de configuración utilizado actualmente (por ejemplo, cl_config.ini) como un archivo de texto. |
| cl_update_delay <entero_en_milisegundos> | Actualiza el tiempo de check-in entre cada solicitud de extracción de comandos de control. - Cambia el valor (ctrl_sleep) solo para la sesión actual. |
| cl_turn_off_slack_alert | Desactiva la función de alerta de Slack para la sesión activa actual. |
| cl_turn_on_slack_alert | Activa la función de alerta de Slack para la sesión activa actual. |
| cl_help | Muestra este mensaje de ayuda. |
| cl_exit | Termina Crawlector, de forma forzada. |