
Um script que verifica sistemas vulneráveis ao Log4j (CVE-2021-44228) usando injeção do payload em cabeçalhos HTTP comuns.
Sexta-feira, 10 de dezembro de 2021, um novo Proof-of-Concept 1 abordando uma vulnerabilidade de Execução Remota de Código (RCE) na biblioteca Java 'log4j' 2 foi publicado. Esta vulnerabilidade não foi divulgada antecipadamente aos desenvolvedores do software. A vulnerabilidade está sendo rastreada como CVE-2021-44228 3. Mais informações sobre a vulnerabilidade podem ser encontradas na Resposta a Ameaças da Northwave 4.
A Northwave criou um script de teste que verifica sistemas vulneráveis usando injeção do payload em cabeçalhos HTTP comuns e como parte de uma requisição HTTP GET. Sistemas vulneráveis são detectados ao ouvir requisições DNS de entrada que contêm um UUID criado especificamente para o alvo. Ao ouvir DNS de entrada em vez de implementar (por exemplo) um servidor LDAP, aumentamos a probabilidade de que sistemas vulneráveis possam ser detectados mesmo com filtragem de tráfego de saída ativa. Na prática, o DNS de saída geralmente é permitido. Espera-se uma alta taxa de falsos negativos; leia o aviso.
Os seguintes cabeçalhos HTTP são cobertos:
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAcceptPara cada injeção, os seguintes prefixos JNDI são verificados:
jndi:rmijndi:ldapjndi:dnsjndi:${lower:l}${lower:d}apObserve que o script realiza apenas duas verificações específicas: cabeçalhos HTTP e requisição HTTP GET. Isso causará falsos negativos nos casos em que outros cabeçalhos, campos de entrada específicos, etc., precisem ser alvejados para acionar a vulnerabilidade. Isso é muito provável de acontecer.
IMPORTANTE: Nos casos em que o verificador retorna 'no vulnerability detected', prossiga com as verificações de sistema de arquivos conforme descrito na Resposta a Ameaças da Northwave 4. Somente executar este verificador é insuficiente para determinar se um sistema é vulnerável ou não.
Primeiro, precisamos de um subdomínio que possamos usar para receber requisições DNS de entrada. Neste caso, usamos a zona log4jdnsreq.northwave.nl e implantamos nosso script em log4jchecker.northwave.nl. Configure uma entrada DNS da seguinte forma:
log4jdnsreq 3600 IN NS log4jchecker.northwave.nl.
Agora configuramos um servidor DNS BIND em um sistema Debian usando apt install bind9 e adicionamos o seguinte ao arquivo /etc/bind/named.conf.options:
recursion no;
allow-transfer { none; };
Isso desabilita a recursão, pois não queremos executar um servidor DNS aberto. Configure o registro de logs em /etc/bind/named.conf.local adicionando a seguinte configuração:
logging {
channel querylog {
file "/var/log/named/query.log";
severity debug 3;
print-time yes;
};
category queries { querylog;};
};
Não se esqueça de reiniciar o BIND usando systemctl restart bind9. Verifique se o registro de logs funciona executando uma consulta DNS para xyz.log4jdnsreq.northwave.nl. Uma ou mais consultas devem aparecer em /var/log/named/query.log.
É importante verificar se as consultas ao servidor de nomes estão realmente sendo registradas. Este script não consegue detectar sites vulneráveis a menos que sua configuração de servidor de nomes registre as requisições
Teste seu servidor realizando uma consulta de teste (idealmente de uma máquina diferente):
dig test.log4jchecker.northwave.nl
Você não deve esperar uma resposta, mas deve esperar uma entrada no arquivo de log (cat /var/log/named/query.log). Essa entrada pode ser semelhante a:
14-Dec-2021 13:36:01.402 client @0x7f8b180a9b30 requester-ip#58755 (test.log4jchecker.northwave.nl): query: test.log4jchecker.northwave.nl IN A -E(0)DC (your-ip)
Não continue a menos que uma resposta esteja visível nos logs. O script não detectará vulnerabilidades sem isso.
Instale quaisquer dependências Python usando pip install -r requirements.txt. Edite o script para alterar a seguinte linha para a zona DNS que você configurou:
HOSTNAME = "log4jdnsreq.northwave.nl"
Agora você pode executar o script fornecendo uma única URL usando o parâmetro -u ou uma lista de URLs usando o parâmetro -l:
usage: nw_log4jcheck.py [-h] [-l LIST] [-u URL] [-w WAIT] [-t TIMEOUT]
optional arguments:
-h, --help show this help message and exit
-l LIST, --list LIST A text file with a list of URLs to check (one url per line)
-u URL, --url URL URL to check (for example: http://yoururl.com)
-w WAIT, --wait WAIT Number of seconds to wait before checking DNS logs (default: 15)
-t TIMEOUT, --timeout TIMEOUT
HTTP timeout in seconds to use (default: 5)
A última linha da saída mostra se o sistema foi considerado vulnerável:
NO VULNERABILITY DETECTED. Proceed with on-server checking. No incoming DNS request to 3414db71-309a-4288-83d4-aa3f103db97c.log4jdns.northwave.nl was seen
Caso nenhuma vulnerabilidade seja detectada, prossiga com as verificações de sistema de arquivos conforme descrito na Resposta a Ameaças da Northwave 4. Novamente, apenas executar este verificador é insuficiente para determinar se um sistema é vulnerável ou não.
Log4jcheck é um software de código aberto licenciado sob a licença MIT.