Aller au contenu
Sécurité medium

ngrok : exposer un service local et détecter son abus

12 min de lecture

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é.

  • 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.
  • 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.

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.

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.

Fenêtre de terminal
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 ngrok

Vérifiez la version installée :

Fenêtre de terminal
ngrok version
# ngrok version 3.39.9

Un tunnel sans compte est impossible. La preuve, si vous tentez d'exposer un service sans avoir enregistré de jeton :

Fenêtre de terminal
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 :

/home/user/.config/ngrok/ngrok.yml
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.

Lancez un service local, ici un simple serveur web sur le port 8080, puis ouvrez le tunnel :

Fenêtre de terminal
ngrok http 8080

L'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 online
Version 3.39.9
Region Auto (lowest latency) (auto)
Web Interface http://127.0.0.1:4040
Forwarding https://imposing-escalator-gesture.ngrok-free.dev -> http://localhost:8080

Cette URL en ngrok-free.dev est immédiatement accessible depuis Internet. Un appel entrant traverse le tunnel et atteint votre service local :

Fenêtre de terminal
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.

ngrok ne se limite pas au HTTP. Pour exposer un service TCP, par exemple un serveur SSH, utilisez le sous-commande tcp :

Fenêtre de terminal
ngrok tcp 22

ngrok 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 :

~/.config/ngrok/ngrok.yml
version: "3"
agent:
authtoken: <VOTRE_TOKEN>
endpoints:
- name: web
upstream:
url: 8080
- name: ssh
upstream:
url: 22

Démarrez ensuite un tunnel par son nom, ou tous d'un coup :

Fenêtre de terminal
ngrok start web
ngrok start --all

Notez la clé endpoints : l'ancienne clé tunnels appartient à la configuration v2, dépréciée.

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é en conhost.exe pour 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.

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.

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.

OutilModèlePour quel besoin
frpAuto-hébergé (Go)Le plus répandu, TCP/UDP/HTTP, multiplexage
ratholeAuto-hébergé (Rust)Même esprit que frp, plus léger et rapide
boreAuto-hébergé (Rust)Minimaliste, TCP uniquement
ngrokSaaSDé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.

  • 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 par ngrok tcp, et les tunnels multiples se déclarent en endpoints dans ngrok.yml v3.
  • 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.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn