Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
punchline — Messagerie chiffrée pair-à-pair en Rust avec Noise IK et UDP NAT hole punching | Kitploit
Outils/GitHubGitHub/michal-pielka/punchline
Outils de Chiffrement/DéchiffrementSécurité RéseauProtection de la Vie PrivéeUtilitaires et FrameworksAuthentification
GitHubmichal-pielka/punchline

punchline

Messagerie chiffrée pair-à-pair en Rust avec Noise IK et UDP NAT hole punching

Voir le dépôt
192il y a 4 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

punchline

Chat pair-à-pair chiffré de bout en bout par UDP. Pas de comptes, pas de serveur central relayant/stocker les messages, pas d'intermédiaire. Juste deux pairs, une connexion directe et un chiffrement via le protocole Noise.

https://github.com/user-attachments/assets/939e96d3-45e3-4484-9a27-28c3a0457b05

Table des matières

  • Ce qu'il fait
  • Démarrage rapide
  • Comment ça marche
  • Référence CLI
  • Utilisation
    • Configuration
    • Gestion des pairs
    • Vérification du statut
    • Options du serveur
    • Thèmes
    • Complétions shell
  • Cryptographie
    • Poignée de main IK
    • Détermination de l'initiateur
    • Stockage des clés
  • Protocole filaire
    • Protocole de trou de serrure (hole punch)
    • Protocole de transport
    • Protocole de signal
    • Protocole STUN
  • Structure du projet
  • Installation
    • Depuis crates.io
    • Compilation depuis les sources
  • Exécution des tests
  • Stack technique
  • Licence

Ce qu'il fait

Deux personnes exécutent punchline connect <pair> sur leurs machines. Punchline traverse leurs NAT, effectue une poignée de main chiffrée et les plonge dans un chat privé – le tout en quelques millisecondes. Les serveurs STUN et de signal inclus gèrent la découverte, puis s'effacent. conversation


Démarrage rapide

root@kitploit:~
cargo build --release

Démarrer les serveurs (sur une machine que les deux pairs peuvent atteindre), ou utiliser ceux que j'héberge publiquement à 64.225.107.28 (STUN : port 3478, signal : port 8743) :

root@kitploit:~
punchline-stund                  # Serveur STUN - indique aux pairs leur IP publique
punchline-signald                # Serveur de signal - associe les pairs qui veulent communiquer
serveurs

Sur chaque machine des pairs :

root@kitploit:~
# Générer votre identité (paire de clés X25519)
punchline keygen

# Partager votre clé publique avec votre pair
punchline pubkey

# Enregistrer sa clé
punchline peers add alice a1b2c3d4...64_hex_chars

# Se connecter (les deux pairs exécutent cette commande, ciblant l'autre)
punchline connect alice --stun <server>:3478 --signal <server>:8743

Le TUI se lance avec une vue en direct de la progression de la connexion :

  1. Découverte STUN – résolution de votre adresse externe via punchline-stund

  2. Serveur de signal – connexion à punchline-signald

  3. Attente du pair – le serveur de signaux associe les deux pairs

  4. Trou de serrure – établissement du chemin UDP direct

  5. Poignée de main Noise – échange de clés chiffré

    tableau de bord

Une fois terminé, vous êtes dans le chat. Tapez et appuyez sur Entrée. Appuyez sur Échap pour quitter.


Comment ça marche

L'ensemble du système est composé de trois binaires, tous inclus dans ce dépôt :

BinaireRôleQuand utilisé

Une fois la configuration initiale effectuée, les serveurs STUN et de signal ne sont plus contactés. Tout circule directement de pair à pair.


Référence CLI

punchline

Drapeaux globaux :

DrapeauDescription
-vAugmente la verbosité des logs (-v = debug, -vv = trace).
-q, --quietSupprime toute sortie de log.

punchline-stund

punchline-signald


Utilisation

Configuration

Au lieu de passer --stun et --signal à chaque fois, créez ~/.config/punchline/config.toml :

root@kitploit:~
stun_server = "203.0.113.10:3478"
signal_server = "203.0.113.10:8743"

Gestion des pairs

root@kitploit:~
punchline peers                              # lister tous
punchline peers add alice a1b2c3d4...        # ajouter
punchline peers remove alice                 # supprimer

Les alias sont stockés dans ~/.punchline/known_peers.toml. Vous pouvez aussi vous connecter directement avec une clé hexadécimale brute de 64 caractères.

Vérification du statut

root@kitploit:~
punchline status

Affiche votre identité, configuration, accessibilité des serveurs (envoie une véritable sonde STUN et une connexion TCP) et le nombre de pairs.

Options du serveur

Les deux serveurs supportent -v (debug), -vv (trace), -q (silencieux), --address et --port :

root@kitploit:~
punchline-stund -v --port 3478
punchline-signald -v --port 8743

Thèmes

Personnalisez le TUI via ~/.config/punchline/style.toml Styles utilisés dans la vidéo :

root@kitploit:~
[colors]
my_text = "#ebdbb2"
peer_text = "#bdae93"
input_text = "#ebdbb2"
border = "#ebdbb2"
sidebar_key = "#ebdbb2"
sidebar_value = "#bdae93"

[padding]
chat_horizontal = 2
chat_vertical = 1

Toutes les couleurs sont en hexadécimal RVB. Si le fichier est absent, les couleurs par défaut du terminal sont utilisées.

Complétions shell

root@kitploit:~
punchline completions bash > ~/.local/share/bash-completion/completions/punchline
punchline completions zsh > ~/.zfunc/_punchline
punchline completions fish > ~/.config/fish/completions/punchline.fish

Cryptographie

Nom complet du protocole : Noise_IK_25519_ChaChaPoly_SHA256

ComposantRôle

Poignée de main IK

Le modèle IK signifie que l'initiateur connaît la clé publique statique du répondant avant le début de la poignée de main. Les deux pairs possèdent déjà les clés l'un de l'autre (échangées hors bande ou via le registre de pairs), donc aucune confiance à la première utilisation n'est requise.

  1. Initiateur -> Répondant : Envoie un message chiffré contenant sa clé publique statique, chiffrée sous la clé connue du répondant. Offre un masquage d'identité contre les observateurs passifs.
  2. Répondant -> Initiateur : Déchiffre, vérifie et répond. Les deux côtés passent en mode transport avec des clés de session partagées.

Détermination de l'initiateur

Punchline sélectionne déterministiquement l'initiateur en comparant les 8 premiers octets de la clé publique de chaque pair sous forme de u64 big-endian. Le pair avec la valeur la plus petite devient l'initiateur. Les deux côtés calculent cela indépendamment.

Stockage des clés

L'identité est une clé secrète X25519 de 32 octets dans ~/.punchline/id_x25519 avec permissions Unix 0600. La clé publique est dérivée au chargement. La génération de clés utilise x25519-dalek avec OsRng.


Protocole filaire

Le premier octet de chaque paquet UDP identifie son type :

Protocole de trou de serrure (hole punch)

Les deux pairs exécutent simultanément le même algorithme :

  1. Envoie un PROBE (0x00) toutes les 200 ms à l'adresse externe du pair.
  2. À la réception d'un PROBE, passe à l'envoi d'ACK (0x01).
  3. À la réception d'un ACK, envoie un dernier ACK et déclare le succès.
  4. Délai de sécurité : 2 secondes d'envoi d'ACK sans réponse suppose que le pair a terminé.

Protocole de transport

Les messages (0x02) transportent des charge utiles UTF-8 chiffrées par Noise. Les keepalives (0x03) sont des charge utiles vides chiffrées envoyées toutes les 10 secondes pour maintenir la synchronisation des compteurs de nonce de chiffrement. 30 secondes sans paquet déclenchent la déconnexion.

Protocole de signal

JSON sur WebSocket :

root@kitploit:~
// PairRequest (client -> serveur)
{ "external_addr": "203.0.113.5:48291", "public_key": "a1b2...", "target_public_key": "d4e5..." }

// PairResponse (serveur -> client)
{ "target_external_addr": "198.51.100.7:51003", "target_public_key": "d4e5..." }

Protocole STUN

Suit RFC 5389 (simplifié) : requête/réponse de liaison avec XOR-MAPPED-ADDRESS. IPv4 uniquement.


Structure du projet

Espace de travail Cargo avec quatre crates :

root@kitploit:~
crates/
├── proto/      # Bibliothèque partagée : crypto, STUN, types de signal, trait de transport
├── client/     # Client P2P : CLI, TUI, logique de connexion, gestion des pairs
├── signald/    # Serveur de signal : appariement des pairs via WebSocket
└── stund/      # Serveur STUN : découverte d'adresse externe

Installation

Depuis crates.io

root@kitploit:~
cargo install punchline           # Client TUI
cargo install punchline-signald   # Serveur de signal
cargo install punchline-stund     # Serveur STUN

Compilation depuis les sources

Prérequis : Édition Rust 2024 (rustc 1.85+)

root@kitploit:~
git clone https://github.com/michal-pielka/punchline.git
cd punchline
cargo build --release

Les binaires sont placés dans target/release/ :

  • punchline
  • punchline-signald
  • punchline-stund

Exécution des tests

root@kitploit:~
cargo test

Les tests couvrent les opérations cryptographiques, l'encodage/décodage STUN, la sérialisation du protocole de signal, l'analyse de configuration, la gestion des pairs, les thèmes de style et la poignée de main Noise IK.


Stack technique


Licence

MIT - voir LICENSE.

Télécharger l’outil
punchline-stundServeur STUN (UDP) – répond avec l'IP:port externe du clientUniquement pendant la configuration
punchline-signaldServeur de signal (WebSocket) – associe les pairs et échange les adressesUniquement pendant la configuration
punchlineLe messager lui-même – CLI, TUI, crypto, trou de serrureToujours
CommandeDescription
keygen [--force] [-i chemin]Génère une nouvelle paire de clés d'identité X25519. Utilisez --force pour écraser sans confirmation. Utilisez -i pour spécifier le chemin de sortie.
pubkey [-i chemin]Affiche votre clé publique (64 caractères hexadécimaux). Utilisez -i pour dériver d'un fichier de clés spécifique.
connect <pair> [-i chemin] [--stun adresse] [--signal adresse]Se connecte à un pair par alias ou par clé hexadécimale brute. Utilisez -i pour spécifier la clé d'identité. Lance le TUI.
peersListe tous les pairs connus.
peers add <nom> <clé>Enregistre la clé publique d'un pair sous un surnom.
peers remove <nom>Supprime un pair par son surnom.
config pathAffiche le chemin du fichier de configuration.
config showAffiche les valeurs actuelles de la configuration.
statusAffiche l'identité, la configuration, l'accessibilité des serveurs et le nombre de pairs.
completions <shell>Génère les complétions shell (bash, zsh ou fish).
DrapeauDescription
--address <adr>Adresse de liaison (par défaut : 0.0.0.0).
--port <port>Port de liaison (par défaut : 3478).
-v / -vvLogs de debug / trace.
-qMode silencieux.
DrapeauDescription
--address <adr>Adresse de liaison (par défaut : 0.0.0.0).
--port <port>Port de liaison (par défaut : 8743).
-v / -vvLogs de debug / trace.
-qMode silencieux.
Noise IKModèle de poignée de main – l'initiateur connaît la clé publique du répondant. Se termine en 2 messages.
X25519Échange de clés Diffie-Hellman sur courbe elliptique (RFC 7748). Sécurité 128 bits, temps constant.
ChaCha20-Poly1305Chiffrement AEAD pour les messages (RFC 8439). Même chiffrement que TLS 1.3 et WireGuard.
SHA-256Utilisé en interne par Noise pour la dérivation de clés et le hachage de la poignée de main.
PréfixeTypePhaseDescription
0x00PROBETrou de serrureEnvoyé toutes les 200 ms pour ouvrir une brèche NAT
0x01ACKTrou de serrureConfirme la réception d'un PROBE
(aucun)Poignée de mainPoignée de mainCharge utile de poignée de main chiffrée brute Noise
0x02MessageTransportMessage de chat chiffré
0x03KeepaliveTransportCharge utile chiffrée vide (battement de cœur)
CrateObjectif
snowFramework du protocole Noise (poignée de main + chiffrement de transport)
x25519-dalekGénération et dérivation de clés X25519
ratatuiFramework d'interface utilisateur en terminal
crosstermGestion des événements de terminal
clapAnalyse des arguments CLI + complétions shell
tungsteniteClient/serveur WebSocket
tracingJournalisation structurée