Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Fortigate-SSL-VPN-Exploit-Kit — O pote de ouro do FortiGate SSL-VPN. CVE-2024-21762 e CVE-2023-27997. 79 clientes de exploit funcionais. 53 SKUs de hardware. 55 builds do FortiOS. | Kitploit
Ferramentas/GitHubGitHub/abraxas/fortigate-ssl-vpn-exploit-kit
Frameworks de ExploraçãoAnálise de VulnerabilidadesExploraçãoExploração de Aplicações WebExfiltração de DadosSegurança de RedeTestes de PenetraçãoComando e ControleRed Teaming
Desenvolvimento de Payloads
GitHubabraxas/fortigate-ssl-vpn-exploit-kit

Fortigate-SSL-VPN-Exploit-Kit

O pote de ouro do FortiGate SSL-VPN. CVE-2024-21762 e CVE-2023-27997. 79 clientes de exploit funcionais. 53 SKUs de hardware. 55 builds do FortiOS.

Ver Repositório
há 8h 34mAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Kit FortiGate SSL-VPN (recuperado na natureza)

Arquivo de pesquisa. Recuperado como encontrado. Eu não escrevi estes arquivos.
Lançado: 1 de setembro de 2026

Este repositório é o orquestrador, payloads de segundo estágio e listeners do operador que ficam por cima de um catálogo de exploits FortiGate SSL-VPN por SKU. A história completa, contagens e notas de caça vivem na série The SSL-VPN pot of gold no Abraxas Labs.

  • Site: abraxaslabs.tech
  • Série: The SSL-VPN pot of gold
  • GitHub: github.com/abraxas
  • Twitter / X: @abraxas_null

Não execute este material contra nenhum host a menos que você tenha permissão escrita explícita tanto da parte que hospeda este repositório quanto do proprietário dos sistemas alvo. Os CVEs relacionados eram públicos e corrigidos antes deste lançamento. Esta árvore é para pesquisa, detecção e análise histórica.


O que é isto

Encontrei um kit privado FortiGate SSL-VPN na natureza. O primeiro lote era um diretório de clientes funcionais: nomes como e . Cada arquivo é um cliente de corrupção de memória . Dois n-days públicos, reestampados através de hardware e firmware até a pasta parecer um catálogo de peças.

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

O ouro é a matriz de offsets, não um novo bug. Esse argumento está na Fase 0 da série. A Fase 1 cobre as duas primitivas como comportamento. A Fase 2 é o mapa pesquisável de SKU / train / CPU. A Fase 3 é a caça.

Este repositório é o resto do mesmo kit, não uma segunda família de exploits.

  • Os programas exp/ são os clientes por imagem já descritos na série.
  • Os arquivos do diretório pai e de shellcode/ são o launcher, busca de implante e listeners de roubo de configuração que esses clientes foram escritos para chamar.
  • Os arquivos exp_*.py nunca continham o implante. Eles apenas sabiam (1) puxar bytes brutos de um "servidor de shellcode" ou (2) fazer GET /s.js e eval. Essas peças que faltavam estão aqui.

As primitivas:

FamíliaCVEAviso da FortinetCor pública
ACVE-2024-21762FG-IR-24-015Assetnote — Two Bytes is Plenty
BCVE-2023-27997FG-IR-23-097Lexfo — XORtigate, Bishop Fox

Ambos estão no catálogo de Vulnerabilidades Exploradas Conhecidas da CISA. poc.py não implementa nenhum dos CVEs. Ele seleciona e envolve as duas famílias já classificadas (escrita em blocos 21762; overflow de heap enc= 27997).


Estrutura

root@kitploit:~
.
├── poc.py                     # launcher pocsuite3 / fingerprint / gerenciador de processos
├── s.js                       # segundo estágio Node (roubador de configuração)
├── send_cmd.py                # manipulador de callback para o caminho do stager
├── init.sh                    # instalação de pacotes da estação de trabalho do operador
├── requirements.txt           # pwntools
├── exp/
│   └── exp_<SKU>-v<FortiOS>.py
└── shellcode/
    ├── shellcode_server.py    # bomba de blob com prefixo de comprimento
    ├── shellcode_arm          # ~2,0 MB de segundo estágio bruto
    └── shellcode_amd64        # ~2,7 MB de segundo estágio bruto

exp/index.html e shellcode/index.html são listagens de diretório comuns do http.server do Python. Elas apenas mostram que esta árvore foi hospedada como raiz web em algum momento.

Esta cópia de exp/ é o catálogo anterior mais quatro clientes extras: exp_30E-v6.2.4.py, exp_30E-v6.2.12.py, exp_30E-v6.2.14.py, exp_40F-v7.0.5.py.


Como as peças se conectam

root@kitploit:~
poc.py                          orquestrador (pocsuite3)
  │
  ├─ fingerprint do portal ──── VERSION_LIBS (hash → SKU + FortiOS)
  ├─ escolher arquivo ───────── exp/exp_<SKU>-v<ver>.py
  │
  ├─ se o cliente for do tipo "stager" (Família A ARM / alguns amd64)
  │     iniciar shellcode/shellcode_server.py
  │           lê shellcode/shellcode_arm  ou  shellcode_amd64
  │     iniciar send_cmd.py                   (aguardar callback)
  │     iniciar receptor de configuração em :9999
  │     executar exp_*.py escolhido
  │
  └─ se o cliente for do tipo "Node /s.js" (maioria da Família B + muitas Família A)
        servir s.js via HTTP
        iniciar receptor de configuração em :9999
        executar exp_*.py escolhido
              → firewall GET /s.js → eval → exfiltração

Pipeline em uma linha: identificar → escolher arquivo de offset → corromper sslvpnd → puxar implante → exfiltrar /data/config/*.gz → arquivar no lado do operador.

Esse último passo é o ponto. Um acerto é execução de código não autenticada em sslvpnd no próprio firewall — terminador TLS, política de roteamento, sessões VPN, frequentemente bindings LDAP/RADIUS. O FortiOS não oferece um /bin/sh útil. Pesquisa pública e este kit ambos passam por um auxiliar de comando interno e/ou /bin/node, que o FortiOS realmente inclui. Trate um acerto confirmado como comprometimento da borda da rede, não um daemon travado. Veja O que um acerto significa.


Arquivo por arquivo

poc.py — launcher

Front end do operador (pocsuite3 POCBase). Não implementa CVE-2024-21762 ou CVE-2023-27997.

  1. Busca https://<target>/remote/login?lang=en (fallback GB2312).
  2. Puxa o hash de cache-buster de /sslvpn/js/login.js?q=<md5>.
  3. Procura esse hash em uma tabela embutida VERSION_LIBS (182 linhas hash,SKU,version). Essa tabela é o motivo pelo qual o kit pode escolher entre 50+ appliances sem o operador nomear o SKU. Mesmos SKUs da matriz, dirigidos por um hash de recurso SSL-VPN público em vez de SNMP ou uma API de gerenciamento.
  4. Resolve exp/exp_<SKU>-v<version>.py.
  5. Classifica o cliente lendo seu código-fonte:
    • contém s.js → tipo 2 (loader Node)
    • uso menciona Shellcode Server → tipo 1 (stager); então procura por arm vs amd64 no script
  6. Inicia os auxiliares correspondentes e faz Popen do exp_*.py com argumentos de host/porta/callback.

Endereço padrão do operador nesta cópia: HOST_IP do ambiente, senão ATTACKER_HOST. Endereços IPv4 literais nesta árvore foram substituídos por rótulos de função (portas inalteradas):

RótuloFunçãoOnde apareceu
TARGET_HOSTFortiGate sob ataqueNunca hardcoded; rhost / target de argv (veja poc.py)
ATTACKER_HOSTEstação de trabalho do operadorPadrão HOST_IP em poc.py; endereços de bind em poc.py, send_cmd.py, shellcode/shellcode_server.py; placeholders s.js / TFTP em exp_*.py que são preenchidos com lhost
C2_HOSTCallback embutido nesta cópia do implantes.js — não o lhost passado para o exploit
PortaFunção
7777Callback / send_cmd.py
8888Servidor de shellcode
9999Receptor de configuração (corresponde à exfiltração de s.js e send_cmd.py)

Se o hash do portal estiver ausente de VERSION_LIBS, ele para com "unknown target hash." Se o hash corresponder mas o arquivo exp/ estiver ausente, "no exp."

s.js — o segundo estágio Node que faltava

Este é o arquivo que os clientes da Família B / Node Família A buscam após execute_cmd. Não é um reverse shell genérico.

  • Callback hardcoded C2_HOST:9999 (host C2, não TARGET_HOST e não o lhost / ATTACKER_HOST passado para o exploit — esta cópia foi gravada para um callback de operador).
  • Lê /data/config/ no firewall.
  • Pega arquivos *.gz que não são symlinks (objetos de configuração compactados do FortiOS).
  • Descompacta-os e envia cada um através de um pequeno protocolo TCP com prefixo de comprimento, depois um marcador de fim.

Isso é um roubador de configuração. Explica por que poc.py também escuta na 9999 e remonta arquivos em um resultado base64. Cace C2_HOST na porta 9999 de qualquer egresso FortiGate. Notas de caça: Fase 3.

send_cmd.py — manipulador de callback para o caminho do stager

Usado quando o exp_*.py escolhido é do tipo shellcode ARM/amd64 (uso inclui um servidor de shellcode).

  • Escuta na 7777.
  • Ao conectar, escreve um comando: cd /data/config e cat de cada *.gz para nc <LHOST> 9999.
  • Mesmo objetivo de s.js (roubar configuração), transporte diferente (callback de shell vs Node).

Uma variante comentada usava enquadramento base64 em vez de cat bruto.

shellcode/shellcode_server.py — bomba de bytes para stagers da Família A

Corresponde ao protocolo já visível nos stubs ARM32 exp_*.py:

  1. Liga na porta escolhida pelo operador (poc.py usa 8888).
  2. Aceita uma conexão.
  3. Envia um comprimento de 4 bytes little-endian.
  4. Envia o blob shellcode_<arch> do mesmo diretório.

Os stagers exp_*.py conectam aqui, mapeiam memória executável-gravável, puxam o blob, então conectam de volta para lhost:lport (7777 → send_cmd.py).

shellcode/shellcode_arm e shellcode/shellcode_amd64

Blobs brutos de segundo estágio (~2,0 MB ARM, ~2,7 MB amd64). São o que o stager baixa. Não são o stub Thumb minúsculo dentro dos arquivos Python; esses stubs apenas buscam estes arquivos. Trate-os como o implante para o caminho não-Node. O tamanho sugere payloads empacotados ou estáticos, não algumas dezenas de instruções.

init.sh — configuração da estação de trabalho do operador

Não usado contra o firewall. Instala build-essential, binutils-arm-linux-gnueabihf e gcc-aarch64-linux-gnu. Isso é para compilar peças ARM/AArch64 em uma máquina de ataque tipo Debian. Consistente com um autor que compila stagers em vez de apenas enviar Python.

requirements.txt

Linha única: pwntools. Os arquivos exp_*.py e shellcode_server.py o importam. poc.py também quer pocsuite3, python-dotenv, mmh3 e requests.


Relação com os clientes exp/

Já descrito na sérieFunção nesta árvore
Família A ARM exp_*.py (argumentos de stager)Primeiro estágio. Chama shellcode_server.py + shellcode_arm (ou amd64), depois lhost:7777.
Família A/B Node exp_*.py (/s.js)Primeiro estágio. HTTP GET do s.js pai, depois eval.
Variantes 6.0 D-series TFTP / /tmp/sMesmo objetivo s.js via TFTP; ainda espera este arquivo na raiz HTTP do operador.

Nada no diretório pai implementa um terceiro CVE. Contagens, heatmap de SKU e alinhamento de train (Família A até 7.4.0 / 7.4.1; Família B dentro da janela 27997) estão na Fase 0 e Fase 2. Retargeting mais pesado no catálogo original: FortiGate-60E, 100E, 60F, 100F — hardware de filial.


O que isto muda

O primeiro lote parou em "obter um callback." Corpos de segundo estágio estavam faltando. Esta árvore torna o objetivo explícito:

  1. Roubar configuração do FortiOS de /data/config/*.gz, não "RCE genérico." Isso é comprometimento de credenciais e topologia (usuários VPN, rotas, segredos armazenados nesses objetos).
  2. O conjunto de IOCs é concreto (veja abaixo).
  3. VERSION_LIBS em poc.py é uma lista pronta de "qual SKU eles achavam que este hash era."
  4. O kit é um pipeline completo de roubo de configuração, não um saco de PoCs desconectados.

Indicadores (esta cópia)

Recon do portal e URIs de primeiro estágio estão documentados em Hunting the kit. Os distintivos já apontados em write-ups públicos e nesta árvore:

  • Recon do portal: GET /remote/login e /sslvpn/js/login.js?q=
  • URIs de primeiro estágio: /aaaa/bbbb, /remote/error, /remote/info, /remote/hostcheck_validate com enc=
  • HTTP de saída GET /s.js do firewall
  • TCP de saída do firewall para 7777 / 8888 / 9999
  • C2 embutido C2_HOST:9999 dentro desta cópia de s.js (host C2)
  • Listeners do operador nas portas ATTACKER_HOST 7777 / 8888 / 9999 (host atacante)
  • O alvo nunca é hardcoded: TARGET_HOST é rhost fornecido em tempo de execução

Cace egresso do firewall (TARGET_HOST) para C2_HOST:9999 e para qualquer ATTACKER_HOST que serviu /s.js durante a janela relevante.


O que este kit não prova

Da introdução:

  • Um novo 0-day. As primitivas são n-days com write-ups públicos.
  • FortiProxy, FortiManager, FortiAnalyzer, FortiWeb. Nenhuma amostra aqui.
  • SKUs não na matriz recuperada (muitas unidades 70F / 90G / 120G, imagens somente-VM, chassis 6K / 7K). Nenhum offset compilado.
  • Builds além dos cortes publicados pela Fortinet. Confirme contra o aviso ao vivo (FG-IR-24-015, FG-IR-23-097), não esta pasta.
  • Persistência. Isso viveria em follow-on que ainda não está implementado como um terceiro estágio distinto nestes scripts.

Um PoC público contra uma VM é um artefato diferente. Este pacote é para quem respondeu ao recon.


Série

  1. Fase 0 · Introdução — a descoberta, as contagens, o que está em jogo.
  2. Fase 1 · Duas portas públicas — Família A e Família B como comportamento, não uma receita.
  3. Fase 2 · A matriz — 53 SKUs, trains, CPU. Pesquisável.
  4. Fase 3 · Caçando o kit — URIs distintivos, cortes de patch, o que fazer se o portal estava acessível.

Se você executa FortiGates: inventarie modelo, FortiOS exato, SSL-VPN ligado ou desligado, se o portal estava acessível de redes não confiáveis. Então leia a Fase 2. Não inventarie apenas caixas de filial da série 60 porque esses nomes de arquivo eram os mais barulhentos.


Aviso

Estes arquivos foram recuperados na natureza durante pesquisa de segurança independente. Eu não os criei. Eles são lançados como encontrados, após os CVEs relacionados terem sido divulgados publicamente e corrigidos.

Uso apenas para pesquisa / educacional. Não execute, implante ou use este material contra nenhum host a menos que você tenha permissão escrita explícita tanto da parte que hospeda este repositório quanto do proprietário dos sistemas alvo.

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

Baixar ferramenta