ngrok expose un service qui tourne sur votre machine à une URL publique sur Internet, via un tunnel sortant, sans ouvrir le moindre port ni toucher au pare-feu. C'est l'outil de démonstration et de test de webhooks le plus rapide qui soit. C'est aussi, pour la même raison, un outil que des groupes d'attaquants détournent pour l'exfiltration et la persistance : un outil à double tranchant. Ce guide montre l'usage légitime testé de bout en bout, les exploits réels menés avec ngrok, et surtout comment détecter son abus. Pour développeurs, administrateurs et équipes sécurité.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre comment un tunnel sortant contourne le pare-feu par conception.
- Installer l'agent ngrok et exposer un service local, démonstration réelle.
- Exposer du HTTP et du TCP, et déclarer vos tunnels dans un fichier de configuration.
- Reconnaître les attaques réelles menées avec ngrok et pourquoi il séduit les attaquants.
- Détecter son usage sur un réseau : indicateurs réseau, processus et fichiers.
Prérequis
Section intitulée « Prérequis »- un service local à exposer (une application web, un serveur SSH, peu importe) ;
- un compte ngrok : contrairement aux versions historiques, l'agent refuse de démarrer sans authentification ;
- un accès à un terminal Linux, macOS ou Windows.
Comment fonctionne ngrok
Section intitulée « Comment fonctionne ngrok »ngrok se compose de deux morceaux : un service cloud mondial hébergé par l'éditeur, et un agent léger que vous lancez à côté du service à exposer. L'agent n'accepte aucune connexion entrante. Il ouvre une connexion TLS sortante et persistante vers le cloud ngrok, et c'est par ce canal déjà établi que le trafic public redescend jusqu'à votre machine.
Le schéma est le suivant : un visiteur atteint une URL publique servie par le cloud ngrok, celui-ci pousse la requête dans la connexion sortante de l'agent, et l'agent la transmet à votre service local. Votre IP reste privée, aucun port n'est ouvert, et le pare-feu ne voit qu'une connexion sortante en HTTPS parfaitement banale.
C'est précisément ce qui rend ngrok pratique et dangereux à la fois : une connexion sortante sur le port 443 ressemble à n'importe quel trafic web, et la plupart des pare-feu la laissent passer sans broncher.
Installer ngrok
Section intitulée « Installer ngrok »Sur Debian et Ubuntu, ngrok publie un dépôt APT signé. On l'utilise plutôt qu'un binaire téléchargé à la main, pour bénéficier des mises à jour.
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \ | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \ && echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \ | sudo tee /etc/apt/sources.list.d/ngrok.list \ && sudo apt update \ && sudo apt install ngrokVérifiez la version installée :
ngrok version# ngrok version 3.39.9S'authentifier
Section intitulée « S'authentifier »Un tunnel sans compte est impossible. La preuve, si vous tentez d'exposer un service sans avoir enregistré de jeton :
ngrok http 8080# ERR_NGROK_4018# This ngrok session is not authenticated. ngrok requires an account# and a valid credential to start a session.Récupérez votre authtoken depuis le tableau de bord ngrok, puis enregistrez-le :
ngrok config add-authtoken <VOTRE_TOKEN>Le jeton est écrit dans le fichier de configuration de l'agent, situé dans ~/.config/ngrok/ngrok.yml sous Linux. Ne le versionnez jamais : il donne à quiconque le possède le droit d'ouvrir des tunnels sur votre compte.
Exposer un premier service
Section intitulée « Exposer un premier service »Lancez un service local, ici un simple serveur web sur le port 8080, puis ouvrez le tunnel :
ngrok http 8080L'agent affiche une console qui reste au premier plan. Les informations utiles y figurent, notamment la ligne Forwarding qui contient votre URL publique :
ngrok
Session Status onlineVersion 3.39.9Region Auto (lowest latency) (auto)Web Interface http://127.0.0.1:4040Forwarding https://imposing-escalator-gesture.ngrok-free.dev -> http://localhost:8080Cette URL en ngrok-free.dev est immédiatement accessible depuis Internet. Un appel entrant traverse le tunnel et atteint votre service local :
curl https://imposing-escalator-gesture.ngrok-free.dev/# <h1>Mon appli locale</h1>La Web Interface sur http://127.0.0.1:4040 est un outil précieux : elle inspecte en temps réel chaque requête reçue, ce qui est idéal pour déboguer des webhooks. C'est d'ailleurs l'usage numéro un de ngrok : recevoir en développement les appels de Stripe, GitHub ou un CRM, qui ne peuvent pas joindre votre localhost autrement.
Exposer d'autres protocoles
Section intitulée « Exposer d'autres protocoles »ngrok ne se limite pas au HTTP. Pour exposer un service TCP, par exemple un serveur SSH, utilisez le sous-commande tcp :
ngrok tcp 22ngrok attribue alors une adresse de la forme tcp://X.tcp.ngrok.io:PORT que vous passez à votre client SSH. C'est exactement ce mécanisme que les attaquants détournent pour exposer un bureau à distance interne, nous y venons.
Pour gérer plusieurs tunnels sans retenir des lignes de commande, déclarez-les dans le fichier de configuration, au format v3 :
version: "3"agent: authtoken: <VOTRE_TOKEN>endpoints: - name: web upstream: url: 8080 - name: ssh upstream: url: 22Démarrez ensuite un tunnel par son nom, ou tous d'un coup :
ngrok start webngrok start --allNotez la clé endpoints : l'ancienne clé tunnels appartient à la configuration v2, dépréciée.
ngrok, un outil à double tranchant
Section intitulée « ngrok, un outil à double tranchant »Tout ce qui précède fait de ngrok un excellent outil de développement. Les mêmes propriétés en font un outil offensif redoutable, et ce n'est pas une hypothèse : ngrok est catalogué S0508 dans MITRE ATT&CK, associé à cinq techniques dont T1572 Protocol Tunneling et T1567 Exfiltration Over Web Service.
Pourquoi les attaquants l'apprécient : après avoir compromis une machine, ils n'ont aucun port entrant à ouvrir, aucune règle de pare-feu à modifier. Un tunnel sortant en HTTPS se fond dans le trafic légitime, et l'infrastructure ngrok masque leur propre serveur.
Les cas documentés ne manquent pas :
- Le ransomware Akira, dans un avis conjoint FBI/CISA, établit son canal de commande en tunnelisant via ngrok pour contourner la surveillance périmétrique et exfiltrer les données.
- Le groupe APT28 (BlueDelta), documenté par Recorded Future, a utilisé ngrok pour relayer une campagne de vol d'identifiants et contourner l'authentification à deux facteurs.
- Sophos et Huntress, dans leurs rapports d'incident, décrivent des attaquants exposant le RDP interne (
ngrok tcp 3389), parfois avec le binaire renommé enconhost.exepour l'évasion, et une persistance par tâche planifiée ou clé de registre. - Des campagnes de phishing hébergent leurs fausses pages bancaires derrière des sous-domaines ngrok, précisément parce que le domaine légitime de l'éditeur inspire confiance et contourne les filtres.
Le point à retenir : ngrok n'est pas un logiciel malveillant, c'est un outil légitime dont le canal sortant chiffré est l'atout que les attaquants exploitent.
Détecter ngrok sur un réseau
Section intitulée « Détecter ngrok sur un réseau »Côté défense, plusieurs indicateurs trahissent l'usage de ngrok. Aucun n'est suffisant seul, il faut les combiner.
Indicateurs réseau. Le canal de contrôle de l'agent vise des domaines comme connect.ngrok-agent.com et tunnel.<region>.ngrok.com. Les tunnels exposés utilisent *.ngrok-free.app, *.ngrok-free.dev, *.ngrok.app et l'historique *.ngrok.io. Une règle de blocage doit couvrir toutes ces extensions sur le nom ngrok. Le filtrage par IP est fragile : ngrok s'appuie sur AWS, dont les adresses sont mutualisées et changeantes. Privilégiez le DNS et le SNI.
Indicateurs sur le poste. Le processus ngrok avec une ligne de commande révélatrice (tcp 3389, --authtoken, start --all), et le fichier de configuration ~/.config/ngrok/ngrok.yml. Méfiez-vous du renommage du binaire, déjà observé en conhost.exe. Une requête de détection sur les processus, par exemple en KQL pour Microsoft Defender :
DeviceProcessEvents| where ProcessCommandLine has "ngrok" and (ProcessCommandLine has "tcp 3389" or ProcessCommandLine has "authtoken")Politique. Dans un système d'information d'entreprise, un poste utilisateur n'a en général aucune raison légitime de lancer ngrok. La recommandation défendable est de le bloquer par défaut, par sinkhole DNS sur le nom ngrok toutes extensions confondues, complété d'une règle applicative bloquant le binaire non signé, puis d'autoriser sur exception documentée les équipes qui en ont un besoin réel.
Les alternatives
Section intitulée « Les alternatives »Si vous cherchez à exposer un service durablement, ou avec une contrainte de souveraineté, une solution auto-hébergée vous rend le contrôle du relais, donc des journaux et du nom de domaine.
| Outil | Modèle | Pour quel besoin |
|---|---|---|
| frp | Auto-hébergé (Go) | Le plus répandu, TCP/UDP/HTTP, multiplexage |
| rathole | Auto-hébergé (Rust) | Même esprit que frp, plus léger et rapide |
| bore | Auto-hébergé (Rust) | Minimaliste, TCP uniquement |
| ngrok | SaaS | Démo et webhooks en développement, zéro configuration |
Sur ce site, deux outils voisins traitent le même besoin sous un autre angle : le tunnel Cloudflare avec cloudflared, gratuit et sans limite de bande passante, et Pangolin, un reverse proxy tunnelisé entièrement auto-hébergé avec contrôle d'accès. Pour un accès distant à votre infrastructure plutôt qu'une exposition publique, orientez-vous vers un VPN WireGuard ou Tailscale.
FAQ : questions fréquentes sur ngrok
Section intitulée « FAQ : questions fréquentes sur ngrok »localhost. Votre IP reste privée. C'est l'outil de référence pour tester des webhooks en développement.- 3 tunnels simultanés au maximum
- 1 Go de trafic par mois
- 20 000 requêtes HTTP/S par mois
- 1 domaine de développement auto-généré et non modifiable
- une page interstitielle affichée à la première visite d'un lien HTTP
# 1. Enregistrer son authtoken (une seule fois)
ngrok config add-authtoken <VOTRE_TOKEN>
# 2. Exposer le service local (ici sur le port 8080)
ngrok http 8080
L'agent affiche une ligne Forwarding avec une URL publique du type https://<sous-domaine>.ngrok-free.dev, immédiatement accessible depuis Internet. L'interface web sur http://127.0.0.1:4040 inspecte chaque requête reçue, ce qui est idéal pour déboguer des webhooks.- Exfiltration de données et command and control (ransomware Akira, avis FBI/CISA)
- Exposition du RDP interne (
ngrok tcp 3389) pour la persistance (rapports Sophos, Huntress) - Relais de phishing derrière des sous-domaines de confiance
- Réseau : les domaines
connect.ngrok-agent.com,tunnel.<region>.ngrok.com, et les tunnels en*.ngrok-free.app,*.ngrok-free.dev,*.ngrok.app,*.ngrok.io. Filtrez sur le DNS et le SNI, pas sur l'IP (ngrok utilise AWS, adresses mutualisées). - Processus :
ngrokavec une ligne de commande révélatrice (tcp 3389,--authtoken). Attention au binaire renommé (observé enconhost.exe). - Fichier :
~/.config/ngrok/ngrok.yml.
ngrok toutes extensions confondues par sinkhole DNS, et le binaire non signé par règle applicative.- Auto-hébergé, contrôle total : frp (le plus répandu, TCP/UDP/HTTP), rathole (plus léger et rapide, en Rust), bore (minimaliste, TCP seul). Vous possédez le relais, donc les journaux et le domaine.
- SaaS gratuit sans cap de bande passante : le tunnel Cloudflare (cloudflared), agent open source.
- Reverse proxy auto-hébergé avec IAM : Pangolin.
- Accès distant plutôt qu'exposition publique : un VPN WireGuard ou Tailscale.
À retenir
Section intitulée « À retenir »- ngrok expose un service local via un tunnel sortant, sans ouvrir de port : c'est sa force et le risque qu'il représente.
- L'agent est propriétaire et votre trafic transite par l'infrastructure de l'éditeur.
- Un compte et un authtoken sont obligatoires : sans eux, l'agent renvoie
ERR_NGROK_4018. - La commande de base est
ngrok http 8080; le TCP passe parngrok tcp, et les tunnels multiples se déclarent enendpointsdansngrok.ymlv3. - Le plan gratuit ajoute une page interstitielle et plafonne à 3 tunnels, 1 Go et 20 000 requêtes par mois.
- ngrok est catalogué MITRE S0508 : il sert à l'exfiltration, au C2 et à la persistance après compromission.
- Pour le détecter, combinez DNS/SNI (tous les domaines
ngrok), le processus et le fichier de config ; bloquez-le par défaut en entreprise.