
ScareCrow - Payload-Erstellungsframework, das für EDR-Bypass entwickelt wurde.
Um die neueste Version von ScareCrow anzusehen oder ein Issue einzureichen, besuchen Sie https://github.com/Tylous/ScareCrow.
Wenn Sie mehr über die in diesem Framework verwendeten Techniken erfahren möchten, werfen Sie einen Blick auf Teil 1 und Teil 2
ScareCrow ist ein Framework zur Erstellung von Payloads für das Side-Loading (nicht Injecting) in einen legitimen Windows-Prozess (Umgehung von Application-Whitelisting-Kontrollen). Sobald der DLL-Loader in den Speicher geladen ist, nutzt er eine Technik, um die Hooks eines EDR aus den System-DLLs zu entfernen, die im Speicher des Prozesses laufen. Dies funktioniert, da wir wissen, dass die Hooks des EDR beim Start eines Prozesses platziert werden.
ScareCrow kann diese DLLs ins Visier nehmen und sie im Speicher manipulieren, indem es die API-Funktion VirtualProtect verwendet, die die Berechtigungen eines Speicherbereichs eines Prozesses auf einen anderen Wert ändert, speziell von Ausführen-Lesen zu Lesen-Schreiben-Ausführen.
ScareCrow verwendet eine von zwei Methoden zum Entfernen der Hooks.
Bei der Ausführung kopiert ScareCrow die Bytes der auf der Festplatte gespeicherten System-DLLs aus C:\Windows\System32\. Diese DLLs werden "sauber" von EDR-Hooks auf der Festplatte gespeichert, da sie vom System verwendet werden, um eine unveränderte Kopie in einen neuen Prozess zu laden, wenn dieser gestartet wird. Da EDRs diese Prozesse nur im Speicher hooken, bleiben sie unverändert. ScareCrow kopiert nicht die gesamte DLL-Datei, sondern konzentriert sich nur auf den .text-Abschnitt der DLLs. Dieser Abschnitt einer DLL enthält die ausführbare Assembly, und dadurch verringert ScareCrow die Wahrscheinlichkeit einer Erkennung, da das erneute Einlesen ganzer Dateien einen EDR dazu veranlassen kann, eine Änderung an einer Systemressource zu erkennen. Die Daten werden dann mithilfe des Offsets jeder Funktion in den richtigen Speicherbereich kopiert. Jede Funktion hat einen Offset, der die genaue Anzahl von Bytes ab der Basisadresse angibt, an der sie sich befinden, und liefert so die Position der Funktion im Stack.
Um dies zu tun, ändert ScareCrow die Berechtigungen des .text-Speicherbereichs mit VirtualProtect. Obwohl es sich um eine System-DLL handelt, können wir, da sie in unseren Prozess (den wir kontrollieren) geladen wurde, die Speicherberechtigungen ohne erhöhte Privilegien ändern.
ScareCrow lädt den Shellcode in den Speicher, indem es zuerst den Shellcode entschlüsselt, der mit einer von drei Verschlüsselungsmethoden (unten beschrieben) verschlüsselt ist. Nach der Entschlüsselung und dem Laden wird der Shellcode dann ausgeführt. Abhängig von den angegebenen Loader-Optionen richtet ScareCrow unterschiedliche Exportfunktionen für die DLL ein. Die geladene DLL enthält auch nicht die standardmäßige DLLMain-Funktion, die alle DLLs normalerweise benötigen, um zu funktionieren. Die DLL wird trotzdem ohne Probleme ausgeführt, da der Prozess, in den wir laden, nach diesen Exportfunktionen sucht und sich nicht darum kümmert, ob DLLMain vorhanden ist.
Nachher
KnownDLLs ist eine Liste von DLLs, die von Windows während des Systemstartvorgangs geladen werden. Da diese DLLs als wesentlich für die Funktionsweise des Betriebssystems angesehen werden, werden sie zwischengespeichert, um die Ladezeiten zu verkürzen und die Leistung beim Start von Anwendungen zu verbessern. KnownDLLs umfasst DLLs wie kernel32.dll, kernelbase.dll und ntdll.dll.
Unter Verwendung dieser KnownDLLs bildet ScareCrow eine Kopie der DLL aus \KnownDlls\<dllname> unter Verwendung einer Kombination von NtOpenSection und NtMapViewOfSection ab, um sie in den Speicher des Prozesses zu laden. ScareCrow lädt nicht die gesamte DLL, sondern nur den .text-Abschnitt der DLL (da dieser alle Syscalls enthält). Von dort aus verwendet ScareCrow indirekte Syscalls, um NtProtectVirtualMemory aufzurufen und die Berechtigungen des .text-Speicherbereichs der DLL zu ändern, sodass Scarecrow die Hooks des EDR überschreiben kann, bevor die Berechtigungen wiederhergestellt werden.
Weitere Informationen finden Sie in modexps ausführlichem Artikel
Sobald diese die Hooks entfernt sind, verwendet ScareCrow dann benutzerdefinierte System Calls, um Shellcode in den Speicher zu laden und auszuführen. ScareCrow tut dies auch nach dem Entfernen der EDR-Hooks, um die Erkennung durch nicht-Userland-Hook-basierte Telemetriesammlungstools wie Event Tracing for Windows (ETW) oder andere Ereignisprotokollierungsmechanismen zu vermeiden. Diese benutzerdefinierten Systemaufrufe werden auch verwendet, um den VirtualProtect-Aufruf zum Entfernen der von EDRs platzierten Hooks (oben beschrieben) durchzuführen, um eine Erkennung durch Anti-Tamper-Kontrollen eines EDR zu vermeiden. Dies geschieht durch den Aufruf einer benutzerdefinierten Version des VirtualProtect-Syscalls, NtProtectVirtualMemory. ScareCrow verwendet Golang, um diese Loader zu generieren, und dann Assembly für diese benutzerdefinierten Syscall-Funktionen.
Während des Erstellungsprozesses des Loaders verwendet ScareCrow eine Bibliothek zum Verschmelzen mit dem Hintergrund, nachdem ein Beacon nach Hause telefoniert hat. Diese Bibliothek erledigt zwei Dinge:
Dateien, die mit Codesignaturzertifikaten signiert sind, werden oft weniger genau geprüft, was die Ausführung ohne Beanstandung erleichtert, da Dateien, die mit einem vertrauenswürdigen Namen signiert sind, oft weniger verdächtig sind als andere. Die meisten Antimalware-Produkte haben nicht die Zeit, diese Zertifikate zu validieren und zu verifizieren (einige tun es jetzt, aber in der Regel sind die gängigen Herstellernamen in einer Whitelist enthalten). ScareCrow erstellt diese Zertifikate mit einer Go-Paket-Version des Tools limelighter, um eine pfx12-Datei zu erstellen. Dieses Paket nimmt eine vom Benutzer eingegebene Domain entgegen, um ein Codesignaturzertifikat für diese Domain zu erstellen. Bei Bedarf können Sie auch Ihr eigenes Codesignaturzertifikat verwenden, falls Sie eines besitzen, mit der valid-Befehlszeilenoption.
clone-Befehlszeilenoption zu kopieren, zusammen mit dem Pfad zu der Datei, von der Sie das Zertifikat kopieren möchten.