Ir al contenido
Nuevo informe: Consiga su copia del Informe sobre el estado de Internet 2024. | Descargar hoy
Blogs

Fuzzy Matching para encontrar dominios sospechosos

Resumen

  • Los dominios suplantados y los suplantadores de marcas siguen siendo un problema frecuente, y una de las dificultades es la puntualidad a la hora de encontrar a los suplantadores.
  • Mediante el uso de "fuzzy matching" con datos de Censys y BigQuery, las organizaciones pueden encontrar y bloquear proactivamente a los suplantadores de dominios, protegiendo así a sus usuarios.

Internet es un lugar inmenso en el que los usuarios pueden encontrarse con muchas trampas. La tecnología ha facilitado a los delincuentes la creación de sitios web fraudulentos de forma rápida y sencilla, y las amenazas pueden utilizar estos dominios falsos o suplantaciones de marca para engañar a los usuarios y hacerles perder información confidencial. Las amenazas también suelen dirigirse a organizaciones concretas haciéndose pasar por ellas, engañando así a empleados desprevenidos y obteniendo acceso a la infraestructura interna.

Las organizaciones suelen disponer de herramientas que les permiten proteger proactivamente a sus empleados de este tipo de ataques, pero para ello es necesario tanto conocer los dominios como bloquearlos lo antes posible. En otras palabras, tanto el tiempo como el conocimiento son fundamentales para reducir los daños causados por los suplantadores de dominios/marcas.

Sin embargo, con Censys, BigQuery y un poco de ayuda de la distancia Levenshtein, este problema se convierte en algo tan sencillo como una consulta y permite bloquear dominios sospechosos con mayor rapidez.

En Censys escaneamos constantemente Internet, lo que significa que podemos encontrar mucha información rápidamente, incluidos posibles suplantadores de identidad. Examinar todos estos datos a través de la búsqueda puede ser un reto, sobre todo si se trata de filtrar en varios campos de datos diferentes. Por ello, en este caso utilizaremos BigQuery, el almacén de datos sin servidor de Google, para encontrar dominios sospechosos. Aquí encontrarás un manual sobre cómo buscar datos en Censys a través de BigQuery.

Utilizando las funciones definidas por el usuario (UDF) integradas en Javascript de BigQuery, podemos implementar el algoritmo de distancia de Levenshtein y "hacer coincidir difusamente" todos los hosts conocidos de nuestro conjunto de datos para un dominio específico. La Distancia de Levenshtein es una medida de distancia entre dos cadenas, que es un cálculo simple e ideal para que utilicemos cuando estamos intentando encontrar dominios suplantadores que parecen similares a un dominio legítimo. En este artículo, utilizamos como ejemplo bankofamerica[.]com, una gran institución financiera estadounidense.

Uso de Levenshtein para examinar diferentes aspectos de una URL en BigQuery

Dado que la distancia Levenshtein es sensible a pequeños cambios en las cadenas, vamos a tokenizar y examinar diferentes partes de la URL, concretamente la URL completa y el dominio. Es posible desglosar aún más estas consultas para examinar específicamente los subdominios, pero por simplicidad sólo examinamos estas dos iteraciones de la URL. Además, eliminamos la información del TLD, porque es trivial para un atacante comprar un TLD alternativo, pero mantenerlo en la comparación puede cambiar drásticamente los resultados.

Así, la siguiente consulta pide la dirección IPv4/IPv6 de un host, todos sus dns.names[], y divide los dns.names[] en una URL sin TLD y un dominio con TLD, y luego calcula el algoritmo de distancia de Levenshtein en una escala de 0 a 1 (0 es ninguna coincidencia, 1 es coincidencia exacta). Esta consulta sólo examina los casos en los que el algoritmo de Levenshtein da como resultado 0,8 o superior (y no 1), pero este umbral también puede modificarse para su uso.

Combinación de Levenshtein en una UDF de BigQuery con datos de Censys
CREATE TEMPORARY FUNCTION levenshtein(a STRING, b STRING)
RETURNS FLOAT64
LANGUAGE js AS """
if(a == null) return 0;
if(b == null) return 0;
if(a.length == 0) return b.length;
if(b.length == 0) return a.length;
var matrix = [];
var i;
for(i = 0; i <= b.length; i++){
 matrix[i] = [i];
}
var j;
for(j = 0; j <= a.length; j++){
 matrix[0][j] = j;
}
for(i = 1; i <= b.length; i++){
 for(j = 1; j <= a.length; j++){
   if(b.charAt(i-1) == a.charAt(j-1)){
     matrix[i][j] = matrix[i-1][j-1];
   } else {
     matrix[i][j] = Math.min(matrix[i-1][j-1] + 1,
                             Math.min(matrix[i][j-1] + 1,
                                      matrix[i-1][j] + 1));
   }
 }
}
var strlen = Math.max(a.length, b.length);
return 1.0 - (matrix[b.length][a.length] / strlen);
""";
WITH
uids_token AS (
SELECT
  host_identifier.ipv4,
  host_identifier.ipv6,
  dns_name as url,
  NET.PUBLIC_SUFFIX(dns_name) as tld,
  SPLIT(NET.REG_DOMAIN(dns_name), ".")[SAFE_OFFSET(0)] AS domain_no_tld,
FROM
  `censys-io.universal_internet_dataset_v2.base`,
  UNNEST(dns.names) dns_name
WHERE
  DATE(snapshot_date) = '2023-10-31'
),  uids_token_no_tlds AS (
SELECT
  *,
  REPLACE(url, CONCAT('.', tld), '') as url_no_tld
FROM uids_token
), uids_score AS (
SELECT
  *,
  levenshtein(LOWER(domain_no_tld),"bankofamerica") domain_no_tld_lev_score,
  levenshtein(LOWER(url_no_tld), "bankofamerica") url_no_tld_lev_score,
FROM
  uids_token_no_tlds )
SELECT
*
FROM
uids_score
WHERE
domain_no_tld_lev_score != 1 AND
(domain_no_tld_lev_score > 0.8 OR url_no_tld_lev_score > 0.8)
ORDER BY
domain_no_tld_lev_score DESC,
url_no_tld_lev_score DESC

Salida de BigQuery

Una captura de pantalla que muestra el resultado de la primera consulta BigQuery.

Como podemos ver, hay una serie de urls/dominios interesantes que merece la pena investigar más a fondo o bloquear. Sin embargo, el análisis no tiene por qué detenerse aquí.

Podemos añadir datos adicionales de Censys sobre estos hosts para ayudar a filtrar aún más. Una ligera modificación de esta consulta añadirá a los resultados el nombre del sistema autónomo, los datos de ubicación y el emisor del certificado, lo que podría permitir una identificación más rápida de la infraestructura sospechosa. Por ejemplo, la salida de esta consulta muestra una serie de hosts ubicados en el ASN de Proofpoint, lo que puede no ser notable, ya que Bank of America podría ser un cliente de Proofpoint. Sin embargo, también hay una serie de otros resultados en diferentes ASN que tienen emisores de certificados que son diferentes de la página principal de Bank of America (Entrust, Inc.). Podría merecer la pena bloquear o investigar más a fondo estos resultados.

Combinación de Levenshtein en una UDF de BigQuery con datos adicionales Censys
CREATE TEMPORARY FUNCTION levenshtein(a STRING, b STRING)
RETURNS FLOAT64
LANGUAGE js AS """
if(a == null) return 0;
if(b == null) return 0;
if(a.length == 0) return b.length;
if(b.length == 0) return a.length;
var matrix = [];
var i;
for(i = 0; i <= b.length; i++){
 matrix[i] = [i];
}
var j;
for(j = 0; j <= a.length; j++){
 matrix[0][j] = j;
}
for(i = 1; i <= b.length; i++){
 for(j = 1; j <= a.length; j++){
   if(b.charAt(i-1) == a.charAt(j-1)){
     matrix[i][j] = matrix[i-1][j-1];
   } else {
     matrix[i][j] = Math.min(matrix[i-1][j-1] + 1,
                             Math.min(matrix[i][j-1] + 1,
                                      matrix[i-1][j] + 1));
   }
 }
}
var strlen = Math.max(a.length, b.length);
return 1.0 - (matrix[b.length][a.length] / strlen);
""";
WITH
uids_token AS (
SELECT
  host_identifier.ipv4,
  dns_name as url,
  NET.PUBLIC_SUFFIX(dns_name) as tld,
  SPLIT(NET.REG_DOMAIN(dns_name), ".")[SAFE_OFFSET(0)] AS domain,
  autonomous_system.name as asn_name,
  location.country as country,
 certificate_issuer_org,
FROM
  `censys-io.universal_internet_dataset_v2.base`,
  UNNEST(dns.names) dns_name,
    UNNEST(services) svc
 LEFT JOIN UNNEST (svc.tls.certificates.leaf_data.issuer.organization) certificate_issuer_org
WHERE
  DATE(snapshot_date) = '2023-10-31'AND
 svc.tls IS NOT NULL
),  uids_token_no_tlds AS (
SELECT
  *,
  REPLACE(url, CONCAT('.', tld), '') as url_no_tld
FROM uids_token
), uids_score AS (
SELECT
  *,
  levenshtein(LOWER(domain),"bankofamerica") domain_lev_score,
  levenshtein(LOWER(url_no_tld), "bankofamerica") url_no_tld_lev_score,
FROM
  uids_token_no_tlds )
SELECT
*
FROM
uids_score
WHERE
domain_lev_score != 1 AND
(domain_lev_score > 0.8 OR url_no_tld_lev_score > 0.8)
ORDER BY
domain_lev_score DESC,
url_no_tld_lev_score DESC
Captura de pantalla de la segunda consulta BigQuery

Esta captura de pantalla muestra cómo se pueden añadir metadatos adicionales de Censys para filtrar más rápidamente los casos de uso legítimos.

Este artículo pretende ser un punto de partida para sus propias investigaciones y puede modificarse para adaptarlo a las necesidades de su organización. Para obtener más información sobre cómo utilizar BigQuery con Censys, consulte nuestros documentos de ayuda, y también echa un vistazo a más sobre BigQuery. Esperamos que al mostrar cómo combinar BigQuery y Censys para identificar a los phishers, podamos ayudar a su organización a proteger a los usuarios más rápidamente.

Sobre el autor

Ariana Mirian
Investigador principal de seguridad
Ariana Mirian es investigadora principal de seguridad en Censys. Trabaja en la intersección de la medición de Internet y la seguridad, y utiliza la medición a gran escala para responder a preguntas interesantes sobre Internet y mejorar los datos de Censys'.

Contenido similar

Volver al Centro de Recursos
Soluciones de gestión de la superficie de ataque
Más información