3 octobre 2019

Comment faire perdre du temps à un scammeur en 3 étapes ?

De nos jours, nombreux sont les messages douteux que nous recevons de différentes sources. Ces messages sont généralement envoyés par voie électronique, tels que des emails ou des SMS par ces fameux scammeurs. Ils nous incitent à cliquer sur un lien, afin de rentrer nos données personnelles, bancaires, payer une certaine somme, etc.. Ces escrocs profitent de la crédulité de leurs victimes afin de leur soutirer de l’argent via diverses méthodes. 

Des listes de potentielles victimes sont récupérées via différentes méthodes, par exemple avec des fuites de données publiques ou des forums présents sur le darknet de Tor.

Les prétextes permettant d’obtenir des identifiants ou des numéros de carte bancaires sont nombreux. Nous utilisons très régulièrement nos données Internet et il peut arriver à tout le monde de mordre a l’hameçon. Les escrocs peuvent se servir des informations récupérées directement ou les revendent.

Étude d’un cas d’hameçonnage

Voici un exemple de message douteux reçu via SMS :

Le français approximatif et le fait de ne pas avoir de compte Cdiscount met sur la piste d’une éventuelle escroquerie. De plus, le lien du site est sous forme de réducteur de lien, (ici bit.ly) ce qui n’est pas la manière de faire de ces sites.

Le fameux lien est donc visité sous machine virtuelle afin de protéger la machine hôte, et nous redirige vers le site https://clientcdiscount.net . Ce site a un certificat TLS valide, et ne présente rien d’alarmant à première vue :

Cependant, il s’avère que les liens du bas de la page ainsi que les boutons du haut ne fonctionnent pas. Il semblerait que nous ayons trouvé un site d’hameçonnage. Les tentatives de connexions infructueuses nous le confirment.

Nous pouvons également noter la bienveillance des individus, car le site nous alerte quant à notre sécurité et au phishing (En bas à droite de la capture d’écran précédente) :

Étape n°1 : OSINT (Open Source Intelligence Gathering)

Afin de mieux pouvoir cibler les escrocs, il est important de rassembler des informations sur ces derniers. Pour ce faire, de nombreux outils existent. tout d’abord il est nécessaire de récupérer l’adresse IP du site.

1.1 – Récupération de l’adresse IP via la commande host :
1.2 – Ensuite il est possible de faire de la recherche passive avec le site censys.io :

Nous observons ainsi que le serveur est situé aux États-Unis et que les ports 22, 80 et 443 sont ouverts. Aucune information sensible ne ressort de cette première phase.

1.3 – De plus, une recherche avec l’outil whois nous montre que l’escroc protège son identité, car les champs sont anonymisés :

Il semblerait que nous ne puissions pas remonter jusqu’au scammeur afin de le signaler. Cependant, nous pouvons nous assurer que celui-ci perde du temps en lui envoyant de fausses données de victimes.

Il serait possible de pousser un peu plus la recherche de cette personne avec de la threat intelligence, mais ce n’est pas le but ici.

Étape n°2 : Scripting

2.1 – Analyse du formulaire du site

Afin de lui envoyer de fausses données, il a tout d’abord fallu comprendre comment fonctionne le site :

  • 1ère page : Envoi de faux identifiants sur la première page de connexion.
  • 2ème page : Redirection vers une page ou il faut entrer ses informations personnelles relatives à notre compte, sans explications là-dessus.
  • 3ème page : Enfin, nous arrivons sur une page où il faut rentrer ses coordonnées bancaires :
2.2 – Ayant analysé les différentes étapes à suivre, il est désormais possible d’analyser les requêtes et ainsi commencer à écrire notre script.
2.2.1 – Première requête de connexion interceptée :

Dans cette requête, quelques éléments sont importants pour la suite :

  • L’identification de jetons nécessaires à l’acceptation de la requête (sinon code d’erreur 500)
  • L’envoi de faux identifiants en format JSON
2.2.1 – Script pour la première requête

Il a donc fallu écrire la première partie du script en récupérant les jetons XSRF-TOKEN et laravel_session. Pour ce faire, Python 3 a été utilisé avec la bibliothèque requests et beautifulSoup. Le code suivant nous permet tout d’abord de récupérer les jetons nécessaires et envoyer de faux identifiants :

La bibliothèque Faker utilisée ici pour envoyer de faux identifiants est disponible sur Github: https://github.com/joke2k/faker

De même, fake_useragent (https://pypi.org/project/fake-useragent/) nous permet d’envoyer des user agents aléatoires, permettant d’éviter à l’escroc/scammeur de reconnaître une logique de requêtes.

2.2.2 – Interception de la requête avec Burp qui a été créée avec notre script :

Nous pouvons voir que les en-têtes sont correctement mis en place et que le serveur répond un code 200 OK à notre requête.

2.2.2 – Script correspondant aux 2e et 3e phases du formulaire :

Comme décrit précédemment, les pages deux et trois du formulaire demandent respectivement les informations personnelles de l’utilisateur et ses coordonnées bancaires.

La bibliothèque Faker permet ainsi d’envoyer de fausses données personnelles de manière aléatoire. Il en est de même pour la dernière étape afin d’envoyer des numéros de cartes bancaires inutilisables.

2.2.3 – Et voici les requêtes interceptées via Burp :

Ci-dessus et ci-dessous, les fausses informations personnelles et données bancaires :

2.2.3 – Nous pouvons observer que chaque requête renvoie un code 200 OK. Il est donc possible de faire une boucle afin d’envoyer une multitude de fausses données et faire perdre un maximum de temps à notre escroc.

De plus, afin de brouiller les pistes au maximum, il est nécessaire de passer par des proxies afin d’avoir des IPs différentes, car il est possible de voir d’où viennent les requêtes dans les logs.

Pour ce faire, afin de gagner du temps, nous avons utilisé un projet python permettant de récupérer une liste de proxies (https://github.com/Pure-L0G1C/Proxies). Voici le code complet correspondant :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from scraper import Scraper
from fake_useragent import UserAgent
from faker import Faker
from bs4 import BeautifulSoup

import requests
import sys
import os,sys,ssl
import json
import urllib.parse


if __name__ == '__main__':

    while True:

        scraper = Scraper() # Instance de Pure-L0G1C Proxy scraper permettant d'avoir une liste de proxy (https://github.com/Pure-L0G1C/Proxies)
        proxies = scraper.scrape(country='France', size=30)

        while proxies.qsize:  # Tant qu'il y a des proxy dans la liste on itère dans une boucle

            proxy = proxies.get()  # on obtient une liste de proxy 

            ip = proxy["ip"]  # La liste de proxy est sous forme de dictionnaire, on extrait l'adresse IP et le port
            port = proxy["port"]

            proxy_url = "https://" + ip + ":" + port  # On affiche l'adresse du proxy
            proxy_url2 = "http://" + ip + ":" + port  # On affiche l'adresse du proxy
            proxi = {'https': proxy_url,'http': proxy_url2}  # On ajoute cette adresse dans la variable proxies afin de l'incorporer dans les requêtes

            try:
                r = requests.get('https://www.clientcdiscount.net/' ,proxies= proxi, verify=False, timeout=5)  # On récupère les cookies sur la page d'acceuil
                print(r.status_code)
                soup = BeautifulSoup(r.text, 'html.parser') # On crée une instance BeautifulSoup contenant la page HTML https://www.clientcdiscount.net/

                jar = requests.cookies.RequestsCookieJar() # On crée un objet contenant les cookies XSRF-TOKEN et laravel_session
                jar.set('XSRF-TOKEN', r.cookies['XSRF-TOKEN'])
                jar.set('laravel_session', r.cookies['laravel_session'])

                fake = Faker('fr_FR') # on crée une instance faker avec une Locale Française

                data = {"email": fake.email(), "password": fake.password()} # on met des valeurs aléatoires aux emails et mot de passes 

                ua = UserAgent() # On met des user agents aléatoires afin de brouiller les traces grâce a la bibliothèque fake useragent https://pypi.org/project/fake-useragent/
                user_agent = ua.random

                XSRF_TOKEN = str(r.cookies['XSRF-TOKEN'])
                XSRF_TOKEN_decoded = urllib.parse.unquote(XSRF_TOKEN)
                headers = {'User-Agent': user_agent, 'X-XSRF-TOKEN': XSRF_TOKEN_decoded, 'Content-type': 'application/json'} # On applique les en-têtes nécessaires aux différentes requêtes

                login_request = requests.post('https://www.clientcdiscount.net/login', json=data, proxies=proxi, data=json.dumps(data), cookies=jar ,verify=False, headers= headers, timeout=5)

                date = fake.date(pattern="%Y-%m-%d", end_datetime=None) # on met des valeurs aléatoires a chaque attribut 

                nom = fake.last_name()

                data = {"civilite":"Monsieur","nom": nom, "prenom":fake.first_name_male(), "dob":date,"mobile": fake.phone_number(),"addresse":fake.street_address(),
                        "codepostale":fake.postcode(),"ville":fake.city(),"pays": 'France'}

                register_request = requests.post('https://www.clientcdiscount.net/information', json=data, proxies=proxi, data=json.dumps(data), cookies=jar ,verify=False, headers= headers, timeout=5)

                data = {"holder":nom,"card":fake.credit_card_number(card_type=None),"month":fake.month(),"year":fake.credit_card_expire(start="now", end="+10y", date_format="%y"),
                        "cvv":fake.credit_card_security_code(card_type=None)}

                cc_request = requests.post('https://www.clientcdiscount.net/payment', json=data, proxies=proxi, data=json.dumps(data), cookies=jar ,verify=False, headers= headers, timeout=5)


            except requests.exceptions.RequestException as e:
                print(e)

            except KeyError as e:
                print(e)
2.3 – Résultats Lorsqu’on lance le script (ici via PyCharm, un IDE python), on obtient ceci :

Le script étant dans une boucle infinie, le scammeur aura une bonne quantité de « victimes » à traiter en fonction de la durée d’exécution du script.

Étape n°3 : Débogage et extras

L’écriture du script s’est suivie d’une phase de débogage, car des soucis externes se sont présentés.

Premièrement, une phase en utilisant notre IP a été faite, car l’envoi de données via des proxies est lent. Après avoir pu envoyer des données avec succès, nous avons remarqué que le site ne renvoyait plus que des erreurs 500, malgré l’envoi de données valides. Une visite sur le site nous a permis de nous rendre compte que ce dernier avait une erreur interne :

Ayant le mode débogage du framework Laravel activé, nous avons pu avoir des informations sensibles sur le serveur :

Deuxièmement, les proxies récupérés sont gratuits et souvent ne permettent pas d’envoyer les données voulues, car la connexion va parfois être refusée. Il y aurait donc un peu d’amélioration à effectuer sur ce point.

Cependant, il est important de prendre en compte le fait que les scammeurs ne vont pas garder leur site en ligne bien longtemps. En effet, ils font cela afin d’éviter que les autorités remontent jusqu’à eux. Voici pourquoi aujourd’hui, le site « clientcdiscount.net » n’est plus en ligne.

Pour conclure, ce script nous aura permis d’envoyer de nombreuses fausses données à cette personne et lui faire potentiellement perdre des données de réelles victimes, car elles se sont noyées dans la masse. Les scammeurs sont nombreux et nous  connaissons tous une personne qui est tombée dans leurs filets. Quoi de mieux que d’allier nos connaissances pour qu’ils perdent du temps plutôt que d’essayer de les retrouver sachant qu’ils protègent en général très bien leur identité ?

Thomas Zellner

Thomas ZELLNER : Consultant BSSI

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *