Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
cuddlephish — Browser-in-the-Middle (BitM) armato per Penetration Testers | Kitploit
Strumenti/GitHubGitHub/fkasler/cuddlephish
Strumenti di PhishingSfruttamento di Applicazioni WebPhishingPenetration TestingIngegneria SocialeRed Teaming
GitHubfkasler/cuddlephish

cuddlephish

Browser-in-the-Middle (BitM) armato per Penetration Testers

Vedi Repository
673804 mesi faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CuddlePhish

phishy

Browser-in-the-middle (BitM) multiutente armato per penetration tester. Questo attacco può essere utilizzato per bypassare l'autenticazione multifattoriale su molte applicazioni web di alto valore. Funziona anche per applicazioni che non utilizzano token di sessione e che quindi non sarebbero sfruttabili con gli attacchi tradizionali di furto di token. È uno strumento di ingegneria sociale e non sfrutta alcun difetto tecnico nel servizio target.

Avvio rapido

Questo strumento è un server web specializzato. È progettato per funzionare su un server Linux Debian 11 (Bullseye) e si basa sulle informazioni IP pubbliche per proteggere le funzionalità di amministrazione. Non aspettarti di poter testare in locale senza superare alcuni ostacoli considerevoli.

Avvertenza: Chromium non è supportato su ARM. Sebbene sia tecnicamente possibile forzare l'uso di un binario Chromium per ARM, perderai tutte le funzionalità/protezioni aggiuntive di puppeteer-extra.

Questo esempio di configurazione utilizza Caddy per gestire TLS, SNI e aggiungere un paio di header personalizzati come 'X-Real-IP' a ogni richiesta. Non sei obbligato a usare Caddy con Cuddlephish, poiché lo stesso reverse proxy può essere configurato con Nginx, Apache, ecc. Preferisco Caddy perché è facile da installare con Docker e ha plugin per gestire i certificati Letsencrypt per la maggior parte dei registrar di domini. Il Caddyfile di esempio mostra come configurarlo per Gandi. Controlla la documentazione per il tuo registrar.

Installa Docker, Node, XVFB e altre dipendenze:

root@kitploit:~
git clone https://github.com/fkasler/cuddlephish
cd cuddlephish
sudo bash install_deps.sh

Puoi quindi usare Docker per creare Caddy con un plugin per certificati wildcard per il tuo registrar. L'esempio è per Gandi. Controlla la documentazione qui e l'elenco dei moduli per provider DNS qui. Puoi modificare il Dockerfile per il tuo registrar prima di crearlo:

root@kitploit:~
sudo docker build -t caddy .

Ora modifica il Caddyfile per sostituire il tuo dominio e la chiave API di Gandi (o altro registrar), quindi avvia Caddy. Ti consiglio di avviarlo in una finestra screen o tmux in modo da poter eseguire il server Node in un'altra finestra tra poco:

root@kitploit:~
sudo docker run -p 80:80 -p 443:443 -p 2019:2019 -v $PWD/Caddyfile:/etc/caddy/Caddyfile --network=host caddy:latest

Con Caddy che gestisce il traffico sulle porte 80 e 443, possiamo finalmente eseguire lo strumento!

Installa le dipendenze Node:

root@kitploit:~
npm install

Alcune piccole modifiche alla configurazione: PASSAGGIO CRITICO: assicurati di modificare il file config.json di esempio per aggiungere i tuoi IP pubblici approvati per l'accesso amministrativo. Questa whitelist di IP determina l'accesso all'interfaccia web "/admin". Dovresti anche cambiare la chiave socket predefinita con una più sicura.

Lo strumento non è configurato per targetizzare alcun login di default, quindi dovrai aggiungerne alcuni. C'è uno script 'add_target.js' per semplificare questo passaggio. Basta eseguire lo script e incollare l'URL del portale di login che desideri targetizzare quando richiesto:

root@kitploit:~
node add_target.js

Questo recupererà il nome del servizio, il titolo della scheda e la favicon per te e aggiungerà una voce a 'targets.json'. Puoi eseguire questo script più volte e aggiungerà i nuovi target. Lo script nominerà ogni servizio in base al dominio, senza il livello superiore. Quindi, per 'https://www.example.com/login.php' il servizio sarà semplicemente 'example' quando specificherai il tuo target quando...

Eseguilo!

root@kitploit:~
node index.js example

Dopo alcuni secondi, dovresti vedere un messaggio nella console quando la prima istanza automatica di Chrome si connette tramite websocket. Ora i visitatori del tuo sito di phishing vedranno quella che sembra la pagina di login del target, ma in realtà è un flusso video della tua istanza automatica del browser. Possono anche interagire con la tua istanza del browser e accedere per te.

Se hai configurato correttamente i tuoi IP amministrativi in config.json, dovresti essere in grado di visualizzare un'interfaccia web speciale '/admin' per tenere traccia degli utenti, visualizzare i log dei tasti, assumere il controllo delle istanze del browser connesse, rubare i cookie ed eliminare le istanze del browser indesiderate.

Nota: non vedrai nulla nella pagina di admin finché non avrai delle vittime. Una volta che hai una vittima, la sua istanza del browser dovrebbe apparire nell'interfaccia di amministrazione.

Risoluzione dei problemi ("Vedo solo una pagina bianca")

Diverse persone hanno aperto issue riguardanti una "Pagina Bianca Vuota", che è più un sintomo di molti possibili problemi, non un problema in sé. Per favore, non aprire issue con nomi di sintomi vaghi. Invece, se vedi una pagina bianca dal lato utente, prova prima a controllare quanto segue:

  • Controlla che il titolo della scheda del servizio target non contenga caratteri speciali. Usiamo "--auto-select-desktop-capture-source" per dire al nostro browser automatico quale scheda trasmettere. Questa opzione fallisce con titoli contenenti caratteri speciali. Tuttavia, non è necessario che l'intero titolo della scheda corrisponda; basta una sottostringa sufficiente per una corrispondenza univoca.
  • Sulla stessa linea, se il tuo servizio target invia un reindirizzamento 302 o simile al tuo browser automatico e il titolo della scheda cambia prima che iniziamo la trasmissione WebRTC verso una vittima, allora "--auto-select-desktop-capture-source" fallirà. Puoi vedere come add_target.js acquisisce queste informazioni e replicarle in index.js insieme a una dichiarazione console.log() per vedere se il titolo è cambiato prima di negoziare WebRTC.
  • Controlla che l'HTML di cuddlephish venga caricato e che non ci siano errori JavaScript evidenti nella console sviluppatore sul front-end. La configurazione di esempio di Caddy ha alcuni blocchi di base sugli user agent come curl. Come minimo, dovresti vedere che il titolo della scheda e la favicon vengono falsificati.
  • Assicurati di poter interagire con il servizio STUN di esempio e la porta (stun.l.google.com:19302) dal tuo server.
  • Assicurati che la rete da cui stai lavorando permetta STUN. STUN funziona solo con "full-cone NAT", "(Address)-restricted-cone NAT" e "Port-restricted cone NAT". NON funziona con "Symmetric NAT".
  • Assicurati di poter interagire con il servizio STUN di esempio e la porta (stun.l.google.com:19302) dal browser della tua vittima di test. Prova a usare https://icetest.info/.
  • Se la tua rete non riesce a raggiungere il server STUN di esempio, cambialo con uno che puoi raggiungere. Se la tua rete non permette STUN, allora c'è una configurazione di esempio per un server TURN nelle pagine HTML di cuddlephish e broadcast. Dovrai configurare o pagare per un server TURN tuo. NOTA: Un server TURN ha le migliori possibilità di connettere le vittime di phishing alle tue istanze del browser.

Ad alto livello, se vedi solo una pagina bianca sul front-end, significa che c'è un'interruzione nella catena del flusso di dati da "Avvia WebRTC" > "Seleziona scheda da trasmettere" > "Negoziare ICE con il browser della vittima" > "Stream video". I passaggi di risoluzione dei problemi sopra hanno lo scopo di aiutarti a seguire i dati attraverso questo processo. Quando funziona correttamente, dovresti vedere un flusso di log sul server simile al seguente:

troubleshoot

Spero che questo aiuti con eventuali problemi e, come sempre, informazioni sufficienti per riprodurre costantemente un problema sono un prerequisito per inviare issue per ulteriori indagini.

Funzionalità di amministrazione

Invia Payload:

Attiva manualmente il download di un payload sul sistema della vittima tramite JavaScript. Ogni target inizia con 'payload.txt' come payload di test. Basta cambiare la posizione del file in targets.json per inviare un payload personalizzato.

Espelli Utente:

Invia una modifica di window.location alla vittima per inviarla al vero portale di login. Sembrerà che sia solo costretta a riautenticarsi e impedirà di vederti mentre prendi i controlli. Se modifichi il codice, potresti fare altre cose interessanti con questa tecnica generale ;)

Prendi il controllo:

Ti permette di intervenire e prendere il controllo diretto di un'istanza del browser dal portale di amministrazione. Per smettere di controllare l'istanza, premi il tasto ESCAPE. Nota: questo toglierà i controlli alla vittima di phishing e potrà vedere i tuoi movimenti se non la espelli prima. Sei stato avvertito.

Ridai il controllo:

Ti permette di ridare manualmente il controllo dell'istanza automatica del browser all'utente. Questo potrebbe essere utile in alcuni scenari di ingegneria sociale quando si finge il reparto IT. Puoi dire all'utente che stai avviando una sessione di assistenza, prendere il controllo e navigare al servizio target, ridare il controllo e fargli accedere, riprendere il controllo, ecc.

Ottieni Cookie:

Estrae tutti i cookie e gli elementi di archiviazione locale dall'istanza del browser e li scarica come file JSON. Per iniettare questo materiale di credenziali in un'istanza del browser in esecuzione sul tuo sistema locale, c'è uno script nel progetto chiamato 'stealer.js'. È pensato per essere eseguito dalla tua macchina, non dal server, quindi per usarlo dovrai anche installare i componenti Node del progetto sul tuo sistema.

root@kitploit:~
node stealer.js ~/Downloads/cuddle_asdf1234.json

Rimuovi Istanza:

Uccide un'istanza del browser quando non ne hai bisogno. A volte gli utenti non ti fanno accedere completamente. A volte la connessione WebRTC fallisce. A volte una sessione scade prima che tu possa usarla. In questi casi, questo pulsante può aiutarti a pulire le istanze del browser inutili tramite il portale di amministrazione.

Una nota sui keylog e i dati utente:

Ogni browser viene generato con un proprio "browser id" casuale e una directory di dati utente corrispondente nella cartella "user_data" del progetto. In alcuni casi in cui 'stealer.js' non funziona, potresti aver bisogno di replicare anche i dati utente per quell'istanza. Questo può essere utile in scenari che targetizzano servizi con una funzione "ricorda questo browser" a seconda di come è implementata.

C'è anche un keylog.txt in ogni directory dei dati utente con un keylog completo dell'utente vittima. Il keylog generale nel portale di amministrazione cerca di tenere conto di cose come i backspace, mentre questo keylog.txt avrà tutte le sequenze di tasti registrate.

Integrazione Phishmonger

Esempio di pm.json:

root@kitploit:~
{
  "tacking_id": "id",
  "logging_endpoint": "https://www.phishmongerserver.com/create_event",
  "admin_cookie": "admin_cookie=s3cret",
  "post_url_search": "ppsecure"
}

Sotto il cofano

Questo strumento funziona abbinando i visitatori del sito di phishing a un browser Chrome automatizzato, in esecuzione sul server di phishing. Un flusso video dell'istanza Chrome controllata dall'attaccante viene quindi trasmesso alla vittima di phishing tramite WebRTC, e tutti i movimenti del mouse e le sequenze di tasti forniti dall'utente vengono inoltrati dal browser della vittima alla loro istanza Chrome associata. Il server utilizza websocket per tracciare le vittime, abbinarle ai browser, intermediare i flussi video WebRTC e intercettare gli input dell'utente. Per ogni nuovo visitatore, il server genera una nuova istanza Chrome. Poiché utilizziamo il protocollo Chrome Devtools (CDP) per guidare ogni istanza Chrome, possiamo usare API come "Storage.getCookie" per estrarre i cookie di sessione per i siti target una volta che l'utente ha effettuato l'accesso per noi. Possiamo anche intervenire in qualsiasi momento e guidare direttamente ogni istanza Chrome, sfruttando lo stesso metodo che usiamo per dare il controllo remoto alle vittime in primo luogo.

Il Node Server esegue le seguenti operazioni:

  • Avvia un nuovo browser ("empty phishbowl") con un'istanza xvfb come schermo virtuale e naviga una scheda verso la pagina di login del target
  • Carica una pagina web personalizzata, broadcast.html, con uno script di configurazione WebRTC in una nuova scheda sul browser automatico
  • Il browser si connette tramite websocket
  • La vittima visita il sito e si connette tramite websocket
  • Abbina la vittima al browser, media il flusso video WebRTC tramite websocket e genera un nuovo browser per la prossima vittima
  • I browser vengono tracciati da un ID casuale per consentire agli amministratori di "prendere il controllo" di un'istanza del browser, o estrarre materiale di credenziali da un'istanza.

Domande e risposte

Perché rilasceresti una cosa così pericolosa? (AKA, la domanda che mia madre mi fa ogni volta che parlo al Black Hat)

È mia convinzione che questa tecnica sia stata teorizzata e persino armata per diversi anni (vedi ringraziamenti). Quindi, mentre gli attori delle minacce possono sfruttare questa tecnica, e probabilmente lo fanno da un po', i professionisti della sicurezza offensiva non hanno avuto un modo semplice per replicare questa tecnica e potrebbero persino essere inconsapevoli della sua esistenza. La mia intenzione nel rilasciare lo strumento è di permettere a penetration tester e red teamer di usare BitM nelle operazioni per mostrare il suo potenziale impatto e aiutare i difensori di rete a prepararsi per minacce reali.

Come posso difendere il mio servizio da questo tipo di attacco?

Prima di tutto, comprendi che questo attacco si basa sull'ingegneria sociale per indurre un utente a visitare un sito web dannoso. La whitelist dei domini sarebbe di grande aiuto per prevenire questo e altri tipi di ingegneria sociale. Se ci affidiamo agli utenti per gestire il 100% dei dati di autenticazione (password, OTP, SMS, PhoneFactor, notifica push, ecc.) per un servizio web, siamo potenzialmente vulnerabili a questo attacco. Pertanto, per sventare questo attacco, dobbiamo sfruttare dati di autenticazione che gli utenti non gestiscono. Ad esempio, i certificati TLS client possono essere emessi per i dispositivi client e saranno validi solo per il vero servizio web. Il certificato è gestito dal browser e dal sistema operativo, e non c'è modo per il server di un attaccante di ottenere una copia del certificato TLS della vittima. Un'altra opzione è utilizzare U2F o FIDO2 con hardware come un YubiKey per gestire parte dei dati di autenticazione richiesti. Non c'è modo per un sito web di un hacker di interagire con un YubiKey collegato al computer di una vittima.

Usi Docker per Caddy ma non per il server Node. Perché?

Non sono un mago di Docker (ancora). Se riesci a trovare una configurazione Dockerizzata semplice, apprezzerei molto una pull request.

Che senso ha il nome stupido?

È un gioco di parole su Cuttlefish (seppia), una creatura marina tosta che può mimetizzarsi nell'ambiente circostante, Phishing, perché richiede ingegneria sociale per eseguire l'attacco, e volutamente scritto male per essere unico, giocoso e stupido. Mi rende felice pensare che questo nome divertente verrà menzionato insieme a reperti di rischio critico nei report di pentest.

Ringraziamenti

Sebbene abbia ideato questa tecnica e implementazione in modo indipendente, ho poi appreso che un paio di altri ricercatori mi hanno preceduto nella scoperta. Hanno entrambi adottato un approccio utilizzando client VNC basati sul web per ottenere un risultato simile. È un approccio intuitivo e potrebbe essere applicabile per eseguire attacchi MitM contro altri software, non solo browser (VPN-in-the-browser forse?). Vale sicuramente la pena dare un'occhiata:

Franco Tommasi, Christian Catalano & Ivan Taurino https://link.springer.com/article/10.1007/s10207-021-00548-5

@mrd0x https://mrd0x.com/bypass-2fa-using-novnc/

Inoltre:

Un ringraziamento a Daniel Aaron @majordmg per il supporto nelle fasi iniziali della proof-of-concept di WebRTC.

Un enorme grazie a RJ Stallkamp @Z3rO-C00L per aver sistemato e stilizzato l'interfaccia di amministrazione, e per il fantastico nuovo logo.

Scarica lo strumento