tcpcat — reconnaissance réseau hautes performances
et test de visibilité IDS/IPS
Note technique communautaire — v1.4
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
LocalDécouvrir la CLI
go run ./cmd/tcpcat --help
Exporter un rapport
go run ./cmd/tcpcat -sV \
-j report.json 127.0.0.1Compiler 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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2. Capacités système
§22.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
§3Des 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é |
|---|---|---|---|---|
| off | Trafic de référence | Inventaire autorisé | 0 % | Cartographie rapide |
| light | Variation limitée | Audit de production | +5 % | Impact réduit |
| moderate | Variation standard | Validation contrôlée | +15 % | Environnements surveillés |
| aggressive | Variation étendue | Plan de test approuvé | +30 % | Laboratoire ou environnement contrôlé |
| stealthy | Variation élevée | Scé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
FluxChaque é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.
← faire défiler le schéma →
--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).
5. Benchmark comparatif
§5Scan 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
| Outil | Moyenne ± σ | Min … max | CPU utilisateur | CPU système |
|---|---|---|---|---|
| tcpcat --ebpf | 4.466 s ± 0.744 | 3.623 … 5.028 s | 2.493 s | 5.658 s |
| nmap | 11.723 s ± 0.503 | 11.150 … 12.094 s | 5.928 s | 5.504 s |
| naabu | 20.945 s ± 0.181 | 20.739 … 21.077 s | 21.497 s | 31.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é
GuideLe 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| Format | Utilisation |
|---|---|
-j report.json | Résultats détaillés, services et évaluation CVE. |
--sarif report.sarif | Résultats pour CI/CD et outils compatibles SARIF. |
--audit-log audit.jsonl | Historique append-only d'exécutions autorisées. |
--baseline previous.json --changes delta.json | Nouveaux ports, changements de service et nouvelles CVE. |
Exemples de résultats
RapportsJSON
{
"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é| OS | Support |
|---|---|
| Linux 5.8+ | Scans socket; eBPF/AF_XDP expérimental sur matériel compatible. |
| macOS | Scans TCP Connect; pas d'AF_XDP. |
| Windows | Scans basés sur sockets selon les privilèges disponibles. |
Références
Écosystème6. Référence en ligne de commande
§6sudo tcpcat -sS --top-ports 1000 --rate 100000 target.lan
sudo tcpcat -Pn -sT -p 1-10000 --evasion aggressive --jitter 0.8 --frag --decoy 8.8.8.8,1.1.1.1 target.lan
sudo tcpcat --ebpf -p 1-1000 10.0.0.0/16 -w 128 -T 5
sudo tcpcat -sV -p 22,80,443,3306,5432,27017 192.168.0.0/24 -j report.json
Limites connues
Important- eBPF/AF_XDP nécessite Linux, un noyau et une carte réseau compatibles.
- Une bannière et une version détectées ne constituent pas une preuve de vulnérabilité exploitable.
- Une correspondance CVE
version-basedexige une validation par l'équipe responsable. - Les réseaux, hôtes et protections peuvent filtrer ou modifier les résultats de scan.
- Les fonctions avancées dépendent des privilèges locaux et du chemin réseau.
Contribuer
Open sourceLes 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é
§7autorisé
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.