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
Fortigate-SSL-VPN-Exploit-Kit — Il vaso d'oro SSL-VPN di FortiGate. CVE-2024-21762 e CVE-2023-27997. 79 client exploit funzionanti. 53 SKU hardware. 55 build FortiOS. | Kitploit
Strumenti/GitHubGitHub/abraxas/fortigate-ssl-vpn-exploit-kit
Framework di ExploitAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebEsfiltrazione DatiSicurezza di RetePenetration TestingCommand and ControlRed Teaming
Sviluppo Payload
GitHubabraxas/fortigate-ssl-vpn-exploit-kit

Fortigate-SSL-VPN-Exploit-Kit

Il vaso d'oro SSL-VPN di FortiGate. CVE-2024-21762 e CVE-2023-27997. 79 client exploit funzionanti. 53 SKU hardware. 55 build FortiOS.

Vedi Repository
8h 29m faNon ancora revisionato

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

Kit FortiGate SSL-VPN (recuperato in natura)

Archivio di ricerca. Recuperato così com'era. Non ho scritto io questi file.
Rilasciato: 1 settembre 2026

Questo repository è l'orchestratore, i payload di secondo stadio e i listener per l'operatore che si trovano sopra un catalogo di exploit FortiGate SSL-VPN per singolo SKU. La storia completa, i conteggi e le note di caccia sono nella serie The SSL-VPN pot of gold su Abraxas Labs.

  • Sito: abraxaslabs.tech
  • Serie: The SSL-VPN pot of gold
  • GitHub: github.com/abraxas
  • Twitter / X: @abraxas_null

Non eseguire questo materiale contro alcun host senza esplicita autorizzazione scritta sia dalla parte che ospita questo repository sia dal proprietario dei sistemi target. Le CVE correlate erano pubbliche e corrette prima di questo rilascio. Questo albero è per ricerca, rilevamento e analisi storica.


Cos'è

Ho trovato in natura un kit privato FortiGate SSL-VPN. Il primo rilascio era una directory di client funzionanti: nomi come e . Ogni file è un client di corruzione della memoria . Due n-day pubbliche, ri-timbrate su hardware e firmware finché la cartella non sembrava un catalogo di ricambi.

exp/exp_60E-v6.4.7.py
exp/exp_1000D-v7.4.0.py
per-SKU, per-FortiOS

L'oro è la matrice di offset, non un nuovo bug. Questa tesi è in Fase 0 della serie. La Fase 1 copre le due primitive come comportamento. La Fase 2 è la mappa SKU / train / CPU ricercabile. La Fase 3 è la caccia.

Questo repository è il resto dello stesso kit, non una seconda famiglia di exploit.

  • I programmi exp/ sono i client per-immagine già descritti nella serie.
  • I file nella directory principale e in shellcode/ sono il launcher, il recupero dell'impianto e i listener per il furto di configurazione che quei client erano stati scritti per chiamare.
  • I file exp_*.py non hanno mai contenuto l'impianto. Sapevano solo (1) recuperare byte grezzi da un "server di shellcode" o (2) fare GET /s.js e eval. Quei pezzi mancanti sono qui.

Le primitive:

FamigliaCVEAdvisory FortinetColore pubblico
ACVE-2024-21762FG-IR-24-015Assetnote — Two Bytes is Plenty
BCVE-2023-27997FG-IR-23-097Lexfo — XORtigate, Bishop Fox

Entrambe sono nel catalogo delle vulnerabilità note sfruttate di CISA. poc.py non implementa nessuna delle due CVE. Seleziona e avvolge le due famiglie già classificate (scrittura a blocchi 21762; overflow dell'heap enc= 27997).


Struttura

root@kitploit:~
.
├── poc.py                     # launcher pocsuite3 / fingerprint / gestore processi
├── s.js                       # secondo stadio Node (ladro di configurazione)
├── send_cmd.py                # gestore callback per il percorso stager
├── init.sh                    # installazione pacchetti workstation operatore
├── requirements.txt           # pwntools
├── exp/
│   └── exp_<SKU>-v<FortiOS>.py
└── shellcode/
    ├── shellcode_server.py    # pompa blob con prefisso di lunghezza
    ├── shellcode_arm          # ~2.0 MB secondo stadio grezzo
    └── shellcode_amd64        # ~2.7 MB secondo stadio grezzo

exp/index.html e shellcode/index.html sono normali elenchi di directory di http.server Python. Mostrano solo che questo albero è stato ospitato come root web a un certo punto.

Questa copia di exp/ è il catalogo precedente più quattro client extra: exp_30E-v6.2.4.py, exp_30E-v6.2.12.py, exp_30E-v6.2.14.py, exp_40F-v7.0.5.py.


Come si collegano i pezzi

root@kitploit:~
poc.py                          orchestratore (pocsuite3)
  │
  ├─ fingerprint portal ─────── VERSION_LIBS (hash → SKU + FortiOS)
  ├─ scegli file ────────────── exp/exp_<SKU>-v<ver>.py
  │
  ├─ se il client è del tipo "stager" (Famiglia A ARM / alcuni amd64)
  │     avvia shellcode/shellcode_server.py
  │           legge shellcode/shellcode_arm  o  shellcode_amd64
  │     avvia send_cmd.py                   (attende callback)
  │     avvia ricevitore configurazione su :9999
  │     esegui exp_*.py scelto
  │
  └─ se il client è del tipo "Node /s.js" (maggior parte Famiglia B + molte Famiglia A)
        servi s.js su HTTP
        avvia ricevitore configurazione su :9999
        esegui exp_*.py scelto
              → firewall GET /s.js → eval → esfiltrazione

Pipeline in una riga: identifica → scegli file offset → corrompi sslvpnd → recupera impianto → esfiltra /data/config/*.gz → archivia sul lato operatore.

Quell'ultimo passaggio è il punto. Un successo è esecuzione di codice non autenticata in sslvpnd sul firewall stesso — terminatore TLS, policy di routing, sessioni VPN, spesso binding LDAP/RADIUS. FortiOS non offre una /bin/sh utile. La ricerca pubblica e questo kit passano entrambi attraverso un helper di comando interno e/o /bin/node, che FortiOS include effettivamente. Tratta un successo confermato come compromissione del perimetro di rete, non un demone crashato. Vedi Cosa significa un successo.


File per file

poc.py — launcher

Front-end per l'operatore (pocsuite3 POCBase). Non implementa CVE-2024-21762 o CVE-2023-27997.

  1. Recupera https://<target>/remote/login?lang=en (fallback GB2312).
  2. Estrae l'hash anti-cache da /sslvpn/js/login.js?q=<md5>.
  3. Cerca quell'hash in una tabella incorporata VERSION_LIBS (182 righe hash,SKU,version). Quella tabella è il motivo per cui il kit può scegliere tra 50+ appliance senza che l'operatore nomini lo SKU. Stessi SKU di la matrice, guidati da un hash di risorsa SSL-VPN pubblico piuttosto che SNMP o un'API di gestione.
  4. Risolve exp/exp_<SKU>-v<version>.py.
  5. Classifica il client leggendone il sorgente:
    • contiene s.js → tipo 2 (loader Node)
    • l'uso menziona Shellcode Server → tipo 1 (stager); poi cerca arm vs amd64 nello script
  6. Avvia gli helper corrispondenti e fa Popen del exp_*.py con argomenti host/porta/callback.

Indirizzo operatore predefinito in questa copia: HOST_IP dall'ambiente, altrimenti ATTACKER_HOST. Gli indirizzi IPv4 letterali in questo albero sono stati sostituiti con etichette di ruolo (porte invariate):

EtichettaRuoloDove appariva
TARGET_HOSTFortiGate sotto attaccoMai hardcoded; rhost / target da argv (vedi poc.py)
ATTACKER_HOSTWorkstation operatoreDefault HOST_IP in poc.py; indirizzi di bind in poc.py, send_cmd.py, shellcode/shellcode_server.py; segnaposto s.js / TFTP in exp_*.py che vengono riempiti con lhost
C2_HOSTCallback incorporato in questa copia dell'impiantos.js — non il lhost passato nell'exploit
PortaRuolo
7777Callback / send_cmd.py
8888Server shellcode
9999Ricevitore configurazione (corrisponde all'esfiltrazione di s.js e send_cmd.py)

Se l'hash del portal manca da VERSION_LIBS, si ferma con "unknown target hash." Se l'hash corrisponde ma il file exp/ è assente, "no exp."

s.js — il secondo stadio Node mancante

Questo è il file che i client Famiglia B / Node Famiglia A recuperano dopo execute_cmd. Non è una reverse shell generica.

  • Callback hardcoded C2_HOST:9999 (host C2, non TARGET_HOST e non il lhost / ATTACKER_HOST passato nell'exploit — questa copia è stata preparata per un singolo callback operatore).
  • Legge /data/config/ sul firewall.
  • Prende i file *.gz non-symlink (oggetti di configurazione compressi FortiOS).
  • Li decomprime e li invia ciascuno su un piccolo protocollo TCP con prefisso di lunghezza, poi un marcatore di fine.

Questo è un ladro di configurazione. Spiega perché poc.py ascolta anche sulla 9999 e riassembla i file in un risultato base64. Caccia C2_HOST sulla porta 9999 da qualsiasi egress FortiGate. Note di caccia: Fase 3.

send_cmd.py — gestore callback per il percorso stager

Usato quando il exp_*.py scelto è del tipo shellcode ARM/amd64 (l'uso include un server shellcode).

  • Ascolta sulla 7777.
  • Alla connessione, scrive un comando: cd /data/config e cat di ogni *.gz a nc <LHOST> 9999.
  • Stesso obiettivo di s.js (rubare configurazione), trasporto diverso (callback shell vs Node).

Una variante commentata usava framing base64 invece di cat grezzo.

shellcode/shellcode_server.py — pompa di byte per stager Famiglia A

Corrisponde al protocollo già visibile negli stub ARM32 exp_*.py:

  1. Bind sulla porta scelta dall'operatore (poc.py usa 8888).
  2. Accetta una connessione.
  3. Invia una lunghezza di 4 byte little-endian.
  4. Invia il blob shellcode_<arch> dalla stessa directory.

Gli stager exp_*.py si connettono qui, mappano memoria scrivibile-eseguibile, recuperano il blob, poi si riconnettono a lhost:lport (7777 → send_cmd.py).

shellcode/shellcode_arm e shellcode/shellcode_amd64

Blob grezzi di secondo stadio (~2.0 MB ARM, ~2.7 MB amd64). Sono ciò che lo stager scarica. Non sono il piccolo stub Thumb dentro i file Python; quegli stub recuperano solo questi file. Trattali come l'impianto per il percorso non-Node. La dimensione suggerisce payload impacchettati o statici, non poche dozzine di istruzioni.

init.sh — configurazione workstation operatore

Non usato contro il firewall. Installa build-essential, binutils-arm-linux-gnueabihf e gcc-aarch64-linux-gnu. Serve per compilare pezzi ARM/AArch64 su una macchina d'attacco simile a Debian. Coerente con un autore che compila stager piuttosto che spedire solo Python.

requirements.txt

Una sola riga: pwntools. I file exp_*.py e shellcode_server.py lo importano. poc.py vuole anche pocsuite3, python-dotenv, mmh3 e requests.


Relazione con i client exp/

Già descritto nella serieRuolo in questo albero
Famiglia A ARM exp_*.py (argomenti stager)Primo stadio. Chiama shellcode_server.py + shellcode_arm (o amd64), poi lhost:7777.
Famiglia A/B Node exp_*.py (/s.js)Primo stadio. HTTP GET del s.js padre, poi eval.
Varianti 6.0 serie D TFTP / /tmp/sStesso obiettivo s.js via TFTP; si aspetta comunque questo file sulla root HTTP dell'operatore.

Niente nella directory principale implementa una terza CVE. Conteggi, mappa di calore SKU e allineamento train (Famiglia A fino a 7.4.0 / 7.4.1; Famiglia B nella finestra 27997) sono in Fase 0 e Fase 2. Il retargeting più pesante nel catalogo originale: FortiGate-60E, 100E, 60F, 100F — hardware da filiale.


Cosa cambia questo

Il primo rilascio si fermava a "ottieni un callback." I corpi di secondo stadio mancavano. Questo albero rende esplicito l'obiettivo:

  1. Rubare la configurazione FortiOS da /data/config/*.gz, non "RCE generica." Questo è compromissione di credenziali e topologia (utenti VPN, route, segreti memorizzati in quegli oggetti).
  2. Il set di IOC è concreto (vedi sotto).
  3. VERSION_LIBS in poc.py è una lista pronta "quale SKU pensavano fosse questo hash."
  4. Il kit è una pipeline completa di furto configurazione, non un sacco di PoC scollegati.

Indicatori (questa copia)

Il riconoscimento del portal e gli URI di primo stadio sono documentati in Caccia al kit. Quelli distintivi già segnalati nei write-up pubblici e in questo albero:

  • Riconoscimento portal: GET /remote/login e /sslvpn/js/login.js?q=
  • URI di primo stadio: /aaaa/bbbb, /remote/error, /remote/info, /remote/hostcheck_validate con enc=
  • HTTP in uscita GET /s.js dal firewall
  • TCP in uscita dal firewall verso 7777 / 8888 / 9999
  • C2 incorporato C2_HOST:9999 dentro questa copia di s.js (host C2)
  • Listener operatore su ATTACKER_HOST porte 7777 / 8888 / 9999 (host attaccante)
  • Il target non è mai hardcoded: TARGET_HOST è rhost fornito a runtime

Caccia l'egress dal firewall (TARGET_HOST) verso C2_HOST:9999 e verso qualsiasi ATTACKER_HOST che abbia servito /s.js durante la finestra rilevante.


Cosa questo kit non dimostra

Da l'introduzione:

  • Una nuova 0-day. Le primitive sono n-day con write-up pubblici.
  • FortiProxy, FortiManager, FortiAnalyzer, FortiWeb. Nessun campione qui.
  • SKU non nella matrice recuperata (molte unità 70F / 90G / 120G, immagini solo-VM, chassis 6K / 7K). Nessun offset compilato.
  • Build oltre i tagli pubblicati da Fortinet. Conferma contro l'advisory live (FG-IR-24-015, FG-IR-23-097), non questa cartella.
  • Persistenza. Vivrebbe in un follow-on che non è ancora implementato come terzo stadio distinto in questi script.

Un PoC pubblico contro una VM è un artefatto diverso. Questo pacchetto è per chi ha risposto al riconoscimento.


Serie

  1. Fase 0 · Introduzione — il ritrovamento, i conteggi, la posta in gioco.
  2. Fase 1 · Due porte pubbliche — Famiglia A e Famiglia B come comportamento, non una ricetta.
  3. Fase 2 · La matrice — 53 SKU, train, CPU. Ricercabile.
  4. Fase 3 · Caccia al kit — URI distintivi, tagli di patch, cosa fare se il portal era raggiungibile.

Se gestisci FortiGate: inventaria modello, FortiOS esatto, SSL-VPN attivo o disattivo, se il portal era raggiungibile da reti non fidate. Poi leggi Fase 2. Non inventariare solo le scatole di filiale serie 60 perché quei nomi file erano i più rumorosi.


Avviso

Questi file sono stati recuperati in natura durante ricerca di sicurezza indipendente. Non li ho creati io. Sono rilasciati così come trovati, dopo che le CVE correlate erano state divulgate pubblicamente e corrette.

Solo uso di ricerca / educativo. Non eseguire, distribuire o usare questo materiale contro alcun host senza esplicita autorizzazione scritta sia dalla parte che ospita questo repository sia dal proprietario dei sistemi target.

— @abraxas_null · abraxaslabs.tech · github.com/abraxas

Scarica lo strumento