Verdeckte Codeausführung
Hunt & Hackett präsentiert eine Reihe von Werkzeugen und technischen Beschreibungen, die Angriffstechniken beschreiben, die auf das Verbergen der Codeausführung unter Windows abzielen. Hier finden Sie Erklärungen, wie diese Techniken funktionieren, erhalten Ratschläge zur Erkennung und Beispielquellcode, um Ihre Erkennungsabdeckung zu testen.
Inhalt
Dieses Repository behandelt zwei Klassen von Angriffstechniken, die intensiv interne Windows-Mechanismen nutzen, und bietet Vorschläge und Werkzeuge zu deren Erkennung:
- Process Tampering - eine Reihe von Techniken, die den Code auf der Ebene eines gesamten Prozesses verbergen.
- Code Injection - eine Sammlung von Tricks, die es erlauben, Code als Teil anderer Prozesse auszuführen, ohne deren Funktionalität zu beeinträchtigen.
- Detection - eine Zusammenstellung von Empfehlungen zur Verteidigung gegen verschiedene Techniken zum Verbergen der Codeausführung.
Die Kernwerte des Projekts:
- Der systematische Ansatz. Dieses Repository enthält mehr als nur eine Sammlung von Werkzeugen oder Links zu externen Ressourcen. Jedes Thema erhält eine detaillierte Erklärung der zugrundeliegenden Konzepte; jeder spezifische Fall wird in generische Kategorien eingeordnet.
- Proof-of-Concept-Werkzeuge. Die Ausführungen werden von Beispielprojekten in C begleitet, die die Verwendung der beschriebenen Einrichtungen in der Praxis demonstrieren.
- Vom Anfänger zum Profi. Sie müssen kein Cybersicherheitsexperte sein, um die von uns beschriebenen Konzepte zu verstehen. Dennoch sollten sogar Fachleute in dem entsprechenden Bereich den Inhalt aufgrund der Liebe zum Detail und der Fallstricke als wertvoll und lehrreich empfinden.
Implementierung
Ein weiteres besonderes Merkmal dieses Projekts ist die umfangreiche Verwendung der Native API in den Beispielen. Hier ist die Motivation für diese Wahl:
- Funktionalität. Einige für die fortschrittlichsten Techniken (wie Process Tampering) erforderlichen Operationen werden über andere APIs nicht bereitgestellt.
- Kontrolle. Als niedrigste Interaktionsebene mit dem Betriebssystem bietet sie die meiste Kontrolle über dessen Verhalten. Die Win32-API ist auf der Native API implementiert, sodass alles, was mit ersterer möglich ist, auch mit letzterer möglich ist.
- Verfügbarkeit. Da sie von ntdll.dll bereitgestellt wird, ist die Native API in allen Prozessen verfügbar, einschließlich der Systemprozesse.
- Konsistenz. Die von dieser API bereitgestellten Schnittstellen sind bemerkenswert konsistent. Nachdem man die grundlegenden Designentscheidungen verstanden hat, ist es möglich, die meisten Funktionsprototypen allein anhand des API-Namens korrekt vorherzusagen.
- Widerstandsfähigkeit gegen Hooking. Es ist wesentlich einfacher, User-Mode-Hooks zu entfernen oder zu umgehen, wenn man die Native API verwendet, was Sicherheitssoftware teilweise blind macht. Es gibt keine niedrigeren Bibliotheken, die gepacht werden könnten, sodass Unhooking so einfach wird wie das Laden einer zweiten Instanz von ntdll.dll und das Umleiten der Aufrufe dorthin.
Kompilierungshinweise
Der Beispielcode verwendet die von PHNT bereitgestellten Native-API-Header. Stellen Sie sicher, dass Sie das Repository mit dem Befehl git clone --recurse-submodules klonen, um diese Abhängigkeit herunterzuladen. Alternativ können Sie nach dem Klonen des Repositorys git submodule update --init verwenden.
Um die im Repository enthaltenen Projekte zu erstellen, benötigen Sie eine aktuelle Version des Windows SDK. Wenn Sie Visual Studio verwenden, beachten Sie bitte die integrierte SDK-Installation. Alternativ können Sie auch die eigenständige Build-Umgebung von EWDK verwenden. Um alle Werkzeuge auf einmal zu kompilieren, verwenden Sie MSBuild AllTools.sln /t:build /p:configuration=Release /p:platform=x64.