
Assistant local IA propulsé par IA pour red team sur téléphone
Un agent de test d'intrusion autonome qui fonctionne entièrement sur un smartphone. Déposez le téléphone sur un réseau, éloignez-vous, et il découvre les hôtes, cartographie les services, trouve les vulnérabilités et génère un rapport de pentest — le tout sans connexion cloud.
░█▄░█ █ █▀▀ █░█ ▀█▀ █▀▀ █▀█ ▄▀█ █░█░█ █░░ █▀▀ █▀█
░█░▀█ █ █▄█ █▀█ ░█░ █▄▄ █▀▄ █▀█ ▀▄▀▄▀ █▄▄ ██▄ █▀▄ v0.1.0
AUTONOMOUS MOBILE PENTEST AGENT
OnePlus 8 · NetHunter · LFM2.5-1.2B · OpenCL GPU
Le test d'intrusion (pentest) est la pratique qui consiste à tester la sécurité d'un réseau informatique en simulant une attaque — avec l'autorisation explicite du propriétaire du réseau. Les pentesters professionnels sont engagés pour trouver les vulnérabilités avant que de vrais attaquants ne le fassent.
Nightcrawler automatise ce processus sur un téléphone. Il utilise un petit modèle d'IA (LFM2.5-1.2B-Instruct-Heretic, 1,2 milliard de paramètres) exécuté localement sur le GPU du téléphone pour décider de la prochaine action — quel hôte sonder, quel outil utiliser, quoi chercher. Aucune connexion Internet ni API cloud requise.
▶️ Regardez Nightcrawler en action sur Instagram
L'agent fonctionne comme un pentester humain patient — il alterne entre les hôtes, effectue une petite action par tour et accumule des connaissances progressivement sur des heures. Cela le rend beaucoup plus difficile à détecter que les scanners de vulnérabilités traditionnels qui bombardent tous les hôtes à la fois.
┌──────────────────────────────────────────────────────────┐
│ PHONE (OnePlus 8) │
│ │
│ ┌─────────────┐ ┌──────────────────┐ │
│ │ LFM2.5 │ │ Agent Loop │ │
│ │ 1.2B model │◄───►│ (main.py) │ │
│ │ on GPU │ │ Decides what │ │
│ │ (:8080) │ │ to do next │ │
│ └─────────────┘ └────────┬─────────┘ │
│ │ │
│ ┌────────▼─────────┐ │
│ │ Scope Proxy │ ← Safety layer │
│ │ Validates every │ Blocks out- │
│ │ command before │ of-scope │
│ │ execution │ actions │
│ └────────┬─────────┘ │
│ │ │
│ ┌────────▼─────────┐ │
│ │ Kali MCP Server │ ← Runs the │
│ │ nmap, curl, │ actual │
│ │ smbclient, ... │ commands │
│ └──────────────────┘ │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Web Dashboard │ │ SQLite DB │ │
│ │ (:8888) │ │ Hosts, vulns, │ │
│ │ Monitor & steer │ │ creds, commands │ │
│ └──────────────────┘ └──────────────────┘ │
└──────────────────────────────────────────────────────────┘
Pour la conception complète du système, voir docs/ARCHITECTURE.md.
Voir docs/FEATURES.md pour la référence complète des fonctionnalités.
Toute l'inférence via OpenCL sur GPU Adreno 650 :
Remarque : Android limite le GPU sur batterie (ralentissement x6). Nightcrawler inclut un démon de régulation GPU qui force les performances maximales et réduit automatiquement à ≤15 % de batterie.
# 1. Installation (dans le chroot Kali NetHunter)
bash INSTALL.sh
# 2. Attendre le démarrage de llama-server (~5 min après le boot)
curl -s http://127.0.0.1:8080/health # Doit renvoyer {"status":"ok"}
# 3. Démarrer tous les services
bash scripts/run-36h.sh
# 4. Ouvrir le tableau de bord web (depuis n'importe quel appareil de votre réseau Tailscale)
# https://<votre-nom-dhote-tailscale>:8888
NC_DRY_RUN=1 python3 main.py
Ceci utilise un serveur Kali simulé pour tester la boucle de l'agent sans exécuter de véritables commandes réseau.
kali-server-mcp --port 5000 &
python3 scope_proxy.py --config config.yaml --port 8800 --upstream http://127.0.0.1:5000 &
bash scripts/webui-daemon.sh start
python3 main.py &
Modifiez config.yaml avant le déploiement :
mission:
id: "CLIENT-YYYY-XXX" # Votre ID d'engagement
scope:
networks: ["auto"] # "auto" = détecter depuis wlan0 au démarrage
excluded_hosts: ["auto"] # "auto" = passerelle + IP propre
excluded_ports: [502, 503] # Ports SCADA/ICS à ne jamais toucher
authorization: "ROE-YYYY-XXX.pdf"
max_runtime_hours: 0 # 0 = aucune limite
model:
local:
ctx_size: 8192
port: 8080
La détection dynamique du périmètre signifie zéro changement de configuration lors des déplacements entre réseaux — l'agent lit le sous-réseau actuel depuis wlan0 au démarrage.
nightcrawler/
├── main.py # Point d'entrée
├── config.yaml # Périmètre de mission + configuration du modèle
├── scope_proxy.py # Proxy d'application du périmètre
├── INSTALL.sh # Installateur
│
├── agent/ # Logique centrale de l'agent
│ ├── loop.py # Boucle de décision + récupération d'erreurs
│ ├── planner.py # Machine à états de phase (recon → exploit)
│ ├── llm_client.py # Client API LLM (llama.cpp / distant)
│ ├── db.py # Backend SQLite (hôtes, vulns, identifiants)
│ ├── host_memory.py # Observations par hôte + auto-étiquetage
│ ├── cve_db.py # Base de données CVE de 24 956 entrées
│ ├── attack_planner.py # Directives stratégiques pour la phase d'exploitation
│ ├── output_parser.py # Extraction de données structurées depuis la sortie des outils
│ ├── offline_manager.py # Machine à états du pipeline de brèche WiFi
│ ├── net_detect.py # Auto-détection du réseau depuis wlan0
│ ├── cover_traffic.py # Mélange furtif avec trafic web réaliste
│ ├── passive_capture.py # tcpdump en arrière-plan pour le trafic de diffusion
│ └── ...
│
├── proxy/ # Composants d'application du périmètre
│ ├── scope.py # Validation IP/port/hôte
│ ├── rate_limiter.py # Limitation du débit de commandes + gigue
│ └── command_filter.py # Liste noire des commandes destructrices
│
├── webui/ # Tableau de bord web (Flask)
│ ├── server.py # API + middleware furtif
│ └── templates/index.html # Interface du tableau de bord
│
├── data/ # Fichiers de données statiques
│ ├── cve_exploits.json # Mappages CVE→commandes d'exploitation
│ └── playbooks.json # 27 playbooks d'attaque en plusieurs étapes
│
├── prompts/ # Modèles de prompts LLM (rechargeables à chaud)
├── scripts/ # Scripts opérationnels (démarrage, arrêt, chiens de garde)
├── tests/ # Suites de tests (API, UI, mode hors ligne)
├── kernels/ # Modules de pilotes WiFi + documentation kernel
├── simulation/ # Serveur simulé pour essai à sec
├── docs/ # Architecture, configuration GPU, fonctionnalités
├── logs/ # Données d'exécution (ignorées par git)
└── models/ # Fichiers de modèles (ignorés par git)
L'agent utilise une boucle simple mais efficace :
REASONING: ... COMMAND: ...Le modèle de 1,2 B a un taux de réussite de commandes d'environ 50 % (inhérent à sa taille). L'agent compense avec :
Le tableau de bord sur :8888 fournit une surveillance et un contrôle en temps réel :
Le tableau de bord est filtré pour la furtivité : il usurpe les en-têtes nginx et renvoie des 404 vides aux connexions provenant du réseau cible.
Issus de plus de 72 heures d'opération autonome sur plusieurs réseaux :
Les contributions sont les bienvenues ! Voir CONTRIBUTING.md pour les directives.
# Cloner le dépôt
git clone https://github.com/garagehq/nightcrawler.git
cd nightcrawler
# Mode essai à sec (aucune commande réelle, aucun matériel requis)
NC_DRY_RUN=1 python3 main.py
# Exécuter les tests
python3 -m pytest tests/
Cet outil est destiné uniquement aux tests d'intrusion autorisés. Vous devez disposer d'une autorisation écrite (Règles d'engagement) du propriétaire du réseau avant de déployer Nightcrawler. Toute utilisation non autorisée contre des réseaux que vous ne possédez pas ou pour lesquels vous n'avez pas la permission de tester est illégale.
MIT — voir LICENSE pour les détails.
Si vous appréciez ce projet, vous pouvez m'offrir un café ☕ :
| Terme | Signification |
|---|
| Drop box | Un appareil laissé sur un réseau cible pour effectuer des tests de manière autonome |
| Périmètre (Scope) | L'ensemble des réseaux/hôtes que vous êtes autorisé à tester |
| Règles d'engagement (ROE) | Un document juridique spécifiant ce que vous êtes autorisé à faire |
| Furtivité | Techniques pour éviter la détection par la surveillance réseau (IDS/IPS) |
| MCP | Model Context Protocol — une interface standard pour l'utilisation d'outils par l'IA |
| C2 | Command and Control — le tableau de bord web pour surveiller et diriger l'agent |
| Modèle | Quantification | Vitesse de prompt | Vitesse de génération |
|---|
| LFM2.5-1.2B-Instruct-Heretic (production) | Q8_0 | 115 tok/s | 13 tok/s |
| Qwen3.5-0.8B | Q8_0 | 30,5 tok/s | 6,3 tok/s |
| Qwen3.5-4B | Q4_0 | 10,1 tok/s | 2,0 tok/s |