Résumé
- Les domaines usurpés et les usurpateurs de marques restent un problème courant, et l'une des difficultés réside dans la rapidité avec laquelle les usurpateurs sont repérés.
- En utilisant le "fuzzy matching" avec les données Censys et BigQuery, les organisations peuvent trouver et bloquer de manière proactive les usurpateurs de domaine, protégeant ainsi leurs utilisateurs.
L'internet est un vaste espace et les utilisateurs peuvent y trouver de nombreux pièges. La technologie a permis aux acteurs malveillants de créer rapidement et facilement des sites web frauduleux, et les acteurs de la menace peuvent utiliser ces domaines usurpés ou ces usurpations d'identité pour tromper les utilisateurs et leur faire perdre des informations sensibles. Les acteurs de la menace ciblent également souvent des organisations spécifiques en se faisant passer pour l'organisation elle-même, trompant ainsi des employés peu méfiants et accédant à l'infrastructure interne.
Les organisations disposent souvent d'outils qui leur permettent de protéger proactivement leurs employés contre ce type d'attaque, mais il faut pour cela connaître les domaines et les bloquer le plus rapidement possible. En d'autres termes, le temps et les connaissances sont tous deux essentiels pour réduire les dommages causés par les usurpateurs de domaine/de marque.
Cependant, avec Censys, BigQuery et un peu d'aide de la distance de Levenshtein, ce problème devient aussi simple qu'une requête et vous permet d'établir plus rapidement des listes de blocage pour les domaines suspects.
À l'adresse Censys , nous parcourons constamment l'internet, ce qui nous permet de trouver rapidement un grand nombre d'informations, y compris des usurpateurs d'identité potentiels. L'examen de toutes ces données par le biais de la recherche peut cependant s'avérer difficile, en particulier si vous essayez de filtrer sur plusieurs champs de données différents. Pour ce cas d'utilisation, nous utiliserons BigQuery, l'entrepôt de données sans serveur de Google, pour trouver des domaines suspects. Vous trouverez ici une introduction à la recherche dans les données Censys via BigQuery.
En utilisant les fonctions Javascript définies par l'utilisateur (UDF) intégrées à BigQuery, nous pouvons mettre en œuvre l'algorithme de la distance de Levenshtein et faire correspondre tous les hôtes connus de notre ensemble de données à un domaine spécifique. La distance de Levenshtein est une mesure de la distance entre deux chaînes de caractères, ce qui est un calcul simple et idéal pour nous lorsque nous essayons de trouver des domaines d'usurpation d'identité qui ressemblent à un domaine légitime. Dans cet article, nous utilisons bankofamerica[.]com, une grande institution financière américaine, comme exemple.
Utilisation de Levenshtein pour examiner différents aspects d'une URL dans BigQuery
La distance de Levenshtein étant sensible aux petites modifications des chaînes de caractères, nous utiliserons des jetons pour examiner différentes parties de l'URL, en particulier l'URL complète et le domaine. Il est possible de décomposer davantage ces requêtes pour examiner spécifiquement les sous-domaines, mais nous n'examinons que ces deux itérations de l'URL pour des raisons de simplicité. En outre, nous supprimons les informations relatives au TLD, car il est trivial pour un pirate d'acheter un autre TLD, mais le fait de les conserver dans la comparaison peut modifier radicalement les résultats.
Ainsi, la requête suivante demande l'adresse IPv4/IPv6 d'un hôte, tous ses dns.names[], et sépare les dns.names[] en une URL sans TLD et un domaine avec TLD, puis calcule l'algorithme de la distance de Levenshtein sur une échelle de 0 à 1 (0 est une absence de correspondance, 1 une correspondance exacte). Cette requête n'examine que les cas où l'algorithme de Levenshtein donne un résultat égal ou supérieur à 0,8 (et non à 1), mais ce seuil peut également être modifié pour votre usage.
Combinaison de Levenshtein dans un UDF BigQuery avec des données 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
Sortie BigQuery
![Capture d'écran montrant le résultat de la première requête BigQuery.](https://censys.com/wp-content/uploads/2024/01/Screenshot-2024-01-23-at-3.32.21 PM.png)
Comme nous pouvons le constater, il existe un certain nombre d'urls/domaines intéressants qui méritent d'être examinés plus en détail ou bloqués. Toutefois, l'analyse ne doit pas s'arrêter là.
Nous pouvons ajouter des données supplémentaires ( Censys ) sur ces hôtes afin d'améliorer encore le filtrage. Une légère modification de cette requête ajoutera aux résultats le nom du système autonome, les données de localisation et l'émetteur du certificat, ce qui pourrait permettre une identification plus rapide de l'infrastructure suspecte. Par exemple, le résultat de cette requête montre un certain nombre d'hôtes situés dans l'ASN de Proofpoint, ce qui n'est pas forcément remarquable puisque Bank of America pourrait être un client de Proofpoint. Cependant, il y a également un certain nombre d'autres résultats dans d'autres ASN qui ont des émetteurs de certificats différents de la page d'accueil de Bank of America (Entrust, Inc.). Ces résultats pourraient mériter d'être bloqués ou examinés plus en détail.
Combinaison de Levenshtein dans un UDF BigQuery avec des données supplémentaires 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
![Capture d'écran montrant la sortie de la deuxième requête BigQuery](https://censys.com/wp-content/uploads/2024/01/Screenshot-2024-01-23-at-3.37.37 PM.png)
Cette capture d'écran montre comment des métadonnées supplémentaires provenant de Censys peuvent être ajoutées pour filtrer plus rapidement les cas d'utilisation légitime.
Ce document est conçu pour servir de point de départ à vos propres recherches et peut être modifié en fonction des besoins de votre organisation. Pour en savoir plus sur l'utilisation de BigQuery avec Censys, consultez notre documentation d'aide, ainsi que d'autres informations sur BigQuery. Nous espérons qu'en montrant comment combiner BigQuery et Censys afin d'obtenir une correspondance floue avec les hameçonneurs, nous pourrons permettre à votre organisation de protéger les utilisateurs plus rapidement !