réseaux
27/02/2019# ivre
$ zeek -r challenge.pcapng
$ ll
-rw-r--r--@ 1 Adel staff 36944476 Nov 20 23:05 challenge.pcapng # base
-rw-r--r--@ 1 Adel staff 9839932 Dec 31 14:27 conn.log
-rw-r--r--@ 1 Adel staff 2771 Dec 31 14:27 dns.log
-rw-r--r--@ 1 Adel staff 1745 Dec 31 14:27 files.log
-rw-r--r-- 1 Adel staff 2378 Dec 31 14:27 http.log
-rw-r--r--@ 1 Adel staff 254 Dec 31 14:27 packet_filter.log
-rw-r--r-- 1 Adel staff 13430 Dec 31 14:27 weird.log
Qu’est-ce qu’un protocole ?
Accord entre les parties sur la façon de communiquer :
- définit le format des données échangées
- définit l’ordre des messages emis et reçus
- définit les réactions à ces messages
# example of HTTP protocol
# socat to create TCP socket
$ socat - tcp:adel-allam.fr:80
# request
GET / HTTP/1.1
Host: adel-allam.fr
# response header
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Tue, 26 Feb 2019 17:54:42 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://adel-allam.fr/
# response body
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
# other way
$ curl -vI adel-allam.fr
On parle souvent de pile de protocoles, c’est-à-dire que chaque couche est associée à un protocole. L’ensemble des couches a été normalisé par l’ISO en 7 couches. C’est le modèle OSI (Open System Interconnection). Il existe aussi le modèle TCP/IP qui est plus simple (seul ce dernier a été implémenté).
Pourquoi un modèle en couches ?
- réduire complexité de conception
- chaque couche fournit des services distincts
Modèle OSI
Layer | Number | PDU (Protocol Data Unit) | |
---|---|---|---|
Application |
7 | application services (HTTP, Telnet, FTP, SIP) | |
Presentation |
6 | data translation (MIME), encryption (SSL), compression | |
Session |
5 | dialog control, synchronization | |
Transport |
4 | reliable (TCP, UDP, TCP, SCTP) | Segment |
Network |
3 | source-to-destination (IP), routing, address resolution | Packet |
Data Link |
2 | wireless link (802.11), wired link (802.3) | Frame |
Physical |
1 | fiber, radio, bluetooth | Bits |
Modèle TCP/IP
Layer | Protocols |
---|---|
Application |
FTP, DNS, SSH, SNMP, SMTP, HTTP, TFTP, DHCP |
Transport |
UDP, TCP |
Network |
IPv4, IPv6, IP NAT, IPSec, routing(RIP, OSPF, BGP) |
Date Link, Physical |
SLIP, PPP |
Les clients et les serveurs possèdent 7 couches, les routeurs, eux, n’en n’ont besoin que de 3 (Network
, Data Link
, Physical
). Car ces derniers ne sont là que pour réaliser l’action de routage.
Les protocoles dans le monde TCP/IP sont définis par les RFC
(Request For Comment). Ces documents expliquent en détails toutes les caractéristiques d’un protocole donné.
Types de communication en TCP/IP
mode connecté
- unicast
- données arrivent dans l’ordre
- pas de perte
- communication bi-directionnelle (2 sens) et full-duplex (simultanée)
- demande d’accord entre les 2 intercoluteurs, 2 demi-connexions
- mode offert par
TCP
, Transport Control Protocol (mode connecté simulé par TCP sur réseau en mode datagramme)
mode datagramme
- unicast ou multicast
- données dans paquets de taille limitée
- possibles pertes de paquets
- mode offert par
UDP
, User Datagram Protocol
Modèle client/serveur
En TCP/IP, les communications fonctionnent souvent suivant un modèle client/serveur. Un serveur est en attente de la connexion de clients sur un port. Derrière ce dernier, se trouve un service que le client veut contacter. Un serveur peut fournir plusieurs services (ex: web, mail, dns). On utilise la notion de ports afin de différencier (multiplexer) les services. Ces numéros de ports sont standardisés. Sous Linux, on peut les retrouver dans /etc/services
. Ces derniers sont définis sur 16 bits, allant 1 à 65 535.
Une communication est identifiée par un couple de TSAP
(Transport Service Access Point) : (TSAPsrc., TSAPdst.), un TSAP est composé d’une adresse IP et d’un numéro de port: ('10.0.0.10',80)
.
Un socket fourni un moyen de communication entre processus, identifié par un TSAP unique.
TCP
- protocole de transport fiable, mode connecté, mode full-duplex
- socket TCP peut traiter plusieurs connexions simultanément
- communication = TSAPcli <-> TSAPsrv
- flot continu de données, reçu dans l’ordre
UDP
- protocole de transport non-fiable, sans connexion
- manipule des datagrammes, 1 datagramme UDP = 1 datagramme IP
- ordre de réception des paquets non garantie
# TCP server
socket
bind
listen
accept # return new discussion socket
recv, send
close
# TCP client
socket # get system port number
connect # connect to server
recv, send
close
# UDP server
socket
bind
recvfrom, sendto
close
# UDP client
socket
recvfrom, sendto
close
Les connexions d’une machine sont visibles avec $ netstat
ou $ ss
.
socket()
: permet de créer un TSAP, c’est-à-dire un nouveau point d’accès de service de transport. On doit lui fournir 3 paramètres:
- famille d’adresses utilisées
AF_UNIX
pour du localAF_INET
pour de l’IPv4AF_INET6
pour de l’IPv6
- type de service demandé
SOCK_STREAM
flot d’octets (mode connecté)SOCK_SGRAM
datagramme (mode non connecté)
- protocole de transport utilisé
IPPROTO_TCP
IPPROTO_UDP
IPPROTO_ICMP
bind()
: permet d’attribuer un numéro de port au socket.
listen()
: utilisé en mode connecté, lorsque plusieurs clients sont susceptibles de demander une ou plusieurs connexions avec le serveur.
accept()
: utilisé en mode connecté, permet de se bloquer en attente d’une nouvelle demande de connexion, la connexion devient complète entre les 2 processus. Il renvoie un pointeur sur un nouveau socket de structure identique au précédent, le socket original sert à établir une nouvelle connexion, la nouvelle permet l’échange avec le client associé.
connect()
: permet à un client de se connecter à un serveur, ouvre connexion entre les 2, on lui fourni l’adresse IP du serveur.
send()/recv()
: permettent l’échange d’informations au travers du socket.
Serveur python
#!/usr/bin/env python3
import socket
access_mask = '' # filtre les clients, ici aucun n'est filtre
server_port = 6688
my_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
# be able to re-use the port faslty
my_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
my_sock.bind((access_mask, server_port))
# configure the queue
my_sock.listen(socket.SOMAXCONN)
# return new cocket
(cli_sock, tsap_cli) = my_sock.accept()
print ("New connection from: ", tsap_cli)
while 1:
ligne = cli_sock.recv(1024)
if not ligne :
break
print(ligne)
cli_sock.close()
my_sock.close()
Client python
#!/usr/bin/env python3
import socket, sys
server_addr = socket.gethostbyname('localhost')
server_port = 6688
my_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
my_sock.connect((server_addr, server_port))
except Exception as e:
print (e.args)
sys.exit(1)
while 1:
cli_input = input(':>')
if not cli_input:
break
my_sock.sendall(cli_input.encode() + b'\n')
my_sock.close()
Fondamentaux
Dans Ethernet, Wi-Fi, Bluetooth : chaque carte réseau possède une adresse matérielle MAC (Medium Access Control), qui est unique, sur 6 octets (48 bits). Elle est divisée en 2 parties de 3 octets, la première pour désigner le constructeur (OUI, Organization Unique Identifier), la seconde est un numéro de série définie par le constructeur. L’adresse MAC pour réaliser du broadcast est ff:ff:ff:ff:ff:ff
.
Routage directe et indirect
- routage directe: les 2 machines qui communiquent font partie du même réseau, pas besoin d’intermédiaire, car elles communiquent directement
- routage indirect: les 2 machines ne font pas partie du même réseau local, il faut donc passer par un intermédiaire pour sortir du réseau courant pour aller vers l’extérieur (via passerelle ou gateway)
Routage -> comment choisir par quels intermédiaires passer ?
Les réseaux de types diffusion sont définis dans les réseaux de petites tailles comme les LAN (Local Area Network). Les réseaux point à point quant à eux sont souvent utilisés comme réseaux d’interconnexion, constitués uniquement de routeurs. La combinaison de ces 2 types de réseaux forme des WAN (Wide Area Network).
# broadcast network
$ ip link
<BROADCAST,...>
# point to point network
$ ip link
<POINTTOPOINT,...>
Le datagramme va passer d’intermédiaire en intermédiaire, il fait des sauts (ou hop), décider entre routage direct et indirect. Le routage indirect peut faire le choix entre différentes adresses de routeurs, le routeur détermine l’adresse de prochain saut. On utilise les tables de routages. Chaque routeur prend une décision au mieux, best effort. Pour cela, il utilise des next hop routing algorithms.
Les différents types de réseaux utilisés:
- bus : n’existe plus, réseau à diffusion, collisions d’accès (protection avec collision detection et collision avoidance)
- ring : utilisé chez ISP (Internet Service Provider ou FAI) pour liaison rapide en fibre optique, système de jeton (token ring) -> pas de collisions
- star : matériels connectés à un noeud de connexion central
- mesh : matériel possède une ou plusieurs connexions avec les autres matériels, meilleur résistance (resilience), économie de moyens par rapport à maillage complet
Matériel d’interconnexion
- Repeater
- régénère, réamplifie la transmission vers tous les ports
- augmenter distance
- lutter contre atténuation (ex: fibre sous-marine)
- même domaine de diffusion
- même domaine de collision
- Hub
- répéteur multiports
- Bridge
- relaie trame d’un domaine de collision à un autre, si l’émetteur et le destinataire sont dans deux sous-domaines différents (1 domaine par port)
- apprend le sous-domaine où chaque hôte est localisé grâce à son @mac
- si @mac src. et @mac dest. sont derrières le même port, alors ne forward pas
- même domaine de diffusion
- divise domaine de collision en sous-domaines
- Switch
- bridge multiports, plus rapide et performant
- même domaine de diffusion
- 1 port = 1 domaine de collision
Gouvernance d’internet
Organismes chargés de la gestion des adresses et des noms de domaines :
- AfriNIC (Afrique)
- APNIC (Asie, Pacifique)
- ARIN (Amérique du Nord)
- LACNIC (Amérique dur Sud)
- RIPE NCC (Europe, Moyen-Orient)
Les organismes chargés d’allouer les adresses sont des RIRs, Regional Internet Registries.
Registrar : bureau d’enregistrement, permet dépôt de noms de domaines internet.
GIP Renater : Groupement d’intérêt public, réseau de la recherche en grande, réseau National de télécommunication pour le Technologie de l’Enseignement et le Recherche.
Adresses IPv4
Chaque routeur et machine d’un réseau doivent posséder une adresse IP.
(les classes : le 0 se fait doubler par des 1 à gauche)
Adresse | Classe |
---|---|
0..... |
A |
10.... |
B |
110... |
C |
1110.. |
D (multicast) |
Classe A sont peux utilisées :
3.0.0.0/8
AS80 General Electric Company.
Adresses IP réservées pour des usages particuliers
224.0.0.0/4
: multicast127.X.Y.Z
: loopback0.0.0.0
: processus d’amorçage (BOOTP)255.255.255.255
: broadcast- private addresses:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
- APIPA (Automatic Private Internet Protocol Addressiong)
- lorsqu’il n’y a pas de DHCP
169.254.0.0/16
Réseaux normalement non routés, ni diffusés dans BGP, sauf que…
$ whois -h rischois.ripe.net 192.168.0.0
route: 192.0.0.0/3
origin: AS3303
ARP
- Address Resolution Protocol
- correspondance entre une @IP et une @MAC
- avant d’envoyer un paquet IP, il faut connaître adresse physique MAC, sinon on utilise ARP pour l’avoir
- ARP Request et ARP Reply
- ARP ne sert quand dans les réseaux locaux !
RARP (obsoléte)
- Reverse Address Resolution Protocol
- machine sans adresse IP envoie RARP pour en obtenir une
- utilisé pour amorcer station sans disque, ou une imprimante, …
Trame Ethernet
@MAC dst. | @MAC src. | EtherType | Data | Padding | FCS |
---|---|---|---|---|---|
6 octets | 6 octets | 2 octets | 0 à 1500 octets | 0 à 46 octets | 4 octets |
- EtherType :
0x0800
-> IPv40x08DD
-> IPv60x0806
-> ARP0x8100
-> VLAN- …
- Data + éventuellement bourrage si len(DATA) < 46 octets
- FCS : Frame Check Sequence ou Checksum, si faux, alors non transmise au système d’exploitation
- trame de 64 à 1518 octets
- 1 trame = 1 paquets IP (encapsulation)
Modification malveillante de la table ARP:
- ARP Spoofing (usurpation d’identité)
- ARP Cache Poisoning (insertion d’association erronée)
DNS, Domain Name Server : Principe de délégation
- système distribué mondial, utilise la délégation de domaines
- tout domaine est associé à une responsabilité administrative (organisation)
- découper le domaine en sous-domaines
- déléguer les sous domaines à d’autres organisations (arbre avec racine le
.
ensuitefr
oucom
, ensuiteunilim
ouamazon
)
$ whois unilim.fr
Un serveur de nom a autorité administrative sur une zone (ex: .fr
ou amazon.fr
).
Fonctionnement du DNS
- application utilise nom de domaine (ex:
bonjour.fr
) - application demande la traduction du nom de domaine auprès d’un serveur de nom (DNS), c’est la “résolution de nom” ou “name resolver”
- s’il fait autorité sur le domaine demandé
- et qu’une association est trouvée entre le domaine et une IP, il renvoi l’IP
- si pas d’association, pas de réponse (la machine n’existe pas)
- s’il ne fait pas autorité, le serveur de nom interroge d’autres serveurs de nom (du plus grand suffixe commun) pour trouver, puis la mettre dans son cache une certaine durée et répondre
- s’il fait autorité sur le domaine demandé
Sur les machines, le “resolver” est le processus qui s’occupe de réaliser la traduction.
# DNS requets
$ dig +trace @164.81.1.5 www.google.fr
# @164.81.1.5: use this specific DNS server
# request to root servers ("."), then ".com", then "google.com", and finally "www.google.com"
# ";; Received 92 bytes from 193.0.14.129#53(k.root-server.net) in ..." show us that a previous server respond us
Les root servers sont hard codé dans le système d’exploitation.
Résolution inverse
Consiste à obtenir un domaine à partir d’une @IP.
Ex: On tronspose 164.81.60.43
avec w.x.y.z
et on renvoi z.y.x.w.in-addr.arpa
, on obtient alors 43.60.81.164.in-addr.arpa
. On fait cela car la résolution de nom de domaine se fait de droite à gauche. in-addr.arpa
a 256 sous-domaines, composé eux même de 256 soud-domaines, etc…
# reverse dns (-x) of 164.81.60.163 using the server @164.81.1.4
$ dig +short @164.81.1.4 -x 164.81.60.163
$ dig +short -x 8.8.8.8
Un serveur DNS possède une base, composée d’enregistrements, appelé RR, Rousource Records
.
Quelques directives :
A
: correspondance nom -> adresse IPv4AAAA
: correspondance nom -> adresse IPv6CNAME
: alias ou surnomMX
: Mail eXchanger, serveur de mails
# short response
$ dig +noall +answer adel-allam.fr
adel-allam.fr. 21599 IN A W.X.Y.Z
# ipv6 with AAAA
$ dig +short AAAA www.renater.fr
ix1-pv-lbl-vip-194-57-3-7.renater.fr.
# SOA request
$ dig soa unilim.fr
# TTL decrease
$ dig +noall +answer gmail.com
gmail.com. 299 IN A 216.58.213.165
...
...
$ dig +noall +answer gmail.com
gmail.com. 274 IN A 216.58.213.165
$ dig +short mx unilim.fr
$ dig +short mx google.com
L’ordre des réponses varie afin de ne pas surcharger un serveur, pour cela, on utilise des algorithmes de Round-Robin
.
Obtenir des infos sur une IP avec DNS (remplace la commande host
).
$ dig 4.1.81.164.origin.asn.cymru.com TXT +short # give IP
"1935 | 164.81.0.0/16 | FR | ripencc | 1993-01-04"
# AS numero, addr block, country, ...
$ dig AS1935.asn.cymru.com TXT +short # give AS
"1935 | EU | ripencc | 1993-09-01 | FR-RENATER-LIMOUSIN Reseau Regional Limousin, FR"
Conception de réseaux : la segmentation
Subnetting
- passer d’un réseau en
/24
à 2 réseaux en/25
ou en 4 réseaux/26
,…
Supernetting
- passer de 2 réseaux en
/25
en un réseau/24
VLSM
- Variable Length Subnet Masks
- plusieurs masques de sous-réseaux compatibles hiérarchiquement
- passer d’un réseau
/24
en 1 réseaux/25
et 2 réseaux/26
- le but est de se rapprocher le plus possible des besoins en @ IP
CIDR
- Classless InterDomain Routing
- utiliser la notation
192.168.0.0/16
au lieu de192.168.0.0
et255.255.0.0
- on ne parle plus de notion de classe
Simplification du routage
Certains blocs sont associés à des régions du monde. Par exemple, quant un routeur hors d’Europe reçoit une paquet à destination de 194.x.y.z
ou 195.x.y.z
, il doit l’expédier vers un routeur européen.
CIDR de /1
à /32
, les /31
sont réservés pour connexion point à point entre routeurs. On parle de réseaux d’interconnexion: réseaux uniquement composés de routeurs.
Le CIDR est similaire au VLSM:
- le VLSM est réalisé à l’intérieur du réseau de l’organisation et il est caché de l’extérieur
- le CIDR est réalisé par les différents organismes, FAI, et il est visible de l’extérieur
Domaine de diffusion et de collision
Domaine de diffusion: zone de taille maximale où il est possible de recevoir un message envoyé dans une zone, limite de transmission d’une trame.
Domaine de collision: zone du réseau où il existe une compétition pour l’accès à cette zone, les collisions peuvent provoquer une baisse de débit par rapport à la capacité du réseau.
Commutation
- couche 3: routeur, , il retransmet, “forward” les datagrammes, il réalise du routage
- couche 2: pont, il retransmet, “forward” des trames, réalise de la commutation
- couche 1: répéteur, ne commute pas, mais allonge les distances, il retransmet les bits
- modes de commutation:
cut-through switching
: commutation le plus rapidement possible.store-and-forward"
: commutation après réception totale
Switch VLANs
- créer plusieurs domaines de diffusion segmentés
- plusieurs ports à un domaine de diffusion
- réaliser travail de pont entre ces différents ports
- le switch crée des LANs virtuels, appelés VLANs
VLANs :
- on a plusieurs domaines de diffusion, broadcast domaines avec un seul matériel
- associer un port à un VLAN
- personne peut rester dans un bureau tout en migrant dans un VLAN différent
- permet de faire de la segmentation
Table de routage
Chaque entrée contient :
- le réseau de destination
- l’adresse du prochain saut
- routage directe : interface du routeur s’il est connecté au réseau de desti.
- routage indirecte : @ du prochain saut pour atteindre desti.
- la table contient aussi une route par défaut, pour les desti. inconnues
desti. | next hop |
---|---|
10.10.0.0/16 |
eth0 |
10.20.0.0/16 |
10.10.0.1 |
192.168.0.1 |
10.20.0.1 |
default |
10.10.0.1 |
# suivre routage avec traceroute de scapy
>> sn,unans = traceroute(['www.unilim.fr'], maxttl=10)
Diffusion dans un réseau
- Unicast : pour un seul desti.
- Broadcast : pour tout le monde
- Multicast : pour un groupe
Le multicast dans IPv4 est limité au réseau local, mais peut être retransmis par un routeur s’il est configuré pour le faire.
La classe D est réservée pour le multicast: 224.0.0.0/4
de 224.0.0.0
à 239.255.255.255
. Aussi, il existe des groupes prédéfinies:
Address | Destination |
---|---|
224.0.0.1 |
All hosts on a subnet |
224.0.0.2 |
All routers on a subnet |
224.0.0.5 |
All OSPF routers |
224.0.0.9 |
All RIPv2 routers |
224.0.0.12 |
DHCP server |
224.0.1.1 |
NTP |
224.0.0.251 |
Multicast DNS |
On associe à ces adresses une @MAC particulière:
- commence par
01:00:5e
- se termine par les 23 derniers bits de l’IP du groupe
# join multicast group
gestion_mcast = struct.pack("4sl", socket.inet_aton("224.0.0.127"), socket.INADDR_ANY)
ma_socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, gestion_mcast)
ma_socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 0)
# IP_MULTICAST_LOOP : choose if emeter will receive its own paquets
Multicast et routeurs
Lorsqu’une machine rejoint un groupe multicast, elle diffuse un message au format IGMP, Internet Group Management Protocol. Cela permet de prévenir les routeurs présents dans le réseau, même chose lorsqu’elle quitte le groupe. Les routeurs devront donc relayer vers cette machine les paquets du groupe multicast.
IGMP : Internet Group Management Protocol
# create a group
$ socat stdio udp-recvfrom:7182,ip-add-membership=224.0.0.127:eth0,fork
# listen IGMP paquets
$ sudo tcpdump -nvveX -i eth0 igmp
# to_ex {} : quitte l'execlusion donc rejoindre
# to_in {} : terminaison du groupe
Les switchs écoutent les ports qui diffusent des messages IGMP pour limiter le multicast des paquets, il réalise de l’IGMP snooping, IGMP : vers 224.0.0.22
.
Ex: diffusion d’un flux RTP, Real Time Protocol, pour la diffusion d’un flux vidéo au travers d’un routeur, protocole fourre-tout pour différents types de flux, basé UDP, ports 6970 à 6999.
mDNS: localisation de services dans un réseau privé
- basé sur des paquets DNS traditionnels
- chaque hôte possède sa propre liste d’enregistrements (A, MX, SRV,…)
- chaque hôte diffuse liste des services qu’il offre grâce au champ SRV
- en
.local
- en multicast
224.0.0.251
, port 5353 en UDP, @MAC =01:00:5e:00:00:fb
Datagramme IP
Version
: 4 bits, 4 (pour IPv4) ou 6 (pour IPv6)Header Length
: 4 bits, longueur en nombre de mots 4 octets, souvent à5
, c’est à dire 20 octets car 4*5=20 (en-tête de mini 20 octets (sans option))Type of Service
: 8 bits, indique la manière dont doit être géré le datagramme par le routeur- priorité (4 premiers bits) de 0 à 7 (même administration)
- les 4 bits: D, T, R et C spécifient ce que l’on veut privilégier, D : minimiser délai, T : maximiser débit, R : fiabilité, C : coût de transmission, DTRC tout à 1 pour la sécurité, on recycle les bits 6 et 7 pour l’ECN, Explicit Congestion Notification, permet de détecter l’entrée en congestion du réseau, c’est à dire qu’il va bientôt saturer
Total Packet Length
: 16 bits, taille en octets du datagramme (en-tête + data)Identification
: 16 bits, pour regrouper après fragmentationFlags
: 4 bits, pour fragmentationFragment Offset
: 12 bits, pour fragmentationTTL
: Time To Live, nombre de routeurs que peut traverser le datagramme avant d’être détruit (val défaut: 128), quand routeur détruit paquet avec TTL = 0, envoie ICMP, permet de ne pas avoir de paquets indéfiniment dans un réseauProtocol
: 8 bits, indique protocole de couche supérieur, 1 : ICMP, 6 : TCP, 2 : IGMP, 17 : UDPHeader Checksum
: 16 bits, assure intégrité de l’en-tête, complément à 1 de la somme des valeurs de l’en-tête, pour détection d’erreurSrc. Address
: 32 bitsDest. Address
: 32 bitsOptions
: liste de longueur variable, mais toujours complétée par bits de bourrage, pour avoir mutliple de 4 octets, très peu utilisées, si Header Length > 20, alors on a des options.
ICMP
- Internet Control Message Protocol
- effectue contrôle des échanges
- permet de debugger un réseau
- différents messages avec signification
- messages d’erreurs
- messages de requêtes
Type
: 8 bitsCode
: 8 bitsChecksum
: 16 bitsData
: 32 bits
Attaques utilisant ICMP
-
reconnaissance d’un réseau
-
ICMP Sweep, balayer plage d’adresses d’un réseau (ex: nmap)
- Traceroute : envoi successif de datagramme avec valeur TTL incrémenté de 1
- lorsque routeur forward datagramme, il décrémente le TTL
- si TTL = 0, routeur répond un ICMP Time Exceed, @src = @routeur
- on a info sur chemin et topologie du réseau traversé
- Firewalking : amélioration d’un traceroute classique
- traceroute classique pour déterminer le nombre n de sauts, hops jusqu’au firewall
- envoyer datagramme avec TTL de n+1 et associé à un protocole choisi:
- si ICMP Time Excedeed est reçu, alors le datagramme a réussi à traverser le firewall
- sinon, une règle de firewall a filtré le datagramme
- Inverse Mapping : mapper réseau interne protégé par un firewall
- attaquant envoi paquets ICMP Echo Reply vers plage d’adresses présumées derrière le firewall
- le firewall autorise à passer car il ne maintient pas de liste des requêtes ICMP (sauf bon firewall ou bonne conf.)
- s’il existe un routeur interne, ce dernier retourne ICMP Host Unreachabble pour chaque hôte indisponible du réseau, ce qui informe par déduction, l’attaquant sur les machines présentes dans le réseau
- L’OS Fingerprinting : reconnaitre OS d’une machine
- envoi datagramme UDP avec DF à 1 vers cible avec num de port fermé
- cible retourne ICMP Destination Port Unreachable
- en analysant le format du paquet ICMP réponse, on peut avoir des info sur la cible (un Linux ? un mac ? un PC ?)
- autres façon : comparer paquets ping envoyé par un mac et un pc
- ICMP Route Redirect : paquet envoyé par un routeur lorsqu’il:
- reçoit du trafic d’un hôte et que le prochain saut de ce trafique (en regardant sa table de routage) est dans le même réseau que celui de l’hôte
- possible de faire du Man-In-The-Middle
- attaquant prend le contrôle du routeur R1
- attaquant envoi ICMP Redirection vers le victime en prenant la place du routeur R2, utilisé par la victime
- cette redirection demande à la victime de modifier sa table de routage pour passer par R1 au lieu de R2
- l’attaquant intercepte le trafic sur R1
-
paquets ICMP Oversized : paquet ICMP de taille maximale envoyé vers la victime fait planter sa pile TCP/IP
-
ICMP Router Discovery : paquets transmis dans le réseau pour permettre à un hôte de découvrir les routeurs présents : router solicitation
- attaquant peut répondre par un “Router Advertisement” et prendre la place du routeur par défaut pour la victime
-
ICMP Floods: inonder victimes de messages ICMP, pour ralentir et peut-être l’empêcher de communiquer
- Smurt Attack: envoi de paquets ICMP Echo Request en diffusion sur le réseau, avec adresse de la victime en adresse source
- ne fonctionne plus
- Le Tunneling: encapsuler des données dans paquets ICMP (exfiltration), difficile à découvrir, et peut-être chiffré
Fragmentation
Encapsulation dans Ethernet
Si MTU
(Maximum Transmission Unit) est égale à 1500, alors, taille datagramme IP <= 1500 octets. Si supérieur, il faut découper, un datagramme IP est divisé en plusieurs autres datagrammes IP (avec en-tête).
Fragmentation
Datagramme IP ont taille sur 16 bits, dans 65 535 octets max, la MTU peut changer sur les tronçons du réseau. Chaque fragment doit avoir la plus grande taille possible et qui est multiple de 8 octets.
1 fragment = 1 datagramme IP:
Identification
: tous les fragments ont le même idFragment Offset
: position du début du fragment dans le datagramme initial (mutliple de 8)Total Packet Length
: recalculé pour chaque fragmentFlags
: 3 bits- pas utilisé
DF
: Don’t Fragment, indique si datagramme peut-être fragmenté ou non, si routeur doit fragmenter alors que DF = 1, alors datagramme détruit et ICMP d’erreur envoyéMF
: More Fragment, indique si c’est un fragment- 0: dernier ou pas de fragmentation
- 1: sinon
Défragmentation
À la réception du premier fragment, on déclenche un temporisateur de réassemblage (délai max. d’attente de tous les fragments).
Métriques
- Latency: temps de A vers B
- RTT, Round Trip Time, temps A->B + B->A, latence environ = RTT/2
- Gigue: jitter, variation de la latence au cours du temps, Jitter = latency(t)-latency(t-1), mesure importante pour les communications en “temps réel”
- mieux vaut une forte latence avec gigue stable, qu’une faible latence avec gigue important
- les paquets peuvent arriver dans le désordre à cause de la variation de la latence au cours de l’envoi
- si gigue = 0, alors latence stable, sinon latence varie
# mesure RTT
$ ping -c 5 164.81.1.4
$ ping6 fe80:1030:5329:6d2c:211:deff:fead:beef -I eth0
--- 164.81.1.4 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 45.614/46.351/47.507/0.827 ms
# mdev est le gigue
- le débit
- en bits/seconde, en puissance de 10
- quantité d’information par unité de temps remis à son destinataire
- occupation du canal: ratio par rapport au débit physique du réseau
- débit utilisateur: ratio des données utiles (sans en-têtes) par rapport à toutes les données transmises
- QoS; Quality of Service, débit pour un type de service (VoIP, Web,…), suppose que les communications peuvent être identifiées
Circuit virtuel vs Datagramme:
- Circuit virtuel:
- débit obtenu est très proche de celui offert en théorie par le réseau physique
- lors de l’établissement du circuit virtuel, on peut connaître le débit prévisible
- le débit peut-être garanti, QoS
- Datagramme:
- capacité partagée entre les utilisateurs
- ne peut pas être garantie (on ne peut pas savoir ce que font les autres utilisateurs)
- contrôle de flux augmente l’utilisation du réseau et diminue son débit
- pertes de paquets peuvent arriver (ex: pendant congestion)
- peu ou pas de QoS, uniquement sur des parties contrôlées par l’entreprise par exemple
Flow control vs Congestion control
Flow control: ne s’applique que sur une communication et entre deux interlocuteurs, éviter qu’un émetteur rapide sature (plus de place dans le buffer de réception) un récepteur lent -> le récepteur contrôle l’émetteur via mécanisme de fenêtre.
Congestion control: dépends de l’état du réseau global, suite à perte de segments, utiliser nouvelle fenêtre d’autorisation d’émission.
# mutliplexag
$ netstat -n --inet
Segmentation
TCP Segmentation
- manipule des flux d’octets de longueur variable, données à envoyer sont bufferisées afin d’améliorer les performances:
- à l’envoi: améliorer taux d’occupation du réseau
- à la réception: avertir/réveiller l’application que lorsqu’il y a un volume suffisant de données à traiter
- données divisées en segments de taille optimale pour TCP
- 1 segment = 1 datagramme IP
Acheminement
- Taille de fenêtre d’émission (défini par récepteur), buffer d’envoi
- Taille de fenêtre de réception, buffe de réception avec rangement via l’offset du segment
- système d’ACK du suivant et de timeout avant retransmission, RTO, Retransmission TimeOut, calculé en fonction du RTT d’un segment
- amélioration : delayed ACK ou acquittement cumulatif, acquitter plusieurs messages passés
TCP Header
Source Port
: 16 bits, identifie le processus associé et défini le TSAPDestination Port
: 16 bits, sameSequence Number
: 32 bits, offset à partir d’une valeur initial (ISN, Initial Sequence Number), position du segment dans le flux à recomposerAcknowledge Number
: 32 bits, num seq. du prochain segment attendu, acquitte les octets précédemment reçusHeader Length
: 4 bits, taille en mutliple de 4 octetsRESV
: 4 bits, réservé pour usage ultérieurECN
: 2 bits, Explicit Congestion Notification, avertir le récepteur d’un état de début de congestion, le routeur gérant l’ECN position un bit dans l’en-tête IP ou TCP afin d’informer le récepteurFlags
: 6 bitsURG
: indique des données urgentes par le Urgent PointerACK
: accusé de réception présent dans Acknowledgement NumberPSH
: segment envoyé sans bufferisationRST
: réinitialiser la connexion, problème de synchro.SYN
: synchroniser Sequence NumberFIN
: l’émetteur à fini d’émettre (permet de clore un sens de communication)
Windows Size
: 16 bits, pour contrôle de flux par fenêtre glissante, indique nombre d’octets que l’émetteur est prêt à recevoir, le destinataire utilise cette info. pour gérer son débit d’envoiTCP Checksum
: 16 bits, total de contrôle pour assurer la validité de l’en-tête et des donnéesUrgent Pointer
: 16 bits, si bit URG, indique début des données urgentesOptions
- MSS: Maximum Segment Size, indiqué lors de l’établissement de la connexion, le taille max des données d’un segment (sans en-tête) TCP que l’on peut recevoir
Établissement d’une connexion
Piggybacking: l’ACK d’un paquet A -> B, peut-être transmis dans un paquet allant de B -> A.
Handshake:
- 3 étapes
- demande d’ouverture de la part de chaque interlocuteur
- permet de synchroniser l’ISN
connect()
-> SYN=1 et ACK=0accept()
-> SYN=1 et ACK=1
# tcpdump
[S] -> SYN
[S.] -> SYN/ACK
[.] -> ACK
Fermeture
- FIN ->
- ACK <-
- FIN <-
- ACK ->
ou
- FIN ->
- ACK <-
- RST <-
Bit RST
- demande réinitialisation de la communication
- émis en rapport à une connexion
- nom existante
- existante: segment qui ne correspond pas à celui attendu
Segments Keep-Alive
: garder en vie la connexion en évitant qu’un routeur réalisant du filtrage, supprime la connexion du fait de son inactivité, de tester la présence de l’interlocuteur, et de mettre fin sinon.
Calcul du Timeout
- plus long que RTT, mais le RTT varie
- si trop court: risque de retransmettre des segments pour rien
- si trop long: réaction trop lente aux pertes de segments
# conf. de TCP sous Linux
$ ls /proc/sys/net/ipv4/tcp*
UDP
- inverse de TCP
- souvent bit DF dans IP
- est stateless
- multicast
- utilisé pour application: demande-réponse, temps réels, NTP, DNS, VoIP, IPTv
# liste ports en attente
$ netstat -lp --inet
Source Port
: 16 bitsDestination Port
: 16 bitsLength
: 16 bits, inclus en-tête de 8 à 65353 octetsChechsum
: 16 bitsData
: optionel
NAT, SNAT, DNAT, PAT, DMZ
NAT: Network Address Translation
- partage d’une adresse IP publique entre plusieurs machines
- car manque d’adresses en IPv4
- utilise réseaux privées (donc non routable):
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
Le routeur NAT doit changer l’adresse IP privée du paquet en la sienne, différencier les paquets de machines différentes, garder une trace de toutes les connexions TCP et UDP qui le traverse, Connection Tracking, principe des stateful firewalls.
- static NAT: plusieurs privées vers une publique
- dynamic NAT: plusieurs privées vers plusieurs publiques
- masquerading: comme static NAT, mais sans spécifier d’adresse
$ conntrack -L
# tcp ou udp (mémorise l'envoi et on attend paquet avec TSAP inverse)
SNAT: Source NAT
- changer adresse source d’un paquet
- utilisé pour aller sur internet à partir d’un réseau privé
DNAT: Destination NAT
- adresse publique vers privée
- port forwarding: public vers privée en fonction du numéro de port
PAT: Port Address Translation
- faire du SNAT en mode masquerading (many-to-one) en changeant au besoin le port d’origine
- faire du DNAT en fonction d’un numéro de port choisi qui peut être différent du port de destination final.
DMZ: Demilitarized Zone
- redirige tout le trafic en provenance de l’extérieur vers une machine du réseau privée en plus de faire du masquerading en sortie.
- SNAT + DNAT = full NAT
QoS: Quality of Service
La qualité de service (QdS) ou Quality of service (QoS) est la capacité à véhiculer dans de bonnes conditions un type de trafic donné, en termes de disponibilité, débit, délais de transmission, gigue, taux de perte de paquets…