
Outil de surveillance réseau qui cartographie les connexions processus-réseau, identifie les fournisseurs de cloud et détecte les activités de beaconing
Outil de surveillance réseau qui cartographie les connexions processus-réseau, identifie les fournisseurs de cloud et génère des règles de pare-feu. Agent léger pour la collecte, serveur pour l'agrégation, analyseur pour l'analyse.
Vue d'ensemble multi-machine — comparaison des versions d'OS, détection d'IP partagées, candidats au beaconing sur tous les hôtes :

Détail par hôte — alertes critiques (OS en fin de vie, nc.exe en beaconing vers une IP inconnue) :

Détail par hôte — avertissement (candidat beacon signalé) :

Détail par hôte — propre (aucune anomalie) :

cargo build --release
# Collecte simple
cargo run --release -- collect --duration-seconds 300
# Avec recherches DNS
cargo run --release -- collect --duration-seconds 300 --enable-dns
# Avec compression et chiffrement
cargo run --release -- collect \
--duration-seconds 300 \
--compress \
--encrypt-key "votre-mot-de-passe-secret"
# Générer tous les rapports
cargo run --release -- parse \
--input connections.jsonl \
--process-summary processes.json \
--cloud-analysis cloud.json \
--firewall-rules-iptables firewall.sh \
--database-export network.sql
# Recherche de propriété hors ligne avec base ASN locale (aucun appel réseau)
cargo run --release -- parse \
--input connections.jsonl \
--cloud-analysis cloud.json \
--asn-db ip2asn-v4.tsv
# Recherche ARIN en direct avec cache persistant (les exécutions ultérieures ignorent les IP déjà interrogées)
cargo run --release -- parse \
--input connections.jsonl \
--cloud-analysis cloud.json \
--arin-lookup \
--arin-cache arin_cache.json
# Analyse rapide de 5 minutes
cargo run --release -- monitor \
--duration-seconds 300 \
--output-dir ./analysis \
--full-analysis
Le binaire agent est une cible de déploiement minimale, sans drapeau. Toute la configuration est intégrée au binaire à la compilation via des variables d'environnement — déposez-le sur une cible et exécutez-le sans argument.
AGENT_SERVER="http://10.0.1.5:8080/upload" \
AGENT_KEY="labkey123" \
AGENT_INTERVAL="5" \
AGENT_BATCH="200" \
AGENT_DURATION="0" \
AGENT_DNS="false" \
AGENT_ENCRYPT_KEY="mysecretpassword" \
cargo build --release --bin agent
Le binaire résultant dans target/release/agent n'a aucune dépendance externe et ne nécessite aucun drapeau :
./agent
| Variable | Défaut | Description |
|---|---|---|
AGENT_SERVER | http://localhost:8080/upload | URL du point de terminaison de téléversement |
AGENT_KEY | (aucune) | Valeur de l'en-tête X-API-Key |
AGENT_INTERVAL | 5 | Intervalle d'interrogation des sockets en secondes |
AGENT_BATCH | 200 | Enregistrements par lot de téléversement |
AGENT_DURATION | 0 | Durée d'exécution en secondes (0 = exécution permanente) |
AGENT_DNS | false | Résoudre les IP en noms d'hôte |
AGENT_ESTABLISHED | true | Connexions ESTABLISHED uniquement |
AGENT_LOCAL_COPY | false | Conserver une copie locale .jsonl en plus des téléversements |
AGENT_COMPRESS | false | Compresser en gzip avant téléversement |
AGENT_ENCRYPT_KEY | (aucune) | Chiffrement AES-256-GCM de la charge utile (mot de passe ou clé hexadécimale de 64 caractères) |
AGENT_UA | (défaut de reqwest) | En-tête HTTP User-Agent |
AGENT_SERVER="https://collector.internal/upload" \
AGENT_KEY="prod-api-key" \
AGENT_DURATION="0" \
AGENT_INTERVAL="30" \
AGENT_COMPRESS="true" \
AGENT_ENCRYPT_KEY="$(cat /etc/gibson/key)" \
cargo build --release --bin agent
cargo run --release -- collect \
--duration-seconds 3600 \
--interval-seconds 10 \
--compress \
--encrypt-key "votre-clé-hex-32-caractères-ou-mot-de-passe" \
--upload-url "https://votre-serveur.com/api/upload" \
--api-key "votre-clé-api" \
--batch-size 50 \
--delete-after-upload
cargo run --release -- collect \
--duration-seconds 86400 \
--interval-seconds 30 \
--output connections_daily.jsonl \
--enable-dns \
--compress
L'analyseur prend en charge deux chemins mutuellement exclusifs pour identifier le propriétaire des IP non attribuées :
| Méthode | Drapeau | Vitesse | Réseau | Idéal pour |
|---|---|---|---|---|
| Base ASN locale | --asn-db | Instantané | Aucun | Analyses répétées, environnements isolés |
| ARIN RDAP en direct | --arin-lookup | Lent (par IP) | Oui | Recherches ponctuelles, pas de base locale disponible |
Télécharger la base ip2asn (rafraîchir chaque semaine) :
curl -O https://iptoasn.com/data/ip2asn-v4.tsv.gz && gunzip ip2asn-v4.tsv.gz
Lorsque --asn-db est fourni, --arin-lookup est ignoré. Utilisez --arin-cache pour persister les résultats ARIN sur le disque afin que les exécutions ultérieures ignorent les IP déjà interrogées.
# Analyse avec détection cloud ciblée
cargo run --release -- parse \
--input connections.jsonl \
--cloud-analysis cloud_report.json \
--min-connections 5 \
--whitelist-processes "chrome,firefox,safari,edge"
Créez collector_server.py :
from flask import Flask, request, jsonify
import os
import json
import base64
from datetime import datetime
from Crypto.Cipher import AES
import gzip
app = Flask(__name__)
# Configuration
UPLOAD_DIR = "./collected_data"
API_KEY = "your-secure-api-key"
ENCRYPTION_KEY = bytes.fromhex("your-32-byte-hex-key") # Optional
os.makedirs(UPLOAD_DIR, exist_ok=True)
def decrypt_data(encrypted_data, key):
"""Decrypt AES-256-GCM encrypted data"""
decoded = base64.b64decode(encrypted_data)
nonce = decoded[:12]
ciphertext = decoded[12:]
cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)
plaintext = cipher.decrypt_and_verify(ciphertext[:-16], ciphertext[-16:])
return plaintext