tcpcat.
Projet communautaire open source
N. — NycolazSec
Note technique : 1337
github.com/NycolazSec/tcpcat
Références : Nmap, RFC 793, eBPF/AF_XDP
Septembre 2026
Catégorie : informationnel — évaluation réseau autorisée
Document communautaire — non commercial

tcpcat — reconnaissance réseau hautes performances et test de visibilité IDS/IPS

Note technique communautaire — v1.4

CI: Go test -race Go 1.26 AGPL-3.0 / commercial Linux · macOS · Windows Projet communautaire
OpenSSF Best Practices badge
  [eth0]====-._     _,-'""'-._        _____ ____ ____   ____    _  _____ 
         (,-.'._,'(       |\'-/|      |_   _/ ___|  _ \ / ___|  / \|_   _|
             '-.-' \ )-'( , o o)        | || |   | |_) | |     / _ \ | |  
                   '-    \'_'"'-        | || |___|  __/| |___ / ___ \| |  
    <--[SYN]--(sniffing)--[ACK]-->      |_| \____|_|    \____/_/   \_\_|  
                                        Modular Security & Network Engine
                                         [ eBPF / AF_XDP ] by NycolazSec
Colophon

Statut de ce mémo

Ce document présente tcpcat, un moteur de reconnaissance réseau écrit en Go. Cette note communautaire n'est pas une RFC IETF et ne remplace pas Nmap ; elle décrit une approche complémentaire orientée performances, rapports et évaluation autorisée. Le projet est en double licence : AGPL-3.0 ou licence commerciale (OEM).

Résumé

tcpcat combine un moteur de scan multi-protocoles avec une accélération eBPF/AF_XDP sur Linux. Ses contrôles de variation de paquets et de timing aident les équipes autorisées à évaluer la visibilité de leurs IDS/IPS. Un moteur de détection sandboxé en WebAssembly assure la corrélation avec des bases CVE.

Démarrage rapide

Local

Découvrir la CLI

go run ./cmd/tcpcat --help

Exporter un rapport

go run ./cmd/tcpcat -sV \
        -j report.json 127.0.0.1

Compiler depuis les sources

go build -o tcpcat \
  ./cmd/tcpcat

1. Introduction et spécifications

§1

tcpcat construit lui-même chaque paquet de sonde en espace utilisateur. En mode --ebpf, il les envoie et lit les réponses via des sockets AF_XDP plutôt que par les sockets BSD classiques, sans passer par la pile TCP/IP du noyau. Les valeurs ci-dessous viennent du benchmark du §5.

Plus rapide que Nmap · 65 535 ports
2,6×
Contrôles de variation (phase 4)
29 techniques
Scan complet · 65 535 ports × 2 hôtes
4,5 s
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port         |       Destination Port       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum           |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 1 — En-tête TCP (RFC 793 §3.1). Champs configurables lors d'une évaluation tcpcat :
Flags (SYN/ACK/FIN/Xmas) Window Options / Padding Sequence Number (jitter)

2. Capacités système

§2

2.1 Reconnaissance L2–L7

Énumération multi-protocoles (TCP, UDP, ICMP), cartographie de topologie L3/L4 avec empreinte logicielle, et découverte asynchrone DNS / mDNS / NetBIOS.

SYN · ACK · Window · Xmas · FIN scans

2.2 Noyau Linux eBPF / AF_XDP

Un hook XDP (mode generic) redirige les réponses aux sondes de tcpcat vers des sockets AF_XDP, en contournant la pile TCP/IP du noyau ; tout le reste du trafic la suit normalement. Sur le benchmark du §5 : 8,2 s de CPU au total, contre 11,4 s pour Nmap et 52,8 s pour naabu.

XDP generic (SKB) · AF_XDP · busy-poll

2.3 Intelligence programmable (WASM)

Moteur de détection sandboxé en WebAssembly. Les dissecteurs de protocoles peuvent être écrits en Rust, C, Go ou AssemblyScript.

Corrélation CVE dynamique · Vulners API · Google OSV

3. Test de visibilité IDS/IPS

§3

Des contrôles de variation répartis sur la pile OSI, sélectionnables via --evasion, pour valider la journalisation et les alertes de défenses autorisées.

Profil Variation Usage Surcharge Usage recommandé
offTrafic de référenceInventaire autorisé0 %Cartographie rapide
lightVariation limitéeAudit de production+5 %Impact réduit
moderateVariation standardValidation contrôlée+15 %Environnements surveillés
aggressiveVariation étenduePlan de test approuvé+30 %Laboratoire ou environnement contrôlé
stealthyVariation élevéeScénario de visibilité+50 %Validation encadrée
Couche réseau (L3)
Fragmentation IPv4 et mutation adaptative de la stratégie TTL.
Couche transport (L4)
Ajustement de fenêtre TCP, ports éphémères randomisés, crafting de flags.
Couche session (L5)
Jitter temporel à coefficient de variance réglable (0.0–1.0).
Couche application (L7)
Orchestration distribuée de leurres (decoy swarm) en sockets brutes.

4. Chaîne d'évaluation

Flux

Chaque étape de l'évaluation tourne dans le processus tcpcat ; seul le scan SYN/UDP en mode --ebpf emprunte le chemin noyau ci-dessous. Au lancement, tcpcat assemble son programme XDP directement en Go — sans C ni clang — et le charge via cilium/ebpf. Le noyau le vérifie, le compile, puis ne redirige vers tcpcat que les réponses à ses propres sondes : tout le reste du trafic (SSH, autres services) suit la pile TCP/IP normale.

Architecture eBPF de tcpcat : programme XDP assemblé en Go, chargé via cilium/ebpf, vérifié et compilé par le noyau, puis redirection des réponses vers un socket AF_XDP lu par le processus tcpcat Construction — au lancement du scan Go xdp_asm.go instructions en Go cilium/ebpf/asm bytecode CollectionSpec en mémoire, port source inclus tcpcat_xdp_hook xsks_map Processus tcpcat 1 périmètre --scope-file 2 découverte d'hôtes 3 scan SYN / UDP ⇅ 4 services -sV + CVE 5 rapports JSON / SARIF Exécution cilium/ebpf · bibliothèque Go bpf() syscall Noyau Linux Vérificateur eBPF Compilateur JIT Put(queue → fd) xsks_map eBPF map TX ring RX ring Socket AF_XDP · UMEM redirect Hook XDP mode generic (SKB) lookup attache Pile TCP/IP XDP_PASS Pilote NIC · eth0

← faire défiler le schéma →

Chemin d'un paquet en mode --ebpf. Le détail de chaque bloc est sur la page Internals.

4.1 Échange client → serveur

Ce qui passe sur le fil pour chaque port sondé, et l'état que tcpcat en déduit. Chaque réponse est captée par le hook XDP puis lue via AF_XDP (schéma ci-dessus).

Échanges entre tcpcat et la cible : port TCP ouvert, fermé, filtré, et port UDP fermé tcpcat client · --ebpf cible serveur ÉTAT A · port TCP ouvert SYN SYN/ACK RST tcpcat ferme la demi-connexion OUVERT B · port TCP fermé SYN RST FERMÉ C · port filtré SYN SYN (nouvel essai) délai dépassé, aucune réponse FILTRÉ D · port UDP fermé UDP ICMP 3/3 · port injoignable FERMÉ UDP : toute réponse UDP → ouvert · aucune réponse → ouvert|filtré Nouveaux essais : 2 par défaut (--max-retries) · délai adapté au RTT

5. Benchmark comparatif

§5

Scan SYN des 65 535 ports sur 2 hôtes, même interface et même débit cible (25 000 paquets/s) pour les trois outils. Mesuré avec hyperfine, 3 exécutions chacun.

Plus rapide que Nmap
2,62× ± 0,45
Plus rapide que naabu
4,69× ± 0,78
Durée d'un scan SYN des 65 535 ports sur 2 hôtes : tcpcat 4,47 s, Nmap 11,72 s, naabu 20,95 s en moyenne tcpcat --ebpf 4,47 s ± 0,74 Nmap -sS -T4 11,72 s ± 0,50 naabu 20,95 s ± 0,18 0 5 10 15 20 25 s Barre : durée moyenne · trait : min … max sur 3 exécutions
Outil Moyenne ± σ Min … max CPU utilisateur CPU système
tcpcat --ebpf4.466 s ± 0.7443.623 … 5.028 s2.493 s5.658 s
nmap11.723 s ± 0.50311.150 … 12.094 s5.928 s5.504 s
naabu20.945 s ± 0.18120.739 … 21.077 s21.497 s31.335 s
Commande de mesure exacte
hyperfine --warmup 0 --runs 3 --export-markdown bench_65k.md \
  -n "tcpcat-ebpf" "./tcpcat -i $REAL_IF -p 1-65535 -sS --ebpf --open -T 5 --rate 25000 10.200.0.20 10.200.0.21" \
  -n "naabu"       "naabu -interface $REAL_IF -p 1-65535 -rate 25000 -host 10.200.0.20,10.200.0.21 -silent" \
  -n "nmap"        "nmap -e $REAL_IF -p 1-65535 -sS -n -T4 --min-rate 25000 --max-retries 1 10.200.0.20 10.200.0.21"

Résultats de laboratoire indicatifs. Consultez le dépôt pour la méthode, le matériel et les limites de reproductibilité.

Audit autorisé

Guide

Le profil safe-production fournit un point de départ prudent pour un périmètre explicitement approuvé. Les rapports JSON, SARIF et JSONL facilitent le suivi et l'intégration aux outils de sécurité.

sudo tcpcat \
  --profile safe-production \
  --scope-file scope.txt \
  -Pn -sT -sV -p 443 \
  -j report.json --sarif report.sarif --audit-log audit.jsonl \
  10.42.10.15

Rapports et suivi

Sorties
FormatUtilisation
-j report.jsonRésultats détaillés, services et évaluation CVE.
--sarif report.sarifRésultats pour CI/CD et outils compatibles SARIF.
--audit-log audit.jsonlHistorique append-only d'exécutions autorisées.
--baseline previous.json --changes delta.jsonNouveaux ports, changements de service et nouvelles CVE.

Exemples de résultats

Rapports

JSON

{
  "service": "apache",
  "version": "2.4.49",
  "risk_severity": "high"
}

SARIF

{
  "ruleId": "CVE-2021-41773",
  "level": "error"
}

Évolution

{
  "new_open_ports": [
    {"port": 443}
  ]
}

Support plateforme

Compatibilité
OSSupport
Linux 5.8+Scans socket; eBPF/AF_XDP expérimental sur matériel compatible.
macOSScans TCP Connect; pas d'AF_XDP.
WindowsScans basés sur sockets selon les privilèges disponibles.

Références

Écosystème

Nmap · RFC 793 · eBPF · AF_XDP · OSV · SARIF

6. Référence en ligne de commande

§6
Exemple de sortie de tcpcat : scan SYN avec détection d'OS, 3 ports ouverts sur 1 000 tcpcat — zsh $ sudo tcpcat -sS -O -p 1-1000 192.0.2.10 [*] Running Host Discovery... ├─ [UP] 192.0.2.10 [*] Ports loaded: 1000 port(s) targeted ──────────────────────────────────────────────────────────────────────────────── [i] 192.0.2.10 ─ OS: Linux 3.x-6.x (90% confidence) [+] 192.0.2.10:22 ─ OPEN (time=0.41ms | reason=SYN-ACK Received) [+] 192.0.2.10:80 ─ OPEN (time=0.38ms | reason=SYN-ACK Received) [+] 192.0.2.10:443 ─ OPEN (time=0.44ms | reason=SYN-ACK Received) [~] 192.0.2.10 ─ Not shown: 997 closed port(s) ──────────────────────────────────────────────────────────────────────────────── [✓] Scan completed in 2.103s. Found 3 open port(s) across 1 active target(s). $ ▌
Exemple de sortie abrégée (bannière omise) — adresse de documentation RFC 5737, durées indicatives.
Figure 2 — Cartographie rapide (1000 ports les plus fréquents)
sudo tcpcat -sS --top-ports 1000 --rate 100000 target.lan
Figure 3 — Validation de la visibilité firewall/DPI avec un plan de test approuvé
sudo tcpcat -Pn -sT -p 1-10000 --evasion aggressive --jitter 0.8 --frag --decoy 8.8.8.8,1.1.1.1 target.lan
Figure 4 — Mode eBPF ultra-rapide sur sous-réseau complet
sudo tcpcat --ebpf -p 1-1000 10.0.0.0/16 -w 128 -T 5
Figure 5 — Énumération de versions applicatives, rapport JSON
sudo tcpcat -sV -p 22,80,443,3306,5432,27017 192.168.0.0/24 -j report.json

Limites connues

Important

Contribuer

Open source

Les contributions sont bienvenues pour les détecteurs de services, signatures CVE hors ligne, tests, documentation et compatibilité plateforme. Exécutez la suite avant une pull request.

go test ./...
go build ./cmd/tcpcat

Annexe A. Folklore réseau (informatif, non normatif)

Ann. A

« Il n'y a pas d'endroit comme le 127.0.0.1. » — dans la tradition des RFC humoristiques (cf. RFC 2549, RFC 1149).

A.1 — RFC 768, le dilemme du datagramme

« Je te raconterais bien une blague sur l'UDP... mais je ne suis pas certain que tu la reçoives, et honnêtement je me fiche de savoir si tu l'as comprise. »

A.2 — RFC 793, le barman TCP

Un paquet entre dans un bar : SYN — « Je voudrais une bière. » SYN-ACK — « Tu veux une bière ? » ACK — « Oui, une bière. » Le barman répond RST (port 80 fermé).

A.3 — Extension du modèle OSI

Layer 8 exception : erreur critique identifiée entre la chaise et le clavier. « Avez-vous essayé d'éteindre et de rallumer la table de routage BGP ? »

A.4 — Wireshark à 3h du matin

Filtre !(arp or dns or mdns or ssdp) → 0 paquet. « Qui diffuse du SSDP sur le VLAN de prod à 3h du matin ?! »

A.5 — ICMP Echo Request

64 bytes, icmp_seq=1, ttl=116 — la seule relation stable et sans engagement dans ta vie.

A.6 — MTU 1500 vs bit DF

ICMP type 3, code 4 : « Fragmentation Needed and DF bit set. » Le trou noir des paquets orphelins — tcpcat --frag le contourne nativement.

7. Considérations de sécurité

§7
Usage
autorisé
uniquement

tcpcat est strictement réservé aux audits de sécurité défensifs, tests d'intrusion autorisés et à l'administration d'infrastructures sous mandat explicite. Tout accès ou maintien non autorisé dans un système de traitement automatisé de données est passible de sanctions pénales (art. 323-1 et suivants du Code pénal, CFAA, RGPD). Les auteurs déclinent toute responsabilité en cas d'utilisation illicite.

Le projet est non commercial et ne fournit aucun service de scan hébergé. Les utilisateurs doivent respecter les sanctions, contrôles à l'export et lois applicables. Ce document n'est pas un avis juridique ni une certification de conformité. Voir NOTICE.md.