
Framework d'empreinte d'outils de sécurité passifs
Avez-vous déjà voulu un moyen simple, facile et discret de contourner plusieurs catégories de produits de sécurité ? pstf^2 (prononcé pstf-carré) est une implémentation d'un serveur HTTP capable de faire du fingerprinting passif de navigateur – et c'est peut-être exactement ce que vous cherchez. Lorsque des attaquants tentent de délivrer une charge utile sur Internet, ils doivent contourner plusieurs outils capables de scanner les liens entrants. Filtres de courriels, moteurs d'analyse et même soumission à un sandbox via une URL – tout peut être contourné une fois que pstf2 les détecte de manière passive. Une fois détecté, l'outil permet de différencier les services de sécurité des victimes potentielles et de délivrer une réponse malveillante ou bénigne.
Cet outil a été présenté lors du BlackHat EU 2020 : https://www.blackhat.com/eu-20/arsenal/schedule/#pstf2-link-scanners-evasion-made-easy-21763
Les détails de la recherche sont disponibles dans cet article de blog : https://blogs.akamai.com/sitr/2020/12/evading-link-scanning-security-services-with-passive-fingerprinting.html
La vraie question est : comment fonctionnent les scanners de liens ? Inspecter un lien malveillant est une action impliquant un client web qui envoie une requête HTTP GET. Chaque fournisseur utilise une implémentation interne différente – la plupart tentant d'imiter une interaction utilisateur réelle dans une certaine mesure. pstf^2 est un serveur HTTP simple basé sur Python qui applique des tactiques de détection de bots bien connues pour déterminer si une requête entrante provient d'un outil de sécurité automatisé. L'opérateur du serveur peut personnaliser les réponses, par exemple – si un scanner est détecté, rediriger vers Google, sinon envoyer un contenu malveillant.
Voici les principales tactiques implémentées dans pstf^2 :
Les outils de sécurité essaient de se cacher en tant que clients légitimes, en imitant de vrais navigateurs, mais ce n'est généralement pas le cas. Il est courant de voir des outils qui ne sont pas maintenus correctement utiliser de faux en-têtes user-agent pour des versions de navigateur vieilles d'une décennie. pstf^2 vous permet de définir un seuil minimal pour ce que vous considérez comme une version réelle non obsolète.
Il existe de nombreux types d'implémentations étranges que l'outil est capable de détecter. Quelques exemples présentés lors du talk BlackHat étaient :
via: qui révélait la nature de l'hôte virtuel utilisé pour le sandboxing.referer: qui suggérait que le lien avait été atteint depuis Google, par exemple referer: google.com/search?q=specific.site.com.
dans les scénarios que nous avons testés, cela n'avait pas de sens car ce produit analyse les courriels et quand quelqu'un clique sur un courriel (pas depuis une interface web), cet en-tête est absent.Plusieurs paramètres TCP peuvent indiquer soit une version spécifique d'OS soit une saveur spécifique. Certains clients usurpent l'en-tête user-agent mais tournent sur un OS différent de celui qu'ils déclarent.
Les clients hébergés sur les réseaux de certains fournisseurs de cloud ont une MTU différente de la valeur standard de 1500 octets.
Dans certains cas, la requête est envoyée depuis un ASN explicitement associé à un fournisseur de sécurité spécifique. Dans d'autres cas, l'origine de la requête est un hébergeur cloud, bien que cela n'incrimine pas un fournisseur spécifique, il est peu probable qu'il s'agisse d'un utilisateur typique.
Dans de rares cas, l'adresse IP du client possède un enregistrement PTR, l'associant à une URL liée à un fournisseur de sécurité.
En supposant que vous ayez déjà Docker installé, c'est aussi simple que cela :
docker-compose up
Si vous souhaitez éviter Docker, suivez ces étapes.
Exécutez :
pip install requirements.txt
Cela installera tous les modules Python externes nécessaires.
Avant de déployer pstf^2, téléchargez et installez p0f. Il est actuellement disponible à l'adresse :
https://lcamtuf.coredump.cx/p0f3/
Maintenant, configurez correctement lib/servers/server_config.yml pour pointer vers le bon chemin, par exemple :
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'
Vérifiez également que iface est la même interface que celle qui exécute votre serveur HTTP Python. Dans l'exemple ci-dessus, il s'agit de l'interface de boucle locale.
Une fois les dépendances satisfaites, exécutez :
python driver.py
Vous pouvez utiliser l'un des indicateurs suivants :
--p0f_bin_path P0F_BIN_PATH
--p0f_fp_path P0F_FP_PATH
--p0f_iface P0F_IFACE
Tous sont utilisés pour ajuster les paramètres liés à p0f : le binaire lui-même, le fichier d'empreintes et l'interface que nous utilisons, par défaut eth0.
Vous devriez voir une sortie similaire à celle-ci :
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
Terminez le serveur en appuyant sur Ctrl+C, cela tuera à la fois l'instance HTTP et p0f. Vous devriez voir quelque chose de similaire :
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...
Notez que la configuration d'un enregistrement DNS pointant une URL vers votre serveur dépasse le cadre de pstf^2 et relève de votre propre responsabilité.
pstf^2 contient des charges utiles par défaut définies dans server_config.yml et peuvent être personnalisées facilement.
Il existe deux modes, activés en modifiant la variable rickroll_mode pour YES ou NO.
S'il est activé, l'outil de sécurité sera redirigé vers une page YouTube avec le célèbre Rickrolling, sinon il servira une chaîne définie dans le même fichier YAML.
Par défaut, la réponse "malveillante" a été définie sur la chaîne de test standard EICAR.
J'ai choisi de publier cet outil en open source car :
Lors de sa construction, l'outil a été testé contre 15 produits différents, tous ont échoué. Bien que j'aie divulgué de manière responsable les détails de l'attaque, nous avons encore un long chemin à parcourir et mon attente est qu'en rendant l'outil public, nous sensibiliserons davantage à ces tactiques qui sont déjà exploitées par les "mauvais acteurs".
@Den1al pour avoir fourni des conseils lors de la construction de cet outil en particulier, pour l'écriture correcte de Python en général, ainsi que pour son aide à la création de l'image Docker.